Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
43d2d740b2 |
@@ -0,0 +1,668 @@
|
||||
# P9.1 UX And Visual Flow Specification
|
||||
|
||||
<!-- markdownlint-disable MD013 MD060 -->
|
||||
|
||||
> Status: expert candidate for PMO reconciliation
|
||||
> Revision: `p91-ux-visual-r1`
|
||||
> Product baseline: `dec9574405043624acee0f4f81963d829e8d40e9`
|
||||
> Frozen batch: `.agent-taskgraph/spec.md` revision `p9.1-spec-r1`
|
||||
> Owned output: `docs/runtime/p9_1/UX_VISUAL_FLOW_SPEC.md`
|
||||
|
||||
## 1. Purpose And Authority
|
||||
|
||||
This specification defines the implementation-facing landscape presentation for
|
||||
the complete P9.1 first session:
|
||||
|
||||
```text
|
||||
choose any two -> automatic formation -> battle 1 -> diagnosis -> adaptation
|
||||
-> battle 2 -> Guild response -> battle 3 -> route -> battle 4
|
||||
-> individual growth -> battle 5 -> first-session result
|
||||
```
|
||||
|
||||
It preserves the accepted P9.0R8 front door, P9.0R3 combat motion/feedback
|
||||
direction, P9.0R10 arbitrary-pair formation language, and the world-based
|
||||
decision scenes established in P9.0R5-R7. This document owns screen hierarchy,
|
||||
localized sentence structure, controls, focus, motion projection,
|
||||
accessibility variants, and render evidence. It does not own formulas, option
|
||||
legality, combat outcomes, rewards, or persistent rules.
|
||||
|
||||
Where a value is written as `{binding}`, the gameplay/domain contract must
|
||||
supply it. UI must render the supplied value and must never infer or substitute
|
||||
an old standard-pair branch. Missing required bindings enter `P91-BINDING-ERROR`
|
||||
and block the dependent commit.
|
||||
|
||||
### 1.1 Presentation invariants
|
||||
|
||||
1. The player chooses people, never front/rear slots. The system orders the
|
||||
selected people and explains each responsibility before commitment.
|
||||
2. No meaningful choice is preselected. Selection is reversible; only the
|
||||
named commit action spends, locks, trains, rewards, or starts a battle.
|
||||
3. Every decision shows current evidence, immediate gain, opportunity cost,
|
||||
and the next battle consequence in the first viewport.
|
||||
4. Every battle event names source, action, target, and outcome. Color, audio,
|
||||
particles, and actor motion are never the only carriers.
|
||||
5. Every result leads with cause, then exact changed state, then the next
|
||||
action. Totals and rewards do not precede the causal read.
|
||||
6. The same party identity and order remain visible from review through all
|
||||
five battles; a Guild response may add a third member but cannot silently
|
||||
reorder the committed starting pair.
|
||||
7. Generated recruits remain mechanical participants, not fixed protagonists.
|
||||
No relationship, affinity, romance, personal-arc, or character-voice framing
|
||||
is introduced.
|
||||
|
||||
## 2. Required Domain Presentation Bindings
|
||||
|
||||
The reconciled implementation contract must expose one immutable snapshot per
|
||||
screen and ordered events per battle. Names below describe required UX data,
|
||||
not a runtime API decision.
|
||||
|
||||
| Binding | Required fields | Presentation use |
|
||||
|---|---|---|
|
||||
| `P91_SESSION_SNAPSHOT` | session ID, locale, Coin, Company size, selected decisions | top status and result facts |
|
||||
| `P91_PARTY_SNAPSHOT` | stable member ID, localized name, profession, order index, responsibility, current/max HP, level, source of order | persistent horizontal party line |
|
||||
| `P91_CHOICE_SET` | stable option ID, title, reason, gain, cost, foregone state, legal/disabled reason, selected/committed state | adaptation, Guild, route, growth |
|
||||
| `P91_BATTLE_FORECAST` | battle index/name, enemy presentation ID, known pressure, target relation, objective | battle heading and warning geometry |
|
||||
| `P91_BATTLE_EVENT` | stable event ID, order/time, kind, source ID, target IDs, before/after/delta, causal source, caption | actor motion, feedback number, event ribbon/log |
|
||||
| `P91_RESULT` | outcome, earliest meaningful divergence, cause, decision source, changed state, reward receipt, next action | all causal result surfaces |
|
||||
| `P91_SETTINGS` | locale, text scale, reduced motion, reduced flashes, mute/captions, high contrast, low power | deterministic visual variants |
|
||||
|
||||
`P91_CHOICE_SET` and `P91_RESULT` must carry already-resolved domain truth. UI
|
||||
may select sentence templates by semantic state (`covered`, `partial`, `gap`,
|
||||
`gain`, `cost`, `changed`, `unchanged`) but may not recompute those states.
|
||||
|
||||
## 3. Screen And State Map
|
||||
|
||||
Screen IDs are stable presentation IDs. Existing Godot node names may be kept
|
||||
as aliases during extraction; new tests and evidence should use the P9.1 IDs.
|
||||
|
||||
### 3.1 Complete path
|
||||
|
||||
| Screen/state ID | New/reused | Purpose and required first read | Primary action | Back/return behavior |
|
||||
|---|---|---|---|---|
|
||||
| `P91-BOOT-LOADING` | reused P9.0R8 | Named asset preparation and bounded progress; no active controls beneath | none until ready | none; failure enters `P91-BOOT-ERROR` |
|
||||
| `P91-BOOT-ERROR` | reused P9.0R8 | Plain affected feature and retained zero-session state | `重新检查` | none; retry retains the same boot operation identity |
|
||||
| `P91-TITLE-READY` | reused P9.0R8 | Product identity, broken-road premise, current five-battle experience | `进入游戏` | none; Settings remains a tool |
|
||||
| `P91-MENU-READY` | reused | Current experience status and fresh-run entry | `开始新游戏` | Title only through global Home policy |
|
||||
| `P91-INTRO` | reused, copy corrected | Four beats: choose any two, inspect system order, read automatic combat, make state-based responses | none; informational | `返回主菜单`; no session mutation |
|
||||
| `P91-SETTINGS` | reused | Language, text size, motion, flashes, sound/captions, contrast, and power with live value | none; each control applies its named setting | returns to exact Title/Menu/paused-Battle caller and prior focus |
|
||||
| `P91-COMMISSION` | reused wording corrected | Threat targets the system lead; player will choose any two | `选择两名成员` | Main menu; no session mutation |
|
||||
| `P91-RECRUIT-0` | reused P9.0R9A/R10 | Four equal candidates; `已选 0 / 2`; nothing selected | none, review disabled | Commission; selection cleared |
|
||||
| `P91-RECRUIT-1` | reused | One selected, three still equal; `已选 1 / 2` | none, review disabled | Commission; selection cleared |
|
||||
| `P91-RECRUIT-2` | reused | Two selected; stable source order; system-order preview appears | `查看系统编队` | Commission; selection cleared |
|
||||
| `P91-FORMATION-REVIEW` | reused P9.0R9A/R10 | Exposed lead/right and second member/left, each with exact responsibility | `确认编队并出发` | `重新选择成员` returns with same two checked |
|
||||
| `P91-BATTLE-1` | reused P9.0R3/R10 | Opening pressure, system order, both member responses | automatic | no Back; Pause contains Home/Restart review |
|
||||
| `P91-RESULT-1` | reused, generalized | What each member did and why this order mattered | `查看下一场威胁` | no return to battle |
|
||||
| `P91-ADAPT-0` | reused P9.0R10 | Two legal responses to the diagnosed pressure; no selection | none, commit disabled | Result 1, preserving snapshot |
|
||||
| `P91-ADAPT-1` | reused | Selected response, gain, cost, forecast delta | `带着所选方案出发` | Result 1; selection remains reversible until commit |
|
||||
| `P91-BATTLE-2` | reused, generalized | Adaptation event plus actual lead and second-member behavior | automatic | Pause review only |
|
||||
| `P91-RESULT-2` | reused, generalized | Adaptation-caused difference and actual party actions | `返回公会回应这支小队` | no return to battle |
|
||||
| `P91-GUILD-0` | reused P9.0R5, generalized | Current actors/Coin in yard; two state-dependent responses; no selection | none, commit disabled | Result 2 |
|
||||
| `P91-GUILD-1` | reused, generalized | Selected Guild response, final Coin/Company/state, foregone alternative | `确认回应并开始第三战` | Result 2; selection can still switch |
|
||||
| `P91-BATTLE-3` | reused, generalized | Retained capability or added member visibly changes the line | automatic | Pause review only |
|
||||
| `P91-RESULT-3` | reused, generalized | Guild decision -> battle consequence -> current Company | `比较三条路线` | no return to battle |
|
||||
| `P91-ROUTE-0` | reused P9.0R6 | Three adjacent world routes; pressure, exposure, reward, current coverage | none, review disabled | Result 3 |
|
||||
| `P91-ROUTE-1` | reused | Selected route and exact current coverage reason | `查看路线确认` | Result 3; another route may replace selection |
|
||||
| `P91-ROUTE-REVIEW` | reused | Frozen party/build, route pressure, coverage, reward, zero entry cost | `锁定路线并进入第四战` | `返回比较` restores selected route and focus |
|
||||
| `P91-BATTLE-4` | reused, generalized | Chosen route pressure targets the actual actor(s); current response is visible | automatic | Pause review only |
|
||||
| `P91-RESULT-4` | reused, generalized | Route pressure + inherited response + reward receipt | `安排一次个人历练` | no return to battle |
|
||||
| `P91-GROWTH-0` | reused P9.0R7, generalized | Every actual member, current level, distinct next-battle effect; no selection | none, review disabled | Result 4 |
|
||||
| `P91-GROWTH-1` | reused, generalized | Selected member, gain, unchanged members, foregone effects | `查看历练确认` | Result 4; another member may replace selection |
|
||||
| `P91-GROWTH-REVIEW` | reused | Exact member/effect and one-mark opportunity cost | `确认历练并进入第五战` | `返回改选` restores selection and focus |
|
||||
| `P91-BATTLE-5` | reused, generalized | Trained effect and the untrained party responsibilities under dual pressure | automatic | Pause review only |
|
||||
| `P91-FIRST-SESSION-RESULT` | expanded final | Happened, why, decisive decision, committed first-session change, next step | `结束本次体验` | no return; `重新开始` is a separate confirmation |
|
||||
|
||||
### 3.2 Shared key states
|
||||
|
||||
| State ID | Exact player-facing behavior |
|
||||
|---|---|
|
||||
| `P91-CHOICE-SELECTED` | Selected contour and `已选择` label; no resource/value mutation; selecting another legal option replaces it |
|
||||
| `P91-COMMIT-PENDING` | Geometry stays fixed; action label becomes `正在确认…`; duplicate input is ignored; no success cue before receipt |
|
||||
| `P91-COMMIT-REJECTED` | Inline cause, unchanged state, and `重新检查` or legal alternate; focus returns to the rejected commit |
|
||||
| `P91-COMMIT-COMPLETE` | Named changed state plus receipt mark; selection controls become inspect-only; commit cannot repeat |
|
||||
| `P91-BINDING-ERROR` | `这项决定暂时无法显示:缺少可验证的队伍结果。你的当前进度没有改变。` Actions: `重新检查`, `安全返回` |
|
||||
| `P91-PAUSE` | Frozen battle snapshot, current event, captions, Resume; Home/Restart are separated reviews, never adjacent instant exits |
|
||||
| `P91-HOME-REVIEW` | Names transient first-session progress that will be cleared; initial focus is `取消`; confirm returns to accepted front door |
|
||||
| `P91-RESTART-REVIEW` | Names current session and exact reset scope; initial focus is `取消`; confirm returns to Commission with no preselection |
|
||||
|
||||
After any committed battle begins, no reverse navigation may reopen its prior
|
||||
decision. Result pages expose the next decision and global exit tools only.
|
||||
|
||||
## 4. Chinese-First Copy Contract
|
||||
|
||||
### 4.1 Stable mechanical nouns
|
||||
|
||||
| Stable meaning | `zh_CN` | `en` |
|
||||
|---|---|---|
|
||||
| Company | 小队 | Company |
|
||||
| system lead / order 0 | 先行者 / 先行位 | lead / lead position |
|
||||
| order 1 | 第二位成员 / 第二位 | second member / second position |
|
||||
| automatic formation | 系统编队 | automatic formation |
|
||||
| adaptation | 应对方案 | response |
|
||||
| Guild response | 公会响应 | Guild response |
|
||||
| route coverage | 路线应对 | route coverage |
|
||||
| individual growth | 个人历练 | individual training |
|
||||
| committed receipt | 已确认结果 | confirmed result |
|
||||
|
||||
Do not call the system lead `前排` unless the domain-provided profession action
|
||||
itself is explicitly a front-facing response. Do not call the other selected
|
||||
member `后排` unless the event/ability actually has a rear relation. This is
|
||||
required for Farstring-led and Wayrunner-second formations.
|
||||
|
||||
### 4.2 Screen titles and actions
|
||||
|
||||
| ID | Exact `zh_CN` | Exact `en` |
|
||||
|---|---|---|
|
||||
| `LOC_P91_COMMISSION_TITLE` | 第一份委托 · 守住断裂的风路 | First Commission · Hold the Broken Wind Road |
|
||||
| `LOC_P91_RECRUIT_TITLE` | 组建小队 · 任意选择两人 | Build the Company · Choose Any Two |
|
||||
| `LOC_P91_FORMATION_TITLE` | 系统编队 · 检查两人的职责 | Automatic Formation · Review Both Roles |
|
||||
| `LOC_P91_RESULT1_TITLE` | 第一战诊断 · 这支小队如何配合 | Battle 1 Diagnosis · How This Company Worked |
|
||||
| `LOC_P91_ADAPT_TITLE` | 第二战准备 · 回应刚才的压力 | Prepare Battle 2 · Answer the Pressure |
|
||||
| `LOC_P91_RESULT2_TITLE` | 第二战结果 · 应对方案造成的差异 | Battle 2 Result · Difference Made by the Response |
|
||||
| `LOC_P91_GUILD_TITLE` | 公会如何回应这支小队? | How Will the Guild Respond? |
|
||||
| `LOC_P91_RESULT3_TITLE` | 第三战结果 · 公会响应得到验证 | Battle 3 Result · Guild Response Proven |
|
||||
| `LOC_P91_ROUTE_TITLE` | 下一条路线 · 比较压力与应对 | Next Route · Compare Pressure and Coverage |
|
||||
| `LOC_P91_ROUTE_REVIEW_TITLE` | 路线确认 · {route_name} | Route Review · {route_name} |
|
||||
| `LOC_P91_RESULT4_TITLE` | 第四战结果 · 路线选择造成的差异 | Battle 4 Result · Difference Made by the Route |
|
||||
| `LOC_P91_GROWTH_TITLE` | 个人历练 · 只能培养一人 | Individual Training · Choose One Member |
|
||||
| `LOC_P91_GROWTH_REVIEW_TITLE` | 历练确认 · {member_name} | Training Review · {member_name} |
|
||||
| `LOC_P91_FINAL_TITLE` | 首次远征完成 | First Expedition Complete |
|
||||
| `LOC_P91_REVIEW_FORMATION` | 查看系统编队 | Review Automatic Formation |
|
||||
| `LOC_P91_COMMIT_FORMATION` | 确认编队并出发 | Commit Formation and Depart |
|
||||
| `LOC_P91_COMMIT_ADAPT` | 带着所选方案出发 | Depart with This Response |
|
||||
| `LOC_P91_COMMIT_GUILD` | 确认回应并开始第三战 | Confirm Response and Start Battle 3 |
|
||||
| `LOC_P91_REVIEW_ROUTE` | 查看路线确认 | Review Route |
|
||||
| `LOC_P91_COMMIT_ROUTE` | 锁定路线并进入第四战 | Commit Route and Enter Battle 4 |
|
||||
| `LOC_P91_REVIEW_GROWTH` | 查看历练确认 | Review Training |
|
||||
| `LOC_P91_COMMIT_GROWTH` | 确认历练并进入第五战 | Confirm Training and Enter Battle 5 |
|
||||
| `LOC_P91_FINISH` | 结束本次体验 | Finish This Experience |
|
||||
|
||||
### 4.3 Formation and choice copy
|
||||
|
||||
These are exact sentence templates. Substitutions must be localized, escaped,
|
||||
and complete; braces are never player-facing.
|
||||
|
||||
| State | Exact `zh_CN` | Exact `en` |
|
||||
|---|---|---|
|
||||
| selection empty | 没有预选。选择任意两人,系统会安排先行者与第二位成员。 | Nothing is preselected. Choose any two; the system assigns the lead and second member. |
|
||||
| selection one | 已选择 1 / 2:{member_name}。再选择一人才能查看系统编队。 | 1 / 2 selected: {member_name}. Choose one more to review the automatic formation. |
|
||||
| formation lead | 先行位 · {member_name}({profession}):{responsibility} | Lead · {member_name} ({profession}): {responsibility} |
|
||||
| formation second | 第二位 · {member_name}({profession}):{responsibility} | Second · {member_name} ({profession}): {responsibility} |
|
||||
| choice empty | 没有预选。比较当前证据、得到什么和放弃什么。 | Nothing is preselected. Compare current evidence, gain, and opportunity cost. |
|
||||
| selected | 已选择“{option_title}”。确认前仍可更换。 | “{option_title}” selected. You can still change it before commit. |
|
||||
| reason row | 当前理由:{state_evidence},因此{answered_need}。 | Why now: {state_evidence}, so {answered_need}. |
|
||||
| gain row | 得到:{gain} | Gain: {gain} |
|
||||
| cost row | 代价:{cost} | Cost: {cost} |
|
||||
| foregone row | 放弃:{foregone} | Give up: {foregone} |
|
||||
| next proof row | 下一战将验证:{next_consequence} | Next battle will test: {next_consequence} |
|
||||
| legal disabled | 还不能确认:{disabled_reason} | Cannot confirm yet: {disabled_reason} |
|
||||
| review unchanged | 确认前不会改变金币、队伍、路线或成员等级。 | Coin, Company, route, and member levels do not change before commit. |
|
||||
|
||||
The two accepted adaptation options keep their stable object identities and use
|
||||
these exact rows; the resolved names and values are not genericized:
|
||||
|
||||
| Option | Exact `zh_CN` | Exact `en` |
|
||||
|---|---|---|
|
||||
| `EQ-002` title | 钉阵胫甲 · 稳住第一击 | Frontpin Greaves · Steady the First Hit |
|
||||
| `EQ-002` reason | 当前理由:下一场威胁会重击先行者,因此先稳住她承受的第一击。 | Why now: the next threat will strike the lead, so steady her first hit. |
|
||||
| `EQ-002` gain | 得到:先行者第一次受伤降为 -10。 | Gain: the lead's first damage becomes -10. |
|
||||
| `EQ-002` cost | 代价:小队下一次攻击更晚。 | Cost: the Company's next strike is later. |
|
||||
| `EQ-061` title | 晨钟 · 抢到先手 | Early Bell · Seize Initiative |
|
||||
| `EQ-061` reason | 当前理由:下一场敌人准备重击,因此先在它行动前造成 -28。 | Why now: the next enemy prepares a heavy strike, so deal -28 before it acts. |
|
||||
| `EQ-061` gain | 得到:先行者抢在敌人之前行动。 | Gain: the lead acts before the enemy. |
|
||||
| `EQ-061` cost | 代价:先行者承受完整 -30 重击。 | Cost: the lead takes the full -30 strike. |
|
||||
|
||||
Their `放弃` row names the other option's gain, not merely its title. Neither
|
||||
choice receives a `推荐` marker, brighter surface, default focus, or initial
|
||||
selection.
|
||||
|
||||
The Guild response surface uses the same four rows but adds `确认后:金币
|
||||
{coin_before} -> {coin_after};小队 {company_before} -> {company_after}` / `On
|
||||
commit: Coin {coin_before} -> {coin_after}; Company {company_before} ->
|
||||
{company_after}`. Its stable option titles are `保留已验证装备` / `Keep the
|
||||
Proven Item` and `招募第三名成员` / `Recruit a Third Member`. The first reason
|
||||
must name the selected item's observed Battle 2 effect; the second must name an
|
||||
actual current party gap and how the offered member answers it. Values and
|
||||
reasons come from the selected option preview, not UI profession checks.
|
||||
|
||||
Route reason copy is selected by a supplied coverage state:
|
||||
|
||||
| Coverage | Exact `zh_CN` | Exact `en` |
|
||||
|---|---|---|
|
||||
| `covered` | 已覆盖:{coverage_source}能够回应“{pressure}”。 | Covered: {coverage_source} answers “{pressure}”. |
|
||||
| `partial` | 部分应对:{coverage_source}会减轻结果,但不能阻止“{pressure}”。 | Partial: {coverage_source} reduces the consequence but does not stop “{pressure}”. |
|
||||
| `gap` | 存在缺口:当前小队没有直接回应“{pressure}”。 | Gap: the current Company has no direct answer to “{pressure}”. |
|
||||
|
||||
Coverage language predicts a relationship, not exact future HP. It may never
|
||||
mark a route `推荐`, `最佳`, or visually enlarge its reward.
|
||||
|
||||
Growth option copy is always:
|
||||
|
||||
```text
|
||||
{order_label} · {member_name} · {profession}
|
||||
{level_before} -> {level_after}
|
||||
得到:{growth_effect}
|
||||
下一战将验证:{growth_test}
|
||||
```
|
||||
|
||||
The unselected context reads `历练印记 × 1。只能培养一名实际成员;等级不会
|
||||
分享给全队。` / `Training Mark × 1. Train one actual member; levels are not
|
||||
shared by the Company.` The review adds `放弃:其他成员保持 {unchanged_level},
|
||||
本轮不获得其历练效果。` / `Give up: other members stay at
|
||||
{unchanged_level}; their training effects are not gained this cycle.`
|
||||
|
||||
### 4.4 Cause-first result copy
|
||||
|
||||
All five results use the same labeled order. Labels and punctuation are exact;
|
||||
the supplied clauses must not repeat the label.
|
||||
|
||||
```text
|
||||
发生了什么:{outcome_clause}
|
||||
为什么:{cause_clause}
|
||||
决定造成的差异:{decision_clause}
|
||||
现在改变了:{changed_state_clause}
|
||||
下一步:{next_action_clause}
|
||||
```
|
||||
|
||||
```text
|
||||
What happened: {outcome_clause}
|
||||
Why: {cause_clause}
|
||||
Difference made by the decision: {decision_clause}
|
||||
Changed now: {changed_state_clause}
|
||||
Next: {next_action_clause}
|
||||
```
|
||||
|
||||
For Result 1, `决定造成的差异` is renamed `系统编队造成的差异` / `Difference
|
||||
made by automatic formation`. Results 2-5 must name the actual committed option
|
||||
or trained member in `decision_clause`. `changed_state_clause` includes named
|
||||
before/after values or explicitly says `没有永久变化` / `No persistent change`.
|
||||
The final result must include all four questions requested by the batch even if
|
||||
there is no future implemented chapter:
|
||||
|
||||
```text
|
||||
发生了什么:五场远征全部完成;{final_party_outcome}。
|
||||
为什么:{earliest_decisive_cause}。
|
||||
决定造成的差异:{decision_name}让{counterfactual_delta}。
|
||||
现在改变了:{final_changed_state}。
|
||||
下一步:首次体验到此结束;可以检查完整因果记录或重新开始。
|
||||
```
|
||||
|
||||
Do not claim a saved run, permanent inventory, chapter unlock, authoritative XP
|
||||
beyond the supplied first-session state, or future availability.
|
||||
|
||||
## 5. `844x390` Landscape Composition
|
||||
|
||||
P9.1 uses logical pixels and reflows by track; it never scales the complete
|
||||
canvas. The minimum interactive target is `48x48` (`56` high for primary
|
||||
commit), exceeding the Goal's 44 px lower bound. Targets include their full
|
||||
hit region and keep at least `8` px separation.
|
||||
|
||||
### 5.1 Shared tracks
|
||||
|
||||
| Track | `844x390` bounds | Contract |
|
||||
|---|---:|---|
|
||||
| top status rail | `x=12, y=10, w=820, h=54` | Home review tool, product/context, Coin/Company when relevant, Restart, Mute; one row at 100% |
|
||||
| main world/decision | `x=18, y=72, w=544, h=242` | Actors, route nodes, candidate strip, or causal timeline; never nested cards |
|
||||
| context rail | `x=570, y=72, w=256, h=242` | current evidence, gain/cost/foregone, selected summary; unframed or one physical surface |
|
||||
| bottom action dock | `x=18, y=322, w=808, h=56` | secondary/back at left; one primary commit at right, at least `248x56` |
|
||||
|
||||
At 130%, the top rail becomes `68` high and may use two bounded rows. Main
|
||||
content starts at `y=84`; supporting flavor moves to Inspect. Choice options
|
||||
keep title, reason, gain/cost, selection, and disabled reason visible. A
|
||||
full-screen Inspect replacement may scroll, but selecting, revising, reviewing,
|
||||
committing, Back, and the exact current consequence never require scrolling.
|
||||
|
||||
No text ellipsizes. Labels wrap to two lines; generated names get their own
|
||||
line before profession. If a localized option exceeds two body lines, its
|
||||
supporting evidence moves to Inspect rather than shrinking below the functional
|
||||
type token.
|
||||
|
||||
### 5.2 Composition by family
|
||||
|
||||
#### Recruit and formation
|
||||
|
||||
- Recruit selection uses four equal `128x166` upright markers across the main
|
||||
track in stable source order. The selected count is fixed above them; selection
|
||||
never moves or enlarges a candidate.
|
||||
- Formation review uses an unframed horizontal cord: second member at left,
|
||||
lead at right nearest the enemy-facing gap. Ground labels read `第二位 · 1`
|
||||
and `先行位 · 0`. Dotted source-to-target connectors sit behind text summaries.
|
||||
- The context rail states why the system produced this order. It does not offer
|
||||
drag, swap, front/rear buttons, or a manual order control.
|
||||
|
||||
#### Adaptation and Guild response
|
||||
|
||||
- The current party stays in the world at left. Two equal choice regions occupy
|
||||
the physical preparation bench; the rail holds the four-row comparison.
|
||||
- Equipment is shown as an object on a shallow tray. A third-member response
|
||||
shows a recruit silhouette adjacent to the current line. Neither is a receipt
|
||||
card or recommendation.
|
||||
- Before selection, the commit occupies its final dimensions but is
|
||||
policy-disabled with the visible reason `先选择一种回应。` / `Choose one
|
||||
response first.`
|
||||
|
||||
#### Route
|
||||
|
||||
- Three equal adjacent nodes use `172x116` stable envelopes within the world
|
||||
scene. Their path lengths and node sizes are equal; exposure pattern and
|
||||
pressure icon differ without reward-based scale or glow.
|
||||
- A comparison band below the nodes reads in this order: pressure, exposure,
|
||||
reward, current coverage. The selected node connects to the rail with one
|
||||
continuous `route-teal` line.
|
||||
- Route review freezes the party line across the lower third and uses one
|
||||
transaction surface, not three cards.
|
||||
|
||||
#### Individual growth
|
||||
|
||||
- Every actual party member occupies one equal-width marker on the horizontal
|
||||
line. Two-person and three-person layouts use the same line width; three
|
||||
markers become narrower but never below `156x148` at `844x390`.
|
||||
- Actor silhouette, name/profession/current level, and exact effect remain in
|
||||
each marker. The rail holds the selected effect detail and one-mark cost.
|
||||
- Unselected members remain fully readable after selection. No rays, rarity
|
||||
frame, or hero-scale portrait implies a canonical protagonist.
|
||||
|
||||
#### Battle
|
||||
|
||||
- Battlefield owns at least `68%` of usable area. Allies stage protected-left
|
||||
to exposed-right; lead/order 0 is rightmost. Enemy faces the lead across the
|
||||
central action gap.
|
||||
- Objective and next urgent event are top-left below the global rail. Symbol
|
||||
controls Pause, Speed, Inspect, and captions stay top-right. None resembles a
|
||||
combat command.
|
||||
- Only urgent actor data expands. HP, order marker, target relation, and one
|
||||
short status attach to the actual actor; the event ribbon reserves space and
|
||||
never covers actors or primary feedback.
|
||||
|
||||
#### Result
|
||||
|
||||
- The cause-first timeline owns the center `54%` of usable width. The first
|
||||
divergence has the strongest contour; connectors join decision, source,
|
||||
target, and exact changed value.
|
||||
- Actual affected actors remain visible to the left of their event. Facts and
|
||||
receipt occupy the context rail below the cause, never above it.
|
||||
- The next action is the only primary control. Home/Restart remain secondary
|
||||
global tools and never compete with continuation.
|
||||
|
||||
### 5.3 Focal and focus order
|
||||
|
||||
Visual/focus order is fixed:
|
||||
|
||||
1. screen heading and current decision/objective;
|
||||
2. current party state or earliest causal event;
|
||||
3. candidate/options in stable source order;
|
||||
4. selected comparison and exact consequence;
|
||||
5. primary action;
|
||||
6. Back/Inspect/global tools.
|
||||
|
||||
Touch selection, controller focus, and keyboard focus share stable geometry.
|
||||
Focused uses the accepted `3 px` white outer plus `2 px` ink inner contour and
|
||||
cobalt corner marker. Selected adds a check and `已选择`; focus and selection
|
||||
are never represented by hue alone. Focus returns to the invoking stable ID
|
||||
after Inspect, to the selected option after review cancellation, and to the
|
||||
first still-selected recruit after formation revision. It never follows actors
|
||||
or animation.
|
||||
|
||||
## 6. Party-Line And Battle Event Bindings
|
||||
|
||||
### 6.1 Party-line projection
|
||||
|
||||
For each supplied member, render:
|
||||
|
||||
```text
|
||||
{order_index} · {order_label}
|
||||
{member_name} · {profession}
|
||||
{responsibility}
|
||||
{condition}
|
||||
```
|
||||
|
||||
Order `0` is announced `先行位,右侧暴露位置` / `lead, exposed position on the
|
||||
right`; subsequent indices are progressively left/protected. The explanation
|
||||
must name the ordering source: `系统依据两人的当前职责形成此顺序。` / `The
|
||||
system formed this order from both members' current responsibilities.` It must
|
||||
not claim an optimal or permanent order.
|
||||
|
||||
When the Guild response adds a member, the receipt animation inserts that
|
||||
member at the domain-supplied order index, redraws connectors, and announces
|
||||
every affected old/new number. Existing actors do not respawn. If order is
|
||||
unchanged, the receipt explicitly reads `原有两人顺序未改变。` / `The original
|
||||
two keep their order.`
|
||||
|
||||
### 6.2 Event-to-presentation matrix
|
||||
|
||||
| Event kind | Required subject motion/binding | Geometry and exact attached copy | Normal completion | Reduced/low-power completion |
|
||||
|---|---|---|---|---|
|
||||
| `lead_guard` | accepted guard frames on actual source | source-to-self brace edge; `{source}承受攻击:{before} -> {after}({mitigation_source})` | impact contour + one value | stepped guard pose + final value |
|
||||
| `lead_evade` | accepted evade/counter frames | enemy target line breaks, counter line returns; `敌人锁定{source};闪避后结果 {before} -> {after}` | directional trail, no camera travel required | broken/returned static lines |
|
||||
| `ranged_damage` | accepted draw/release and projectile | source-to-enemy line; enemy-attached `-{amount}`; `来源:{source} · 远程命中` | projectile then exact enemy value | source pose -> target contour -> value |
|
||||
| `melee_damage` | accepted advance/strike | source-to-target short connector; target-attached `-{amount}` | impact response and one number | final strike pose and contour |
|
||||
| `heal` | accepted lantern/heal frames | source-to-actual-target jade leaf-chevron; target-attached `+{amount}`; `来源:{source} · 恢复` | path reaches target before value | static connector then exact value |
|
||||
| `protect` | supplied protector/target relation | stitched shield connector; `由{source}保护{target}:{before} -> {after}` | connector tightens, then value | persistent connector and value |
|
||||
| `enemy_pressure` | accepted telegraph/attack | danger-coral split triangle at actual target(s); caption names pressure and time/order | authored warning then impact | persistent target mark, stepped poses |
|
||||
| `reward` | no combat particle authority | receipt strip: `奖励已结算一次:金币 {before} -> {after}` | value travels to Coin then stamp | final Coin plus receipt only |
|
||||
| `persistent_change` | option/member is the source | before/after relation: item, member count, route, or level | `180 ms` commit then `360 ms` receipt | direct final state plus receipt |
|
||||
|
||||
Each HP mutation creates exactly one numeric payload. Damage uses a minus sign
|
||||
and coral split-triangle; healing uses a plus sign and jade leaf-chevron.
|
||||
Mitigation shows named before/after or avoided amount, never a green damage
|
||||
number. Events with zero delta still name the attempted source and reason; they
|
||||
do not emit `-0` or `+0`.
|
||||
|
||||
The visual layer consumes ordered events. It must not derive action branches
|
||||
from profession, assumed front/rear slots, current animation frame, or elapsed
|
||||
render time.
|
||||
|
||||
### 6.3 Causal timeline
|
||||
|
||||
Every result event row contains stable event icon, event order/time, source,
|
||||
target, before/after or receipt, and immediate cause. The first meaningful
|
||||
divergence is the earliest event whose resolved outcome differs because of a
|
||||
committed formation/adaptation/Guild/route/growth decision. If the domain
|
||||
supplies no divergence, show `没有发现由本次决定造成的可验证差异。` / `No
|
||||
verifiable difference from this decision was found.` Missing cause is a binding
|
||||
error, not neutral success.
|
||||
|
||||
## 7. Motion, Feedback, Audio, And Power Variants
|
||||
|
||||
P9.0R3 battle phase timing and accepted action frames remain authoritative.
|
||||
P9.1 may bind more actual actors and events but may not retime the preserved
|
||||
combat language. UI uses `90 ms` select, `180 ms` commit, and `360 ms` receipt.
|
||||
Layout dimensions never animate.
|
||||
|
||||
| Variant | Required behavior |
|
||||
|---|---|
|
||||
| Standard | Source, direction, target, exact delta, and final state appear in that order; one nonessential ambient focal process and at most two background loops |
|
||||
| Reduced motion | No camera travel, parallax, bobbing, continuous UI motion, or nonessential loops; accepted action becomes readable stepped poses; source/target/value order remains |
|
||||
| Reduced flashes | No full-screen flash, alternating high-contrast frames, or rapid burst; impact uses contour, pattern, pose, and exact value |
|
||||
| Mute | No mechanic, timing, decision, caption, geometry, or receipt changes; speaker tool reads `静音`; visual captions stay active |
|
||||
| Low power | Freeze ambient loops and nonessential particles; retain essential anticipation, source pose, target mark, number, event row, and receipt; domain event order/timing does not change |
|
||||
|
||||
Battle captions use `来源 -> 动作 -> 目标 -> 结果`, for example
|
||||
`妮娅 -> 远程射击 -> 路线守卫 -> -28` / `Nia -> Ranged shot -> Route
|
||||
Warden -> -28`. Environmental captions are visually quieter and cannot replace
|
||||
urgent captions. Sound output loss raises one nonblocking notice without moving
|
||||
controls.
|
||||
|
||||
## 8. Localization And Accessibility
|
||||
|
||||
### 8.1 English and 130% text
|
||||
|
||||
- `zh_CN` and `en` use identical state order, control order, bindings, and
|
||||
stable IDs. English may wrap earlier but may not shorten away cause or cost.
|
||||
- At 130%, titles, option names, generated names, before/after values, disabled
|
||||
reasons, and actions never ellipsize. The first viewport retains objective,
|
||||
current state, cost/consequence, primary action/Back, and causal explanation.
|
||||
- Tabular numerals are used for HP, Coin, Company size, level, event order, and
|
||||
time. Chinese does not insert spaces between ideographs.
|
||||
- Screen-reader order follows Section 5.3. Party announcements include order
|
||||
index, exposed/protected direction, name, profession, condition, and current
|
||||
responsibility. Battle events include source, action, target, result, and
|
||||
order/time.
|
||||
|
||||
### 8.2 Non-color and input equivalence
|
||||
|
||||
- Safe, harmful, uncertain, selected, disabled, and complete use the accepted
|
||||
shape/pattern plus text. Disabled opacity alone is forbidden.
|
||||
- Touch, controller, keyboard, and mouse expose the same verbs. No essential
|
||||
action requires drag, hover, double tap, or pointer precision.
|
||||
- All targets are at least `48x48`; primary actions are at least `56` high.
|
||||
Insets, captions, notices, target marks, and focus contours never overlap.
|
||||
- A pauseable full-screen chronological event log contains every urgent
|
||||
automatic battle event. Opening it preserves playback state; closing it
|
||||
restores the exact prior state and focus.
|
||||
- High contrast reduces texture behind text/actors while retaining scene
|
||||
identity. It does not recolor semantic meanings into a single hue family.
|
||||
|
||||
### 8.3 Exact disabled and error reasons
|
||||
|
||||
| Situation | Exact `zh_CN` | Exact `en` |
|
||||
|---|---|---|
|
||||
| fewer than two recruits | 还不能查看编队:请选择两名不同成员。 | Cannot review formation: choose two different members. |
|
||||
| no adaptation | 还不能出发:先选择一种应对方案。 | Cannot depart: choose one response first. |
|
||||
| no Guild response | 还不能开始第三战:先选择公会如何回应。 | Cannot start Battle 3: choose a Guild response first. |
|
||||
| no route | 还不能查看确认:先选择一条路线。 | Cannot review: choose a route first. |
|
||||
| no growth member | 还不能查看确认:先选择一名实际成员。 | Cannot review: choose an actual member first. |
|
||||
| option illegal | 这项选择当前不可用:{reason}。你的状态没有改变。 | This option is unavailable: {reason}. Your state did not change. |
|
||||
| stale commit | 无法确认:队伍状态已经变化。请重新比较;你的状态没有改变。 | Cannot commit: Company state changed. Compare again; your state did not change. |
|
||||
| missing result cause | 无法继续:这场结果缺少可验证原因。你的进度停在战后。 | Cannot continue: this result has no verifiable cause. Progress remains after the battle. |
|
||||
|
||||
## 9. Implementation Handoff IDs
|
||||
|
||||
Minimum stable controls:
|
||||
|
||||
```text
|
||||
P91_OpenRecruitSelection
|
||||
P91_Recruit_{stable_member_id}
|
||||
P91_ReviewFormation
|
||||
P91_ReviseRecruits
|
||||
P91_CommitFormation
|
||||
P91_OpenAdaptation
|
||||
P91_Adaptation_{stable_option_id}
|
||||
P91_CommitAdaptation
|
||||
P91_OpenGuildResponse
|
||||
P91_Guild_{stable_option_id}
|
||||
P91_CommitGuildResponse
|
||||
P91_OpenRouteBoard
|
||||
P91_Route_{stable_route_id}
|
||||
P91_ReviewRoute
|
||||
P91_CancelRouteReview
|
||||
P91_CommitRoute
|
||||
P91_OpenGrowth
|
||||
P91_Growth_{stable_member_id}
|
||||
P91_ReviewGrowth
|
||||
P91_CancelGrowthReview
|
||||
P91_CommitGrowth
|
||||
P91_FinishSession
|
||||
P91_Inspect
|
||||
P91_Pause
|
||||
P91_Captions
|
||||
```
|
||||
|
||||
Compatibility aliases may retain P9.0R10 names such as
|
||||
`ContinueAdaptationButton`, `Adaptation_EQ_002`, `OpenGuildReturnButton`, and
|
||||
existing route/growth controls. Aliases cannot preserve old standard-pair
|
||||
branching or obsolete player-facing front/rear copy.
|
||||
|
||||
Each screen snapshot must record:
|
||||
|
||||
```text
|
||||
screen_id, state_id, viewport, safe_area, locale, text_scale, input_mode,
|
||||
focus_id, selected_id, motion, flashes, mute, captions, contrast, low_power,
|
||||
party_snapshot_id, decision_snapshot_id, event/result_ids, source_revision
|
||||
```
|
||||
|
||||
## 10. Minimum Source-Bound Render Evidence
|
||||
|
||||
All frames are normal Godot renders from the fixed candidate revision, not
|
||||
mockups. Unless specified, fixture is `844x390`, `zh_CN`, 100%, standard motion,
|
||||
standard flashes, captions on, sound on, standard contrast, normal power.
|
||||
|
||||
| Frame | Required state and visible proof |
|
||||
|---|---|
|
||||
| `P91-E01` | accepted Title/front door; product, premise, entry action, settings tool |
|
||||
| `P91-E02` | `P91-RECRUIT-0`; four equal candidates, `0 / 2`, no preselection, disabled reason |
|
||||
| `P91-E03` | `P91-RECRUIT-2`; an exposed nonstandard pair selected, stable positions unchanged |
|
||||
| `P91-E04` | formation review for Farstring + Kindhand; system lead/second labels, both reasons, revise/commit |
|
||||
| `P91-E05` | Battle 1 exposed-lead pressure; actual target mark, damage number, event caption |
|
||||
| `P91-E06` | Result 1 for a pair with Wayrunner second; both actions and order-caused difference |
|
||||
| `P91-E07` | adaptation unselected; equal responses, gain/cost/foregone, no recommendation, commit reason |
|
||||
| `P91-E08` | Battle 2 Wayrunner second-position counter; source/target/delta and selected response visible |
|
||||
| `P91-E09` | Result 2; response-caused before/after, actual party actions, return-to-Guild action |
|
||||
| `P91-E10` | Guild response unselected for a nonstandard starting pair; current actors/Coin and two state-dependent reasons |
|
||||
| `P91-E11` | alternate Guild response selected; before/after Coin/Company, gained and foregone state |
|
||||
| `P91-E12` | Battle 3 at the first event that proves the selected Guild response |
|
||||
| `P91-E13` | Result 3 cause-first timeline and current Company snapshot |
|
||||
| `P91-E14` | route board unselected; all three pressures/exposure/reward plus different current coverage states |
|
||||
| `P91-E15` | route review; selected pressure/coverage, party snapshot, Back and commit |
|
||||
| `P91-E16` | Battle 4 pressure attached to actual target(s), including a rear/split target case |
|
||||
| `P91-E17` | Result 4; inherited response + route pressure + once-only reward receipt |
|
||||
| `P91-E18` | growth unselected; all actual members, distinct effects, one mark, no preselection |
|
||||
| `P91-E19` | growth review at `zh_CN`, 130%; exact gain, foregone effects, actions without overlap/scroll |
|
||||
| `P91-E20` | Battle 5 at the event that proves the trained member's changed capability |
|
||||
| `P91-E21` | final result; all five cause-first lines, final party/decision state, no unsupported future claim |
|
||||
| `P91-E22` | final result for a materially different prior decision; decision clause and changed state visibly differ |
|
||||
| `P91-E23` | recruit or Guild decision at `en`, 130%; longest title/reason/action fit with focus contour |
|
||||
| `P91-E24` | representative battle with reduced motion + reduced flashes + mute; persistent target geometry, caption, number |
|
||||
| `P91-E25` | representative three-member battle in low power; order, essential event frames, HP, caption remain readable |
|
||||
|
||||
At least one evidence path must represent each of the six unordered starting
|
||||
pairs across deterministic screenshots or the interaction/test matrix. The
|
||||
normal-render minimum above deliberately concentrates visual proof on the most
|
||||
failure-prone nonstandard roles; it does not replace six-pair domain coverage.
|
||||
|
||||
### 10.1 Complete interaction recording
|
||||
|
||||
Record one uninterrupted normal-render path from `P91-TITLE-READY` to
|
||||
`P91-FIRST-SESSION-RESULT` using real parsed `ScreenTouch`/`ScreenDrag` input.
|
||||
The recording must visibly:
|
||||
|
||||
1. choose two recruits, remove one, choose a replacement, then review/commit;
|
||||
2. show both Battle 1 responsibilities and read Result 1;
|
||||
3. select adaptation A, switch to B, then commit;
|
||||
4. select one Guild response, switch to the other, then commit;
|
||||
5. select a route, open review, return to compare, select another route, commit;
|
||||
6. select one member for growth, open review, return, choose another, commit;
|
||||
7. reach the final result and inspect the complete causal record.
|
||||
|
||||
The capture report binds video hash/path to source revision, runtime version,
|
||||
fixture/settings, session seed or deterministic scenario ID, starting pair,
|
||||
every committed stable option ID, final snapshot ID, and strict diagnostics.
|
||||
Fallback/direct input counts must be zero. Cuts, state injection, debug-only
|
||||
navigation, or test-created intermediate pages invalidate this recording.
|
||||
|
||||
### 10.2 Fixture and pair coverage
|
||||
|
||||
The source-bound layout suite uses these exact landscape fixtures:
|
||||
|
||||
| Fixture ID | Viewport | Required coverage |
|
||||
|---|---:|---|
|
||||
| `P91-L-SMALL` | `844x390` | every screen/state; `zh_CN` 100% and representative `en`/130% states; no normal action scroll |
|
||||
| `P91-L-SHORT` | `1280x720` | every layout family; device safe area `56` sides and `40` top/bottom |
|
||||
| `P91-L-WIDE` | `1560x720` | recruit, route, three-member battle, result; extra width reveals world, not stretched controls |
|
||||
| `P91-L-REFERENCE` | `1920x1080` | every layout family at canonical tracks and type tokens |
|
||||
| `P91-L-LARGE` | `2560x1440` | recruit, choice, battle, result; constrained UI tracks and additional environment only |
|
||||
|
||||
All six unordered pairs are named test/evidence identities and must each reach
|
||||
the final result: `Hearthguard + Wayrunner`, `Hearthguard + Farstring`,
|
||||
`Hearthguard + Kindhand`, `Wayrunner + Farstring`, `Wayrunner + Kindhand`, and
|
||||
`Farstring + Kindhand`. For each pair, the layout/evidence manifest records the
|
||||
system-supplied lead/second order and both displayed responsibility strings.
|
||||
At least one normal-render frame exists for every pair; the complete minimum
|
||||
frame list in Section 10 remains mandatory rather than being replaced by these
|
||||
six pair frames.
|
||||
|
||||
## 11. Acceptance Checklist And Residual Human Gates
|
||||
|
||||
- [ ] Every screen/state in Section 3 is reachable through visible controls from the accepted front door.
|
||||
- [ ] No choice is preselected; revise, review, commit, duplicate commit, disabled, stale, and binding-error states follow this contract.
|
||||
- [ ] Every arbitrary starting pair uses `先行者` / `第二位成员` correctly and shows actual responsibilities rather than standard-pair assumptions.
|
||||
- [ ] Guild, route, and growth values read the actual party and prior decisions; at least two supplied options change rational value by state.
|
||||
- [ ] All battle events project source, target, action, exact delta, cause, and order without deriving domain truth in UI.
|
||||
- [ ] All five results use cause-first order and the final result answers happened, why, decision difference, changed state, and next action.
|
||||
- [ ] `844x390`, representative small/reference/large landscape fixtures, `zh_CN`, `en`, 130%, reduced motion/flashes, mute, high contrast, and low power pass without overlap or hidden actions.
|
||||
- [ ] Minimum frames and the uninterrupted parsed-touch recording are revision-bound and diagnostics-clean.
|
||||
|
||||
Automated tests and captures cannot approve comprehension, fun, visual feel,
|
||||
listening quality, physical-device behavior, packaging, store readiness, or
|
||||
release. Those remain explicit Owner/Human Gates. This candidate also cannot
|
||||
authorize runtime implementation until gameplay, UX/visual, and architecture
|
||||
specifications are reconciled into the frozen P9.1 implementation contract.
|
||||
Reference in New Issue
Block a user