<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>https://wiki.gla.com.br/index.php?action=history&amp;feed=atom&amp;title=Widget%3AIbNolandPuzzle</id>
	<title>Widget:IbNolandPuzzle - Histórico de revisão</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.gla.com.br/index.php?action=history&amp;feed=atom&amp;title=Widget%3AIbNolandPuzzle"/>
	<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=Widget:IbNolandPuzzle&amp;action=history"/>
	<updated>2026-04-05T21:42:40Z</updated>
	<subtitle>Histórico de revisões para esta página neste wiki</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=Widget:IbNolandPuzzle&amp;diff=45455&amp;oldid=prev</id>
		<title>Igor is back: refactor: change some tittles to portuguese as default</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=Widget:IbNolandPuzzle&amp;diff=45455&amp;oldid=prev"/>
		<updated>2026-04-05T17:35:25Z</updated>

		<summary type="html">&lt;p&gt;refactor: change some tittles to portuguese as default&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;pt-BR&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Edição anterior&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Edição das 17h35min de 5 de abril de 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Linha 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linha 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;div id=&amp;quot;ib-game-container&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;div id=&amp;quot;ib-game-container&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &amp;lt;div id=&amp;quot;ib-start-screen&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &amp;lt;div id=&amp;quot;ib-start-screen&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     &amp;lt;button id=&amp;quot;ib-play-btn&amp;quot;&amp;gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Play&lt;/del&gt;&amp;lt;/button&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     &amp;lt;button id=&amp;quot;ib-play-btn&amp;quot;&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Jogar&lt;/ins&gt;&amp;lt;/button&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &amp;lt;/div&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &amp;lt;/div&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &amp;lt;div id=&amp;quot;ib-end-screen&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &amp;lt;div id=&amp;quot;ib-end-screen&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     &amp;lt;p&amp;gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;You Win&lt;/del&gt;&amp;lt;/p&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     &amp;lt;p&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;XTRANHO&lt;/ins&gt;&amp;lt;/p&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &amp;lt;/div&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &amp;lt;/div&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &amp;lt;canvas id=&amp;quot;ib-gameCanvas&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &amp;lt;canvas id=&amp;quot;ib-gameCanvas&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Igor is back</name></author>
	</entry>
	<entry>
		<id>https://wiki.gla.com.br/index.php?title=Widget:IbNolandPuzzle&amp;diff=45453&amp;oldid=prev</id>
		<title>Igor is back: feat: noland puzzle v1</title>
		<link rel="alternate" type="text/html" href="https://wiki.gla.com.br/index.php?title=Widget:IbNolandPuzzle&amp;diff=45453&amp;oldid=prev"/>
		<updated>2026-04-05T17:31:11Z</updated>

		<summary type="html">&lt;p&gt;feat: noland puzzle v1&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;div id=&amp;quot;ib-game-container&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;ib-start-screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;button id=&amp;quot;ib-play-btn&amp;quot;&amp;gt;Play&amp;lt;/button&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;ib-end-screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;You Win&amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;canvas id=&amp;quot;ib-gameCanvas&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
  #ib-game-container { position: relative; display: inline-block; }&lt;br /&gt;
  #ib-gameCanvas { display: block; image-rendering: pixelated; }&lt;br /&gt;
  #ib-start-screen {&lt;br /&gt;
    position: absolute; inset: 0; display: flex;&lt;br /&gt;
    justify-content: center; align-items: center;&lt;br /&gt;
    background: #1a1a2e; z-index: 10;&lt;br /&gt;
  }&lt;br /&gt;
  #ib-end-screen {&lt;br /&gt;
    position: absolute; inset: 0; display: none;&lt;br /&gt;
    justify-content: center; align-items: center;&lt;br /&gt;
    background: rgba(0,0,0,0.85); z-index: 10;&lt;br /&gt;
    color: #e2e2e2; font-size: 64px; letter-spacing: 8px;&lt;br /&gt;
  }&lt;br /&gt;
  #ib-play-btn {&lt;br /&gt;
    padding: 16px 48px; font-size: 24px; cursor: pointer;&lt;br /&gt;
    background: #16213e; color: #e2e2e2;&lt;br /&gt;
    border: 2px solid #e2e2e2; letter-spacing: 4px;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function() {&lt;br /&gt;
  const COLS = 7, ROWS = 5, TILE_SIZE = 128;&lt;br /&gt;
  const canvas = document.getElementById('ib-gameCanvas');&lt;br /&gt;
  const ctx = canvas.getContext('2d');&lt;br /&gt;
  canvas.width = COLS * TILE_SIZE;&lt;br /&gt;
  canvas.height = ROWS * TILE_SIZE;&lt;br /&gt;
