Back to Obsidian Breaker
SOURCE / PINNED RELEASE

Made of little things.

Obsidian Breaker

Release
44c589c52043…
Author-recorded commit
9ee5b61ce1c9…
License
LICENSE
Author’s source reference
nostr://npub1dmmh0futyszl4445mv4xrygkgsgj8vpu79yx3qyy9qxmz4pemtzqlqmc87/wss%3A%2F%2Fgit.napplet.soy%2F/n-de5dc6a02e7

Archive hash verified: 240ec416a9cbfd9c…. The source-to-build association is the author’s claim; it has not been independently rebuilt.

index.html
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
    <title>Obsidian Breaker</title>
  </head>
  <body>
    <main id="app" class="app">
      <canvas id="board" class="board" aria-label="Obsidian Breaker playfield" role="img">
        Obsidian Breaker: a breakout game about shattering volatile mineral seams.
      </canvas>

      <header class="hud">
        <div class="hud-brand" aria-hidden="true">
          <span class="brand-mark">◆</span>
          <span class="brand-text">OBSIDIAN<br />BREAKER</span>
        </div>

        <dl class="hud-stats">
          <div class="stat stat-score">
            <dt>Score</dt>
            <dd id="scoreValue">0</dd>
          </div>
          <div class="stat stat-chain" id="chainStat">
            <dt>Chain</dt>
            <dd id="chainValue">—</dd>
          </div>
          <div class="stat stat-lives">
            <dt>Shields</dt>
            <dd id="livesValue" aria-label="3 shields">◆◆◆</dd>
          </div>
          <div class="stat">
            <dt>Seam</dt>
            <dd id="levelValue">01/07</dd>
          </div>
          <div class="stat stat-best">
            <dt>Best</dt>
            <dd id="bestValue">0</dd>
          </div>
        </dl>

        <div class="hud-actions">
          <button id="warpButton" class="icon-button ability-button" type="button" aria-pressed="false" aria-label="Warp (F): needs 3 projected wall or stone impacts" title="Warp (F): fast-forward through 3 projected impacts">
            <span aria-hidden="true">»</span>
          </button>
          <button id="bulletButton" class="icon-button ability-button" type="button" aria-pressed="false" aria-label="Bullet time (B): 100% charged" title="Bullet time (B)">
            <span aria-hidden="true">◒</span>
          </button>
          <button id="guideButton" class="icon-button" type="button" aria-pressed="true" aria-label="Toggle bounce prediction" title="Toggle bounce prediction">
            <span aria-hidden="true">✧</span>
          </button>
          <button id="soundButton" class="icon-button" type="button" aria-pressed="true" aria-label="Mute sound" title="Mute sound">
            <span aria-hidden="true">♪</span>
          </button>
          <button id="pauseButton" class="icon-button" type="button" aria-label="Pause" title="Pause">
            <span aria-hidden="true">❚❚</span>
          </button>
        </div>
      </header>

      <div id="banner" class="banner" aria-hidden="true">
        <span id="bannerKicker" class="banner-kicker"></span>
        <span id="bannerTitle" class="banner-title"></span>
      </div>

      <p id="hint" class="hint">Drag to steer · Space launch · B bullet time · F warp · P pause</p>
      <div id="bulletMeter" class="bullet-meter" role="progressbar" aria-label="Bullet time charge" aria-valuemin="0" aria-valuemax="100" aria-valuenow="100">
        <span class="bullet-label">Bullet</span>
        <span class="bullet-track"><span id="bulletFill" class="bullet-fill"></span></span>
      </div>
      <div id="toast" class="toast" aria-live="polite"></div>

      <div id="overlay" class="overlay" hidden>
        <div class="overlay-card" role="dialog" aria-modal="true" aria-labelledby="overlayTitle">
          <p id="overlayKicker" class="overlay-kicker">Paused</p>
          <h2 id="overlayTitle">The seam waits</h2>
          <p id="overlayBody" class="overlay-body"></p>
          <div id="overlayActions" class="overlay-actions"></div>
          <p id="overlayNote" class="overlay-note"></p>
        </div>
      </div>

      <p id="gameStatus" class="sr-only" aria-live="polite"></p>
    </main>
    <script type="module" src="/src/main.ts"></script>
  </body>
</html>