Files
Crystal/docs/SESSION_HANDOFF.md
T
Sébastien QUEROLandClaude Opus 5.5 11d1153802
Checks / web (push) Canceled after 0s
Integrate battles with the overworld UI and validate browser flows
- Drive wild battles through the real UI in Chromium and WebKit using a
  test-only encounter fixture: victory with level-up, escape, whiteout,
  mid-battle backup restore and unsupported-effect rollback.
- Add keyboard and on-screen D-pad navigation for battle menus.
- Accept pending stat experience in saves (awarded without CalcMonStats).
- Commit whiteout healing, money loss and destination callbacks together;
  aborted scripts restore state and map.
- Give long notices their own status-bar row on narrow screens.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 16:37:07 +02:00

7.0 KiB

Recovered Claude session

Recovered on 2026-09-23 from the local Claude Code transcript ~/.claude/projects/-Users-kawa-Crystal/4ac88f30-29e6-4fd5-a4b2-b6a318dd83b3.jsonl. The session stopped at its usage limit at 09:54 UTC, during research, without a final handoff.

Resumed increment: completed 2026-09-23

The movement increment below is complete. The remaining sections preserve the original recovery context.

  • Added directional two-tile ledge jumps with the existing arc/shadow animation. Unsupported terrain, invalid destinations and occupied landings remain refused.
  • Corrected directional mats to wait for exit input. Warp arrivals keep their actual coordinates and appropriate facing; doors, stairs and caves animate a downward exit. Removing the old inward teleport also corrected Elm's scripted introduction position.
  • Mid-walk, mid-jump and mid-connection saves retain the source position. Landing scenes rewind to the actual source of a jump, rather than the intervening wall.
  • Restored compatibility with early version-3 saves lacking the money field.
  • Replaced the scratch diagnostic with synthetic movement regressions and optional-ROM tests covering five Route 29 ledge types. Route 29 is enabled only inside that test fixture, not in production.
  • Fixed the battle test suite's eager ROM read so missing-ROM runs really skip private tests. Updated browser stair inputs and added an exit-mat save/reload flow. Updated the roadmap and architecture to distinguish the existing battle code from its unfinished integration.

Final checks: 75 unit tests passed with the local ROM; without it, 55 passed and 20 private tests skipped. All 24 Chromium/WebKit browser tests passed. Native and reference builds, release isolation, pinned-reference checks, vendor checks and git diff --check passed. No commit or push was made.

Next: validate the overworld-to-battle browser flow and complete Route 29's remaining script, capture/tutorial and item interactions before enabling the route. Player turn timing also remains a documented comparison gap.

Scope and current state

The original request was to read ARCHITECTURE.md, PLAN.md and PRESENTATION_PLAN.md and continue the native port. The working tree contains substantial uncommitted work from multiple increments; preserve it when continuing.

  • Opening scenes, scripted movement, starter selection, naming, the aide's Potion and version 3 saves are implemented and documented.
  • Native battle modules, ROM tables, damage/type parity tests, encounter handling, battle UI and whiteout handling have been added. These later changes are not fully reflected in the architecture and roadmap documents.
  • Only the original six maps are enabled in NATIVE_MAPS. Route 29 (24:3) remains disabled. Passing battle unit tests does not establish a playable Route 29 encounter or the full opening quest.

Exact stopping point

Claude was preparing to revise player movement in src/game/world/world.ts. Its last investigation concerned spawn facing after warps. It had not implemented the planned ledge/warp revision.

The pinned local PRET checkout contains the relevant routines:

  • engine/overworld/player_movement.asm: .TryStep, .TryJump, .CheckLandPerms, .CheckWarp and the direction tables.
  • engine/overworld/tile_events.asm: CheckWarpCollision and CheckDirectionalWarp.
  • engine/overworld/player_object.asm: SpawnPlayer.
  • engine/overworld/map_objects.asm: movement/turn timing.

Research found that ledge tops have land permission; the jump check uses the current tile and facing after an ordinary step fails. Doors use collision $71, downward warp mats $70, and stairs $7a. Directional warp mats require their designated input rather than an immediate warp simply upon entry. Verify these rules against the local routines before changing the existing movement flow.

tests/zz-scratch.test.ts is Claude's unfinished diagnostic: it logs local-ROM warp and ledge collisions, contains no assertions and unconditionally requires the private ROM. Replace it with meaningful optional-ROM or synthetic tests before treating the suite as ready for public CI.

Validation after recovery

Run against the current working tree with the local ROM and reference checkout:

  • npm test: 45 passed, including the assertion-free scratch diagnostic.
  • npm run build: passed.
  • npm run test:e2e: 22 passed across Chromium and WebKit, including native damage/type comparisons against original routines in the reference emulator.
  • npm run check:reference: ROM, pinned rebuild and profile addresses match.
  • npm run check:release: native output excludes emulator and game assets.
  • npm run check:vendor: passed.

These checks do not establish complete battle behavior, browser battle UI flows, Route 29 progression or physical-device compatibility. No gameplay source was changed during session recovery.

Original next-increment notes (movement now completed)

Finish ledge and directional-warp movement with focused regression tests, including interrupted movement/save behavior and preservation of the existing opening scenes. Audit Route 29 callbacks, scripts and unsupported destinations before enabling it. Then test wild encounters and battle controls through the browser, including win, escape, loss and save/reload, and reconcile the roadmap with the verified behavior.

Battle integration increment: 2026-09-23 (resumed from Codex)

Codex committed and pushed c08d250, then stopped mid-increment with the keyboard/D-pad battle test failing. Claude Code completed it:

  • Browser battle flows run through the real UI via tests/battle-fixture.ts (encounter selection only; production maps stay gated): win with level-up and Smokescreen, escape, whiteout, keyboard/D-pad menus, mid-battle backup restore and unsupported-effect rollback. tests/battle-world.test.ts covers the same at world level, plus pending stat experience and whiteout callback rollback.
  • Saves accept stored stats between the no-stat-exp and full-stat-exp values, since GiveExperiencePoints awards stat experience without CalcMonStats.
  • A script warp (e.g. whiteout) validates its destination and commits healing, money loss and destination callbacks together; aborts restore state and map.
  • Keyboard and on-screen D-pad navigate battle menus (battle-selected); A continues messages, B leaves the move list.
  • Fixed a phone-width layout bug: a long notice sat in the Play button's auto grid column and crushed the status text, pushing the game panel off-screen. Below 720px the notice now has its own row.
  • Test fixes: the navigation test now presses A through the intro message, and uses a real pointer click on the D-pad (synthetic pointer events cannot be captured).

Final checks: 82 unit tests with the local ROM (55 passed, 27 skipped without it); 36 Chromium/WebKit browser tests; native and reference builds; release, vendor and reference checks; git diff --check. Not committed.

Next: Route 29 (24:3) scripts, catching tutorial and items before enabling it; then capture, switching and PACK in battle.