{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-markus/src/client/reactive/components/rewritten/jumping-cubes.js"],"names":["Morph","ContextMenu","Strings","MCTS","Matrix","shake","fa4","Cube","constructor","jc","value","color","initElement","evt","onClick","width","height","mouseX","mouseY","rotateY","remap","rotateX","brightness","neighbours","cubes","index","indexOf","getNeighboursOf","toJSON","EFFECT_DURATION","TASK_DURATION","Animation","Increment","cube","run","duration","transform","easing","composite","offset","backgroundColor","get","fill","sleep","Explode","forEach","neighbour","addAnimation","COLOR_MAP","Map","AnimationQueue","add","animation","resolveAnim","process","lastAnim","next","race","Promise","resolve","clear","Player","ai","startTurn","aiTurn","getInitialState","field","line","i","j","aiProgressStart","mcts","move","getConfig","progress","aiProgressStep","aiProgressEnd","processQueue","fromJSON","json","JumpingCubes","energy","defaultStart","startingValue","fieldSize","init","initialize","state","getJSONAttribute","reset","restart","addEventListener","onContextMenu","Set","blinkOut","aiProgress","animate","startingInfo","setPlayerForIndex","cubeDesc","pick","createPlayers","initStartingPlayer","buildFieldOfCubes","registerAE","dataflow","v","checkEnd","numCubes","win","greenCubes","updatePlayerWidget","onChange","redCubes","saveToAttribute","startTurnForCurrentPlayer","widget","currentValue","label","querySelector","undefined","idleForm","percentage","background","foreground","map","info","nextPlayer","clickRandomCube","canClick","clickables","push","sample","ae","handleClickOn","animationQueue","speed","isNumber","detachedCallback","disposeBindings","dispose","defaultConfig","animationSpeed","players","aiIterations","loadJSON","key","stringValue","getItem","parse","config","setConfig","saveJSON","stringify","setItem","resetConfig","removeItem","configure","callback","stopPropagation","preventDefault","player","checkIcon","enabled","item","isAI","conf","toString","radioButtonList","values","configProperty","radioIcon","icon","iconIndex","fieldSizes","startingValues","items","openComponentInWindow","menu","openIn","document","cleanup","container","winText","clickText","mainDuration","blinkIn","toUpperCaseFirst","delay","aiProgressLabel","cssColor","progressPercentage","currentPlayerIndex","p","setJSONAttribute","livelyPrepareSave","livelyPreMigrate","livelyMigrate","other","livelyExample"],"mappings":"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","file":"jumping-cubes.js","sourcesContent":["\"enable aexpr\";\n\nimport Morph from 'src/components/widgets/lively-morph.js';\nimport ContextMenu from 'src/client/contextmenu.js';\nimport Strings from 'src/client/strings.js';\n\nimport MCTS from './jumping-cubes-mcts.js';\nimport Matrix from './square-matrix.js';\n\nimport { shake } from 'utils';\nimport { fa4 } from 'src/client/utils/font-awesome-utils.js';\n\nclass Cube {\n\n  constructor(jc, { value, color }) {\n    this.jc = jc;\n\n    this.value = value;\n    this.color = color;\n\n    this.initElement();\n  }\n\n  initElement() {\n    this.button = <button class=\"cube\" click={evt => this.onClick(evt)}>~</button>;\n    this.shaker = <div class=\"shaker\">{this.button}</div>;\n    this.bouncer = <div class=\"bouncer\">{this.shaker}</div>;\n    this.exploder = <div class=\"exploder\">{this.bouncer}</div>;\n    this.container = <div class=\"cube-container\" mouseleave={evt => {\n      this.button.style.transform = 'rotateX(0deg) rotateY(0deg)';\n      this.button.style.filter = 'brightness(1)';\n    }} mousemove={evt => {\n      const width = this.button.clientWidth;\n      const height = this.button.clientHeight;\n      const mouseX = evt.offsetX;\n      const mouseY = evt.offsetY;\n      const rotateY = mouseX.remap([0, width], [-35, 35], true);\n      const rotateX = mouseY.remap([0, height], [35, -35], true);\n      const brightness = mouseY.remap([0, height], [1.5, 0.5], true) * mouseX.remap([0, width], [1.25, 0.75], true);\n\n      this.button.style.transform = `rotateX(${rotateX}deg) rotateY(${rotateY}deg)`;\n      this.button.style.filter = `brightness(${brightness})`;\n    }}>{this.exploder}</div>;\n  }\n\n  async onClick(evt) {\n    if (!this.jc.handleClickOn(this)) {\n      shake(this.shaker);\n    }\n  }\n\n  get neighbours() {\n    if (this._neighbours) {\n      return this._neighbours;\n    }\n\n    const cubes = this.jc.cubes;\n\n    const index = cubes.indexOf(this);\n    if (!index) {\n      return [];\n    }\n\n    return this._neighbours = cubes.getNeighboursOf(index.i, index.j);\n  }\n\n  toJSON() {\n    return {\n      color: this.color,\n      value: this.value\n    };\n  }\n}\n\nconst EFFECT_DURATION = 400;\nconst TASK_DURATION = 100;\n\nclass Animation {\n  constructor(jc) {\n    this.jc = jc;\n    this.gameNumber = jc.gameNumber;\n  }\n}\n\nclass Increment extends Animation {\n  constructor(cube, color, jc) {\n    super(jc);\n    this.cube = cube;\n    this.color = color;\n  }\n\n  async run() {\n    const duration = this.jc.duration(EFFECT_DURATION);\n\n    this.cube.bouncer.animate([{ transform: 'translateY(0px)' }, { transform: 'translateY(-30px)' }, { transform: 'translateY(0px)' }], {\n      duration,\n      easing: 'ease-in-out',\n      composite: 'accumulate'\n    });\n\n    this.cube.bouncer.animate([{ transform: 'scale(1, 1.3)', offset: 0.35 }, { transform: 'scale(1.1, 0.9)', offset: 0.5 }, { transform: 'scale(1, 1.3)', offset: 0.65 }], {\n      duration,\n      easing: 'ease-in-out',\n      composite: 'accumulate'\n    });\n\n    this.cube.button.animate([{ backgroundColor: 'white' }, { backgroundColor: COLOR_MAP.get(this.color) }], {\n      duration,\n      easing: 'ease-in-out',\n      fill: 'both'\n    }, 'accumulate');\n\n    await lively.sleep(duration / 2);\n    if (this.gameNumber < this.jc.gameNumber) {\n      return;\n    }\n    this.cube.color = this.color;\n    this.cube.value++;\n    return lively.sleep(duration / 2);\n  }\n}\n\nclass Explode extends Animation {\n  constructor(cube, jc) {\n    super(jc);\n    this.cube = cube;\n  }\n\n  async run() {\n    const duration = this.jc.duration(EFFECT_DURATION);\n    const jc = this.jc;\n\n    const neighbours = this.cube.neighbours;\n    if (this.cube.value <= neighbours.length) {\n      return;\n    }\n\n    this.cube.exploder.animate([{ transform: 'translateY(0px)' }, { transform: 'translateY(-20px)' }, { transform: 'translateY(0px)' }], {\n      duration,\n      easing: 'ease-in-out',\n      composite: 'accumulate'\n    });\n\n    this.cube.exploder.animate([{ transform: 'scale(1, 1.3)', offset: 0.35 }, { transform: 'scale(1.1, 0.9)', offset: 0.5 }, { transform: 'scale(1, 1.3)', offset: 0.65 }], {\n      duration,\n      easing: 'ease-in-out',\n      composite: 'accumulate'\n    });\n\n    this.cube.button.animate([{ backgroundColor: 'black' }, { backgroundColor: COLOR_MAP.get(jc.player.color) }], {\n      duration,\n      easing: 'ease-in-out',\n      fill: 'both'\n    }, 'accumulate');\n\n    await lively.sleep(duration / 2);\n    if (this.cube.value <= neighbours.length) {\n      return;\n    }\n    if (this.gameNumber < this.jc.gameNumber) {\n      return;\n    }\n    this.cube.color = jc.player.color;\n    this.cube.value -= neighbours.length;\n    neighbours.forEach(neighbour => {\n      jc.addAnimation(new Increment(neighbour, this.cube.color, jc));\n    });\n\n    return lively.sleep(duration / 2);\n  }\n}\n\nconst COLOR_MAP = new Map([['red', 'rgba(255, 126, 126, 1.0)'], ['green', 'rgba(126, 255, 126, 1.0)'], ['gray', 'rgba(176, 176, 176, 1.0)']]);\n\nclass AnimationQueue {\n  constructor(jc) {\n    this.jc = jc;\n    this.gameNumber = jc.gameNumber;\n    this.inner = [];\n  }\n\n  add(animation) {\n    this.inner.push(animation);\n    this.resolveAnim && this.resolveAnim();\n  }\n\n  async process() {\n    const duration = this.jc.duration(TASK_DURATION);\n\n    let lastAnim;\n    while (true) {\n      while (this.inner.length > 0) {\n        // that.innerHTML = this.inner.length;\n        const next = this.inner.shift();\n        lastAnim = next.run();\n        await lively.sleep(duration);\n      }\n\n      await Promise.race([lastAnim, new Promise(resolve => this.resolveAnim = resolve)]);\n\n      if (this.inner.length === 0) {\n        return;\n      }\n    }\n  }\n\n  clear() {\n    this.inner.length = 0;\n  }\n}\n\nclass Player {\n  constructor(color, ai) {\n    this.color = color;\n    this.ai = ai;\n  }\n\n  startTurn(jc) {\n    if (this.ai) {\n      jc.classList.add('noClickAllowed');\n      this.gameNumber = jc.gameNumber;\n      this.aiTurn(jc);\n    } else {\n      jc.classList.remove('noClickAllowed');\n    }\n  }\n\n  async aiTurn(jc) {\n    function getInitialState(jc) {\n      const cubes = jc.cubes;\n      const color = jc.player.color;\n\n      const field = cubes.toJSON();\n\n      field.forEach((line, i) => line.forEach((cube, j) => {\n        cube.neighbours = [];\n        if (field[i - 1]) {\n          cube.neighbours.push(field[i - 1][j]);\n        }\n        if (field[i][j - 1]) {\n          cube.neighbours.push(field[i][j - 1]);\n        }\n        if (field[i + 1]) {\n          cube.neighbours.push(field[i + 1][j]);\n        }\n        if (field[i][j + 1]) {\n          cube.neighbours.push(field[i][j + 1]);\n        }\n      }));\n\n      field.forEach(line => line.forEach(cube => cube.numNeighbours = cube.neighbours.length));\n\n      return { field, color };\n    }\n\n    jc.aiProgressStart(jc.player.color);\n\n    const mcts = new MCTS(getInitialState(jc));\n    const move = await mcts.run(jc.getConfig().aiIterations, {\n      progress: ::jc.aiProgressStep\n    });\n\n    if (this.gameNumber < jc.gameNumber) {\n      return;\n    }\n\n    jc.aiProgressEnd();\n    jc.processQueue(jc.cubes.get(move.i, move.j));\n  }\n\n  static fromJSON(json) {\n    return new Player(json.color, json.ai);\n  }\n  toJSON() {\n    return {\n      color: this.color,\n      ai: this.ai\n    };\n  }\n}\n\nexport default class JumpingCubes extends Morph {\n\n  get field() {\n    return this.get('#field');\n  }\n\n  set energy(value) {\n    return this.get('#energy').innerHTML = value;\n  }\n\n  defaultStart() {\n    const { startingValue, fieldSize } = this.getConfig();\n    return Matrix.init(fieldSize, () => ({\n      value: startingValue,\n      color: 'gray'\n    }));\n  }\n\n  async initialize() {\n    this.windowTitle = \"Jumping Cubes\";\n\n    this.init();\n\n    const state = this.getJSONAttribute('state');\n    this.reset(state);\n\n    this.get('#gameEnd-container').addEventListener('click', ::this.restart);\n  }\n\n  get fieldSize() {\n    return this.cubes.size;\n  }\n  init() {\n    this.addEventListener('contextmenu', evt => this.onContextMenu(evt), false);\n    this.gameNumber = 0;\n    this.aexprs = new Set();\n  }\n\n  reset(state) {\n    this.blinkOut();\n    const aiProgress = this.aiProgress;\n    aiProgress.animate([{ 'opacity': 0 }], {\n      duration: 0,\n      fill: 'forwards'\n    });\n\n    this.gameNumber++;\n    this.animationSpeed = this.getConfig().animationSpeed;\n    this.animations = new AnimationQueue(this);\n\n    let startingInfo;\n    if (state) {\n      this.players = state.players.map(Player.fromJSON);\n      this.setPlayerForIndex(state.currentPlayerIndex);\n      startingInfo = Matrix.fromJSON(state.cubes, cubeDesc => _.pick(cubeDesc, ['value', 'color']));\n    } else {\n      this.createPlayers();\n      this.initStartingPlayer();\n      startingInfo = this.defaultStart();\n    }\n\n    this.buildFieldOfCubes(startingInfo);\n\n    // #TODO connect: this.energy <= this.cubes.sumBy('value')\n    this.registerAE(aexpr(() => this.cubes.sumBy('value'))).dataflow(v => this.energy = v);\n\n    const checkEnd = (color, v) => {\n      const numCubes = this.fieldSize * this.fieldSize;\n      if (v >= numCubes) {\n        this.win(color);\n      }\n    };\n\n    const greenCubes = this.registerAE(aexpr(() => this.cubes.count(cube => cube.color === 'green')));\n    greenCubes.dataflow(v => this.updatePlayerWidget('green', v));\n    greenCubes.onChange(v => checkEnd('green', v));\n    const redCubes = this.registerAE(aexpr(() => this.cubes.count(cube => cube.color === 'red')));\n    redCubes.dataflow(v => this.updatePlayerWidget('red', v));\n    redCubes.onChange(v => checkEnd('red', v));\n\n    this.saveToAttribute();\n    this.startTurnForCurrentPlayer();\n  }\n\n  updatePlayerWidget(color, value) {\n    const widget = this.get(`#${color}Player`);\n\n    const numCubes = this.fieldSize * this.fieldSize;\n    const currentValue = value / numCubes;\n\n    const label = widget.querySelector('.score-label');\n    label.innerHTML = value;\n    if (widget.previousValue !== undefined) {\n      const idleForm = { 'filter': 'brightness(1)', 'transform': '' };\n      if (currentValue > widget.previousValue) {\n        label.animate([idleForm, { 'filter': 'brightness(3)', 'transform': 'rotate(2deg) scale(1.3, 1.7)' }, idleForm], {\n          duration: 300,\n          easing: 'ease-in-out',\n          fill: 'forwards',\n          composite: 'accumulate'\n        });\n      } else if (currentValue < widget.previousValue) {\n        label.animate([idleForm, { 'filter': 'brightness(0.5)', 'transform': 'rotate(-5deg) scale(1.5, 0.5)' }, idleForm], {\n          duration: 400,\n          easing: 'ease-in-out',\n          fill: 'forwards',\n          composite: 'accumulate'\n        });\n      }\n    }\n\n    const percentage = `${currentValue * 100}%`;\n\n    const background = widget.querySelector('.background');\n    const foreground = widget.querySelector('.foreground');\n    if (widget.previousValue === undefined) {\n      background.style.width = percentage;\n      foreground.style.width = percentage;\n    } else if (currentValue > widget.previousValue) {\n      background.animate([{ 'width': percentage }], {\n        duration: 0,\n        fill: 'both'\n      });\n      foreground.animate([{ 'width': percentage }], {\n        duration: 400,\n        easing: 'ease-in-out',\n        fill: 'both'\n      });\n    } else if (currentValue < widget.previousValue) {\n      foreground.animate([{ 'width': percentage }], {\n        duration: 0,\n        fill: 'both'\n      });\n      background.animate([{ 'width': percentage }], {\n        duration: 400,\n        easing: 'ease-in-out',\n        fill: 'both'\n      });\n    } else {\n      background.style.width = percentage;\n      foreground.style.width = percentage;\n    }\n    widget.previousValue = currentValue;\n  }\n\n  createPlayers() {\n    this.currentPlayerIndex = 0;\n    this.players = this.getConfig().players.map(Player.fromJSON);\n  }\n\n  buildFieldOfCubes(startingInfo) {\n    this.field.innerHTML = '';\n    this.cubes = startingInfo.map(info => {\n      const cube = new Cube(this, info);\n\n      this.field.appendChild(cube.container);\n\n      return cube;\n    });\n\n    this.cubes.forEach(cube => {\n      this.registerAE(aexpr(() => cube.value)).dataflow(value => cube.button.innerHTML = value).dataflow(value => {\n        if (value > cube.neighbours.length) {\n          this.addAnimation(new Explode(cube, this));\n        }\n      });\n      this.registerAE(aexpr(() => cube.color)).dataflow(value => cube.button.style.background = COLOR_MAP.get(value));\n    });\n\n    const fieldSize = this.cubes.size;\n    this.field.style.setProperty('grid-template-columns', `repeat(${fieldSize}, 40px)`);\n    this.field.style.setProperty('grid-template-rows', `repeat(${fieldSize}, 40px)`);\n  }\n\n  initStartingPlayer() {\n    this.setPlayerForIndex(0);\n  }\n  nextPlayer() {\n    this.setPlayerForIndex(this.currentPlayerIndex + 1);\n  }\n  setPlayerForIndex(index) {\n    this.currentPlayerIndex = index % this.players.length;\n    this.player = this.players[this.currentPlayerIndex];\n    this.style.setProperty('--playerOnTurn', this.player.color);\n  }\n\n  startTurnForCurrentPlayer() {\n    this.player.startTurn(this);\n  }\n  clickRandomCube() {\n    const color = this.player.color;\n    function canClick(cube) {\n      return cube.color === color || cube.color === 'gray';\n    }\n\n    const clickables = [];\n    this.cubes.forEach(cube => {\n      if (canClick(cube)) {\n        clickables.push(cube);\n      }\n    });\n\n    this.processQueue(clickables.sample());\n  }\n\n  registerAE(ae) {\n    this.aexprs.add(ae);\n    return ae;\n  }\n\n  handleClickOn(cube) {\n    if (cube.color === this.player.color || cube.color === 'gray') {\n      if (!this.classList.contains('noClickAllowed')) {\n        this.processQueue(cube);\n        return true;\n      }\n    }\n    return false;\n  }\n\n  // #important\n  async processQueue(cube) {\n    this.animationSpeed = this.getConfig().animationSpeed;\n    this.classList.add('noClickAllowed');\n    this.addAnimation(new Increment(cube, this.player.color, this));\n\n    const animationQueue = this.animations;\n    await animationQueue.process();\n    if (animationQueue.gameNumber < this.gameNumber) {\n      return;\n    }\n    this.nextPlayer();\n    this.saveToAttribute();\n    this.startTurnForCurrentPlayer();\n  }\n  addAnimation(animation) {\n    this.animations.add(animation);\n  }\n  duration(duration) {\n    const speed = this.animationSpeed;\n    if (speed === 'Instantaneous') {\n      return 0;\n    }\n    if (_.isNumber(speed)) {\n      return duration / speed;\n    }\n    return 1;\n  }\n\n  detachedCallback() {\n    this.disposeBindings();\n  }\n\n  disposeBindings() {\n    this.aexprs.forEach(ae => ae.dispose());\n    this.aexprs.clear();\n  }\n\n  defaultConfig() {\n    return {\n      fieldSize: 5,\n      startingValue: 2,\n      animationSpeed: 1,\n      players: [{\n        color: 'green',\n        ai: false\n      }, {\n        color: 'red',\n        ai: true\n      }],\n      aiIterations: 1000,\n    };\n  }\n  getConfig() {\n    function loadJSON(key) {\n      const stringValue = this.getItem(key);\n      if (!stringValue) {\n        return undefined;\n      }\n      return JSON.parse(stringValue);\n    }\n\n    const config = localStorage::loadJSON('JumpingCubes');\n    if (config) {\n      return config;\n    }\n    return this.defaultConfig();\n  }\n  setConfig(config) {\n    function saveJSON(key, json) {\n      const stringValue = JSON.stringify(json, undefined, 2);\n      return this.setItem(key, stringValue);\n    }\n\n    return localStorage::saveJSON('JumpingCubes', config);\n  }\n  resetConfig() {\n    return localStorage.removeItem('JumpingCubes');\n  }\n  configure(callback) {\n    const config = this.getConfig();\n    callback(config);\n    this.setConfig(config);\n  }\n\n  onContextMenu(evt) {\n    evt.stopPropagation();\n    evt.preventDefault();\n\n    const players = this.getConfig().players.map((player, index) => {\n      function checkIcon(enabled) {\n        return enabled ? fa4('check-square-o') : fa4('square-o');\n      }\n\n      return [`player ${player.color}`, (evt, item) => {\n        evt.stopPropagation();\n        evt.preventDefault();\n\n        let isAI;\n        this.configure(conf => isAI = conf.players[index].ai = !conf.players[index].ai);\n        item.querySelector(\".icon\").innerHTML = checkIcon(isAI);\n      }, '', { toString: () => checkIcon(this.getConfig().players[index].ai) }];\n    });\n\n    const radioButtonList = (values, configProperty) => {\n      function radioIcon(enabled) {\n        return enabled ? fa4('dot-circle-o') : fa4('circle-o');\n      }\n\n      return values.map((value, index) => [value + '', (evt, item) => {\n        evt.stopPropagation();\n        evt.preventDefault();\n\n        this.configure(conf => conf[configProperty] = value);\n        item.parentElement.querySelectorAll(\".icon\").forEach((icon, iconIndex) => {\n          icon.innerHTML = radioIcon(index === iconIndex);\n        });\n      }, '', { toString: () => radioIcon(value === this.getConfig()[configProperty]) }]);\n    };\n    const fieldSizes = radioButtonList(2 .to(13), 'fieldSize');\n    const startingValues = radioButtonList([1, 2], 'startingValue');\n    const animationSpeed = radioButtonList([0.5, 0.75, 1, 1.25, 1.5, 2, 4, 'Instantaneous'], 'animationSpeed');\n    const aiIterations = radioButtonList([1E2, 1E3, 1E4, 1E5, 1E6, 1E7, 1E8], 'aiIterations');\n\n    const items = [];\n    items.push([\"restart game\", ::this.restart, '', fa4('undo')]);\n    items.push([\"new game\", () => lively.openComponentInWindow('jumping-cubes'), '', fa4('plus')]);\n    items.push([\"players\", players, '', fa4('users')]);\n    items.push([\"field size\", fieldSizes, '', fa4('cubes')]);\n    items.push([\"starting value\", startingValues, '', fa4('cube')]);\n    items.push([\"animation speed\", animationSpeed, '', fa4('hourglass')]);\n    items.push([\"ai iterations\", aiIterations, '', fa4('reddit-alien')]);\n    items.push([\"reset to default\", ::this.resetConfig, '', fa4('trash-o')]);\n    \n\n    const menu = new ContextMenu(this, items);\n    menu.openIn(document.body, evt, this);\n  }\n\n  restart() {\n    this.cleanup();\n    this.reset();\n  }\n\n  async blinkOut() {\n    if (!this.blinked) {\n      return;\n    }\n    this.blinked = false;\n\n    const container = this.get('#gameEnd-container');\n    const winText = this.get('#gameEnd-message');\n    const clickText = this.get('#gameEnd-newGame');\n\n    const mainDuration = 300;\n    container.animate([{ 'backgroundColor': 'rgba(255, 255, 255, 0.1)' }, { 'backgroundColor': 'rgba(255, 255, 255, 0)' }], {\n      duration: mainDuration,\n      easing: 'ease-out',\n      fill: 'forwards'\n    });\n    winText.animate([{ 'opacity': 1, 'transform': 'scaleY(1)' }, { 'opacity': 0, 'transform': 'scaleY(0.5)' }], {\n      duration: mainDuration,\n      easing: 'ease-out',\n      fill: 'forwards'\n    });\n    clickText.style.setProperty('opacity', 0);\n    clickText.animate([{ 'opacity': 1 }, { 'opacity': 0 }], {\n      duration: mainDuration,\n      easing: 'ease-out',\n      fill: 'forwards'\n    });\n\n    await lively.sleep(mainDuration);\n    container.style.setProperty('display', 'none');\n  }\n\n  blinkIn(color) {\n    if (this.blinked) {\n      return;\n    }\n    this.blinked = true;\n\n    const container = this.get('#gameEnd-container');\n    const winText = this.get('#gameEnd-message');\n    const clickText = this.get('#gameEnd-newGame');\n\n    winText.innerHTML = `Player ${Strings.toUpperCaseFirst(color)} Wins!`;\n    winText.style.setProperty('background-color', COLOR_MAP.get(color));\n\n    const mainDuration = 300;\n    container.style.setProperty('display', 'grid');\n    container.animate([{ 'backgroundColor': 'rgba(255, 255, 255, 0)' }, { 'backgroundColor': 'rgba(255, 255, 255, 0.7)' }, { 'backgroundColor': 'rgba(255, 255, 255, 0.1)' }], {\n      duration: mainDuration * 1.5,\n      easing: 'ease-out',\n      fill: 'forwards'\n    });\n    winText.animate([{ 'opacity': 0, 'transform': 'scaleY(0.5)' }, { 'opacity': 1, 'transform': 'scaleY(1)' }], {\n      duration: mainDuration,\n      easing: 'cubic-bezier(0.34, 2.56, 0.64, 1)',\n      fill: 'forwards'\n    });\n    clickText.style.setProperty('opacity', 0);\n    clickText.animate([{ 'opacity': 0 }, { 'opacity': 1 }], {\n      duration: 1000,\n      easing: 'ease-out',\n      delay: mainDuration,\n      fill: 'forwards'\n    });\n  }\n\n  cleanup() {\n    this.disposeBindings();\n    this.classList.remove('noClickAllowed');\n    this.gameNumber++;\n  }\n\n  win(color) {\n    this.cleanup();\n    this.blinkIn(color);\n  }\n\n  get aiProgress() {\n    return this.get('#ai-progress');\n  }\n\n  get aiProgressLabel() {\n    return this.get('#ai-progress-label');\n  }\n\n  aiProgressStart(color) {\n    const aiProgress = this.aiProgress;\n    aiProgress.style.display = 'block';\n    aiProgress.style.backgroundImage = ``;\n    aiProgress.style.setProperty('opacity', 0);\n    aiProgress.animate([{ 'opacity': 0 }, { 'opacity': 1 }], {\n      duration: 1000,\n      easing: 'ease-out',\n      fill: 'forwards'\n    });\n\n    const aiProgressLabel = this.aiProgressLabel;\n    aiProgressLabel.style.color = color;\n  }\n\n  aiProgressStep(color, progress) {\n    const aiProgress = this.aiProgress;\n    let cssColor;\n    if (color === 'red') {\n      cssColor = '255, 0, 0';\n    } else if (color === 'green') {\n      cssColor = '0, 255, 0';\n    } else {\n      cssColor = '0, 0, 255';\n    }\n    const progressPercentage = progress * 100;\n    aiProgress.style.backgroundImage = `linear-gradient( \n      to right,\n      rgba(${cssColor}, 0.45), \n      rgba(${cssColor}, 0.45) ${progressPercentage}%,\n      rgba(0,0,0,0) ${progressPercentage}%,\n      rgba(0,0,0,0)\n    )`;\n\n    const aiProgressLabel = this.aiProgressLabel;\n    aiProgressLabel.style.color = color;\n  }\n\n  aiProgressEnd() {\n    const aiProgress = this.aiProgress;\n    aiProgress.animate([{ 'opacity': 1 }, { 'opacity': 0 }], {\n      duration: 500,\n      easing: 'ease-out',\n      fill: 'forwards'\n    });\n  }\n\n  /* Lively-specific API */\n\n  toJSON() {\n    return {\n      currentPlayerIndex: this.currentPlayerIndex,\n      players: this.players.map(p => p.toJSON()),\n\n      fieldSize: this.cubes.size,\n      cubes: this.cubes.toJSON()\n    };\n  }\n\n  saveToAttribute() {\n    this.setJSONAttribute('state', this.toJSON());\n  }\n\n  // store something that would be lost\n  livelyPrepareSave() {\n    // this.setAttribute(\"data-mydata\", this.get(\"#textField\").value);\n  }\n\n  livelyPreMigrate() {\n    this.disposeBindings();\n  }\n\n  livelyMigrate(other) {\n    const state = other.getJSONAttribute('state');\n    this.setJSONAttribute('state', state);\n    this.classList.remove('noClickAllowed');\n  }\n\n  async livelyExample() {\n    this.style.backgroundColor = \"lightgray\";\n  }\n\n}"]}