Back to Browser Side Quest
SOURCE / PINNED RELEASE

Made of little things.

Browser Side Quest

Release
b9d42f5768e4…
Author-recorded commit
c267690145fa…
License
LICENSE
Author’s source reference
nostr://npub1ye5ptcxfyyxl5vjvdjar2ua3f0hynkjzpx552mu5snj3qmx5pzjscpknpr/wss%3A%2F%2Fgit.shakespeare.diy%2F/browser-side-quest

Archive hash verified: 6d4b90b8a5f328f7…. 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>Browser Side Quest</title>
  </head>
  <body>
    <!--
      Browser Side Quest: a port of Mozilla's BrowserQuest (2012, Little Workshop).
      Code MPL-2.0, art and maps CC-BY-SA 3.0, music CC BY 3.0. The runtime frames this napplet and
      already shows its name, so the frame is game surface from the first pixel.
    -->
    <main id="app" class="app intro">
      <div id="stage">
        <div id="frame">
          <div id="viewport">
            <canvas id="background"></canvas>
            <canvas id="entities"></canvas>
            <canvas id="foreground" tabindex="0" aria-label="Game world"></canvas>
            <div id="bubbles" aria-live="polite"></div>
            <div id="achievement-notification" aria-live="polite">
              <div class="coin"></div>
              <div class="achievement-info">
                <div class="title">New Achievement Unlocked!</div>
                <div class="name"></div>
              </div>
            </div>
          </div>
          <div id="bar">
            <div id="healthbar" role="meter" aria-label="Health" aria-valuemin="0">
              <div id="hitpoints"></div>
            </div>
            <div id="weapon" class="equip" title="Weapon"></div>
            <div id="armor" class="equip" title="Armor"></div>
            <div id="notifications" aria-live="polite">
              <div><span id="message1"></span><span id="message2"></span></div>
            </div>
            <button id="playercount" type="button" title="Players in this world">
              <span class="count">0</span> <span class="label">players</span>
            </button>
            <div id="barbuttons">
              <button id="chatbutton" class="barbutton" type="button" title="Chat (Enter)" aria-label="Chat"></button>
              <button id="achievementsbutton" class="barbutton" type="button" title="Achievements" aria-label="Achievements"></button>
              <button id="helpbutton" class="barbutton" type="button" title="About" aria-label="About"></button>
              <button id="mutebutton" class="barbutton active" type="button" title="Sound" aria-label="Sound" aria-pressed="true"></button>
            </div>
          </div>
          <div id="chatbox">
            <input id="chatinput" type="text" maxlength="60" autocomplete="off" aria-label="Chat message" placeholder="Say something…" />
          </div>
          <section id="population" aria-live="polite">
            <div class="world-line"><span id="world-name">Solo world</span></div>
            <div id="instance-population"><span class="n">0</span> <span class="w">players</span> in this world</div>
            <ul id="player-list"></ul>
            <div class="world-actions">
              <button id="prev-world" type="button" class="link">◂ world</button>
              <button id="next-world" type="button" class="link">world ▸</button>
            </div>
          </section>
        </div>
      </div>

      <div id="touchpad" aria-hidden="true">
        <button type="button" class="pad up" data-dir="up" tabindex="-1"></button>
        <button type="button" class="pad left" data-dir="left" tabindex="-1"></button>
        <button type="button" class="pad right" data-dir="right" tabindex="-1"></button>
        <button type="button" class="pad down" data-dir="down" tabindex="-1"></button>
        <button type="button" class="pad action" data-dir="action" tabindex="-1">⚔</button>
      </div>

      <section id="intro">
        <div id="logo" role="img" aria-label="Browser Side Quest"><span id="logosparks"></span><span id="logoside" aria-hidden="true">Side</span><span id="logocaret" aria-hidden="true"></span></div>
        <section id="parchment" class="createcharacter">
          <div class="parchment-left"></div>
          <div class="parchment-middle">
            <article id="createcharacter">
              <h2><span class="left-ornament"></span>A Massively Multiplayer Adventure<span class="right-ornament"></span></h2>
              <div id="character" class="disabled"><div></div></div>
              <form id="createform" autocomplete="off">
                <input type="text" id="nameinput" class="stroke" name="player-name" placeholder="Name your character" maxlength="15" />
              </form>
              <button class="play button disabled" type="button" aria-label="Play"><div></div></button>
              <p id="identity-hint" class="hint"></p>
            </article>
            <article id="loadcharacter">
              <h2><span class="left-ornament"></span>Load your character<span class="right-ornament"></span></h2>
              <img id="playerimage" alt="" />
              <div id="playername" class="stroke"></div>
              <button class="play button" type="button" aria-label="Play"><div></div></button>
              <div id="create-new"><button type="button" class="link"><span>or</span> create a new character</button></div>
            </article>
            <article id="confirmation">
              <h2><span class="left-ornament"></span>Delete your character?<span class="right-ornament"></span></h2>
              <p>All your items and achievements will be lost.<br />Are you sure you wish to continue?</p>
              <button class="delete button" type="button" aria-label="Delete"></button>
              <div id="cancel"><button type="button" class="link">cancel</button></div>
            </article>
            <article id="about">
              <h2><span class="left-ornament"></span>What is Browser Side Quest?<span class="right-ornament"></span></h2>
              <p class="desc">
                A multiplayer adventure from your Web browser, revived as a Nostr napplet.
                Adventurers meet peer to peer: up to eight share a world, and more worlds open as they fill.
              </p>
              <p class="credits">
                A port of BrowserQuest, the original game by Little Workshop for Mozilla (2012): pixels by Guillaume Lecollinet,
                code by Franck Lecollinet. Code MPL-2.0, art and maps CC-BY-SA 3.0.
                Music (CC BY 3.0) by Aaron Krogh, Terrel O'Brien, Dan Tilden and Joel Day,
                via the browserquest/BrowserQuest community fork.
              </p>
              <p class="close-hint">- tap or click anywhere to close -</p>
            </article>
            <article id="death">
              <p>You are dead...</p>
              <button id="respawn" class="button" type="button" aria-label="Revive"></button>
            </article>
            <article id="disconnected">
              <p id="disconnect-message">The connection to the world has been lost.</p>
              <button id="rejoin" type="button" class="link big">Rejoin</button>
            </article>
          </div>
          <div class="parchment-right"></div>
        </section>
      </section>

      <article id="instructions">
        <button class="close" type="button" aria-label="Close"></button>
        <h2><span class="left-ornament"></span>How to play<span class="right-ornament"></span></h2>
        <ul>
          <li><span class="icon i1"></span>Click or tap to move, attack and pick up items.</li>
          <li><span class="icon i2"></span>Arrows/WASD or a gamepad also work. Space or A attacks and talks.</li>
          <li><span class="icon i3"></span>Press ENTER to chat. Your character is saved as you play.</li>
        </ul>
        <p>- click anywhere to close -</p>
      </article>

      <article id="achievements" class="page1">
        <button class="close" type="button" aria-label="Close"></button>
        <h2>Achievements</h2>
        <div id="achievements-wrapper"><div id="lists"></div></div>
        <nav>
          <button id="previous" type="button" aria-label="Previous page">◂</button>
          <div id="achievements-count" class="stroke">
            Completed <span id="unlocked-achievements">0</span>/<span id="total-achievements">0</span>
          </div>
          <button id="next" type="button" aria-label="Next page">▸</button>
        </nav>
      </article>

      <div id="too-small" role="status">
        <p>Make this frame a little bigger to play.</p>
      </div>
    </main>
    <script type="module" src="/src/main.ts"></script>
  </body>
</html>