[object Object]

← back to Neon Baguette Battle

Broaden P1 controls: arrows move; Space/Return/Cmd/Option/Ctrl/Shift/Delete all fire

a39d05a5afbf37f74418c47c0154b651953b4559 · 2026-08-31 13:56:17 -0700 · Steve Abrams

- fire[] now includes enter, backspace, delete, meta, control, alt, shift (+ J/K/L jab/whack/launch)
- preventDefault backspace/delete so they do not navigate back
- add #debug test hook (window.__bb) — inert during normal play
- verified: arrows move+face both ways; every requested fire key triggers an attack (0 errors)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

Files touched

Diff

commit a39d05a5afbf37f74418c47c0154b651953b4559
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Mon Aug 31 13:56:17 2026 -0700

    Broaden P1 controls: arrows move; Space/Return/Cmd/Option/Ctrl/Shift/Delete all fire
    
    - fire[] now includes enter, backspace, delete, meta, control, alt, shift (+ J/K/L jab/whack/launch)
    - preventDefault backspace/delete so they do not navigate back
    - add #debug test hook (window.__bb) — inert during normal play
    - verified: arrows move+face both ways; every requested fire key triggers an attack (0 errors)
    
    Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---
 README.md  |  8 +++++---
 index.html | 13 ++++++++++---
 2 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/README.md b/README.md
index eba191e..2e3e034 100644
--- a/README.md
+++ b/README.md
@@ -38,9 +38,11 @@ also click a card to choose P1's fighter. `Enter`/`Space` or **START FIGHT** beg
 | Mute (audio + voice) | `M` | |
 
 **1-player alternate scheme (P1):** you can also play with the **arrow keys**
-(`←`/`→` move, `↑` jump, `↓` block) and **fire** with **`Space`**, **`⌘`
-Command**, or **`Ctrl`** — fire launches the baguette missile when the meter is
-full, otherwise it does a whack. (In 2-player the arrows belong to Player 2.)
+(`←`/`→` move, `↑` jump, `↓` block) and **fire** with almost any big key —
+**`Space`, `Return`/Enter, `⌘` Command, `⌥` Option, `Ctrl`, `Shift`, or
+`Delete`/Backspace**. Fire launches the baguette missile when the meter is full,
+otherwise it does a whack. (`J`/`K`/`L` also jab/whack/launch.) In 2-player the
+arrows belong to Player 2.
 
 ## Features
 - **Real combat**: startup/active/recovery attack frames, blocking with chip
diff --git a/index.html b/index.html
index b2ba00e..dd0d0d8 100644
--- a/index.html
+++ b/index.html
@@ -126,7 +126,7 @@
         </table>
       </div>
     </div>
-    <div class="tiny">1-Player also: <span class="key">←</span><span class="key">→</span> move · <span class="key">↑</span> jump · <span class="key">↓</span> block · <span class="key">Space</span>/<span class="key">⌘</span>/<span class="key">Ctrl</span> fire &nbsp;·&nbsp; <span class="key">P</span> pause · <span class="key">M</span> mute</div>
+    <div class="tiny">1-Player also: <span class="key">←</span><span class="key">→</span> move · <span class="key">↑</span> jump · <span class="key">↓</span> block · <span class="key">Space</span> <span class="key">Return</span> <span class="key">⌘</span> <span class="key">⌥</span> <span class="key">Ctrl</span> <span class="key">⌫</span> fire &nbsp;·&nbsp; <span class="key">P</span> pause · <span class="key">M</span> mute</div>
   </div>
 
   <!-- CHARACTER SELECT -->
@@ -300,14 +300,19 @@
   // ---------- Input ----------
   const keys = {};
   // maps are arrays so an action can have several keys. 'fire' = launch missile if meter full, else whack.
-  const P1_ATTACK = { poke:['f'], swing:['g'], blast:['h'], fire:[' ','meta','control'] };
+  const P1_ATTACK = {
+    poke:  ['f','j'],
+    swing: ['g','k'],
+    blast: ['h','l'],
+    fire:  [' ','enter','backspace','delete','meta','control','alt','shift']   // Space/Return/Delete/⌘/Ctrl/⌥/⇧
+  };
   const P1MAP_1P  = { left:['a','arrowleft'], right:['d','arrowright'], jump:['w','arrowup'], block:['s','arrowdown'], ...P1_ATTACK };
   const P1MAP_2P  = { left:['a'], right:['d'], jump:['w'], block:['s'], ...P1_ATTACK };  // arrows belong to P2 in 2P
   const P2MAP     = { left:['arrowleft'], right:['arrowright'], jump:['arrowup'], block:['arrowdown'], poke:[','], swing:['.'], blast:['/'] };
   let   p1map     = P1MAP_1P;
   addEventListener('keydown', e => {
     const k = e.key.toLowerCase();
-    if (['arrowup','arrowdown','arrowleft','arrowright',' ','/'].includes(k)) e.preventDefault();
+    if (['arrowup','arrowdown','arrowleft','arrowright',' ','/','backspace','delete'].includes(k)) e.preventDefault();
     if (!keys[k]) keys['_pressed_'+k] = true;   // edge trigger
     keys[k] = true;
     if (state === 'select'){
@@ -1298,6 +1303,8 @@
   }
 
   buildRoster();
+  // tiny test hook (only when the URL ends in #debug) — no effect on normal play
+  if (location.hash === '#debug') window.__bb = { get f1(){ return f1; }, get f2(){ return f2; }, get state(){ return state; } };
   // La Marseillaise on load — try immediately; browsers gate autoplay, so also fire on the first interaction
   Audio.startAnthem();
   const kickAnthem = () => Audio.startAnthem();

← 125754f Play La Marseillaise on load + cobblestone street floor stre  ·  back to Neon Baguette Battle  ·  Weapon loadout: Space=poke, Return=throw baguette, R=rocket, e6c5071 →