Back to Poly Dogfight
SOURCE / PINNED RELEASE

Made of little things.

Poly Dogfight

Release
b8511ee374e3…
Author-recorded commit
5579434b9d8b…
License
LICENSE
Author’s source reference
nostr://npub1ye5ptcxfyyxl5vjvdjar2ua3f0hynkjzpx552mu5snj3qmx5pzjscpknpr/wss%3A%2F%2Fgit.napplet.soy%2F/n-44f63e5422b

Archive hash verified: bcadd2430d8ea2bc…. 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>Poly Dogfight</title>
  </head>
  <body>
    <main id="app" class="app">
      <canvas id="scene" class="scene" tabindex="-1" aria-label="Flight view"></canvas>

      <div id="views" class="views"></div>
      <div id="spareView" class="spare" hidden>
        <p>Connect another controller; press a button if it is not detected</p>
      </div>

      <template id="viewTemplate">
        <section class="view">
          <div class="hud">
            <div class="gauges">
              <div class="chip chip-pilot" data-ref="pilot" hidden>
                <span class="chip-label">Pilot</span>
                <span class="chip-value" data-ref="pilotName">P1</span>
              </div>
              <div class="chip">
                <span class="chip-label">Speed</span>
                <span class="chip-value"><span data-ref="speed">0</span><small>km/h</small></span>
              </div>
              <div class="chip">
                <span class="chip-label">Alt</span>
                <span class="chip-value"><span data-ref="alt">0</span><small>m</small></span>
              </div>
            </div>
            <span class="beginner-label" data-ref="beginner" hidden>Beginner</span>
            <div class="meters">
              <div class="meter" aria-label="Throttle">
                <span class="chip-label">Thr</span>
                <span class="meter-track"><span data-ref="throttle" class="meter-fill meter-throttle"></span></span>
              </div>
              <div class="meter" aria-label="Boost">
                <span class="chip-label">Boost</span>
                <span class="meter-track"><span data-ref="boost" class="meter-fill meter-boost"></span></span>
              </div>
              <div class="meter" data-ref="rocketMeter" aria-label="Rockets ready: 2">
                <span class="chip-label">Rkt</span>
                <span class="rocket-pips">
                  <span class="rocket-pip"><span class="rocket-fill" data-ref="rocketPip"></span></span>
                  <span class="rocket-pip"><span class="rocket-fill" data-ref="rocketPip"></span></span>
                </span>
              </div>
            </div>
            <div data-ref="stall" class="stall" role="status" hidden>
              <span class="stall-icon" aria-hidden="true">▲</span> STALL <small>nose down</small>
            </div>
            <div data-ref="incoming" class="incoming" role="status" hidden>
              <span class="stall-icon" aria-hidden="true">◆</span> ROCKET LOCK <small>bank hard!</small>
            </div>
          </div>
          <div class="reticle" data-ref="reticle" aria-label="Gun sight" hidden>
            <span class="reticle-dot"></span><span class="hit-marker" data-ref="hitMarker" hidden></span>
          </div>
          <div class="aim-point" data-ref="aimPoint" aria-label="Predicted assisted shot" hidden></div>
          <div class="flight-path" data-ref="flightPath" aria-label="Flight path" hidden></div>
          <div class="lock-box" data-ref="lockBox" aria-label="Rocket seeker has a target" hidden><span>LOCK</span></div>
          <div class="indicators" data-ref="indicators" aria-hidden="true"></div>
          <div data-ref="crash" class="crash" role="status" hidden>
            <p class="crash-title" data-ref="crashTitle">Crashed!</p>
            <p class="crash-sub">Back in the air in <span data-ref="respawn">5</span></p>
          </div>
          <div class="beginner-offer" data-ref="offer" hidden role="group" aria-label="Easier flight controls">
            <p>Want easier controls? Beginner mode handles throttle. Up climbs, down dives; left/right rolls and turns.</p>
            <button type="button" data-ref="accept">Try beginner mode (A)</button>
            <button type="button" data-ref="decline">Keep current controls (B)</button>
          </div>
        </section>
      </template>

      <div id="touchControls" class="touch" aria-hidden="true">
        <div id="stick" class="stick"><div id="stickKnob" class="stick-knob"></div></div>
        <div class="touch-right">
          <div class="touch-buttons">
            <button id="yawLeft" class="tbtn" type="button" tabindex="-1">◁</button>
            <button id="yawRight" class="tbtn" type="button" tabindex="-1">▷</button>
            <button id="fireButton" class="tbtn tbtn-fire" type="button" tabindex="-1">Fire</button>
            <button id="rocketButton" class="tbtn tbtn-rocket" type="button" tabindex="-1">Rocket</button>
            <button id="boostButton" class="tbtn tbtn-boost" type="button" tabindex="-1">Boost</button>
          </div>
          <div id="throttleSlider" class="throttle">
            <div id="throttleKnob" class="throttle-knob"></div>
          </div>
        </div>
      </div>

      <div class="corner">
        <button id="cameraButton" class="icon-btn" type="button" title="Camera (C)" aria-label="Change camera">◉</button>
        <button id="pauseButton" class="icon-btn" type="button" title="Pause (Esc)" aria-label="Pause">❚❚</button>
      </div>

      <div id="menu" class="menu">
        <div class="card" role="dialog" aria-labelledby="menuTitle">
          <section class="card-brief">
            <h2 id="menuTitle" class="card-title">Ready for take-off</h2>
            <p class="card-sub" id="menuSub">Fly anywhere around the little planet. Keep your speed up — slow too much and the wings stall.</p>
            <p class="card-sub card-goal">Plug in more controllers to dogfight friends: shoot their wings and tail with guns and rockets, and shake off what they fire back.</p>
            <div class="card-options" role="group" aria-label="Game options">
              <div id="flightModes" class="flight-modes"></div>
              <p class="hint" id="modeHint">Beginner: stick up climbs, down dives; left/right rolls and turns. Full maneuvering speed; release to level out. Gamepad: LB switches mode, A flies.</p>
              <div class="toggles">
                <label class="toggle"><input id="invertToggle" type="checkbox" /> Invert normal pitch</label>
                <label class="toggle"><input id="muteToggle" type="checkbox" /> Mute</label>
              </div>
            </div>
            <button id="flyButton" class="fly-btn" type="button">Fly</button>
            <p class="hint" id="startHint">or press a key / gamepad A</p>
            <p class="pilots" id="pilotsNote">Up to 4 pilots: each extra controller joins in split screen.</p>
            <p class="save-note" id="saveNote" hidden></p>
          </section>
          <section class="card-setup" aria-label="Controls">
            <div class="controls" id="controlsPanel" data-device="keyboard">
              <h3 class="controls-title">Controls <span class="controls-device" id="controlsDevice">Keyboard</span></h3>
              <dl class="controls-list" data-for="keyboard">
                <dt>Pitch / roll</dt><dd>W S A D · arrows</dd>
                <dt>Rudder</dt><dd>Q E</dd>
                <dt>Throttle</dt><dd>T / Shift up · G down</dd>
                <dt>Boost</dt><dd>Space</dd>
                <dt>Guns</dt><dd>F / Enter</dd>
                <dt>Rocket</dt><dd>R</dd>
                <dt>Camera</dt><dd>C</dd>
                <dt>Pause</dt><dd>Esc / P</dd>
                <dt>Sound</dt><dd>M</dd>
              </dl>
              <dl class="controls-list" data-for="gamepad" hidden>
                <dt>Pitch / roll</dt><dd>Left stick · D-pad</dd>
                <dt>Rudder</dt><dd>LT / RT · right stick</dd>
                <dt>Throttle</dt><dd>RB up · LB down</dd>
                <dt>Boost</dt><dd>A</dd>
                <dt>Guns</dt><dd>B</dd>
                <dt>Rocket</dt><dd>Y</dd>
                <dt>Camera</dt><dd>X</dd>
                <dt>Pause</dt><dd>Start</dd>
                <dt>Beginner mode</dt><dd>LB in this menu</dd>
                <dt>Pilots</dt><dd>Connect another controller to join (up to 4)</dd>
              </dl>
              <p class="hint" id="flightHint">Stick back / S pulls the nose up. Stalled? Push the nose down and add power.</p>
              <p class="hint">Holed wings pull the plane toward them and a shot-up tail drops the nose. Lose a whole wing or the tail and you're going down.</p>
              <p class="hint">Rockets lock onto a plane just ahead of their nose. Two on the wings, one reloads every 8 seconds; two hits on a part bring a plane down. Locked on? Bank hard and pull to shake it. A rocket that misses keeps flying round the planet.</p>
            </div>
          </section>
        </div>
      </div>

      <div id="errorNotice" class="error" hidden>
        <p>Poly Dogfight needs WebGL to draw the planet, and it isn't available here.</p>
      </div>
    </main>
    <script type="module" src="/src/main.ts"></script>
  </body>
</html>