From e60191b76dd80a52df9b02478759ca5ca146131a Mon Sep 17 00:00:00 2001 From: wusumac <736139669@qq.com> Date: Tue, 11 Aug 2026 21:49:29 +0800 Subject: [PATCH] docs(product): integrate charter and final choice --- README.md | 8 +- docs/presentation/SCREEN_AND_STATE_MAP.md | 13 +- docs/product/ECONOMY_AND_BALANCE.md | 37 ++++ docs/product/GAME_PRODUCT_CONTRACT.md | 54 +++++- docs/prototype/INTERACTIVE_PROTOTYPE_SPEC.md | 41 +++- .../PHASE4_PRODUCT_INTEGRATION_DECISION.md | 119 ++++++++++++ prototype/site/app.js | 131 ++++++++++++- prototype/site/data/catalog.json | 52 ++--- prototype/site/index.html | 2 +- prototype/site/styles.css | 183 +++++++++++++++++- prototype/site/verify-r6.js | 45 ++++- tools/build_gallery_bundle.py | 2 +- 12 files changed, 627 insertions(+), 60 deletions(-) create mode 100644 docs/reviews/PHASE4_PRODUCT_INTEGRATION_DECISION.md diff --git a/README.md b/README.md index 61485d4f..11d47bb8 100644 --- a/README.md +++ b/README.md @@ -42,10 +42,16 @@ are localized rather than leaving the key mechanics in English. identities, and two bosses per Region. 4. **Catalogs:** search 42 Professions, 36 Traits, 320 equipment items, 60 Artifacts, 100 ordinary/elite enemies, and 16 bosses. -5. **Review gates:** open the six critical Owner review groups and keep human +5. **Review gates:** open the seven critical Owner review groups and keep human comprehension, visual, fun, listening, and device approval separate from deterministic HTML checks. +The seventh group covers the concrete **Guild Charter** (Renown spends for +breadth, never permanent combat power) and the final-boss decision between +**Complete the First Chronicle** and **Open the Oath Season**. Both choices +archive the cleared generated Company; Oath Season begins with a new generated +run and ordinary New Run remains available. + Run it locally from the repository root: ```bash diff --git a/docs/presentation/SCREEN_AND_STATE_MAP.md b/docs/presentation/SCREEN_AND_STATE_MAP.md index f82d5a34..7d558d91 100644 --- a/docs/presentation/SCREEN_AND_STATE_MAP.md +++ b/docs/presentation/SCREEN_AND_STATE_MAP.md @@ -106,9 +106,10 @@ Battle `- Guild desk / next risk choice Postgame -|- Rules review -> New postgame run +|- Final boss settlement -> First Chronicle decision +|- Oath Season rules review -> New generated run |- Challenges and records -`- Postgame result -> Postgame hub +`- Oath Season result -> Oath Season hub / Final Ledger / ordinary New Run ``` ### 3.2 Shell Responsibilities @@ -268,11 +269,11 @@ Required invalid and interruption states: | ID / screen / input | Purpose | Primary action and consequence | Empty / loading | Error / confirmation | Interruption / return | |---|---|---|---|---|---| | `PRO-001` Run progression / `LIST` | Show current level paths, profession changes, capacity growth, prerequisites, and decisions opened within the active run. | Inspect or apply a legal sourced choice. | No pending choice shows next prerequisite. Loading retains current applied state. | Stale prerequisite or invalid choice refreshes before commit. Irreversible branch or reset uses explicit comparison confirmation. | Suspend reconciles any receipt. Back returns to Guild desk or Result caller. | -| `PRO-002` Persistent progression / `LIST` | Show unlock breadth, new planning grammar, prerequisite evidence, and claimed receipts across runs. | Claim or inspect a sourced unlock. | First-run state explains when evidence can be earned. Loading uses stable unlock IDs. | Unknown future content remains undisclosed; duplicate claim returns receipt. Confirmation states how new runs change. | Suspend retains filters. Back returns to Title, Guild, or Run End caller. | +| `PRO-002` Guild Charter / `LIST` | Show current Renown, eight horizontal Region seals, prerequisite tracks, breadth-only packet cards, exact costs, future-run effects, and claimed receipts without resembling a radial power tree. | Tap a Region seal, Tap one eligible packet, then review and claim it; the receipt changes future-run catalog, trial, threat-information, or Oath-law breadth and never raw power. | First-run state explains how Renown is earned and keeps all eight seals visible. Loading reserves stable claim IDs and disables packet selection until cost, prerequisites, and effect resolve. | Unknown content stays undisclosed. Failed prerequisites and insufficient Renown preserve selection with reasons; duplicate claim returns its receipt. Confirmation shows before/after Renown, prerequisites, future-run effect, and `No permanent combat power`. | Suspend retains selected Region, packet and scroll anchor. Back before commit spends nothing; after commit it verifies the receipt and returns to Title, Guild, or Run End caller. | | `PRO-003` Records and compendium / `LIST` | Browse professions, traits, equipment, artifacts, enemies, bosses, regions, recruit histories, and battle reports without spoilers. | Inspect entry; changes no run result. | Category empty states discovery route when allowed. No search result offers Clear Search. Loading keeps category context. | Missing referenced entry reports stable ID and diagnostics. Inspection requires no confirmation and external links do not exist here. | Suspend preserves category, filter, and scroll ID. Back returns to caller. | -| `PST-001` Postgame hub / `NAV` | Present eligibility, sourced rules, open challenges, prior results, and the distinction from an ordinary run. | Open rules review; does not start immediately. | No eligible modifier states the next sourced requirement. Loading preserves ordinary New Run access. | Missing `BIND:POSTGAME` disables entry and names source. No confirmation. | Suspend preserves selected challenge. Back returns to Title. | -| `PST-002` Postgame run review / `SELECT` | Compare active postgame modifiers, known consequences, difficulty, save slot, and carried unlock breadth. | Begin postgame run; creates a new run with the reviewed rules. | No compatible selection blocks Begin with reason. Loading verifies every modifier ID. | Conflict, expired ruleset, or slot collision preserves selection. Confirmation lists every active modifier and irreversible setup choice. | Suspend saves the uncommitted form. Cancel returns to Postgame hub. | -| `PST-003` Postgame result / `LIST` | Explain challenge outcome, rules that mattered, record change, rewards, and next legal attempt. | Finish result; applies verified record and reward receipts. | No record change is stated without negative framing. Loading waits for receipts. | Duplicate or invalid score is separated from local clear status. Finish confirmation only when an unresolved claim exists. | Suspend preserves the result. Back stays within result tabs; Finish returns to Postgame hub. | +| `PST-001` First Chronicle decision / `SELECT` | After the sixteenth boss and verified settlement, compare `Complete the First Chronicle` with `Open the Oath Season`; state that both archive the surviving Company and close the run. | Tap one choice, review its destination, then confirm: Chronicle shows the finite ending/Final Ledger and Title; Oath Season opens postgame rule review for a new generated run. | Before final eligibility, show the exact remaining boss requirement while ordinary New Run remains visible. Loading keeps the verified final-boss receipt and disables both commits. | Missing settlement, unresolved casualty/reward, or stale first-clear state blocks both choices. Confirmation repeats archived Company, closed Coin/Credit, retained Records/Renown, destination, and no playable Recruit carryover. | Suspend retains the uncommitted choice and final receipt. Back stays in final result. After receipt, resume at Final Ledger/Title or Oath Season hub; never reopen the cleared run. | +| `PST-002` Oath Season hub and run review / `SELECT` | Compare eligible Oath laws, conflicts, known consequences, difficulty, save slot, Guild Charter breadth, and the distinction from ordinary New Run. | Tap laws to assemble a compatible set, review the complete rules, then create a new generated run; no cleared Recruit is selectable. | No eligible law explains its Charter requirement and still offers ordinary New Run. Loading verifies modifier, profile and slot IDs before Begin. | Conflict, expired ruleset, missing eligibility, or slot collision preserves selection with reasons. Confirmation lists every active law, difficulty, generated-run promise, and irreversible setup choice. | Suspend saves the uncommitted form. Cancel returns to Title/postgame hub. Interruption after receipt opens the new run's provisional Recruit offers. | +| `PST-003` Oath Season result / `LIST` | Explain challenge outcome, laws that mattered, Record change, earned Renown, archived generated Company, and next legal attempt. | Finish result; applies verified Record/Renown receipts and returns to the Oath Season hub, Final Ledger, or ordinary New Run. | No Record or Renown change is stated plainly. Loading waits for all receipts and preserves ordinary New Run access. | Duplicate or invalid score is separated from local clear status. Finish confirmation appears only while a claim remains unresolved. | Suspend preserves the result. Back stays within result tabs; Finish never resumes the closed Company. | ### 5.7 Settings And Data diff --git a/docs/product/ECONOMY_AND_BALANCE.md b/docs/product/ECONOMY_AND_BALANCE.md index 7f8d949a..62b6b28d 100644 --- a/docs/product/ECONOMY_AND_BALANCE.md +++ b/docs/product/ECONOMY_AND_BALANCE.md @@ -374,6 +374,39 @@ cards, larger starting Line capacity, or casualty reversal. All mandatory Standard counters are in the default or deterministic Contract pool. A player never needs a Renown purchase to finish the first clear. +### 9.1 Guild Charter Transaction + +`PRO-002` presents the existing Renown authority as the **Guild Charter**. It is +not a new economy, currency, progression tree, or permanent-stat layer. The +board contains exactly eight horizontal Region seals in campaign order. A seal +opens only its authored packet cards and prerequisite tracks; no radial layout +or copied node graph is permitted. + +Each claim uses one stable `charter_claim_id` and the existing cost range above: + +```text +preview = (charter_claim_id, region_id, prerequisite_ids[], renown_cost, + effect_family, future_run_effect, balance_revision) +commit = verify preview + debit Renown + append one claim receipt atomically +retry = return the original receipt; never debit or grant twice +``` + +The preview must show current Renown, remaining Renown, every prerequisite, +whether each prerequisite is satisfied, the exact future-run breadth change, +and the statement `No permanent combat power`. A failed prerequisite, stale +balance revision, insufficient balance, duplicate claim, or interrupted write +cannot partially reveal a packet or consume Renown. Respec and refund are not +part of the contracted board; claims are permanent breadth unlocks. + +The first-clear choice after the sixteenth boss creates no new currency and +grants no choice-specific combat value. Both branches settle the same earned +Renown and first-clear Records exactly once, archive the surviving Company, and +close Coin/Credit with the run. **Complete the First Chronicle** changes only +the next destination to Final Ledger/Title. **Open the Oath Season** additionally +sets postgame eligibility and enters rule review; its first playable state is a +new generated run after that review. Ordinary New Run remains available and +uses the same persistent breadth already owned. + ## 10. Equipment And Artifact Distribution The 320 equipment entries are divided into eight Region bands of 40. Every band @@ -721,6 +754,8 @@ alter transaction integrity or reintroduce permanent Meta stats. reward formulas are complete. - [ ] Coin, Credit, XP, Renown, and progression facts have explicit persistence, sources, sinks, caps, and non-power boundaries. +- [ ] Guild Charter preview/claim/retry uses existing Renown, the declared cost + ranges, exactly-once receipts, and no permanent raw power. - [ ] Death recovery is affordable without making dismissal/death profitable. - [ ] The dismissal rebate is unreachable when the target is the final living Recruit; abandonment and casualty recovery remain separate. @@ -731,3 +766,5 @@ alter transaction integrity or reintroduce permanent Meta stats. and risk policies. - [ ] All fixed content counts and no-filler requirements match the other authorities. +- [ ] Both final-campaign choices settle identical earned economy receipts, + archive the Company, and differ only in destination/postgame eligibility. diff --git a/docs/product/GAME_PRODUCT_CONTRACT.md b/docs/product/GAME_PRODUCT_CONTRACT.md index f7d79e8b..59d87ddc 100644 --- a/docs/product/GAME_PRODUCT_CONTRACT.md +++ b/docs/product/GAME_PRODUCT_CONTRACT.md @@ -3,7 +3,7 @@ > Authority: player promise, complete loop, run and campaign shape, canonical > vocabulary, product boundaries, and design acceptance. > -> Revision: recruit-line-design-r3 / 2026-08-11 +> Revision: guild-charter-integration-r4 / 2026-08-11 > > Companion authorities: > [SYSTEMS_AND_BATTLE.md](SYSTEMS_AND_BATTLE.md), @@ -119,6 +119,7 @@ same meaning. | Artifact | A run-defining shared rule modifier, distinct from unit equipment | | Coin | Run-only purchase resource; cleared when the run closes | | Renown | Persistent breadth-unlock resource; it cannot buy raw combat power | +| Guild Charter | Persistent eight-Region board where Renown buys catalog, trial, threat-information, and optional Oath-law breadth for future generated runs | | Replacement Credit | Run-only price relief created by Recruit death and consumed only by later hires | | Fallen | A Recruit reduced to zero HP and permanently removed from the current run at outcome commit | | Meta progression | Persistent access, information, and rule breadth; it may not replace run decisions | @@ -267,9 +268,22 @@ summon, displacement, and timeout rules. Boss victory clears the Contract. A run closes by Contract clear, explicit abandonment, or inability to deploy one living Recruit after defeat recovery. Coin and Replacement Credit close -with the run. Region progress, Renown grants, catalog discoveries, and Records -commit once. Surviving generated Recruits become a run-history entry rather -than persistent playable units. +with the run. Region progress, Renown grants, Guild Charter claims, catalog +discoveries, and Records commit once. Surviving generated Recruits become a +run-history entry rather than persistent playable units. + +The sixteenth campaign boss uses the same run-close settlement, then opens one +explicit first-clear decision only after every result, casualty, reward, and +progression receipt is verified: + +- **Complete the First Chronicle** archives the surviving Company as Records, + presents the finite ending and Final Ledger, then returns to Title. +- **Open the Oath Season** archives that same Company, opens the postgame hub, + and prepares a new generated run under separately reviewed optional laws. + +Both choices close the cleared run. Neither choice preserves a Recruit, +equipment loadout, Coin, Credit, position, level, or pending operation as +playable state. Ordinary New Run remains available after either choice. ## 8. Recruitment, Dismissal, Death, And Replacement Promise @@ -375,7 +389,20 @@ is balanced without Meta power. Lower difficulty preserves all systems and Records. Higher difficulty rewards broader risk selection but cannot become a mandatory progression route. -After the finite ending, postgame provides: +Persistent breadth is reviewed through the **Guild Charter**, an original board +of eight horizontal Region seals and prerequisite tracks. It spends Renown only +on catalog packets, Profession clues or trials, threat information, and optional +Oath laws. It never contains percentage power, starting resources, extra Line +capacity, Recruit preservation, or casualty reversal. + +The sixteenth boss completes the campaign before asking the player to choose: + +- **Complete the First Chronicle:** archive the surviving Company, view the + finite ending and Final Ledger, and return to Title. +- **Open the Oath Season:** archive the same Company, enter the postgame hub, + review optional laws, and create a new generated run. + +After that finite ending, postgame provides: - **Profession Mastery:** clear fixed counterfactual trials for every base, regular advanced, and hidden hybrid identity; @@ -388,6 +415,8 @@ After the finite ending, postgame provides: Postgame does not promise endless content or infinite stat scaling. Repeated unchanged clears cannot be the majority of the 60+ hour mastery target. +The cleared Company is never a postgame roster; Records may show its final +composition and history but cannot instantiate those Recruit IDs in a run. ## 13. Accessibility, Localization, And Input @@ -413,8 +442,11 @@ unchanged clears cannot be the majority of the 60+ hour mastery target. All platforms map the same verbs: focus, inspect, compare, buy, sell, lock, refresh, equip, reorder, confirm, cancel, start, pause, speed, retreat, and open -event log. Drag is optional; select-then-destination performs every reorder and -equip action. Battle provides no hidden pointer-only command surface. +event log. Touch instructions name Tap as the primary operation: Tap a Recruit +or item to select, then Tap a legal destination or target to commit the pending +choice. Drag is an optional shortcut; select-then-destination performs every +reorder and equip action. Battle provides no hidden pointer-only command +surface. Destructive or spending actions use a review state. Duplicate confirm input returns the first operation receipt and cannot spend, dismiss, claim, or close @@ -472,6 +504,10 @@ With at least five uncoached target players: - four can explain why the final living Recruit cannot be dismissed and can find the separate `Abandon Run` action; - four use refresh and lock without expecting a reload reroll; +- four can state what Renown buys on the Guild Charter and why no claim adds + permanent combat power; +- four distinguish Complete the First Chronicle from Open the Oath Season and + predict that both archive, rather than preserve, the cleared Company; - three voluntarily start another Round or name a specific build test. ### 15.2 Decision And Economy Quality @@ -518,6 +554,10 @@ separately authorized. - [ ] Run creation reserves its seed before generating the four opening offers, preserves a revisable exact pair, and promotes the draft exactly once. - [ ] First clear is 15-25 hours and mastery is 60+ hours without waiting. +- [ ] The Guild Charter has eight horizontal Region seals, sourced + prerequisites, existing Renown costs, and breadth-only effects. +- [ ] The final boss presents Chronicle completion and Oath Season as two + explicit choices; both archive the Company and ordinary New Run remains. - [ ] Every gameplay row passes the no-filler decision test. - [ ] Accessibility, localization, offline, premium, and save-integrity boundaries are preserved. diff --git a/docs/prototype/INTERACTIVE_PROTOTYPE_SPEC.md b/docs/prototype/INTERACTIVE_PROTOTYPE_SPEC.md index fc943004..95369497 100644 --- a/docs/prototype/INTERACTIVE_PROTOTYPE_SPEC.md +++ b/docs/prototype/INTERACTIVE_PROTOTYPE_SPEC.md @@ -21,8 +21,10 @@ The prototype gives the Owner one visible artifact for deciding whether: 4. the 50 current player-facing page/state IDs look like game screens rather than a requirements-card audit; 5. the eight Region directions and complete authored catalogs support the - promised breadth; and -6. any owner-visible boundary requires redesign before formal development. + promised breadth; +6. Guild Charter spending and the final-boss continuation/closure choice are + understandable without copying a reference layout; and +7. any owner-visible boundary requires redesign before formal development. HTML approval remains design approval only. Comprehension, visual quality, fun, listening, device ergonomics, packaging, store, and release stay separate human @@ -37,7 +39,7 @@ First play (23 states) Screen atlas (50 IDs plus required state variants) Regions (RG-01..RG-08) Catalogs (Profession / Trait / Equipment / Artifact / Enemy / Boss) -Review gates (six critical groups and evidence boundary) +Review gates (seven critical groups and evidence boundary) ``` Desktop and tablet use a persistent left rail. Phone layouts use an off-canvas @@ -66,6 +68,11 @@ Every ID has a canonical composition and inspectable loading/empty, error/confirmation, and interruption/return overlays sourced from its authority row. `SYS-005` remains one page ID while also exposing Contract, four-offer choice, creation review, pending creation, and receipt/handoff states. +`PRO-002` uses a unique Guild Charter composition with eight horizontal Region +seals, prerequisite tracks, existing Renown, packet cards, and a breadth-only +claim review. `PST-001..003` use unique Chronicle decision, Oath Season setup, +and Oath result compositions; they may not fall back to a generic progression +path. ## 4. Critical Review Groups @@ -119,6 +126,20 @@ default. All 23 first-play decisions and the Screen Atlas purpose/action/safe summaries must remain understandable in Chinese; stable IDs and proper names may remain visible alongside their localized labels. +### 4.7 Guild Charter And Final Continuation + +`PRO-002` shows the complete eight-seal Guild Charter in campaign order. Tap a +Region, then Tap a packet to review its prerequisites, Renown cost, remaining +balance, future-run breadth effect, and `No permanent combat power` boundary. +The composition must not use a radial graph or imitate a reference tree. + +`PST-001` compares **Complete the First Chronicle** and **Open the Oath Season** +at equal visual priority after final-boss settlement. Both explicitly archive +the surviving Company and close the run. `PST-002` reviews optional Oath laws +and creates a new generated Company. `PST-003` explains which laws mattered, +the exact Record/Renown receipts, and next legal destinations. Ordinary New Run +remains visible throughout the postgame path. + ## 5. Complete First-Play Chain The 23 review states cover the real first-play handoffs: @@ -175,6 +196,9 @@ labeled visual direction and never override current Region names or mechanics. viewer zoom are keyboard/pointer/touch-compatible HTML controls. - No action depends on hover, precision drag, audio, color, rapid input, or an uncapturable animation state. +- Guild Charter uses Tap Region -> Tap packet -> review claim. Final choice uses + Tap choice -> review destination -> confirm. Oath setup uses Tap law -> review + all active laws -> begin a new generated run; drag is optional everywhere. ## 8. Build And Evidence @@ -196,9 +220,10 @@ already-provisioned Playwright Node module and Chrome: NODE_PATH= node prototype/site/verify-r6.js ``` -It checks all 50 IDs, critical compositions, first-play interactions, catalog -search, Region images, locale/settings state, viewer zoom, desktop/tablet/phone -layout, browser errors, and offline Gallery loading. Evidence is written under: +It checks all 50 IDs, seven review groups, critical compositions including +Guild Charter and `PST-001..003`, first-play interactions, catalog search, +Region images, locale/settings state, viewer zoom, desktop/tablet/phone layout, +browser errors, and offline Gallery loading. Evidence is written under: ```text prototype/gallery/evidence/r6/ @@ -208,7 +233,9 @@ prototype/gallery/evidence/r6/ - [x] Exactly 50 current IDs with generated-Recruit and current catalog scope; no superseded screen-count or authored-cast claim. -- [x] Six critical review groups use player-readable landscape compositions. +- [x] Seven critical review groups use player-readable landscape compositions. +- [x] Guild Charter and all three completion/postgame IDs use dedicated original + landscape compositions rather than a generic progression diagram. - [x] Every remaining page has a family-appropriate, page-specific composition and explicit global state variants. - [x] The 23-state first-play chain reaches recovery without a dead control. diff --git a/docs/reviews/PHASE4_PRODUCT_INTEGRATION_DECISION.md b/docs/reviews/PHASE4_PRODUCT_INTEGRATION_DECISION.md new file mode 100644 index 00000000..e1dd664a --- /dev/null +++ b/docs/reviews/PHASE4_PRODUCT_INTEGRATION_DECISION.md @@ -0,0 +1,119 @@ +# Phase 4 Product Integration Decision + +Date: 2026-08-11 + +## Decision Enabled + +Decide which newly proven reference structures should enter Aetherbound Guild's +original product contract before runtime development, and which should be +rejected as reference-specific expression or a poor fit for mobile sessions. + +## Fixed Boundary + +- Product stage remains pre-development design review. +- Runtime, engine, final media, audio production, packaging and release remain + frozen. +- Commercial names, prose, formulas, layouts, trees, images and audio do not + enter this repository. +- The Owner-locked rule remains: Fallen Recruits never return during or after a + battle in the current run. + +## Five-Lens Review + +### Product And Business + +The ten-member generated-company fantasy, pre-battle decisions and automatic +combat remain the strongest differentiator. A hundreds-of-victories mandatory +run would conflict with the contracted 15-75 minute mobile session and increase +abandonment risk. Keep finite 45-75 minute Contract runs and use the campaign +plus postgame for long-term breadth. + +### Player Experience + +The current first-play chain already teaches recruit, equip, reorder, risk, +automatic battle, diagnosis and casualty recovery. The missing player-facing +promises are a concrete persistent-spending surface and an explicit answer to +"what happens after the final boss?" Both must be visible in the prototype. + +### Visual And Interaction Design + +Do not copy a radial rune graph. Use an original **Guild Charter**: eight +horizontal Region seals connected by readable prerequisite tracks, with +sidegrade unlock cards below the selected seal. Touch uses Tap-to-select then +Tap-destination for reorder/equip, with drag as an optional shortcut. + +### Systems Architecture + +Renown already purchases breadth and the save contract already protects +persistent claims. Guild Charter is a presentation and transaction model over +that authority, not a new power currency. The final-boss decision reuses +first-clear facts and postgame eligibility; it does not preserve the just-ended +run's Recruits as playable units or reopen a closed run. + +### Simulated Target Players + +- A first-time mobile player needs one obvious next action and visible + consequences, not a large unexplained tree. +- A build-focused player needs prerequisites, cost, what changes in future + runs and a safe preview before spending. +- A mastery player needs a finite first ending plus an explicit continuation + path, without being told that completion erased ordinary New Run. + +These are design hypotheses, not human evidence. + +## Accepted Integration + +1. Keep one ordered horizontal line, generated Recruits, ten deployment + capacity, automatic combat, visible risk offers and permanent run casualties. +2. Give `PRO-002` a concrete Guild Charter board. Renown spends only on catalog + packets, Profession clues/trials, threat-preview breadth and optional Oath + laws. Every claim previews prerequisite, cost and future-run effect. +3. At the sixteenth campaign boss, show a first-clear decision after all + receipts settle: + - **Complete the First Chronicle:** archive the surviving Company in Records, + show the finite ending and return to Title/Final Ledger. + - **Open the Oath Season:** archive the same Company, then enter the postgame + hub to create a new generated run under reviewed optional laws. +4. Keep ordinary New Run visible in postgame. Postgame never silently resumes + the cleared Company and never grants permanent raw power. +5. Strengthen mobile instructions around Tap selection, Tap destination, + optional drag, selling mode, destructive review and battle controls. +6. Add a seventh Owner review group for Guild Charter and final-boss + continuation/closure. + +## Rejected Integration + +- No copied Rune Circle layout, node names, costs or profession mapping. +- No mandatory 800-round or multi-hour uninterrupted run. +- No same-battle resurrection or difficulty-based reversal of permanent loss. +- No conversion of a retired Recruit into farmable permanent combat power. +- No endless-content claim, infinite stat scaling or repeated identical clears + as the primary mastery plan. +- No manual attack or ultimate-skill controls. + +## Acceptance + +The integration is candidate-ready only when the product, economy, screen map, +prototype specification and HTML show the same Guild Charter and final-boss +choice; the deterministic validator and browser checks pass; and the Owner can +identify what Renown buys, what each final choice does and why the just-cleared +Company does not persist as playable units. + +## Machine Verification Record + +The 2026-08-11 design candidate passed: + +- `ABG_PREDEVELOPMENT_DESIGN_SELF_TEST_OK cases=28`; +- `ABG_PREDEVELOPMENT_DESIGN_OK errors=0`, with 50 pages and all fixed content + and audio counts unchanged; +- `ABG_ANTI_DOMINANCE_OK no_weak_dominance=1`, with five fixed seeds and policy + wins `1/2/1/1`; +- `ABG_R6_BROWSER_OK screens=50 flow_states=23 review_groups=7`, including all + four new dedicated compositions, desktop/tablet/phone portrait/phone + landscape, and the offline self-contained bundle. + +The final offline HTML SHA-256 is +`f4639527439ce22afeb00082e4bba612a3d1aba2898207aeca5e34fa54f982e3`. +This closes machine consistency and responsive-layout checks only. Owner +comprehension, visual approval, fun, listening, device ergonomics, and formal +development authorization remain open. diff --git a/prototype/site/app.js b/prototype/site/app.js index 2c3eae1f..49d30aa1 100644 --- a/prototype/site/app.js +++ b/prototype/site/app.js @@ -14,6 +14,10 @@ const state = { partySwapped: false, battlePaused: false, battleSpeed: 1, + charterRegionIndex: 2, + charterPacketIndex: 0, + chronicleChoice: "chronicle", + oathLaws: ["measured-supply"], settings: { contrast: false, reducedMotion: false, @@ -108,8 +112,8 @@ const screenNamesZh = { "BAT-002": "自动战斗", "BAT-003": "角色与事件查看", "BAT-004": "暂停与速度", "BAT-005": "撤退审核", "BAT-006": "战斗恢复审核", "OUT-001": "战果与诊断", "OUT-002": "死亡与损失", "OUT-003": "奖励选择", "OUT-004": "恢复选择", "OUT-005": "远征结束总结", "OUT-006": "放弃远征审核", "PRO-001": "本轮成长", - "PRO-002": "永久成长", "PRO-003": "记录与图鉴", "PST-001": "终局挑战", "PST-002": "终局远征审核", - "PST-003": "终局结果", "SET-001": "设置", "SET-002": "显示与文字", "SET-003": "动效与闪烁", + "PRO-002": "公会宪章", "PRO-003": "记录与图鉴", "PST-001": "首部编年史抉择", "PST-002": "誓约季审核", + "PST-003": "誓约季结果", "SET-001": "设置", "SET-002": "显示与文字", "SET-003": "动效与闪烁", "SET-004": "音频与字幕", "SET-005": "控制方式", "SET-006": "语言与地区", "SET-007": "玩法信息", "SET-008": "存档与数据", "SET-009": "重置与删除", }; @@ -391,8 +395,22 @@ const zhText = { "Enemies": "敌人", "Bosses": "首领", "Regions": "区域", - "Six critical review groups": "六组关键体验审核", + "Seven critical review groups": "七组关键体验审核", "Open group ›": "打开该组 ›", + "Opening company": "开局队伍", + "Market hire": "集市招募", + "Formation and equip": "站位与装备", + "Horizontal battle": "横向自动战斗", + "Result and recovery": "结果与恢复", + "Catalog and settings": "图鉴与设置", + "Charter and final choice": "公会宪章与终章选择", + "Four stable offers, exactly-two gating, revision, atomic receipt and first-Market handoff.": "四名固定候选、恰好选两人、原子回执与首个集市交接。", + "Two separate affordable base hires move Company 2 → 3 → 4 while capacity remains 4.": "两次独立且可负担的基础招募让队伍从2人增至3人再增至4人,出战容量始终为4。", + "Behavior delta and one rear-left to front-right line with exposed position 0.": "展示装备行为变化,以及从左后排到右前排、0号位暴露的单横列。", + "Automatic execution, one ordered line, urgent cause, pause, speed, inspect and retreat review.": "自动执行、单横列、紧急原因、暂停、速度、查看与撤退审核。", + "Earliest divergence precedes totals; loss, reward, recovery and abandonment remain distinct.": "先解释最早分歧,再显示汇总;损失、奖励、恢复与放弃彼此独立。", + "Searchable current counts plus EN/zh_CN, 130%, contrast, captions, reduced motion and input states.": "可搜索完整数量,并检查中英文、130%文字、对比度、字幕、减少动效和输入状态。", + "Spend Renown only for breadth, then compare finite closure with a new generated Oath Season run.": "声望只购买玩法广度,并比较有限结局与生成全新队伍的誓约季。", }; const screenPurposeZh = { @@ -517,12 +535,35 @@ const stageDetails = { "OUT-005": ["Contract clear", "Renown +4", "Discoveries 7"], "OUT-006": ["Closes this run", "Coin and Credit cleared", "History retained"], "PRO-001": ["Capacity milestone 4 > 5", "Hearthguard branch visible", "One choice pending"], - "PRO-002": ["Profession breadth 18/42", "Region routes 3/8", "No permanent power"], - "PST-001": ["Profession Mastery", "Catalog Completion", "Oath Contracts"], - "PST-002": ["Oath: Narrow Company", "Difficulty: Standard", "Ordinary New Run remains"], - "PST-003": ["Challenge cleared", "Rules that mattered: 2", "Record receipt applied"], + "PRO-002": ["Renown 34", "Eight Region seals", "Breadth only - no permanent power"], + "PST-001": ["Final boss settled", "Company archives on both choices", "Ordinary New Run remains"], + "PST-002": ["Optional Oath laws", "New generated Company", "Ordinary New Run remains"], + "PST-003": ["Oath challenge cleared", "Rules that mattered: 2", "Record and Renown receipts applied"], }; +const guildCharterRegions = [ + ["RG-01", "Windglass Verge", "风镜原野"], + ["RG-02", "Ember Archive", "余烬典库"], + ["RG-03", "Rainbell Reach", "雨钟长境"], + ["RG-04", "Violet Causeway", "紫辉堤道"], + ["RG-05", "Hollow Meridian", "空鸣子午线"], + ["RG-06", "Sunken Loom", "沉没织庭"], + ["RG-07", "Starwake Crown", "星醒王冠"], + ["RG-08", "Aetherbound Spire", "以太盟誓塔"], +]; + +const charterPackets = [ + { id: "CH-R3-CATALOG", cost: 8, family: ["Catalog packet", "图鉴扩展包"], title: ["Rainline Implements", "雨线器具"], effect: ["Adds six sidegrade equipment rows to eligible future Markets.", "向未来符合条件的集市加入六件侧向选择装备。"], prerequisite: ["Region 03 first Contract clear", "完成第三区域首个契约"] }, + { id: "CH-R3-THREAT", cost: 10, family: ["Threat archive", "威胁档案"], title: ["Pressure Forecast II", "压力预报 II"], effect: ["Shows displacement order for encountered Rainbell enemy families.", "显示已遭遇雨钟敌人家族的位移顺序。"], prerequisite: ["Inspect three Rainbell enemy families", "查看三类雨钟敌人"] }, + { id: "CH-R3-OATH", cost: 16, family: ["Oath law", "誓约法则"], title: ["Measured Supply", "定量补给"], effect: ["Adds one optional postgame Market law with its completion Record.", "加入一条可选终局集市法则及其完成记录。"], prerequisite: ["Complete both Region 03 Contracts", "完成第三区域的两个契约"] }, +]; + +const oathLawCatalog = [ + { id: "measured-supply", title: ["Measured Supply", "定量补给"], effect: ["Markets show fewer offers; each lock costs less.", "集市报价更少,但每次锁定费用降低。"], status: ["Eligible", "可用"] }, + { id: "broken-front", title: ["Broken Front", "破阵前线"], effect: ["Front position begins Exposed; rear control rewards increase.", "前排开局处于暴露状态,后排控制奖励提高。"], status: ["Eligible", "可用"] }, + { id: "named-pressure", title: ["Named Pressure", "具名压力"], effect: ["One elite family is revealed before each risk choice.", "每次风险选择前揭示一个精英敌人家族。"], status: ["Charter clue 1/1", "宪章线索 1/1"] }, +]; + const settingRows = { "SET-001": [["Display and text", "115%"], ["Motion and power", "Reduced"], ["Audio and captions", "Captions on"], ["Controls", "Touch + keyboard"]], "SET-002": [["UI and text scale", "100 / 115 / 130"], ["Safe area", "Reference"], ["High contrast", "Off"], ["Color-independent cues", "On"]], @@ -538,6 +579,7 @@ const settingRows = { const $ = (selector, root = document) => root.querySelector(selector); const $$ = (selector, root = document) => [...root.querySelectorAll(selector)]; const t = (key) => copy[state.locale][key] || copy.en[key] || key; +const bi = (en, zh) => state.locale === "zh_CN" ? zh : en; function escapeHtml(value = "") { return String(value) @@ -790,6 +832,54 @@ function renderGuild(screen, variant) { return frame(screen, body, { variant }); } +function charterPrerequisite(index, region) { + const name = bi(region[1], region[2]); + if (index === 0) return bi(`Clear ${region[0]} Contract 1`, `完成${name}的首个契约`); + if (index === 1) return bi(`Inspect three ${name} enemy families`, `查看三类${name}敌人`); + return bi(`Complete both ${region[0]} Contracts`, `完成${name}的两个契约`); +} + +function renderGuildCharter(screen, variant) { + const region = guildCharterRegions[state.charterRegionIndex]; + const packet = charterPackets[state.charterPacketIndex]; + const remaining = 34 - packet.cost; + const regionName = bi(region[1], region[2]); + const body = `
+
${bi("GUILD CHARTER · BREADTH ONLY", "公会宪章 · 仅扩展玩法广度")}

