feat: build p9.1 opening market runtime

Implement the bounded Godot opening Company and first-Market preparation flow with deterministic one-shot state, real touch verification, responsive layouts, prototype feedback, and current design regressions.\n\nCo-Authored-By: Codex <noreply@anthropic.com>
This commit is contained in:
2026-08-12 16:47:44 +08:00
parent 8583abb65e
commit e7eb408e0e
35 changed files with 2259 additions and 17 deletions
@@ -0,0 +1,64 @@
# Phase 9 Godot Vertical Slice Contract
## Runtime Envelope
- Engine: Godot `4.6.1.stable`.
- Project root: `runtime/`.
- Orientation: landscape, reference viewport `1280x720`, stretch `canvas_items`.
- Input: touch-first; mouse is a desktop convenience and not mobile evidence.
- Languages: Simplified Chinese default and English.
- Rendering: `gl_compatibility`, mobile-safe 2D only for P9.1.
- Offline: no account, analytics, network or purchase dependency.
## P9.1 State Machine
```text
contract -> offers -> opening_review -> opening_receipt
-> market_hire_mael -> market_hire_ilya -> equipment_purchase
-> equipment_equip -> order -> readiness_receipt
```
Legal reverse paths before commits are offers-to-contract, opening-review-to-
offers, and order revision. Opening, each hire, purchase, equip and readiness
commit are one-shot. Repeated input returns the current state and cannot
duplicate Recruit, Coin, equipment or receipt mutations.
## Fixed Runtime Data
- Contract: `CTR-R1-01 First Crossing`.
- Opening Coin: `52`; Company capacity: `4`.
- Stable offers: `OFF-01` Elian/Hearthguard, `OFF-02` Nia/Farstring, `OFF-03`
Tomas/Wayrunner, `OFF-04` Sable/Kindhand.
- Market offers: `MKT-R1-01` Mael/Hearthguard and `MKT-R1-02` Ilya/Farstring,
each `14 Coin`.
- Equipment: `EQ-012 Open-Line Cord`, `12 Coin`, explicitly equipped to one
current Company member; fixed evidence equips `OFF-03` Tomas.
- Final readiness: Coin `12`, Company `4/4`; exposed-front direction remains
on the right and protected rear on the left in both locales.
## Presentation Contract
The opening frame reads in three seconds as a traveling fantasy Company about
to cross a dangerous suspended route. Priority is (1) current decision and
primary action, (2) Company/Recruits, (3) Coin/capacity/receipt state. Existing
accepted candidate scene, actor and equipment assets are reused; they remain
candidate production assets, not final art.
Selection must change card border, check mark and count. A transaction must
show the old and new resource values, a short visual pulse and a captioned
prototype sound cue. Disabled actions are visibly disabled and state why.
Reduced motion removes movement but preserves state change. Mute changes no
result. No tutorial wall, decorative nested cards or battle content is legal.
## Test Contract
- `ABG_P9_1_DOMAIN_OK`: state transitions, invalid boundaries, stable IDs,
one-shot transactions and exact final values.
- `ABG_P9_1_TOUCH_OK`: fresh runtime driven by parsed ScreenTouch events reaches
the readiness receipt with fallback/direct count zero.
- `ABG_P9_1_LAYOUT_OK`: all declared viewport/language/accessibility fixtures
remain within safe bounds.
- `ABG_P9_1_RUNTIME_CAPTURE_OK`: normal-render screenshots cover six required
states and strict runtime diagnostics are clean.
Tests and tools may not implement product behavior or relax product guards.