diff --git a/docs/runtime/p9_1/GAMEPLAY_EXPERIENCE_SPEC.md b/docs/runtime/p9_1/GAMEPLAY_EXPERIENCE_SPEC.md new file mode 100644 index 00000000..72972ac6 --- /dev/null +++ b/docs/runtime/p9_1/GAMEPLAY_EXPERIENCE_SPEC.md @@ -0,0 +1,585 @@ +# P9.1 Arbitrary-Party Gameplay Experience Specification + +> Status: expert candidate for P9.1 contract reconciliation +> Authority: game-design output only; UX/visual and runtime architecture remain +> separate expert inputs +> Baseline: P9.0R10 pair adaptation plus the preserved P9.0R5-R7 first-session +> continuation +> Review language: Chinese first +> Scope: one deterministic, non-authoritative five-battle first-session fixture + +## 1. Outcome And Boundary + +Every unordered selection of two different Recruits must complete this same +player arc: + +```text +choose any two -> automatic formation -> battle 1 -> pair diagnosis +-> choose one loan adaptation -> battle 2 -> choose one Guild response +-> battle 3 -> choose and review one route -> battle 4 +-> choose and review one member growth -> battle 5 -> first-session result +``` + +P9.1 proves that the current four-Recruit fixture supports arbitrary starting +pairs. It does not create authoritative combat, economy, XP, inventory, +casualty, recovery, save, difficulty, chapter, Market or promotion systems. +All battles below are deterministic presentation fixtures. A fixture victory +must not be described as proof of balance outside this session. + +The implementation must preserve P9.0R3 action pacing and event-bound feedback, +P9.0R8 entry behavior, P9.0R9A automatic formation, and every accepted standard +pair value explicitly marked as a regression anchor below. + +## 2. Stable Terms And State + +### 2.1 Identity, formation and origins + +Stable profession IDs and automatic priority remain: + +```text +Hearthguard -> Wayrunner -> Farstring -> Kindhand +``` + +The lower priority index is placed nearer the threat. Selection order never +changes formation. P9.1 uses these identity terms instead of inferring behavior +from a visual slot: + +| Term | Exact meaning | +|---|---| +| `starting_pair` | The two selected Recruit IDs, normalized by automatic priority. | +| `lead_id` | The first current member after automatic formation. | +| `initial_second_id` | The second member of the committed two-Recruit formation; this origin identity never changes. | +| `added_id` | The one Recruit added by the Guild response, or empty. | +| `field_order` | Current member IDs sorted by automatic priority after a legal addition. | +| `marked_id` | `initial_second_id`; battles 4 and 5 must target this identity, even if adding a Recruit moved its visible position. | +| `member_origin` | `starting` or `guild_added`; it is independent of current field position. | + +If a Guild addition changes field order, the Guild commit result must name the +move before battle 3. In particular, adding Hearthguard to Farstring + Kindhand +changes the lead from Farstring to Hearthguard. This is a system re-formation, +not a player-selected front/rear decision. + +### 2.2 Profession actions + +No branch may use `else = Kindhand` or derive an action from `front`, `rear`, +`second` or `added`. It must resolve the actual profession ID: + +| Profession | Lv.1 battle response | Fifth-battle Lv.2 change | +|---|---|---| +| Hearthguard | Leads with guard/contact when first in field order. | If lead, removes `20` more damage from the lead pressure after item mitigation. | +| Wayrunner | If lead, evades part of contact; otherwise makes one `-30` flank counter. | If lead, removes `20` more lead damage; if `marked_id`, removes `20` from its own split damage. | +| Farstring | Makes one ranged hit (`-36` in battle 3; `-30` in battles 4-5). | Moves that one battle-5 shot before pressure and changes time `7.40 -> 6.40`; never adds an attack. | +| Kindhand | Makes one recovery action on the member damaged by the current pressure. | Changes its battle-5 recovery from `+12` to `+25`; never adds a heal. | + +Damage and recovery clamp to `[0, 100]` for Recruit HP and to `[0, enemy_max]` +for enemy HP. Each non-zero mutation emits exactly one number/VFX payload on +the actual target. A member acts at most once in each scripted role-action +window. + +### 2.3 Required run state + +The domain snapshot must be able to express these values without reading a +Control tree or render clock: + +```text +starting_pair: [member_id, member_id] +lead_id: member_id +initial_second_id: member_id +field_order: [member_id, member_id] | [member_id, member_id, member_id] +added_id: empty | member_id +adaptation_id: empty | EQ-002 | EQ-061 +guild_response_id: empty | retain_loan | add_recruit +retained_item_id: empty | EQ-002 | EQ-061 +coin: integer +company_size: 2 | 3 +route_id: empty | R6-01 | R6-02 | R6-03 +trained_member_id: empty | one current member_id +member_level(member_id): 1 | 2 +formation_commit_count: 0 | 1 +first_reward_committed: bool +adaptation_committed: bool +guild_committed: bool +route_committed: bool +route_reward_committed: bool +training_committed: bool +fifth_reward_committed: bool +``` + +One run cannot contain duplicate member IDs or duplicate professions in this +bounded fixture. + +## 3. Battles 1 And 2: Preserved Pair Foundation + +### 3.1 All six starting pairs + +Battle 1 resets both members to `100 HP`, the enemy to `100 HP`, and runs for +`7.25 s`. The existing first reward commits `+20 Coin` once after enemy HP is +zero. These are the required results: + +| Pair key | Lead response | Second response | Battle-1 lead HP | Diagnosis fact | +|---|---|---|---:|---| +| `HG-WR` | Hearthguard blocks `-18` (`100 -> 82`) | Wayrunner flank counter | `82` | 防住首击;第二位以侧翼反击补伤害。 | +| `HG-FS` | Hearthguard blocks `-18` (`100 -> 82`) | Farstring ranged hit | `82` | 防住首击;第二位以远射打开终结线。 | +| `HG-KH` | Hearthguard `100 -> 82` | Kindhand `+12` | `94` | 防住首击;第二位恢复先行者。 | +| `WR-FS` | Wayrunner evades to `88` | Farstring ranged hit | `88` | 闪避减伤;第二位以远射补伤害。 | +| `WR-KH` | Wayrunner `100 -> 88` | Kindhand `+12`, capped | `100` | 闪避减伤;第二位把先行者恢复至满值。 | +| `FS-KH` | Farstring exposed lead `100 -> 58` | Kindhand `+12` | `70` | 远程成员先行而高暴露;治疗只补回部分损失。 | + +The diagnosis names both actual Recruits and their actual actions. The accepted +first-battle qualifier `后排命中` remains unchanged where P9.0R3 uses it; later +pages say `第二位` or the Recruit name. + +### 3.2 Unselected adaptation and battle 2 + +The adaptation page always opens with no selection. Both options name the +actual `lead_id` and the same exact counterfactual: + +| ID | Chinese-first option consequence | Battle-2 time | +|---|---|---:| +| `EQ-002` | `钉阵胫甲:先行者只承受 -10;放弃先手。` | `7.05 s` | +| `EQ-061` | `先鸣铃:敌人先失去 28 生命;先行者承受完整 -30。` | `6.00 s` | + +Selection and revision mutate only the pending ID. `BeginSecondBattle` is the +single commit. It records one loan, cannot be repeated, and resets battle HP; +it never spends Coin. Battle 2 gives no additional Coin. + +| Pair group | `EQ-002` final lead HP | `EQ-061` final lead HP | Reason | +|---|---:|---:|---| +| no Kindhand: `HG-WR`, `HG-FS`, `WR-FS` | `90` | `70` | No recovery follows the veteran hit. | +| has Kindhand: `HG-KH`, `WR-KH`, `FS-KH` | `100` | `82` | Kindhand restores `+12` after the hit. | + +Enemy HP reaches zero on every row. Coin remains `20`; the first reward count +remains one. Wayrunner in second position always counters, Farstring always +shoots, and Kindhand always heals. + +### 3.3 Six-pair continuation registry + +This registry makes the complete path entitlement explicit. Every row may take +either adaptation, either mapped Guild branch, every R6 route, every current +member as the one growth target, and must then reach the first-session result. + +| Starting pair | Battle-1 lead HP | Battle-2 `EQ-002 / EQ-061` HP | Retain growth candidates | Add growth candidates | +|---|---:|---:|---|---| +| `HG-WR` | `82` | `90 / 70` | `HG, WR` | after `EQ-002`: `HG, WR, FS`; after `EQ-061`: `HG, WR, KH` | +| `HG-FS` | `82` | `90 / 70` | `HG, FS` | `HG, FS, KH` | +| `HG-KH` | `94` | `100 / 82` | `HG, KH` | `HG, FS, KH` | +| `WR-FS` | `88` | `90 / 70` | `WR, FS` | `WR, FS, KH` | +| `WR-KH` | `100` | `100 / 82` | `WR, KH` | `WR, FS, KH` | +| `FS-KH` | `70` | `100 / 82` | `FS, KH` | `HG, FS, KH`; HG becomes lead | + +For each cell, routes `R6-01`, `R6-02` and `R6-03` are legal. The final result +uses the exact HP/time function in section 6.2 and the exact Coin/Company table +in section 6.4; no row stops at an earlier preview boundary. + +## 4. Guild Response And Battle 3 + +### 4.1 Transaction and unselected state + +The Guild page inherits the actual pair, field order, selected loan, `20 Coin` +and the battle-2 facts. It opens with neither response selected. + +The exact unselected guidance template is: + +```text +尚未选择。花 12 金币保留【{loan_name}】,继续使用{loan_effect}; +或花 14 金币招募【{added_name}】,{addition_effect}。 +选择不会扣款;确认出发后才结算,出发前可更改。 +``` + +The two stable responses are: + +| ID | Atomic commit | Persistent consequence in this session | +|---|---|---| +| `retain_loan` | `coin 20 -> 8`; keep the selected loan; Company remains 2. | `EQ-002` remains a lead-pressure brace; `EQ-061` remains a tempo opener. | +| `add_recruit` | `coin 20 -> 6`; return the loan; add exactly the mapped Recruit; Company becomes 3. | Gains one role action, one later training candidate, and state-dependent route coverage. | + +The addition is deterministic and must not use the old `missing rear` fallback: + +| Starting pair | Prior loan | `added_id` | `field_order` after commit | `addition_effect` | +|---|---|---|---|---| +| `HG-WR` | `EQ-002` | Farstring | `HG, WR, FS` | 增加远射,弥补只有近身回应的阵线;仍没有治疗。 | +| `HG-WR` | `EQ-061` | Kindhand | `HG, WR, KH` | 增加治疗,补回先手装备接受的完整重击;仍没有远射。 | +| `HG-FS` | either | Kindhand | `HG, FS, KH` | 增加受击后恢复,形成远射与治疗两种支援。 | +| `HG-KH` | either | Farstring | `HG, FS, KH` | 增加远射;原 Kindhand 保留 `starting` 身份。 | +| `WR-FS` | either | Kindhand | `WR, FS, KH` | 增加恢复,保护闪避失败后的阵线。 | +| `WR-KH` | either | Farstring | `WR, FS, KH` | 增加远射,换取更稳定的击破节奏。 | +| `FS-KH` | either | Hearthguard | `HG, FS, KH` | Hearthguard 接替先行,修复 Farstring 的高暴露;两名原成员保留身份。 | + +This table is both the offer matrix and the duplicate-prevention allowlist. +Any unmapped pair/item, already-present Recruit, insufficient Coin, stale +selection or repeated commit is rejected with zero partial mutation. + +### 4.2 Battle-3 event contract + +Battle 3 starts all present members at `100 HP` and the captain at `130 HP`. +The deterministic order is: + +1. Retained `EQ-061` changes enemy `130 -> 102`; otherwise telegraph only. +2. Captain pressure changes lead to `90` with retained `EQ-002`, otherwise + `70`. +3. Each non-lead profession acts once in field order: Wayrunner `-30` enemy, + Farstring `-36` enemy, Kindhand `+12` lead. +4. A retained two-member build follows up and clamps enemy to at most `44`; + a three-member build proceeds directly to coordination. +5. Coordination clamps enemy to `26` for two members or `32` for three. +6. The finisher changes enemy to `0`. Battle 3 gives no Coin. + +The accepted durations remain `7.60 s` for retained `EQ-002`, `6.60 s` for +retained `EQ-061`, and `7.00 s` for an added Recruit. + +### 4.3 Complete battle-3 branch table + +Each row represents two legal Guild branches for one pair/adaptation state. +`HP/time/coin/company` are the exact battle-3 result. + +| Pair | Loan | Retain result | Add result | +|---|---|---|---| +| `HG-WR` | `EQ-002` | `90 / 7.60 / 8 / 2` | add FS; `70 / 7.00 / 6 / 3` | +| `HG-WR` | `EQ-061` | `70 / 6.60 / 8 / 2` | add KH; `82 / 7.00 / 6 / 3` | +| `HG-FS` | `EQ-002` | `90 / 7.60 / 8 / 2` | add KH; `82 / 7.00 / 6 / 3` | +| `HG-FS` | `EQ-061` | `70 / 6.60 / 8 / 2` | add KH; `82 / 7.00 / 6 / 3` | +| `HG-KH` | `EQ-002` | `100 / 7.60 / 8 / 2` | add FS; `82 / 7.00 / 6 / 3` | +| `HG-KH` | `EQ-061` | `82 / 6.60 / 8 / 2` | add FS; `82 / 7.00 / 6 / 3` | +| `WR-FS` | `EQ-002` | `90 / 7.60 / 8 / 2` | add KH; `82 / 7.00 / 6 / 3` | +| `WR-FS` | `EQ-061` | `70 / 6.60 / 8 / 2` | add KH; `82 / 7.00 / 6 / 3` | +| `WR-KH` | `EQ-002` | `100 / 7.60 / 8 / 2` | add FS; `82 / 7.00 / 6 / 3` | +| `WR-KH` | `EQ-061` | `82 / 6.60 / 8 / 2` | add FS; `82 / 7.00 / 6 / 3` | +| `FS-KH` | `EQ-002` | `100 / 7.60 / 8 / 2` | add HG and reform; `82 / 7.00 / 6 / 3` | +| `FS-KH` | `EQ-061` | `82 / 6.60 / 8 / 2` | add HG and reform; `82 / 7.00 / 6 / 3` | + +## 5. Route Choice And Battle 4 + +### 5.1 Offers and state-derived coverage + +The route board opens unselected and displays current Company, retained item or +added Recruit, known pressure, exposure, reward, coverage state and a causal +reason. It never displays future exact HP or marks a recommendation. + +Exact unselected guidance: + +```text +尚未选择路线。比较已知压力、当前应对与胜利奖励; +选择只会打开复核,确认出发前仍可返回更换。 +``` + +Each option uses this exact fact order: + +```text +【{route_name}】|{pressure_name}|{exposure_label}|胜利 +{reward} 金币 +{coverage_label}:{coverage_reason_zh} +``` + +| ID | Pressure | Reward | +|---|---|---:| +| `R6-01` 风墙长堤 | 正面粉碎 | `+4 Coin` | +| `R6-02` 钟晶疾道 | 速度爆发 | `+7 Coin` | +| `R6-03` 双辉裂谷 | 标记并分击 `marked_id` | `+10 Coin` | + +Coverage is evaluated from actual state: + +| Route | `covered` | `partial` | `gap` | +|---|---|---|---| +| `R6-01` | retained `EQ-002` directly braces the crush | Company 3 with Kindhand recovers after impact | all other states | +| `R6-02` | retained `EQ-061` acts before the burst | any Company 3 responds with an extra action after the burst | retained two-member state without `EQ-061` | +| `R6-03` | Company 3 contains both Farstring and Kindhand | Company 3 lacks one of those roles | every two-member state | + +The reason must name the actual item/member and limitation. Example: +`部分应对:赛布尔能在爆发后恢复先行者,但不能打断首次伤害。` + +Selection mutates only `route_id`. Review mutates nothing and can return to the +same selection. `commit_route` is the single lock/start boundary and costs no +Coin. Reward commits once only after enemy HP is zero. + +### 5.2 Complete battle-4 result function + +Battle 4 resets all members to `100 HP` and the enemy to `120 HP`. The result +uses one of these mutually exclusive build rows. `KH?` means Kindhand is +present. `FS+KH?` means both are present. + +| Build state | R6-01 lead / marked / time | R6-02 lead / marked / time | R6-03 lead / marked / time | +|---|---|---|---| +| retained `EQ-002`, no KH | `90 / 100 / 7.40` | `70 / 100 / 8.00` | `100 / 65 / 7.80` | +| retained `EQ-002`, KH | `100 / 100 / 7.40` | `82 / 100 / 8.00` | `100 / 77 / 7.80` | +| retained `EQ-061`, no KH | `60 / 100 / 6.40` | `70 / 100 / 6.00` | `100 / 65 / 6.70` | +| retained `EQ-061`, KH | `72 / 100 / 6.40` | `82 / 100 / 6.00` | `100 / 77 / 6.70` | +| Company 3, no KH | `70 / 100 / 7.00` | `70 / 100 / 6.80` | `100 / 65 / 7.00` | +| Company 3, KH but not FS | `82 / 100 / 7.00` | `82 / 100 / 6.80` | `100 / 77 / 7.00` | +| Company 3, FS + KH | `82 / 100 / 7.00` | `82 / 100 / 6.80` | `100 / 88 / 7.00` | + +Battle-4 pressure is exact: + +- R6-01: retained `EQ-002` deals `-10`; a three-member line deals `-30`; + retained `EQ-061` deals `-40`. Kindhand then restores `+12` to lead. +- R6-02: pressure deals `-30`. Kindhand then restores `+12` to lead. Retained + `EQ-061` changes enemy `120 -> 90` before pressure. +- R6-03: pressure deals `-35` to `marked_id`. Kindhand restores `+12`; a + three-member Farstring + Kindhand line instead performs one combined `+23` + recovery, preserving the accepted `65 -> 88` anchor. +- Every non-lead Wayrunner/Farstring performs one actual attack. A closer + clamps enemy to `28`, then the finisher changes it to `0`. + +Coin after the once-only route reward is: + +| Guild branch | R6-01 | R6-02 | R6-03 | +|---|---:|---:|---:| +| retained loan | `12` | `15` | `18` | +| added Recruit | `10` | `13` | `16` | + +Company size and membership never change at the route boundary. + +## 6. Individual Growth And Battle 5 + +### 6.1 Offer contract + +Training opens only from a verified battle-4 result with route reward committed. +It shows every current member, current field position, origin, profession, +current level and exact next-event change. No member is selected initially. +An absent member never renders and is illegal. + +Exact unselected guidance: + +```text +尚未选择历练成员。比较先行承压、标记者生存、射击节奏与恢复; +唯一印记只能让一名当前成员升至 Lv.2,确认前可换人。 +``` + +Selection mutates only the pending member ID. Review names the same member and +one exact counterfactual. `commit_training` consumes the one bounded veteran +mark, changes exactly that member to `Lv.2`, locks once and starts battle 5. +Every other member remains `Lv.1`. + +The Chinese option templates are: + +| State | Exact template | +|---|---| +| Hearthguard lead | `历练【{name}】:正面重压再减少 20;先行者生命 {base_lead} -> {trained_lead}。` | +| Wayrunner lead | `历练【{name}】:闪避再减少 20 正面伤害;先行者生命 {base_lead} -> {trained_lead}。` | +| Wayrunner is `marked_id` | `历练【{name}】:自身分裂伤害减少 20;受击后生命 60 -> 80(治疗另行结算)。` | +| Farstring | `历练【{name}】:唯一射击提前;不增加次数;用时 7.40 -> 6.40 秒。` | +| Kindhand | `历练【{name}】:对受伤标记者的恢复 +12 -> +25。` | + +### 6.2 Battle-5 calculation + +Battle 5 resets each present member to `100 HP` and the enemy to `140 HP`. +The deterministic sequence is: + +1. A trained Farstring performs its only `-30` shot (`140 -> 110`) before + pressure. +2. Lead pressure is `-30` with retained `EQ-002`, otherwise `-45`. + A trained lead Hearthguard/Wayrunner removes another `20`. +3. Split pressure is `-40` to `marked_id`; a trained marked Wayrunner removes + `20` from its own hit. +4. Unspent member actions resolve once. Farstring deals `-30`; Wayrunner deals + `-30`; Kindhand restores `+25` when trained, otherwise `+12`, to `marked_id`. +5. The Company/retained-build closer and finisher change enemy to `0`. +6. Verified victory commits `+8 Coin` exactly once. + +The result functions are therefore: + +```text +base_lead_hp = 70 when retained_item_id == EQ-002, otherwise 55 +lead_hp = base_lead_hp + 20 only when trained member is current lead + and profession is Hearthguard or Wayrunner + +marked_hp_after_split = 80 only when trained member == marked_id + and profession == Wayrunner; + otherwise 60 +marked_hp = clamp(marked_hp_after_split + kindhand_heal, 0, 100) +kindhand_heal = 25 when Kindhand is trained, 12 when Kindhand is present, + otherwise 0 + +time = 6.40 when Farstring is trained, otherwise 7.40 +enemy_hp = 0 +``` + +Route changes inherited Coin and the causal recap, but does not secretly alter +this fixed encounter. + +### 6.3 Complete growth-state matrix + +Cells use `trained member: lead HP / marked HP / time`. This table enumerates +every distinct state reachable from all six pair paths. Route choice adds Coin +per section 6.4 but does not change a cell. + +| Starting/Guild state | Legal training results | +|---|---| +| `HG-WR`, retain `EQ-002` | `HG: 90/60/7.40`; `WR: 70/80/7.40` | +| `HG-WR`, retain `EQ-061` | `HG: 75/60/7.40`; `WR: 55/80/7.40` | +| `HG-WR`, add FS after `EQ-002` | `HG: 75/60/7.40`; `WR: 55/80/7.40`; `FS: 55/60/6.40` | +| `HG-WR`, add KH after `EQ-061` | `HG: 75/72/7.40`; `WR: 55/92/7.40`; `KH: 55/85/7.40` | +| `HG-FS`, retain `EQ-002` | `HG: 90/60/7.40`; `FS: 70/60/6.40` | +| `HG-FS`, retain `EQ-061` | `HG: 75/60/7.40`; `FS: 55/60/6.40` | +| `HG-FS`, add KH | `HG: 75/72/7.40`; `FS: 55/72/6.40`; `KH: 55/85/7.40` | +| `HG-KH`, retain `EQ-002` | `HG: 90/72/7.40`; `KH: 70/85/7.40` | +| `HG-KH`, retain `EQ-061` | `HG: 75/72/7.40`; `KH: 55/85/7.40` | +| `HG-KH`, add FS | `HG: 75/72/7.40`; `KH: 55/85/7.40`; `FS: 55/72/6.40` | +| `WR-FS`, retain `EQ-002` | `WR: 90/60/7.40`; `FS: 70/60/6.40` | +| `WR-FS`, retain `EQ-061` | `WR: 75/60/7.40`; `FS: 55/60/6.40` | +| `WR-FS`, add KH | `WR: 75/72/7.40`; `FS: 55/72/6.40`; `KH: 55/85/7.40` | +| `WR-KH`, retain `EQ-002` | `WR: 90/72/7.40`; `KH: 70/85/7.40` | +| `WR-KH`, retain `EQ-061` | `WR: 75/72/7.40`; `KH: 55/85/7.40` | +| `WR-KH`, add FS | `WR: 75/72/7.40`; `KH: 55/85/7.40`; `FS: 55/72/6.40` | +| `FS-KH`, retain `EQ-002` | `FS: 70/72/6.40`; `KH: 70/85/7.40` | +| `FS-KH`, retain `EQ-061` | `FS: 55/72/6.40`; `KH: 55/85/7.40` | +| `FS-KH`, add HG and reform | `HG: 75/72/7.40`; `FS: 55/72/6.40`; `KH: 55/85/7.40` | + +For `add` rows shared by both prior loans, the returned loan has no battle-5 +effect, but the result history must still retain which adaptation was returned. + +### 6.4 Final resources + +| Guild branch | R6-01 final Coin | R6-02 final Coin | R6-03 final Coin | Company | +|---|---:|---:|---:|---:| +| retained loan | `20` | `23` | `26` | `2` | +| added Recruit | `18` | `21` | `24` | `3` | + +The final Company has exactly one Lv.2 member, enemy HP `0`, and no persistent +item/inventory claim beyond the current in-memory session. + +## 7. Result Causality And Next Action + +Every result presents action, cause, changed state and next action in that +order. Values are substituted from the committed snapshot; UI code must not +recompute pair logic. + +### 7.1 Chinese-first result templates + +**Battle 1 / pair diagnosis** + +```text +发生了什么:系统让【{lead_name}】先行;{lead_action_zh}。 +为什么:【{second_name}】随后{second_action_zh}。 +状态变化:先行者 {lead_hp}/100;获得 20 金币(仅一次)。 +下一步:比较钉阵胫甲与先鸣铃,选择本队下一战的安全或节奏。 +``` + +**Battle 2 / adaptation result** + +```text +发生了什么:【{loan_name}】让{loan_action_zh}。 +为什么:【{lead_name}】{lead_consequence_zh};【{second_name}】{second_action_zh}。 +状态变化:先行者 {lead_hp}/100;用时 {time} 秒;金币仍为 20。 +下一步:返回公会,在保留这件装备与招募【{mapped_recruit_name}】之间选择。 +``` + +**Battle 3 / Guild result** + +```text +发生了什么:你选择了【{guild_response_name}】;{guild_action_zh}。 +为什么:{battle3_cause_zh}。 +状态变化:先行者 {lead_hp}/100;金币 {coin};小队 {company_size} 人;用时 {time} 秒。 +下一步:打开路线板,比较三条路线对当前【{build_summary_zh}】的覆盖与奖励。 +``` + +**Battle 4 / route result** + +```text +发生了什么:小队通过【{route_name}】,获得 {route_reward} 金币。 +为什么:路线压力是【{pressure_name}】;当前构筑为【{coverage_label}】,因为{coverage_reason_zh}。 +状态变化:先行者 {lead_hp}/100;【{marked_name}】{marked_hp}/100;金币 {coin};用时 {time} 秒。 +下一步:用唯一历练印记选择一名当前成员升至 Lv.2;确认前可返回换人。 +``` + +**Battle 5 / first-session result** + +```text +发生了什么:【{trained_name}】升至 Lv.2;{training_effect_zh}。 +为什么:{battle5_cause_zh};此前【{guild_response_name}】与【{route_name}】分别决定了小队结构和金币。 +状态变化:先行者 {lead_hp}/100;【{marked_name}】{marked_hp}/100;金币 {coin};小队 {company_size} 人;用时 {time} 秒。 +决定链:{pair_names} -> {loan_name} -> {guild_response_name} -> {route_name} -> 历练 {trained_name}。 +下一步:本次首局已结束。可重新开始尝试另一组搭配,或返回主菜单;后续章节尚未开放。 +``` + +English follows the same fact order and substitutes the same IDs/numbers. It +must not shorten away the cause, choice or next action. At 130% text, the copy +may wrap but no fact may be removed. + +### 7.2 Unsupported-state truthfulness + +If a committed snapshot violates any allowlist or exactly-once precondition, +the game must not fabricate a battle or result. It remains on the last valid +decision state and exposes a bounded recovery message: + +```text +当前选择与小队状态不一致,未进行结算。请返回并重新选择。 +``` + +No route may enter an old `front + rear` fallback, label Wayrunner/FS as +Kindhand, recruit a duplicate, train an absent member, pay twice, grant a +reward before enemy defeat, or navigate to an unimplemented next chapter. + +## 8. Transaction And Exactly-Once Boundaries + +| Boundary | Preconditions | Atomic mutations | Duplicate/out-of-state behavior | +|---|---|---|---| +| formation commit | exactly two distinct allowlisted members; valid automatic order | set pair/origins/order; count `0 -> 1`; start battle 1 | inert | +| first reward | battle-1 enemy `0`; not committed | `coin += 20`; flag true | inert | +| adaptation commit | adaptation page; one legal loan; not committed | lock loan; flag true; start battle 2 | inert | +| Guild commit | Guild page; mapped response; enough Coin; not committed | revalidate; spend once; retain or add/reform; update Company; flag true; start battle 3 | reject with zero partial mutation | +| route commit | review page; legal route; not committed | lock state snapshot; flag true; start battle 4 | inert | +| route reward | route committed; enemy `0`; reward not committed | add `4/7/10`; flag true | inert | +| training commit | review page; member currently present; mark available; not committed | consume mark; set that member Lv.2; flag true; start battle 5 | reject with zero partial mutation | +| fifth reward | training committed; enemy `0`; not committed | `coin += 8`; flag true | inert | + +Selection/revision/review/back never spends, rewards, recruits, levels or starts +a battle. Home and confirmed Restart clear the complete transient snapshot, +all selections, origins, members, levels, items, Coin and commit flags. Cancel +Restart changes none of them. + +## 9. Decision-Density And Non-Dominance Audit + +No option dominates across every pair/state and all visible outcomes: + +| Decision | Option with a rational best case | Counter-option with a rational best case | Proof of tradeoff | +|---|---|---|---| +| Adaptation | `EQ-002` maximizes battle-2 lead HP and later covers R6-01 if retained. | `EQ-061` is `1.05 s` faster in battle 2 and later covers/accelerates R6-02 if retained. | Safety and tempo move in opposite directions. | +| Guild | Retain leaves `2` more final Coin and preserves brace or tempo. | Add supplies a third action/training candidate and can cover R6-03 with FS+KH. | Equipment/wealth versus roster breadth; neither contains the other. | +| R6-01 | Best lead survival for retained `EQ-002`. | R6-02 is fastest with `EQ-061`; R6-03 pays `3-6` more Coin. | Survival, time and reward have different maxima. | +| R6-02 | Best time for retained `EQ-061`. | R6-01 protects brace builds; R6-03 rewards full FS+KH coverage. | Its value changes with retained item and Company. | +| R6-03 | Highest reward and covered by a three-member FS+KH line. | Two-member/no-heal states preserve only `65` marked HP, making safer routes legible alternatives. | Reward rises with targeted-member exposure. | +| Growth | Lead HG/WR maximizes lead HP. | Marked WR maximizes its own split survival; FS minimizes time; KH maximizes recovery. | One mark cannot improve all three metrics. | + +State changes visibly alter value rather than only wording: + +- `HG-WR + EQ-002` offers Farstring at the Guild; `HG-WR + EQ-061` offers + Kindhand, so the prior adaptation changes the roster opportunity. +- Adding Hearthguard to `FS-KH` changes the lead and removes the unsupported + fragile-lead continuation. +- R6-03 changes from `gap/65 marked HP` in a two-person build to + `covered/88` only for a three-person FS+KH support line. +- Training a second-position Wayrunner changes its own marked HP `60 -> 80` + instead of incorrectly improving another member because of an old slot + assumption. + +## 10. Deterministic Coverage Required For Implementation + +The implementation contract and tests must expand the compact functions above +into these complete products: + +```text +formation: 6 unordered pairs x 2 click orders +battle 2: 6 pairs x 2 adaptations = 12 +battle 3: 12 pair/adaptation states x 2 Guild responses = 24 +battle 4: all 24 prior branches x 3 routes = 72 +battle 5: each of those 72 branches x every present member (2 or 3) +``` + +For every row, assert identities/origins, field order, actual role events, +lead/marked/enemy HP, time, Coin, Company, retained/returned item, route +coverage/reward, exactly one Lv.2 member, all commit flags, Chinese causal facts +and the two legal final actions. Counterfactual tests must include: + +- Wayrunner as second member (`HG-WR`) and as lead (`WR-FS`, `WR-KH`); +- exposed Farstring lead before and after `FS-KH` adds Hearthguard; +- `HG-WR` adding different Recruits from the two prior loans; +- original Kindhand moving behind an added Farstring while remaining + `marked_id`; +- Company 3 without Kindhand (`HG-WR-FS`), without Farstring (`HG-WR-KH`), + and with both (`HG-FS-KH`, `WR-FS-KH`); +- every invalid ID, duplicate/stale commit, insufficient-Coin commit, absent + training member and premature reward. + +This matrix is the game-design authority for P9.1 reconciliation. UX may choose +layout and architecture may choose representation, but neither may change the +IDs, state dependency, mutations, exact numeric results, decision meaning or +result causality without returning to the game-design boundary.