${bi("Shape future Companies", "规划未来队伍的选择空间")}

${bi("Tap a Region, then Tap a packet. Every claim changes future-run options, never permanent combat power.", "点击区域,再点击扩展包。所有领取只改变未来远征的选择,不增加永久战斗数值。")}

${bi("RENOWN", "声望")}34${bi("Persistent breadth resource", "永久广度资源")}
+
${guildCharterRegions.map((entry, index) => ``).join("")}
+
${region[0]}${regionName}${bi("Tap one packet to preview", "点击一个扩展包查看详情")}
${charterPackets.map((entry, index) => ``).join("")}
+ +
+
`; + return frame(screen, body, { variant, art: false, context: bi("Guild Charter", "公会宪章"), resources: false }); +} + +function renderChronicleDecision(screen, variant) { + const choice = state.chronicleChoice; + const details = choice === "chronicle" + ? [bi("Finite ending and Final Ledger", "观看有限结局与最终账册"), bi("Return to Title", "随后返回标题页")] + : [bi("Enter Oath Season hub", "进入誓约季大厅"), bi("Review laws, then generate a new Company", "审核法则后生成一支全新队伍")]; + const body = `
${bi("FINAL BOSS SETTLED · FIRST CLEAR", "最终首领已结算 · 首次通关")}

