Make the pink weapons throw themselves, and let the big bodies soak
Oliver's playtest of the barrel weapons. Four notes, all four real defects. "The bigger guys were way too easy to kill at the beginning." A bug, and an old one. The ball-vs-body chain handled boss, g/m, s, f and a/b, and everything NOT named in it fell through to "splat-quality kills outright" -- so the STEWARD has died to one serve since the day he shipped with stewardHp 5 and a comment calling it a brute's worth of hp, and the three new bodies inherited that the moment they existed. Pellets and melee always read hp; only the ball skipped it. One generic hpMax > 1 branch now, and measured after: shambler 2, steward 5, brute 5, ball boy 3, bouncer 5, roller man 7 -- each exactly its hp. "I have seen all of them by round 10." The new three move 3/8/15 -> 5/12/20. The original four keep their gates: that curve was already tuned through game 12. "The laser fired only when I tapped, that was confusing." The whole tap-per-round kind is gone. A barrel weapon is now either the normal ball gesture made spectacular or something that fires itself -- nothing waits for a tap. - laser is a serve, and the RAY is the weapon: no ball anywhere in it. The preview IS the wedge, it leaves the RACKET rather than lying on the grass, the release erases the plane along its own path behind a bright front, and the edges are hairlines instead of the heaviest lines on the court. - beacon and rocket are LOBBED bursts -- `arc` turns a flat pellet into a thrown one, solved onto the nearest body ahead, and landing is itself a hit so a rocket that misses still goes off where it lands. The beacon changes colour every ball and drags that colour behind it. - flamer got "way more pronounced": 30 rounds/s, a ~10 m cone, embers. "I got the laser almost every time." A flat 1-in-4 over four items does not feel uniform. BARREL_WEAPONS carries weight and a `from` gate now, never repeats twice running, and the beacon is what you meet first. Measured: laser 16-28%, rocket unlocked at game 12 so it is genuinely a late find. And the barrel keeps its pink halo -- that was always procedural, painted by drawBarrel, and never went near the chroma key. Three rings and a pool on the lawn now, because one flat disc read as a smudge. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
25f915f236
commit
282f5145a9
8 files changed
+363
-98
No files matched your search
@@ -230,9 +230,12 @@ export const TUNE = {
|
||||
mgPelletR: 0.5, // m of extra hit radius on a pellet: a fat round. "Bigger ball = more damage."
|
||||
dmgPelletHp: 2, // hp a pellet takes off a body — shamblerHp is 2, so the horde gun one-shots them
|
||||
mgPickupLen: 8, // s the machine-gun tin (4th delivery) auto-fires outside hordes
|
||||
shotHoldLen: 14, // s you stay braced with a TAP-fired weapon (laser, rocket) before the window
|
||||
// closes on its own. Running the magazine out ends it earlier, which is the
|
||||
// normal way; this only stops a forgotten rocket freezing the serve loop.
|
||||
// ---- THE LASER's wedge: aim and release like a serve, and a plane of light widens down the lane
|
||||
beamLen: 26, // m it reaches — the whole court, so a lane you aim is a lane you clear
|
||||
beamW0: 0.35, // m half-width at the racket...
|
||||
beamW1: 4.2, // ...and at the far end. It is a CONE: the spread is the point of it
|
||||
beamT: 0.42, // s the wedge stays drawn
|
||||
dmgBeam: 3, // hp the beam takes off anything it catches (dmgBomb is 3, and it reads the same)
|
||||
// ---- the weapon barrel: the only way to get the four weapons that are not on the duel ladder
|
||||
barrelEvery: 3, // games between barrels being rolled on (like the ball machine's machEvery)
|
||||
barrelRoll: 2.6, // m/s it trundles across the far court — fast enough to have to be led
|
||||
@@ -249,9 +252,12 @@ export const TUNE = {
|
||||
// ---- the late roster. Three bodies that arrive as the run goes on, filling the gap between the
|
||||
// 2 hp shamblers and the 5 hp brute and then extending past it. Each has one wound skin per hit it
|
||||
// can still take, so the damage is readable without a bar (the rule the boss's missing bar set).
|
||||
// These are now REAL: the ball path used to one-shot anything it had no branch for, so all three
|
||||
// died to a single good serve no matter what these said. Retuned once they actually bite — 9 was
|
||||
// fine as a number nobody felt and is a long grind as a number you do.
|
||||
ballboyHp: 3, // the ball boy ('e') — a stock-sized body that takes three, with two wound skins
|
||||
bouncerHp: 6, // the bouncer ('h') — 2.4 m, shoves through the crowd instead of shambling round it
|
||||
rollerHp: 9, // the roller man ('k') — 3.2 m, hauling a court roller. The heaviest thing on court
|
||||
bouncerHp: 5, // the bouncer ('h') — 2.4 m, shoves through the crowd instead of shambling round it
|
||||
rollerHp: 7, // the roller man ('k') — 3.2 m, hauling a court roller. The heaviest thing on court
|
||||
rollerStride: 0.62, // m he covers per lurch frame — longer than the brute's 0.5: a bigger body,
|
||||
// a longer stride, or his feet slide the way the brute's used to
|
||||
// fire: the flame ball no longer just kills what it touches, it starts an epidemic.
|
||||
@@ -422,11 +428,15 @@ export const ZWOUND = {
|
||||
// out (SLOTS, slotStock, WDESC, drawRack's three parallel arrays, and deliverTin's index mapping).
|
||||
// The rack no longer has a fixed weapon per slot: G.rack holds up to four of these in the order you
|
||||
// GATHERED them, and slot 0 stays BALL. A weapon is defined entirely by its row.
|
||||
// kind 'serve' — arms the next serve (the four original tins)
|
||||
// kind 'burst' — commits to a braced auto-fire window: `len` seconds at `rate` rounds/s
|
||||
// kind 'shot' — same braced stance, but each TAP fires one and `tin` is the magazine
|
||||
// The pellet fields (r, dmg, pierce, boom, ignite, col, speed) are stamped onto the round by
|
||||
// firePellet, so all four new weapons are the ONE existing pellet loop with different numbers.
|
||||
// kind 'serve' — arms the next serve: you aim and release it like a normal ball
|
||||
// kind 'burst' — commits to a braced window that FIRES ITSELF: `len` seconds at `rate` rounds/s
|
||||
// There is no third kind. A tap-per-round weapon shipped once and Oliver read it as broken —
|
||||
// "the laser fired only when I tapped, that was confusing" — so a barrel weapon is now always one
|
||||
// of exactly two things: the normal ball gesture made spectacular, or something that fires on its
|
||||
// own for a while. Nothing in between.
|
||||
// The pellet fields (r, dmg, hp, pierce, boom, ignite, arc, trail, col, speed, life) are stamped
|
||||
// onto the round by firePellet, so every auto-firing weapon is the ONE pellet loop with different
|
||||
// numbers — `arc` is what turns a flat round into a lobbed one.
|
||||
export const WEAPONS = {
|
||||
bomb: { label: 'BOMB', icon: 'w_bomb', tin: 3, kind: 'serve',
|
||||
desc: ['DETONATES ON CONTACT', 'CLEARS A WHOLE CROWD AT ONCE'] },
|
||||
@@ -438,24 +448,43 @@ export const WEAPONS = {
|
||||
r: 0.5, dmg: 0.34, hp: 2, speed: 26,
|
||||
desc: ['HOLD THE LINE AND SPRAY', 'A BURST, NOT A SERVE'] },
|
||||
// ---- the four that come out of a barrel. Won by shooting one, never delivered.
|
||||
beacon: { label: 'BEACON', icon: 'w_beacon', tin: 1, kind: 'burst', len: 10, rate: 3,
|
||||
r: 1.1, dmg: 3, hp: 9, speed: 17, col: '#7fefff', glow: 1,
|
||||
desc: ['A SLOW BEAT OF BIG', 'GLOWING SHELLS'] },
|
||||
flamer: { label: 'FLAMER', icon: 'w_flamer', tin: 1, kind: 'burst', len: 5, rate: 16,
|
||||
r: 0.8, dmg: 2, hp: 9, speed: 11, life: 0.55, ignite: true, col: '#ffa040', glow: 1, // life 0.55s x 11 m/s = a ~6 m cone
|
||||
desc: ['A CONE OF FIRE', 'AND THE FIRE SPREADS'] },
|
||||
laser: { label: 'LASER', icon: 'w_laser', tin: 10, kind: 'shot',
|
||||
// A LOBBED tennis ball twice the weight of yours, thrown on its own beat, changing colour every
|
||||
// shot and dragging its colour behind it. The showiest thing in the game and the one you meet first.
|
||||
beacon: { label: 'BEACON', icon: 'w_beacon', tin: 1, kind: 'burst', len: 11, rate: 1.6,
|
||||
r: 1.2, dmg: 2, hp: 4, arc: 1, hue: 1, trail: 3, glow: 1.6, speed: 19,
|
||||
desc: ['IT THROWS ITSELF', 'TWICE THE BALL, EVERY COLOUR'] },
|
||||
// "make this one way more pronounced": twice the rounds a second, a wider and longer cone, fat
|
||||
// glowing rounds that throw their own embers, and every one of them lights what it touches.
|
||||
flamer: { label: 'FLAMER', icon: 'w_flamer', tin: 1, kind: 'burst', len: 6, rate: 30,
|
||||
r: 1.15, dmg: 2, hp: 9, speed: 15, life: 0.7, ignite: true, igniteR: 2.6,
|
||||
trail: 2, col: '#ff8420', glow: 2, spread: 3.1, // life 0.7s x 15 m/s = a ~10 m cone
|
||||
desc: ['A WALL OF FIRE', 'AND THE FIRE SPREADS'] },
|
||||
// The normal ball gesture, made spectacular: pull, aim, release — and instead of a ball you get a
|
||||
// blue plane that widens down the court and cuts through everything standing in it.
|
||||
laser: { label: 'LASER', icon: 'w_laser', tin: 6, kind: 'serve', beam: 1,
|
||||
// NOT magenta: the icon art is chroma-keyed and the key eats every pink/purple
|
||||
// (min(r,b) > g+40), so a magenta laser came back as a hollow outline. Pink stays
|
||||
// the BARREL's identity, where it is a procedural glow and never goes near the key.
|
||||
r: 0.55, dmg: 3, hp: 9, speed: 70, pierce: true, col: '#8ab6ff', glow: 1,
|
||||
desc: ['TEN SHOTS, AND EACH ONE', 'GOES THROUGH THE WHOLE LANE'] },
|
||||
rocket: { label: 'ROCKET', icon: 'w_rocket', tin: 3, kind: 'shot',
|
||||
r: 0.6, dmg: 3, hp: 9, speed: 22, boom: true, col: '#ffd050', glow: 1,
|
||||
desc: ['THREE ROCKETS', 'EACH ONE TAKES THE CROWD'] },
|
||||
col: '#3f74ff', // saturated: a pale blue washed out to grey over the lawn
|
||||
desc: ['AIM AND RELEASE', 'A WIDENING WALL OF LIGHT'] },
|
||||
// Lobbed, self-throwing, and it detonates like a bomb where it lands. Deliberately a LATE pickup
|
||||
// (see pickBarrelWeapon) — Oliver: "best later in the game when there is really a lot going on".
|
||||
rocket: { label: 'ROCKET', icon: 'w_rocket', tin: 1, kind: 'burst', len: 9, rate: 0.85,
|
||||
r: 0.75, dmg: 3, hp: 9, arc: 1, boom: true, trail: 2, speed: 17,
|
||||
col: '#ffd050', glow: 1.4,
|
||||
desc: ['IT LAUNCHES ITSELF', 'AND EVERY ONE IS A BOMB'] },
|
||||
};
|
||||
// What a pink barrel can be carrying — the four above, which you cannot win any other way. NOT a
|
||||
// flat 1-in-4: on that, Oliver "got the laser almost every time" and never once saw the beacon.
|
||||
// Weighted, gated, and it never hands you the same thing twice running (see pickBarrelWeapon).
|
||||
// weight relative chance once it is unlocked
|
||||
// from games finished before it can appear at all
|
||||
export const BARREL_WEAPONS = {
|
||||
beacon: { weight: 4, from: 0 }, // the showpiece, and the one you should meet first
|
||||
flamer: { weight: 3, from: 2 },
|
||||
laser: { weight: 2, from: 6 },
|
||||
rocket: { weight: 3, from: 12 }, // the late-game answer: it should never turn up in game three
|
||||
};
|
||||
// what a pink barrel can be carrying — the four above that you cannot win any other way
|
||||
export const BARREL_WEAPONS = ['beacon', 'laser', 'rocket', 'flamer'];
|
||||
export const RACK_MAX = 4; // gathered weapons the rack holds; a 5th rides slot 0 until it is spent
|
||||
|
||||
export const MACH_H = 1.55; // was 1.15 — waist high read as a prop you could ignore. Still furniture
|
||||
|
||||
Reference in new issue
Block a user