Skip to content

[16/16] feat: block frontal hits with the chair guard - #149

Merged
arudaev merged 20 commits into
feature/40-overhead-and-pogofrom
feature/41-chair-guard
Oct 24, 2026
Merged

arudaev merged 20 commits into
feature/40-overhead-and-pogofrom
feature/41-chair-guard

Conversation

@Vatsal2005

@Vatsal2005 Vatsal2005 commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator

What and why

Hold Act to raise the chair and block frontal one-cell damage. Guard becomes active at the first forward-leg pose (02), loops the hold clip, and plays impact poses with a 14px kinematic push on a successful block. A blocked rover recoils without losing HP, preventing the charge from passing through into a back hit. Rear damage still hits normally.

Two-cell heavy damage breaks the guard and uses normal life damage/knockback. The four break poses survive the knockback state; death takes priority. A quick release remains a sweep, an engaged release consumes the input, and a hold begun during another attack raises guard when that attack finishes. Directional attacks keep priority.

Issue

Closes #41

Refs #45, #57

Stack

Base: feature/40-overhead-and-pogo. Human merges bottom up; retarget the next PR to main and merge origin/main into every open branch, never rebase.

Acceptance and remaining integration

  • Held Act blocks frontal damage with a small push; verified against the real tutorial rover

  • Rear hits cost health despite holding guard

  • Two-cell heavy damage breaks guard and plays four authored break poses; verified in the pure guard/life test

  • Actual Jenny charge integration and browser playthrough when [M4-S5] Jenny: rev, charge, crash, debris, stunned – three phases #57 reaches this stack

Verification

  • Node 22: npm run typecheck, npm test (128 tests), npm run build; includes main integration at e8577ab

  • py -3.13 scripts/check_docs.py

  • git diff --cached --check

  • Tests cover exact pose/FPS activation, hold loop, quick versus engaged release, cancelled taps, front/back in both directions, blocked rover recoil without HP loss, heavy guard break, 14px push over three frames and wall clipping

  • Browser: holding J through the first real rover charge leaves 5/5 cells, increments the block counter to 1 and moves the hero from x676 to x662 (14px). Rover remains at 3/3 HP

  • Browser: facing away while holding J takes a rear charge, leaves 4/5 cells and records zero blocks

  • Browser: a 5ms tap followed by a long hold leaves one fixture hit; guard release adds no sweep. No console errors

  • Physical gamepad and Vercel preview: existing deployments require the owner to grant Vatsal2005 project access

Reference comparison

Plan: docs/02 chair guard.

Native guard raise, hold, impact and break on one foot baseline

Reproduce: python scripts/compare.py lineup chair-block:guard-up-00 chair-block:guard-up-01 chair-block:guard-up-02 chair-block:guard-up-03 chair-block:guard-hold-00 chair-block:guard-impact-00 chair-block:guard-break-00 --out game/verification/41-guard-pose-compare.png.

Pose 02 is the first raised pose with forward-pointing legs, so activation is 2/12s. Standing raise/hold poses measure 76px; the approved impact crouches to 72px and break extends to 92px including the raised arms. Runtime preserves native atlas sizes. Push distance is half the documented 28px body width and uses the existing wall/floor solver.

Browser proof shown in chat and retained in ignored tmp/verification/41-front-guard.png, 41-rear-hit.png and 41-tap-then-hold.png. The front capture is after the block/release and before the next unguarded charge; its persistent block counter and unchanged five cells identify the successful block.

Short-tap correction

The pool integration check exposed a lost-tap case: Phaser's Key.onUp clears the press flag, so a complete tap between rendered frames can leave only the release flag. Guard routing now reconstructs that tap when no down state was observed. A held guard release stays a release and does not restart an attack.

The regression test routes that exact key state through the real guard and sweep models into a rover contact. Node 22 typecheck, 128 tests, build and docs pass. In the browser, two separate 5ms taps both connect and the fixture records two hits without console errors (tmp/verification/41-retained-short-taps.png, shown in chat).

arudaev and others added 5 commits October 24, 2026 01:07
…ure/58-slice-ending

# Conflicts:
#	docs/04-WORLD-AND-LEVELS.md
Raise the approved chair guard on held Act, activating at the first forward-leg pose. Block frontal normal hits with a 14-pixel kinematic push, deflect rovers without damaging them, and retain normal rear damage.

Heavy hits break guard and apply normal life damage. Preserve quick taps, consume engaged releases and finish current attack poses before raising a queued hold. Typecheck, 125 tests, build and docs pass; browser verifies front block, rear hit and tap/hold behavior.
@Vatsal2005 Vatsal2005 self-assigned this Oct 24, 2026
@vercel

vercel Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
wincs Ready Ready Preview Oct 24, 2026 1:34am UTC

Request Review

@Vatsal2005
Vatsal2005 requested a review from arudaev October 24, 2026 00:20
@vercel

vercel Bot commented Oct 24, 2026

Copy link
Copy Markdown

@Vatsal2005 must be a member of the arudaev's projects team on Vercel to deploy.
- Click here to add @Vatsal2005 to the team.
- If you initiated this build, request access.
- If you're already a member of the arudaev's projects team, make sure that your Vercel account is connected to your GitHub account.

Learn more about collaboration on Vercel and other options here.

arudaev and others added 4 commits October 24, 2026 02:25
@arudaev
arudaev added this pull request to stack #129 October 24, 2026 00:39
arudaev and others added 9 commits October 24, 2026 02:40
art: export Dexter at 27 px after approval
feat: end the slice with Dexter's absorb and the continue window
[3/3] art: draw Rusty Creek's parallax layers from region-wide plates
Phaser clears the press flag when a key is released. Reconstruct a short Act tap from its surviving release flag when no down state was observed, so guard routing retains the existing quick sweep input.

Keep held guard releases from becoming new presses. Regression coverage drives the real guard and sweep models; typecheck, 128 tests, build and docs pass. Two 5ms browser taps both connect.
Interact boxes now emit trigger-entered once per entry. swapRegion reloads the stage through Preload, and the slice starts in the Hidden Garden. The Flow scene runs the crossing at the pond, then Jenny's ram on the clean bridge, which turns the creek into the rust maze.
[17/20] feat: swap regions on the route to the maze
@github-actions github-actions Bot added area:art Sprite sheets, stage plates, direction pack area:stage Chunks, layers, collision, clean/anomaly states area:story Prologue, Dexter, crossings, ending area:pipeline Rerunnable art and export scripts area:ui HUD, crash window, title, menus labels Oct 24, 2026
@arudaev
arudaev merged commit 2cb1f6d into main Oct 24, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:art Sprite sheets, stage plates, direction pack area:combat Chair, guard, health, damage, save points, pickups area:docs Design docs, README, contributor guides area:enemies Autonomous robots and Jenny area:pipeline Rerunnable art and export scripts area:player Hero movement, animation state, camera area:stage Chunks, layers, collision, clean/anomaly states area:story Prologue, Dexter, crossings, ending area:ui HUD, crash window, title, menus

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[M2-S3] Guard with the chair

2 participants