${bi("How will the Guild record this victory?", "公会将如何记录这场胜利?")}

${bi("Both choices close this run and archive the surviving Company.", "两个选择都会结束本轮远征,并把幸存队伍存入历史记录。")}

+
✓
${bi("SHARED RESULT", "共同结果")}

${bi("Company archived as Records · Coin and Credit close · Renown and discoveries retained · no Recruit remains playable", "队伍存入记录 · 金币与补员凭证清零 · 保留声望与发现 · 不会保留任何可继续使用的队员")}

+
+ +
`; + return frame(screen, body, { variant, art: false, context: bi("Final Ledger", "最终账册"), resources: false }); +} + +function renderOathSeason(screen, variant) { + const selected = new Set(state.oathLaws); + const body = `
${bi("OATH SEASON · NEW GENERATED RUN", "誓约季 · 全新生成远征")}

${bi("Choose laws that change valuation", "选择会改变决策价值的法则")}

${bi("The cleared Company is archived and cannot be selected here.", "已通关队伍已存档,无法在这里继续选择。")}

+
${oathLawCatalog.map((law, index) => ``).join("")}
+
`; + return frame(screen, body, { variant, art: false, context: bi("Oath Season", "誓约季"), resources: false }); +} + +function renderOathResult(screen, variant) { + const body = `
${bi("OATH SEASON RESULT", "誓约季结果")}