&lt;br /&gt;
  const DIRS = {&lt;br /&gt;
    ArrowRight: [1,  0, 0],&lt;br /&gt;
    ArrowLeft:  [-1, 0, 1],&lt;br /&gt;
    ArrowUp:    [0, -1, 2],&lt;br /&gt;
    ArrowDown:  [0,  1, 3]&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  const keys = {};&lt;br /&gt;
  document.addEventListener('keydown', e =&amp;gt; {&lt;br /&gt;
    if (e.key === '1') { player.interact(); return; }&lt;br /&gt;
    if (!(e.key in DIRS)) return;&lt;br /&gt;
    e.preventDefault();&lt;br /&gt;
    if (e.ctrlKey) { player.direction = DIRS[e.key][2]; return; }&lt;br /&gt;
    keys[e.key] = true;&lt;br /&gt;
  });&lt;br /&gt;
  document.addEventListener('keyup', e =&amp;gt; { keys[e.key] = false; });&lt;br /&gt;
&lt;br /&gt;
  const OBJECT_POS = [[1,0],[3,0],[5,0],[6,2],[5,4],[3,4],[1,4],[0,2]];&lt;br /&gt;
  const ARTIFACT_COL = 3, ARTIFACT_ROW = 2;&lt;br /&gt;
  const OBJECT_TILES = new Set([...OBJECT_POS.map(([c,r]) =&amp;gt; `${c},${r}`), `${ARTIFACT_COL},${ARTIFACT_ROW}`]);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  const mainSprite = new Image();&lt;br /&gt;
  mainSprite.src = 'https://wiki.gla.com.br/images/3/30/Ib_noland_sprite.png';&lt;br /&gt;
&lt;br /&gt;
  const tileImage = new Image();&lt;br /&gt;
  tileImage.src = 'https://wiki.gla.com.br/images/9/98/Ib_basic_tile.png';&lt;br /&gt;
&lt;br /&gt;
  class Character {&lt;br /&gt;
    constructor(tileX, tileY) {&lt;br /&gt;
      this.tileX = tileX; this.tileY = tileY;&lt;br /&gt;
      this.x = tileX * TILE_SIZE; this.y = tileY * TILE_SIZE;&lt;br /&gt;
      this.direction = 0; this.animFrame = 0;&lt;br /&gt;
      this.moving = false; this.moveFrame = 0;&lt;br /&gt;
      this.interactFrame = 0; this.cooldown = 0;&lt;br /&gt;
    }&lt;br /&gt;
    _startMove(dx, dy, dir) {&lt;br /&gt;
      const nx = this.tileX + dx, ny = this.tileY + dy;&lt;br /&gt;
      if (nx &amp;lt; 0 || nx &amp;gt;= COLS || ny &amp;lt; 0 || ny &amp;gt;= ROWS || OBJECT_TILES.has(`${nx},${ny}`)) return false;&lt;br /&gt;
      this.direction = dir; this.tileX = nx; this.tileY = ny;&lt;br /&gt;
      this.startX = this.x; this.startY = this.y;&lt;br /&gt;
      this.targetX = nx * TILE_SIZE; this.targetY = ny * TILE_SIZE;&lt;br /&gt;
      this.moving = true; this.moveFrame = 0;&lt;br /&gt;
      return true;&lt;br /&gt;
    }&lt;br /&gt;
    tryMove() {&lt;br /&gt;
      for (const key in DIRS)&lt;br /&gt;
        if (keys[key] &amp;amp;&amp;amp; this._startMove(...DIRS[key])) break;&lt;br /&gt;
    }&lt;br /&gt;
    _finishMove() {&lt;br /&gt;
      this.x = this.targetX; this.y = this.targetY;&lt;br /&gt;
      this.moving = false; this.animFrame = 0;&lt;br /&gt;
    }&lt;br /&gt;
    interact() {&lt;br /&gt;
      if (this.cooldown &amp;gt; 0 || this.moving || this.interactFrame &amp;gt; 0) return;&lt;br /&gt;
      const dx = [1,-1,0,0][this.direction], dy = [0,0,-1,1][this.direction];&lt;br /&gt;
      const tx = this.tileX + dx, ty = this.tileY + dy;&lt;br /&gt;
      if (tx === ARTIFACT_COL &amp;amp;&amp;amp; ty === ARTIFACT_ROW) { if (artifact.open) endGame(); return; }&lt;br /&gt;
      this.interactFrame = 1; this.cooldown = 60;&lt;br /&gt;
      triggerPedestal(tx, ty);&lt;br /&gt;
    }&lt;br /&gt;
    _updateMove() {&lt;br /&gt;
      this.moveFrame++;&lt;br /&gt;
      this.x = this.startX + (this.targetX - this.startX) * this.moveFrame / 24;&lt;br /&gt;
      this.y = this.startY + (this.targetY - this.startY) * this.moveFrame / 24;&lt;br /&gt;
      this.animFrame = (Math.floor(this.moveFrame / 8) % 2) + 1;&lt;br /&gt;
      if (this.moveFrame &amp;gt;= 24) this._finishMove();&lt;br /&gt;
    }&lt;br /&gt;
    update() {&lt;br /&gt;
      if (this.cooldown &amp;gt; 0) this.cooldown--;&lt;br /&gt;
      if (this.interactFrame &amp;gt; 0 &amp;amp;&amp;amp; ++this.interactFrame &amp;gt; 24) this.interactFrame = 0;&lt;br /&gt;
      if (this.interactFrame &amp;gt; 0) return;&lt;br /&gt;
      if (!this.moving) { this.tryMove(); return; }&lt;br /&gt;
      this._updateMove();&lt;br /&gt;
    }&lt;br /&gt;
    draw(ctx) {&lt;br /&gt;
      const { direction: d, animFrame: f, interactFrame: i, x, y } = this;&lt;br /&gt;
      const s = TILE_SIZE;&lt;br /&gt;
      ctx.drawImage(mainSprite, (i &amp;gt; 0 ? 3 : f) * s, d * s, s, s, Math.round(x), Math.round(y), s, s);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  class Artifact {&lt;br /&gt;
    constructor() { this.tileX = ARTIFACT_COL; this.tileY = ARTIFACT_ROW; this.open = false; }&lt;br /&gt;
    draw(ctx) {&lt;br /&gt;
      const s = TILE_SIZE;&lt;br /&gt;
      ctx.drawImage(mainSprite, (this.open ? s : 0), 4 * s, s, s, this.tileX * s, this.tileY * s, s, s);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  class GameObject {&lt;br /&gt;
    constructor(tileX, tileY) { this.tileX = tileX; this.tileY = tileY; this.active = false; }&lt;br /&gt;
    draw(ctx) {&lt;br /&gt;
      const s = TILE_SIZE;&lt;br /&gt;
      const col = this.active ? (Math.floor(pedestalTick / 8) % 4 + 1) : 0;&lt;br /&gt;
      ctx.drawImage(mainSprite, col * s, 5 * s, s, s, this.tileX * s, this.tileY * s, s, s);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const artifact = new Artifact();&lt;br /&gt;
  const player = new Character(3, 3);&lt;br /&gt;
  const objects = OBJECT_POS.map(([c,r]) =&amp;gt; new GameObject(c, r));&lt;br /&gt;
&lt;br /&gt;
  function drawTiles() {&lt;br /&gt;
    for (let r = 0; r &amp;lt; ROWS; r++)&lt;br /&gt;
      for (let c = 0; c &amp;lt; COLS; c++)&lt;br /&gt;
        ctx.drawImage(tileImage, c * TILE_SIZE, r * TILE_SIZE, TILE_SIZE, TILE_SIZE);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function render() {&lt;br /&gt;
    drawTiles();&lt;br /&gt;
    artifact.draw(ctx);&lt;br /&gt;
    objects.forEach(o =&amp;gt; o.draw(ctx));&lt;br /&gt;
    player.draw(ctx);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  const MS_PER_UPDATE = 1000 / 60;&lt;br /&gt;
  let lastTime = 0, lag = 0, pedestalTick = 0;&lt;br /&gt;
&lt;br /&gt;
  function gameLoop(timestamp) {&lt;br /&gt;
    lag += Math.min(timestamp - lastTime, 100);&lt;br /&gt;
    lastTime = timestamp;&lt;br /&gt;
    while (lag &amp;gt;= MS_PER_UPDATE) { player.update(); pedestalTick++; lag -= MS_PER_UPDATE; }&lt;br /&gt;
    render();&lt;br /&gt;
    requestAnimationFrame(gameLoop);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function triggerPedestal(col, row) {&lt;br /&gt;
    if (artifact.open) return;&lt;br /&gt;
    const idx = objects.findIndex(o =&amp;gt; o.tileX === col &amp;amp;&amp;amp; o.tileY === row);&lt;br /&gt;
    if (idx === -1) return;&lt;br /&gt;
    const n = objects.length;&lt;br /&gt;
    [idx, (idx + 1) % n, (idx + n - 1) % n].forEach(i =&amp;gt; { objects[i].active = !objects[i].active; });&lt;br /&gt;
    if (objects.every(o =&amp;gt; !o.active)) artifact.open = true;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function endGame() {&lt;br /&gt;
    document.getElementById('ib-end-screen').style.display = 'flex';&lt;br /&gt;
    setTimeout(() =&amp;gt; location.reload(), 2000);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function randomizeObjects() {&lt;br /&gt;
    objects.forEach(o =&amp;gt; { o.active = Math.random() &amp;lt; 0.5; });&lt;br /&gt;
    if (objects.every(o =&amp;gt; !o.active)) objects[0].active = true;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  let started = false, playClicked = false;&lt;br /&gt;
  function tryStart() {&lt;br /&gt;
    if (started || !playClicked || !tileImage.complete || !mainSprite.complete) return;&lt;br /&gt;
    started = true;&lt;br /&gt;
    lastTime = performance.now();&lt;br /&gt;
    requestAnimationFrame(gameLoop);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  tileImage.onload = tryStart;&lt;br /&gt;
  mainSprite.onload = tryStart;&lt;br /&gt;
&lt;br /&gt;
  document.getElementById('ib-play-btn').addEventListener('click', () =&amp;gt; {&lt;br /&gt;
    document.getElementById('ib-start-screen').style.display = 'none';&lt;br /&gt;
    randomizeObjects();&lt;br /&gt;
    playClicked = true;&lt;br /&gt;
    tryStart();&lt;br /&gt;
  });&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;/div&gt;</summary>
		<author><name>Igor is back</name></author>
	</entry>
</feed>