From aa4b81728ebd110019ab0a8417e4c628d912b9ce Mon Sep 17 00:00:00 2001 From: Vatsal2005 <83007841+Vatsal2005@users.noreply.github.com> Date: Sat, 24 Oct 2026 02:04:50 +0200 Subject: [PATCH] feat: add up attacks and pogo slams Measure chair-overhead contacts from the approved atlas. Add directional Act priority, a swept downward probe, full-height pogo impulse and a one-input buffer through descent and bounce recovery. Resolve chair contact before enemy damage and hazard reset. Exclude wrecks, cancel queued moves on damage or floor landing, and retain the existing light impact effects. Typecheck, 119 tests, build and docs pass; browser confirms four fixture pogos and the up pose beside coffee. --- docs/02-GAME-DESIGN.md | 39 ++++++++ game/src/combat/chair.ts | 49 +++++++++-- game/src/combat/coffee.ts | 4 +- game/src/combat/overhead.test.ts | 83 ++++++++++++++++++ game/src/combat/overhead.ts | 78 ++++++++++++++++ game/src/combat/sweeps.ts | 6 +- game/src/core/scaffold.ts | 2 +- game/src/enemies/rovers.ts | 3 +- game/src/player/jump.ts | 15 ++-- game/src/player/player.ts | 16 ++-- .../verification/40-overhead-pose-compare.png | Bin 0 -> 65906 bytes 11 files changed, 268 insertions(+), 27 deletions(-) create mode 100644 game/src/combat/overhead.test.ts create mode 100644 game/src/combat/overhead.ts create mode 100644 game/verification/40-overhead-pose-compare.png diff --git a/docs/02-GAME-DESIGN.md b/docs/02-GAME-DESIGN.md index d75a547..39baf49 100644 --- a/docs/02-GAME-DESIGN.md +++ b/docs/02-GAME-DESIGN.md @@ -131,6 +131,45 @@ knockback − 2 px overlap. Both alternating sweeps can then connect while the hero stands still. The 8 px displacement is fixture tuning; real enemy knockback belongs to the enemy controller. +### Up attack, slam and pogo implementation (#40) + +Directional Act starts on the press: Up takes priority; Down requires +airborne feet. Ordinary Act retains release-to-sweep and later hold-to-guard +(#41). Act suppresses climbing and coffee interaction, so Up + Act selects +the attack even beside a ladder or machine. Damage, death and climbing +cancel attacks. + +The `chair-overhead` cells are 108 × 126 px, pivot (54, 126). Measured dark +chair legs in `up-03` occupy x=51–78, y=12–37: the up contact envelope is +**−3…24 px horizontally, 89…114 px above the feet**. Only up poses 02/03 +are active, within the authored six-pose clip at 12 fps. It can overlap +an enemy above a one-way deck; a deck does not block a chair strike. + +Slam uses wind-up poses 00–02, holds descent pose 03, then plays 04–06 +on an ordinary floor. In slam-03 the low chair legs span x=65–91, or +**11…37 px ahead of the pivot**. The downward contact probe sweeps between +the previous and current foot positions, with the documented 2 px grain +as its margin, to prevent tunnelling. Descent tuning is twice run speed +(516 px/s). Contact with a living enemy or hazard snaps the feet to its +top and bounces with the existing 485 px/s full-jump impulse (about 96 px). +The four authored pogo poses play during the bounce. Damage rejection +does not suppress a physical bounce; a defeated wreck is excluded. +One directional press during descent or those four poses is buffered until +pogo recovery ends. Landing on a plain floor, damage or death clears it, +as with the ordinary sweep buffer. + +```mermaid +flowchart LR + INPUT["Up + new Act / airborne Down + new Act
keyboard or gamepad"] --> PRIORITY["Consume special input
suppress coffee, climb and release sweep"] + ATLAS["chair-overhead atlas + table
108 × 126, pivot 54,126"] --> MASK["Up: measured legs at poses 02/03
Slam: swept probe 11–37 px forward"] + PRIORITY --> MASK + MASK --> HIT["One attempt per target
accepted damage: 60 ms stop + spark"] + MASK --> BOUNCE["Enemy / hazard top contact before damage
snap feet; full-jump impulse"] + BOUNCE --> POSE["4 pogo poses; air control
one buffered directional press starts next slam"] + MASK --> FLOOR["Plain floor: remaining slam poses
no crack or shockwave"] + HIT --> CHECK["Measured comparison + tests
3 rover pogos; crab-through-deck fixture"] +``` + ## The glitch meter (after Region 1) Each defeated anomaly charges a 3-segment **glitch meter**. This was Lex's idea, merged with Alexander's Dexter version. **It is not a magic system** (A14): spells would make the game too easy. diff --git a/game/src/combat/chair.ts b/game/src/combat/chair.ts index 12da5aa..0a68659 100644 --- a/game/src/combat/chair.ts +++ b/game/src/combat/chair.ts @@ -2,6 +2,7 @@ import Phaser from 'phaser'; import type { Player } from '../player/player'; import { sound } from '../fx/sound/Audio'; import { HitStop, Sweeps, SWEEP_CONTACT, type Damageable, type Rect } from './sweeps'; +import { Overhead, SLAM_SPEED } from './overhead'; const ROVER_HEIGHT = 25; // docs/05 and approved enemy-rover:idle-00 alpha height. const ROVER_WIDTH = 31; // Approved enemy-rover:idle-00 alpha width; compare.py measures 31×25. @@ -11,9 +12,13 @@ const GRAIN = 2; // docs/09: two-pixel grain; retain this overlap after the fixt export class ChairCombat { readonly sweeps = new Sweeps(); readonly pause = new HitStop(); + readonly overhead = new Overhead(); private targets = new Map(); private key: Phaser.Input.Keyboard.Key; private wasDown = false; + private special = false; + private directions; + private previousY: number; private debug: Phaser.GameObjects.Graphics; private label: Phaser.GameObjects.Text; private visible = false; @@ -21,6 +26,16 @@ export class ChairCombat { constructor(private scene: Phaser.Scene, private player: Player, region: string) { this.enabled = region === 'rusty-creek'; this.key = scene.input.keyboard!.addKey('J'); + this.directions = scene.input.keyboard!.addKeys('W,S,UP,DOWN') as Record; + this.previousY = player.body.y; + const oldHazards = player.onHazards; + player.onHazards = boxes => { + if (!this.enabled || !player.canAttack) return false; + const top = this.overhead.hazard(player.body, this.previousY, boxes); + if (top === undefined) return false; + player.pogo(top); this.pause.trigger(); this.spark(boxes.find(box => box.y === top)!); return true; + }; + scene.events.once('shutdown', () => { player.onHazards = oldHazards; }); this.debug = scene.add.graphics().setDepth(10003); this.label = scene.add.text(20, 260, '', { fontFamily: 'monospace', fontSize: '18px', backgroundColor: '#17242d' }) .setDepth(10004).setScrollFactor(0).setVisible(false); @@ -47,46 +62,62 @@ export class ChairCombat { const actor = this.scene.add.sprite(this.player.body.x + distance, this.player.body.y, 'enemy-rover', Object.keys(table)[0] + '-00') .setOrigin(0.5, 1).setDepth(101); const spawn = { x: actor.x, y: actor.y }; - let count = 0; + let count = 0, slams = 0; const counter = this.scene.add.text(actor.x, actor.y - 40, 'hits 0', { fontSize: '14px', backgroundColor: '#17242d' }).setDepth(102); const bounds = () => ({ x: actor.x - ROVER_WIDTH / 2, y: actor.y - ROVER_HEIGHT, w: ROVER_WIDTH, h: ROVER_HEIGHT }); this.register({ id: 'verification-rover', bounds, hit: hit => { - count++; actor.x += hit.direction * FIXTURE_KNOCK; actor.setTintFill(0xffffff); - counter.setPosition(actor.x, actor.y - 40).setText('hits ' + count); + count++; if (hit.kind === 'slam') slams++; + actor.x += hit.direction * FIXTURE_KNOCK; actor.setTintFill(0xffffff); + counter.setPosition(actor.x, actor.y - 40).setText('hits ' + count + ' | slam ' + slams); this.scene.time.delayedCall(100, () => actor.clearTint()); return true; } }); this.player.life.register('verification-rover', () => { - count = 0; actor.setPosition(spawn.x, spawn.y); counter.setPosition(spawn.x, spawn.y - 40).setText('hits 0'); + count = 0; slams = 0; actor.setPosition(spawn.x, spawn.y); counter.setPosition(spawn.x, spawn.y - 40).setText('hits 0'); }); } update(milliseconds: number) { const pad = this.scene.input.gamepad?.getAll().find(p => p.connected); const down = this.key.isDown || !!pad?.X; + const pressed = Phaser.Input.Keyboard.JustDown(this.key) || down && !this.wasDown; const keyReleased = Phaser.Input.Keyboard.JustUp(this.key); - if (this.enabled && this.player.canAttack && !down && (this.wasDown || keyReleased)) { + const up = this.directions.W.isDown || this.directions.UP.isDown || !!pad?.up || (pad?.leftStick.y ?? 0) < -0.2; + const below = this.directions.S.isDown || this.directions.DOWN.isDown || !!pad?.down || (pad?.leftStick.y ?? 0) > 0.2; + if (this.enabled && this.player.canAttack && pressed && (up || below && !this.player.body.grounded)) { + this.special = true; this.sweeps.cancel(); + if (this.overhead.begin(up ? 'up' : 'slam', this.player.facing)) sound.play('chair-whoosh'); + } + if (this.enabled && this.player.canAttack && !this.special && this.overhead.phase === 'idle' && !down && (this.wasDown || keyReleased)) { const first = this.sweeps.phase === 'idle'; this.sweeps.press(this.player.facing); if (first) sound.play('chair-whoosh'); } + if (!down && (this.wasDown || keyReleased)) this.special = false; this.wasDown = down; - if (!this.enabled || !this.player.canAttack) this.sweeps.cancel(); + if (!this.enabled || !this.player.canAttack) { this.sweeps.cancel(); this.overhead.cancel(); } let remaining = milliseconds / 1000; while (remaining > 1e-9) { const dt = Math.min(remaining, 1 / 120), previous = this.sweeps.phase; this.sweeps.step(dt); + this.overhead.step(dt); if (previous !== this.sweeps.phase && (this.sweeps.phase === 'sweep-a' || this.sweeps.phase === 'sweep-b')) sound.play('chair-whoosh'); - const hits = this.sweeps.hit(this.player.body, this.targets.values()); + const contact = this.overhead.contact(this.player.body, this.previousY, this.targets.values()); + if (contact.bounce !== undefined) this.player.pogo(contact.bounce); + this.overhead.land(this.player.body.grounded); + const hits = [...this.sweeps.hit(this.player.body, this.targets.values()), ...contact.hits]; if (hits.length) { hits.forEach(box => this.spark(box)); this.pause.trigger(); break; } remaining -= dt; } + if (this.overhead.phase === 'descend') this.player.body.vy = Math.max(this.player.body.vy, SLAM_SPEED); if (this.sweeps.phase !== 'idle') { const frame = this.sweeps.phase + '-' + String(this.sweeps.frame).padStart(2, '0'); if (this.scene.textures.get('chair-side').has(frame)) this.player.sprite.setTexture('chair-side', frame) .setFlipX((this.sweeps.direction < 0) !== (this.sweeps.phase === 'sweep-b')); } + if (this.overhead.pose) this.player.sprite.setTexture('chair-overhead', this.overhead.pose).setFlipX(this.overhead.direction < 0); this.debug.clear(); - const box = this.sweeps.box(this.player.body); + const box = this.sweeps.box(this.player.body) ?? this.overhead.box(this.player.body, this.previousY); if (this.visible && box) this.debug.lineStyle(2, 0xff7835).strokeRect(box.x, box.y, box.w, box.h); - this.label.setText('chair ' + this.sweeps.phase + ' ' + this.sweeps.frame + ' | hit-stop ' + this.pause.remaining.toFixed(0) + 'ms'); + this.label.setText('chair ' + (this.overhead.pose ?? this.sweeps.phase + ' ' + this.sweeps.frame) + ' | hit-stop ' + this.pause.remaining.toFixed(0) + 'ms'); + this.previousY = this.player.body.y; } } diff --git a/game/src/combat/coffee.ts b/game/src/combat/coffee.ts index 00c80c3..4ecc581 100644 --- a/game/src/combat/coffee.ts +++ b/game/src/combat/coffee.ts @@ -23,14 +23,14 @@ export class CoffeePoints { private machines: Box[]; constructor(private scene: Phaser.Scene, private player: Player, chunks: CollisionChunk[]) { this.machines = chunks.flatMap(chunk => chunk.world.interact).filter(box => box.kind === 'coffee-machine'); - this.keys = scene.input.keyboard!.addKeys('W,UP') as Record; + this.keys = scene.input.keyboard!.addKeys('W,UP,J') as Record; this.actors = this.machines.map(box => scene.add.sprite(box.x + box.w / 2, box.y + box.h, 'coffee-placeholder', 'idle-00').setOrigin(0.5, 1).setDisplaySize(box.w, box.h).setDepth(99)); } update() { const pad = this.scene.input.gamepad?.getAll().find(p => p.connected); const up = this.keys.W.isDown || this.keys.UP.isDown || !!pad?.up || (pad?.leftStick.y ?? 0) < -0.2; - const machine = this.use.step(up, this.player.body, this.player.canAttack, this.machines); + const machine = this.use.step(up, this.player.body, this.player.canAttack && !this.keys.J.isDown && !pad?.X, this.machines); if (machine && this.player.beginInteraction()) this.player.saveCheckpoint(machine.id!); for (const actor of this.actors) actor.setAlpha(coffeeAlpha(this.scene.time.now)); } diff --git a/game/src/combat/overhead.test.ts b/game/src/combat/overhead.test.ts new file mode 100644 index 0000000..23802c2 --- /dev/null +++ b/game/src/combat/overhead.test.ts @@ -0,0 +1,83 @@ +import { describe, expect, it } from 'vitest'; +import { Overhead, SLAM_SPEED } from './overhead'; +import { Rover } from '../enemies/rover'; +import { pogo, jump } from '../player/jump'; +import { stepBody, type Body } from '../player/body'; +import type { Damageable } from './sweeps'; +import raw from '../../../art/stages/rusty-creek/rc-1-0.anomaly.collision.json'; +import clips from '../../public/assets/sprites/chair-overhead.anims.json'; + +describe('measured overhead chair attacks', () => { + it('enables only up poses 02/03, with exact measured bounds and six-pose duration', () => { + expect(clips.up).toEqual({ frames: 6, fps: 12, loop: false }); + expect(clips.slam.frames).toBe(7); expect(clips.pogo.frames).toBe(4); + const attack = new Overhead(), feet = { x: 100, y: 500 }; + attack.begin('up', 1); attack.step(1 / 12); expect(attack.box(feet, 500)).toBeUndefined(); + attack.step(1 / 12); expect(attack.box(feet, 500)).toEqual({ x: 97, y: 386, w: 27, h: 25 }); + attack.step(1 / 12); expect(attack.box(feet, 500)).toBeDefined(); + attack.step(1 / 12); expect(attack.box(feet, 500)).toBeUndefined(); + attack.step(2 / 12); expect(attack.pose).toBeUndefined(); + attack.begin('up', -1); attack.step(2 / 12); + expect(attack.box(feet, 500)).toEqual({ x: 76, y: 386, w: 27, h: 25 }); + }); + it('hits a 40px crab fixture at its authored one-way deck from below only once', () => { + const crab = raw.spawn.find(spawn => spawn.kind === 'crab')!; + expect(raw.oneWay.some(line => line.some(point => point[1] === crab.y))).toBe(true); + let hits = 0; + const target: Damageable = { id: crab.id, bounds: () => ({ x: crab.x - 20, y: crab.y - 40, w: 40, h: 40 }), + hit: hit => { expect(hit.kind).toBe('up'); hits++; return true; } }; + const attack = new Overhead(), feet = { x: crab.x, y: crab.y + 80 }; + attack.begin('up', 1); attack.step(2 / 12); + expect(attack.contact(feet, feet.y, [target]).hits).toHaveLength(1); + expect(attack.contact(feet, feet.y, [target]).hits).toHaveLength(0); expect(hits).toBe(1); + }); + it('performs three fresh pogos on the rover, bouncing before body contact', () => { + const attack = new Overhead(), rover = new Rover({ x: 760, y: 508 }, [640, 880]); + const target: Damageable = { id: 'rover', active: () => rover.health > 0, bounds: () => rover.bounds, + hit: hit => { expect(hit.kind).toBe('slam'); return rover.hit(hit.damage, hit.direction); } }; + for (let n = 0; n < 3; n++) { + expect(attack.begin('slam', 1)).toBe(true); attack.step(3 / 12); + const top = rover.bounds.y, feet = { x: rover.x - 20, y: top + 5 }; + const contact = attack.contact(feet, top - 10, [target]); + expect(contact.hits).toHaveLength(1); expect(contact.bounce).toBe(top); + expect(attack.phase).toBe('pogo'); expect(rover.health).toBe(2 - n); + expect(attack.contact(feet, top - 10, [target]).bounce).toBeUndefined(); + attack.step(4 / 12); rover.step(3 / 12); + } + }); + it('sweeps thin hazards without tunnelling and never bounces while rising or on wrecks', () => { + const attack = new Overhead(), hazard = { x: 120, y: 500, w: 20, h: 2 }; + attack.begin('slam', 1); attack.step(3 / 12); + expect(SLAM_SPEED).toBe(516); + expect(attack.hazard({ x: 100, y: 440 }, 450, [hazard])).toBeUndefined(); + expect(attack.hazard({ x: 100, y: 520 }, 450, [hazard])).toBe(500); + expect(attack.hazard({ x: 100, y: 520 }, 450, [hazard])).toBeUndefined(); + attack.step(4 / 12); attack.begin('slam', 1); attack.step(3 / 12); + const wreck: Damageable = { id: 'wreck', active: () => false, bounds: () => hazard, hit: () => true }; + expect(attack.contact({ x: 100, y: 520 }, 450, [wreck]).bounce).toBeUndefined(); + const armour = { ...wreck, active: () => true, hit: () => false }; + expect(attack.contact({ x: 100, y: 520 }, 450, [armour]).bounce).toBe(500); + }); + it('buffers one directional press during pogo recovery and clears it on cancellation', () => { + const attack = new Overhead(), hazard = { x: 120, y: 500, w: 20, h: 2 }; + attack.begin('slam', 1); attack.step(3 / 12); attack.hazard({ x: 100, y: 510 }, 490, [hazard]); + expect(attack.begin('slam', -1)).toBe(true); expect(attack.phase).toBe('pogo'); + attack.step(3 / 12); expect(attack.phase).toBe('pogo'); + attack.step(1 / 12); expect(attack.phase).toBe('windup'); expect(attack.direction).toBe(-1); + attack.cancel(); attack.step(1); expect(attack.phase).toBe('idle'); + attack.begin('slam', 1); attack.step(3 / 12); attack.begin('slam', 1); + attack.hazard({ x: 100, y: 510 }, 490, [hazard]); attack.cancel(); attack.step(1); + expect(attack.phase).toBe('idle'); + attack.begin('slam', 1); attack.step(3 / 12); attack.begin('slam', 1); + attack.land(true); attack.step(3 / 12); expect(attack.phase).toBe('idle'); + }); + it('uses a full 96px bounce even without Jump held, then plays plain-floor recovery without shockwaves', () => { + const body: Body = { x: 100, y: 500, vx: 0, vy: 516, grounded: false }; + const air = pogo(body, 483); let peak = body.y; + expect(body.y).toBe(483); expect(body.vy).toBe(-485); + for (let n = 0; n < 120; n++) { jump(body, air, false, 1 / 120); stepBody(body, [], 1 / 120); peak = Math.min(peak, body.y); } + expect(483 - peak).toBeGreaterThan(95); expect(483 - peak).toBeLessThan(97); + const attack = new Overhead(); attack.begin('slam', 1); attack.step(3 / 12); attack.land(true); + expect(attack.pose).toBe('slam-04'); attack.step(3 / 12); expect(attack.phase).toBe('idle'); + }); +}); diff --git a/game/src/combat/overhead.ts b/game/src/combat/overhead.ts new file mode 100644 index 0000000..9f20147 --- /dev/null +++ b/game/src/combat/overhead.ts @@ -0,0 +1,78 @@ +import { intersects, type Damageable, type Rect } from './sweeps'; +import type { Position } from '../core/events'; +import { RUN_SPEED } from '../player/movement'; + +// docs/02: measured chair-overhead legs; cell 108×126, foot pivot (54,126). +export const UP_CONTACT = { left: -3, right: 24, top: 114, bottom: 89 } as const; +export const SLAM_CONTACT = { left: 11, right: 37, grain: 2 } as const; +export const SLAM_SPEED = RUN_SPEED * 2; // Initial tuning in docs/02, 516 px/s. +type Phase = 'idle' | 'up' | 'windup' | 'descend' | 'land' | 'pogo'; +export class Overhead { + phase: Phase = 'idle'; + direction: -1 | 1 = 1; + private elapsed = 0; + private queued?: { kind: 'up' | 'slam'; direction: -1 | 1 }; + private struck = new Set(); + begin(kind: 'up' | 'slam', direction: -1 | 1) { + if (this.phase === 'pogo' || this.phase === 'descend') { this.queued = { kind, direction }; return true; } + if (this.phase !== 'idle') return false; + this.direction = direction; this.struck.clear(); this.enter(kind === 'up' ? 'up' : 'windup'); return true; + } + private enter(phase: Phase) { this.phase = phase; this.elapsed = 0; } + cancel() { this.enter('idle'); this.struck.clear(); this.queued = undefined; } + step(dt: number) { + this.elapsed += dt; + if (this.phase === 'windup' && this.elapsed + 1e-9 >= 3 / 12) this.enter('descend'); + else if (this.phase === 'up' && this.elapsed + 1e-9 >= 6 / 12 + || this.phase === 'land' && this.elapsed + 1e-9 >= 3 / 12 + || this.phase === 'pogo' && this.elapsed + 1e-9 >= 4 / 12) { + const queued = this.phase === 'pogo' ? this.queued : undefined; this.cancel(); + if (queued) this.begin(queued.kind, queued.direction); + } + } + land(grounded: boolean) { if (grounded && this.phase === 'descend') this.enter('land'); } + get pose() { + if (this.phase === 'idle') return undefined; + const frame = Math.floor((this.elapsed + 1e-9) * 12); + const clip = this.phase === 'up' ? 'up' : this.phase === 'pogo' ? 'pogo' : 'slam'; + const index = this.phase === 'descend' ? 3 : this.phase === 'land' ? Math.min(6, 4 + frame) + : this.phase === 'windup' ? Math.min(2, frame) : Math.min(clip === 'up' ? 5 : 3, frame); + return `${clip}-${String(index).padStart(2, '0')}`; + } + private rect(position: Position, left: number, right: number, y: number, h: number): Rect { + return { x: position.x + (this.direction > 0 ? left : -right), y, w: right - left, h }; + } + box(position: Position, previousY: number): Rect | undefined { + const frame = Math.floor((this.elapsed + 1e-9) * 12); + if (this.phase === 'up' && (frame === 2 || frame === 3)) { + const c = UP_CONTACT; return this.rect(position, c.left, c.right, position.y - c.top, c.top - c.bottom); + } + if (this.phase === 'descend' && position.y >= previousY) { + const c = SLAM_CONTACT; + return this.rect(position, c.left, c.right, previousY - c.grain, position.y - previousY + c.grain * 2); + } + return undefined; + } + contact(position: Position, previousY: number, targets: Iterable) { + const box = this.box(position, previousY), hits: Rect[] = []; + if (!box) return { hits, bounce: undefined as number | undefined }; + const descending = this.phase === 'descend'; + const candidates = [...targets].filter(target => target.active?.() !== false) + .map(target => ({ target, bounds: target.bounds() })).sort((a, b) => a.bounds.y - b.bounds.y); + for (const { target, bounds } of candidates) { + if (this.struck.has(target.id) || !intersects(box, bounds) + || descending && bounds.y < previousY - SLAM_CONTACT.grain) continue; + this.struck.add(target.id); + if (target.hit({ damage: 1, direction: this.direction, position: { ...position }, kind: descending ? 'slam' : 'up' })) hits.push(bounds); + if (descending) { this.enter('pogo'); return { hits, bounce: bounds.y }; } + } + return { hits, bounce: undefined as number | undefined }; + } + hazard(position: Position, previousY: number, hazards: Rect[]) { + const box = this.box(position, previousY); + const hazard = this.phase === 'descend' && box && [...hazards].sort((a, b) => a.y - b.y) + .find(target => target.y >= previousY - SLAM_CONTACT.grain && intersects(box, target)); + if (!hazard) return undefined; + this.enter('pogo'); return hazard.y; + } +} diff --git a/game/src/combat/sweeps.ts b/game/src/combat/sweeps.ts index 7f2fbfb..5cb59f8 100644 --- a/game/src/combat/sweeps.ts +++ b/game/src/combat/sweeps.ts @@ -1,6 +1,6 @@ export interface Rect { x: number; y: number; w: number; h: number } -export interface ChairHit { damage: number; direction: -1 | 1; position: { x: number; y: number }; kind: 'sweep' } -export interface Damageable { id: string; bounds(): Rect; hit(hit: ChairHit): boolean } +export interface ChairHit { damage: number; direction: -1 | 1; position: { x: number; y: number }; kind: 'sweep' | 'up' | 'slam' } +export interface Damageable { id: string; active?(): boolean; bounds(): Rect; hit(hit: ChairHit): boolean } export const intersects = (a: Rect, b: Rect) => a.x < b.x + b.w && a.x + a.w > b.x && a.y < b.y + b.h && a.y + a.h > b.y; // docs/02 measured contact: chair-side A04/B03, cell 86×81, foot pivot (43,81). @@ -59,7 +59,7 @@ export class Sweeps { if (!box) return hits; for (const target of targets) { const bounds = target.bounds(); - if (this.struck.has(target.id) || !intersects(box, bounds)) continue; + if (target.active?.() === false || this.struck.has(target.id) || !intersects(box, bounds)) continue; this.struck.add(target.id); if (target.hit({ damage: 1, direction: this.direction, position: { ...position }, kind: 'sweep' })) hits.push(bounds); } diff --git a/game/src/core/scaffold.ts b/game/src/core/scaffold.ts index c57ce2f..eca38ef 100644 --- a/game/src/core/scaffold.ts +++ b/game/src/core/scaffold.ts @@ -77,8 +77,8 @@ export class Stage extends Phaser.Scene { if (active <= 0) return; this.coffee?.update(); this.player?.update(active); - this.rovers?.update(active); this.combat?.update(active); + this.rovers?.update(active); if (this.player) this.follow?.(this.player.body, active); } } diff --git a/game/src/enemies/rovers.ts b/game/src/enemies/rovers.ts index 175e612..2b75567 100644 --- a/game/src/enemies/rovers.ts +++ b/game/src/enemies/rovers.ts @@ -23,7 +23,8 @@ export class Rovers { const sprite = scene.add.sprite(model.x, model.y, 'enemy-rover', 'idle-00').setOrigin(0.5, 1).setDepth(101); const label = scene.add.text(model.x, model.y - ROVER_HEIGHT - BODY_WIDTH / 2, '', { fontFamily: 'monospace', fontSize: '14px', backgroundColor: '#17242d' }).setDepth(102).setVisible(false); - cleanup.push(chair.register({ id: spawn.id!, bounds: () => model.bounds, hit: hit => model.hit(hit.damage, hit.direction) })); + cleanup.push(chair.register({ id: spawn.id!, active: () => model.health > 0, + bounds: () => model.bounds, hit: hit => model.hit(hit.damage, hit.direction) })); cleanup.push(player.life.register(spawn.id!, () => model.reset())); return { id: spawn.id!, model, sprite, label }; }); diff --git a/game/src/player/jump.ts b/game/src/player/jump.ts index 834b6e0..8ff2aa9 100644 --- a/game/src/player/jump.ts +++ b/game/src/player/jump.ts @@ -7,10 +7,15 @@ export const HOLD_HEIGHT = 96; export const JUMP_SPEED = 485; // Semi-implicit 120Hz integration reaches about 96px. export interface Jump { coyote: number; buffer: number; wasDown: boolean; active: boolean; - origin: number; peak: number; height: number; landing: number; hard: boolean; + origin: number; peak: number; height: number; landing: number; hard: boolean; forced: boolean; } export const jumpState = (y: number): Jump => ({ coyote: 0, buffer: 0, wasDown: false, active: false, - origin: y, peak: y, height: 0, landing: 0, hard: false }); + origin: y, peak: y, height: 0, landing: 0, hard: false, forced: false }); + +export function pogo(body: Body, top: number): Jump { + body.y = top; body.vy = -JUMP_SPEED; body.grounded = false; + return { ...jumpState(top), active: true, forced: true }; +} export function jump(body: Body, state: Jump, down: boolean, dt: number) { state.coyote = body.grounded ? COYOTE : Math.max(0, state.coyote - dt); @@ -18,10 +23,10 @@ export function jump(body: Body, state: Jump, down: boolean, dt: number) { state.wasDown = down; if (state.buffer > 1e-9 && state.coyote > 1e-9) { body.vy = -JUMP_SPEED; body.grounded = false; - state.coyote = 0; state.buffer = 0; state.active = true; + state.coyote = 0; state.buffer = 0; state.active = true; state.forced = false; state.origin = body.y; state.peak = body.y; state.height = 0; state.landing = 0; } - if (!down && state.active && body.vy < 0) { + if (!down && state.active && !state.forced && body.vy < 0) { // Early releases share a 52px minimum rise; later releases stop at their current height. const remainingRise = Math.max(0, TAP_HEIGHT - (state.origin - body.y)); body.vy = Math.max(body.vy, -Math.sqrt(2 * GRAVITY * remainingRise)); @@ -35,6 +40,6 @@ export function landing(body: Body, state: Jump, wasGrounded: boolean, dt: numbe if (!wasGrounded && body.grounded) { state.hard = body.y - state.peak >= 152; // Two body heights; tune with the route playtest. state.landing = state.hard ? 4 / 12 : 2 / 12; - state.active = false; state.peak = body.y; + state.active = false; state.forced = false; state.peak = body.y; } } diff --git a/game/src/player/player.ts b/game/src/player/player.ts index fdf149f..56337b3 100644 --- a/game/src/player/player.ts +++ b/game/src/player/player.ts @@ -1,8 +1,8 @@ import Phaser from 'phaser'; -import type { CollisionChunk } from '../stage/collision'; +import type { CollisionChunk, Box } from '../stage/collision'; import { BODY_HEIGHT, BODY_WIDTH, overlaps, stepBody, type Body } from './body'; import { horizontal, move, movement } from './movement'; -import { jump, jumpState, landing } from './jump'; +import { jump, jumpState, landing, pogo } from './jump'; import { climb, dropThrough, traversal } from './traversal'; import { catalogue, LocomotionAnimation, type MotionPose } from './animation'; import { gameEvents } from '../core/events'; @@ -16,6 +16,7 @@ export class Player { readonly sprite: Phaser.GameObjects.Sprite; readonly life: Life; onHealthChanged: (health: number) => void = () => {}; + onHazards: (boxes: Box[]) => boolean = () => false; private motion = movement(); private keys; private debug: Phaser.GameObjects.Graphics; @@ -38,7 +39,7 @@ export class Player { this.animation = new LocomotionAnimation(catalogue(Object.fromEntries( ['hero-move', 'hero-run', 'hero-idle', 'hero-air'].map(board => [board, scene.cache.json.get(`${board}.anims`)])))); this.sprite = scene.add.sprite(this.body.x, this.body.y, 'hero-move', 'idle-00').setOrigin(0.5, 1).setDepth(100); - this.keys = scene.input.keyboard!.addKeys('A,D,W,S,LEFT,RIGHT,UP,DOWN,SPACE,K') as Record; + this.keys = scene.input.keyboard!.addKeys('A,D,W,S,LEFT,RIGHT,UP,DOWN,SPACE,K,J') as Record; this.debug = scene.add.graphics().setDepth(10001); this.label = scene.add.text(20, 135, '', { fontFamily: 'monospace', fontSize: '18px', backgroundColor: '#17242d' }) .setScrollFactor(0).setDepth(10002).setVisible(false); @@ -85,6 +86,7 @@ export class Player { this.motion = { ...movement(), facing: this.motion.facing }; this.body.vx = 0; this.body.vy = 0; return true; } + pogo(top: number) { this.air = pogo(this.body, top); this.sprite.setPosition(Math.round(this.body.x), top); } private resetPosition(position: { x: number; y: number }) { Object.assign(this.body, position, { vx: 0, vy: 0, grounded: true, sliding: false, slope: 0 }); this.motion = movement(); this.air = jumpState(this.body.y); this.traversal = traversal(); @@ -100,7 +102,7 @@ export class Player { const axis = interacting ? 0 : horizontal(this.keys.A.isDown || this.keys.LEFT.isDown, this.keys.D.isDown || this.keys.RIGHT.isDown, pad?.leftStick.x, pad?.left, pad?.right); const jumpDown = !interacting && (this.keys.SPACE.isDown || this.keys.K.isDown || !!pad?.A); - const vertical = interacting ? 0 : horizontal(this.keys.W.isDown || this.keys.UP.isDown, this.keys.S.isDown || this.keys.DOWN.isDown, + const vertical = interacting || this.keys.J.isDown || pad?.X ? 0 : horizontal(this.keys.W.isDown || this.keys.UP.isDown, this.keys.S.isDown || this.keys.DOWN.isDown, pad?.leftStick.y, pad?.up, pad?.down); const geometry = this.chunks.map(c => c.world); // Substeps keep wall and floor contacts stable during slow rendered frames. @@ -138,9 +140,11 @@ export class Player { remaining -= dt; } if (this.life.dead === 0) { - const hazard = geometry.flatMap(g => g.hazard).find(box => overlaps(this.body, box)); + const hazards = geometry.flatMap(g => g.hazard); + const bounced = this.onHazards(hazards); + const hazard = hazards.find(box => overlaps(this.body, box)); const noGo = this.body.y > 900 || geometry.some(g => g.noGo.some(box => overlaps(this.body, box))); - if (hazard) this.resetFromDanger(Number(hazard.damage) || 1); + if (hazard && !bounced) this.resetFromDanger(Number(hazard.damage) || 1); else if (noGo) this.resetFromDanger(); else if (this.body.grounded && this.life.knock === 0) this.life.rememberSafe(this.body); } diff --git a/game/verification/40-overhead-pose-compare.png b/game/verification/40-overhead-pose-compare.png new file mode 100644 index 0000000000000000000000000000000000000000..3fd09d55a572c52658ce4898138d5f8c8977eaa9 GIT binary patch literal 65906 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