${bi("The Company held under changed laws", "队伍在变更法则下完成了远征")}

${bi("Result receipts are complete. This generated Company is now a Record.", "结果回执已完成。这支生成队伍现已存入记录。")}

01${bi("Measured Supply", "定量补给")}

${bi("Fewer offers changed refresh and lock timing in five Markets.", "更少的报价改变了五个集市中的刷新与锁定时机。")}

02${bi("Broken Front", "破阵前线")}

${bi("Front exposure made rear control the decisive counter twice.", "前排暴露让后排控制两次成为关键应对。")}

${bi("RECEIPTS", "结算回执")}

${bi("Oath Record", "誓约记录")} +1

${bi("Renown", "声望")} +6

${bi("Archived Company", "存档队伍")} · 8 ${bi("survivors", "名幸存者")}

${bi("The closed Company cannot be resumed.", "已结束的队伍无法继续使用。")}
`; + return frame(screen, body, { variant, art: false, context: bi("Oath Result", "誓约结果"), resources: false }); +} + function renderSystem(screen, variant) { if (screen.id === "SYS-005") return renderOpening(screen, variant === "primary" ? "offers2" : variant); if (screen.id === "SYS-003") { @@ -813,6 +903,10 @@ function renderArtifact(screen, variant) { } function renderProgress(screen, variant) { + if (screen.id === "PRO-002") return renderGuildCharter(screen, variant); + if (screen.id === "PST-001") return renderChronicleDecision(screen, variant); + if (screen.id === "PST-002") return renderOathSeason(screen, variant); + if (screen.id === "PST-003") return renderOathResult(screen, variant); if (screen.id === "PRO-003") { const body = `
COMPENDIUM
${state.data.professions.slice(0, 6).map((entry, index) => ``).join("")}
`; return frame(screen, body, { variant, art: false }); @@ -967,9 +1061,10 @@ function renderReview() { ["04", "Horizontal battle", "BAT-001..006", "Automatic execution, one ordered line, urgent cause, pause, speed, inspect and retreat review.", "screens", "BAT-002"], ["05", "Result and recovery", "OUT-001..006", "Earliest divergence precedes totals; loss, reward, recovery and abandonment remain distinct.", "screens", "OUT-001"], ["06", "Catalog and settings", "PRO-003 · SET-001..009", "Searchable current counts plus EN/zh_CN, 130%, contrast, captions, reduced motion and input states.", "catalogs", "professions"], + ["07", "Charter and final choice", "PRO-002 · PST-001..003", "Spend Renown only for breadth, then compare finite closure with a new generated Oath Season run.", "screens", "PRO-002"], ]; return `
- ${viewHeading("OWNER DECISION SURFACE", "Six critical review groups", "Each group opens the real composition used in the 50-state atlas.", ["Design review only", "Human gate open"])} + ${viewHeading("OWNER DECISION SURFACE", "Seven critical review groups", "Each group opens the real composition used in the 50-state atlas.", ["Design review only", "Human gate open"])}
${groups.map((group) => `
${group[0]}
${group[2]}

${group[1]}

${group[3]}

`).join("")}
Machine-verifiable50 unique states · current counts · responsive layout · interactions · self-contained bundle
Owner remains responsibleComprehension · visual acceptance · fun · listening · device ergonomics · development approval
`; @@ -1068,6 +1163,26 @@ function handleClick(event) { state.catalogFilter = button.dataset.catalogFilter; return render(); } + if (button.hasAttribute("data-charter-region")) { + state.charterRegionIndex = Number(button.dataset.charterRegion); + state.charterPacketIndex = 0; + return render(); + } + if (button.hasAttribute("data-charter-packet")) { + state.charterPacketIndex = Number(button.dataset.charterPacket); + return render(); + } + if (button.dataset.chronicleChoice) { + state.chronicleChoice = button.dataset.chronicleChoice; + return render(); + } + if (button.dataset.oathLaw) { + const id = button.dataset.oathLaw; + const index = state.oathLaws.indexOf(id); + if (index >= 0) state.oathLaws.splice(index, 1); + else state.oathLaws.push(id); + return render(); + } if (button.dataset.offerId) { const id = button.dataset.offerId; const index = state.openingSelected.indexOf(id); diff --git a/prototype/site/data/catalog.json b/prototype/site/data/catalog.json index e02f65e7..bb15a823 100644 --- a/prototype/site/data/catalog.json +++ b/prototype/site/data/catalog.json @@ -1,7 +1,7 @@ { "version": 2, "status": "design-prototype-current-authority", - "authorityRevision": "recruit-line-design-r3", + "authorityRevision": "guild-charter-integration-r4", "counts": { "screens": 50, "professions": 42, @@ -375,13 +375,13 @@ }, { "id": "PRO-002", - "name": "Persistent progression", + "name": "Guild Charter", "input": "LIST", - "purpose": "Show unlock breadth, new planning grammar, prerequisite evidence, and claimed receipts across runs.", - "action": "Claim or inspect a sourced unlock.", - "emptyLoading": "First-run state explains when evidence can be earned. Loading uses stable unlock IDs.", - "errorConfirmation": "Unknown future content remains undisclosed; duplicate claim returns receipt. Confirmation states how new runs change.", - "interruptionReturn": "Suspend retains filters. Back returns to Title, Guild, or Run End caller." + "purpose": "Show current Renown, eight horizontal Region seals, prerequisite tracks, breadth-only packet cards, exact costs, future-run effects, and claimed receipts without resembling a radial power tree.", + "action": "Tap a Region seal, Tap one eligible packet, then review and claim it; the receipt changes future-run catalog, trial, threat-information, or Oath-law breadth and never raw power.", + "emptyLoading": "First-run state explains how Renown is earned and keeps all eight seals visible. Loading reserves stable claim IDs and disables packet selection until cost, prerequisites, and effect resolve.", + "errorConfirmation": "Unknown content stays undisclosed. Failed prerequisites and insufficient Renown preserve selection with reasons; duplicate claim returns its receipt. Confirmation shows before/after Renown, prerequisites, future-run effect, and No permanent combat power.", + "interruptionReturn": "Suspend retains selected Region, packet and scroll anchor. Back before commit spends nothing; after commit it verifies the receipt and returns to Title, Guild, or Run End caller." }, { "id": "PRO-003", @@ -395,33 +395,33 @@ }, { "id": "PST-001", - "name": "Postgame hub", - "input": "NAV", - "purpose": "Present eligibility, sourced rules, open challenges, prior results, and the distinction from an ordinary run.", - "action": "Open rules review; does not start immediately.", - "emptyLoading": "No eligible modifier states the next sourced requirement. Loading preserves ordinary New Run access.", - "errorConfirmation": "Missing BIND:POSTGAME disables entry and names source. No confirmation.", - "interruptionReturn": "Suspend preserves selected challenge. Back returns to Title." + "name": "First Chronicle decision", + "input": "SELECT", + "purpose": "After the sixteenth boss and verified settlement, compare Complete the First Chronicle with Open the Oath Season; state that both archive the surviving Company and close the run.", + "action": "Tap one choice, review its destination, then confirm: Chronicle shows the finite ending/Final Ledger and Title; Oath Season opens postgame rule review for a new generated run.", + "emptyLoading": "Before final eligibility, show the exact remaining boss requirement while ordinary New Run remains visible. Loading keeps the verified final-boss receipt and disables both commits.", + "errorConfirmation": "Missing settlement, unresolved casualty/reward, or stale first-clear state blocks both choices. Confirmation repeats archived Company, closed Coin/Credit, retained Records/Renown, destination, and no playable Recruit carryover.", + "interruptionReturn": "Suspend retains the uncommitted choice and final receipt. Back stays in final result. After receipt, resume at Final Ledger/Title or Oath Season hub; never reopen the cleared run." }, { "id": "PST-002", - "name": "Postgame run review", + "name": "Oath Season hub and run review", "input": "SELECT", - "purpose": "Compare active postgame modifiers, known consequences, difficulty, save slot, and carried unlock breadth.", - "action": "Begin postgame run; creates a new run with the reviewed rules.", - "emptyLoading": "No compatible selection blocks Begin with reason. Loading verifies every modifier ID.", - "errorConfirmation": "Conflict, expired ruleset, or slot collision preserves selection. Confirmation lists every active modifier and irreversible setup choice.", - "interruptionReturn": "Suspend saves the uncommitted form. Cancel returns to Postgame hub." + "purpose": "Compare eligible Oath laws, conflicts, known consequences, difficulty, save slot, Guild Charter breadth, and the distinction from ordinary New Run.", + "action": "Tap laws to assemble a compatible set, review the complete rules, then create a new generated run; no cleared Recruit is selectable.", + "emptyLoading": "No eligible law explains its Charter requirement and still offers ordinary New Run. Loading verifies modifier, profile and slot IDs before Begin.", + "errorConfirmation": "Conflict, expired ruleset, missing eligibility, or slot collision preserves selection with reasons. Confirmation lists every active law, difficulty, generated-run promise, and irreversible setup choice.", + "interruptionReturn": "Suspend saves the uncommitted form. Cancel returns to Title/postgame hub. Interruption after receipt opens the new run's provisional Recruit offers." }, { "id": "PST-003", - "name": "Postgame result", + "name": "Oath Season result", "input": "LIST", - "purpose": "Explain challenge outcome, rules that mattered, record change, rewards, and next legal attempt.", - "action": "Finish result; applies verified record and reward receipts.", - "emptyLoading": "No record change is stated without negative framing. Loading waits for receipts.", - "errorConfirmation": "Duplicate or invalid score is separated from local clear status. Finish confirmation only when an unresolved claim exists.", - "interruptionReturn": "Suspend preserves the result. Back stays within result tabs; Finish returns to Postgame hub." + "purpose": "Explain challenge outcome, laws that mattered, Record change, earned Renown, archived generated Company, and next legal attempt.", + "action": "Finish result; applies verified Record/Renown receipts and returns to the Oath Season hub, Final Ledger, or ordinary New Run.", + "emptyLoading": "No Record or Renown change is stated plainly. Loading waits for all receipts and preserves ordinary New Run access.", + "errorConfirmation": "Duplicate or invalid score is separated from local clear status. Finish confirmation appears only while a claim remains unresolved.", + "interruptionReturn": "Suspend preserves the result. Back stays within result tabs; Finish never resumes the closed Company." }, { "id": "SET-001", diff --git a/prototype/site/index.html b/prototype/site/index.html index 2398ac04..d68e4982 100644 --- a/prototype/site/index.html +++ b/prototype/site/index.html @@ -25,7 +25,7 @@ - +