Fill the rack yourself, and roll barrels out that fill it
The rack had five hardcoded slots where the index WAS the weapon, spelled out in
five places: SLOTS, slotStock, WDESC, drawRack's three parallel arrays,
deliverTin's w+1, and bare wsel === 1|2|3 / G.weapon === 4 tests across five
files. config.WEAPONS is the one table now, G.rack holds up to four {id, n} in
the order you GATHERED them, and slot 0 stays BALL. Everything reads through
slotId/slotStock/slotEntry, so nothing else knows how the rack is stored.
A fifth weapon is always allowed, per Oliver: it rides slot 0 as G.temp until
spent, then slot 0 goes back to the infinite ball. A barrel arms on the spot and
is spent quickly, so refusing it would mean a barrel you shot did nothing. And a
spent weapon LEAVES its slot -- with gathered slots, an exhausted weapon holding
one is a quarter of the rack you can never pick up into. (The old rack kept its
empties dimmed, which was right when a slot meant "BOMB goes here".)
Four new weapons, and they are all the ONE existing pellet loop. firePellet(w)
stamps the WEAPONS row onto the round -- r, dmg, hp, pierce, boom, ignite, col,
speed, life -- so the beacon cannon, flamethrower, laser and rocket needed no new
array and no new update; the break after the first body was the only thing making
a pellet single-target. All four go through the same isBoss branch, which is why
none can silently no-op on a boss the way three of five once did. Measured:
gun/beacon/laser/rocket reach past 16 m, the flamer is a ~6 m cone that ignites.
G.mgT stays the mode timer for all of them, so the eighteen !(G.mgT > 0) guards
across five files did not have to change. kind:'burst' auto-fires at its own rate
for len seconds; kind:'shot' holds the same braced stance and fires one per tap.
The barrels reuse the ball machine's shape: a rolling, shootable non-body. All
three of the registrations that fail silently are done -- blocksClear (loot must
not gate the hand-clear), the contact guard (furniture cannot eat you), and
hitR/GORE_MUL/zombieH. It scores nothing.
The pink had to become procedural. The chroma key deletes every pixel where red
and blue both beat green by 40, so a magenta drum and a magenta laser pistol both
came back as hollow outlines -- 19% and 15% solid against 50-56% for the icons in
other colours. The drum is grey steel with hazard chevrons and every bit of its
pink is the halo drawBarrel paints; the laser went electric blue. Both are solid
now (92% and 58%), and the rule is written down in HANDOFF.
tinTriples 3 -> 10 as asked, and the four dead TUNE ammo constants are gone --
nothing read them once the table landed, which is a panel value you can tune all
day for no effect.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
4cda6bde76
commit
25f915f236
16 files changed
+385
-97
No files matched your search
@@ -45,15 +45,19 @@ export const G = {
|
||||
aiReactT: 9, // time since the player's last hit; CPU reads the shot after TUNE.aiReaction
|
||||
wasServe: false, // the ball in flight is a serve (first bounce must hit the box)
|
||||
splatT: 0, // time survived in splatter mode — drives the difficulty ramp
|
||||
// the courtside rack: tins ACCUMULATE (capped at TUNE.wCap), and G.weapon picks which one
|
||||
// the next serve throws. Slot 0 = PLAIN (a normal ball — how you bank your specials).
|
||||
bombs: 0, // bomb-ball stock — a serve blasts an area (rack slot 1)
|
||||
triples: 0, // triple-serve stock — a serve fans into three balls (slot 2)
|
||||
flames: 0, // flame-ball stock — kills on any touch, full pierce (slot 3)
|
||||
guns: 0, // machine-gun charges — committing one starts an mgT burst (slot 4)
|
||||
weapon: 0, // selected rack slot: 0 PLAIN, 1 BOMB, 2 TRIPLE, 3 FIRE, 4 GUN
|
||||
mgT: 0, // s of machine-gun burst left — auto-fire, no serving (spent from G.guns)
|
||||
mgCool: 0, // s until the next pickup-mode pellet
|
||||
// The courtside rack. Slots 1-4 are NOT fixed weapon types anymore: they hold what you have
|
||||
// GATHERED, in pickup order, so which four you are carrying is a run-by-run thing. Stock still
|
||||
// ACCUMULATES per weapon (capped at TUNE.wCap). Slot 0 stays BALL — infinite, and how you bank a
|
||||
// special instead of spending it.
|
||||
rack: [], // up to RACK_MAX { id, n } — the gathered weapons, in the order they arrived
|
||||
temp: null, // { id, n } — a FIFTH weapon, riding slot 0 until it is spent. A barrel arms
|
||||
// itself on the spot, so it always has somewhere to go even with a full rack.
|
||||
weapon: 0, // selected slot: 0 = BALL (or temp, if one is riding it), 1..4 = G.rack[i-1]
|
||||
mgT: 0, // s of braced auto-fire left — no serving while it runs (gun/beacon/flamer,
|
||||
// and it doubles as the window a tap-fired laser or rocket is held for)
|
||||
mgCool: 0, // s until the next pellet in that burst
|
||||
gunId: null, // which WEAPONS row that burst is firing — rate, radius, damage, colour
|
||||
gunShots: 0, // rounds left for a kind:'shot' weapon (laser 10, rocket 3); 0 ends the window
|
||||
deliveries: 0, // tins delivered this run — indexes the weapon ladder
|
||||
duelDue: false, // the schedule called a duel — fire it at the next hand-cleared court
|
||||
afterDuel: null, // the game beat the scheduled duel interrupted ('changeover' | 'game'), resumed when it resolves
|
||||
|
||||
Reference in new issue
Block a user