diff --git a/README.md b/README.md index 6e1c3158..8765d2be 100644 --- a/README.md +++ b/README.md @@ -2,22 +2,21 @@ An original landscape 2D Japanese hand-drawn guild-expedition strategy game. -This repository is currently in **complete pre-production design**. Formal game +This repository is currently in **pre-development design review**. Formal game implementation, bulk final-asset production, packaging, and publishing are forbidden until the owner approves the complete product, content, presentation, balance, and interactive-design package. ## Current Product Boundary -- 30 named recruitable characters -- 12 base professions and 24 advanced professions -- 100 enemy combat identities across 8 chapters -- 320 equipment and item entries -- 25-35 hour first campaign, 60-80 hour build completion, roughly 100 hour - collection and high-difficulty completion target +- Generated run-bound Recruits with no fixed story protagonists +- 12 base, 24 advanced, and 6 hidden Professions; 36 mechanical Traits +- 320 equipment identities and 60 run-wide Artifacts +- 100 ordinary/elite enemies and 16 bosses across 8 Regions +- 15-25 hour first clear and 60+ hour mastery breadth - Landscape 16:9, premium cross-platform target, English and Simplified Chinese -- 2D Japanese hand-drawn presentation using layered rigs, equipment layers, - authored key poses, and unique portraits/illustrations +- 2D Japanese hand-drawn presentation using modular Recruit assemblies, + profession/equipment overlays, authored key poses, and readable silhouettes The game may learn structural lessons from authorized private reference research, but its setting, characters, enemies, names, art, audio, UI, @@ -25,22 +24,24 @@ progression, formulas, and expression must be original. ## Review The Design -The current owner-facing HTML in [`prototype/site/`](prototype/site/) is a -**coverage audit**, not a completed UI prototype. Owner review on 2026-08-10 -proved that generic specification templates were not understandable as game -screens. Its page browser now distinguishes one dedicated page, 40 shared -family mockups, and 41 pages whose UI is still missing. +The owner-facing HTML in [`prototype/site/`](prototype/site/) is the current +responsive landscape design prototype. It replaces the superseded coverage +audit and reads the current authorities directly when the Gallery bundle is +built. -1. **Flow specification:** inspect the required 17-step title-to-restoration - order; do not treat it as a validated clickable experience. -2. **Eight chapters:** inspect route, battle, and restored-world direction for - every chapter. -3. **Page coverage:** inspect all 82 requirements and identify which screens - still need a dedicated composition. -4. **Content:** search all 30 characters, 36 professions, 100 enemies, 320 - items, 48 achievements, and 20 collections. -5. **Production and readiness:** inspect the art/audio scope and the gates that - remain open before runtime development. +1. **First play:** inspect 23 states from Contract setup through two-of-four + run creation, two separate Market hires, party ordering, risk, automatic + battle, diagnosis, reward, equipment adaptation, casualty, and recovery. +2. **Screen atlas:** inspect exactly 50 current page/state IDs. Every ID has a + page-specific composition plus loading/empty, error/confirmation, and + interruption/return variants; `SYS-005` exposes its five staged states. +3. **Regions:** inspect all eight Region directions, encounter pressure, enemy + 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 + comprehension, visual, fun, listening, and device approval separate from + deterministic HTML checks. Run it locally from the repository root: @@ -59,12 +60,20 @@ relative CSS, JavaScript, JSON, or image requests: python3 tools/build_gallery_bundle.py ``` +The build command regenerates `prototype/site/data/catalog.json`, verifies the +current exact counts and unique IDs, and writes +`prototype/gallery/aetherbound-guild-prototype.html`. Browser verification is +in `prototype/site/verify-r6.js`; it requires an already-provisioned Playwright +Node module and Chrome, starts no external service, and writes screenshots to +`prototype/gallery/evidence/r6/`. + ## Evidence Boundary -The HTML is an interactive **design prototype**, not a playable build. Its four -AI-generated boards are concept direction only. The UI chrome and readable text -are authored in HTML; no concept board is a final background, sprite, item icon, -animation, integrated asset, runtime screenshot, or human-approved result. +The HTML is an interactive **design prototype**, not a playable build. Existing +image boards are labeled concept direction only. The current one-line party, +transactions, readable UI, stable IDs, and text are independently authored in +HTML; no board is a final background, sprite, item icon, animation, integrated +asset, runtime screenshot, or human-approved result. See [`docs/README.md`](docs/README.md) for the complete authority map and [`docs/reviews/PRE_DEVELOPMENT_READINESS_AUDIT.md`](docs/reviews/PRE_DEVELOPMENT_READINESS_AUDIT.md) diff --git a/docs/prototype/INTERACTIVE_PROTOTYPE_SPEC.md b/docs/prototype/INTERACTIVE_PROTOTYPE_SPEC.md index d63e7d56..eeed8372 100644 --- a/docs/prototype/INTERACTIVE_PROTOTYPE_SPEC.md +++ b/docs/prototype/INTERACTIVE_PROTOTYPE_SPEC.md @@ -1,141 +1,217 @@ # Aetherbound Guild: Interactive Design Prototype -> Scope: reviewable pre-production HTML. It visualizes the approved product, -> content, screen, art, and audio specifications without implementing game -> simulation, save behavior, packaging, or final runtime assets. +> Scope: owner-reviewable, pre-development landscape HTML. +> +> Authority: current product contract, `SCREEN_AND_STATE_MAP`, +> `UI_AND_VISUAL_SYSTEM`, content catalogs, and art/audio production catalogs. +> +> Boundary: design prototype only. It contains no battle simulation, save +> implementation, engine runtime, final media, packaging, store, or release +> work. -## 1. Review Decisions +## 1. Owner Decisions -The prototype must let the owner decide whether: +The prototype gives the Owner one visible artifact for deciding whether: -1. the landscape 2D hand-drawn direction fits the intended game; -2. the player can recognize Guild, company, route, battle, diagnosis, reward, - restoration, records, and settings without a card-wall interface; -3. the 82-screen requirement inventory and eight chapters are present, while - unfinished UI is labeled as unfinished rather than presented as complete; -4. formation, telegraph, Directive, Cache, Anchor, Strain, profession, and item - concepts are sufficiently visible to proceed to a dynamic vertical slice; -5. any page family or chapter direction should be redesigned before runtime - work begins. +1. the opening Company choice is understandable and does not recommend a build; +2. Market valuation, formation order, equipment deltas, risk, and automatic + battle causality read as one complete game loop; +3. death, equipment return, Replacement Credit, recovery, dismissal, and run + abandonment remain distinct; +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. -Owner approval of the HTML is design approval only. It does not approve engine -implementation, paid bulk art/audio, packaging, publishing, or release. +HTML approval remains design approval only. Comprehension, visual quality, fun, +listening, device ergonomics, packaging, store, and release stay separate human +gates. -## 2. Information Architecture +## 2. Gallery Information Architecture -The gallery uses a persistent left navigation on desktop and a compact drawer -on narrow screens. The right side presents one review subject at a time with -ample margin and no tiled wall of tiny screenshots. +The gallery exposes one primary subject at a time: ```text -Overview -|- Product thesis and complete loop -|- Quantitative scope -`- Production/evidence boundary - -Game Screens -|- System / Guild / Workshop / Records -|- World / Expedition / Battle / Results / Settings -`- 82 individually selectable screen specifications - -Chapters -|- CH-01..CH-08 -`- route, battlefield, and restoration states - -Content -|- 30 Characters -|- 36 Professions -|- 100 Enemies -|- 320 Items -`- 48 Achievements / 20 Collections - -Production -|- Art and animation -|- Music, ambience, voice and SFX -|- CH-01 dynamic slice -`- Development-readiness gates +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) ``` -## 3. Game Screen Presentation +Desktop and tablet use a persistent left rail. Phone layouts use an off-canvas +drawer. The game canvas remains a stable `16:9` composition and the viewer +provides 75-200% zoom without altering the source state. -Every screen entry shows: +## 3. Current Screen Inventory -- one landscape `16:9` game-stage mockup at a stable aspect ratio; -- page ID/name and the three-second focal order; -- the main action, required variants, and safe exit; -- status chips declaring `design spec`, `concept art`, and open evidence gates; -- previous/next page actions plus direct selection from the left list; -- a full-size viewing mode without cropping the game canvas. +The prototype contains exactly the 50 IDs in `SCREEN_AND_STATE_MAP` Section 5: -Owner review on 2026-08-10 rejected the shared-template result as -incomprehensible. The coverage audit found `1` dedicated page, `40` shared -family mockups, and `41` pages without an individual UI composition. A shared -template is not a completed page. Until this gap is closed, the HTML may expose -requirements and coverage but must not call itself a complete UI prototype. +| Family | IDs | Count | +|---|---|---:| +| System and run entry | `SYS-001..SYS-008` | 8 | +| Guild and forecast | `HUB-001..HUB-002` | 2 | +| Market | `SHP-001..SHP-003` | 3 | +| Roster and dismissal | `REC-001..REC-003` | 3 | +| Equipment and Artifacts | `EQP-001..EQP-002`, `ART-001` | 3 | +| Party and risk | `PTY-001..PTY-002`, `RSK-001..RSK-002` | 4 | +| Automatic battle | `BAT-001..BAT-006` | 6 | +| Result and recovery | `OUT-001..OUT-006` | 6 | +| Progression and postgame | `PRO-001..PRO-003`, `PST-001..PST-003` | 6 | +| Settings and data | `SET-001..SET-009` | 9 | +| **Total** | | **50** | -## 4. Compressed Click Path +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. -The clickable experience uses these states: +## 4. Critical Review Groups + +### 4.1 Opening Two Of Four + +`SYS-005` shows four equal-size stable generated Recruit offers. Each offer +names its stable ID, base Profession, Trait benefit/cost read, and no-Coin +status. Select and Inspect are separate. The Company begins with no selection; +Review Company enables only at `2/2`; creation review keeps the unchosen IDs +visible as `Not retained`; pending input is fixed-size; the receipt separates +`Company 2` from `Line capacity 4`. + +### 4.2 Market Hire + +`SHP-001/002` expose three Recruit offers, four equipment offers, and three +battle offers through separate tabs. The first Market shows affordable base +offers without a recommendation treatment. Two distinct hire reviews and +receipts advance `Company 2 -> 3 -> 4` while Line capacity remains `4`. + +### 4.3 Formation And Equipment + +`EQP-001/002` lead with the behavior-changing before/after comparison. +`PTY-001/002` stage one horizontal cord from protected rear at left to exposed +front at right; position `0` is the rightmost occupied marker. Reorder works by +select-then-destination semantics; drag is never required. + +### 4.4 Horizontal Automatic Battle + +`BAT-001..006` show the allied rear-left/front-right order, enemy side, action +gap, urgent forecast, objective, pause, `1x/2x/4x`, inspect, event log, captions, +retreat review, and static resume review. No control inserts an attack or skill +into the deterministic timeline. + +### 4.5 Result, Reward, And Recovery + +`OUT-001` leads with the first meaningful divergence on an expected/actual +timeline. `OUT-002` keeps the generated Recruit readable while naming permanent +loss, equipment return, party gap, and Credit. `OUT-003` presents equal reward +regions. `OUT-004` presents complete recovery transactions. Run end and +voluntary abandonment remain separate in `OUT-005/006`. + +### 4.6 Catalog And Settings + +`PRO-003` and the Gallery Catalogs expose stable IDs, names, mechanics, +tradeoffs, counterplay, and exact counts. `SET-001..009` use segmented controls, +switches, menus, remap rows, and destructive review. English and Simplified +Chinese, 100/115/130% text state, high contrast, reduced motion, captions, and +low-power state are interactive. + +## 5. Complete First-Play Chain + +The 23 review states cover the real first-play handoffs: ```text -Title SYS-004 --> Guild GLD-001 --> Formation GLD-005 --> World WLD-001 --> Route EXP-002 --> Encounter Preview EXP-004 --> Battle BAT-002 --> Directive BAT-005 / target BAT-006 / review BAT-007 --> Victory RES-001 / Diagnosis RES-002 --> Reward EXP-008 / Cache EXP-009 --> Anchor EXP-010 --> Restoration RES-005 --> Guild transformed GLD-001 +SYS-005 Contract +-> four stable offers 0/2 -> 1/2 -> 2/2 +-> creation review -> pending -> receipt +-> SHP-001 Company 2/4 +-> SHP-002 hire 1 -> SHP-001 Company 3/4 +-> SHP-002 hire 2 -> SHP-001 Company 4/4 +-> PTY-001 reorder +-> RSK-001 compare -> RSK-002 commit +-> BAT-001 opening -> BAT-002 live -> BAT-003 inspect +-> OUT-001 diagnosis -> OUT-003 reward +-> EQP-002 adaptation +-> OUT-002 casualty -> OUT-004 recovery ``` -This currently proves only the required node order. It does not yet prove -navigation comprehension or information hierarchy because several core nodes -still lack their own page design. It also does not simulate combat formulas, -persistence, pacing, audio, touch feel, or fun. +The chain is a design interaction, not a gameplay simulation. It makes the +intended decision and transaction boundaries visible without inventing prices, +combat formulas, save behavior, or random results. -## 5. Visual Assets In This Prototype +## 6. Content And Region Scope -Four paid image calls are the fixed task ceiling and have been used: +`tools/build_gallery_bundle.py` parses the current Markdown tables and fails on +any missing or duplicate identity. The generated payload contains: -- CH-01 battle concept; -- CH-01..04 environment grid; -- CH-05..08 environment grid; -- character/profession/enemy/item element grid. +| Catalog | Exact total | +|---|---:| +| Professions | 42 (`12` base, `24` advanced, `6` hidden) | +| Traits | 36 | +| Equipment | 320 | +| Artifacts | 60 | +| Ordinary/elite enemies | 100 | +| Bosses | 16 | +| Regions | 8 | -All outputs are `concept` evidence. The gallery may crop/slice them for review, -but cannot call them final backgrounds, sprites, icons, integrated assets, or -runtime screenshots. UI text and controls are authored in HTML so they remain -legible and do not depend on generated text. +Region pages expose `RG-01..RG-08`, current pressure, encounter grammar, +ordinary/elite assignments, and two bosses each. Existing image boards remain +labeled visual direction and never override current Region names or mechanics. -## 6. Responsive Contract +## 7. Responsive And Interaction Contract -- Desktop: 280 px navigation, centered content, game canvas max 1440 px. -- Tablet: 230 px navigation, canvas remains fully visible. -- Phone portrait: navigation becomes a drawer; the canvas fits width and opens - in a full-screen viewer for close inspection. -- Phone landscape: content uses the full safe width and hides nonessential - gallery chrome while the viewer is active. -- No design image uses `cover` where cropping would hide the intended screen. -- Long specifications wrap below the canvas rather than overlap it. +- Desktop: `1440x1000` evidence with persistent navigation and full game stage. +- Tablet: `1024x768` evidence with persistent navigation and a fully visible + battle composition. +- Phone portrait: `390x844` evidence; navigation is a drawer and the complete + four-offer canvas fits the content width. +- Phone landscape: `844x390` evidence; gallery chrome compresses and the entire + battle canvas fits the first viewport. +- Page switching, group filters, previous/next, first-play states, catalog + search/filter, Region tabs, EN/zh_CN, settings states, viewer open/close, and + 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. -## 7. Prototype Acceptance +## 8. Build And Evidence -- [x] All 82 screen IDs appear exactly once in the screen selector. -- [x] Coverage is reported truthfully as 1 dedicated / 40 family / 41 missing. -- [ ] All 82 requirements have page-specific, player-readable UI compositions. -- [ ] All 17 core-flow nodes have dedicated UI and pass owner comprehension. -- [x] All eight chapters and 24 chapter screen families are represented. -- [x] Content indexes show 30/36/100/320/48/20 exact counts. -- [x] Core click path reaches restoration without a dead control. -- [x] Desktop, tablet, phone portrait, and phone landscape do not overlap or - crop functional content. -- [x] Generated concepts remain labeled honestly and carry task provenance. -- [x] Local links, image paths, JSON, browser verification, Gallery publication, - and Gallery health/share checks pass. -- [x] Owner comprehension failed on the generic screen presentation; visual, - fun, audio, device, and release gates remain explicitly open. +```sh +python3 tools/build_gallery_bundle.py +``` + +This regenerates `prototype/site/data/catalog.json`, validates exact counts, +embeds CSS, JavaScript, JSON, favicon, and concept images, and writes: + +```text +prototype/gallery/aetherbound-guild-prototype.html +``` + +Browser verification is implemented in `prototype/site/verify-r6.js`. With an +already-provisioned Playwright Node module and Chrome: + +```sh +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: + +```text +prototype/gallery/evidence/r6/ +``` + +## 9. Acceptance State + +- [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] 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. +- [x] All eight current Regions and all current catalog counts are searchable or + directly inspectable. +- [x] Desktop, tablet, phone portrait, and phone landscape browser checks pass. +- [x] The self-contained Gallery bundle opens offline with no external request. +- [x] Existing concept boards remain labeled and no paid/final media was added. +- [ ] Owner comprehension, visual acceptance, fun, listening, and device gates. +- [ ] Formal development, runtime media, packaging, store, and release approval. diff --git a/prototype/site/app.js b/prototype/site/app.js index 8ed9a752..a95ff605 100644 --- a/prototype/site/app.js +++ b/prototype/site/app.js @@ -1,119 +1,207 @@ const state = { data: null, - view: "overview", - screenId: "SYS-004", - screenCategory: "ALL", - chapter: 0, - flowIndex: 0, - queries: {}, + view: "firstplay", + locale: "en", + screenId: "SYS-005", + screenGroup: "ALL", + screenVariant: "primary", + flowIndex: 1, + regionIndex: 0, + catalogType: "professions", + catalogFilter: "all", + catalogQuery: "", + openingSelected: [], + partySwapped: false, + battlePaused: false, + battleSpeed: 1, + settings: { + contrast: false, + reducedMotion: false, + captions: true, + lowPower: false, + textScale: "100", + }, }; -const viewNames = { - overview: "总览", - screens: "页面规格与缺口", - flow: "流程规格链", - chapters: "八章画面", - characters: "角色图鉴", - professions: "职业系统", - enemies: "敌人图鉴", - items: "装备与物品", - records: "成就与收藏", - production: "美术与音频生产", - readiness: "开发准备度", +const copy = { + en: { + brandSubtitle: "Final design prototype", + navFirst: "First play", + navScreens: "Screen atlas", + navRegions: "Regions", + navCatalogs: "Catalogs", + navReview: "Review gates", + runtimeFrozen: "Runtime development frozen", + conceptBadge: "Concept direction", + firstplay: "First play", + screens: "Screen atlas", + regions: "Regions", + catalogs: "Catalogs", + review: "Review gates", + prev: "Previous", + next: "Next decision", + back: "Back", + inspect: "Inspect", + compare: "Compare", + concept: "Concept direction - interface authored in HTML", + saved: "Saved", + company: "Company", + capacity: "Line capacity", + protected: "Protected rear", + exposed: "Exposed front", + selected: "Selected", + select: "Select", + reviewCompany: "Review Company", + createRun: "Create Run", + openMarket: "Open First Market", + noCoin: "No Coin cost", + notRetained: "Not retained", + loading: "Loading", + retry: "Retry same state", + returnSafe: "Return safely", + }, + zh_CN: { + brandSubtitle: "最终设计原型", + navFirst: "首次游玩", + navScreens: "页面图谱", + navRegions: "八大区域", + navCatalogs: "完整图鉴", + navReview: "审核闸门", + runtimeFrozen: "运行时开发仍冻结", + conceptBadge: "概念方向", + firstplay: "首次游玩", + screens: "页面图谱", + regions: "八大区域", + catalogs: "完整图鉴", + review: "审核闸门", + prev: "上一步", + next: "下一决策", + back: "返回", + inspect: "查看", + compare: "比较", + concept: "概念方向 - 界面由 HTML 独立绘制", + saved: "已保存", + company: "队伍", + capacity: "出战容量", + protected: "受保护后排", + exposed: "暴露前排", + selected: "已选择", + select: "选择", + reviewCompany: "审核队伍", + createRun: "创建远征", + openMarket: "进入首个集市", + noCoin: "不消耗金币", + notRetained: "不会保留", + loading: "正在载入", + retry: "重试同一状态", + returnSafe: "安全返回", + }, }; -const screenCategoryNames = { - ALL: "全部", - SYS: "系统", - GLD: "公会", - WRK: "工坊", - REC: "档案", - WLD: "世界", - EXP: "远征", - BAT: "战斗", - RES: "结果", - SET: "设置", +const screenNamesZh = { + "SYS-001": "启动与校验", "SYS-002": "首次启动设置", "SYS-003": "标题", "SYS-004": "远征档案", + "SYS-005": "新远征设置", "SYS-006": "继续前审核", "SYS-007": "存档恢复", "SYS-008": "制作与数据说明", + "HUB-001": "公会桌面", "HUB-002": "威胁预报", "SHP-001": "集市", "SHP-002": "招募审核", + "SHP-003": "装备报价审核", "REC-001": "成员名册", "REC-002": "成员详情", "REC-003": "遣散审核", + "EQP-001": "装备工台", "EQP-002": "装备比较", "ART-001": "神器账册", "PTY-001": "队伍横列", + "PTY-002": "出战准备审核", "RSK-001": "风险看板", "RSK-002": "风险承诺", "BAT-001": "战斗开场", + "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": "动效与闪烁", + "SET-004": "音频与字幕", "SET-005": "控制方式", "SET-006": "语言与地区", "SET-007": "玩法信息", + "SET-008": "存档与数据", "SET-009": "重置与删除", }; -const localizedScreenNames = { - "SYS-001": "启动画面", - "SYS-002": "首次无障碍设置", - "SYS-003": "语言与安全区校准", - "SYS-004": "标题首页", - "SYS-005": "游戏存档", - "SYS-006": "新游戏设置", - "SYS-007": "回归摘要", - "SYS-008": "存档恢复", - "SYS-009": "完成度总览", - "SYS-010": "制作人员、许可与数据说明", -}; - -function screenName(screen) { - return localizedScreenNames[screen.id] || screen.name; -} - -function layoutKind(screen) { - const prefix = screen.id.slice(0, 3); - if (screen.id === "SYS-001") return "dedicated"; - if (screen.id === "GLD-005") return "family-formation"; - if (["EXP-002", "EXP-003", "WLD-001", "WLD-002", "WLD-003"].includes(screen.id)) return "family-route"; - if (prefix === "BAT" || ["EXP-004", "RES-001", "RES-002", "RES-003", "RES-004"].includes(screen.id)) return "family-battle"; - if (prefix === "SET") return "family-settings"; - if (prefix === "REC") return "family-records"; - return "missing"; -} - -function coverage(screen) { - const kind = layoutKind(screen); - if (kind === "dedicated") return { key: "dedicated", label: "逐页设计" }; - if (kind.startsWith("family-")) return { key: "family", label: "页面族示意" }; - return { key: "missing", label: "未设计" }; -} - -function reviewCopy(screen) { - if (screen.id === "SYS-001") { - return { - focal: "游戏标志、加载光线、当前载入状态", - action: "无需操作;完成后自动进入首次设置或标题首页", - variants: "首次启动、内容迁移、可恢复载入错误;错误时才显示重试与诊断入口", - }; - } - return screen; -} - -const chapterImages = [ - "assets/web/ch_ch01.webp", - "assets/web/ch_ch02.webp", - "assets/web/ch_ch03.webp", - "assets/web/ch_ch04.webp", - "assets/web/ch_ch05.webp", - "assets/web/ch_ch06.webp", - "assets/web/ch_ch07.webp", - "assets/web/ch_ch08.webp", +const flowSteps = [ + ["SYS-005", "contract", "Contract and difficulty", "契约与难度"], + ["SYS-005", "offers0", "Four stable offers - 0/2", "四个固定候选 - 0/2"], + ["SYS-005", "offers1", "Read one tradeoff - 1/2", "读懂一个取舍 - 1/2"], + ["SYS-005", "offers2", "Choose exactly two - 2/2", "恰好选择两人 - 2/2"], + ["SYS-005", "review", "Creation review", "创建前审核"], + ["SYS-005", "pending", "Atomic creation", "原子化创建"], + ["SYS-005", "receipt", "Run receipt", "远征回执"], + ["SHP-001", "company2", "First Market - Company 2/4", "首个集市 - 队伍 2/4"], + ["SHP-002", "hire1", "First hire review", "第一次招募审核"], + ["SHP-001", "company3", "Company 3/4", "队伍 3/4"], + ["SHP-002", "hire2", "Second hire review", "第二次招募审核"], + ["SHP-001", "company4", "Capacity filled - 4/4", "容量填满 - 4/4"], + ["PTY-001", "reorder", "Order the horizontal line", "调整横向队列"], + ["RSK-001", "compare", "Compare three risks", "比较三种风险"], + ["RSK-002", "commit", "Commit party and exposure", "确认队伍与风险"], + ["BAT-001", "opening", "Battle opening", "战斗开场"], + ["BAT-002", "live", "Automatic resolution", "自动执行"], + ["BAT-003", "inspect", "Inspect first cause", "查看首个因果"], + ["OUT-001", "diagnosis", "Read the divergence", "阅读分歧点"], + ["OUT-003", "reward", "Choose a fixed reward", "选择固定奖励"], + ["EQP-002", "adapt", "Compare one adaptation", "比较一次调整"], + ["OUT-002", "casualty", "Understand permanent loss", "理解永久损失"], + ["OUT-004", "recovery", "Purchase recovery", "购买恢复方案"], ]; -const flowIds = [ - "SYS-004", - "GLD-001", - "GLD-005", - "WLD-001", - "EXP-002", - "EXP-004", - "BAT-002", - "BAT-005", - "BAT-006", - "BAT-007", - "RES-001", - "RES-002", - "EXP-008", - "EXP-009", - "EXP-010", - "RES-005", - "GLD-001", +const screenGroups = { + ALL: "All 50", SYS: "System", HUB: "Guild", SHP: "Market", REC: "Roster", + EQP: "Equipment", ART: "Artifacts", PTY: "Party", RSK: "Risk", BAT: "Battle", + OUT: "Outcome", PRO: "Progress", PST: "Postgame", SET: "Settings", +}; + +const sceneImages = [ + "assets/web/ch_ch01.webp", "assets/web/ch_ch02.webp", "assets/web/ch_ch03.webp", "assets/web/ch_ch04.webp", + "assets/web/ch_ch05.webp", "assets/web/ch_ch06.webp", "assets/web/ch_ch07.webp", "assets/web/ch_ch08.webp", ]; +const generatedOffers = [ + { id: "OFF-01", name: "Elian Rook", profession: "Hearthguard", trait: "Narrow Guard", read: "Intercepts a neighbor / slower steps", mark: "HG" }, + { id: "OFF-02", name: "Nia Orrow", profession: "Farstring", trait: "Patient Start", read: "Rear pressure / delayed first basic", mark: "FS" }, + { id: "OFF-03", name: "Tomas Vale", profession: "Wayrunner", trait: "Open Stance", read: "Reorders safely / briefly Exposed", mark: "WR" }, + { id: "OFF-04", name: "Sable Kest", profession: "Kindhand", trait: "Shared Cup", read: "Restores a neighbor / weaker self-heal", mark: "KH" }, +]; + +const stageDetails = { + "SYS-001": ["Verifying local rules", "Content revision 69f671", "Save lineage healthy"], + "SYS-002": ["Language: English", "Text: 115%", "Captions: On"], + "SYS-003": ["Continue safely", "New Run", "Records"], + "SYS-004": ["Slot 01 - Market, Round 3", "Slot 02 - No run", "Local save verified"], + "SYS-006": ["Last receipt: equipment return", "Next: Recovery", "Snapshot: 00:42.6"], + "SYS-007": ["Local lineage - healthy", "Backup - 12 min older", "Conflict - review required"], + "SYS-008": ["Original design and media", "Offline core play", "No third-party commercial assets"], + "HUB-001": ["Next pressure: projectile screen", "Company ready 4/4", "Last receipt: reward claimed"], + "HUB-002": ["Pane Nibbler - Guard pressure", "Gust Finch - rear projectile", "Confidence: exact"], + "SHP-003": ["Stepback Soles", "After first direct hit: step rear", "Tradeoff: next basic waits"], + "REC-001": ["Deployed 4", "Reserve 1", "Cumulative hires 6"], + "REC-002": ["Nia Orrow - Farstring", "Trait: Patient Start", "Survived 4 battles"], + "REC-003": ["Equipment returns", "No Replacement Credit", "Leaves 3 living recruits"], + "ART-001": ["Open Ledger - active", "Narrow Vanguard - conflict", "2 shared rules inspected"], + "PTY-002": ["Order frozen: 3 > 2 > 1 > 0", "Rear protected", "Known pressure covered"], + "RSK-002": ["Threat: projectile screen", "Reward: equipment choice", "Retreat: one Coin tier"], + "BAT-004": ["Paused at 00:08.4", "Speed 1x / 2x / 4x", "Event log available"], + "BAT-005": ["Retreat resolves after current event", "No fallen recruits", "Return to Market"], + "BAT-006": ["Verified time 00:08.4", "Next event: Pane Bite", "Resume static at 1x"], + "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"], +}; + +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"]], + "SET-003": [["Reduced motion", "On"], ["Reduced flashes", "On"], ["Camera shake", "25%"], ["Low-power mode", "Off"]], + "SET-004": [["Master", "80%"], ["Music", "65%"], ["Effects", "80%"], ["Captions", "Critical + full log"]], + "SET-005": [["Inspect", "I / South"], ["Pause", "Space / Menu"], ["Reorder", "Select then destination"], ["Hold timing", "600 ms"]], + "SET-006": [["Language", "English / 简体中文"], ["Numbers", "Locale format"], ["Text preview", "130%"], ["Reload", "No run change"]], + "SET-007": [["Forecast detail", "Full"], ["Tutorial reminders", "On"], ["Battle log density", "Detailed"], ["Default speed", "1x"]], + "SET-008": [["Local save", "Healthy"], ["Backup", "12 min ago"], ["Offline", "Core play available"], ["Diagnostics", "Export ready"]], + "SET-009": [["Delete current run", "Review"], ["Reset settings", "Review"], ["Reset profile", "Locked"], ["Diagnostics", "Clear"]], +}; + 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; function escapeHtml(value = "") { return String(value) @@ -124,490 +212,459 @@ function escapeHtml(value = "") { .replaceAll("'", "'"); } -function splitIdentity(identity) { - const match = identity.match(/^([^ ]+)\s+(.+)$/); - return match ? { id: match[1], name: match[2] } : { id: identity, name: identity }; +function truncate(value, length = 150) { + const text = String(value || ""); + return text.length > length ? `${text.slice(0, length - 1)}...` : text; +} + +function screenName(screen) { + return state.locale === "zh_CN" ? screenNamesZh[screen.id] || screen.name : screen.name; } function getScreen(id) { return state.data.screens.find((screen) => screen.id === id); } -function chapterNumberFromIdentity(identity) { - const match = identity.match(/CH-(\d{2})/); - return match ? Number(match[1]) : 1; +function flowLabel(step) { + return step[state.locale === "zh_CN" ? 3 : 2]; } -function setView(view, options = {}) { - state.view = view; - if (options.screenId) state.screenId = options.screenId; - if (Number.isInteger(options.chapter)) state.chapter = options.chapter; - history.replaceState(null, "", `#${view}`); - render(); - closeMobileNav(); - $("#content")?.focus({ preventScroll: true }); +function iconButton(symbol, label, attrs = "") { + return ``; } -function viewHeading(eyebrow, title, description, aside = "") { - return ` -
-
- ${escapeHtml(eyebrow)} -

${escapeHtml(title)}

-

${escapeHtml(description)}

-
- ${aside} -
`; +function stageArt(index = 0) { + return ``; } -function metric(value, label) { - return `
${escapeHtml(value)}${escapeHtml(label)}
`; +function conceptLabel() { + return `${escapeHtml(t("concept"))}`; } -function chip(label) { - return `${escapeHtml(label)}`; +function stageHeader(screen, context = "Windglass Verge", resources = true) { + return `
+
${iconButton("‹", t("back"))}${escapeHtml(screen.id)}${escapeHtml(context)}
+
${resources ? `214 Coin0 Credit` : ""}◆ ${escapeHtml(t("saved"))}
+
`; } -function renderOverview() { - const counts = state.data.counts; - return ` -
- ${viewHeading( - "Complete pre-production", - "先把整款游戏设计清楚,再进入开发", - "Aetherbound Guild 是一款横屏 2D 日系手绘的六人编队策略 RPG。玩家不是连续点技能,而是读懂威胁、调整编队与规则、让方案自动执行,并在关键时刻用两次 Directive 改变战局。", - `${chip("25-35 小时主线")} ${chip("一次性买断")} ${chip("iOS / Android / PC / Console")}`, - )} -
- 第一章风车中继战斗概念图:三名冒险者面对机械钟兽 -
- CH-01 DYNAMIC SLICE -

看预告、改规则、验证判断

-

第一视觉焦点是敌方的中心线预告,第二是 Mara 保护后排,第三是可用的 Retune Directive。概念图只确定方向,HUD 和所有文字由真实界面实现。

-
-
-
- ${metric(counts.screens, "页面需求定义;UI 尚未逐页完成")} - ${metric("8 × 3", "章节路线 / 战场 / 修复画面族")} - ${metric(counts.characters, "有姓名、有成长弧的角色")} - ${metric(counts.professions, "12 基础 + 24 进阶职业")} - ${metric(counts.enemies, "具有独立机制的敌人")} - ${metric(counts.items, "逐件定义效果与视觉的装备")} - ${metric("30", "自适应音乐套件")} - ${metric("710", "需要被验证的 SFX 事件身份")} -
-
- PLAYER LOOP -

玩家真正反复做什么

-
-

读懂问题

先看敌人的目标、倒计时、路线压力与奖励风险。所有必要信息在承诺前可见,随机只提出问题,不直接判玩家输。

-

改变方案

调整六人位置、职业、技能、装备、目标策略和 Standing Orders。每个选择都必须改变首个失败点或后续机会。

-

形成世界后果

战斗执行准备,奖励进入 Unsecured Cache;到 Anchor 决定安全与风险。每章修复一种公共服务,并改变下一轮路线。

-
-
-
- REVIEW PATH -

建议你怎么检查

-
-

1. 先看核心流程

从 Title 点到 Guild、编队、地图、路线、战斗、诊断、奖励、Anchor 与修复,判断每一步是否知道为什么要点。

-

2. 再看八章差异

检查每章是否具有不同的环境、学习目标、敌人问题、Boss 测试和永久世界变化,而不是换背景和数值。

-

3. 最后看完整内容

搜索 30 角色、36 职业、100 敌人、320 装备,确认它们都有玩法用途、反制关系和生产需求。

-
-
- -
-
-
`; +function actionDock(primary, secondary = t("inspect"), attrs = "") { + return `
`; } -function artForScreen(screen) { - const prefix = screen.id.slice(0, 3); - if (prefix === "BAT" || ["EXP-004", "RES-001", "RES-002", "RES-003", "RES-004"].includes(screen.id)) { - return "assets/web/ch01_battle.webp"; +function frame(screen, body, options = {}) { + const classes = ["game-stage", `family-${screen.id.split("-")[0].toLowerCase()}`, options.className || ""].filter(Boolean).join(" "); + const art = options.art === false ? "" : stageArt(options.region || 0); + const header = options.header === false ? "" : stageHeader(screen, options.context, options.resources !== false); + return `
+ ${art}
${header}
${body}
${conceptLabel()} +
`; +} + +function renderOpening(screen, variant = "offers2") { + const oneSelected = state.openingSelected.length === 1 ? state.openingSelected : ["OFF-02"]; + const twoSelected = state.openingSelected.length === 2 ? state.openingSelected : ["OFF-02", "OFF-04"]; + const selectionByVariant = { offers0: state.openingSelected, offers1: oneSelected, offers2: twoSelected, review: twoSelected, pending: twoSelected, receipt: twoSelected }; + const selected = selectionByVariant[variant] || state.openingSelected; + if (variant === "contract") { + const body = `
+
RG-01

Windglass Verge

Contract 01 - chart the suspended pane crossing.

+
NEW CONTRACT

Trade Route: First Crossing

+
Known pressure
Push + projectile screen
Boss rule
Rotating damage-family panes
Reward breadth
Base professions + opening tools
Difficulty
Standard - full systems
+
+
`; + return frame(screen, body, { variant, resources: false }); } - if (prefix === "REC") { - if (screen.id === "REC-002") return "assets/web/el_enemies.webp"; - if (screen.id === "REC-003") return "assets/web/el_items.webp"; - return "assets/web/el_heroes.webp"; + if (variant === "review" || variant === "pending" || variant === "receipt") { + const chosen = generatedOffers.filter((offer) => selected.includes(offer.id)); + const unchosen = generatedOffers.filter((offer) => !selected.includes(offer.id)); + const stateBlock = variant === "pending" + ? `
Creating runOperation RUN-CREATE-014
` + : variant === "receipt" + ? `
✓ RUN-CREATE-014${t("company")} 2 / ${t("capacity")} 4The two unchosen offers were not retained.
` + : `
No Coin transactionSlot 01 · StandardTwo unchosen stable IDs will not be retained.
`; + const body = `
${variant === "receipt" ? "RUN RECEIPT" : "COMPANY REVIEW"} +
${chosen.map((offer) => recruitMarker(offer, true)).join("")}
+
${unchosen.map((offer) => `${offer.id} ${offer.name}${t("notRetained")}`).join("")}
+ ${stateBlock} +
${variant !== "pending" ? `` : ""}
+
`; + return frame(screen, body, { variant, resources: false }); } - if (["GLD-003", "GLD-004", "GLD-007", "GLD-008", "GLD-009", "GLD-011", "GLD-012"].includes(screen.id)) { - return screen.id === "GLD-007" ? "assets/web/el_profession_kits.webp" : "assets/web/el_heroes.webp"; + const body = `
+
PROVISIONAL COMPANY

Choose two generated recruits

Offer set WIND-01-A remains stable until run creation.

+
${generatedOffers.map((offer) => recruitOffer(offer, selected.includes(offer.id))).join("")}
+ +
`; + return frame(screen, body, { variant, resources: false }); +} + +function recruitMarker(offer, selected = false) { + return `
${offer.mark}
${offer.id}${offer.name}${offer.profession}
`; +} + +function recruitOffer(offer, selected) { + return `
+
${offer.mark}${offer.id}
+
${offer.name}${offer.profession}

${offer.trait} - ${offer.read}

+
${t("noCoin")}${iconButton("i", `${t("inspect")} ${offer.name}`)}
+
`; +} + +function companyCountForVariant(variant) { + if (variant === "company2") return 2; + if (variant === "company3") return 3; + return 4; +} + +function renderMarket(screen, variant) { + const count = companyCountForVariant(variant); + const isRecruit = screen.id === "SHP-002"; + const isItem = screen.id === "SHP-003"; + if (isRecruit) { + const offer = variant === "hire2" ? generatedOffers[2] : generatedOffers[0]; + const body = `
+
${recruitMarker(offer, true)}⬡
+
RECRUIT REVIEW

${offer.name}

${offer.profession} · ${offer.trait}

+
VIT APACE CREACH ${offer.profession === "Hearthguard" ? "1" : "2"}GUARD B
+

${offer.read}. Generated identity, exactly one Trait, no authored personal arc.

+
PARTY IMPACT${t("company")} ${count} → ${Math.min(4, count + 1)}

${offer.profession === "Hearthguard" ? "Adds a visible front intercept." : "Adds position movement and target change."}

Price 46 Coin · Operation HIRE-${variant === "hire2" ? "002" : "001"}
+ ${actionDock("Recruit - 46 Coin", t("compare"), "data-flow-next")} +
`; + return frame(screen, body, { variant }); } - if (prefix === "WLD" || prefix === "EXP" || prefix === "WRK" || prefix === "GLD" || prefix === "SYS" || prefix === "RES") { - return "assets/web/ch_ch01.webp"; + if (isItem) { + const body = `
⇣EQ-001
ITEM OFFER

Stepback Soles

After the first direct hit, step one position rearward if legal.

Target exposureFront → Center
Next basicWait +1 tick
${actionDock("Buy - 32 Coin", t("inspect"))}
`; + return frame(screen, body, { variant }); } - return ""; + const offers = [generatedOffers[0], generatedOffers[2], generatedOffers[3]]; + const body = `
+
FIRST MARKET

Build capability before choosing risk

${t("company")}${count}/${t("capacity")}4
+
+
${offers.map((offer, index) => ``).join("")}
+
+ +
`; + return frame(screen, body, { variant }); } -function stageTop(screen) { - return ` -
-
- ${escapeHtml(screen.id)} - 目标 · 修复风车中继 -
-
- Saved - Cache 180 -
+function partyActors() { + const original = [ + ["3", "Nia", "FS", "Rear"], ["2", "Sable", "KH", "Protected"], ["1", "Tomas", "WR", "Center"], ["0", "Elian", "HG", "Exposed"], + ]; + const swapped = [original[0], original[2], original[1], original[3]]; + return (state.partySwapped ? swapped : original).map(([position, name, mark, status], index) => ``).join(""); +} + +function renderPreparation(screen, variant) { + if (screen.id.startsWith("EQP")) { + const comparison = screen.id === "EQP-002"; + const body = `
+
ELIGIBLE INVENTORY${["Stepback Soles", "Frontpin Greaves", "Rescue Loop", "Open-Line Cord"].map((name, index) => ``).join("")}
+
FSNia OrrowFarstring · position 3
Current: Quiet Rearplate
+
BEHAVIOR DELTA

${comparison ? "Quiet Rearplate → Stepback Soles" : "Stepback Soles"}

After first hitStep rear
Target relationFront → Center
Next basicWait +1

At full rear the trigger is dormant. Apply remains reversible until readiness commit.

`; + return frame(screen, body, { variant }); + } + const ready = screen.id === "PTY-002"; + const body = `
+
${ready ? "FROZEN PARTY SNAPSHOT" : "ORDERED PARTY LINE"}

${t("protected")} → ${t("exposed")}

Position 0 is always the rightmost front. The line is never mirrored by locale.

+
Sable protects 0Nia reaches enemy rear
+
${t("protected")}${partyActors()}${t("exposed")}
+ +
${iconButton("↶", "Undo")}${iconButton("↺", "Reset")}
+
`; + return frame(screen, body, { variant }); } -function renderRouteStage(screen) { - return ` - ${stageTop(screen)} -
CH-01 · 风车盆地${escapeHtml(screen.name)}

路线提前显示威胁、奖励、Cache 风险与 Anchor 距离。

-
-
- - - - -
-
`; +function renderRisk(screen, variant) { + const review = screen.id === "RSK-002"; + const risks = [ + ["Steady Crossing", "Pane Nibbler + Gust Finch", "Equipment", "Low"], + ["Shattered Terrace", "Prism Ox + rear pressure", "Artifact", "Medium"], + ["Bellward Detour", "Unknown third identity", "Profession", "High"], + ]; + const body = review ? `
RISK COMMITMENT

Steady Crossing

Known threatProjectile screenEntry cost0 CoinReward classEquipmentRetreatOne Coin tier
${partyActors()}

The accepted order is frozen with the risk receipt. Selection alone changed nothing.

${actionDock("Begin Battle", "Return to Risk Board", "data-flow-next")}
` : `
THREE BOUNDED OFFERS

Choose pressure, not a hidden result

${risks.map((risk, index) => ``).join("")}
CoverageFront hold ✓Rear screen △Recovery 214 Coin
`; + return frame(screen, body, { variant }); } -function renderFormationStage(screen) { - const slots = ["Mara · Front", "Oren · Mid", "Tamsin · Rear", "Suri · Front", "Ilyo · Rear", "空位"]; - return ` - ${stageTop(screen)} -
WEAVE GRID${escapeHtml(screen.name)}

点角色再点目标位置;拖动只是可选快捷方式。

-
- ${slots.map((slot, index) => ``).join("")} -
-

首次受击预测

Mara 拦截中心线
Tamsin 暴露于 Gust
角色标签 4/6 不重复
-
`; +function battleLine() { + return `
${t("protected")}${partyActors()}${t("exposed")}
Pane Bite · 0.8s → Elian
OXPrism screenPNGuard chipGFRear shot
`; } -function renderBattleStage(screen) { - const directiveFlow = ["BAT-005", "BAT-006", "BAT-007"].includes(screen.id); - return ` - ${stageTop(screen)} -
-
UNSECURED CACHE180
-
- - -
-
`; +function renderBattle(screen, variant) { + const id = screen.id; + if (["BAT-004", "BAT-005", "BAT-006"].includes(id)) { + const title = id === "BAT-004" ? "Observation paused" : id === "BAT-005" ? "Retreat consequence" : "Resume verified snapshot"; + const primary = id === "BAT-004" ? "Resume battle" : id === "BAT-005" ? "Begin retreat" : "Resume at 1x"; + const rows = stageDetails[id]; + const body = `
${battleLine()}
${id}

${title}

${rows.map((row) => `
${row}
`).join("")}
${actionDock(primary, id === "BAT-005" ? "Cancel" : "Event log")}
`; + return frame(screen, body, { variant }); + } + const inspect = id === "BAT-003"; + const opening = id === "BAT-001"; + const body = `
+
${opening ? "BATTLE OPENING" : "AUTOMATIC BATTLE"}

${opening ? "Break the rotating pane screen" : "Urgent: Guard chip reaches Sable"}

${opening ? "Player line faces right. Position 0 receives the first legal bite." : "The second Pane Bite will remove Elian's Guard and chip the neighbor."}

+
${iconButton(state.battlePaused ? "▶" : "Ⅱ", state.battlePaused ? "Resume" : "Pause", "data-battle-pause")} +
${[1, 2, 4].map((speed) => ``).join("")}
${iconButton("i", "Inspect event", "data-open-screen=\"BAT-003\"")}
+ ${battleLine()} +
00:07.2 · Gust Finch targets Nia00:08.0 · Elian intercepts Pane Bite00:08.8 · Sable gains Remedy
+ ${inspect ? `` : ""} +
[Front recruit: Guard consumed] [Enemy forecast: rear projectile]
+ ${opening ? actionDock("Start observation", "Inspect objective", "data-flow-next") : ""} +
`; + return frame(screen, body, { variant }); } -function renderSettingsStage(screen) { - return ` -
-
SETTINGS显示与大字动效与闪烁音频与字幕控制方式存档与云端
-

${escapeHtml(screen.name)}

-
UI 与文字缩放 · 130%
-
减少动态
-
高对比目标轮廓
-
字幕与事件标签
-
低功耗模式
-
-
`; +function renderOutcome(screen, variant) { + if (screen.id === "OUT-001") { + const body = `
VICTORY
FIRST MEANINGFUL DIVERGENCE

Guard broke before the second rear shot

Expected protection ended at 00:18.4; actual pressure reached Nia at 00:19.1.

EXPECTED00:17 Guard 100:19 Rear shot blocked00:22 Stable line
ACTUAL00:17 Pane chip00:18 Guard 000:19 Nia hit
CauseSecond uninterrupted Pane BiteOrderSable remained adjacentAdaptMove or interrupt before bite 2
${actionDock("Continue to Reward", "Full event log", "data-flow-next")}
`; + return frame(screen, body, { variant }); + } + if (screen.id === "OUT-002") { + const body = `
FSFALLEN
COMMITTED LOSS

Nia Orrow

Farstring · Patient Start · Level 3 · survived 4 battles

EquipmentReturned to inventory
Party gapRear pressure lost
Replacement Credit+1 tier
Death is permanent for this run. No relationship or personal-arc system is implied.
${actionDock("Acknowledge loss", "Inspect receipt", "data-flow-next")}
`; + return frame(screen, body, { variant }); + } + if (screen.id === "OUT-003") { + const rewards = [["EQ-014", "Quiet Rearplate", "Converts first area hit to direct"], ["AR-011", "Narrow Vanguard", "One fewer deploy; front starts Guarded"], ["PF-B05", "Farstring insight", "Opens a profession trial"]]; + const body = `
FIXED REWARD DRAFT

Choose the next decision you want to change

${rewards.map((reward, index) => ``).join("")}
${actionDock("Claim Quiet Rearplate", "Compare build", "data-flow-next")}
`; + return frame(screen, body, { variant }); + } + if (screen.id === "OUT-004") { + const body = `
RECOVERY

Company remains viable

Replacement Credit reduces only a later hire. Lost level, Trait, profession and history stay lost.

${actionDock("Commit protected hire", "Review consequences", "data-flow-next")}
`; + return frame(screen, body, { variant }); + } + const rows = stageDetails[screen.id] || ["Outcome receipt verified", "No unresolved casualty", "Safe destination named"]; + const body = `
${screen.id}

${escapeHtml(screenName(screen))}

${rows.map((row) => `
${escapeHtml(row)}
`).join("")}

${truncate(screen.purpose, 180)}

${actionDock(screen.id === "OUT-006" ? "Hold to abandon run" : "Finish result", "Cancel")}
`; + return frame(screen, body, { variant }); } -function renderRecordsStage(screen, art) { - return ` - ${stageTop(screen)} -
-
概念元素图
-
${escapeHtml(screen.name)}

图鉴同时展示身份、机制、反制、获取与完成状态。

已研究 · 机制完整
可用反制 · 2
章节关联 · CH-01
生产状态 · Concept
-
`; +function renderRoster(screen, variant) { + if (screen.id === "REC-003") { + const body = `
${recruitMarker(generatedOffers[2], true)}
DESTRUCTIVE REVIEW

Dismiss Tomas Vale?

Equipment returns to run inventory
No Replacement Credit
Living Company 4 → 3

Eligibility is revalidated at commit. The last living recruit can never be dismissed.

${actionDock("Dismiss Recruit", "Cancel")}
`; + return frame(screen, body, { variant }); + } + const roster = generatedOffers.concat([{ id: "RC-017", name: "Miro Sen", profession: "Coilsmith", trait: "Deep Pocket", mark: "CS" }]); + const body = `
LIVING COMPANY · 5${roster.map((offer, index) => ``).join("")}
`; + return frame(screen, body, { variant }); } -function renderBootStage() { - return ` -
- -
AETHERBOUND GUILD裂脉远征团

让每一次修复,改变下一段远征。

-
-

正在校验远征档案 · 68%

- 完成后自动进入,无需点击 -
`; +function renderGuild(screen, variant) { + const body = screen.id === "HUB-001" ? `
CURRENT PRESSURE

Rear projectile at the next crossing

Gust Finch enters behind a visible Pane screen.

${partyActors()}
Latest receiptQuiet Rearplate claimed · no unresolved transaction
` : `
NOWROUND 4BOSS MUSTER
KNOWN

Gust Finch

Targets rearmost ally, then steps forward.

Counter: screen or pull
KNOWN

Pane Nibbler

Second uninterrupted bite chips neighbor Guard.

Counter: reorder or interrupt
PARTIAL

Third identity

Family known: forced movement.

Confidence 68%
`; + return frame(screen, body, { variant }); } -function renderMissingStage(screen) { - const copy = reviewCopy(screen); - return ` -
- UI COVERAGE GAP · ${escapeHtml(screen.id)} - ${escapeHtml(screenName(screen))}尚未完成页面设计 -

目前只有页面需求,不能把这块内容当作游戏画面审核。

-
玩家首先需要看见
${escapeHtml(copy.focal)}
页面必须支持
${escapeHtml(copy.action || "无需操作")}
-
`; +function renderSystem(screen, variant) { + if (screen.id === "SYS-005") return renderOpening(screen, variant === "primary" ? "offers2" : variant); + if (screen.id === "SYS-003") { + const body = `
AETHERBOUNDGUILDBuild the company. Order the line. Read the result.
Safe resumeWindglass Verge · MarketCompany 5 · Round 3 · save healthy
${iconButton("⚙", "Settings")}${iconButton("Aa", "Accessibility")}
`; + return frame(screen, body, { variant, resources: false, context: "Aetherbound Guild" }); + } + if (screen.id === "SYS-001") { + const body = `
AG

Aetherbound Guild

Verifying local content · 76%Rules · Content · Settings · Save lineage
`; + return frame(screen, body, { variant, art: false, header: false }); + } + if (screen.id === "SYS-002") return renderSettings(screen, variant, "FIRST-LAUNCH SETUP"); + const details = stageDetails[screen.id] || [screen.purpose, screen.action]; + const body = `
${screen.id}

${escapeHtml(screenName(screen))}

${details.map((detail, index) => ``).join("")}
`; + return frame(screen, body, { variant, resources: false }); } -function renderGameStage(screen) { - const prefix = screen.id.slice(0, 3); - const kind = layoutKind(screen); - const art = artForScreen(screen); - const light = prefix === "SET" || prefix === "REC"; - let content; - if (kind === "dedicated") content = renderBootStage(); - else if (kind === "family-formation") content = renderFormationStage(screen); - else if (kind === "family-route") content = renderRouteStage(screen); - else if (kind === "family-battle") content = renderBattleStage(screen); - else if (kind === "family-settings") content = renderSettingsStage(screen); - else if (kind === "family-records") content = renderRecordsStage(screen, art); - else content = renderMissingStage(screen); - - const decorativeArt = art && prefix !== "REC" && kind !== "dedicated" && kind !== "missing" ? `` : ""; - return `
${decorativeArt}${content}
`; +function renderArtifact(screen, variant) { + const entries = state.data.artifacts.slice(0, 3); + const body = `
RUN-WIDE RULES · NOT EQUIPMENT

Active Artifact Ledger

${entries.map((entry, index) => ``).join("")}
`; + return frame(screen, body, { variant }); } -function screenMeta(screen, index, screens) { - const copy = reviewCopy(screen); - const status = coverage(screen); - const previous = screens[(index - 1 + screens.length) % screens.length]; - const next = screens[(index + 1) % screens.length]; - return ` -
-
-
${escapeHtml(screen.id)}

${escapeHtml(screenName(screen))}

${chip(status.label)} ${chip("人类审核未通过")}
-
-
-
-
玩家首先需要看见

${escapeHtml(copy.focal)}

-
玩家在这里做什么

${escapeHtml(copy.action || "无需操作")}

-
异常与安全退出

${escapeHtml(copy.variants)}

-
-
`; +function renderProgress(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 }); + } + const rows = stageDetails[screen.id] || ["Decision grammar unlocked", "Prerequisite verified", "Receipt available"]; + const isPostgame = screen.id.startsWith("PST"); + const body = `
${isPostgame ? "POSTGAME" : "PROGRESSION"}

${escapeHtml(screenName(screen))}

${truncate(screen.purpose, 170)}

BaseChoiceMastery
${rows.map((row) => `
${escapeHtml(row)}
`).join("")}
${actionDock(isPostgame ? "Review active rules" : "Inspect choice", "Ordinary New Run")}
`; + return frame(screen, body, { variant, art: false }); +} + +function renderSettings(screen, variant, kicker = "SETTINGS") { + const rows = settingRows[screen.id] || settingRows["SET-002"]; + const categoryNames = ["Display", "Motion", "Audio", "Controls", "Language", "Information", "Save / Data", "Reset"]; + const settingKeys = { + "SET-002-2": "contrast", + "SET-003-0": "reducedMotion", + "SET-003-3": "lowPower", + "SET-004-3": "captions", + }; + const controls = rows.map(([label, value], index) => { + if (screen.id === "SET-002" && index === 0) { + return `
${["100", "115", "130"].map((scale) => ``).join("")}
`; + } + if (screen.id === "SET-006" && index === 0) { + return `
`; + } + const key = settingKeys[`${screen.id}-${index}`]; + if (key) { + const enabled = Boolean(state.settings[key]); + return ``; + } + if (index % 3 === 1) return ``; + if (index % 3 === 2) return ``; + return `
`; + }); + const body = `
CALLER · ${variant === "pause" ? "PAUSED BATTLE" : "TITLE"}

${escapeHtml(screenName(screen))}

${rows.map(([label], index) => `
${escapeHtml(label)}${index === 0 ? "Live preview" : "Current value"}
${controls[index]}
`).join("")}
`; + return frame(screen, body, { variant, art: false, header: false }); +} + +function renderGeneric(screen, variant) { + const details = stageDetails[screen.id] || [truncate(screen.purpose, 90), truncate(screen.action, 90), screen.input]; + const body = `
${screen.id.split("-")[0]}${escapeHtml(screenName(screen))}
CURRENT DECISION

${escapeHtml(screenName(screen))}

${truncate(screen.purpose, 180)}

${details.map((detail) => `
${escapeHtml(detail)}
`).join("")}
${actionDock(truncate(screen.action.split(";")[0], 46), t("inspect"))}
`; + return frame(screen, body, { variant }); +} + +function renderPrimaryStage(screen, variant = "primary") { + const prefix = screen.id.split("-")[0]; + if (prefix === "SYS") return renderSystem(screen, variant); + if (prefix === "HUB") return renderGuild(screen, variant); + if (prefix === "SHP") return renderMarket(screen, variant); + if (prefix === "REC") return renderRoster(screen, variant); + if (prefix === "EQP" || prefix === "PTY") return renderPreparation(screen, variant); + if (prefix === "ART") return renderArtifact(screen, variant); + if (prefix === "RSK") return renderRisk(screen, variant); + if (prefix === "BAT") return renderBattle(screen, variant); + if (prefix === "OUT") return renderOutcome(screen, variant); + if (prefix === "PRO" || prefix === "PST") return renderProgress(screen, variant); + if (prefix === "SET") return renderSettings(screen, variant); + return renderGeneric(screen, variant); +} + +function renderStateVariant(screen, variant) { + if (variant === "primary" || (screen.id === "SYS-005" && !["loading", "error", "return"].includes(variant))) return renderPrimaryStage(screen, variant); + const source = variant === "loading" ? screen.emptyLoading : variant === "error" ? screen.errorConfirmation : screen.interruptionReturn; + const label = variant === "loading" ? "LOADING / EMPTY" : variant === "error" ? "ERROR / CONFIRMATION" : "INTERRUPTION / RETURN"; + const base = renderPrimaryStage(screen, "primary"); + const action = variant === "loading" ? t("retry") : variant === "error" ? "Review changed state" : t("returnSafe"); + return base.replace( + "", + `
${label}

${escapeHtml(screenName(screen))}

${escapeHtml(truncate(source, 260))}

`, + ); +} + +function viewHeading(kicker, title, detail, badges = []) { + return `
${escapeHtml(kicker)}

${escapeHtml(title)}

${escapeHtml(detail)}

${badges.map((badge) => `${escapeHtml(badge)}`).join("")}
`; +} + +function renderFirstPlay() { + const step = flowSteps[state.flowIndex]; + const screen = getScreen(step[0]); + return `
+ ${viewHeading("OWNER REVIEW · FIRST 16 MINUTES", flowLabel(step), `${screen.id} · ${screenName(screen)}`, [`${state.flowIndex + 1} / ${flowSteps.length}`, "Real screen state"])} +
${renderPrimaryStage(screen, step[1])}
+
${flowSteps.map((entry, index) => ``).join("")}
+
`; } function renderScreens() { - const category = state.screenCategory; - const filtered = state.data.screens.filter((screen) => category === "ALL" || screen.id.startsWith(`${category}-`)); + const filtered = state.data.screens.filter((screen) => state.screenGroup === "ALL" || screen.id.startsWith(`${state.screenGroup}-`)); if (!filtered.some((screen) => screen.id === state.screenId)) state.screenId = filtered[0].id; const screen = getScreen(state.screenId); const index = filtered.findIndex((entry) => entry.id === screen.id); - const coverageCounts = state.data.screens.reduce((result, entry) => { - result[coverage(entry).key] += 1; - return result; - }, { dedicated: 0, family: 0, missing: 0 }); - return ` -
- ${viewHeading("UI COVERAGE AUDIT", "82 个页面需求,不是 82 张完成的 UI", "当前只有启动页完成逐页设计;部分页面仅有共用页面族示意,其余仍是规格缺口。这里用于识别要继续设计什么,不能作为完整 UI 验收。", `${chip(`${coverageCounts.dedicated} 逐页设计`)} ${chip(`${coverageCounts.family} 页面族示意`)} ${chip(`${coverageCounts.missing} 未设计`)}`)} -
${Object.entries(screenCategoryNames).map(([key, label]) => ``).join("")}
-
- -
${renderGameStage(screen)}
${screenMeta(screen, index, filtered)}
-
-
`; + const previous = filtered[(index - 1 + filtered.length) % filtered.length]; + const next = filtered[(index + 1) % filtered.length]; + const variants = screen.id === "SYS-005" ? [["contract", "A"], ["offers2", "B"], ["review", "C"], ["pending", "D"], ["receipt", "E"], ["loading", "Loading"], ["error", "Error"], ["return", "Return"]] : [["primary", "Primary"], ["loading", "Loading / empty"], ["error", "Error / confirm"], ["return", "Return"]]; + return `
+ ${viewHeading("50 CURRENT PAGE / STATE IDS", screenName(screen), `${screen.id} · ${screen.input}`, [`${index + 1} / ${filtered.length}`, "Page-specific composition"])} +
${Object.entries(screenGroups).map(([key, label]) => ``).join("")}
${variants.map(([key, label]) => ``).join("")}
+
${renderStateVariant(screen, state.screenVariant)}
Purpose

${escapeHtml(screen.purpose)}

Primary action

${escapeHtml(screen.action)}

Safe state

${escapeHtml(screen.interruptionReturn)}

+
`; } -function renderFlow() { - const flowScreens = flowIds.map(getScreen); - const screen = flowScreens[state.flowIndex]; - return ` -
- ${viewHeading("NAVIGATION SPECIFICATION", "从首页到章节修复的流程规格链", "这条链只证明 17 个需求节点和顺序已经定义;其中多个节点仍没有独立 UI,因此它不是可以进行理解或乐趣验收的产品原型。", `${chip(`${state.flowIndex + 1} / ${flowScreens.length}`)} ${chip("UI 未完成")}`)} -
-
${renderGameStage(screen)}
${screenMeta(screen, state.flowIndex, flowScreens)}
- -
-
-
`; +function renderRegions() { + const region = state.data.regions[state.regionIndex]; + const enemies = state.data.enemies.filter((entry) => entry.id.startsWith(`EN-R${state.regionIndex + 1}-`)); + const bosses = state.data.bosses.filter((entry) => entry.id.startsWith(`BO-R${state.regionIndex + 1}-`)); + return `
+ ${viewHeading("EIGHT CAMPAIGN REGIONS", region.name, region.framing, [`${region.id}`, `${enemies.length} enemies · ${bosses.length} bosses`])} +
${state.data.regions.map((entry, index) => ``).join("")}
+
${escapeHtml(region.name)} concept direction${t("concept")}
${region.id}

${region.name}

${region.framing}

+
Build pressure

${region.pressure}

Encounter grammar

${region.progression}

Current identities
${enemies.slice(0, 5).map((enemy) => `${enemy.id}${enemy.name}`).join("")}${bosses.map((boss) => `${boss.id}${boss.name}`).join("")}
+
`; } -function renderChapters() { - const chapter = state.data.chapters[state.chapter]; - const { id, name } = splitIdentity(chapter.identity); - return ` -
- ${viewHeading("8 CHAPTERS · 24 VISUAL FAMILIES", "每一章都提出新的策略问题", "每章都有独立的路线/聚落、代表战场和修复/抉择画面。概念图用于确认环境方向,完整细节以章节策划文档为准。")} -
${state.data.chapters.map((entry, index) => ``).join("")}
-
-
${escapeHtml(name)} 章节环境概念图
${id}A · 路线 / 聚落${escapeHtml(chapter.region)} · ${escapeHtml(chapter.route)}
${id}B · 代表战场${escapeHtml(chapter.learning)},Boss 通过真实机制检验这一章。
${id}C · 修复 / 抉择${escapeHtml(chapter.change)}
-
${escapeHtml(id)}

${escapeHtml(name)}

本章学习目标

${escapeHtml(chapter.learning)}

Boss 测试与奖励

${escapeHtml(chapter.boss)}

永久变化

${escapeHtml(chapter.change)}

${chip("Concept art")} ${chip("Owner review open")}
-
-
`; +function catalogConfig() { + const configs = { + professions: { label: "Professions", image: "assets/web/el_profession_kits.webp", filters: [["all", "All 42"], ["base", "12 base"], ["advanced", "24 advanced"], ["hidden", "6 hidden"]], meta: (entry) => `${entry.family} · ${entry.role}`, body: (entry) => `${entry.rules} ${entry.strategy}` }, + traits: { label: "Traits", image: "assets/web/el_heroes.webp", filters: [["all", "All 36"]], meta: () => "one per recruit", body: (entry) => `Benefit: ${entry.benefit} Cost: ${entry.cost}` }, + equipment: { label: "Equipment", image: "assets/web/el_items.webp", filters: [["all", "All 320"], ["B", "Behavior B"], ["T", "Tradeoff T"]], meta: (entry) => `${entry.class} · ${entry.fit}`, body: (entry) => `${entry.effect} Tradeoff: ${entry.tradeoff}` }, + artifacts: { label: "Artifacts", image: "assets/web/el_items.webp", filters: [["all", "All 60"]], meta: () => "run-wide rule", body: (entry) => `${entry.rule} ${entry.tradeoff}` }, + enemies: { label: "Enemies", image: "assets/web/el_enemies.webp", filters: [["all", "All 100"], ["ordinary", "Ordinary"], ["elite", "Elite"]], meta: (entry) => entry.class, body: (entry) => `${entry.rule} Responses: ${entry.responses}` }, + bosses: { label: "Bosses", image: "assets/web/el_enemies.webp", filters: [["all", "All 16"]], meta: (entry) => entry.class, body: (entry) => `${entry.rule} Responses: ${entry.responses}` }, + }; + return configs[state.catalogType]; } -function searchableValues(entries, query) { - const normalized = query.trim().toLocaleLowerCase(); - if (!normalized) return entries; - return entries.filter((entry) => Object.values(entry).join(" ").toLocaleLowerCase().includes(normalized)); -} - -function renderCatalog(view, entries, config) { - const query = state.queries[view] || ""; - const filtered = searchableValues(entries, query); - const shown = filtered.slice(0, config.limit || 320); - return ` -
- ${viewHeading(config.eyebrow, config.title, config.description, `${chip(`${filtered.length} / ${entries.length}`)} ${chip("完整权威索引")}`)} -
-
- -
${shown.length ? shown.map((entry) => config.row(entry)).join("") : `
没有匹配内容。请清除搜索条件。
`}
-
-
`; -} - -function catalogEntry(identity, meta, body) { - const { id, name } = splitIdentity(identity); - return `
${escapeHtml(id)}${escapeHtml(name)}${escapeHtml(meta)}

${escapeHtml(body)}

`; -} - -function renderCharacters() { - return renderCatalog("characters", state.data.characters, { - eyebrow: "30 NAMED ADVENTURERS", - title: "每个角色都有玩法、动机与成长弧", - description: "角色不是随机兵种皮肤。每个人有稳定身份、职业亲和、招募路径、关系、个人弧线、视觉和双语声音需求。", - image: "assets/web/el_heroes.webp", - alt: "Mara、Oren 和 Ilyo 三名核心角色概念图", - visualNote: "概念板用于锁定成熟比例、职业仍保留人物身份、以及 Guild 修复者的工作质感。并非最终角色立绘或 sprite。", - row: (entry) => catalogEntry(entry.identity, "Character", `${entry.gameplay} ${entry.story}`), +function renderCatalogs() { + const config = catalogConfig(); + const entries = state.data[state.catalogType]; + const normalized = state.catalogQuery.trim().toLocaleLowerCase(); + const filtered = entries.filter((entry) => { + const filterMatch = state.catalogFilter === "all" || entry.family === state.catalogFilter || entry.class === state.catalogFilter; + const queryMatch = !normalized || Object.values(entry).join(" ").toLocaleLowerCase().includes(normalized); + return filterMatch && queryMatch; }); + return `
+ ${viewHeading("CURRENT AUTHORED CATALOGS", config.label, "Search stable IDs, names, mechanics, tradeoffs and counterplay.", [`${filtered.length} / ${entries.length}`, "No filler rows"])} +
${["professions", "traits", "equipment", "artifacts", "enemies", "bosses"].map((key) => ``).join("")}
+
${config.filters.map(([key, label]) => ``).join("")}
+
${filtered.length ? filtered.slice(0, 100).map((entry) => `
${entry.id}${entry.name}${escapeHtml(config.meta(entry))}

${escapeHtml(truncate(config.body(entry), 240))}

`).join("") : `
No matching identities
`}${filtered.length > 100 ? `
100 shown · ${filtered.length - 100} more remain searchable
` : ""}
+
`; } -function renderProfessions() { - return renderCatalog("professions", state.data.professions, { - eyebrow: "12 BASE · 24 ADVANCED", - title: "36 个职业都改变行动逻辑", - description: "每个职业拥有资源、两项主动技能、一项被动、AI 优先级、反制面、晋升证明,以及可生产的武器、动作、VFX 与声音身份。", - image: "assets/web/el_profession_kits.webp", - alt: "六套职业装备与资源装置概念图", - visualNote: "职业采用模块化装备和动作套件叠加在 30 个稳定人物身份上,不为每个角色重画一套通用职业人。", - row: (entry) => catalogEntry(entry.identity, entry.role.split(".")[0], `${entry.skills} ${entry.build}`), - }); -} - -function renderEnemies() { - return renderCatalog("enemies", state.data.enemies, { - eyebrow: "56 ORDINARY · 24 ELITE · 12 SUB-BOSS · 8 BOSS", - title: "100 个敌人不是换色数值包", - description: "每个敌人通过独立目标、时序、空间、资源或信息规则改变准备方案,并具有可读预告、至少两个回应和生产规格。", - image: "assets/web/el_enemies.webp", - alt: "第一章机械敌人、暗潮危险和预告几何概念图", - visualNote: "第一章敌人来自被破坏的公共机械,轮廓和动作直接表达机制。后续七章保留各自材料与社会功能。", - row: (entry) => catalogEntry(entry.identity, "Enemy mechanic", `${entry.mechanic} 反制读取:${entry.read}`), - }); -} - -function renderItems() { - return renderCatalog("items", state.data.items, { - eyebrow: "320 AUTHORED ITEMS", - title: "装备必须改变判断,而不是只抬战力", - description: "320 件物品逐件定义槽位、章节、效果、状态依赖、协同、反制、获取、升级与美术/声音。160 件属于行为变化物品。", - image: "assets/web/el_items.webp", - alt: "Guild 装备、工具、Cache 与 Anchor 元素概念图", - visualNote: "物品按真实物件展示,稀有度不会用巨大光效抢走机制信息。最终 320 件都需要独立透明物件图。", - row: (entry) => catalogEntry(entry.identity, `${entry.slot} · ${entry.tier} · ${entry.flag}`, `${entry.effect} ${entry.build}`), - }); -} - -function renderRecords() { - const achievements = state.data.achievements; - const collections = state.data.collections; - return ` -
- ${viewHeading("48 ACHIEVEMENTS · 20 COLLECTIONS", "完成度记录玩家学会了什么", "成就验证真实机制、构筑和章节结果;收藏把区域证据变成 Guild 中可见的物理陈列。它们不靠重复刷次数延长游戏。")} -
${metric(48, "机制与叙事成就")}${metric(20, "区域收藏")}${metric("100 h", "全收集与高难完成目标")}${metric("0", "每日任务、通行证与抽卡")}
-

成就

${achievements.map((entry) => catalogEntry(entry.identity, "Achievement", `${entry.requirement} 奖励:${entry.reward}`)).join("")}
-

收藏

${collections.map((entry) => catalogEntry(entry.identity, "Collection", `${entry.entries} 陈列:${entry.display}`)).join("")}
-
`; -} - -function renderProduction() { - return ` -
- ${viewHeading("COMPLETE PRODUCTION INVENTORY", "美术、动画、音乐和声音怎么做", "完整数量已经拆成可生产的身份包、模块、动作、场景和事件。当前四张 AI 图都是概念方向,不是最终运行时资源。")} -
${metric("30", "角色身份 rig + 6 表情")}${metric("72", "主动技能动作 / VFX 合同")}${metric("752+", "非 Boss 敌人动作状态")}${metric("88", "章节环境主状态")}${metric("101", "模块化剧情构图")}${metric("30", "音乐套件")}${metric("94", "环境声配置")}${metric("2,602", "双语最低角色录音资产")}
-
-

角色与职业

30 套稳定角色身份 + 36 套职业装备、资源装置和动作模块。职业改变人物的战斗轮廓,但不把角色替换成无名 class sprite。

-

敌人与装备

100 个敌人各自拥有机制轮廓、动作与预告;320 件物品都有独立物件图,160 件行为物品还必须显示真实触发。

-

环境与章节

八章共 88 个环境状态和至少 200 个独立道具/结构族。背景、交互物、前景、危险与修复层分开,不能用一张平图冒充地图。

-

音乐

30 套自适应音乐包含 base、pulse、tension 和 resolution;八章保留不同材料与节拍,最终章组合而不抹平差异。

-

语音

角色圣经定义 773 条战斗/Hub 语义额度和 144 个角色场景。英文与简中最低 2,602 个录音资产,语义语音严格控制并发。

-

SFX 与无障碍

710 个事件身份必须与真实提交状态一致。静音、字幕、单声道、输出切换、低功耗和振动关闭都不能改变玩法信息。

-
-

先做哪一块

正式批量生产前只做 CH-01 风车中继动态切片:Mara / Oren / Ilyo、Bell-Feeder、两名支援敌人、三条战线、Retune Directive、诊断、Reward → Cache → Anchor,以及 Clinic / Warning Tower 两个永久修复结果。

-
`; -} - -function renderReadiness() { - const rows = [ - ["产品与玩家体验", "完整", "Product contract, 25-35h campaign, onboarding and evidence gates", "设计一致性已校验;人类理解/乐趣开放"], - ["战斗 / 职业 / 装备", "完整", "Deterministic combat, 12+24 professions, 320 items", "需通过可玩动态切片验证"], - ["经济 / 难度 / 存档", "完整", "1700-min authored budget, five traces, atomic save/failure", "公式静态校验通过;运行时未实现"], - ["世界与内容", "完整", "30 characters, 100 enemies, 8 chapters, ending/postgame", "数量与链接校验通过;无人工完整试玩"], - ["页面与 UI", "未完成", "82 个页面需求已定义;1 页逐页设计、40 页页面族示意", "41 页没有独立 UI;其余页面族也必须逐页深化"], - ["美术与动画", "完整清单", "Identity/modular production and CH-01 slice", "仅 4 张概念图;无 final/integrated/runtime"], - ["音乐 / 环境 / 语音 / SFX", "完整清单", "30 music, 94 ambience, 2602 voice, 710 events", "未生成、未试听、未授权批量 SFX/music"], - ["HTML 产品原型", "失败待修", "内容索引和响应式外壳可用", "Owner 已证明页面表达不可理解;当前只能用于缺口审计"], - ["引擎开发", "冻结", "No Godot project or runtime code", "完整设计 Owner 批准后另开 Goal"], - ["设备 / 打包 / 上架", "开放", "No build, signing, device or store action", "必须在运行时完成后分别授权"], +function renderReview() { + const groups = [ + ["01", "Opening company", "SYS-005 A-E", "Four stable offers, exactly-two gating, revision, atomic receipt and first-Market handoff.", "firstplay", "0"], + ["02", "Market hire", "SHP-001 / 002", "Two separate affordable base hires move Company 2 → 3 → 4 while capacity remains 4.", "firstplay", "7"], + ["03", "Formation and equip", "EQP-001 / 002 · PTY-001 / 002", "Behavior delta and one rear-left to front-right line with exposed position 0.", "screens", "EQP-002"], + ["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"], ]; - const blockedStatuses = new Set(["冻结", "开放", "未完成", "失败待修"]); - return ` -
- ${viewHeading("PRE-DEVELOPMENT GATE", "UI 设计没有完成,不能进入正式开发", "系统和内容文档已经建立,但 82 页 UI 只有 1 页逐页设计。Owner 已确认现有页面难以理解,因此完整产品原型验收失败。")} - ${rows.map(([area, status, ready, open]) => ``).join("")}
领域状态已经具备仍然开放
${escapeHtml(area)}${escapeHtml(status)}${escapeHtml(ready)}${escapeHtml(open)}
-

下一步不是让你继续猜

先逐页完成标题、公会、编队、地图、路线、战斗、结算、奖励、锚点和修复等核心链 UI,再扩展其余页面。新的审核候选必须让页面目的、当前状态和唯一主操作直接可见。

-
`; + 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"])} +
${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
+
`; +} + +function applyLocale() { + document.documentElement.lang = state.locale === "zh_CN" ? "zh-CN" : "en"; + $$('[data-copy]').forEach((element) => { element.textContent = t(element.dataset.copy); }); + $$('[data-locale]').forEach((button) => button.classList.toggle("is-active", button.dataset.locale === state.locale)); + $("#view-title").textContent = t(state.view); +} + +function applySettings() { + document.body.classList.toggle("high-contrast", state.settings.contrast); + document.body.classList.toggle("reduced-motion", state.settings.reducedMotion); + document.body.classList.toggle("low-power", state.settings.lowPower); + document.body.dataset.textScale = state.settings.textScale; } function render() { if (!state.data) return; - const renderers = { - overview: renderOverview, - screens: renderScreens, - flow: renderFlow, - chapters: renderChapters, - characters: renderCharacters, - professions: renderProfessions, - enemies: renderEnemies, - items: renderItems, - records: renderRecords, - production: renderProduction, - readiness: renderReadiness, - }; + const renderers = { firstplay: renderFirstPlay, screens: renderScreens, regions: renderRegions, catalogs: renderCatalogs, review: renderReview }; $("#content").innerHTML = renderers[state.view](); - $("#view-title").textContent = viewNames[state.view]; - $$(".nav-item").forEach((button) => button.classList.toggle("is-active", button.dataset.view === state.view)); - bindViewEvents(); + $$('.nav-item').forEach((button) => button.classList.toggle("is-active", button.dataset.view === state.view)); + applyLocale(); + applySettings(); } -function bindViewEvents() { - $$('[data-open-view]').forEach((button) => button.addEventListener("click", () => setView(button.dataset.openView))); - $$('[data-screen-category]').forEach((button) => button.addEventListener("click", () => { - state.screenCategory = button.dataset.screenCategory; - render(); - })); - $$('[data-screen-id]').forEach((button) => button.addEventListener("click", () => { - state.screenId = button.dataset.screenId; - render(); - })); - $$('[data-chapter]').forEach((button) => button.addEventListener("click", () => { - state.chapter = Number(button.dataset.chapter); - render(); - })); - $$('[data-flow-index]').forEach((button) => button.addEventListener("click", () => { - state.flowIndex = Number(button.dataset.flowIndex); - render(); - })); - $$('[data-flow-next]').forEach((button) => button.addEventListener("click", () => { - state.flowIndex = (state.flowIndex + 1) % flowIds.length; - if (state.view !== "flow") setView("flow"); else render(); - })); - $$('[data-flow-prev]').forEach((button) => button.addEventListener("click", () => { - state.flowIndex = (state.flowIndex - 1 + flowIds.length) % flowIds.length; - render(); - })); - $$('[data-catalog-search]').forEach((input) => input.addEventListener("input", () => { - const view = input.dataset.catalogSearch; - state.queries[view] = input.value; - render(); - const replacement = $(`[data-catalog-search="${view}"]`); - replacement?.focus(); - replacement?.setSelectionRange(replacement.value.length, replacement.value.length); - })); -} - -function openMobileNav() { - $("#sidebar").classList.add("is-open"); - $("#nav-scrim").hidden = false; +function setView(view) { + state.view = view; + history.replaceState(null, "", `#${view}`); + render(); + closeMobileNav(); + $("#content").focus({ preventScroll: true }); } function closeMobileNav() { @@ -615,46 +672,165 @@ function closeMobileNav() { $("#nav-scrim").hidden = true; } +function openMobileNav() { + $("#sidebar").classList.add("is-open"); + $("#nav-scrim").hidden = false; +} + +function advanceFlow(delta) { + const next = state.flowIndex + delta; + state.flowIndex = next < 0 ? 0 : next >= flowSteps.length ? 7 : next; + if (state.view !== "firstplay") state.view = "firstplay"; + if ($("#stage-dialog").open) $("#stage-dialog").close(); + render(); +} + +function handleClick(event) { + const button = event.target.closest("button"); + if (!button) return; + if (button.dataset.view) return setView(button.dataset.view); + if (button.dataset.locale) { + state.locale = button.dataset.locale; + return render(); + } + if (button.hasAttribute("data-flow-next")) return advanceFlow(1); + if (button.hasAttribute("data-flow-prev")) return advanceFlow(-1); + if (button.dataset.flowIndex) { + state.flowIndex = Number(button.dataset.flowIndex); + return render(); + } + if (button.dataset.screenGroup) { + state.screenGroup = button.dataset.screenGroup; + state.screenVariant = "primary"; + return render(); + } + if (button.dataset.screenId) { + state.screenId = button.dataset.screenId; + state.screenVariant = "primary"; + if (state.view !== "screens") state.view = "screens"; + return render(); + } + if (button.dataset.screenVariant) { + state.screenVariant = button.dataset.screenVariant; + return render(); + } + if (button.dataset.regionIndex) { + state.regionIndex = Number(button.dataset.regionIndex); + return render(); + } + if (button.dataset.catalogType) { + state.catalogType = button.dataset.catalogType; + state.catalogFilter = "all"; + state.catalogQuery = ""; + return render(); + } + if (button.dataset.catalogFilter) { + state.catalogFilter = button.dataset.catalogFilter; + return render(); + } + if (button.dataset.offerId) { + const id = button.dataset.offerId; + const index = state.openingSelected.indexOf(id); + if (index >= 0) state.openingSelected.splice(index, 1); + else if (state.openingSelected.length < 2) state.openingSelected.push(id); + state.flowIndex = state.openingSelected.length === 0 ? 1 : state.openingSelected.length === 1 ? 2 : 3; + return render(); + } + if (button.hasAttribute("data-party-swap")) { + state.partySwapped = !state.partySwapped; + return render(); + } + if (button.hasAttribute("data-battle-pause")) { + state.battlePaused = !state.battlePaused; + return render(); + } + if (button.dataset.battleSpeed) { + state.battleSpeed = Number(button.dataset.battleSpeed); + return render(); + } + if (button.dataset.openScreen) { + state.screenId = button.dataset.openScreen; + state.screenVariant = "primary"; + return setView("screens"); + } + if (button.dataset.settingKey) { + const key = button.dataset.settingKey; + state.settings[key] = !state.settings[key]; + return render(); + } + if (button.dataset.textScale) { + state.settings.textScale = button.dataset.textScale; + return render(); + } + if (button.dataset.reviewView) { + const target = button.dataset.reviewTarget; + if (button.dataset.reviewView === "firstplay") state.flowIndex = Number(target); + if (button.dataset.reviewView === "screens") state.screenId = target; + if (button.dataset.reviewView === "catalogs") state.catalogType = target; + return setView(button.dataset.reviewView); + } + if (button.hasAttribute("data-clear-search")) { + state.catalogQuery = ""; + return render(); + } +} + +function handleInput(event) { + if (!event.target.matches("[data-catalog-search]")) return; + state.catalogQuery = event.target.value; + render(); + const replacement = $("[data-catalog-search]"); + replacement.focus(); + replacement.setSelectionRange(replacement.value.length, replacement.value.length); +} + +let viewerZoom = 1; + function openCurrentStage() { - const stage = $(".game-stage"); + const stage = $(".game-stage") || $(".region-stage"); if (!stage) return; - const dialog = $("#stage-dialog"); + viewerZoom = 1; + $("#zoom-reset").textContent = "100%"; + $("#dialog-stage").style.width = "100%"; $("#dialog-stage").replaceChildren(stage.cloneNode(true)); - dialog.showModal(); + $("#viewer-label").textContent = stage.dataset.stageId || "Region composition"; + $("#stage-dialog").showModal(); +} + +function setViewerZoom(delta) { + viewerZoom = Math.min(2, Math.max(0.75, Math.round((viewerZoom + delta) * 4) / 4)); + $("#dialog-stage").style.width = `${viewerZoom * 100}%`; + $("#zoom-reset").textContent = `${Math.round(viewerZoom * 100)}%`; } async function init() { try { const embeddedData = $("#prototype-data"); - if (embeddedData) { - state.data = JSON.parse(embeddedData.textContent); - } else { + if (embeddedData) state.data = JSON.parse(embeddedData.textContent); + else { const response = await fetch("data/catalog.json"); if (!response.ok) throw new Error(`HTTP ${response.status}`); state.data = await response.json(); } const hashView = location.hash.replace("#", ""); - if (viewNames[hashView]) state.view = hashView; + if (["firstplay", "screens", "regions", "catalogs", "review"].includes(hashView)) state.view = hashView; render(); } catch (error) { - $("#content").innerHTML = `

设计索引载入失败

${escapeHtml(error.message)}

请通过本地 HTTP 服务或 Artifact Gallery 打开此页面。

`; + $("#content").innerHTML = `

Prototype data unavailable

${escapeHtml(error.message)}

`; } } -$("#primary-nav").addEventListener("click", (event) => { - const button = event.target.closest("[data-view]"); - if (button) setView(button.dataset.view); -}); +document.addEventListener("click", handleClick); +document.addEventListener("input", handleInput); $("#open-nav").addEventListener("click", openMobileNav); $("#close-nav").addEventListener("click", closeMobileNav); $("#nav-scrim").addEventListener("click", closeMobileNav); $("#fullscreen-current").addEventListener("click", openCurrentStage); $("#close-dialog").addEventListener("click", () => $("#stage-dialog").close()); -$("#stage-dialog").addEventListener("click", (event) => { - if (event.target === event.currentTarget) event.currentTarget.close(); -}); -window.addEventListener("keydown", (event) => { - if (event.key === "Escape") closeMobileNav(); -}); +$("#zoom-out").addEventListener("click", () => setViewerZoom(-0.25)); +$("#zoom-in").addEventListener("click", () => setViewerZoom(0.25)); +$("#zoom-reset").addEventListener("click", () => { viewerZoom = 1; setViewerZoom(0); }); +$("#stage-dialog").addEventListener("click", (event) => { if (event.target === event.currentTarget) event.currentTarget.close(); }); +window.addEventListener("keydown", (event) => { if (event.key === "Escape") closeMobileNav(); }); init(); diff --git a/prototype/site/data/catalog.json b/prototype/site/data/catalog.json index 7a34f31d..07bd8673 100644 --- a/prototype/site/data/catalog.json +++ b/prototype/site/data/catalog.json @@ -1,5452 +1,5539 @@ { - "version": 1, - "status": "design-specification-only", + "version": 2, + "status": "design-prototype-current-authority", + "authorityRevision": "recruit-line-design-r3", "counts": { - "screens": 82, - "characters": 30, - "professions": 36, + "screens": 50, + "professions": 42, + "traits": 36, + "equipment": 320, + "artifacts": 60, "enemies": 100, - "items": 320, - "chapters": 8, - "achievements": 48, - "collections": 20 + "bosses": 16, + "regions": 8 }, "screens": [ { "id": "SYS-001", - "name": "Boot and studio marks", - "focal": "animated Waylamp line, product mark, loading state", - "action": "none", - "variants": "first load, shader/content migration progress, recoverable load error; proceeds automatically" + "name": "Boot and verification", + "input": "NAV", + "purpose": "Verify rules, content, settings, and BIND:SAVE_STATE before exposing a run.", + "action": "None; proceed only after all required sources are valid.", + "emptyLoading": "Empty install shows required local content status. Loading names the current verification step and progress.", + "errorConfirmation": "Recoverable source failure offers Retry; unsafe mismatch offers diagnostics and Exit. No confirmation.", + "interruptionReturn": "Suspend resumes verification from a safe checkpoint. Return exits to platform only before Title is legal." }, { "id": "SYS-002", - "name": "Accessibility primer", - "focal": "text size preview, contrast example, Continue", - "action": "Apply recommended preset", - "variants": "100/115/130%, reduced motion/flashes, captions; back is disabled only before a legal preset exists" + "name": "First-launch setup", + "input": "SETTINGS", + "purpose": "Establish language, safe area, 100/115/130% text, contrast, reduced motion/flashes, captions, and input prompts.", + "action": "Apply settings; writes preferences only.", + "emptyLoading": "Missing locale falls back to sourced English text and names the missing pack. Loading renders the preview inline with text status.", + "errorConfirmation": "Invalid safe area or unavailable output is explained. Apply review lists changed accessibility settings.", + "interruptionReturn": "Device change refreshes prompts without reset. No Back until one usable preset has been applied; later visits return to caller." }, { "id": "SYS-003", - "name": "Language and safe-area calibration", - "focal": "language pair, corner markers, Continue", - "action": "Confirm language and safe area", - "variants": "English, zh_CN, controller overscan; can reopen later from Display settings" + "name": "Title", + "input": "NAV", + "purpose": "Identify the game, current safe resume state, save health, and legal entry paths.", + "action": "Continue; opens SYS-006 and does not immediately advance simulation.", + "emptyLoading": "No run promotes New Run. Loading affects only the run summary and keeps Settings usable.", + "errorConfirmation": "Save warning links to SYS-007; offline optional service warning does not block local play. No confirmation.", + "interruptionReturn": "Suspend returns to the same selection. Back invokes platform exit review; child pages return here." }, { "id": "SYS-004", - "name": "Title", - "focal": "working guild above a ruptured route, Continue, current slot summary", - "action": "Continue", - "variants": "no save, resumable battle, postgame unlocked, offline service warning; Settings and slot select remain visible" + "name": "Run ledger", + "input": "LIST", + "purpose": "Inspect run slots, last safe state, play time, difficulty, and health.", + "action": "Open selected run; opens resume or recovery review.", + "emptyLoading": "No runs explains New Run. Loading uses per-slot skeletons with slot names retained.", + "errorConfirmation": "Corrupt, incompatible, conflict, and migration states name their safe next action. Delete and overwrite require SYS-005 or SET-009 review.", + "interruptionReturn": "Refresh or cloud interruption keeps the last verified local list. Back returns to Title." }, { "id": "SYS-005", - "name": "Campaign slots", - "focal": "three named slot ledgers, last location, play time", - "action": "Open selected slot", - "variants": "empty, healthy, recovered backup, migration required, conflict, deleted-in-trash; back to Title" + "name": "New run setup", + "input": "SELECT", + "purpose": "Review Contract/difficulty, then inspect and compare four stable provisional generated Recruit offers and choose exactly two at no Coin cost before run creation.", + "action": "With exactly two selected, Review Company opens the creation review; Create Run commits those two stable Recruit IDs, leaves the other two unretained, creates the run, and opens the first Market.", + "emptyLoading": "Empty or non-four offer output is invalid, not a legal empty choice. Loading shows four fixed positions, the named operation, and no selectable identity until its stable ID and required fields resolve.", + "errorConfirmation": "Duplicate IDs, missing Profession/Trait cost, stale offer-set revision, slot collision, unsupported ruleset, or creation failure blocks commit with retained safe setup. Review names both selected Recruits, the two unchosen offers, no-Coin cost, slot, difficulty, and Revise Recruits; zero, one, three, or four selected cannot open review.", + "interruptionReturn": "Touch and controller can inspect, compare, toggle, revise, cancel, and create without drag. Suspend preserves the verified offer-set ID and selected stable IDs without creating a run; resume revalidates the same set. Back before commit returns to Run Ledger; interruption after receipt resumes at the first Market." }, { "id": "SYS-006", - "name": "New campaign setup", - "focal": "difficulty consequence comparison, accessibility inheritance, Begin", - "action": "Begin Wayfinder campaign", - "variants": "difficulty review, slot overwrite review, seed disclosure; no character creator or randomized roster" + "name": "Resume review", + "input": "SELECT", + "purpose": "Explain current phase, last committed transaction, unresolved consequence, and resume destination.", + "action": "Resume; enters the exact safe state from BIND:SAVE_STATE.", + "emptyLoading": "No active run offers Run Ledger. Loading shows the saved destination name.", + "errorConfirmation": "Invalid snapshot routes to Save Recovery. Resuming battle requires explicit review of playback state.", + "interruptionReturn": "Suspend changes nothing. Back returns to Title or Run Ledger, whichever invoked it." }, { "id": "SYS-007", - "name": "Returning recap", - "focal": "illustrated last events, unresolved objective, one suggested inspection", - "action": "Resume", - "variants": "1-7 days, 8-30 days, 30+ days, post-failure, post-restoration; skip to safe state" + "name": "Save recovery", + "input": "SELECT", + "purpose": "Compare valid save lineage, migration, conflict, and known lost interval.", + "action": "Load selected valid state; changes active lineage and records a receipt.", + "emptyLoading": "No valid recovery offers diagnostics and safe deletion path. Loading validates and names each candidate.", + "errorConfirmation": "Failed recovery cannot overwrite the last valid source. Selection review lists timestamp, ruleset, lost interval, and reversibility.", + "interruptionReturn": "Suspend retains candidates but makes no choice. Back returns to Run Ledger." }, { "id": "SYS-008", - "name": "Save recovery", - "focal": "valid lineage, exact lost interval, recovery options", - "action": "Load recommended valid commit", - "variants": "corrupt active, all snapshots corrupt, migration fallback, cloud conflict; export diagnostics and return to slots" + "name": "Credits, licenses, and data notice", + "input": "LIST", + "purpose": "Present authorship, licenses, privacy, local/offline behavior, and external-link policy.", + "action": "Open section; no run consequence.", + "emptyLoading": "No search result offers Clear Search. Loading long text retains the current local section.", + "errorConfirmation": "Missing license is a blocking production defect with diagnostics. External links require destination confirmation.", + "interruptionReturn": "Suspend preserves scroll position. Back returns to the invoking Title or Settings screen." }, { - "id": "SYS-009", - "name": "Profile completion", - "focal": "campaign, mastery, collection, challenge completion rings", - "action": "Open incomplete category", - "variants": "first campaign, completed, 100% state; back to Title or Records" + "id": "HUB-001", + "name": "Guild desk", + "input": "NAV", + "purpose": "Show current pressure, preparation readiness, latest outcome, resources, and all preparation destinations.", + "action": "Open Risk Board when ready; navigation itself changes nothing.", + "emptyLoading": "First run uses a compact opening decision prompt. Loading each status region leaves destinations usable.", + "errorConfirmation": "Missing mandatory binding blocks only its dependent destination and names the owner. No confirmation.", + "interruptionReturn": "Suspend records no new transaction. Child pages return here with the changed field highlighted." }, { - "id": "SYS-010", - "name": "Credits, licenses, and data use", - "focal": "credits chapters, licenses, privacy/offline statement", - "action": "Open section", - "variants": "text search, external link confirmation; back to Title" + "id": "HUB-002", + "name": "Forecast", + "input": "LIST", + "purpose": "Explain upcoming known threats, opportunities, deadline, and information confidence.", + "action": "Track pressure; changes the Guild desk summary only.", + "emptyLoading": "No optional forecast still shows the mandatory next pressure. Loading preserves last verified forecast with timestamp.", + "errorConfirmation": "Stale or incomplete forecast labels uncertainty instead of inventing certainty. Tracking needs no confirmation.", + "interruptionReturn": "Suspend preserves filters. Back returns to Guild desk." }, { - "id": "GLD-001", - "name": "Guild Yard", - "focal": "current objective in world, active service, ready company", - "action": "Open World Map", - "variants": "chapter 1 broken yard through eight restoration states; idle, returning, facility alert, chapter complete" + "id": "SHP-001", + "name": "Shop", + "input": "LIST", + "purpose": "Compare BIND:SHOP_OFFERS, affordability, roster/equipment fit, and refresh consequence.", + "action": "Inspect offer; purchase is never performed from the list row.", + "emptyLoading": "Sold out explains next sourced restock. No matching filter offers Clear Filters. Loading keeps balances visible and rows inert.", + "errorConfirmation": "Stale, duplicate, or unavailable offers refresh before review. Refresh and any paid action require exact cost confirmation.", + "interruptionReturn": "Suspend cancels no verified purchase and polls receipts on resume. Back returns to Guild desk." }, { - "id": "GLD-002", - "name": "Objective board", - "focal": "next anchor objective, two optional goals, known consequence", - "action": "Track objective", - "variants": "no optional goals, completed, blocked by route, postgame; close to Yard" - }, - { - "id": "GLD-003", - "name": "Roster", - "focal": "six selected members, readiness issues, available recruits", - "action": "Inspect adventurer", - "variants": "30 owned, filtered, injured, no valid deployable, new recruit, 130% text; back to Company" - }, - { - "id": "GLD-004", - "name": "Adventurer detail", - "focal": "full-body adventurer, current profession/talent, readiness", - "action": "Edit loadout", - "variants": "recruited, locked silhouette with known route, three Strain, relationship scene ready, max mastery" - }, - { - "id": "GLD-005", - "name": "Formation workshop", - "focal": "six-slot Weave Grid, predicted protection/targets, validation", - "action": "Confirm company", - "variants": "empty slot, invalid role, reserves, drag and tap-select paths, compare preset, tutorial highlight" - }, - { - "id": "GLD-006", - "name": "Company presets", - "focal": "named formation preview, legal differences, save/overwrite action", - "action": "Apply preset", - "variants": "empty, invalid after content change, current, six saved presets; overwrite/delete review" - }, - { - "id": "GLD-007", - "name": "Profession assignment", - "focal": "character silhouette, base/advanced tree, combat role preview", - "action": "Assign profession", - "variants": "locked, mastery-ready, branch choice, respec, no compatible advanced branch; cancel preserves loadout" - }, - { - "id": "GLD-008", - "name": "Skill loadout", - "focal": "four skill slots, timeline effect preview, point budget", - "action": "Confirm skills", - "variants": "empty slot, over budget, invalid combination, refund, maxed, large text scroll" - }, - { - "id": "GLD-009", - "name": "Equipment loadout", - "focal": "equipped silhouette layers, exact behavior delta, inventory candidates", - "action": "Equip selected item", - "variants": "no item, unique-group dormant, comparison, attunement, locked route, salvage-protected" - }, - { - "id": "GLD-010", - "name": "Standing orders", - "focal": "event-condition-action row, exception preview, mastery eligibility", - "action": "Save order", - "variants": "no mastery, invalid condition, overlapping rules, disabled, training preview; back to Company" - }, - { - "id": "GLD-011", + "id": "SHP-002", "name": "Recruit review", - "focal": "named character, motive and field proof, company impact", - "action": "Recruit", - "variants": "roster full is not a blocker because reserves are persistent; decline defers, never deletes recruit" + "input": "SELECT", + "purpose": "Evaluate generated name, profession, trait benefit/cost, rolled attributes, equipment eligibility, level, survival history, price, and party impact.", + "action": "Recruit; commits BIND:RECRUIT_TRANSACTION after review.", + "emptyLoading": "Missing roster comparison states which binding is pending. Loading shows stable recruit identity, never a substitute recruit.", + "errorConfirmation": "Offer expired, insufficient value, invalid capacity, or duplicate receipt keeps the prior state. Confirmation states exact recruit, cost, capacity effect, and undo policy.", + "interruptionReturn": "Suspend after commit checks receipt before retry. Cancel returns to Shop on the same stable offer ID." }, { - "id": "GLD-012", - "name": "Relationship scene index", - "focal": "two-character scene illustration, unresolved relationship, reward type", - "action": "Play scene", - "variants": "locked reason, ready, seen, consent-sensitive skip summary; back to Adventurer or Records" - }, - { - "id": "GLD-013", - "name": "Guild history", - "focal": "chronological illustrated repair line, current consequence", - "action": "Inspect event", - "variants": "empty first launch, filtered character/region, ending; back to Records" - }, - { - "id": "WRK-001", - "name": "Workshop floor", - "focal": "working forge, selected recipe family, material shortage/surplus", - "action": "Open Forge", - "variants": "broken, basic, selected chapter restoration, postgame; back to Yard" - }, - { - "id": "WRK-002", - "name": "Forge and craft", - "focal": "output item, exact budget/effect, ingredient change", - "action": "Craft one", - "variants": "affordable, insufficient, deterministic counter-item fallback, duplicate, inventory cap policy" - }, - { - "id": "WRK-003", - "name": "Upgrade", - "focal": "before/after item, behavior preserved/changed, exact cost", - "action": "Upgrade", - "variants": "at cap, chapter lock, insufficient, equipped item, unique behavior boundary" - }, - { - "id": "WRK-004", - "name": "Salvage review", - "focal": "item to lose, returned materials, affected presets", - "action": "Confirm salvage", - "variants": "locked/favorite/equipped/protected, bulk selection, no eligible items; destructive second confirm" - }, - { - "id": "WRK-005", - "name": "Clinic", - "focal": "injured adventurers in scene, Strain, available recovery", - "action": "Recover selected unit", - "variants": "no Strain, insufficient Supply only at Anchor, full Guild recovery, story scene ready" - }, - { - "id": "WRK-006", - "name": "Service restoration", - "focal": "two physical service futures, world/economy consequences, preview", - "action": "Choose restoration", - "variants": "eight chapter-specific decisions, consequence comparison, confirmation, completed permanent state" - }, - { - "id": "WRK-007", - "name": "Facility detail", - "focal": "facility process animation, current capability, next unlock", - "action": "Use service", - "variants": "locked, newly restored, upgrade-ready, fully complete; back to Yard" - }, - { - "id": "WRK-008", - "name": "Training hall", - "focal": "fixed threat, selected counter hypothesis, no-reward label", - "action": "Start training", - "variants": "tutorial, same-seed replay, custom formation, invalid company, completed analysis" + "id": "SHP-003", + "name": "Item offer review", + "input": "SELECT", + "purpose": "Explain item behavior, eligible recruits, owned conflicts, price, and likely party effect.", + "action": "Buy; adds the item according to sourced inventory rules.", + "emptyLoading": "No eligible recruit is informative, not an error. Loading retains item identity and offer price timestamp.", + "errorConfirmation": "Expired, unaffordable, full-policy, or duplicate claim states preserve balance. Confirmation lists cost, destination, and conflict.", + "interruptionReturn": "Suspend reconciles the transaction receipt. Cancel returns to Shop on the offer." }, { "id": "REC-001", - "name": "Records atrium", - "focal": "illustrated category shelves, newest discovery, completion", - "action": "Open category", - "variants": "first discovery, all complete, filtered; back to Yard" + "name": "Roster", + "input": "LIST", + "purpose": "Scan all cumulative Recruits, deployed status, profession, trait, readiness, equipment issue, and survival history.", + "action": "Inspect Recruit; changes nothing.", + "emptyLoading": "Zero live Recruits is shown only while resolving casualty recovery or Company collapse; it routes to the sourced recovery/closure state, never an ordinary Shop. No filter match offers Clear Filters. Loading uses stable roster order.", + "errorConfirmation": "Binding failure preserves last verified summary and blocks dependent edits. No confirmation.", + "interruptionReturn": "Suspend preserves selection and filters. Back returns to Guild desk or the required recovery/closure screen." }, { "id": "REC-002", - "name": "Bestiary", - "focal": "enemy illustration/silhouette, known mechanic, counter evidence", - "action": "Inspect identity", - "variants": "unseen, observed, researched, mastered, variant, boss; chapter/filter/search states" + "name": "Recruit detail", + "input": "NAV", + "purpose": "Read one Recruit's sourced identity, mechanical history, current role, equipment, position, and legal actions.", + "action": "Open Equip or Party Line; navigation changes nothing. Dismiss is a separate destructive action.", + "emptyLoading": "Missing optional history states No recorded battles. Loading keeps name, stable ID, and the last verified BIND:DISMISSAL_ELIGIBILITY.", + "errorConfirmation": "Deleted/stale Recruit returns to Roster with explanation. When total live Recruits across deployed and reserve equals one, Dismiss remains visible but disabled with One member must remain; its explanation directs the player to the separate Run Abandonment Review.", + "interruptionReturn": "Suspend preserves the selected tab. Back returns to Roster and its prior scroll position." }, { "id": "REC-003", - "name": "Item catalog", - "focal": "item illustration, owned count, behavior summary", - "action": "Inspect item", - "variants": "unknown source, known-unowned, owned, upgraded, attuned, collection-linked" + "name": "Dismissal review", + "input": "MODAL", + "purpose": "State exactly what leaves the run, what is retained, affected party/equipment references, verified eligibility, and BIND:DISMISSAL_OUTCOME.", + "action": "Dismiss Recruit; permanently applies the sourced transaction only after eligibility is revalidated.", + "emptyLoading": "If dismissal is already illegal, the review does not open; Recruit Detail shows the disabled reason and abandonment route. Loading must verify current total live Recruits before the destructive action enables.", + "errorConfirmation": "Confirmation uses generated name, stable ID, outcome, and an explicit destructive gesture. If a stale confirmation is submitted after the total live count falls to one, reject and close the review with no Recruit mutation and no rebate; Recruit Detail shows One member must remain and the separate abandonment action.", + "interruptionReturn": "Suspend before commit cancels nothing; after commit verifies receipt. Cancel returns to Recruit Detail." }, { - "id": "REC-004", - "name": "Profession atlas", - "focal": "12-base radial branches, selected role, mastery proof", - "action": "Inspect profession", - "variants": "locked advanced, eligible, mastered, character compatibility, comparison" + "id": "EQP-001", + "name": "Equipment workbench", + "input": "LIST", + "purpose": "Equip a selected recruit while showing eligible inventory and sourced behavior changes.", + "action": "Equip selected item; changes loadout only after comparison review.", + "emptyLoading": "No owned items points to Shop. No eligible item explains profession/slot requirements. Loading retains current loadout.", + "errorConfirmation": "Incompatible, already used, stale inventory, or ruleset error blocks commit with reason. Confirmation states replaced item, conflicts, and before/after behavior.", + "interruptionReturn": "Suspend before receipt keeps the old loadout; resume reconciles receipt. Back returns to Recruit Detail or Party Line caller." }, { - "id": "REC-005", - "name": "Character archive", - "focal": "30 portrait ledger, selected arc state, relationship links", - "action": "Inspect character", - "variants": "unknown, recruitable, recruited, arc complete, ending state" + "id": "EQP-002", + "name": "Item comparison", + "input": "SELECT", + "purpose": "Compare current and candidate item in the vocabulary used by party preview, battle, and results.", + "action": "Apply candidate; returns to workbench with changed effects highlighted.", + "emptyLoading": "Empty candidate keeps current item and offers Choose Item. Loading never clears current values.", + "errorConfirmation": "Unknown derived effect is labeled unresolved and blocks Apply when consequence-critical. Confirmation lists all sourced changes and affected saved plan references.", + "interruptionReturn": "Suspend keeps comparison but performs no equip. Back returns to Equipment with selection intact." }, { - "id": "REC-006", - "name": "Achievement ledger", - "focal": "achievement artwork, exact requirement progress, reward", - "action": "Inspect achievement", - "variants": "hidden only when discovery is the mechanic; incomplete, claim-ready, complete, platform sync pending" + "id": "ART-001", + "name": "Active artifact ledger", + "input": "LIST", + "purpose": "Inspect run-wide artifact rules, acquisition source, interactions, conflicts, and lifecycle without treating them as recruit equipment.", + "action": "Inspect artifact; changes nothing unless BIND:ARTIFACT_RULES supplies a separate legal action.", + "emptyLoading": "No active artifacts explains their sourced acquisition route. Loading retains verified active rules.", + "errorConfirmation": "Missing or conflicting artifact references identify stable IDs and block dependent commitment. Any lifecycle-changing action requires a separate sourced confirmation.", + "interruptionReturn": "Suspend preserves selection. Back returns to Guild desk or the Reward caller." }, { - "id": "REC-007", - "name": "Collection room", - "focal": "physical collection display, missing evidence, regional consequence", - "action": "Inspect collection", - "variants": "empty plinth, partial, complete, Second Weave variation" + "id": "PTY-001", + "name": "Party line", + "input": "ORDER", + "purpose": "Select simultaneous Recruits on one visual line from protected rear at left to exposed front at right, with position 0 at the front and larger numbers extending leftward; preview sourced targeting, protection, reach, healing, movement, and replacement changes.", + "action": "Save order; changes the prepared party snapshot but does not start battle.", + "emptyLoading": "Zero live Recruits is a casualty/Company-collapse settlement state and routes to sourced recovery or run close; ordinary dismissal never creates it. No eligible deployable Recruit explains the recovery or roster reason. Loading preserves last committed order and rear-left/front-right endpoints.", + "errorConfirmation": "Invalid count, duplicate Recruit, incompatible state, or stale capacity identifies the exact numbered position. Confirmation is required only when removing a currently prepared Recruit has a sourced consequence.", + "interruptionReturn": "Suspend stores only the last committed order; uncommitted moves are offered to Restore or Discard. Back returns to Guild desk." }, { - "id": "REC-008", - "name": "Tutorials and glossary", - "focal": "current topic illustration, plain-language rule, replay link", - "action": "Replay example", - "variants": "never seen, newly unlocked, completed, returning recommendation, search/no result" + "id": "PTY-002", + "name": "Readiness review", + "input": "SELECT", + "purpose": "Summarize the frozen rear-left/front-right order, position numbers, protection contributors toward the right/front, equipment issues, known pressure coverage, Reserve state, and BIND:PARTY_CAPACITY.", + "action": "Accept preparation; records a reviewable battle-plan snapshot.", + "emptyLoading": "Empty party blocks acceptance and points to Add Recruits. Loading verifies all stable IDs without reversing visual order.", + "errorConfirmation": "Invalid or outdated effect opens the owning edit screen. Confirmation states warnings that are allowed but does not overstate outcome prediction.", + "interruptionReturn": "Suspend preserves the last accepted snapshot. Back returns to Party Line." }, { - "id": "REC-009", - "name": "Battle reports archive", - "focal": "encounter scene strip, first failure point, build snapshot", - "action": "Open report", - "variants": "victory, defeat, retreat, training, missing old ruleset; compare two reports" + "id": "RSK-001", + "name": "Risk board", + "input": "SELECT", + "purpose": "Compare sourced risk options by known pressure, uncertainty, entry cost, reward class, recovery exposure, and current party coverage.", + "action": "Review selected risk; selection alone changes nothing.", + "emptyLoading": "No legal option explains whether preparation, progression, or recovery is required. Loading retains accepted party summary.", + "errorConfirmation": "Unresolved or stale option cannot be committed. No confirmation until RSK-002.", + "interruptionReturn": "Suspend preserves selection only locally. Back returns to Guild desk." }, { - "id": "WLD-001", - "name": "Concordance world map", - "focal": "active rupture, current settlement, chapter route", - "action": "Enter chapter", - "variants": "chapter locked, available, active, restored, postgame remix; back to Yard" - }, - { - "id": "WLD-002", - "name": "Chapter overview", - "focal": "settlement key art, learning goal, persistent choice", - "action": "View expedition", - "variants": "new, in progress, confrontation ready, restored, unresolved objective, Reweave" - }, - { - "id": "WLD-003", - "name": "Settlement hub", - "focal": "local service at risk, named contact, route exits", - "action": "Open route board", - "variants": "chapter-specific before/after repair, optional scene, recruit ready" - }, - { - "id": "EXP-001", - "name": "Expedition briefing", - "focal": "route objective, company readiness, difficulty losses", - "action": "Begin expedition", - "variants": "invalid company, no counter tag, safe warning, resumed expedition, Reweave law" - }, - { - "id": "EXP-002", - "name": "Route graph", - "focal": "next forks, route pressure, Cache/Supplies", - "action": "Inspect node", - "variants": "hidden, forecasted, selected, completed, closed, reroute path, boss approach" - }, - { - "id": "EXP-003", - "name": "Node comparison", - "focal": "two node scenes, threat/counter, reward/cache delta", - "action": "Commit node", - "variants": "safe/elite/camp/story/recruit/mastery/boss, unknown bounded reward, inaccessible reason" - }, - { - "id": "EXP-004", - "name": "Encounter preview", - "focal": "enemy formation, major telegraphs, projected first targets", - "action": "Prepare company", - "variants": "ordinary, elite, sub-boss, boss, researched variant, surprise clause with legal preview" - }, - { - "id": "EXP-005", - "name": "Between-node company", - "focal": "formation, health/Strain, reserve and limited changes", - "action": "Continue", - "variants": "reserve swap, one free change, extra change costing Supply, no legal unit" - }, - { - "id": "EXP-006", - "name": "Camp", - "focal": "recovery candidates, Supply cost, next pressure", - "action": "Commit camp action", - "variants": "heal, clear Strain, field craft, relationship, leave unused; exact opportunity cost" - }, - { - "id": "EXP-007", - "name": "Noncombat decision", - "focal": "illustrated situation, two or three consequences, affected records", - "action": "Choose reviewed option", - "variants": "insufficient condition, defer, irreversible chapter flag, accessibility summary" - }, - { - "id": "EXP-008", - "name": "Reward draft", - "focal": "three authored rewards, build interaction, Cache exposure", - "action": "Accept reward", - "variants": "bad-luck guarantee, deterministic counter item, no inventory space policy, skip for Crowns" - }, - { - "id": "EXP-009", - "name": "Cache management", - "focal": "unsecured physical satchel, exact risk lines, Anchor distance", - "action": "Secure or continue", - "variants": "empty, mixed splittable/indivisible, difficulty preview, loss example, post-battle update" - }, - { - "id": "EXP-010", - "name": "Anchor", - "focal": "banked reward transfer, persistent route state, three next plans", - "action": "Commit next plan", - "variants": "bank, recover, update order, withdraw, chapter confrontation, corrupted save blocked" - }, - { - "id": "EXP-011", - "name": "Withdrawal review", - "focal": "bank/discard comparison, Supply conversion, route consequence", - "action": "Confirm withdrawal", - "variants": "three difficulty contracts, noncombat only, cancel, operation retry receipt" - }, - { - "id": "EXP-012", - "name": "Chapter confrontation", - "focal": "boss scene, learned mechanics checklist, consequence allies", - "action": "Begin confrontation", - "variants": "not ready, ready, alternate ally support, Reweave clauses" + "id": "RSK-002", + "name": "Risk commitment", + "input": "MODAL", + "purpose": "Present the chosen option, known threats, uncertainty, cost, reward class, retreat implication, and frozen party snapshot.", + "action": "Begin battle; commits the sourced risk transaction and opens Battle Opening.", + "emptyLoading": "Missing party snapshot or option returns to the owning screen. Loading verifies all dependencies.", + "errorConfirmation": "Stale resources, changed recruit state, or invalid rule reopens the changed source. Confirmation is the page's purpose and names irreversible effects.", + "interruptionReturn": "Suspend before receipt changes nothing; after receipt resumes at Battle Opening. Cancel returns to Risk Board." }, { "id": "BAT-001", "name": "Battle opening", - "focal": "lane matchup, first telegraph, greatest-risk ally", - "action": "Start or inspect", - "variants": "1x tutorial lock, normal, boss phase intro, resumed snapshot" + "input": "BATTLE", + "purpose": "Establish objective, player order from protected rear at left to position 0 exposed front at right, enemy-facing direction, first known threat, playback speed, and inspection affordance.", + "action": "Start observation; releases the deterministic timeline.", + "emptyLoading": "Missing actor data blocks start and names the binding. Loading shows verified actor silhouettes, position markers, and progress.", + "errorConfirmation": "Snapshot mismatch returns safely to Risk Commitment or Resume Review. Start needs explicit input only on first onboarding or resumed state.", + "interruptionReturn": "Suspend preserves an unopened snapshot. Back is disabled after risk commitment; Pause offers legal exits." }, { "id": "BAT-002", "name": "Live battle", - "focal": "next telegraph, threatened ally, Directive state", - "action": "Inspect or intervene", - "variants": "calm, busy, Break, Downed, Rescue Window, Fracture Clock, boss phase, low-power" + "input": "BATTLE", + "purpose": "Make automatic resolution readable: current objective, urgent cause, actor state, target relation, event sequence, pause, speed, inspect, and retreat access.", + "action": "Inspect the highlighted cause; battle decisions are diagnostic controls only.", + "emptyLoading": "No current event shows Waiting for next event, not a blank field. Loading occurs only during safe resume and the timeline does not advance.", + "errorConfirmation": "Invalid event data pauses and offers Retry Snapshot or Safe Exit. Speed change needs no confirmation; retreat is separated.", + "interruptionReturn": "Backgrounding or device loss freezes according to save rules and routes to BAT-006. Closing inspect restores the prior legal playback state." }, { "id": "BAT-003", - "name": "Telegraph inspect", - "focal": "affected lane/targets, countdown, plain cause/counters", - "action": "Close and act", - "variants": "known, partially researched, variant, non-counterable but mitigable; pauses at allowed speeds" + "name": "Actor and event inspect", + "input": "BATTLE", + "purpose": "Explain selected actor, action, target, status source, order interaction, equipment contribution, and causal neighbors.", + "action": "Pin event or close; changes no battle result.", + "emptyLoading": "No related event states why. Loading pauses inspect data at the selected event ID.", + "errorConfirmation": "Hidden information states the discovery rule; missing required cause pauses with diagnostics. No confirmation.", + "interruptionReturn": "Suspend routes to Resume Review with the selected event remembered. Back closes inspect to Live Battle." }, { "id": "BAT-004", - "name": "Status and unit inspect", - "focal": "selected actor, current event timeline, exact derived values", - "action": "Pin event or close", - "variants": "ally/enemy/device/decoy, hidden value explanation, screen-reader linear version" + "name": "Pause and speed", + "input": "BATTLE", + "purpose": "Freeze observation where rules allow, expose playback options, settings, event log, controls, and retreat entry.", + "action": "Resume; restores the selected legal speed.", + "emptyLoading": "No speed alternatives shows one sourced speed. Loading settings does not resume time.", + "errorConfirmation": "Disallowed speed explains the rule. Applying settings may require its own Apply/Discard review.", + "interruptionReturn": "App suspend remains paused. Back resumes only when the player explicitly chooses Resume; Settings returns here." }, { "id": "BAT-005", - "name": "Directive selection", - "focal": "two prepared Directives, legal states, Command cost", - "action": "Select Directive", - "variants": "zero charge, illegal target, cooldown/window, mastered standing-order interaction" + "name": "Retreat review", + "input": "MODAL", + "purpose": "State BIND:RETREAT_OUTCOME, timing, interruption rule, affected recruits, losses, retained state, and next destination.", + "action": "Begin retreat; commits only after the full consequence is sourced.", + "emptyLoading": "Unavailable retreat shows exact condition and Close. Loading keeps battle paused.", + "errorConfirmation": "Stale outcome refreshes before confirmation; duplicate input returns the original receipt. Confirmation uses explicit Begin retreat.", + "interruptionReturn": "Suspend before commit returns to Pause; after commit resumes the retreat resolution snapshot. Cancel returns to Pause." }, { "id": "BAT-006", - "name": "Directive targeting", - "focal": "legal target/lane, outcome preview, cancel", - "action": "Review target", - "variants": "tap-select and controller focus, no legal target, target changes before commit" + "name": "Battle resume review", + "input": "SELECT", + "purpose": "Explain saved time, playback state, pending events, latest committed receipt, and whether retreat resolution is active.", + "action": "Resume from verified snapshot; never resumes in motion without review.", + "emptyLoading": "No resumable battle routes to the last safe Result or Guild state. Loading validates the snapshot.", + "errorConfirmation": "Invalid snapshot uses save recovery and never starts a partial simulation. Resume confirmation states current speed and pause behavior.", + "interruptionReturn": "Repeated suspend leaves the battle frozen. Back returns to Title without discarding the snapshot." }, { - "id": "BAT-007", - "name": "Directive review", - "focal": "exact event insertion, one charge cost, changed forecast", - "action": "Confirm Directive", - "variants": "duplicate confirm receipt, stale target rejection, cancel spends nothing" + "id": "OUT-001", + "name": "Battle result and diagnosis", + "input": "LIST", + "purpose": "Show outcome, first meaningful divergence, decisive interaction, downstream costs, survivor state, and available next resolution.", + "action": "Continue to the earliest unresolved consequence.", + "emptyLoading": "No preventable cause states No actionable divergence and still shows decisive events. Loading preserves outcome receipt.", + "errorConfirmation": "Missing causal data is an explicit diagnostic error; transaction remains paused. No confirmation.", + "interruptionReturn": "Suspend preserves the result receipt and scroll position. Back does not bypass unresolved consequences." }, { - "id": "BAT-008", - "name": "Battle event log", - "focal": "chronological icon/text rows, selected cause chain, jump-to-event", - "action": "Inspect event", - "variants": "current, paused, post-battle, filtered actor/type, captions, 130% text" + "id": "OUT-002", + "name": "Death and loss review", + "input": "SELECT", + "purpose": "Name each dead recruit, stable identity, profession, trait, level, survival history, equipment disposition, party gap, and sourced replacement implication.", + "action": "Acknowledge resolved losses; advances to Reward, Recovery, or Run End.", + "emptyLoading": "No deaths skips this screen. Loading renders known identities before disposition details.", + "errorConfirmation": "Incomplete casualty receipt blocks acknowledgement and offers Retry. Confirmation is acknowledgement of an already committed result, not a reversal offer.", + "interruptionReturn": "Suspend preserves unresolved acknowledgement. Back returns to Result diagnosis but cannot alter battle outcome." }, { - "id": "BAT-009", - "name": "Battle pause", - "focal": "battlefield frozen, resume, current objective", - "action": "Resume", - "variants": "settings overlay, controls, event log, retreat review; no hidden simulation progress" + "id": "OUT-003", + "name": "Reward choice", + "input": "SELECT", + "purpose": "Compare BIND:REWARD_OPTIONS by changed decision, eligible target, conflicts, and run impact.", + "action": "Claim selected reward; commits one sourced receipt.", + "emptyLoading": "No earned reward explains the result and offers Continue. Loading preserves result context.", + "errorConfirmation": "Expired, ineligible, duplicate, or storage-policy state returns a deterministic next action. Confirmation names reward, target, conflicts, and skip outcome.", + "interruptionReturn": "Suspend checks receipt before retry. Cancel returns to Result only if reward choice is not mandatory." }, { - "id": "BAT-010", - "name": "Retreat review", - "focal": "channel time, expected Cache/Supply/Strain transaction, risk", - "action": "Start retreat channel", - "variants": "unavailable, interrupted, completed, difficulty variants, cancel before commit" + "id": "OUT-004", + "name": "Recovery", + "input": "SELECT", + "purpose": "Compare legal recovery paths by cost, time, recruit availability, replacement opportunity, and next planning state.", + "action": "Commit recovery; changes the run according to BIND:RECOVERY_OPTIONS.", + "emptyLoading": "No recovery required offers Continue. No viable path exposes the run-ending route. Loading retains casualty and resource facts.", + "errorConfirmation": "Unaffordable, stale, or illegal paths remain inspectable with reason. Confirmation lists full transaction and next destination.", + "interruptionReturn": "Suspend before receipt spends nothing; after receipt resumes at its destination. Back returns to Result or Death Review." }, { - "id": "RES-001", - "name": "Victory tableau", - "focal": "surviving company, decisive rule, reward path", - "action": "View diagnosis", - "variants": "ordinary, elite, boss, no Downed, rescued, challenge complete" + "id": "OUT-005", + "name": "Run end summary", + "input": "LIST", + "purpose": "Explain BIND:RUN_FAILURE or clear, retained progression, losses, discoveries, decisions unlocked, and exact next choices.", + "action": "Finish run; closes the run and applies the verified progression receipt.", + "emptyLoading": "No progression gain is stated plainly. Loading waits for all receipts before enabling Finish.", + "errorConfirmation": "Duplicate or failed progression application preserves the run as unresolved. Finish confirmation is needed only if viewing unresolved optional pages would be lost.", + "interruptionReturn": "Suspend preserves the unresolved summary. Back remains within summary tabs; Finish returns to Title or Progression." }, { - "id": "RES-002", - "name": "Battle diagnosis", - "focal": "predicted vs actual timeline, first divergence, counter options", - "action": "Continue to reward", - "variants": "victory lesson, defeat cause, standing-order exception, no actionable error" + "id": "OUT-006", + "name": "Run abandonment review", + "input": "MODAL", + "purpose": "Keep explicit voluntary run closure separate from Recruit dismissal and state every consequence from BIND:RUN_ABANDONMENT.", + "action": "Abandon run; closes the run through one sourced receipt without selecting or dismissing a Recruit.", + "emptyLoading": "If abandonment is not legal from the current state, show the reason and safe return. Loading verifies closure consequences before enabling the destructive action.", + "errorConfirmation": "Confirmation names the run, cleared run-only state, retained history/progression, destination, and irreversibility; default focus is Cancel. A stale or duplicate operation returns a readable rejection or original receipt without partial closure.", + "interruptionReturn": "Suspend before commit changes nothing; after commit verifies the closure receipt. Cancel returns to Guild desk or Result, whichever invoked it." }, { - "id": "RES-003", - "name": "Defeat transaction", - "focal": "exact lost Cache lines, Strain/Supplies changes, cause", - "action": "Accept committed result", - "variants": "three difficulties, operation retry receipt, all cache lost, no cache" + "id": "PRO-001", + "name": "Run progression", + "input": "LIST", + "purpose": "Show current level paths, profession changes, capacity growth, prerequisites, and decisions opened within the active run.", + "action": "Inspect or apply a legal sourced choice.", + "emptyLoading": "No pending choice shows next prerequisite. Loading retains current applied state.", + "errorConfirmation": "Stale prerequisite or invalid choice refreshes before commit. Irreversible branch or reset uses explicit comparison confirmation.", + "interruptionReturn": "Suspend reconciles any receipt. Back returns to Guild desk or Result caller." }, { - "id": "RES-004", - "name": "Recovery choice", - "focal": "first preventable event, three legal paths, retained state", - "action": "Reconfigure at Anchor", - "variants": "train same seed, end at Guild, no Anchor fallback; never paid continue" + "id": "PRO-002", + "name": "Persistent progression", + "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." }, { - "id": "RES-005", - "name": "Chapter restoration result", - "focal": "transformed location, chosen service, new capability", - "action": "Return to Guild", - "variants": "eight chapter-specific transformations, delayed consequence, Reweave change" + "id": "PRO-003", + "name": "Records and compendium", + "input": "LIST", + "purpose": "Browse professions, traits, equipment, artifacts, enemies, bosses, regions, recruit histories, and battle reports without spoilers.", + "action": "Inspect entry; changes no run result.", + "emptyLoading": "Category empty states discovery route when allowed. No search result offers Clear Search. Loading keeps category context.", + "errorConfirmation": "Missing referenced entry reports stable ID and diagnostics. Inspection requires no confirmation and external links do not exist here.", + "interruptionReturn": "Suspend preserves category, filter, and scroll ID. Back returns to caller." }, { - "id": "RES-006", - "name": "Campaign ending", - "focal": "working federation panorama, character outcomes, completion", - "action": "Enter epilogue records", - "variants": "choice-reactive panels, credits, Second Weave offer, continue completed world" + "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." }, { - "id": "RES-007", - "name": "Second Weave setup", - "focal": "carried accord, selectable law, visible changed route", - "action": "Begin new weave", - "variants": "locked requirements, law conflict, difficulty review, completed challenge state" + "id": "PST-002", + "name": "Postgame 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." + }, + { + "id": "PST-003", + "name": "Postgame 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." }, { "id": "SET-001", "name": "Settings index", - "focal": "categories, changed-value indicator, Reset category", - "action": "Open category", - "variants": "title/guild/battle entry, unsaved input remap, safe defaults" + "input": "SETTINGS", + "purpose": "Navigate Display/Text, Motion/Effects, Audio/Captions, Controls, Language, Gameplay Information, Save/Data, and Reset.", + "action": "Open category; no run consequence.", + "emptyLoading": "No changed settings shows current preset. Loading categories does not block Back.", + "errorConfirmation": "Invalid stored setting uses documented safe default and identifies it. No confirmation.", + "interruptionReturn": "Suspend preserves selected category. Back returns to exact caller: Title, Guild, or Pause." }, { "id": "SET-002", - "name": "Display", - "focal": "UI scale preview, safe area, contrast", - "action": "Apply display settings", - "variants": "100/115/130%, high contrast, color cues, brightness, window/display modes" + "name": "Display and text", + "input": "SETTINGS", + "purpose": "Set safe area, brightness, contrast, color-independent cues, and 100/115/130% UI/text with live preview.", + "action": "Apply display settings.", + "emptyLoading": "Unavailable display option remains visible with reason. Preview loading shows text sample.", + "errorConfirmation": "Unsupported combination offers nearest supported result without auto-applying. Apply/Discard review appears on exit with changes.", + "interruptionReturn": "Output change freezes preview and retains values. Return to Settings index." }, { "id": "SET-003", - "name": "Motion and effects", - "focal": "live sample, reduced motion/flashes, camera/hit stop", - "action": "Apply effects", - "variants": "low power, particle density, shake 0-100%, photosensitivity preset" + "name": "Motion, flashes, and power", + "input": "SETTINGS", + "purpose": "Set reduced motion, reduced flashes, shake, hit pause, particle density, and low-power behavior with a non-combat sample.", + "action": "Apply effects settings.", + "emptyLoading": "Unsupported effect control explains platform behavior. Sample loading never flashes.", + "errorConfirmation": "Unsafe or unavailable combination reverts preview only. Apply/Discard on exit.", + "interruptionReturn": "Backgrounding stops sample. Return to Settings index." }, { "id": "SET-004", - "name": "Audio", - "focal": "master/music/ambience/voice/SFX sliders, live test", - "action": "Apply audio", - "variants": "mute, output change, subtitles/captions, dynamic range, mono compatibility" + "name": "Audio and captions", + "input": "SETTINGS", + "purpose": "Set master/music/ambience/SFX/voice-when-present levels, mute, dynamic range, captions, event labels, and mono-compatible cues.", + "action": "Apply audio settings.", + "emptyLoading": "Missing output or absent voice category is stated. Test loading is silent with visible status.", + "errorConfirmation": "Output failure keeps captions and visual cues active. Apply/Discard is the exit confirmation.", + "interruptionReturn": "Output change pauses test and retains settings. Return to Settings index." }, { "id": "SET-005", "name": "Controls", - "focal": "current device map, focus path sample, conflicts", - "action": "Save mapping", - "variants": "touch options, mouse/keyboard, controller, hold timing, reset, disconnect" + "input": "SETTINGS", + "purpose": "Inspect and remap touch, keyboard/mouse, and controller actions; set hold timing and vibration.", + "action": "Save mapping.", + "emptyLoading": "No controller attached still permits mapping inspection. Loading keeps safe Cancel binding.", + "errorConfirmation": "Conflict names both actions and requires resolve; essential actions cannot be left unbound. Save confirmation lists changed mappings.", + "interruptionReturn": "Device loss pauses capture and spends no input. Return to Settings index after Apply/Discard." }, { "id": "SET-006", - "name": "Language and text", - "focal": "language preview, glossary sample, subtitle size", - "action": "Apply language", - "variants": "English, zh_CN, 130%, dyslexia-friendly spacing option, pseudolocale developer-only" + "name": "Language and locale", + "input": "SETTINGS", + "purpose": "Select English or Simplified Chinese and preview mechanics, dates, numbers, and wrapping.", + "action": "Apply language; reloads localized text without changing run state.", + "emptyLoading": "Missing optional locale pack names the fallback. Loading uses current language until complete.", + "errorConfirmation": "Invalid string key shows stable diagnostic ID, not raw code in player copy. Apply confirmation appears when a reload is required.", + "interruptionReturn": "Suspend resumes the reload safely. Return to Settings index in the applied language." }, { "id": "SET-007", - "name": "Gameplay assists", - "focal": "pause behavior, speed defaults, forecast detail", - "action": "Apply assists", - "variants": "no result-changing assist hidden as accessibility; changes explain scope" + "name": "Gameplay information", + "input": "SETTINGS", + "purpose": "Set forecast detail, tutorial reminders, battle log density, default speed, and other information assists without hiding result-changing rules.", + "action": "Apply information settings.", + "emptyLoading": "Unavailable option states dependency. Preview loading uses a fixed non-authoritative sample.", + "errorConfirmation": "Disallowed combination explains the rule. Apply/Discard on exit.", + "interruptionReturn": "Suspend stops preview only. Return to Settings index." }, { "id": "SET-008", - "name": "Save and cloud", - "focal": "local commit health, cloud state, export", - "action": "Manage save", - "variants": "offline, sync, divergence, conflict, backup recovered, diagnostics export" + "name": "Save and data", + "input": "SETTINGS", + "purpose": "Inspect local save health, optional synchronization, conflicts, backups, export, and diagnostics.", + "action": "Open selected management action; routine inspection changes nothing.", + "emptyLoading": "Offline state keeps local status and names queued optional work. Loading shows last verified timestamp.", + "errorConfirmation": "Conflict and recovery use SYS-007; export failure retains local data. Replacing a lineage requires full comparison confirmation.", + "interruptionReturn": "Suspend pauses external work and keeps a durable receipt. Return to Settings index." }, { "id": "SET-009", - "name": "Data and reset", - "focal": "exact scope summary, recoverable trash policy", - "action": "Open review", - "variants": "campaign delete, profile reset, local diagnostics clear; destructive flow only" - }, - { - "id": "SET-010", - "name": "Diagnostics", - "focal": "build/ruleset IDs, event/export summaries, copy action", - "action": "Export diagnostic", - "variants": "redacted by default, no credentials, export success/failure" - } - ], - "characters": [ - { - "identity": "CHR-001 Mara Venn, 34, she/her, acting steward of FAC-01", - "gameplay": "Wants the guild to remain answerable to settlements rather than permits. Thesis: a durable Front leader makes mixed roles safer. Base affinities PR-B01,PR-B12; advanced PR-A23,PR-A01. Talent Open Roster: the first three different allied role tags each encounter give Mara 8 Guard; a duplicate grants nothing.", - "story": "Former repair partner of CHR-002; protective older cousin to CHR-004; distrusts CHR-029. Recruitment: automatic at CH-01 opening. Arc: stops treating every failure as hers to absorb and writes delegation into the guild charter.", - "production": "P: weathered square face, dark curls shaved at left temple, repaired yellow coat, bell-key badge. S: broad stance, one-handed shield check, private shoulder-unclench idle. V: low practical alto, 28 combat/hub lines plus 3 scenes; no shouted tutorials. L: surname is not “vain”; Chinese name transliterates sound, title “代理会长” remains distinct from owner/chief." - }, - { - "identity": "CHR-002 Oren Pell, 41, he/him, relay mechanic", - "gameplay": "Wants to repair the Waylamp whose safety check he waived under deadline. Thesis: device play becomes mobile rather than stationary. Base PR-B08,PR-B11; advanced PR-A15,PR-A16. Talent Carry the Spark: once per 8 seconds, moving bands drags his oldest device with him and shortens its duration by 2 seconds.", - "story": "Estranged friend of CHR-001; craft rival to CHR-012; becomes mentor to CHR-020. Recruitment: automatic after Waylamp recovery in CH-01 segment 1. Arc: replaces secret guilt with a public maintenance record and accepts peer review.", - "production": "P: long face, silver-flecked beard braid, copper goggles kept above eyes, patched coil vest. S: stooped walk, careful two-hand deploy, anxious tool-count idle. V: warm baritone with clipped self-corrections; 24 lines/4 scenes. L: preserve technical false starts; localize puns as repair metaphors, not literal wire jokes." - }, - { - "identity": "CHR-003 Ilyo Fen, 27, they/them, basin clinician", - "gameplay": "Wants stable power for patients whose registrations lapse during seasonal work. Thesis: triage can be proactive through forecasted damage. Base PR-B04,PR-B03; advanced PR-A07,PR-A08. Talent Triage Slate: at encounter start, the ally with lowest maximum vitality is tagged; first heal on that ally also pauses one debuff for 2 seconds.", - "story": "Trusted by CHR-001; teases CHR-004; later shares unregistered-care methods with CHR-025. Recruit by powering the clinic in CH-01 segment 3, or after boss if towers chosen. Arc: learns to distribute care instead of staying indispensable.", - "production": "P: compact build, freckled brown skin, mint scarf, slate earrings, visible hand brace. S: brace-respecting grip, slate tap, seated recovery idle. V: clear mid register, calm without softness stereotype; 26 lines/3 scenes. L: singular they must remain explicit in English; Simplified Chinese avoids forced gender pronouns and preserves name 伊廖." - }, - { - "identity": "CHR-004 Tamsin Roe, 19, she/her, wind courier", - "gameplay": "Wants the warning towers restored so no farm learns of danger last. Thesis: information is worth damage when it changes target selection. Base PR-B06,PR-B02; advanced PR-A11,PR-A04. Talent Second Route: first time a Marked target becomes invalid, her queued attack retargets the next threat at full rather than 70% power.", - "story": "Younger cousin of CHR-001; friendly rivalry with CHR-010; admires CHR-021 until seeing the cost of stunt heroics. Recruit by clearing the high ridge in CH-01 segment 4, or at finale. Arc: shifts from fastest solo messenger to builder of redundant routes.", - "production": "P: triangular wind hood, copper-brown skin, cropped curls, tower ribbons tied at wrists. S: forward lean, map-flip aim, impatient heel bounce. V: bright fast mezzo, speed without slurred accessibility; 25 lines/3 scenes. L: “Roe” is a family name, not deer wordplay; route terms use the campaign glossary consistently." - }, - { - "identity": "CHR-005 Suri Tal, 38, she/her, Reedbound ferry organizer", - "gameplay": "Wants communal filters protected from privatized toll routes. Thesis: moving an ally should heal planning errors without erasing them. Base PR-B10,PR-B05; advanced PR-A19,PR-A20. Talent Room in the Boat: first ally she pulls each encounter leaves a 3-second safe lane that cleanses Drift for the next follower.", - "story": "Union ally of CHR-006; ideological opponent then friend to CHR-008; recognizes CHR-027 from old maintenance runs. Recruit after defending both ferry crews in CH-02 segment 2. Arc: publishes dangerous flood testimony while creating consent rules for stored voices.", - "production": "P: tall, deep umber skin, reed-plait rain cape, broad ferry pole. S: pole pivot and open-hand pull, steady boat-balance idle. V: resonant contralto, deliberate community-address cadence; 30 lines/4 scenes. L: union language must sound civic, not ideological caricature; Chinese uses “芦盟摆渡人” for role, not ethnic marker." - }, - { - "identity": "CHR-006 Beck Alder, 52, he/him, keeper of recorded testimony", - "gameplay": "Wants every stored voice heard in context, including his own harmful order during the old flood. Thesis: rests and cadence control make patience actionable. Base PR-B07,PR-B04; advanced PR-A13,PR-A14. Talent Full Quotation: after Measured Rest, the next allied secondary clause cannot be Hushed and resolves at 90% if its base action misses.", - "story": "Longtime collaborator of CHR-005; cautious teacher to CHR-007; clashes with archive purist CHR-013. Recruit by recovering three testimony caches in CH-02 segment 3. Arc: stops guarding recordings as property and establishes speaker-controlled access.", - "production": "P: round older face, moss-gray locs, layered waterproof vest, one cracked handbell. S: seated listening pose, bell held close rather than aloft. V: textured tenor, restrained sung intervals recorded as optional layers; 22 lines/5 scenes. L: do not translate every line as rhyme; accessibility transcript labels stored voice source and tense." - }, - { - "identity": "CHR-007 Neme Orra, 23, xe/xem, acoustic surveyor", - "gameplay": "Wants proof that the fen's “ghost voices” are routing errors, while privately hoping one belongs to a lost sibling. Thesis: Echo is strongest when copied across roles. Base PR-B03,PR-B08; advanced PR-A05,PR-A06. Talent Foreign Refrain: first Echo sourced from a different role each encounter resolves at 55% instead of 40%; same-role Echo does not qualify.", - "story": "Student of CHR-006; later bonds with CHR-028 over manipulated sound; resents CHR-008 confiscating instruments. Recruit by solving the optional echo-lock in CH-02 segment 5. Arc: accepts uncertainty about the sibling and uses the recovered cadence to expose the Choir, not simulate a person.", - "production": "P: narrow face, olive skin, shaved brows with painted frequency dots, oversized listening collar. S: head-tilt scan, fork-to-ground sampling, sudden delighted note idle. V: light and androgynous, precise consonants; 27 lines/4 scenes. L: English neopronouns are mandatory in bio/dialogue; Chinese uses name or omitted pronoun naturally; never translate Echo as a literal duplicate person." - }, - { - "identity": "CHR-008 Halden Pike, 46, he/him, FAC-02 safety inspector", - "gameplay": "Wants public utilities restored by rules people can audit, after years of enforcing rules nobody could see. Thesis: command tools should expose their assumptions. Base PR-B12,PR-B06; advanced PR-A12,PR-A24. Talent Inspection Window: Priority Flare also reveals why the next ally accepts or rejects the target; a rejection refunds 1 Order once per encounter.", - "story": "Initial opponent of CHR-005; former supervisor of CHR-029; protective of CHR-011. Recruit by showing both evidence paths at the CH-02 tribunal, otherwise after boss. Arc: moves from procedural neutrality to accountable discretion and testifies against his office.", - "production": "P: heavy-lidded eyes, pale scar across nose, immaculate blue coat gradually patched with regional fabrics. S: clipboard shutter, measured point, coat-straighten idle. V: dry bass, formal language warming over chapters; 25 lines/5 scenes. L: preserve distinction between inspector, administrator, and commander; avoid bureaucratic idioms that imply modern nation-state law." - }, - { - "identity": "CHR-009 Kaia Rusk, 36, she/her, furnace shift steward", - "gameplay": "Wants worker furnaces stabilized before the mint can price heat back to them. Thesis: protection grows from predicting movement, not absorbing everything. Base PR-B05,PR-B01; advanced PR-A09,PR-A01. Talent Shift Change: when an allied zone expires, the ally with most Guard transfers 10 of it to the ally with least Guard.", - "story": "Leads CHR-010; mistrusts physician CHR-011; respects CHR-023 after he refuses command. Recruit by honoring the strike line in CH-03 segment 1. Arc: accepts that fair quotas need revision mechanisms, not only solidarity under crisis.", - "production": "P: powerful build, russet skin, shaved head, soot-pattern scarf, plant-fiber shield. S: grounded shoulder set, shift whistle signal, shield-hand stretch idle. V: forceful low mezzo, collective “we” used intentionally; 28 lines/4 scenes. L: “shift” alternates work-period and movement meanings; Chinese tooltips disambiguate 班次 versus 换位." - }, - { - "identity": "CHR-010 Varo Ashen, 18, he/him, smelter runner", - "gameplay": "Wants to earn a craft license without being trapped as the district's fastest errand worker. Thesis: alternating movement paths can vent shared Heat. Base PR-B02,PR-B08; advanced PR-A03,PR-A04. Talent Cooling Lap: after crossing all three bands without repeating direction, remove 1 Heat from every allied device; once per 6 seconds.", - "story": "Apprenticed to CHR-009; courier rivalry with CHR-004; idolizes then surpasses CHR-012's unsafe bravado. Recruit by choosing the dangerous smelter lift and keeping it below maximum Heat. Arc: learns mastery includes refusing a reckless task.", - "production": "P: lanky, tawny skin, singed asymmetrical fringe, heatproof foot wraps, license tags. S: long bounding run, rail-slide strike, checking-soles idle. V: quick high tenor, audible breath pacing; 24 lines/3 scenes. L: age is adult in all regions; avoid diminutives in Chinese, and keep craft “license” distinct from magical attunement." - }, - { - "identity": "CHR-011 Sen Vale, 44, they/them, mint infirmary physician", - "gameplay": "Wants to expose how official casualty records exclude contract workers, while fearing loss of access to patients. Thesis: temporary suppression creates meaningful cleanse timing. Base PR-B04,PR-B11; advanced PR-A08,PR-A07. Talent Case History: first returning suppressed debuff per encounter returns at half strength and grants Sen 1 Case.", - "story": "Former colleague of CHR-008; starts adversarial with CHR-009; treats CHR-026 without demanding a true name. Recruit by finding the hidden infirmary ledger in CH-03 segment 4. Arc: releases records with patient consent and leaves the mint to form a mobile clinic.", - "production": "P: angular dark face, silver temple streaks, red clinical sash over formal mint gray. S: diagnostic lens, precise dose, sleeve-roll idle. V: measured and unsentimental medium register; 23 lines/5 scenes. L: title is clinician, not nobility; retain they/them in English and consent vocabulary in both languages." - }, - { - "identity": "CHR-012 Jori Clasp, 29, she/her, independent pressure engineer", - "gameplay": "Wants recognition for designs the Assembly used without credit. Thesis: signed resource tracks reward planned reversals. Base PR-B08,PR-B10; advanced PR-A16,PR-A15. Talent Counterpressure: first time Pressure crosses zero, next device deploy costs 1 less Parts/Heat and gains 2 seconds duration.", - "story": "Craft rival to CHR-002; reckless model for CHR-010; business partner then friend to CHR-020. Recruit by completing the optional overpressure chamber in CH-03 segment 5. Arc: wins attribution, then chooses open maintenance standards over exclusive ownership.", - "production": "P: short muscular frame, warm brown skin, thick side braid, asymmetrical pressure gauntlet. S: hip-braced valve turn, delighted recoil, finger-count idle. V: brassy mezzo with rapid technical delight; 27 lines/4 scenes. L: surname “Clasp” may translate semantically only in item flavor, never in name; attribution/legal language stays setting-specific." - }, - { - "identity": "CHR-013 Edda Quill, 61, she/her, living-archive botanist", - "gameplay": "Wants every disputed charter leaf preserved, even those that implicate her mentors. Thesis: multi-tag magic turns research breadth into damage. Base PR-B03,PR-B06; advanced PR-A05,PR-A06. Talent Cross-Pollination: researching a variant adds its damage tag as a temporary Facet once per identity.", - "story": "Scholarly rival of CHR-006; aunt and former supervisor of CHR-016; detects CHR-014's redaction training. Recruit automatically at CH-04 arrival. Arc: accepts the right to redact personal testimony while refusing institutional erasure.", - "production": "P: long silver braid woven with labeled leaves, deep-set eyes, green-black academic mantle. S: leaf-lens cast, specimen press, squint-and-note idle. V: rich older alto, exact but emotionally porous; 30 lines/6 scenes. L: “Quill” remains phonetic in name; archive botanical metaphors require glossary consistency and line expansion allowance." - }, - { - "identity": "CHR-014 Rian Sable, 32, he/him, former Relay Office redactor", - "gameplay": "Wants to dismantle the targeting rules he wrote for archive predators. Thesis: research can temporarily remove an enemy's defining variant without deleting its identity. Base PR-B09,PR-B06; advanced PR-A17,PR-A22. Talent Confession Key: first Redacted Entry on an enemy he authored lasts 7 instead of 5 seconds; those identities are explicitly tagged in bestiary links.", - "story": "Distrusted by CHR-013; quietly aided by CHR-008; develops mutual honesty with CHR-028. Recruit by presenting evidence rather than attacking him in CH-04 segment 2. Arc: stops offering martyrdom as substitute for repair and documents every authored harm.", - "production": "P: narrow pale-brown face, ink-stained fingers, formal coat cut short where insignia was removed. S: blade-as-pen, hesitation before strike, visible open-palms surrender pose. V: soft baritone with controlled pace; 22 lines/6 scenes. L: avoid romanticizing “redactor”; confession terminology distinguishes admission, evidence, and restitution." - }, - { - "identity": "CHR-015 Mette Lorn, 48, she/her, itinerant dispute mediator", - "gameplay": "Wants communities to retain contradictory promises long enough to renegotiate them. Thesis: links should reward different actions rather than enforce sameness. Base PR-B11,PR-B07; advanced PR-A21,PR-A01. Talent Dissenting Clause: linked allies using different tags gain 8 Guard; matching tags end the bonus but not the link.", - "story": "Professional foil to CHR-013; old friend of CHR-022; challenges CHR-001's unilateral rescues. Recruit by preserving both charter versions through CH-04 segment 3. Arc: admits mediation can preserve unjust delay and learns when to support decisive action.", - "production": "P: broad older woman, tawny skin, split-color shawl joined by visible mending, cord rings. S: two-hand knot, listening lean, decisive cord-cut recovery. V: calm low alto capable of sudden firmness; 26 lines/5 scenes. L: dialogue uses parallel clauses; Chinese may reorder for naturalness but must retain explicit contrast." - }, - { - "identity": "CHR-016 Quen Arbor, 26, he/him, archive groundskeeper", - "gameplay": "Wants footpaths to remain usable by people who cannot read living script. Thesis: terrain plans should be accessible, physical, and recoverable. Base PR-B05,PR-B06; advanced PR-A10,PR-A09. Talent Tactile Map: first placed Plan each encounter also shows a high-contrast raised route and grants its first ally hazard immunity for 1 extra second.", - "story": "Nephew/former student of CHR-013; instant rapport with CHR-003; later teaches route marking to CHR-027. Recruit by taking the unlettered root path in CH-04 segment 4. Arc: makes the archive recognize maintenance knowledge as authorship.", - "production": "P: stocky, light-brown skin, close curls, bark-textured gloves, white cane integrated with survey staff. S: cane-led path check, tactile stake placement, hand-to-ground idle. V: relaxed tenor, direction language never sight-exclusive; 24 lines/4 scenes. L: blind identity is explicit without tragedy framing; translate spatial cues consistently and include audio-description hooks." - }, - { - "identity": "CHR-017 Asha Kestrel, 39, she/her, rescue-boat captain", - "gameplay": "Wants beacons restored before counterfeit enforcement strands anyone else. Thesis: tides are for rescue first, control second. Base PR-B10,PR-B01; advanced PR-A19,PR-A20. Talent Last Seat: once per encounter, pulling an ally below 25% vitality also Anchors both and heals an extra 35.", - "story": "Public opponent of CHR-018; searches for CHR-019 after a duplicate registry splits; trusts CHR-005's river judgment. Recruit through the rescue-beacon route in CH-05 segment 1, or at finale if customs first. Arc: learns to document rescues so mercy survives leadership changes.", - "production": "P: tall wave-weathered frame, dark skin, white-streaked braids, orange rescue mantle. S: rope cast, braced pull, horizon-watch idle. V: commanding contralto with intimate casualty lines; 29 lines/4 scenes. L: bird surname is phonetic, not translated; nautical terms use an internal bilingual glossary." - }, - { - "identity": "CHR-018 Daro Vey, 35, he/him, Tideglass verifier", - "gameplay": "Wants identity checks accurate enough that compassion does not depend on bypassing them. Thesis: Marks must survive decoys and explain certainty. Base PR-B06,PR-B12; advanced PR-A12,PR-A17. Talent Chain of Custody: when a Mark jumps from a decoy to its source, preserve remaining duration and reveal one variant clause.", - "story": "Procedural adversary of CHR-017; responsible for mishandling CHR-019's case; admires CHR-008's public testimony. Recruit by proving a counterfeit manifest planted in CH-05 segment 3. Arc: replaces binary true/false status with evidence confidence and appeal.", - "production": "P: lean, medium-brown skin, side-parted hair, layered transparent document plates. S: lens snap, seal shot, discomfort-adjusting collar idle. V: precise light baritone; 25 lines/5 scenes. L: verification language avoids real-world immigration phrasing; confidence levels translate as evidence states, not moral labels." - }, - { - "identity": "CHR-019 Neve Calla, 28, she/they, mirror-tide survivor", - "gameplay": "Wants legal recognition that both memories produced by a tide duplication belong to one evolving person. Thesis: a decoy can be a chosen position, not a disposable fake. Base PR-B02,PR-B09; advanced PR-A18,PR-A03. Talent Both Ways Home: after swapping with own decoy, choose which band counts as prior band for Return Step; choice appears in AI priority.", - "story": "Rescued by CHR-017; mishandled then aided by CHR-018; finds language for multiplicity with CHR-007. Recruit by protecting both memory echoes in CH-05 segment 4. Arc: rejects pressure to select an “original” and authors a new civic identity category.", - "production": "P: asymmetrical face styling mirrored across makeup, sea-green coat with two different cuffs, no evil-double coding. S: two stance idles that converge, deliberate decoy greeting pose. V: one actor, two cadence registers used by choice not split personality; 28 lines/5 scenes. L: pronouns alternate by scene intent; Chinese uses name/zero pronoun and never calls one memory “假”." - }, - { - "identity": "CHR-020 Torren Brack, 57, he/him, tideglass artisan", - "gameplay": "Wants to stop mirror tools he sold from being used for fraudulent manifests. Thesis: devices gain value from deliberate recall rather than expendability. Base PR-B08,PR-B11; advanced PR-A15,PR-A16. Talent Maker's Mark: recalling a device records its last target; redeploying within 6 seconds makes its first action prefer that target and gain 20 power.", - "story": "Craft student of CHR-002; former profit partner of CHR-012; made CHR-018's lenses. Recruit by dismantling, not selling, the counterfeit press in CH-05 segment 5. Arc: funds repair from prior profits and makes provenance visible on every tool.", - "production": "P: heavy older build, ruddy skin, bald crown, mirrored apron with etched serial marks. S: careful polish, strong two-arm deploy, spectacles-clean idle. V: gravelly bass with patient explanations; 22 lines/4 scenes. L: “Brack” is phonetic; maker/provenance terminology must match item catalog acquisition text." - }, - { - "identity": "CHR-021 Zai Lume, 24, they/them, storm-kite courier", - "gameplay": "Wants rotating weather stewardship to survive despite loving the speed of emergency command. Thesis: self-risk makes repeated movement a conscious wager. Base PR-B02,PR-B10; advanced PR-A04,PR-A18. Talent Borrowed Gust: entering Drift voluntarily grants 1 Tempo and Cover; twice within 5 seconds also applies Exposed to Zai.", - "story": "Hero to CHR-004; younger sibling of CHR-024; debates governance with CHR-022. Recruit by riding the exposed updraft in CH-06 segment 1. Arc: stops equating danger with public service and trains a courier network.", - "production": "P: wiry, golden-brown skin, wind-burn mask, bright kite-frame sleeves. S: tether swing, controlled landing, compulsive knot-check idle. V: airy energetic androgynous voice; 27 lines/4 scenes. L: singular they in English; kite terminology and voluntary-risk consent must remain explicit." - }, - { - "identity": "CHR-022 Amair Koro, 50, she/her, Updraft consensus speaker", - "gameplay": "Wants rotating authority preserved without letting process become an excuse during emergencies. Thesis: enemy repetition can fund a varied allied reply. Base PR-B07,PR-B12; advanced PR-A14,PR-A13. Talent Minority Report: when two enemies repeat a tag, the slowest ally with a different queued tag advances 0.5 seconds.", - "story": "Old colleague of CHR-015; political mentor to CHR-024; frustrates CHR-021 with caution. Recruit by completing two ward councils before the calm-eye shortcut in CH-06 segment 3. Arc: codifies a time-limited emergency role that automatically returns power.", - "production": "P: broad soft build, deep-brown skin, cloud-white hair in high loops, layered speaking tokens. S: token pass, open-circle gesture, listening-count idle. V: mature mezzo with controlled public resonance; 31 lines/6 scenes. L: consensus vocabulary avoids parody; Chinese lines preserve turn-taking markers and time-limited mandate." - }, - { - "identity": "CHR-023 Elian Thrum, 45, he/him, former storm-crown guard", - "gameplay": "Wants to dismantle the command post he once defended because it kept his ward aloft. Thesis: interception is ethical only when costs remain visible. Base PR-B01,PR-B11; advanced PR-A01,PR-A21. Talent Visible Cost: intercepted damage displays its original target and grants that ally 1 Charge; at 3 Charges it must spend them on Guard, not damage.", - "story": "Earns CHR-009's respect; former subordinate of CHR-029; guarded CHR-024 during a riot. Recruit by refusing the crown's safe-command offer in CH-06 segment 4. Arc: moves from resignation to testimony and accepts protection from others.", - "production": "P: very tall, dark skin, close gray beard, ceremonial armor stripped to practical plates. S: heavy intercept with visible recoil, armor-unbuckle idle. V: deep quiet bass, pain exertions restrained; 23 lines/5 scenes. L: do not frame obedience as cultural; “crown” always means control apparatus, never royal title." - }, - { - "identity": "CHR-024 Fia Noll, 30, she/her, rotating lift dispatcher", - "gameplay": "Wants emergency signals readable to every ward without giving any dispatcher permanent authority. Thesis: movement commands become stronger when roles remain distinct. Base PR-B12,PR-B02; advanced PR-A23,PR-A24. Talent Rotating Chair: after commanding a different ally than last time, gain 1 Order; commanding same ally twice makes the second cost +1.", - "story": "Older sibling of CHR-021; student then critic of CHR-022; knows CHR-029's secret command channel. Recruit by visiting all four wards in CH-06 segment 5. Arc: publishes the channel and designs dispatch handoffs anyone can audit.", - "production": "P: compact athletic frame, tan skin, shaved geometric hairline, four-color signal mantle. S: baton handoff, rotating point, listening-to-four-lines idle. V: crisp alto with code-switch from dispatch brevity to warmth; 28 lines/5 scenes. L: signal codes are localized by function, not phonetics; name Fia stays two syllables in voice guides." - }, - { - "identity": "CHR-025 Kesh Ardent, 42, he/him, unregistered Nullmarket doctor", - "gameplay": "Wants access to public medicine without surrendering patients' names to a hostile registry. Thesis: buffs can be preserved while a patient is repositioned. Base PR-B04,PR-B10; advanced PR-A20,PR-A07. Talent No Name Required: first heal on an unlinked ally does not change enemy identity-based targeting and pauses its shortest buff for 1 second.", - "story": "Exchanges methods with CHR-003; treated CHR-026; challenges CHR-008 to make policy survive secrecy. Recruit by paying the memory-map cost with a guild record, not a person's name, in CH-07 segment 1. Arc: joins a reformed service while preserving anonymous care.", - "production": "P: lean older man, brown skin, graying curls, layered blank-name tags, portable lamp. S: tag turned face-down, efficient splint, doorway-watch idle. V: soft-spoken tenor; 24 lines/5 scenes. L: “unregistered” is a network status, not citizenship; never add criminalizing language in either locale." - }, - { - "identity": "CHR-026 Nara Wisp, 33, she/her, memory cartographer", - "gameplay": "Wants people to navigate Nullmarket without selling irreplaceable memories. Thesis: a decoy and a cut can protect information without deleting it. Base PR-B09,PR-B07; advanced PR-A17,PR-A22. Talent False Legend: first decoy hit draws a temporary fake route; enemy taking it has its link severed, but Nara becomes Marked.", - "story": "Patient and friend of CHR-025; owes a route debt to CHR-027; refuses to reveal CHR-014's past without consent. Recruit by solving her map with tactile marks learned from CHR-016 in CH-07 segment 2. Arc: creates recoverable escrow maps and keeps one private memory private.", - "production": "P: long face, pale-olive skin, black hair threaded with blank paper, inked palms. S: map fold into decoy, cord snip, counting-doorways idle. V: husky mezzo with intentional pauses; 25 lines/5 scenes. L: “Wisp” stays as surname; distinguish memory as experience from magical map-token in nouns and icons." - }, - { - "identity": "CHR-027 Tovin Marr, 68, he/him, buried-ring maintainer", - "gameplay": "Wants official repair crews to acknowledge the unnamed labor that kept the system alive. Thesis: links and reach make infrastructure work visible across bands. Base PR-B11,PR-B01; advanced PR-A21,PR-A02. Talent Maintenance Span: a link crossing two bands counts as one empty band for allied Reach and gains 5 Guard whenever a projectile passes through.", - "story": "Old route partner of CHR-005; mentor to CHR-026; remembers founder CHR-030 before the First Silence. Recruit by repairing all three manual bypasses in CH-07 segment 4. Arc: accepts a public credit that names the collective, not him as singular savior.", - "production": "P: broad elderly man, dark-brown skin, white mustache, heavy belt of nonmagical tools, ring-map tattoos. S: measured climb, span-cord throw, knee-rest idle without frailty joke. V: weathered bass, unhurried humor; 23 lines/6 scenes. L: maintenance jargon grounded in visible tasks; elder speech is contemporary, not archaic in Chinese." - }, - { - "identity": "CHR-028 Sera Mote, 37, she/her, Quiet Choir signal defector", - "gameplay": "Wants to stop the protocol she taught to recognize emotional speech as instability. Thesis: stable difference converts varied roles into resistance. Base PR-B03,PR-B07; advanced PR-A24,PR-A05. Talent Noise Floor: when four distinct role tags act, party resists one Hush and Sera loses 1 Pitch; cannot trigger without Pitch.", - "story": "Shares technical guilt with CHR-002; mirrored confession arc with CHR-014; helped manipulate CHR-007's sibling cadence. Recruit by hearing her full warning before attacking in CH-08 approach 2. Arc: provides evidence and repair labor without receiving instant absolution.", - "production": "P: severe oval face, medium-brown skin, cropped white-dyed hair, Choir gray cut open to show colored lining. S: tuning fork lowered in surrender, four-signal cast, sound-avoidant hand idle. V: controlled mezzo with occasional cracked restraint; 27 lines/7 scenes. L: “Choir” terminology never implies real faith; confession and culpability distinctions must remain precise." - }, - { - "identity": "CHR-029 Garan Tey, 56, he/him, Civic Relay director", - "gameplay": "Wants the capital to survive and finally admits his secret command channels made every region less safe. Thesis: command gains legitimacy by exposing and rotating its target logic. Base PR-B12,PR-B06; advanced PR-A23,PR-A12. Talent Public Channel: first Order each phase broadcasts target and reason; if three different roles accept it, refund the Order, otherwise reveal the rejecting rule.", - "story": "Former supervisor of CHR-008 and CHR-023; secret-channel adversary of CHR-024; seeks but does not demand CHR-001's trust. Recruit only after he opens all approach records in CH-08 segment 4. Arc: resigns authority, testifies publicly, and serves under rotating field command in postgame.", - "production": "P: lined pale face, cropped gray hair, formal blue mantle visibly unfastened after recruitment. S: seal break, pennant pass, hands-behind-back idle changing to open stance. V: formal high baritone, measured loss of certainty; 24 lines/7 scenes. L: avoid redemption-by-resignation shorthand; administrative ranks consistent with FAC-02 glossary." - }, - { - "identity": "CHR-030 Piri Ansel, 72, they/them, last living Concordance founder", - "gameplay": "Wants the guild to repair the First Silence without pretending the founders' fear was wisdom. Thesis: cadence support can hold incompatible buffs without merging their identities. Base PR-B07,PR-B03; advanced PR-A24,PR-A13. Talent Founder's Revision: once per encounter, when two exclusive buffs collide, preserve both for 3 seconds; afterward each returns with half remaining duration.", - "story": "Old colleague of CHR-027; hid evidence from CHR-013; sees CHR-001 as a steward, not successor. Recruited for the final approach after all seven regional consequence rooms; playable in EN-B008 and postgame. Arc: publicly voids the founders' secrecy clause and refuses a ceremonial leadership role.", - "production": "P: slight elderly frame, warm-brown skin, clouded left eye, plain founder ring worn on cord, many regional mends. S: careful staff cadence, ring removal key pose, breathing rest idle. V: older androgynous voice, firm rather than mystical; 26 lines/8 scenes. L: English they/them explicit; Chinese avoids honorific inflation, and “founder” is institutional history, not chosen-one status." + "name": "Reset and deletion", + "input": "MODAL", + "purpose": "Separate run deletion, profile reset, settings reset, and diagnostics clearing with exact scope and recovery policy.", + "action": "Execute reviewed destructive action.", + "emptyLoading": "No eligible data disables the action with reason. Loading inventory must finish before review.", + "errorConfirmation": "Write failure preserves data. Confirmation names scope, stable target, retained data, recovery window, and explicit destructive gesture.", + "interruptionReturn": "Suspend before receipt cancels nothing; after receipt verifies outcome. Cancel returns to Settings index." } ], "professions": [ { - "identity": "PR-B01 Linekeeper", - "role": "Front protector. Brace max 3; gain 1 when hit in Front, once per 2 seconds.", - "skills": "Set the Line (2): self and ally directly behind gain 30 Guard and Anchored; Shoulder Turn (1): deal 70 power and push a Front target to Mid, or Expose it if movement fails. Passive Held Ground: preventing movement grants 1 Brace.", - "logic": "Ally behind self first; otherwise lowest-Guard Front ally. Use Set the Line before an enemy forced-move telegraph; Shoulder Turn against unanchored casters or for Expose.", - "build": "Counters displacement and narrow melee; vulnerable to Hush and rear pressure. Synergy with PR-B06 Marks and PR-B11 Links. Advances toward PR-A01, PR-A02, PR-A09, PR-A23.", - "production": "Tall rectangular shield and low lantern; two planted key poses, shield-turn impact, amber ground chevron, wood/metal brace knock plus low two-note pulse." + "id": "PF-B01", + "name": "Hearthguard", + "family": "base", + "role": "front-hold; front", + "rules": "Shield Knock hits foremost reachable and Guard 1 neighbor. Guard gained when struck, spent to intercept one neighbor hit. Set Feet: cannot be pushed while Guarded, but steps slower.", + "cadence": "reach 1; steady: intercept lethal neighbor hit, refresh own Guard, then Knock nearest.", + "strategy": "Countered by rear pressure and Guard stripping; enables slow casters and adjacency items.", + "production": "P/O/A/V/S: broad shield overlay, brace/knock family, square amber guard cue, wood-metal block event." }, { - "identity": "PR-B02 Wayblade", - "role": "Mobile melee. Tempo max 3; gain 1 after changing bands or striking a different target than last action.", - "skills": "Crosscut (1): move one band toward target, deal 2x45 power; second hit Marks if target differs from last action. Return Step (2): deal 80 power, move to prior band, and leave a 4-second 20% speed lane for an ally. Passive No Refrain: alternating targets makes the second action cost 0 Tempo.", - "logic": "Prefer reachable Marked target, then a target different from last. Return Step if below 45% vitality or ally can use lane.", - "build": "Counters fragile Rear units and static hazards; countered by Anchored zones and retaliation. Synergy with PR-B07 cadence and PR-B10 Flow. Advances to PR-A03, PR-A04, PR-A18, PR-A23.", - "production": "Split coat tails and paired short blades; readable out/back arcs, cyan foot-trail with distinct arrowhead, dry blade clicks and a rising step chime." + "id": "PF-B02", + "name": "Edgehand", + "family": "base", + "role": "single-pressure; front/center", + "rules": "Testing Cut hits nearest exposed enemy. Edge gained on alternating targets, spent to finish a marked target. No Waste: overflow damage becomes one Edge, not splash.", + "cadence": "reach 1; fast: finish legal low target, alternate target for Edge, then nearest exposed.", + "strategy": "Countered by decoys and heavy protection; likes marks and enemy reorder.", + "production": "P/O/A/V/S: paired short-blade overlay, alternating slash poses, chevron Edge cue, dry cut/finish pair." }, { - "identity": "PR-B03 Resonant", - "role": "Mid magical striker. Pitch max 4; gain 1 when any unit gains or loses Tuned, maximum once per second.", - "skills": "Harmonic Bolt (2): 105 power to enemy matching the last element used by an ally, otherwise 80; Detune (3): 60 power to Mid/Rear and apply Hush, or remove Hush from an ally and make it Tuned. Passive Listening Field: first allied skill of each element reveals that element above the caster.", - "logic": "Detune an enemy with an armed secondary clause; cleanse allied Hush before damage. Otherwise select lowest-vitality valid target for Harmonic Bolt.", - "build": "Counters clause-dependent casters; weak when team repeats one damage tag. Synergy with PR-B07, PR-B12, and Echo equipment. Advances to PR-A05, PR-A06, PR-A13, PR-A24.", - "production": "Tuning-fork staff and asymmetrical ear mantle; concentric line VFX with shape-coded elements, fork strike and layered glass hum, lip-sync-free vocal breaths." + "id": "PF-B03", + "name": "Longspoke", + "family": "base", + "role": "reach-control; center", + "rules": "Measured Thrust strikes through one unit. Poise gained by attacking without moving, spent to extend reach or resist pull. Keep Distance: loses Poise after a step.", + "cadence": "reach 2; steady: interrupt approaching short-reach threat, pierce aligned front pair, then foremost.", + "strategy": "Countered by forced movement and rear divers; protects center damage through controlled reach.", + "production": "P/O/A/V/S: modular polearm, plant/thrust/pivot family, straight-line white cue, haft plant and air-cut events." }, { - "identity": "PR-B04 Patchworker", - "role": "Mid healer/cleanser. Remedy max 3; gain 1 when an ally falls below 60% vitality, once per ally per recovery above 70%.", - "skills": "Quick Stitch (1): heal 70 power; at under 35% target vitality also remove Exposed. Shared Dose (2): heal two lowest-vitality allies for 55 and transfer one removable debuff from each to self at half duration. Passive Known Reactions: after surviving a transferred debuff, gain Tuned.", - "logic": "Save Shared Dose for two injured allies or a dangerous cleanse; Quick Stitch the ally whose projected incoming hit would defeat them, not simply lowest current vitality.", - "build": "Counters attrition and Exposed chains; vulnerable to Hush and self-debuff overload. Synergy with PR-B05 Ward zones and PR-B11 damage sharing. Advances to PR-A07, PR-A08, PR-A20, PR-A24.", - "production": "Cross-body satchel and thread-ring focus, brisk stitch and two-vial toss poses, teal knot VFX, cloth snap/glass tap and warm three-note confirmation." + "id": "PF-B04", + "name": "Wayrunner", + "family": "base", + "role": "reorder; any", + "rules": "Passing Strike swaps with the neighbor ahead after hitting. Momentum gained per distinct position visited, spent on a long step. Open Route: allies moved through are briefly unpushable.", + "cadence": "reach 1; fast: escape marked danger, fill exposed front gap, then cycle toward least-visited position.", + "strategy": "Countered by roots and narrow safe bands; enables position triggers and rescues fragile units.", + "production": "P/O/A/V/S: light hooked blade, run/brake/swap family, footprint cue, cloth rush and heel-stop events." }, { - "identity": "PR-B05 Vergewarden", - "role": "Front/Mid area defender. Root max 3; gain 1 when an enemy enters or leaves the warden's band.", - "skills": "Briar Ring (2): band gains a 6-second zone; first enemy entering takes 75 and becomes Anchored. Shelter Seed (1): plant on an ally; after 3 seconds grant 25 Guard, doubled if ally did not move. Passive Patient Border: zone expiry without triggering refunds 1 Root and heals weakest ally 25.", - "logic": "Place Briar Ring on a telegraphed destination, not current enemy density; seed a stationary caster or endangered Front.", - "build": "Counters dives and forced lanes; countered by ranged focus and Hush. Synergy with PR-B06 forecasts and PR-B08 placed devices. Advances to PR-A09, PR-A10, PR-A21, PR-A01.", - "production": "Crescent pruning shield and sprout pennant; seed-to-vine three-stage animation, green linework with square boundary, branch creak and soft soil thump." + "id": "PF-B05", + "name": "Farstring", + "family": "base", + "role": "projectile-pressure; rear", + "rules": "Draw Shot targets foremost legal enemy; each uninterrupted shot gains Aim, spent to select rearmost. Clear Arc: loses Aim when an ally is pulled behind the Farstring.", + "cadence": "line reach projectile; steady: spend Aim on dangerous rear caster, hit marked target, then foremost.", + "strategy": "Countered by projectile screens and rear intrusion; likes stable protection and target marks.", + "production": "P/O/A/V/S: bow family, draw/loose/reacquire, arc-and-notch cue, bow snap and distinct blocked shot." }, { - "identity": "PR-B06 Pathfinder", - "role": "Rear tactical ranged support. Insight max 4; gain 1 when a newly seen telegraph or variant appears, then 1 per correctly countered telegraph.", - "skills": "Survey Shot (1): 65 power, Mark target for 8 seconds and reveal its next target rule. Safe Bearing (2): choose ally; it ignores the next terrain hazard and gains 20% speed after avoiding it. Passive Margin Note: first hit on a Marked variant adds its counter icon to encounter UI.", - "logic": "Mark unresearched or highest-threat enemy. Safe Bearing on the ally selected by terrain or on the only available counter unit.", - "build": "Counters hidden priorities and terrain; low raw output after patterns are solved. Synergy with every precision profession, especially PR-B01 push and PR-B09 execution. Advances to PR-A10, PR-A11, PR-A12, PR-A17.", - "production": "Long sighting rod, folded maps, narrow triangular silhouette; line-of-sight sweep, crisp white route glyph, paper flick and wooden range-click." + "id": "PF-B06", + "name": "Riftcaller", + "family": "base", + "role": "area-pressure; rear", + "rules": "Rift Spark hits foremost and echoes lightly to its neighbor. Charge gained while wind-up completes, spent to widen an area. Unstable Weave: interruption clears Charge.", + "cadence": "line spell reach; slow: widen against clustered pair, punish summoned unit, then Spark highest cluster value.", + "strategy": "Countered by interrupts and forced retarget; likes time protection and grouping effects.", + "production": "P/O/A/V/S: focus rod, two-stage channel/cast, forked diamond cue, rising tone with captioned discharge." }, { - "identity": "PR-B07 Chanter", - "role": "Mid cadence support. Verse cycles Open -> Turn -> Close; acting advances it, and each stage changes one skill clause.", - "skills": "Call and Answer: Open grants next ally 15% power; Turn grants 20 Guard; Close makes ally Tuned. Measured Rest: skip own attack, heal all allies 20 and hold current Verse for one cycle. Passive Room for Breath: a Rest prevents the next allied Hush.", - "logic": "Choose Call recipient whose next action occurs within 2 seconds; use Rest before mass Hush or when three allies are below 70%.", - "build": "Counters timing disruption and Hush; countered by speed variance and isolation. Synergy with PR-B02 alternating cadence and PR-B03 Pitch. Advances to PR-A13, PR-A14, PR-A22, PR-A24.", - "production": "Ribboned handbell and open stance; three stage-specific poses and subtitle-safe mouth shapes, gold/blue/white beat marks, handbell motif with optional non-vocal accessibility layer." + "id": "PF-B07", + "name": "Kindhand", + "family": "base", + "role": "restore; center/rear", + "rules": "Tending Pulse heals lowest-vitality reachable ally. Remedy gained when healing actual loss, spent to cleanse one hindrance. Honest Care: overheal grants no Remedy.", + "cadence": "reach 2 allied; steady: prevent lethal forecast, cleanse action-blocking status, then heal lowest ratio.", + "strategy": "Countered by split pressure and heal denial; likes Guard, shared damage, and predictable cadence.", + "production": "P/O/A/V/S: satchel and hand-lamp, assess/tend/cleanse, open-circle cue, soft chime plus captioned cleanse." }, { - "identity": "PR-B08 Relaywright", - "role": "Mid device controller. Heat 0-5; devices add Heat, venting removes it; at 5 the next device is Hushed and self takes 40 damage.", - "skills": "Arc Pylon (+2): deploy 8-second pylon that strikes nearest Marked enemy for 35 every 2 seconds. Bleed Valve (-3): pylon bursts for 70 in its band, or without pylon grant adjacent allies 15 Guard. Passive Useful Waste: venting 3+ Heat makes weakest ally Tuned.", - "logic": "Deploy only if a Mark or 6-second stationary window exists. Vent at Heat 4+, or early to Break a low-stability telegraph.", - "build": "Counters sustained stationary threats; countered by device destruction and forced movement. Synergy with PR-B06 Marks and PR-B05 zones. Advances to PR-A15, PR-A16, PR-A03, PR-A20.", - "production": "Compact coil-pack and tripod silhouette; deploy, crank, rupture poses, orange line arcs with visible heat gauge, ratchet, coil buzz, pressure release." + "id": "PF-B08", + "name": "Bondwright", + "family": "base", + "role": "enable; center", + "rules": "Joining Thread lightly damages an enemy and links the caster to one neighbor. Bond gained when linked units use different action tags, spent to share Guard or Remedy. Tension: same-tag repeats fray the link.", + "cadence": "reach 2; steady: repair broken useful link, share resource before threshold, then hit linked enemy.", + "strategy": "Countered by isolation and repetitive parties; amplifies mixed roles and alternating cadences.", + "production": "P/O/A/V/S: knot-frame focus, cast/tie/release, braided line cue with shape dashes, two-tone pluck event." }, { - "identity": "PR-B09 Veilrunner", - "role": "Rear assassin/disruptor. Cover max 3; gain 1 after not being targeted for 3 seconds or when a decoy is hit.", - "skills": "Slip Between (1): move to mirrored band, become untargetable during travel, then 70 power to lowest-Guard enemy. Unmake Tell (2): delay an enemy telegraph 2 seconds and apply Exposed; bosses instead lose 20% stability. Passive Seen Elsewhere: first target selection against self each encounter chooses a harmless decoy.", - "logic": "Delay a telegraph only if party has a counter coming off cooldown; otherwise attack lowest Guard. Retreat when Cover reaches 0 and projected focus is high.", - "build": "Counters slow telegraphs and vulnerable backlines; countered by band-wide attacks and Mark. Synergy with PR-B06 and PR-B10 decoys. Advances to PR-A17, PR-A18, PR-A22, PR-A11.", - "production": "Hood with split reflective scarf, diagonal low profile; smear-free dash frames, black-violet afterimage with striped decoy outline, muted cloth snap and reverse tick." + "id": "PF-B09", + "name": "Coilsmith", + "family": "base", + "role": "construct; center/rear", + "rules": "Tool Tap attacks nearest threat. Parts gained every second basic, spent to deploy a one-footprint device behind self. Pack Up: stepping salvages half unspent Parts but removes device.", + "cadence": "reach 1 basic; steady: replace destroyed device, trigger safe utility, then Tap nearest device threat.", + "strategy": "Countered by rear compression and device hunters; likes stable order and Parts equipment.", + "production": "P/O/A/V/S: tool rig and compact device kit, place/tune/pack, cog-square cue, ratchet and device-state events." }, { - "identity": "PR-B10 Currentcaller", - "role": "Mid position/healing hybrid. Flow max 4; gain 1 whenever any unit is moved by a skill, once per second.", - "skills": "Draw Current (2): pull an ally one band toward self, cleanse Drift, heal 45. Undertow (3): move up to two enemies one band toward Front; enemies that cannot move take 65 and become Exposed. Passive Circulation: first allied forced move each 5 seconds grants that ally 15 Guard.", - "logic": "Rescue ally from armed hazard first; Undertow only when it clusters for an allied zone or converts blocked movement to Exposed.", - "build": "Counters displacement and scattered ranged enemies; countered by enemy Anchored and Hush. Synergy with PR-B01, PR-B05, PR-B02. Advances to PR-A19, PR-A20, PR-A04, PR-A16.", - "production": "Forked water baton and layered wave hem; continuous pull arcs with destination ghost, blue-white bands with dot pattern, ceramic wash and low water drum." + "id": "PF-B10", + "name": "Gloamreader", + "family": "base", + "role": "impair; rear", + "rules": "Dimming Word damages the enemy with highest current cadence and applies Hindered. Omen gained when a debuff expires, spent to extend a different debuff. No Echo: cannot extend own same tag twice.", + "cadence": "line spell reach; slow: stop imminent major action, extend ally-applied status, then dim fastest enemy.", + "strategy": "Countered by cleanse and staggered immunity; likes varied statuses and long fights.", + "production": "P/O/A/V/S: tablet veil, inscribe/close/release, broken-ring cue, whispered consonant texture with captions." }, { - "identity": "PR-B11 Oathbinder", - "role": "Front/Mid link tank. Bond max 3; gain 1 when linked units take different actions within 3 seconds.", - "skills": "Twin Promise (1): link two allies for 8 seconds; 25% direct damage to either is redirected to the healthier one. Witness (2): linked allies copy 40% of each other's next Guard gain or healing, whichever resolves first. Passive Terms Kept: a link expiring with both allies alive grants 1 Bond.", - "logic": "Link endangered ally to healthiest non-taunting ally; avoid linking two targets of the same area telegraph. Witness immediately before a forecast heal/Guard.", - "build": "Counters focused damage; countered by area attacks and healing inversion. Synergy with PR-B04, PR-B12, mixed roles. Advances to PR-A21, PR-A22, PR-A08, PR-A01.", - "production": "Two-loop cord focus and half-cape; visible tether slack/tension states, paired white/coral knot VFX, cord pull and paired heartbeat knocks." + "id": "PF-B11", + "name": "Bellkeeper", + "family": "base", + "role": "tempo; center", + "rules": "Time Bell strikes nearest and advances the slower neighbor's next basic. Verse gained when allies act in three different cadence bands, spent to delay an enemy wind-up. Offbeat: repeated band gives no Verse.", + "cadence": "reach 1/line delay; steady: delay major action, advance restorative neighbor, then strike nearest.", + "strategy": "Countered by silence and uniform-speed builds; enables slow wind-ups and cadence alternation.", + "production": "P/O/A/V/S: handbell frame, strike/listen/cutoff, three-bar cue, pitch-coded but fully captioned bell events." }, { - "identity": "PR-B12 Signal Marshal", - "role": "Rear command support. Order max 3; gain 1 when three allies execute different action tags in sequence.", - "skills": "Priority Flare (1): Mark an enemy and make the next allied single-target skill prefer it if legal. Fallback Bell (2): cancel an ally's queued basic attack, move it one band away from danger, and advance its next active skill by 1 second. Passive Clear Dispatch: Orders targeting three different allies grant self Tuned.", - "logic": "Flare Breakable or summoning target; Fallback only from a lethal forecast or to align a counter, never for small damage.", - "build": "Counters target confusion and timing checks; countered by Hush and chaotic target bans. Synergy with varied-role parties and PR-B03 Pitch. Advances to PR-A23, PR-A24, PR-A12, PR-A14.", - "production": "Pennant spear and signal shutters; large readable point/recall poses, red-white geometric flare, bell strike and clipped drum command with no required speech." + "id": "PF-B12", + "name": "Packwarden", + "family": "base", + "role": "supply; center/rear", + "rules": "Rationed Blow hits nearest; every third basic creates one Supply, spent to refresh a neighbor's item cooldown or grant a safe retreat step. Inventory Rule: cannot target self twice in succession.", + "cadence": "reach 1; steady: enable urgent item, move endangered rearward neighbor, then build Supply.", + "strategy": "Countered by item lock and isolation; supports proc gear and replaceable front lines.", + "production": "P/O/A/V/S: pack-frame and tally tags, handoff/strike/guide, stacked-tab cue, buckle and counted click events." }, { - "identity": "PR-A01 Covenant Bulwark", - "role": "Front link defender. Article max 3; gain when linked allies take different action tags.", - "skills": "Shared Rampart (2): self and linked ally gain 35 Guard; excess Guard becomes 1 Bond on PR-B11 ally. No One Cast Out (3): intercept next hit on each band at 60% power. Passive Plural Terms: each different profession role among allies adds 5 Guard to first rampart, max 20.", - "logic": "Use intercept only against simultaneous forecast hits; link weakest role not already protected.", - "build": "Counters multi-band bursts; area damage after intercept is its risk. Synergy PR-B01,PR-B11. Requires mastery PR-B01+PR-B11, CH-03 trial, prevent three forced moves without repeating target.", - "production": "Broad split shield joined by cords; three-band intercept silhouettes, amber/coral clauses as bracket VFX, shield chorus of three distinct knocks." + "id": "PF-A01", + "name": "Gatebearer", + "family": "advanced", + "role": "PF-B01; interception becomes directional", + "rules": "front-hold/front; Gate Arc intercepts only attacks crossing the bearer, refunding Guard when prediction is correct.", + "cadence": "reach 1; reserve Guard for crossing attacks, then protect neighbor behind.", + "strategy": "Rear-origin attacks bypass it; superb with fragile unit directly behind. Opposes PF-A02 aggression.", + "production": "O/A/V/S: tall gate shield, swing-open brace, doorway cue, resonant latch block." }, { - "identity": "PR-A02 Rift Lancer", - "role": "Front puncture controller. Reach 0-3; gain per empty band between self and target.", - "skills": "Long Measure (all): 80+35 per Reach, pierces intervening enemies; Pin the Gap (2): spear a destination, first enemy moving through takes 90 and Anchored. Passive Measured Distance: forced movement never reduces Reach below 1.", - "logic": "Prefer maximum-distance aligned target; Pin only on forecast path.", - "build": "Counters columns and dives; weak when surrounded. Synergy PR-B01,PR-B06. Requires PR-B01+PR-B06, CH-03, Break an elite from two bands away.", - "production": "Extremely long collapsible lance; telescoping anticipation, ruler-line VFX, cable snap and resonant spear twang." + "id": "PF-A02", + "name": "Ramward", + "family": "advanced", + "role": "PF-B01; Guard becomes forward displacement", + "rules": "control/front; Driving Wall spends Guard to push foremost enemy and follow into the new front.", + "cadence": "reach 1; push channeling or short-reach threat, otherwise maintain Guard.", + "strategy": "Immovable enemies waste its conversion; groups enemies for area roles. Opposes PF-A01 protection.", + "production": "O/A/V/S: convex shield, two-step drive, wedge cue, shove impact layers." }, { - "identity": "PR-A03 Pulse Duelist", - "role": "Mobile device fencer. Beat alternates Quick/Heavy; device triggers do not advance it.", - "skills": "Quick Circuit: 3x35 and move; on Quick gain Tempo. Heavy Closure: 125 to Marked target; on Heavy vent 2 Heat from allied device. Passive Offbeat Entry: crossing a pylon lane makes next strike ignore 20% Guard.", - "logic": "Alternate skills; break alternation only to escape lethal zone.", - "build": "Counters single targets near devices; device loss reduces identity. Synergy PR-B02,PR-B08. Requires both masteries, CH-03, trigger pylon and melee hit within 1 second three times.", - "production": "Rapier plus wrist coil, blue thrust/orange closure frames, square pulse trails, electric pluck followed by bass clasp." + "id": "PF-A03", + "name": "Lastlight", + "family": "advanced", + "role": "PF-B02; Edge wagers on execution", + "rules": "finish/front/center; Final Measure reserves all Edge; kill refunds half, survival leaves user Exposed.", + "cadence": "reach 1; wager only when visible forecast crosses defeat threshold.", + "strategy": "Barriers and death prevention punish wager; marks improve forecast. Opposes PF-A04 patience.", + "production": "O/A/V/S: narrow dueling blade, held finish pose, closing-line cue, silence-then-hit event." }, { - "identity": "PR-A04 Gale Harrier", - "role": "Mobile displacement striker. Wake max 4 from any moved unit.", - "skills": "Slipstream Raid (2): move through all bands, 45 to one enemy per band. Crosswind Claim (3): swap two units; enemies take 70, allies gain 20 Guard. Passive Tailwind Debt: two moves in 4 seconds apply Exposed to self.", - "logic": "Raid when 2+ bands occupied; swap for hazard counter before damage optimization.", - "build": "Counters spread summons; self-Exposed punishes spam. Synergy PR-B02,PR-B10. Requires both, CH-03, rescue an ally with movement then defeat its attacker.", - "production": "Winged scarf and hooked blades, clean band-to-band arcs, arrowed wind ribbons, flutter snap and three descending whistles." + "id": "PF-A04", + "name": "Turnblade", + "family": "advanced", + "role": "PF-B02; Edge becomes a deterministic counter", + "rules": "pressure/front; Turn Aside reserves one Edge as an explicit Block charge against the next eligible direct component targeting self. Trigger TURNBLADE_RETURN declares observed_role=actual_recipient, outcome_ids=AO_BLOCKED, component_tags=direct+block_eligible, once_scope=action, and allow_derived=false; it queues Return Cut against the source next tick.", + "cadence": "reach 2 counter; reserve Edge only for a telegraphed Block-eligible component due before the next basic; fire Return Cut only while its source remains legal and reachable, otherwise log the suppressed source reason.", + "strategy": "Unblockable/area components and sources beyond reach deny the return; readable single-target telegraphs and reach control enable it. Opposes PF-A03 execution.", + "production": "O/A/V/S: guard-ring blade, brace/return family, AO_BLOCKED square-to-arrow cue, parry scrape and return cut." }, { - "identity": "PR-A05 Prism Savant", - "role": "Mid adaptive magic. Facet stores last three allied damage tags, unique only.", - "skills": "Refract (2): 45 per stored Facet with matching tag; Blank Light (3): consume facets to remove that many enemy buffs, then deal 50 each. Passive Many-Colored Proof: three unique facets make self Tuned.", - "logic": "Use Blank Light at 2+ meaningful buffs; otherwise target weakness matching rarest facet.", - "build": "Counters layered buffs; uniform teams starve facets. Synergy PR-B03,PR-B12. Requires masteries, CH-04, resolve three tags inside one Break.", - "production": "Triangular lens staff and segmented cape; color plus shape encoding, glass chord where each facet is separately audible." + "id": "PF-A05", + "name": "Hookmarshal", + "family": "advanced", + "role": "PF-B03; Poise controls enemy order", + "rules": "reach-control/center; Crook Pull spends Poise to pull a reach-legal enemy one position forward.", + "cadence": "reach 2; pull protected caster when counterline can absorb it, then thrust.", + "strategy": "Pull immunity and front traps punish it; empowers Edgehand and short reach. Opposes PF-A06 static damage.", + "production": "O/A/V/S: hooked polearm, catch/haul, hooked-line cue, chainless wood-and-cloth pull." }, { - "identity": "PR-A06 Echo Scribe", - "role": "Rear repeat editor. Margin max 3 from non-Echo allied actives.", - "skills": "Quoted Action (2): create 40% Echo of chosen last ally skill. Errata (3): cancel an armed enemy Echo/repeat and make source Exposed. Passive No Infinite Footnote: own repeats cannot grant Margin or trigger repeats.", - "logic": "Quote highest utility legal skill, never pure damage below 80 power unless it Breaks. Errata before any enemy repeat.", - "build": "Counters repeats and multiplies utility; Hush blocks quoted secondary clauses. Synergy PR-B03,PR-B07. Requires both, CH-04, finish a fight with three different Echo tags and no duplicate source.", - "production": "Floating folio strips, writing gesture then translucent reenactment, ink-outline VFX, pen scratch resolving into source skill's softened audio." + "id": "PF-A06", + "name": "Sunlance", + "family": "advanced", + "role": "PF-B03; Poise becomes piercing setup", + "rules": "pressure/center; Noon Line spends all Poise to pierce every intervening enemy with declining effect.", + "cadence": "line reach; fire only through two or more legal targets, else build Poise.", + "strategy": "Spacing and forced movement collapse value; grouping and stable front enable it. Opposes PF-A05 reorder.", + "production": "O/A/V/S: long bright spear, extended plant/cast, straight sunbar cue, layered pass-through hits." }, { - "identity": "PR-A07 Lifewright", - "role": "Mid delayed healer. Graft max 3 from overheal prevented.", - "skills": "Future Scar (1): mark ally; 60% of damage over next 4 seconds returns as healing after delay, cap 120. Second Pulse (3): revive a defeated summon/device or heal living ally 140; cannot revive recruits. Passive Nothing Wasted: overheal becomes up to 25 Guard.", - "logic": "Mark forecast focus target; never use Second Pulse on device if an ally forecast is lethal.", - "build": "Counters predictable burst; delayed heal fails under Hush/timing displacement. Synergy PR-B04,PR-B08. Requires both, CH-04, recover 300 delayed damage without a defeat.", - "production": "Grafting hook and luminous thread spool; wound trace reverses visibly, heartbeat swell without medical alarm mimicry." + "id": "PF-A07", + "name": "Relayknife", + "family": "advanced", + "role": "PF-B04; movement hands timing to allies", + "rules": "enable/any; Pass The Turn spends Momentum on swap, advancing the swapped ally's basic while delaying own.", + "cadence": "adjacent ally; rescue endangered unit or advance a ready counter before cycling.", + "strategy": "Roots or selfish carry builds reduce value; slow high-impact basics benefit. Opposes PF-A08 self-routing.", + "production": "O/A/V/S: baton knife, tap-and-pass motion, paired footprints, handoff click." }, { - "identity": "PR-A08 Balm Judge", - "role": "Mid triage arbiter. Case max 3, gain when debuff is transferred or link expires.", - "skills": "Provisional Relief (1): heal 60 and suppress one debuff for 5 seconds; it returns if battle persists. Final Finding (3): remove all suppressed debuffs and deal 50 per removed clause to their sources. Passive Due Process: cannot target same ally twice consecutively.", - "logic": "Provisional on most dangerous clause, rotating allies; Final at 2+ returns or before boss phase.", - "build": "Counters debuff stacks; repeat-target ban creates triage risk. Synergy PR-B04,PR-B11. Requires both, CH-04, cleanse four distinct debuffs from three allies.", - "production": "Scales-shaped medicine case, stamp and pour poses, cream/red docket icons, woodblock stamp and calming bottle tone." + "id": "PF-A08", + "name": "Backdraft", + "family": "advanced", + "role": "PF-B04; full-line route becomes attack", + "rules": "reorder-pressure/any; Wake Cut damages each unique enemy passed while sprinting rear to front, then becomes Exposed.", + "cadence": "line traversal only when path is open; retreat after wake if threatened.", + "strategy": "Occupied path and focus fire punish it; Guard and pull setup open routes. Opposes PF-A07 ally timing.", + "production": "O/A/V/S: scarf blade, full-line sprint, tapered wake cue, sequential rush hits." }, { - "identity": "PR-A09 Briar Bastion", - "role": "Front reactive zone tank. Thorn max 4 when zone is entered.", - "skills": "Living Parapet (2): Front zone grants 15 Guard per second to stationary allies, 5 seconds. Root Reprisal (3): 90 to all enemies that moved this cycle and Anchor them. Passive Welcome Gate: allies entering zone cleanse Exposed.", - "logic": "Establish before movement wave; Reprisal after 2+ enemy moves.", - "build": "Counters dive waves; stationary artillery and Hush bypass it. Synergy PR-B05,PR-B01. Requires both, CH-05, protect all three bands with one zone cycle.", - "production": "Tower shield grown through trellis, vertical vine rampart, deep root thud and rattling seed warning." + "id": "PF-A09", + "name": "Pinseeker", + "family": "advanced", + "role": "PF-B05; Aim selects action parts", + "rules": "precision/rear; Joint Pin spends Aim to delay a telegraphed movement or interruptible wind-up instead of dealing full damage.", + "cadence": "line projectile; pin highest-impact legal telegraph, otherwise preserve Aim.", + "strategy": "Screens and uninterruptible actions counter it; Bellkeeper extends pin windows. Opposes PF-A10 coverage.", + "production": "O/A/V/S: pin bow, low draw, joint-cross cue, taut snap with delayed thunk." }, { - "identity": "PR-A10 Trail Architect", - "role": "Rear terrain planner. Plan three tiles; placing fourth replaces oldest.", - "skills": "Switchback: place lane; first ally crossing moves twice and gains Anchored. False Trail: place enemy lure; next unbossed enemy path chooses it, then becomes Exposed. Passive Mapped Escape: one plan may be moved per encounter without cooldown.", - "logic": "Place against known telegraph destinations; never overlap plans.", - "build": "Counters deterministic movement; random/immune bosses reduce value. Synergy PR-B05,PR-B06. Requires both, CH-05, make one hazard defeat another enemy.", - "production": "Survey tripod and ribbon stakes; top-down plan overlay in battle plane, chalk tap and unfolding-map sweep." + "id": "PF-A10", + "name": "Rainbow", + "family": "advanced", + "role": "PF-B05; Aim becomes distributed volley", + "rules": "area/rear; Falling String spends Aim to strike three distinct legal targets; cannot repeat one target.", + "cadence": "line projectile; volley at three targets, otherwise basic to build Aim.", + "strategy": "Single durable enemy wastes breadth; debuff-on-hit gear multiplies it. Opposes PF-A09 precision.", + "production": "O/A/V/S: split-limb bow, upward release, three-notch cue, staggered arrow rain." }, { - "identity": "PR-A11 Farline Seer", - "role": "Rear predictive sniper. Horizon max 3 from revealed target rules.", - "skills": "Before the Step (2): 130 to enemy if it has not acted this cycle, else 65. Afterimage Census (3): reveal next targets of all enemies and create decoy for each targeting Rear. Passive Patient Sight: not acting for 2 seconds adds 1 Horizon.", - "logic": "Fire on dangerous unacted target; Census at 3+ hidden targets or 2+ Rear threats.", - "build": "Counters openers; fast retargeting and Hush. Synergy PR-B06,PR-B09. Requires both, CH-05, interrupt three enemies before first action.", - "production": "Extra-long sighting frame and mirrored hood, narrow anticipation line, distant string pluck and soft shutter cascade." + "id": "PF-A11", + "name": "Stormledger", + "family": "advanced", + "role": "PF-B06; Charge chains by cadence", + "rules": "area/rear; Rolling Sum jumps to the next enemy whose action is later, losing power each jump.", + "cadence": "line spell; start on fastest enemy when at least two later targets exist.", + "strategy": "Uniform timing and isolation limit chain; tempo delays reshape the sequence. Opposes PF-A12 focused channel.", + "production": "O/A/V/S: page-rod, sequential cast, numbered bolt cue, pitch-descending chain." }, { - "identity": "PR-A12 Quarry Warden", - "role": "Rear focus commander. Claim max 3 from allies hitting Marked target with different tags.", - "skills": "Name the Threat (1): Mark, reveal stability and lowest resistance. Measured Volley (3): each ally queues 35-power tag-specific strike; only legal allies fire. Passive No Wasteful Hunt: overkill strikes retarget summons.", - "logic": "Claim highest forecast danger; Volley at three different eligible tags or during Break.", - "build": "Counters priority elites; decoys and target bans fragment volley. Synergy PR-B06,PR-B12. Requires both, CH-05, coordinate four roles on one Mark.", - "production": "Signal crossbow and quarry pennant, radial ally lines, four timbral clicks then unified impact." + "id": "PF-A12", + "name": "Hollowstar", + "family": "advanced", + "role": "PF-B06; Charge is stored through interruption at a cost", + "rules": "pressure/rear; Held Rift preserves Charge when interrupted but applies self Hindered; release focuses one target.", + "cadence": "line spell; retain through one interruption, release at marked high-threat enemy.", + "strategy": "Repeated interrupts compound delay; Guard and cleanse protect payoff. Opposes PF-A11 distributed chain.", + "production": "O/A/V/S: dark aperture focus, brace/release, hollow diamond cue, muted charge then bass impact." }, { - "identity": "PR-A13 Chorus Keeper", - "role": "Mid cadence stabilizer. Harmony stores up to 3 distinct resource types spent by allies.", - "skills": "Common Meter (2): next three allies act at fixed 1-second spacing and each gains 10 Guard. Borrowed Note (3): chosen ally gains 1 of a stored resource matching its profession. Passive Different Voices: duplicate resource types do not add Harmony.", - "logic": "Meter before linked telegraphs; Borrow only to enable a ready counter skill.", - "build": "Counters timing disruption; uniform resource teams weaken it. Synergy PR-B07,PR-B03. Requires both, CH-06, complete six-action sequence with no repeated tag.", - "production": "Three-ring bell frame, conductor pose with numbered ticks, polyrhythm resolving into a stable chord." + "id": "PF-A13", + "name": "Fieldmender", + "family": "advanced", + "role": "PF-B07; Remedy follows moving patients", + "rules": "restore/center; Walking Triage heals a target then swaps it one step rearward if the space relation is legal.", + "cadence": "allied reach 2; extract lowest-vitality exposed ally, otherwise cleanse.", + "strategy": "Reorder locks and rear pressure counter extraction; front replacements benefit. Opposes PF-A14 delayed care.", + "production": "O/A/V/S: sling lamp, support-and-step, rear arrow in circle, bandage rustle and step." }, { - "identity": "PR-A14 Dissonant Envoy", - "role": "Mid anti-buff support. Discord max 3 from enemy repeated action tags.", - "skills": "Contrary Motion (1): 70 and invert target's next speed buff into equal slow. Unison Refused (3): enemies repeating same tag become Hushed and lose 20 stability. Passive Useful Argument: first allied different-tag response gains Tuned.", - "logic": "Track repeated enemy tag; cast before buff or 3-unit unison.", - "build": "Counters synchronized waves; varied enemies deny resource. Synergy PR-B07,PR-B12. Requires both, CH-06, Break an elite by interrupting a repeated tag.", - "production": "Offset double bell and jagged mantle, opposing wave lines, controlled beating tones that resolve cleanly." + "id": "PF-A14", + "name": "Aftercare", + "family": "advanced", + "role": "PF-B07; Remedy schedules future healing", + "rules": "restore/rear; Promise Dose spends Remedy now to heal after target's next action, stronger if it takes damage first.", + "cadence": "allied reach line; schedule on forecast target, never duplicate an active promise.", + "strategy": "Burst before trigger defeats it; predictable tanks and action acceleration enable it. Opposes PF-A13 immediate extraction.", + "production": "O/A/V/S: sealed vial lamp, tag-and-release, hourglass-cross cue, delayed glass chime." }, { - "identity": "PR-A15 Relay Smith", - "role": "Mid deployable support. Parts max 4; devices expiring intact return 1.", - "skills": "Bridge Node (2): link two bands; first allied projectile through gains 40 power. Salvage Recall: remove device, heal it into weakest ally at 60% remaining duration value. Passive Field Standard: only one of each device type.", - "logic": "Bridge when ranged action queued; recall before destruction or phase move.", - "build": "Counters distant armor; device pressure and movement. Synergy PR-B08,PR-B11. Requires both, CH-06, keep two different devices alive for 10 seconds.", - "production": "Folding bridge antenna, magnetic assembly frames, orange/coral circuit lines, tool clacks and rising relay hum." + "id": "PF-A15", + "name": "Chainhost", + "family": "advanced", + "role": "PF-B08; one Bond links three different roles", + "rules": "enable/center; Third Knot extends a link through both neighbors; any same-tag repeat frays both sides.", + "cadence": "adjacent network; build only with three distinct action tags, share to weakest side.", + "strategy": "Displacement and role duplication break it; mixed cadence lines gain coverage. Opposes PF-A16 pair focus.", + "production": "O/A/V/S: triple knot frame, three-hand sweep, tri-braid cue, three-note pluck." }, { - "identity": "PR-A16 Stormwright", - "role": "Mid weather engineer. Pressure -3 to +3; movement pushes sign toward its direction.", - "skills": "Headwind Coil (2 absolute): push enemies one band; at positive Pressure also 70 damage. Calm Engine (set 0): cleanse Drift and give all units 10 Guard, allies twice. Passive Forecast Debt: using same sign twice Hushes next skill.", - "logic": "Choose sign to counter forecast movement; Calm when 3+ allies Drift or before sign repeat.", - "build": "Counters weather, self-Hush punishes spam. Synergy PR-B08,PR-B10. Requires both, CH-06, cross both pressure extremes without ally defeat.", - "production": "Barometer backpack and vane staff, signed arrow VFX, wind machine swell and pressure-valve cadence." + "id": "PF-A16", + "name": "Burdenmate", + "family": "advanced", + "role": "PF-B08; Bond transfers a chosen cost", + "rules": "protect/center; Take The Clause moves one visible hindrance or item cooldown from neighbor to self, gaining Bond.", + "cadence": "neighbor only; take action-blocking cost if self can still act, then share resource.", + "strategy": "Isolation and nontransferable boss tags stop it; cleanse and self-cost equipment enable it. Opposes PF-A15 network breadth.", + "production": "O/A/V/S: split knot frame, pull-to-chest, divided-circle cue, tension snap." }, { - "identity": "PR-A17 Gloam Agent", - "role": "Rear research assassin. Secret max 3 from revealing hidden rules without being targeted.", - "skills": "Redacted Entry (2): 100 to researched enemy; suppress its variant clause 5 seconds. Witness Gone (3): decoy takes next targeted skill and Marks attacker. Passive Known Weakness: +30 power against fully researched identity, not bosses.", - "logic": "Suppress dangerous variant before damage; decoy forecast targeted skill.", - "build": "Counters variants; band-wide attacks and unresearched bosses. Synergy PR-B06,PR-B09. Requires both, CH-07, clear a variant encounter without triggering its clause.", - "production": "Archive tabs on dark scout coat, paper-cut decoy, black/white redaction bars, page tear and damped impact." + "id": "PF-A17", + "name": "Sentrymaker", + "family": "advanced", + "role": "PF-B09; Parts create rear projectile device", + "rules": "construct/rear; Needle Post occupies one footprint behind user and shoots user's last basic target.", + "cadence": "mirrored line reach; deploy only with rear room, retune when target invalid.", + "strategy": "Rear compression/device hunters remove it; marks stabilize target. Opposes PF-A18 frontline trap.", + "production": "O/A/V/S: fold-out post, plant/aim/fold, tripod cue, clockwork shot events." }, { - "identity": "PR-A18 Mirrorfox", - "role": "Mobile decoy duelist. Reflection max 3 when enemy hits decoy or mirrored band.", - "skills": "Borrowed Stance (2): copy target's Front/Mid/Rear preference for 6 seconds and gain 20 Guard. Wrong Answer (3): place decoy in mirrored band; hit explodes for 100 and swaps self there. Passive One Original: duplicate own skill is always Hushed.", - "logic": "Copy preference to evade focus; decoy only into forecast line.", - "build": "Counters rigid target scripts; area attacks and Hush. Synergy PR-B02,PR-B09. Requires both, CH-07, cause four attacks to miss via two movement methods.", - "production": "Fox-tail-shaped mirror ribbons, explicit striped decoy, glass tap and playful two-beat displacement motif." + "id": "PF-A18", + "name": "Snarewright", + "family": "advanced", + "role": "PF-B09; Parts arm a vacated position", + "rules": "control/center; Latch Tile triggers when an enemy is pushed or pulled across its indexed line position.", + "cadence": "position target; arm ahead of predicted reorder, otherwise conserve Parts.", + "strategy": "No displacement means dormant value; Hookmarshal and Ramward trigger it. Opposes PF-A17 repeated shots.", + "production": "O/A/V/S: flat latch kit, place/arm/spring, toothed-square cue, clamp event." }, { - "identity": "PR-A19 Undertow Sage", - "role": "Mid enemy-position controller. Tide cycles Flood/Ebb.", - "skills": "Floodgate: pull all enemies toward Mid; moved enemies take 45. Ebb Sentence: push all away from Mid; blocked enemies Hushed. Passive Moon Turn: using opposite Tide within 4 seconds refunds 1 Flow to currentcallers.", - "logic": "Alternate; select action that moves 2+ or blocks a key clause.", - "build": "Counters formations; Anchored enemies and scattered immunity. Synergy PR-B10,PR-B03. Requires both, CH-07, move every enemy twice in opposite directions.", - "production": "Wide tide fan and moon dial, mirrored blue/silver arcs, surf inhale/exhale with firm click at turn." + "id": "PF-A19", + "name": "Paleoracle", + "family": "advanced", + "role": "PF-B10; Omen copies expiry timing", + "rules": "impair/rear; Borrowed End makes a different hindrance expire when the copied source expires, sharing cleanse risk.", + "cadence": "line spell; pair long ally status with urgent enemy status.", + "strategy": "Cleanse removes both schedule value; varied debuff durations enable planning. Opposes PF-A20 consumption.", + "production": "O/A/V/S: twin tablet, cross-inscribe, linked broken rings, paired whisper cutoff." }, { - "identity": "PR-A20 Brine Oracle", - "role": "Mid cleanse/position healer. Salinity max 4 from cleansed movement/debuff effects.", - "skills": "Salt Path (2): chosen band cleanses one debuff from entrants for 5 seconds. Preserving Current (3): pull lowest-vitality ally, heal 100, and make its current buffs pause 2 seconds. Passive Measured Dose: same ally cannot receive both skills in 6 seconds.", - "logic": "Path before mass debuff; Current on lethal forecast or expiring key buff.", - "build": "Counters debuff terrain; repeat-target restriction. Synergy PR-B10,PR-B04. Requires both, CH-07, preserve three different buffs through a hazard.", - "production": "Salt-glass staff and flowing apron, crystalline lane not particle fog, shell chime and water draw." + "id": "PF-A20", + "name": "Dreadtaster", + "family": "advanced", + "role": "PF-B10; consumes hindrance for burst", + "rules": "pressure/rear; Bitter Proof removes one enemy hindrance to damage and expose it based on remaining duration.", + "cadence": "line spell; consume just before cleanse or kill window, never erase needed control early.", + "strategy": "Premature use wastes setup; many short debuffs and finishers enable it. Opposes PF-A19 duration control.", + "production": "O/A/V/S: tasting needle and veil, draw/strike, collapsing ring cue, inhale-to-crack event." }, { - "identity": "PR-A21 Covenant Weaver", - "role": "Mid multi-link support. Clause max 4 from linked units choosing different actions.", - "skills": "Threefold Accord (3): link one ally per band; first heal/Guard on one shares 30% to others. Amendment (2): change one linked unit's incoming forced move into Tuned. Passive No Majority Rule: repeated role tags halve shared value.", - "logic": "Link varied roles; Amendment on key position holder.", - "build": "Counters distributed pressure; uniform parties and area dispel. Synergy PR-B11,PR-B05. Requires both, CH-08, keep three-role link alive through boss telegraph.", - "production": "Loom-frame focus with three colored cords, knot transitions, harp triad where each line remains distinct." + "id": "PF-A21", + "name": "Marchbell", + "family": "advanced", + "role": "PF-B11; Verse synchronizes basics", + "rules": "tempo/center; Common Step spends Verse so both neighbors' next basics resolve together after the slower one.", + "cadence": "neighbors; synchronize complementary basics, avoid simultaneous overkill.", + "strategy": "Area interrupts and redundant targets punish sync; combo tags and shared target rules benefit. Opposes PF-A22 enemy denial.", + "production": "O/A/V/S: broad bell, two-side conducting, paired bars cue, merged beat event." }, { - "identity": "PR-A22 Severance Adept", - "role": "Rear anti-link disruptor. Cut max 3 from Hush prevented or enemy link broken.", - "skills": "Clean Break (1): remove one link/redirect; deal 90 to its source. Merciful Silence (3): Hush all units 2 seconds, allies gain 25 Guard, enemies lose 20 stability. Passive Aftercare: ally leaving Hush becomes Tuned.", - "logic": "Break enemy redirection immediately; global Hush only against decisive clause wave.", - "build": "Counters links/repeats but delays allies too. Synergy PR-B07,PR-B09. Requires both, CH-08, prevent Hush then deliberately use it to Break.", - "production": "Cord-cutting crescent and quiet veil, clean snapped-line VFX, single shears click followed by near-silence and soft return chord." + "id": "PF-A22", + "name": "Quietus", + "family": "advanced", + "role": "PF-B11; Verse cancels sound-tagged wind-ups", + "rules": "control/center/rear; Held Clapper spends all Verse to interrupt one sound or command telegraph, then self-silences.", + "cadence": "line control; reserve for preview-tagged major action, otherwise advance ally.", + "strategy": "Non-sound threats bypass it; forecast and cleanse support the self-cost. Opposes PF-A21 ally acceleration.", + "production": "O/A/V/S: wrapped bell, catch-clapper pose, crossed-wave cue, sudden mix duck with caption." }, { - "identity": "PR-A23 Field Captain", - "role": "Front mobile commander. Initiative max 3 from ally moving into commanded band.", - "skills": "Advance by Names (2): choose two different roles; they move toward selected band and gain 20 Guard. Hold the Difference (3): next three different action tags deal +35 power; repeated tag ends effect. Passive Lead from Here: first Fallback each cycle costs marshal 1 less Order.", - "logic": "Move only units outside armed hazards; activate Difference with three queued unique tags.", - "build": "Counters formation checks; repeated tags waste window. Synergy PR-B12,PR-B01,PR-B02. Requires three masteries? Requires PR-B12+either PR-B01 or PR-B02, CH-08, resolve a three-role linked telegraph.", - "production": "Pennant-shield hybrid, sweeping group direction poses, colored role chevrons, field drum plus named nonverbal instrument cues." + "id": "PF-A23", + "name": "Trailfactor", + "family": "advanced", + "role": "PF-B12; Supply alters post-battle offers", + "rules": "supply/rear; Field Sample marks first defeated enemy family; post-battle shop guarantees one matching counter tag, spending stored Supply.", + "cadence": "battle reach 1; sample novel threat, use Supply on urgent item refresh.", + "strategy": "Repeated familiar enemies lower value; diverse routes and missing counter gear reward it. Opposes PF-A24 immediate line logistics.", + "production": "O/A/V/S: sample pack, tag/scoop/ledger, specimen-tab cue, cork and pencil events." }, { - "identity": "PR-A24 Concord Mediator", - "role": "Rear capstone support. Concord max 4, one per distinct role action; duplicates reset count to 1.", - "skills": "Working Agreement (4): preserve two otherwise exclusive allied buffs together for 6 seconds. Right to Reply (2): after enemy skill, queue lowest-speed ally immediately at 70% power. Passive Stable Difference: at four distinct roles, party resists first Hush each 10 seconds.", - "logic": "Agreement only on actual exclusive buffs; Reply with ally holding a legal counter, else damage role.", - "build": "Counters uniformity tests; fragile in duplicate-role teams. Synergy all mixed parties. Requires PR-B12+PR-B03 or PR-B07, CH-08, complete three linked telegraphs with four roles.", - "production": "Open circular staff with unmatched colored segments, interlocking-not-merging VFX, ensemble chord whose instruments remain separable." + "id": "PF-A24", + "name": "Lineporter", + "family": "advanced", + "role": "PF-B12; Supply moves equipment triggers", + "rules": "enable/center; Hand Carry transfers one unused once-per-battle item trigger to a legal neighbor; item itself stays equipped.", + "cadence": "neighbor only; move a trigger to the unit with legal target, else retreat-step endangered ally.", + "strategy": "Bound/self-only items cannot transfer; proc gear and mixed eligibility benefit. Opposes PF-A23 future offers.", + "production": "O/A/V/S: open-frame pack, pass token, hand-arrow cue, clasp-release event." + }, + { + "id": "PF-H01", + "name": "Warmantle", + "family": "hidden", + "role": "PF-B01 + PF-B07; prevent a lethal hit then restore that unit in one battle; locks personal direct damage item triggers", + "rules": "front-restore/front; intercepted loss becomes Care Debt; basics pay debt before generating Guard, and paid debt heals the protected neighbor.", + "cadence": "reach 1; intercept only survivable debt, pay oldest debt, then Shield Knock.", + "strategy": "Anti-heal turns debt dangerous; delayed-heal gear and stable adjacency excel.", + "production": "P/O/A/V/S: mantle shield, brace/tend cycle, stitched-square cue, block resolving into heartbeat." + }, + { + "id": "PF-H02", + "name": "Danceshear", + "family": "hidden", + "role": "PF-B02 + PF-B11; alternate three targets on three cadence bands; locks heavy Guard equipment", + "rules": "tempo-pressure/front/center; Edge is gained by landing exactly between neighbor actions; spend to cut an enemy wind-up shorter or longer.", + "cadence": "reach 2; alter a telegraph only when it changes collision with ally timing, else alternate targets.", + "strategy": "Silence and uniform cadence deny setup; Marchbell and multi-hit gear create windows.", + "production": "P/O/A/V/S: bell-hilt blades, beat-step cuts, split metronome cue, blade/bell hybrid events." + }, + { + "id": "PF-H03", + "name": "Horizon Reaver", + "family": "hidden", + "role": "PF-B03 + PF-B05; defeat a rearmost enemy without changing party order; locks reach-1-only equipment", + "rules": "projectile-reach/center/rear; plants polearm as a guide, making next shot pierce to rearmost, then must recover the guide with a basic thrust.", + "cadence": "line reach; guide only when rear target matters, recover before another guided shot.", + "strategy": "Forced movement cancels recovery; stable front and marks enable precise rear removal.", + "production": "P/O/A/V/S: bow-spear assembly, plant/draw/recover, horizon line cue, taut shot with haft return." + }, + { + "id": "PF-H04", + "name": "Switchwright", + "family": "hidden", + "role": "PF-B04 + PF-B09; trigger a device from three different positions; locks immobile-device items", + "rules": "reorder-construct/any; carries one device while stepping; each new indexed position changes its mode: guard, strike, then pull ally rearward.", + "cadence": "adjacent/device reach; choose route by needed third mode, avoid cycling through danger.", + "strategy": "Roots and full lines stop modes; position-trigger gear compounds planning.", + "production": "P/O/A/V/S: backpack automaton, carry/drop/switch, numbered footprint cue, three-mode mechanical motif." + }, + { + "id": "PF-H05", + "name": "Eventide Scholar", + "family": "hidden", + "role": "PF-B06 + PF-B10; interrupt a charged cast and use the retained hindrance to win; locks instant-cast items", + "rules": "area-impair/rear; interrupted Charge becomes Shadow Text that can be placed on an enemy; its next hindrance expiry releases the stored area cast.", + "cadence": "line spell; accept one safe interrupt, place text on durable target, then seed expiry.", + "strategy": "Cleanse before expiry erases cast; Aftercare timing and varied hindrances support it.", + "production": "P/O/A/V/S: split light tablet, collapse/inscribe/release, eclipsed diamond cue, reversed charge audio." + }, + { + "id": "PF-H06", + "name": "Covenant Factor", + "family": "hidden", + "role": "PF-B08 + PF-B12; share three different resources without repeating a recipient; locks self-only item refresh", + "rules": "enable-supply/center; Bond tracks declared loans of Guard, Remedy, Parts, Verse, or Supply; repayment on recipient action yields one flexible Credit.", + "cadence": "neighbors then reach 2; loan what recipient can spend next, use Credit on broken link or item cooldown.", + "strategy": "Resource lock and isolation create bad debt; mixed professions and proc gear reward it.", + "production": "P/O/A/V/S: ledger-knot frame, loan/mark/close, linked tabs cue, stamped pluck events." + } + ], + "traits": [ + { + "id": "TR-001", + "name": "First Through", + "benefit": "First action after becoming foremost gains reach +1.", + "cost": "That action cannot target the current foremost enemy.", + "evidence": "Front-arrow badge pulses; result names chosen farther target.", + "prohibited": "PF-B01, PF-A01, PF-H01; self-only target actions." + }, + { + "id": "TR-002", + "name": "Patient Start", + "benefit": "After two allied actions resolve, first basic gains one local resource.", + "cost": "Starts battle with its first basic delayed one cadence band.", + "evidence": "Two-notch timer under portrait; report shows delayed and paid tick.", + "prohibited": "PF-A21; opening-action equipment." + }, + { + "id": "TR-003", + "name": "Narrow Guard", + "benefit": "When only one neighbor exists, intercepts one non-area hit without spending resource.", + "cost": "While two neighbors exist, cannot receive transferred Guard.", + "evidence": "One/two-neighbor shield icon; intercept has trait source label.", + "prohibited": "PF-A15; forced-intercept equipment." + }, + { + "id": "TR-004", + "name": "Long Memory", + "benefit": "Repeating the last legal target increases status duration by one tick.", + "cost": "Changing target delays the next action by one tick.", + "evidence": "Prior-target ring and tick preview; report groups repeats/switches.", + "prohibited": "Target-randomizing equipment; PF-A10." + }, + { + "id": "TR-005", + "name": "Spare Hand", + "benefit": "May carry one construct or summon footprint through a swap.", + "cost": "Carried object loses its next automatic action.", + "evidence": "Object attaches visibly during swap; result logs skipped action.", + "prohibited": "PF-H04; immovable-device items." + }, + { + "id": "TR-006", + "name": "Open Stance", + "benefit": "After a push or pull, immediately basic-attacks the mover if reachable.", + "cost": "Becomes Exposed until that basic resolves.", + "evidence": "Bent-arrow badge and exposed outline; counter target logged.", + "prohibited": "Displacement immunity equipment; PF-A04." + }, + { + "id": "TR-007", + "name": "Deep Pocket", + "benefit": "First consumable equipment trigger each battle is preserved for a second legal target.", + "cost": "Both uses have one longer cooldown band.", + "evidence": "Two-charge item pip and extended clock; results split both uses.", + "prohibited": "PF-A24; single-use wager items." + }, + { + "id": "TR-008", + "name": "Quiet Hands", + "benefit": "Cannot be targeted by sound-tagged enemy actions while behind two allies.", + "cost": "Own sound-tagged actions generate no local resource.", + "evidence": "Muted-wave badge; rejected targets explain depth condition.", + "prohibited": "PF-A22; PF-B11." + }, + { + "id": "TR-009", + "name": "Counterweight", + "benefit": "Resists first pull and transfers its movement to the neighbor ahead.", + "cost": "If that neighbor cannot move, both become Hindered.", + "evidence": "Linked weight icon; preview shows legal recipient; failure logs blockage.", + "prohibited": "PF-B01; movement-lock equipment." + }, + { + "id": "TR-010", + "name": "Shared Cup", + "benefit": "Effective healing received also restores a smaller amount to lowest-vitality neighbor.", + "cost": "Direct self-healing is reduced.", + "evidence": "Cup arc identifies neighbor before resolution; result separates shared heal.", + "prohibited": "PF-H01; no-neighbor formation starts." + }, + { + "id": "TR-011", + "name": "Bright Target", + "benefit": "Enemies prefer this recruit over equal-reach candidates.", + "cost": "Each attack survived grants one Focus, capped until the recruit moves.", + "evidence": "Visible threat flare and Focus pips; report cites target-score source.", + "prohibited": "Untargetable-opening items; PF-A08." + }, + { + "id": "TR-012", + "name": "Late Step", + "benefit": "When neighbor ahead dies, steps into the gap only after completing current wind-up.", + "cost": "Cannot act during the subsequent collapse tick.", + "evidence": "Pending-step ghost silhouette; result shows preserved cast and lost tick.", + "prohibited": "Instant-collapse equipment; no-wind-up actions." + }, + { + "id": "TR-013", + "name": "Frugal Rhythm", + "benefit": "Every third basic that spends no resource shortens one equipment cooldown.", + "cost": "Resource-spending actions reset the three-basic count.", + "evidence": "Three-bead counter; reset and refresh named in results.", + "prohibited": "PF-B12; equipment without cooldowns." + }, + { + "id": "TR-014", + "name": "Heavy Sleeve", + "benefit": "First interrupt becomes a delay instead of cancellation.", + "cost": "Wind-up after the delay resolves one cadence band slower.", + "evidence": "Sleeve bar catches interrupt cue; report contrasts old/new completion tick.", + "prohibited": "Uninterruptible-cast equipment; PF-A12." + }, + { + "id": "TR-015", + "name": "Far Listener", + "benefit": "May receive enable actions from one additional position away.", + "cost": "Cannot receive them from an immediate neighbor while at full vitality.", + "evidence": "Distant-ear arc and rejected-neighbor reason.", + "prohibited": "PF-A15; adjacency-only bond equipment." + }, + { + "id": "TR-016", + "name": "Ash Appetite", + "benefit": "Defeating a Hindered enemy restores one local resource.", + "cost": "Defeating an unhindered enemy removes one local resource if available.", + "evidence": "Status-check flame icon; both gain/loss events captioned.", + "prohibited": "Professions with no local resource; status-immunity items." + }, + { + "id": "TR-017", + "name": "Exacting", + "benefit": "The first action each battle gains +1 reach only for completion validation against its reserved target; movement that remains inside that reach follows the same unit ID and records TARGET_MOVED_STILL_LEGAL on its terminal outcome.", + "cost": "If that reservation instead emits AO_INVALID_REACH, AO_INVALID_UNTARGETABLE, AO_INVALID_FALLEN, or AO_INVALID_FILTER, its policy is forced to fizzle, then emits AO_FIZZLED with zero resource or cooldown refund; it cannot retarget or ground-resolve.", + "evidence": "Reservation frame shows the one-use extended reach; results show the invalid record, AO_FIZZLED, or the followed-target detail and accepted wager.", + "prohibited": "Ground-resolve equipment; PF-A10." + }, + { + "id": "TR-018", + "name": "Thin Blood", + "benefit": "Taking area damage advances next action by one tick.", + "cost": "Direct single-target healing is less effective.", + "evidence": "Area-hit speed notch and cracked-drop badge; report quantifies lost care.", + "prohibited": "Area immunity equipment; PF-B07." + }, + { + "id": "TR-019", + "name": "Backwatch", + "benefit": "First enemy entering the allied rear is immediately Marked.", + "cost": "While no rear intruder exists, recruit's forward reach is reduced by one.", + "evidence": "Rear eye badge; reach preview updates; intrusion mark logged.", + "prohibited": "PF-B05; reach-1 professions." + }, + { + "id": "TR-020", + "name": "Oathbound Tool", + "benefit": "Choose one equipped item at battle start; its first trigger gains priority over profession action.", + "cost": "Other item triggers wait until the chosen trigger resolves or expires.", + "evidence": "Chosen-slot ribbon and queue state; blocked triggers have reason.", + "prohibited": "No-trigger equipment sets; PF-A24." + }, + { + "id": "TR-021", + "name": "Loose Formation", + "benefit": "Gains one local resource after swapping with a different profession role.", + "cost": "Repeating a swap partner applies Hindered to self.", + "evidence": "Partner-role bead track; repeat warning in formation preview.", + "prohibited": "PF-H04; swap-lock equipment." + }, + { + "id": "TR-022", + "name": "Stone Count", + "benefit": "Third hit from the same enemy grants Guard and clears its Mark.", + "cost": "Changing attackers resets count.", + "evidence": "Attacker portrait with three stones; reset shown on target change.", + "prohibited": "Forced-target equipment; PF-A01." + }, + { + "id": "TR-023", + "name": "Borrowed Pace", + "benefit": "After receiving an action advance, copies the giver's cadence for one basic.", + "cost": "If copied cadence is slower, cannot be advanced again until that basic.", + "evidence": "Donor-color-independent bar shape; report records copied band.", + "prohibited": "PF-A21; cadence-fixed equipment." + }, + { + "id": "TR-024", + "name": "Clean Break", + "benefit": "First cleanse also removes the recruit's oldest positive tag and grants local resource.", + "cost": "If no positive tag exists, cleanse takes one extra tick.", + "evidence": "Paired plus/minus token; tooltip previews removed tag.", + "prohibited": "PF-A16; positive-tag-lock items." + }, + { + "id": "TR-025", + "name": "Risk Ledger", + "benefit": "Surviving while Exposed adds one discount step to this recruit's next shop equipment purchase.", + "cost": "Ending battle never Exposed clears all accumulated steps.", + "evidence": "Persistent personal tally visible in roster/shop; result states kept/cleared.", + "prohibited": "Exposed-immunity equipment; retreat-only encounters." + }, + { + "id": "TR-026", + "name": "Hollow Reach", + "benefit": "Basics may pass through a summoned footprint.", + "cost": "Basics deal no effect to summoned units.", + "evidence": "Hollow projectile/line cue; illegal summon target reason.", + "prohibited": "Summon-hunter equipment; PF-A17." + }, + { + "id": "TR-027", + "name": "Rooted Voice", + "benefit": "Sound and command actions cannot be interrupted while recruit has not moved.", + "cost": "Moving self-silences until next basic resolves.", + "evidence": "Rooted waveform icon; movement preview shows silence interval.", + "prohibited": "PF-B04, PF-A08, PF-H04." + }, + { + "id": "TR-028", + "name": "Second Draft", + "benefit": "First self-applied hindrance is replaced by Hindered of shorter duration.", + "cost": "Second self-applied hindrance lasts one tick longer.", + "evidence": "Two-page counter; replacement/extension source is explicit.", + "prohibited": "Self-cost-free equipment; PF-A16." + }, + { + "id": "TR-029", + "name": "Open Palm", + "benefit": "Resource-sharing actions can target through one intervening ally.", + "cost": "Sharing with a distant ally gives nothing to immediate neighbors that cadence.", + "evidence": "Straight handoff line; opportunity cost shown on neighbor pips.", + "prohibited": "PF-H06; no-resource professions." + }, + { + "id": "TR-030", + "name": "Turncoat Buckle", + "benefit": "When pushed behind the current rearmost position, immediately steps to center.", + "cost": "Drops one active positive equipment tag during the step.", + "evidence": "Buckle opens and center ghost appears; dropped tag named in log.", + "prohibited": "Position-lock equipment; PF-A08." + }, + { + "id": "TR-031", + "name": "Storm Nerve", + "benefit": "Each completed enemy major wind-up grants Focus.", + "cost": "An interrupted enemy major action removes all stored Focus.", + "evidence": "Major-action rings feed Focus pips; interruption loss bursts visibly.", + "prohibited": "Focusless professions; PF-A09." + }, + { + "id": "TR-032", + "name": "Gentle Finish", + "benefit": "Overkill is converted into Remedy for the lowest-vitality ally.", + "cost": "Cannot benefit from execution-threshold effects.", + "evidence": "Overkill trail bends to ally; threshold rejection is explicit.", + "prohibited": "PF-A03; execution-tag equipment." + }, + { + "id": "TR-033", + "name": "Split Attention", + "benefit": "Can maintain two Marks placed by equipment.", + "cost": "Profession-applied Marks last one tick less.", + "evidence": "Two half-eye pips; source-specific duration in inspect.", + "prohibited": "Equipment set without Marks; markless professions." + }, + { + "id": "TR-034", + "name": "Weathered", + "benefit": "First region hazard each battle has no effect.", + "cost": "Second hazard of a different tag has extended duration.", + "evidence": "Region hazard shield with empty/filled halves; result cites both tags.", + "prohibited": "Hazard-immunity equipment; single-hazard challenge rules." + }, + { + "id": "TR-035", + "name": "Empty Scabbard", + "benefit": "With no armament-tag item, basic gains a profession-specific alternate target rule.", + "cost": "Equipping an armament disables the trait and adds one cost tier to that shop action.", + "evidence": "Empty-slot target preview and explicit disabled state.", + "prohibited": "Required-armament professions; bound armament items." + }, + { + "id": "TR-036", + "name": "Last Witness", + "benefit": "When the only living member in a line band, reveals next enemy target and gains reach +1.", + "cost": "Cannot receive invisibility or untargetable tags.", + "evidence": "Lone-band eye and forecast line; rejected concealment has trait reason.", + "prohibited": "Concealment equipment; PF-B01." + } + ], + "equipment": [ + { + "id": "EQ-001", + "name": "Stepback Soles", + "fit": "garb; any", + "class": "B", + "effect": "After first direct hit, step one position rearward if legal.", + "tradeoff": "Next basic waits one tick; full rear makes trigger dormant.", + "production": "I/O/V/S: split-heel boots, rear arrow, heel scrape." + }, + { + "id": "EQ-002", + "name": "Frontpin Greaves", + "fit": "garb; front", + "class": "B", + "effect": "Resist the first enemy push until wearer completes a basic.", + "tradeoff": "The completed basic Hinders wearer for one tick.", + "production": "I/O/V/S: pegged greaves, brace notch, stone pin." + }, + { + "id": "EQ-003", + "name": "Passing Sash", + "fit": "garb; any", + "class": "B", + "effect": "First allied swap through wearer advances the passing ally's basic.", + "tradeoff": "Wearer's next basic is delayed equally.", + "production": "I/O/V/S: two-tail sash, handoff arrows, cloth snap." + }, + { + "id": "EQ-004", + "name": "Gapfinder Sandals", + "fit": "garb; any", + "class": "B", + "effect": "On a neighbor's defeat, choose collapse toward wearer instead of default once.", + "tradeoff": "Wearer becomes Exposed during the collapse tick.", + "production": "I/O/V/S: open-toe route marks, gap ghost, quick step." + }, + { + "id": "EQ-005", + "name": "Leadweight Belt", + "fit": "garb; front/center", + "class": "B", + "effect": "First pull on wearer pulls the neighbor ahead instead when legal.", + "tradeoff": "Illegal transfer Hinders both units.", + "production": "I/O/V/S: hanging weight, forked pull cue, buckle strain." + }, + { + "id": "EQ-006", + "name": "Rearhook Cloak", + "fit": "garb; rear", + "class": "B", + "effect": "First enemy entering allied rear is pulled one position forward after acting.", + "tradeoff": "Wearer must remain rearmost; movement disables hook until next basic.", + "production": "I/O/V/S: hooked hem, return arrow, cloth catch." + }, + { + "id": "EQ-007", + "name": "Pivot Anklet", + "fit": "charm; any", + "class": "B", + "effect": "After wearer swaps, next basic targets the unit opposite the swap direction.", + "tradeoff": "No legal opposite target causes a fizzle without resource gain.", + "production": "I/V/S: compass anklet, pivot reticle, metal tick." + }, + { + "id": "EQ-008", + "name": "Stillroad Wrap", + "fit": "garb; any", + "class": "B", + "effect": "Two cadences without movement grant immunity to next forced step.", + "tradeoff": "Moving voluntarily clears the stored immunity.", + "production": "I/O/V/S: wrapped calves, two-bead root cue, cloth tighten." + }, + { + "id": "EQ-009", + "name": "Rescue Loop", + "fit": "kit; support", + "class": "B", + "effect": "First heal on a foremost ally also pulls that ally one position rearward.", + "tradeoff": "Heal resolves weaker if pull is illegal.", + "production": "I/O/V/S: rope loop, heal-arrow cue, soft rope slide." + }, + { + "id": "EQ-010", + "name": "Forward Claim", + "fit": "charm; any", + "class": "B", + "effect": "First time wearer becomes foremost, mark current foremost enemy.", + "tradeoff": "Mark ends if wearer moves rearward.", + "production": "I/V/S: pennant clasp, paired front markers, flag flick." + }, + { + "id": "EQ-011", + "name": "Neighbor's Buckle", + "fit": "garb; any", + "class": "B", + "effect": "When wearer receives Guard, give one Guard token to neighbor behind.", + "tradeoff": "Wearer cannot receive Guard from that neighbor that cadence.", + "production": "I/O/V/S: twin buckle, rear handoff cue, clasp click." + }, + { + "id": "EQ-012", + "name": "Open-Line Cord", + "fit": "charm; any", + "class": "B", + "effect": "With no neighbor ahead, basics gain reach +1.", + "tradeoff": "Gaining a front neighbor immediately ends any reserved long target.", + "production": "I/V/S: loose cord, reach ruler, cord pluck." + }, + { + "id": "EQ-013", + "name": "Crossstep Token", + "fit": "charm; any", + "class": "B", + "effect": "First targeted enemy movement grants wearer one legal step after its action.", + "tradeoff": "Skipping the step delays wearer's next action.", + "production": "I/V/S: crossed feet token, follow cue, two-step tap." + }, + { + "id": "EQ-014", + "name": "Quiet Rearplate", + "fit": "guard; rear", + "class": "B", + "effect": "While rearmost, first area hit is converted to a direct hit.", + "tradeoff": "Direct hit may now trigger single-target enemy riders.", + "production": "I/O/V/S: narrow backplate, area-to-point cue, muted clang." + }, + { + "id": "EQ-015", + "name": "Relay Spur", + "fit": "garb; reorder", + "class": "B", + "effect": "A swap initiated by wearer refreshes the swapped ally's position trigger.", + "tradeoff": "Same ally cannot be chosen twice consecutively.", + "production": "I/O/V/S: forked spur, reset loop, bright heel click." + }, + { + "id": "EQ-016", + "name": "Empty-Space Bell", + "fit": "charm; any", + "class": "B", + "effect": "A vacant neighbor position makes wearer's next item trigger occur before basic.", + "tradeoff": "If vacancy collapses first, item goes on short cooldown unused.", + "production": "I/V/S: hollow bell, vacancy square, small cutoff chime." + }, + { + "id": "EQ-017", + "name": "Bracehook Cuff", + "fit": "guard; front/center", + "class": "B", + "effect": "When neighbor is pulled, wearer may share the pull as a swap.", + "tradeoff": "Both become Hindered after shared movement.", + "production": "I/O/V/S: hooked cuff, split arrow, leather strain." + }, + { + "id": "EQ-018", + "name": "Longway Ribbon", + "fit": "garb; any", + "class": "B", + "effect": "Traversing three unique positions refreshes one movement item.", + "tradeoff": "Returning to a repeated position resets progress.", + "production": "I/O/V/S: three-knot ribbon, footprint track, flutter count." + }, + { + "id": "EQ-019", + "name": "Settle Stone", + "fit": "charm; any", + "class": "B", + "effect": "After involuntary movement, wearer keeps reserved target if still reachable.", + "tradeoff": "Retarget is forbidden; illegal target fizzles normally.", + "production": "I/V/S: flat stone, solid target tether, dull knock." + }, + { + "id": "EQ-020", + "name": "Linekeeper Tab", + "fit": "kit; support", + "class": "B", + "effect": "Once per battle, prevent an allied swap that would expose lowest-vitality unit.", + "tradeoff": "Prevention spends wearer's next item opportunity.", + "production": "I/O/V/S: red tally tab, blocked swap cue, stamp click." + }, + { + "id": "EQ-021", + "name": "Threatglass Lens", + "fit": "charm; any", + "class": "B", + "effect": "First basic targets enemy with longest shown wind-up instead of default.", + "tradeoff": "If no wind-up exists, wearer waits one tick before defaulting.", + "production": "I/O/V/S: clear lens, clock reticle, glass focus." + }, + { + "id": "EQ-022", + "name": "Frontmark Chalk", + "fit": "kit; any", + "class": "B", + "effect": "Basic on foremost enemy Marks it for wearer's neighbor behind.", + "tradeoff": "Wearer cannot benefit from that Mark.", + "production": "I/V/S: chalk wedge, neighbor eye cue, chalk stroke." + }, + { + "id": "EQ-023", + "name": "Rearcall Whistle", + "fit": "kit; reach 2+", + "class": "B", + "effect": "First legal attack selects rearmost enemy and reveals intervening screens.", + "tradeoff": "Attack deals no status on that use.", + "production": "I/O/V/S: flat whistle, rear line cue, captioned chirp." + }, + { + "id": "EQ-024", + "name": "Mercy Dial", + "fit": "charm; restore", + "class": "B", + "effect": "Healing prefers ally whose next incoming hit is earliest, not lowest vitality.", + "tradeoff": "Unforecast damage is ignored by the dial.", + "production": "I/V/S: rotating cross dial, timeline reticle, soft click." + }, + { + "id": "EQ-025", + "name": "Split-Choice Coin", + "fit": "charm; any", + "class": "B", + "effect": "On exact target-score tie, choose rearmost rather than random tie rule.", + "tradeoff": "After tie resolves, wearer becomes Exposed one tick.", + "production": "I/V/S: split coin, rear tie arrow, coin flip." + }, + { + "id": "EQ-026", + "name": "Summon Pricker", + "fit": "armament; any", + "class": "B", + "effect": "Basics prefer enemy footprints with independent actions.", + "tradeoff": "Against no footprint, basic recovery is one tick longer.", + "production": "I/O/V/S: short pricker, footprint reticle, dry prick." + }, + { + "id": "EQ-027", + "name": "Woundreader Tape", + "fit": "kit; pressure", + "class": "B", + "effect": "First basic targets enemy most recently effectively healed.", + "tradeoff": "Target outside reach causes default with no item benefit.", + "production": "I/O/V/S: marked tape, heal-history cue, tape pull." + }, + { + "id": "EQ-028", + "name": "Guard-Seam Pick", + "fit": "armament; any", + "class": "B", + "effect": "Basic prefers target currently protecting a neighbor.", + "tradeoff": "Damage cannot defeat the protector on that item-triggered hit.", + "production": "I/O/V/S: seam pick, guard-link reticle, metal pry." + }, + { + "id": "EQ-029", + "name": "Fastest-Shadow Ink", + "fit": "charm; impair", + "class": "B", + "effect": "Debuffs prefer enemy with shortest next-action time.", + "tradeoff": "Applied duration is one tick shorter.", + "production": "I/V/S: ink drop, short clock cue, quick brush." + }, + { + "id": "EQ-030", + "name": "Last-Target Knot", + "fit": "charm; any", + "class": "B", + "effect": "If prior target dies, next action follows its nearest living neighbor.", + "tradeoff": "If both neighbors equidistant, action fizzles.", + "production": "I/V/S: linked knot, neighbor branch cue, string snap." + }, + { + "id": "EQ-031", + "name": "Bodyguard Tag", + "fit": "kit; support", + "class": "B", + "effect": "Choose one neighbor in Prepare; enable actions prefer that unit while below half vitality.", + "tradeoff": "Other allies receive weaker enable duration.", + "production": "I/O/V/S: name-free tag, chosen outline, buckle tap." + }, + { + "id": "EQ-032", + "name": "Unmasking Powder", + "fit": "kit; line reach", + "class": "B", + "effect": "First hit on untargetable-window enemy becomes a reveal instead of damage.", + "tradeoff": "Powder is spent for battle even if reveal ends same tick.", + "production": "I/V/S: powder cone, open-eye cloud, soft burst." + }, + { + "id": "EQ-033", + "name": "Counterface Mirror", + "fit": "guard; front", + "class": "B", + "effect": "First forced-target effect aimed at wearer is reflected as Mark on source.", + "tradeoff": "Wearer remains the legal target for that action.", + "production": "I/O/V/S: small mirror guard, return-eye cue, glass ping." + }, + { + "id": "EQ-034", + "name": "Lowwater Gauge", + "fit": "charm; any", + "class": "B", + "effect": "At action ready, target lowest current local-resource enemy if legal.", + "tradeoff": "Enemy resource type is revealed to wearer only after first gain.", + "production": "I/V/S: shallow gauge, meter reticle, liquid tick." + }, + { + "id": "EQ-035", + "name": "Open-Flank String", + "fit": "armament; reach 2+", + "class": "B", + "effect": "Attacks prefer enemy with no living neighbor ahead.", + "tradeoff": "A new front neighbor invalidates reserve; action retargets foremost.", + "production": "I/O/V/S: fork string, empty-front cue, twang." + }, + { + "id": "EQ-036", + "name": "Twin Reticle", + "fit": "charm; area", + "class": "B", + "effect": "Area action centers between two adjacent legal targets rather than foremost.", + "tradeoff": "Single-target state prevents item trigger.", + "production": "I/V/S: paired circles, midpoint cue, double click." + }, + { + "id": "EQ-037", + "name": "Interrupt Ledger", + "fit": "kit; control", + "class": "B", + "effect": "After any ally interrupts, wearer targets that interrupted enemy next.", + "tradeoff": "If unreachable, wearer skips one basic rather than defaulting.", + "production": "I/O/V/S: slim ledger, interrupt tether, page tick." + }, + { + "id": "EQ-038", + "name": "Oldest-Harm Compass", + "fit": "charm; restore", + "class": "B", + "effect": "Cleanse targets ally with oldest active hindrance.", + "tradeoff": "Newer action-blocking hindrance is not prioritized.", + "production": "I/V/S: aged compass, duration rings, slow click." + }, + { + "id": "EQ-039", + "name": "Collapse Sight", + "fit": "armament; any", + "class": "B", + "effect": "Reserved target follows one deterministic enemy collapse.", + "tradeoff": "Second collapse before resolution causes fizzle.", + "production": "I/O/V/S: sliding sight, one-step tether, rail slide." + }, + { + "id": "EQ-040", + "name": "Choicebreaker Pin", + "fit": "charm; any", + "class": "B", + "effect": "First action with two equally legal target families alternates from previewed default.", + "tradeoff": "Target receives no critical effect.", + "production": "I/V/S: half-turn pin, alternate reticle, pin turn." + }, + { + "id": "EQ-041", + "name": "Neighborwall", + "fit": "guard; front", + "class": "B", + "effect": "First direct hit on neighbor behind is intercepted.", + "tradeoff": "Wearer becomes Exposed until its next basic.", + "production": "I/O/V/S: half-wall shield, rear block cue, broad clang." + }, + { + "id": "EQ-042", + "name": "Porous Buckler", + "fit": "guard; any", + "class": "B", + "effect": "Area damage to wearer is shared with both neighbors.", + "tradeoff": "Empty neighbor share returns to wearer as Hindered.", + "production": "I/O/V/S: perforated buckler, three-way split, airy clang." + }, + { + "id": "EQ-043", + "name": "Guard Siphon Ring", + "fit": "charm; any", + "class": "B", + "effect": "On Guard expiry, transfer half remaining Guard to lowest-Guard neighbor.", + "tradeoff": "Wearer cannot refresh Guard that cadence.", + "production": "I/V/S: drain ring, expiry arrow, low chime." + }, + { + "id": "EQ-044", + "name": "Exposed Standard", + "fit": "kit; front", + "class": "B", + "effect": "While Exposed, enemies prefer wearer and allies behind gain projectile screen.", + "tradeoff": "Screen ends immediately when Exposed clears.", + "production": "I/O/V/S: open pennant, threat flare, flag crack." + }, + { + "id": "EQ-045", + "name": "Second Blow Plate", + "fit": "guard; any", + "class": "B", + "effect": "Ignores the rider effect of the second hit from same enemy.", + "tradeoff": "The hit's base damage remains and count resets on target change.", + "production": "I/O/V/S: double-dent plate, two-hit pip, muted second clang." + }, + { + "id": "EQ-046", + "name": "Mender's Guardrail", + "fit": "guard; support", + "class": "B", + "effect": "Effective healing grants recipient protection from next push.", + "tradeoff": "Healing wearer never grants this protection.", + "production": "I/O/V/S: rail bracer, heal-to-root cue, latch sound." + }, + { + "id": "EQ-047", + "name": "Brittle Pavise", + "fit": "guard; front", + "class": "B", + "effect": "Blocks all first-cadence projectiles crossing wearer.", + "tradeoff": "Shatters afterward and applies Hindered to wearer.", + "production": "I/O/V/S: tall cracked shield, break cue, layered impacts." + }, + { + "id": "EQ-048", + "name": "Rearward Aegis", + "fit": "guard; rear", + "class": "B", + "effect": "Protects neighbor ahead from attacks originating behind allied line.", + "tradeoff": "Gives no protection against normal front-origin attacks.", + "production": "I/O/V/S: backward shield, rear-origin arrow, reversed clang." + }, + { + "id": "EQ-049", + "name": "Borrowed Cover", + "fit": "charm; any", + "class": "B", + "effect": "When wearer steps behind a Guarded ally, copies one Guard token.", + "tradeoff": "Copied token expires on next movement.", + "production": "I/V/S: overlapping plates icon, step-copy cue, small scrape." + }, + { + "id": "EQ-050", + "name": "Strike-Open Helm", + "fit": "guard; pressure", + "class": "B", + "effect": "Becoming Exposed advances wearer's next basic.", + "tradeoff": "Exposed cannot be cleansed before that basic.", + "production": "I/O/V/S: split visor, speed crack cue, visor snap." + }, + { + "id": "EQ-051", + "name": "Quiet Interceptor", + "fit": "guard; any", + "class": "B", + "effect": "First intercepted hit generates no enemy on-hit resource.", + "tradeoff": "Wearer's own on-hit resource also does not trigger.", + "production": "I/O/V/S: padded guard, crossed resource cue, soft thud." + }, + { + "id": "EQ-052", + "name": "Heatcatch Mantle", + "fit": "garb; any", + "class": "B", + "effect": "First area burst is stored and released after wearer moves.", + "tradeoff": "If wearer cannot move in two cadences, burst resolves on wearer.", + "production": "I/O/V/S: ember-lined mantle, stored flame cue, cloth hiss." + }, + { + "id": "EQ-053", + "name": "Empty Guard Cage", + "fit": "guard; any", + "class": "B", + "effect": "With zero Guard, incoming Guard strip becomes one Guard instead.", + "tradeoff": "Cannot receive normal Guard same cadence.", + "production": "I/O/V/S: open cage bracer, inversion cue, metal catch." + }, + { + "id": "EQ-054", + "name": "Three-Hit Sconce", + "fit": "charm; front", + "class": "B", + "effect": "Third direct hit lights a screen against next spell.", + "tradeoff": "Moving resets hit count.", + "production": "I/O/V/S: three-wick sconce, count/flame cue, three taps." + }, + { + "id": "EQ-055", + "name": "Adjacent Oathplate", + "fit": "guard; any", + "class": "B", + "effect": "Choose ahead or behind in Prepare; protection effects only flow that direction but last longer.", + "tradeoff": "Other neighbor cannot be protected by wearer.", + "production": "I/O/V/S: asymmetrical plate, chosen arrow, locking clasp." + }, + { + "id": "EQ-056", + "name": "Pushback Frame", + "fit": "guard; front", + "class": "B", + "effect": "First blocked push is reflected onto source if legal.", + "tradeoff": "Reflection consumes all Guard on wearer.", + "production": "I/O/V/S: spring frame, return chevron, compressed clang." + }, + { + "id": "EQ-057", + "name": "Mercy Screen", + "fit": "guard; support", + "class": "B", + "effect": "Projectile that would defeat an ally instead leaves it at survival floor and breaks screen.", + "tradeoff": "Protected ally becomes untargetable to healing for one tick.", + "production": "I/O/V/S: translucent screen, survival line, crystal break." + }, + { + "id": "EQ-058", + "name": "Lowguard Apron", + "fit": "garb; center", + "class": "B", + "effect": "Neighbor ahead below half vitality receives wearer's first positive Guard gain.", + "tradeoff": "Wearer receives none of that gain.", + "production": "I/O/V/S: plated apron, forward handoff, buckle clink." + }, + { + "id": "EQ-059", + "name": "Counterseal Shield", + "fit": "guard; any", + "class": "B", + "effect": "First Mark applied to wearer becomes Guard and removes Mark.", + "tradeoff": "Next Mark lasts one tick longer.", + "production": "I/O/V/S: seal shield, mark inversion, wax crack." + }, + { + "id": "EQ-060", + "name": "Last Neighbor Plate", + "fit": "guard; any", + "class": "B", + "effect": "With exactly one living neighbor, both share first direct hit.", + "tradeoff": "Shared hit cannot be intercepted again.", + "production": "I/O/V/S: twin plate halves, shared-hit cue, paired clang." + }, + { + "id": "EQ-061", + "name": "Early Bell", + "fit": "charm; any", + "class": "B", + "effect": "First basic resolves one tick earlier.", + "tradeoff": "Second basic resolves one tick later.", + "production": "I/V/S: two-position bell clock, early/late chimes." + }, + { + "id": "EQ-062", + "name": "Held Breath Mask", + "fit": "garb; slow", + "class": "B", + "effect": "First wind-up may survive one interrupt as a delay.", + "tradeoff": "Delayed action loses status riders.", + "production": "I/O/V/S: slotted mask, held clock cue, inhale/cutoff." + }, + { + "id": "EQ-063", + "name": "Recovery Shears", + "fit": "kit; any", + "class": "B", + "effect": "Defeating a target removes current recovery time.", + "tradeoff": "If target survives, recovery doubles.", + "production": "I/O/V/S: clock shears, cut/wager cue, snip." + }, + { + "id": "EQ-064", + "name": "Afterbeat Ring", + "fit": "charm; tempo", + "class": "B", + "effect": "Acting immediately after a neighbor grants one local resource.", + "tradeoff": "Acting before both neighbors Hinders wearer.", + "production": "I/V/S: trailing ring, neighbor beat cue, delayed ping." + }, + { + "id": "EQ-065", + "name": "Slow Fuse", + "fit": "kit; area", + "class": "B", + "effect": "Equipment burst waits until target's next action, then follows it.", + "tradeoff": "Target defeat before acting cancels burst.", + "production": "I/O/V/S: long fuse vial, target clock, fuse hiss." + }, + { + "id": "EQ-066", + "name": "Quickdraw Thimble", + "fit": "charm; projectile", + "class": "B", + "effect": "First projectile has no wind-up.", + "tradeoff": "It cannot use Marks or critical riders.", + "production": "I/O/V/S: draw thimble, crossed wind-up cue, snap shot." + }, + { + "id": "EQ-067", + "name": "Noon Dial", + "fit": "charm; any", + "class": "B", + "effect": "At exact battle midpoint forecast, refresh oldest item cooldown.", + "tradeoff": "Before midpoint, item cooldowns recover one tick slower.", + "production": "I/V/S: split sun dial, midpoint flare, clock chime." + }, + { + "id": "EQ-068", + "name": "Staggered Buckle", + "fit": "garb; any", + "class": "B", + "effect": "Receiving action advance stores it; release after next neighbor acts.", + "tradeoff": "Stored advance expires if wearer moves.", + "production": "I/O/V/S: offset buckle, stored arrow, click-release." + }, + { + "id": "EQ-069", + "name": "Patience Quill", + "fit": "kit; control", + "class": "B", + "effect": "Each cadence without acting lengthens next hindrance by one tick, capped at two.", + "tradeoff": "Any fizzle clears stored length.", + "production": "I/O/V/S: notched quill, waiting pips, scratch count." + }, + { + "id": "EQ-070", + "name": "Interrupt Candle", + "fit": "charm; any", + "class": "B", + "effect": "After wearer is interrupted, its next item trigger occurs immediately.", + "tradeoff": "Trigger effect is reduced to non-damaging utility.", + "production": "I/O/V/S: cut-wick candle, interrupt spark, wick sputter." + }, + { + "id": "EQ-071", + "name": "Neighbor Clock", + "fit": "charm; support", + "class": "B", + "effect": "Choose a neighbor; wearer basic cadence becomes opposite band of neighbor.", + "tradeoff": "Choice locks for battle.", + "production": "I/V/S: linked clocks, fast/slow shapes, alternating ticks." + }, + { + "id": "EQ-072", + "name": "Third-Cycle Cog", + "fit": "kit; construct", + "class": "B", + "effect": "Every third device action occurs twice at different legal targets.", + "tradeoff": "Device pauses on following cadence.", + "production": "I/O/V/S: triple cog, double-action cue, ratchet pair." + }, + { + "id": "EQ-073", + "name": "Dawn Recovery Strap", + "fit": "garb; any", + "class": "B", + "effect": "First action recovery ends when first enemy major wind-up begins.", + "tradeoff": "If no major wind-up, recovery is one tick longer.", + "production": "I/O/V/S: sunrise strap, recovery-to-major tether, buckle slide." + }, + { + "id": "EQ-074", + "name": "Late Cleanse Vial", + "fit": "kit; restore", + "class": "B", + "effect": "Cleanse after status midpoint also advances target's next basic.", + "tradeoff": "Early cleanse delays that basic.", + "production": "I/O/V/S: half-mark vial, early/late arrows, glass flip." + }, + { + "id": "EQ-075", + "name": "Unfinished Metronome", + "fit": "charm; any", + "class": "B", + "effect": "A fizzle makes next legal basic fast instead of refunding time.", + "tradeoff": "No resource is refunded on fizzle.", + "production": "I/V/S: broken metronome, fizzle-to-speed cue, skipped beat." + }, + { + "id": "EQ-076", + "name": "Twin Windup Thread", + "fit": "charm; linked", + "class": "B", + "effect": "Linked neighbors begin their next wind-ups together.", + "tradeoff": "Faster action waits for slower; link breaks after use.", + "production": "I/V/S: twin clocks on thread, tie cue, synchronized pull." + }, + { + "id": "EQ-077", + "name": "Rest-Step Sole", + "fit": "garb; reorder", + "class": "B", + "effect": "Voluntary step during recovery ends recovery.", + "tradeoff": "Next wind-up is one tick longer.", + "production": "I/O/V/S: pause-mark sole, step-cut cue, heel stop." + }, + { + "id": "EQ-078", + "name": "Bosswatch Lens", + "fit": "charm; any", + "class": "B", + "effect": "First boss major telegraph pauses wearer's item cooldowns and readies inspect response.", + "tradeoff": "No cooldown progress occurs during telegraph.", + "production": "I/O/V/S: large clock lens, boss ring cue, deep focus tone." + }, + { + "id": "EQ-079", + "name": "Short Memory Spring", + "fit": "kit; any", + "class": "B", + "effect": "Repeating the same action tag shortens wind-up.", + "tradeoff": "Third repeat locks target to foremost for one action.", + "production": "I/O/V/S: compressed spring, repeat counter, spring ticks." + }, + { + "id": "EQ-080", + "name": "Long Memory Spring", + "fit": "kit; any", + "class": "B", + "effect": "Alternating action tags shortens recovery.", + "tradeoff": "Repeating a tag resets benefit and Hinders wearer.", + "production": "I/O/V/S: stretched spring, alternate counter, elastic twang." + }, + { + "id": "EQ-081", + "name": "Jointed Pike", + "fit": "armament; reach 1", + "class": "B", + "effect": "Every second basic gains reach 2.", + "tradeoff": "Extended basic cannot hit foremost enemy.", + "production": "I/O/V/S: folding pike, joint ruler, metal extend." + }, + { + "id": "EQ-082", + "name": "Nearstring Bow", + "fit": "armament; projectile", + "class": "B", + "effect": "May target through only one unit but ignores projectile screens at reach 1.", + "tradeoff": "Cannot select rearmost while any nearer enemy lives.", + "production": "I/O/V/S: short recurved bow, near arc cue, blunt twang." + }, + { + "id": "EQ-083", + "name": "Far Lantern", + "fit": "charm; spell", + "class": "B", + "effect": "Spell reach becomes line while wearer is rearmost.", + "tradeoff": "Moving forward clears local resource.", + "production": "I/O/V/S: long-beam lamp, line ruler, glass hum." + }, + { + "id": "EQ-084", + "name": "Crook of Return", + "fit": "armament; reach 2", + "class": "B", + "effect": "On unreachable reserved target, pull nearest legal enemy instead of fizzle.", + "tradeoff": "Pull deals no direct effect.", + "production": "I/O/V/S: return crook, fallback hook cue, haft sweep." + }, + { + "id": "EQ-085", + "name": "Neighbor Needle", + "fit": "armament; any", + "class": "B", + "effect": "Basic may target an enemy opposite wearer's neighbor rather than self.", + "tradeoff": "Chosen neighbor becomes Exposed during wind-up.", + "production": "I/O/V/S: side-eyed needle, neighbor line cue, light stab." + }, + { + "id": "EQ-086", + "name": "Throughguard Bolt", + "fit": "armament; projectile", + "class": "B", + "effect": "First shot passes one protector to hit protected unit.", + "tradeoff": "Protector gains Guard afterward.", + "production": "I/O/V/S: narrow bolt rig, bypass cue, piercing whistle." + }, + { + "id": "EQ-087", + "name": "Mercy Reach Staff", + "fit": "armament; restore", + "class": "B", + "effect": "Allied reach extends by one for targets below quarter vitality.", + "tradeoff": "Healing above that threshold has reach 1.", + "production": "I/O/V/S: forked staff, threshold ruler, warm pulse." + }, + { + "id": "EQ-088", + "name": "Centerline Sextant", + "fit": "charm; any", + "class": "B", + "effect": "From center band, actions may choose either line end at normal reach.", + "tradeoff": "Cannot target center-band units with item benefit.", + "production": "I/O/V/S: two-ended sextant, endpoint cue, swivel click." + }, + { + "id": "EQ-089", + "name": "Repeating Sling", + "fit": "armament; projectile", + "class": "B", + "effect": "Hit rearmost target twice if no enemy lies between source and target.", + "tradeoff": "Any intervening footprint cancels second hit.", + "production": "I/O/V/S: twin-pouch sling, clear-path cue, double snap." + }, + { + "id": "EQ-090", + "name": "Close Quarters Seal", + "fit": "charm; spell", + "class": "B", + "effect": "Spell against adjacent enemy becomes interrupt-capable.", + "tradeoff": "Spell loses area shape.", + "production": "I/V/S: closed circle seal, adjacency flash, compact crack." + }, + { + "id": "EQ-091", + "name": "Longguard Hook", + "fit": "guard; front", + "class": "B", + "effect": "Interception reach extends through one allied unit.", + "tradeoff": "Intervening ally becomes Hindered after interception.", + "production": "I/O/V/S: long hooked shield, two-step block cue, dragging clang." + }, + { + "id": "EQ-092", + "name": "Rear Threader", + "fit": "armament; line", + "class": "B", + "effect": "First hit on foremost threads next basic to rearmost.", + "tradeoff": "Thread breaks if wearer changes position.", + "production": "I/O/V/S: eye-ended blade, front-rear tether, string zing." + }, + { + "id": "EQ-093", + "name": "Grounding Spike", + "fit": "kit; any", + "class": "B", + "effect": "Place at one enemy index; airborne unit crossing index becomes targetable.", + "tradeoff": "Spike blocks allied forced movement across opposite index.", + "production": "I/O/V/S: ground spike, vertical line cue, stake impact." + }, + { + "id": "EQ-094", + "name": "Wide-Mouth Focus", + "fit": "armament; area", + "class": "B", + "effect": "Area shape expands one neighbor when centered on foremost.", + "tradeoff": "Center loses direct damage/status.", + "production": "I/O/V/S: flared focus, hollow area cue, wide pulse." + }, + { + "id": "EQ-095", + "name": "Backbite Knife", + "fit": "armament; reach 1", + "class": "B", + "effect": "If enemy enters allied rear, reach flips to target rear intruder anywhere.", + "tradeoff": "Normal forward reach is lost until intruder leaves.", + "production": "I/O/V/S: reversed knife, rear lock cue, backhand slice." + }, + { + "id": "EQ-096", + "name": "Span Tally", + "fit": "charm; any", + "class": "B", + "effect": "Each different reach used grants one Focus; at three, next action gains line reach.", + "tradeoff": "Repeating reach resets tally.", + "production": "I/V/S: three-rung tally, ruler pips, count clicks." + }, + { + "id": "EQ-097", + "name": "Relay Arrow", + "fit": "armament; projectile", + "class": "B", + "effect": "Projectile can bounce from allied construct to legal enemy behind it.", + "tradeoff": "Construct loses its next action.", + "production": "I/O/V/S: fork arrow, device bounce cue, wood-metal ping." + }, + { + "id": "EQ-098", + "name": "Rootborer Awl", + "fit": "armament; any", + "class": "B", + "effect": "Ignores one footprint-based reach blocker.", + "tradeoff": "Cannot apply movement or Mark on that hit.", + "production": "I/O/V/S: spiral awl, hollow footprint cue, drilling scrape." + }, + { + "id": "EQ-099", + "name": "Farside Cup", + "fit": "kit; enable", + "class": "B", + "effect": "Resource share may target the farthest ally in same band.", + "tradeoff": "Recipient's nearest neighbor cannot receive resource that cadence.", + "production": "I/O/V/S: handled cup, far handoff line, cup tap." + }, + { + "id": "EQ-100", + "name": "Reachbreaker Chain", + "fit": "armament; control", + "class": "B", + "effect": "Hit reduces target reach to 1 for its next basic.", + "tradeoff": "Wearer's next basic also has reach 1.", + "production": "I/O/V/S: short chain, clipped ruler cue, chain drop." + }, + { + "id": "EQ-101", + "name": "Switchblade Shoe", + "fit": "garb; any", + "class": "B", + "effect": "After basic, swap with neighbor whose action is farthest away.", + "tradeoff": "Both lose positive movement tags.", + "production": "I/O/V/S: blade-heel shoe, clocked swap cue, slide." + }, + { + "id": "EQ-102", + "name": "Pushstep Bracer", + "fit": "guard; front", + "class": "B", + "effect": "Successful block steps wearer and source one position forward on their lines.", + "tradeoff": "Illegal step removes Guard.", + "production": "I/O/V/S: forward bracer, paired chevrons, marching clang." + }, + { + "id": "EQ-103", + "name": "Pullcord Cape", + "fit": "garb; support", + "class": "B", + "effect": "First ally below quarter vitality is pulled one position toward wearer.", + "tradeoff": "Wearer is rooted until ally completes next action.", + "production": "I/O/V/S: corded cape, rescue tether, fabric pull." + }, + { + "id": "EQ-104", + "name": "Three-Position Boots", + "fit": "garb; any", + "class": "B", + "effect": "Visiting front, center, and rear readies an immediate basic.", + "tradeoff": "Repeat band clears progress.", + "production": "I/O/V/S: three-color-independent soles, band track, triple heel." + }, + { + "id": "EQ-105", + "name": "Retreating Spear", + "fit": "armament; front", + "class": "B", + "effect": "After striking, step rearward and leave a one-tick threat marker at old position.", + "tradeoff": "Marker draws attacks to replacement ally.", + "production": "I/O/V/S: long spear, fading threat square, backstep scrape." + }, + { + "id": "EQ-106", + "name": "Advancing Lantern", + "fit": "armament; rear", + "class": "B", + "effect": "Each completed cast steps wearer one position forward and strengthens next reach.", + "tradeoff": "At foremost, cast becomes Hindered.", + "production": "I/O/V/S: walking lantern, forward pips, lamp swing." + }, + { + "id": "EQ-107", + "name": "Side-by-Side Ring", + "fit": "charm; any", + "class": "B", + "effect": "Adjacent same-role units swap automatically when one becomes Exposed.", + "tradeoff": "Both item cooldowns pause one tick.", + "production": "I/V/S: paired ring, exposed swap cue, double click." + }, + { + "id": "EQ-108", + "name": "Collapse Brake", + "fit": "kit; support", + "class": "B", + "effect": "Delay one ally collapse until current wind-ups finish.", + "tradeoff": "Delayed units cannot receive movement effects.", + "production": "I/O/V/S: wedge brake, pending gap cue, wheel stop." + }, + { + "id": "EQ-109", + "name": "Enemy Towline", + "fit": "kit; control", + "class": "B", + "effect": "First enemy pull also drags its neighbor behind.", + "tradeoff": "Both targets gain Guard after movement.", + "production": "I/O/V/S: twin hook line, double pull cue, rope strain." + }, + { + "id": "EQ-110", + "name": "Empty-Rank Cart", + "fit": "kit; construct", + "class": "B", + "effect": "Device moves into first vacant allied position after collapse.", + "tradeoff": "Device cannot act on movement cadence.", + "production": "I/O/V/S: small cart, gap path cue, wheel clatter." + }, + { + "id": "EQ-111", + "name": "Pursuit Clasp", + "fit": "garb; pressure", + "class": "B", + "effect": "When target is pushed rearward, wearer steps forward if that preserves reach.", + "tradeoff": "Step makes wearer Exposed.", + "production": "I/O/V/S: arrow clasp, follow tether, clasp snap." + }, + { + "id": "EQ-112", + "name": "Reverse Compass", + "fit": "charm; any", + "class": "B", + "effect": "First voluntary movement resolves opposite declared direction.", + "tradeoff": "Opposite destination must be legal or action cancels.", + "production": "I/V/S: reverse needle, preview ghost, wrong-way click." + }, + { + "id": "EQ-113", + "name": "Ferry Pole", + "fit": "armament; support", + "class": "B", + "effect": "Basic may swap two neighbors ahead instead of dealing damage.", + "tradeoff": "Wearer loses next basic opportunity.", + "production": "I/O/V/S: long pole, neighbor swap cue, pole plant." + }, + { + "id": "EQ-114", + "name": "Springboard Guard", + "fit": "guard; front", + "class": "B", + "effect": "Blocked push launches neighbor behind one position rearward safely.", + "tradeoff": "Neighbor's next action is delayed.", + "production": "I/O/V/S: angled guard, spring arrow, boing-clang." + }, + { + "id": "EQ-115", + "name": "Homeward Thread", + "fit": "charm; any", + "class": "B", + "effect": "Mark starting position; once per battle return there after action if vacant relation exists.", + "tradeoff": "Return clears all local resource.", + "production": "I/V/S: spool token, home ghost cue, rewinding thread." + }, + { + "id": "EQ-116", + "name": "Escort Bridle", + "fit": "kit; support", + "class": "B", + "effect": "Wearer movement carries lowest-vitality neighbor one step in same direction.", + "tradeoff": "Carried ally loses its reserved target.", + "production": "I/O/V/S: linked bridle, paired step cue, leather tug." + }, + { + "id": "EQ-117", + "name": "Ram's Courtesy", + "fit": "guard; front", + "class": "B", + "effect": "A pushed enemy swaps with its neighbor instead of compressing both.", + "tradeoff": "Swapped neighbor gains action advance.", + "production": "I/O/V/S: curled guard, enemy swap cue, horn knock." + }, + { + "id": "EQ-118", + "name": "Rear Arrival Mat", + "fit": "kit; rear", + "class": "B", + "effect": "First hostile rear arrival lands one position forward of intended.", + "tradeoff": "Wearer becomes its forced target for one action.", + "production": "I/O/V/S: marked mat, shifted arrival cue, fabric thump." + }, + { + "id": "EQ-119", + "name": "Step Tax Token", + "fit": "charm; impair", + "class": "B", + "effect": "Enemy movement through wearer's indexed opposite position gains Hindered.", + "tradeoff": "Allied movement through same index also Hinders.", + "production": "I/V/S: toll token, indexed footprint, coin stamp." + }, + { + "id": "EQ-120", + "name": "Linefold Cape", + "fit": "garb; any", + "class": "B", + "effect": "Once per battle swap foremost and rearmost allies after a major telegraph.", + "tradeoff": "Both lose reserved actions and cannot move one cadence.", + "production": "I/O/V/S: two-ended cape, endpoint fold cue, sweeping cloth." + }, + { + "id": "EQ-121", + "name": "Guard-to-Focus Valve", + "fit": "kit; resource", + "class": "B", + "effect": "First excess Guard gain converts to Focus.", + "tradeoff": "Wearer cannot gain Guard next tick.", + "production": "I/O/V/S: two-chamber valve, conversion arrow, valve hiss." + }, + { + "id": "EQ-122", + "name": "Remedy Bottle Rack", + "fit": "kit; restore", + "class": "B", + "effect": "Spending Remedy refreshes oldest healing-item cooldown.", + "tradeoff": "Item heal cannot generate Remedy.", + "production": "I/O/V/S: small rack, remedy-to-clock cue, bottle clink." + }, + { + "id": "EQ-123", + "name": "Parts Reclaimer", + "fit": "kit; construct", + "class": "B", + "effect": "Destroyed allied device returns one Parts to wearer.", + "tradeoff": "Wearer becomes Hindered if device was full duration.", + "production": "I/O/V/S: salvage claw, device-to-part cue, ratchet pull." + }, + { + "id": "EQ-124", + "name": "Verse Cup", + "fit": "charm; tempo", + "class": "B", + "effect": "Spending Verse gives one local resource to slower neighbor.", + "tradeoff": "Wearer loses next Verse gain from that neighbor.", + "production": "I/V/S: notched cup, slow-arrow handoff, cup tone." + }, + { + "id": "EQ-125", + "name": "Edge Scabbard", + "fit": "armament; PF-B02 family", + "class": "B", + "effect": "Unspent Edge at target defeat transfers to next nearest target as Mark.", + "tradeoff": "Marked target gains Guard.", + "production": "I/O/V/S: glowing scabbard, Edge-to-Mark cue, blade ring." + }, + { + "id": "EQ-126", + "name": "Poise Counterweight", + "fit": "armament; PF-B03 family", + "class": "B", + "effect": "Forced movement spends Poise to cancel and preserve target.", + "tradeoff": "All remaining Poise is lost.", + "production": "I/O/V/S: haft weight, Poise shield cue, heavy plant." + }, + { + "id": "EQ-127", + "name": "Momentum Flask", + "fit": "kit; PF-B04 family", + "class": "B", + "effect": "Spending Momentum also refreshes oldest position trigger.", + "tradeoff": "Wearer cannot gain Momentum next cadence.", + "production": "I/O/V/S: rolling flask, footprint refresh, liquid spin." + }, + { + "id": "EQ-128", + "name": "Aim Splitter", + "fit": "armament; PF-B05 family", + "class": "B", + "effect": "Spending Aim on rearmost also Marks foremost.", + "tradeoff": "Shot cannot apply other status.", + "production": "I/O/V/S: twin-notch bow piece, end markers, split twang." + }, + { + "id": "EQ-129", + "name": "Charge Sink", + "fit": "charm; PF-B06 family", + "class": "B", + "effect": "Interrupted Charge moves to item and returns after next basic.", + "tradeoff": "Returned Charge is capped and wearer is Hindered.", + "production": "I/V/S: crystal sink, stored-charge cue, deep hum." + }, + { + "id": "EQ-130", + "name": "Bond Tally", + "fit": "charm; PF-B08 family", + "class": "B", + "effect": "Broken link converts one Bond into Guard for both former partners.", + "tradeoff": "Link cannot be remade one cadence.", + "production": "I/V/S: snapped knot tally, twin Guard cue, string break." + }, + { + "id": "EQ-131", + "name": "Omen Hourglass", + "fit": "charm; PF-B10 family", + "class": "B", + "effect": "Spending Omen pauses target hindrance expiry during its next wind-up.", + "tradeoff": "Target cannot receive another hindrance in that window.", + "production": "I/V/S: dark hourglass, pause ring, sand hush." + }, + { + "id": "EQ-132", + "name": "Supply Crate Key", + "fit": "kit; PF-B12 family", + "class": "B", + "effect": "Spending Supply opens one adjacent item cooldown immediately.", + "tradeoff": "Same item is locked for following cadence.", + "production": "I/O/V/S: crate key, open/lock clock, latch turn." + }, + { + "id": "EQ-133", + "name": "Empty-Meter Drum", + "fit": "charm; any", + "class": "B", + "effect": "Reaching zero local resource advances next basic.", + "tradeoff": "Resource gain before basic cancels advance and Hinders.", + "production": "I/V/S: hollow drum, zero-arrow cue, dry beat." + }, + { + "id": "EQ-134", + "name": "Full-Meter Seal", + "fit": "charm; any", + "class": "B", + "effect": "At full local resource, next enemy cannot steal or drain it.", + "tradeoff": "Wearer cannot spend until after that enemy action.", + "production": "I/V/S: full seal, lock meter cue, wax stamp." + }, + { + "id": "EQ-135", + "name": "Neighbor Loan Note", + "fit": "charm; support", + "class": "B", + "effect": "Once per battle lend one local resource to neighbor with matching token type.", + "tradeoff": "If unspent in one cadence, both lose one token.", + "production": "I/V/S: split note, loan timer, paper flick." + }, + { + "id": "EQ-136", + "name": "Mixed Purse", + "fit": "kit; any", + "class": "B", + "effect": "First three different resource types gained by party create one Supply.", + "tradeoff": "Repeated type before completion resets purse.", + "production": "I/O/V/S: three-pocket purse, type pips, coin-and-token clicks." + }, + { + "id": "EQ-137", + "name": "Resource Brake", + "fit": "guard; any", + "class": "B", + "effect": "Direct hit cannot reduce local resource below one.", + "tradeoff": "Wearer becomes Exposed when brake triggers.", + "production": "I/O/V/S: meter brake plate, floor line cue, hard stop." + }, + { + "id": "EQ-138", + "name": "Overfill Spout", + "fit": "kit; any", + "class": "B", + "effect": "Resource gained at cap pours to legal neighbor using same type.", + "tradeoff": "If none, wearer is Hindered.", + "production": "I/O/V/S: side spout, overflow arrow, pouring chime." + }, + { + "id": "EQ-139", + "name": "Contrary Ledger", + "fit": "charm; any", + "class": "B", + "effect": "Gaining resource from damage taken makes next spend target enemy; from own action makes it target ally when legal.", + "tradeoff": "Wrong-side-only profession actions cannot spend that token.", + "production": "I/V/S: two-column ledger, side arrows, page flip." + }, + { + "id": "EQ-140", + "name": "Last Token Locket", + "fit": "charm; any", + "class": "B", + "effect": "Spending final resource preserves one token until action resolves, enabling its rider.", + "tradeoff": "Preserved token disappears and cannot be refunded.", + "production": "I/V/S: single-token locket, held pip cue, clasp close." + }, + { + "id": "EQ-141", + "name": "Midpoint Cleanser", + "fit": "kit; restore", + "class": "B", + "effect": "Cleanse after status midpoint removes it and grants Guard.", + "tradeoff": "Early cleanse turns status into shorter Hindered.", + "production": "I/O/V/S: half-ring brush, midpoint cue, brush sweep." + }, + { + "id": "EQ-142", + "name": "Mark Relay Pin", + "fit": "charm; any", + "class": "B", + "effect": "Expired Mark jumps to nearest unmarked enemy.", + "tradeoff": "Jumped Mark lasts one tick only.", + "production": "I/V/S: arrow pin, mark hop cue, sharp ping." + }, + { + "id": "EQ-143", + "name": "Hinder Hook", + "fit": "armament; any", + "class": "B", + "effect": "Hitting Hindered target pulls it one position forward.", + "tradeoff": "Pull removes Hindered.", + "production": "I/O/V/S: hooked blade, status-to-pull cue, chainless tug." + }, + { + "id": "EQ-144", + "name": "Expose Thread", + "fit": "charm; any", + "class": "B", + "effect": "When wearer's Guard breaks, Mark the breaker and become Exposed.", + "tradeoff": "Mark ends when Exposed clears.", + "production": "I/V/S: snapped thread, paired tags cue, twang." + }, + { + "id": "EQ-145", + "name": "Clean Slate", + "fit": "kit; any", + "class": "B", + "effect": "First positive and negative tag applied same cadence cancel each other.", + "tradeoff": "Wearer gains no local resource from either.", + "production": "I/O/V/S: blank slate, plus-minus cancel cue, chalk wipe." + }, + { + "id": "EQ-146", + "name": "Long Ill", + "fit": "charm; impair", + "class": "B", + "effect": "Reapplying same hindrance refreshes expiry but not strength.", + "tradeoff": "Target gains one-tick immunity after expiry.", + "production": "I/V/S: long ring, refresh/not-stack cue, low pulse." + }, + { + "id": "EQ-147", + "name": "Short Blessing", + "fit": "charm; enable", + "class": "B", + "effect": "Positive tag lasts one cadence but triggers its on-expiry rider immediately after.", + "tradeoff": "It cannot be extended.", + "production": "I/V/S: clipped halo, quick expiry cue, bright cutoff." + }, + { + "id": "EQ-148", + "name": "Status Prism", + "fit": "charm; any", + "class": "B", + "effect": "First tag on wearer is copied as opposite sign to nearest enemy when legal.", + "tradeoff": "Original tag remains unchanged.", + "production": "I/V/S: two-tone-shape prism, copy arrow, glass split." + }, + { + "id": "EQ-149", + "name": "Root-Cutting Knife", + "fit": "armament; any", + "class": "B", + "effect": "Basic against root source cleanses wearer movement lock.", + "tradeoff": "Basic deals no damage/status.", + "production": "I/O/V/S: pruning knife, root-source tether, clean snip." + }, + { + "id": "EQ-150", + "name": "Silence Clapper", + "fit": "kit; control", + "class": "B", + "effect": "Applying Hindered to sound user also silences its current wind-up.", + "tradeoff": "Hindered duration becomes one tick.", + "production": "I/O/V/S: wrapped clapper, sound-cross cue, muted hit." + }, + { + "id": "EQ-151", + "name": "Guarded Poison Phial", + "fit": "kit; impair", + "class": "B", + "effect": "Hindrance applied while wearer Guarded cannot be cleansed for one tick.", + "tradeoff": "Applying it consumes all wearer Guard.", + "production": "I/O/V/S: caged phial, lock ring, glass clink." + }, + { + "id": "EQ-152", + "name": "Open-Wound Tape", + "fit": "kit; pressure", + "class": "B", + "effect": "Healing-denial tag reveals and Marks its source when target receives attempted heal.", + "tradeoff": "Attempted heal is still denied.", + "production": "I/O/V/S: red-free cross tape, source eye cue, tape rip." + }, + { + "id": "EQ-153", + "name": "Expiry Bell", + "fit": "charm; any", + "class": "B", + "effect": "Oldest tag expiry advances wearer's next action.", + "tradeoff": "Manual cleanse never triggers bell.", + "production": "I/V/S: fading bell ring, expiry arrow, soft chime." + }, + { + "id": "EQ-154", + "name": "Cleanse Mirror", + "fit": "guard; any", + "class": "B", + "effect": "First enemy cleanse also removes wearer's oldest hindrance.", + "tradeoff": "Enemy cleanse still resolves fully.", + "production": "I/O/V/S: mirror plate, paired erase cue, glass wipe." + }, + { + "id": "EQ-155", + "name": "Marked Route Map", + "fit": "kit; reorder", + "class": "B", + "effect": "Stepping toward Marked enemy preserves Mark duration.", + "tradeoff": "Stepping away removes Mark.", + "production": "I/O/V/S: folded map, direction eye cue, paper snap." + }, + { + "id": "EQ-156", + "name": "Status Splitter", + "fit": "armament; area", + "class": "B", + "effect": "Area action applies chosen status to only first and last target.", + "tradeoff": "Middle targets receive no status.", + "production": "I/O/V/S: forked focus, endpoint status cue, split pulse." + }, + { + "id": "EQ-157", + "name": "Two-Cleanse Rule", + "fit": "charm; restore", + "class": "B", + "effect": "Second cleanse on same ally also refreshes one item cooldown.", + "tradeoff": "First cleanse on that ally is delayed one tick.", + "production": "I/V/S: double brush token, two-count cue, paired swish." + }, + { + "id": "EQ-158", + "name": "Contagion Fence", + "fit": "guard; any", + "class": "B", + "effect": "Prevents status spread across wearer between neighbors.", + "tradeoff": "Wearer receives both attempted spread tags at shorter duration.", + "production": "I/O/V/S: slatted fence guard, blocked arrows, wood rattle." + }, + { + "id": "EQ-159", + "name": "Truth Serum Cup", + "fit": "kit; reveal", + "class": "B", + "effect": "Cleansing concealment reveals target's next action category.", + "tradeoff": "Target gains Guard after reveal.", + "production": "I/O/V/S: clear cup, open card cue, glass tap." + }, + { + "id": "EQ-160", + "name": "Lasting Scarab", + "fit": "charm; any", + "class": "B", + "effect": "First hindrance surviving full duration becomes one-battle immunity to that tag.", + "tradeoff": "Immunity also blocks allied beneficial conversion of that tag.", + "production": "I/O/V/S: scarab brooch, completed-ring shield, shell click." + }, + { + "id": "EQ-161", + "name": "Hearthguard Shoulderstrap", + "fit": "guard; PF-B01 family", + "class": "B", + "effect": "Intercepting for neighbor behind also preserves that neighbor's reserved target.", + "tradeoff": "Neighbor cannot move until target resolves.", + "production": "I/O/V/S: broad strap, solid target tether, leather catch." + }, + { + "id": "EQ-162", + "name": "Gatebearer Hinge", + "fit": "guard; PF-A01", + "class": "B", + "effect": "Correct directional intercept swings wearer one position toward attack origin.", + "tradeoff": "Wrong-direction hit strips one Guard.", + "production": "I/O/V/S: shield hinge, swing arrow, heavy hinge." + }, + { + "id": "EQ-163", + "name": "Ramward Cap", + "fit": "guard; PF-A02", + "class": "B", + "effect": "Driving Wall can stop before follow step, leaving wearer foremost.", + "tradeoff": "Stopping early gives pushed enemy action advance.", + "production": "I/O/V/S: blunt shield cap, optional-step cue, padded thud." + }, + { + "id": "EQ-164", + "name": "Edgehand Red Cord", + "fit": "armament; PF-B02 family", + "class": "B", + "effect": "Alternating targets also alternates attack timing fast/slow.", + "tradeoff": "Repeating target locks cadence slow.", + "production": "I/O/V/S: red-free contrast cord, two-clock cue, cord flick." + }, + { + "id": "EQ-165", + "name": "Lastlight Wager Seal", + "fit": "charm; PF-A03", + "class": "B", + "effect": "Final Measure may reserve half Edge and spend half.", + "tradeoff": "Kill refunds nothing; survival Exposed duration is shorter.", + "production": "I/V/S: split wager seal, half-meter cue, coin crack." + }, + { + "id": "EQ-166", + "name": "Turnblade Sideguard", + "fit": "armament; PF-A04", + "class": "B", + "effect": "Return Cut may target an attacker through one intervening enemy.", + "tradeoff": "Counter loses movement riders.", + "production": "I/O/V/S: ring sideguard, counter ruler, parry ring." + }, + { + "id": "EQ-167", + "name": "Longspoke Grip", + "fit": "armament; PF-B03 family", + "class": "B", + "effect": "Building Poise also fixes current indexed position against one collapse.", + "tradeoff": "Fixed position delays normal line closing.", + "production": "I/O/V/S: rooted grip, position pin cue, haft grind." + }, + { + "id": "EQ-168", + "name": "Hookmarshal Jaw", + "fit": "armament; PF-A05", + "class": "B", + "effect": "Crook Pull can move target rearward instead of forward once.", + "tradeoff": "Reverse pull costs all Poise and Hinders wearer.", + "production": "I/O/V/S: reversible hook, two-way arrow, metal turn." + }, + { + "id": "EQ-169", + "name": "Sunlance Shade", + "fit": "armament; PF-A06", + "class": "B", + "effect": "Noon Line skips one Guarded enemy and preserves more effect for next.", + "tradeoff": "Skipped enemy gains projectile screen.", + "production": "I/O/V/S: sliding spear shade, skip cue, bright sweep." + }, + { + "id": "EQ-170", + "name": "Wayrunner Route Beads", + "fit": "charm; PF-B04 family", + "class": "B", + "effect": "Unique-position Momentum track persists through one forced movement.", + "tradeoff": "Forced movement cannot generate Momentum.", + "production": "I/V/S: route beads, preserved track cue, bead roll." + }, + { + "id": "EQ-171", + "name": "Farstring Thumbplate", + "fit": "armament; PF-B05 family", + "class": "B", + "effect": "Losing Aim to rear intrusion converts it into Guard for wearer.", + "tradeoff": "Aim cannot rebuild until intruder leaves.", + "production": "I/O/V/S: thumbplate, Aim-to-Guard cue, string mute." + }, + { + "id": "EQ-172", + "name": "Riftcaller Grounding Rod", + "fit": "armament; PF-B06 family", + "class": "B", + "effect": "Widened cast may ground-resolve if target dies.", + "tradeoff": "Ground cast cannot generate Charge.", + "production": "I/O/V/S: forked rod, ground diamond cue, bass discharge." + }, + { + "id": "EQ-173", + "name": "Kindhand Measure Spoon", + "fit": "kit; PF-B07 family", + "class": "B", + "effect": "Exact non-overheal creates two Remedy instead of one.", + "tradeoff": "Any overheal next cast removes one Remedy.", + "production": "I/O/V/S: marked spoon, exact-fill cue, cup tap." + }, + { + "id": "EQ-174", + "name": "Bondwright Third Eyelet", + "fit": "charm; PF-B08 family", + "class": "B", + "effect": "Link may skip one intervening ally to reach a different role.", + "tradeoff": "Intervening ally cannot receive shared resource.", + "production": "I/O/V/S: three-eyelet clasp, skipped-link cue, triple pluck." + }, + { + "id": "EQ-175", + "name": "Coilsmith Packframe", + "fit": "kit; PF-B09 family", + "class": "B", + "effect": "Packing a device preserves its mode for redeploy.", + "tradeoff": "Redeploy costs one extra Parts.", + "production": "I/O/V/S: folding frame, stored-mode icon, ratchet fold." + }, + { + "id": "EQ-176", + "name": "Gloamreader Blackleaf", + "fit": "charm; PF-B10 family", + "class": "B", + "effect": "Extending ally-applied hindrance Marks its source for wearer.", + "tradeoff": "Wearer's next debuff cannot target another enemy.", + "production": "I/V/S: dark leaf, source eye cue, dry whisper." + }, + { + "id": "EQ-177", + "name": "Bellkeeper Soft Clapper", + "fit": "charm; PF-B11 family", + "class": "B", + "effect": "Time Bell can advance a neighbor without striking enemy.", + "tradeoff": "No Verse gained that cadence.", + "production": "I/O/V/S: padded clapper, ally-only beat cue, soft bell." + }, + { + "id": "EQ-178", + "name": "Packwarden Open Flap", + "fit": "kit; PF-B12 family", + "class": "B", + "effect": "Supply may refresh neighbor item through one intervening ally.", + "tradeoff": "Intervening ally's items pause one tick.", + "production": "I/O/V/S: open satchel, long handoff cue, buckle chain." + }, + { + "id": "EQ-179", + "name": "Hybrid Lockpick", + "fit": "kit; PF-H01..PF-H06", + "class": "B", + "effect": "First action created by hidden hybrid lock condition gains priority.", + "tradeoff": "All ordinary equipment triggers wait until it resolves.", + "production": "I/O/V/S: six-tooth pick, hybrid crest cue, precise click." + }, + { + "id": "EQ-180", + "name": "Base Recall Medal", + "fit": "charm; advanced", + "class": "B", + "effect": "Once per battle use parent base basic instead of advanced basic.", + "tradeoff": "Advanced local resource gain pauses one cadence.", + "production": "I/V/S: nested medal, parent-arrow cue, two-tone ring." + }, + { + "id": "EQ-181", + "name": "Folding Sentry", + "fit": "kit; construct", + "class": "B", + "effect": "Deploy rear footprint that repeats wearer's basic target once.", + "tradeoff": "Wearer basic is delayed while sentry unfolds.", + "production": "I/O/V/S: tripod sentry, unfold/shot cue, ratchet bolt." + }, + { + "id": "EQ-182", + "name": "Guard Lantern", + "fit": "kit; construct", + "class": "B", + "effect": "Device gives Guard to unit directly ahead each second cadence.", + "tradeoff": "Device cannot attack and is targetable.", + "production": "I/O/V/S: shield lamp, forward square cue, shutter clack." + }, + { + "id": "EQ-183", + "name": "Pull Beacon", + "fit": "kit; construct", + "class": "B", + "effect": "On destruction, pulls wearer one position toward device.", + "tradeoff": "Forced pull clears wearer's reserved target.", + "production": "I/O/V/S: hook beacon, death tether, winch snap." + }, + { + "id": "EQ-184", + "name": "Clockwork Decoy", + "fit": "kit; construct", + "class": "B", + "effect": "Occupies one allied footprint and attracts first legal enemy basic.", + "tradeoff": "Collapse around decoy is delayed until it breaks.", + "production": "I/O/V/S: flat mannequin, threat flare, hollow knock." + }, + { + "id": "EQ-185", + "name": "Marking Turret", + "fit": "kit; construct", + "class": "B", + "effect": "Every third wearer basic lets device Mark same target.", + "tradeoff": "Device cannot retarget; invalid target wastes shot.", + "production": "I/O/V/S: eye turret, three-count reticle, clockwork click." + }, + { + "id": "EQ-186", + "name": "Remedy Sprayer", + "fit": "kit; construct", + "class": "B", + "effect": "Device cleanses nearest ally after two distinct hindrances appear.", + "tradeoff": "It consumes both status observations and cannot heal.", + "production": "I/O/V/S: pump sprayer, two-tag cue, mist burst." + }, + { + "id": "EQ-187", + "name": "Pocket Barricade", + "fit": "kit; construct", + "class": "B", + "effect": "Place behind wearer; blocks first rear-origin attack.", + "tradeoff": "Also blocks allied projectile passing rearward.", + "production": "I/O/V/S: folding slat, bidirectional screen cue, wood snap." + }, + { + "id": "EQ-188", + "name": "Walking Mine", + "fit": "kit; construct", + "class": "B", + "effect": "Device follows enemy foremost position and triggers on forced movement.", + "tradeoff": "Natural enemy steps do not trigger; mine can be destroyed.", + "production": "I/O/V/S: legged mine, follow/arm cue, ticking clamp." + }, + { + "id": "EQ-189", + "name": "Echo Spindle", + "fit": "kit; construct", + "class": "B", + "effect": "Stores first item trigger and repeats its target rule without effect to reveal legality.", + "tradeoff": "Stored item cooldown is one tick longer.", + "production": "I/O/V/S: spool device, ghost trigger cue, winding tone." + }, + { + "id": "EQ-190", + "name": "Salvage Kite", + "fit": "kit; construct", + "class": "B", + "effect": "Destroyed allied footprint gives wearer one item refresh.", + "tradeoff": "Kite must be deployed and occupies rear room.", + "production": "I/O/V/S: hooked kite, salvage arrow, canvas catch." + }, + { + "id": "EQ-191", + "name": "Bending Arrow", + "fit": "armament; projectile", + "class": "B", + "effect": "First blocked projectile bends to blocker instead of fizzle.", + "tradeoff": "Blocker gains Guard before damage.", + "production": "I/O/V/S: curved arrow, bend path cue, curved whistle." + }, + { + "id": "EQ-192", + "name": "Delay Bolt", + "fit": "armament; projectile", + "class": "B", + "effect": "Hit arrives after target's next basic and follows one step.", + "tradeoff": "Target defeat cancels bolt.", + "production": "I/O/V/S: clock-fletched bolt, delayed path, ticking twang." + }, + { + "id": "EQ-193", + "name": "Returning Disk", + "fit": "armament; projectile", + "class": "B", + "effect": "After hit, passes through allied line and cleanses first minor hindrance encountered.", + "tradeoff": "If no hindrance, wearer is Hindered on catch.", + "production": "I/O/V/S: ring disk, return path cue, spin/catch." + }, + { + "id": "EQ-194", + "name": "Screenbreaker Stone", + "fit": "armament; projectile", + "class": "B", + "effect": "First projectile removes screen without damaging target.", + "tradeoff": "Wearer's next projectile is delayed.", + "production": "I/O/V/S: heavy sling stone, broken-screen cue, glassy thud." + }, + { + "id": "EQ-195", + "name": "Neighboring Shot", + "fit": "armament; projectile", + "class": "B", + "effect": "When the reserved target emits AO_INVALID_REACH, AO_INVALID_UNTARGETABLE, AO_INVALID_FALLEN, or AO_INVALID_FILTER, replace the normal invalid-target policy with retarget_same_policy restricted to the legal living enemy nearest the reserved depth, frontmost on a tie; the new recipient receives its own terminal outcome.", + "tradeoff": "If no restricted candidate is legal, emit AO_FIZZLED; a retargeted component cannot apply status.", + "production": "I/O/V/S: fork-fletched arrow, invalid-outcome branch cue, split whistle." + }, + { + "id": "EQ-196", + "name": "Nearfall Javelin", + "fit": "armament; projectile", + "class": "B", + "effect": "Airborne target hit is pulled one index toward enemy front on landing.", + "tradeoff": "Javelin unavailable until target lands.", + "production": "I/O/V/S: tether javelin, landing pull cue, rope whistle." + }, + { + "id": "EQ-197", + "name": "Cargo-Safe Dart", + "fit": "armament; projectile", + "class": "B", + "effect": "Ignores cargo/neutral footprint and hits occupant without collateral rule.", + "tradeoff": "Dart cannot critical or trigger defeat riders.", + "production": "I/O/V/S: blunt dart, safe-cargo outline, soft thunk." + }, + { + "id": "EQ-198", + "name": "Crossline Sling", + "fit": "armament; projectile", + "class": "B", + "effect": "Shot may originate from allied construct's index.", + "tradeoff": "Construct loses next utility action.", + "production": "I/O/V/S: relay sling, origin-shift cue, double twang." + }, + { + "id": "EQ-199", + "name": "Sunken Quarrel", + "fit": "armament; projectile", + "class": "B", + "effect": "Projectile waits through concealment and fires on reveal.", + "tradeoff": "Wearer cannot choose another target while waiting.", + "production": "I/O/V/S: heavy quarrel, wait-eye cue, held string creak." + }, + { + "id": "EQ-200", + "name": "Last Arrow Case", + "fit": "kit; projectile", + "class": "B", + "effect": "Third distinct projectile target refreshes oldest projectile item.", + "tradeoff": "Repeating target resets case count.", + "production": "I/O/V/S: three-slot case, target pips, case clicks." + }, + { + "id": "EQ-201", + "name": "Forecast Bandage", + "fit": "kit; restore", + "class": "B", + "effect": "First heal reserves on predicted next-hit ally and resolves just before hit.", + "tradeoff": "If prediction changes, heal fizzles with half cooldown refund.", + "production": "I/O/V/S: clock bandage, pre-hit cue, cloth snap." + }, + { + "id": "EQ-202", + "name": "Overheal Funnel", + "fit": "kit; restore", + "class": "B", + "effect": "Overheal flows to next-lowest-vitality neighbor.", + "tradeoff": "Original target receives no positive tag riders.", + "production": "I/O/V/S: fork funnel, overflow arc, liquid chime." + }, + { + "id": "EQ-203", + "name": "Cleanse Blanket", + "fit": "garb; restore", + "class": "B", + "effect": "Cleansing wearer also pauses neighbor hindrance expiry one tick.", + "tradeoff": "Neighbor cannot be cleansed that tick.", + "production": "I/O/V/S: stitched blanket, pause ring cue, fabric hush." + }, + { + "id": "EQ-204", + "name": "Rear Triage Lamp", + "fit": "kit; restore", + "class": "B", + "effect": "Healing rearmost ally also reveals next rear-targeting enemy action.", + "tradeoff": "No reveal if heal is overheal.", + "production": "I/O/V/S: back-facing lamp, heal-eye cue, shutter chime." + }, + { + "id": "EQ-205", + "name": "Shared Dose Cup", + "fit": "kit; restore", + "class": "B", + "effect": "Split one heal evenly between two adjacent legal allies.", + "tradeoff": "Neither half can generate resource from exact healing.", + "production": "I/O/V/S: divided cup, split cross cue, twin pours." + }, + { + "id": "EQ-206", + "name": "Delayed Splint", + "fit": "kit; restore", + "class": "B", + "effect": "After forced movement, schedule heal when target next becomes still.", + "tradeoff": "A second movement cancels heal.", + "production": "I/O/V/S: clock splint, stillness cue, wood wrap." + }, + { + "id": "EQ-207", + "name": "Harm-to-Remedy Vial", + "fit": "kit; restore", + "class": "B", + "effect": "First prevented hit creates one Remedy for nearest restorer.", + "tradeoff": "Preventing source gains no local resource.", + "production": "I/O/V/S: shield vial, block-to-drop cue, glass ping." + }, + { + "id": "EQ-208", + "name": "Bitter Cleanser", + "fit": "kit; restore", + "class": "B", + "effect": "Cleanse positive and negative oldest tags together, then advance target.", + "tradeoff": "Target loses both tags regardless of value.", + "production": "I/O/V/S: double-ended vial, plus-minus sweep, bitter clink." + }, + { + "id": "EQ-209", + "name": "Last-Care Thread", + "fit": "charm; restore", + "class": "B", + "effect": "If heal target dies during wind-up, heal retargets its nearest living neighbor.", + "tradeoff": "Retarget heal is delayed one tick.", + "production": "I/V/S: trailing cross thread, neighbor branch, soft pluck." + }, + { + "id": "EQ-210", + "name": "Triage Divider", + "fit": "charm; restore", + "class": "B", + "effect": "Alternate heals between front and rear bands; each alternate gains reach.", + "tradeoff": "Repeating a band reduces reach to 1.", + "production": "I/V/S: divided cross, band alternator, paired chime." + }, + { + "id": "EQ-211", + "name": "Guard Gift Box", + "fit": "kit; enable", + "class": "B", + "effect": "First Guard shared also refreshes recipient's oldest positive tag.", + "tradeoff": "Giver loses all other positive tags.", + "production": "I/O/V/S: hinged box, Guard-to-tag cue, lid click." + }, + { + "id": "EQ-212", + "name": "Cadence Tea", + "fit": "kit; enable", + "class": "B", + "effect": "Choose fast or slow in Prepare; first recipient basic adopts that cadence.", + "tradeoff": "Recipient next basic uses opposite cadence.", + "production": "I/O/V/S: two-spout cup, fast/slow cue, pour ticks." + }, + { + "id": "EQ-213", + "name": "Marking Ribbon", + "fit": "charm; enable", + "class": "B", + "effect": "Positive tag on ally also Marks its current legal target.", + "tradeoff": "Ally becomes Exposed if target dies before tag.", + "production": "I/V/S: eye ribbon, ally-target tether, ribbon snap." + }, + { + "id": "EQ-214", + "name": "Neighbor Battery", + "fit": "kit; enable", + "class": "B", + "effect": "Item cooldown progress can be transferred to one neighbor.", + "tradeoff": "Wearer's cooldown pauses until neighbor trigger.", + "production": "I/O/V/S: twin-cell pack, clock handoff, electric click." + }, + { + "id": "EQ-215", + "name": "Position Lesson Slate", + "fit": "kit; enable", + "class": "B", + "effect": "After wearer moves, neighbor copies its reach rule for one basic.", + "tradeoff": "Neighbor loses own target preference for that basic.", + "production": "I/O/V/S: footprint slate, copied ruler, chalk tap." + }, + { + "id": "EQ-216", + "name": "Empty-Hand Gift", + "fit": "charm; enable", + "class": "B", + "effect": "With no ready item, wearer grants one local resource to neighbor.", + "tradeoff": "Wearer's items gain one cooldown tick.", + "production": "I/V/S: open palm brooch, resource arrow, clasp sound." + }, + { + "id": "EQ-217", + "name": "Opposite-Band Banner", + "fit": "kit; enable", + "class": "B", + "effect": "Enable action aimed front also gives shorter version to rear, and vice versa.", + "tradeoff": "Center-band allies cannot receive item copy.", + "production": "I/O/V/S: two-ended banner, endpoint arcs, flag wave." + }, + { + "id": "EQ-218", + "name": "Role Exchange Badge", + "fit": "charm; enable", + "class": "B", + "effect": "Different-role neighbors swap one positive profession tag after both act.", + "tradeoff": "Same-role adjacency makes badge dormant.", + "production": "I/V/S: two-role badge, exchange arrows, double ping." + }, + { + "id": "EQ-219", + "name": "Safe Wager Seal", + "fit": "charm; enable", + "class": "B", + "effect": "Give ally action advance and Exposed; if it completes action, Exposed clears.", + "tradeoff": "Interruption leaves Exposed extended.", + "production": "I/V/S: open seal, action wager clock, seal crack." + }, + { + "id": "EQ-220", + "name": "Third Neighbor Horn", + "fit": "kit; enable", + "class": "B", + "effect": "If wearer has two neighbors, sound action reaches both with alternating effects.", + "tradeoff": "With one neighbor, effect is weaker and generates no resource.", + "production": "I/O/V/S: fork horn, two-side wave cue, captioned double call." + }, + { + "id": "EQ-221", + "name": "Parting Guard", + "fit": "guard; front", + "class": "B", + "effect": "On wearer defeat, grant remaining Guard to neighbor behind before collapse.", + "tradeoff": "No Guard means no trigger; item is lost with wearer under core loss rule.", + "production": "I/O/V/S: split shield, defeat handoff cue, fading clang." + }, + { + "id": "EQ-222", + "name": "Empty Boots", + "fit": "garb; any", + "class": "B", + "effect": "On wearer defeat, next ally collapsing into position gains movement immunity.", + "tradeoff": "Ally's next voluntary movement is delayed.", + "production": "I/O/V/S: hollow boots, inherited root cue, empty heel." + }, + { + "id": "EQ-223", + "name": "Last Mark Brooch", + "fit": "charm; pressure", + "class": "B", + "effect": "On wearer defeat, Mark its last legal enemy target for whole party.", + "tradeoff": "Mark lasts one cadence and grants target Guard.", + "production": "I/V/S: fading eye brooch, party Mark cue, low ping." + }, + { + "id": "EQ-224", + "name": "Salvager's Cord", + "fit": "kit; support", + "class": "B", + "effect": "First allied equipment broken in battle refreshes wearer's item trigger.", + "tradeoff": "Wearer becomes priority target for device hunters.", + "production": "I/O/V/S: hooked salvage cord, break-to-clock cue, reel." + }, + { + "id": "EQ-225", + "name": "Retreat Compass", + "fit": "charm; any", + "class": "B", + "effect": "During declared retreat, wearer steps rearward before enemy exit actions.", + "tradeoff": "Wearer cannot attack during retreat resolution.", + "production": "I/V/S: backward compass, exit arrow, urgent clicks." + }, + { + "id": "EQ-226", + "name": "Rearguard Pennant", + "fit": "kit; front", + "class": "B", + "effect": "During declared retreat, wearer remains to intercept one crossing hit then exits.", + "tradeoff": "If defeated by hit, normal permanent loss applies.", + "production": "I/O/V/S: split-tail pennant, exit block cue, flag-and-clang." + }, + { + "id": "EQ-227", + "name": "Fallen Neighbor Knot", + "fit": "charm; any", + "class": "B", + "effect": "Neighbor defeat grants immediate basic against defeating source.", + "tradeoff": "Wearer becomes Exposed and loses reserved resource spend.", + "production": "I/V/S: cut knot, revenge tether, sharp twang." + }, + { + "id": "EQ-228", + "name": "Vacancy Ward", + "fit": "kit; construct", + "class": "B", + "effect": "On allied defeat, place one-cadence neutral footprint that delays enemy rear intrusion.", + "tradeoff": "Also delays allied collapse into that position.", + "production": "I/O/V/S: folding ward, vacancy square, ward unfold." + }, + { + "id": "EQ-229", + "name": "Survivor's Cup", + "fit": "charm; any", + "class": "B", + "effect": "After wearer survives below threshold, next healing targets wearer before lower allies.", + "tradeoff": "Heal receives no overheal conversion.", + "production": "I/V/S: cracked cup, priority cross cue, cup tap." + }, + { + "id": "EQ-230", + "name": "Unspent Token Case", + "fit": "kit; resource", + "class": "B", + "effect": "On wearer defeat, one local token transfers to legal same-resource ally.", + "tradeoff": "All other tokens are discarded before other riders.", + "production": "I/O/V/S: single-slot case, defeat loan cue, case close." + }, + { + "id": "EQ-231", + "name": "Collapse Lantern", + "fit": "kit; any", + "class": "B", + "effect": "First ally collapse reveals enemy action that will target new order.", + "tradeoff": "Reveal delays wearer's next item trigger.", + "production": "I/O/V/S: folding lamp, collapse-eye cue, shutter open." + }, + { + "id": "EQ-232", + "name": "Memorial Spike", + "fit": "kit; control", + "class": "B", + "effect": "Position where wearer is defeated becomes one-cadence enemy movement hazard.", + "tradeoff": "Allied movement through it is also blocked.", + "production": "I/O/V/S: plain spike, indexed hazard cue, stake drop." + }, + { + "id": "EQ-233", + "name": "Last Breath Reed", + "fit": "charm; sound", + "class": "B", + "effect": "On wearer defeat, complete current sound wind-up at reduced non-damaging effect.", + "tradeoff": "No other defeat trigger on wearer can resolve.", + "production": "I/O/V/S: cracked reed, fading waveform, breath tone caption." + }, + { + "id": "EQ-234", + "name": "Replacement Measure", + "fit": "charm; any", + "class": "B", + "effect": "First ally entering wearer's vacated position copies wearer's last reach for one basic.", + "tradeoff": "It loses its own target preference.", + "production": "I/V/S: empty ruler token, inherited reach cue, slide click." + }, + { + "id": "EQ-235", + "name": "Broken-Line Patch", + "fit": "garb; any", + "class": "B", + "effect": "With two defeated allies, wearer may treat vacancy as neighbor for one enable action.", + "tradeoff": "Action cannot transfer resource.", + "production": "I/O/V/S: gap patch, ghost neighbor cue, cloth stitch." + }, + { + "id": "EQ-236", + "name": "Retreater's Knife", + "fit": "armament; any", + "class": "B", + "effect": "First enemy blocking retreat is targeted regardless of normal preference.", + "tradeoff": "Attack cannot defeat; it applies Hindered instead.", + "production": "I/O/V/S: blunt retreat knife, exit reticle, scraping cut." + }, + { + "id": "EQ-237", + "name": "Inheritance Buckle", + "fit": "garb; any", + "class": "B", + "effect": "On wearer defeat, one unspent once-per-battle item trigger transfers to neighbor.", + "tradeoff": "Transfer delays neighbor basic and never transfers item itself.", + "production": "I/O/V/S: detachable buckle, trigger handoff cue, clasp release." + }, + { + "id": "EQ-238", + "name": "Quiet Passing Veil", + "fit": "garb; any", + "class": "B", + "effect": "Wearer defeat generates no enemy on-defeat resource.", + "tradeoff": "Allied on-defeat benefits from wearer also do not trigger.", + "production": "I/O/V/S: plain veil, crossed-resource cue, soft fall." + }, + { + "id": "EQ-239", + "name": "Last Position Map", + "fit": "kit; reorder", + "class": "B", + "effect": "Result view stores wearer starting/defeat positions and offers one previewed formation correction next Prepare.", + "tradeoff": "Correction is advisory; accepting replaces current saved order.", + "production": "I/O/V/S: folded line map, before/after cue, paper fold." + }, + { + "id": "EQ-240", + "name": "Dismissal Tag", + "fit": "charm; reserve planning", + "class": "B", + "effect": "Dismissing wearer converts this item into one role-weight token that shapes the next shop, with exact outcome previewed.", + "tradeoff": "Gives no salvage currency; token expires after that shop and never cancels dismissal consequence.", + "production": "I/V/S: open tally tag, role-to-shop cue, stamp tone." + }, + { + "id": "EQ-241", + "name": "Windglass Vane", + "fit": "charm; any", + "class": "B", + "effect": "First region push direction is revealed one cadence earlier and wearer may brace.", + "tradeoff": "Brace locks wearer's target to foremost.", + "production": "I/O/V/S: glass vane, early chevron cue, wind click." + }, + { + "id": "EQ-242", + "name": "Prism Scraper", + "fit": "armament; any", + "class": "B", + "effect": "Hitting a family screen changes it to its next disclosed family.", + "tradeoff": "Hit deals no damage/status and screen remains.", + "production": "I/O/V/S: flat scraper, screen-cycle cue, glass scrape." + }, + { + "id": "EQ-243", + "name": "Fenstep Rack", + "fit": "garb; any", + "class": "B", + "effect": "Moving with region safe index cleanses one Wet stack.", + "tradeoff": "Moving against index adds Wet.", + "production": "I/O/V/S: reed sole rack, tide arrow cue, wet steps." + }, + { + "id": "EQ-244", + "name": "Midwater Timer", + "fit": "charm; restore", + "class": "B", + "effect": "Shows exact safe cleanse midpoint for duration traps; cleanse there advances item cooldown.", + "tradeoff": "Cleansing outside window delays cooldown.", + "production": "I/V/S: water clock, safe notch cue, drip tick." + }, + { + "id": "EQ-245", + "name": "Kiln Vent Key", + "fit": "kit; any", + "class": "B", + "effect": "One wearer action may occupy a pressure valve without moving wearer.", + "tradeoff": "That action cannot target a unit.", + "production": "I/O/V/S: ceramic key, remote valve cue, key hiss." + }, + { + "id": "EQ-246", + "name": "Heat Ledger", + "fit": "charm; any", + "class": "B", + "effect": "Third self-cost action converts next Heat-like cost into delayed Hindered.", + "tradeoff": "Hindered cannot be cleansed early.", + "production": "I/V/S: three-mark tile, cost-delay cue, clay click." + }, + { + "id": "EQ-247", + "name": "Archive Bookmark", + "fit": "kit; any", + "class": "B", + "effect": "Locks current Repeat/Alternate/Preserve clause for one extra cadence.", + "tradeoff": "Wearer is bound by locked clause even if enemy clause source dies.", + "production": "I/O/V/S: root bookmark, clause lock cue, page clamp." + }, + { + "id": "EQ-248", + "name": "Copyproof Wax", + "fit": "charm; any", + "class": "B", + "effect": "First enemy copy of wearer's target rule receives default target instead.", + "tradeoff": "Wearer's own next retarget also defaults.", + "production": "I/V/S: sealed eye wax, default arrow, wax press." + }, + { + "id": "EQ-249", + "name": "Tideglass Plumb", + "fit": "charm; any", + "class": "B", + "effect": "Source/echo targeting preview remains visible through one swap.", + "tradeoff": "Wearer cannot change target during preserved preview.", + "production": "I/V/S: weighted mirror, solid tether cue, plumb ping." + }, + { + "id": "EQ-250", + "name": "Rear Beacon Hook", + "fit": "kit; support", + "class": "B", + "effect": "First hostile rear arrival is Marked and pulled toward center after its action.", + "tradeoff": "Wearer becomes its forced target until pull.", + "production": "I/O/V/S: luminous hook, arrival-center cue, rope splash." + }, + { + "id": "EQ-251", + "name": "Railstop Watch", + "fit": "charm; any", + "class": "B", + "effect": "Pauses wearer action one tick before a chosen disclosed rail stop, then releases after stop.", + "tradeoff": "Choosing wrong stop wastes the tick.", + "production": "I/V/S: station watch, stop reservation cue, rail click." + }, + { + "id": "EQ-252", + "name": "Cargo Bracer", + "fit": "guard; any", + "class": "B", + "effect": "Attacks from wearer cannot damage neutral cargo; first saved cargo grants Guard.", + "tradeoff": "Damage against cargo occupant is reduced to utility riders.", + "production": "I/O/V/S: crate bracer, cargo shield cue, wood knock." + }, + { + "id": "EQ-253", + "name": "Current Lamp", + "fit": "kit; reveal", + "class": "B", + "effect": "Wearer projects reveal one position ahead of region current.", + "tradeoff": "Lamp occupies item trigger and makes wearer preferred by reveal hunters.", + "production": "I/O/V/S: hooded lamp, forward reveal cone, sonar chime." + }, + { + "id": "EQ-254", + "name": "Tithe Purse", + "fit": "kit; resource", + "class": "B", + "effect": "Choose one token as theft bait; stolen token Marks receiving enemy.", + "tradeoff": "Chosen token cannot be spent before theft/expiry.", + "production": "I/O/V/S: open purse, bait tether, coin drop." + }, + { + "id": "EQ-255", + "name": "Circuit Wedge", + "fit": "kit; control", + "class": "B", + "effect": "Hitting middle member of enemy link breaks circuit for one cadence.", + "tradeoff": "Wedge also prevents allied links through wearer.", + "production": "I/O/V/S: insulated wedge, broken-node cue, dull electric pop." + }, + { + "id": "EQ-256", + "name": "Synthesis Dial", + "fit": "charm; any", + "class": "B", + "effect": "In dual-grammar encounter, wearer item may be assigned to counter either named grammar in Prepare.", + "tradeoff": "It cannot trigger against the other grammar that battle.", + "production": "I/V/S: two-motif dial, chosen half cue, rotary click." + }, + { + "id": "EQ-257", + "name": "Schedule Needle", + "fit": "charm; timing", + "class": "B", + "effect": "Pin one disclosed eight-tick schedule entry; wearer's action waits to resolve immediately before it.", + "tradeoff": "If entry is skipped, action fizzles.", + "production": "I/V/S: radial needle, schedule pin cue, clock prick." + }, + { + "id": "EQ-258", + "name": "Imported Rule Tag", + "fit": "kit; any", + "class": "B", + "effect": "First enemy using an earlier-region mechanic is Marked for wearer.", + "tradeoff": "Native-region enemies cannot be Marked by wearer that cadence.", + "production": "I/O/V/S: eight-tab tag, reprise eye cue, motif stamp." + }, + { + "id": "EQ-259", + "name": "Boss Phase Slate", + "fit": "kit; any", + "class": "B", + "effect": "At phase threshold, preserve wearer's reserved target through disclosed form change.", + "tradeoff": "Wearer cannot retarget until action resolves.", + "production": "I/O/V/S: split-phase slate, threshold tether, stone turn." + }, + { + "id": "EQ-260", + "name": "Counterpair Compass", + "fit": "charm; any", + "class": "B", + "effect": "After wearer uses two distinct preview response tags, refresh oldest item cooldown.", + "tradeoff": "Repeating response resets pair.", + "production": "I/V/S: two-needle compass, response pips, paired ticks." + }, + { + "id": "EQ-261", + "name": "Before-After Switch", + "fit": "kit; any", + "class": "B", + "effect": "Choose in Prepare whether item triggers before target selection or after target lock.", + "tradeoff": "Choice cannot change in battle.", + "production": "I/O/V/S: two-position switch, hook labels, hard click." + }, + { + "id": "EQ-262", + "name": "Once-More Seal", + "fit": "charm; any", + "class": "B", + "effect": "Repeat first non-damaging item trigger on a different legal target.", + "tradeoff": "Both triggers enter double cooldown.", + "production": "I/V/S: doubled seal, second-target cue, echo stamp." + }, + { + "id": "EQ-263", + "name": "Dormant Gear Bell", + "fit": "charm; any", + "class": "B", + "effect": "Two cadences with no legal item target retargets item to self if legal.", + "tradeoff": "Self trigger applies Hindered.", + "production": "I/V/S: sleeping gear bell, fallback-self cue, waking chime." + }, + { + "id": "EQ-264", + "name": "Trigger Queue Comb", + "fit": "charm; any", + "class": "B", + "effect": "When two items would trigger together, choose left-to-right equipped order.", + "tradeoff": "Second trigger resolves one tick later.", + "production": "I/O/V/S: toothed comb, ordered pips, two clicks." + }, + { + "id": "EQ-265", + "name": "Neighbor Proc Wire", + "fit": "kit; support", + "class": "B", + "effect": "Wearer's first item trigger arms neighbor's different-tag item.", + "tradeoff": "Armed item cannot trigger on its own condition first.", + "production": "I/O/V/S: clip wire, item-to-item cue, electric snap." + }, + { + "id": "EQ-266", + "name": "Cancel Catch", + "fit": "guard; any", + "class": "B", + "effect": "Cancelled profession action readies non-damaging item trigger.", + "tradeoff": "Cancel gives no timing/resource refund.", + "production": "I/O/V/S: hooked guard catch, cancel-to-item cue, latch." + }, + { + "id": "EQ-267", + "name": "Fizzle Lantern", + "fit": "kit; any", + "class": "B", + "effect": "Item fizzle reveals nearest legal target for next profession action.", + "tradeoff": "Next action must use revealed target if legal.", + "production": "I/O/V/S: cracked lamp, fizzle-eye cue, lamp pop." + }, + { + "id": "EQ-268", + "name": "Cooldown Bridge", + "fit": "charm; any", + "class": "B", + "effect": "When one item readies, transfer one cooldown tick to another equipped item.", + "tradeoff": "Ready item becomes unavailable one tick.", + "production": "I/V/S: bridge clasp, clock exchange, bridge ping." + }, + { + "id": "EQ-269", + "name": "Shared Trigger Cup", + "fit": "kit; support", + "class": "B", + "effect": "Effective heal lets recipient satisfy wearer's next on-heal equipment condition.", + "tradeoff": "Wearer cannot satisfy it directly that cadence.", + "production": "I/O/V/S: linked cup, proxy trigger cue, twin chime." + }, + { + "id": "EQ-270", + "name": "Marked Proc Quill", + "fit": "charm; any", + "class": "B", + "effect": "Equipment effects on Marked target occur before its tag-expiry hooks.", + "tradeoff": "Effect removes Mark afterward.", + "production": "I/V/S: eye quill, hook-order cue, page scratch." + }, + { + "id": "EQ-271", + "name": "Opposite Trigger Ring", + "fit": "charm; any", + "class": "B", + "effect": "Direct-hit item proc also readies next area-trigger item, or reverse.", + "tradeoff": "Same-family trigger chain is prohibited and Hinders wearer.", + "production": "I/V/S: dot/ring token, cross-family arrow, two-tone ping." + }, + { + "id": "EQ-272", + "name": "Three-Source Locket", + "fit": "charm; any", + "class": "B", + "effect": "Profession, trait, and equipment triggers in one cadence grant one Focus.", + "tradeoff": "Duplicate source resets count.", + "production": "I/V/S: three-compartment locket, source pips, triple click." + }, + { + "id": "EQ-273", + "name": "Triggerless Knife", + "fit": "armament; pressure", + "class": "B", + "effect": "If no item triggered for three basics, third basic applies Exposed.", + "tradeoff": "Any item trigger clears count.", + "production": "I/O/V/S: plain knife, empty-clock count, dry cut." + }, + { + "id": "EQ-274", + "name": "Delayed Item Strap", + "fit": "garb; any", + "class": "B", + "effect": "Store first automatic item trigger and release on wearer command condition set in Prepare.", + "tradeoff": "Stored trigger blocks all other item triggers.", + "production": "I/O/V/S: strapped token, held-proc cue, buckle release." + }, + { + "id": "EQ-275", + "name": "Source Filter", + "fit": "charm; any", + "class": "B", + "effect": "Choose profession, trait, or enemy as only legal source for on-status item trigger.", + "tradeoff": "Other-source statuses never trigger it.", + "production": "I/V/S: three-slot filter, chosen source cue, filter turn." + }, + { + "id": "EQ-276", + "name": "Two-Battle Spring", + "fit": "kit; any", + "class": "B", + "effect": "Unused once-per-battle trigger starts next battle ready with priority.", + "tradeoff": "If used next battle, wearer begins Hindered.", + "production": "I/O/V/S: double-coil spring, carryover cue, loaded twang." + }, + { + "id": "EQ-277", + "name": "Death-Proof Queue", + "fit": "charm; support", + "class": "B", + "effect": "If item target dies during trigger, queue transfers to nearest living neighbor.", + "tradeoff": "Transferred trigger becomes non-damaging.", + "production": "I/V/S: queue bead, neighbor branch cue, bead slide." + }, + { + "id": "EQ-278", + "name": "Screened Trigger Lens", + "fit": "charm; projectile", + "class": "B", + "effect": "Projectile item checks screens at trigger time and chooses first unscreened legal target.", + "tradeoff": "It ignores Marks and profession preferences.", + "production": "I/O/V/S: layered lens, screen scan cue, glass ticks." + }, + { + "id": "EQ-279", + "name": "Resource-Gated Cog", + "fit": "kit; any", + "class": "B", + "effect": "Choose one local resource threshold as item trigger gate.", + "tradeoff": "Item cooldown pauses while below threshold.", + "production": "I/O/V/S: meter cog, gate line cue, ratchet stop." + }, + { + "id": "EQ-280", + "name": "Last Proc Ledger", + "fit": "kit; any", + "class": "B", + "effect": "Result records first dormant/illegal equipment trigger and previews one alternative wearer.", + "tradeoff": "No battle effect; equipping suggested swap replaces current loadout choice only.", + "production": "I/O/V/S: diagnostic ledger, invalid-to-candidate cue, page stamp." + }, + { + "id": "EQ-281", + "name": "Directional Bastion", + "fit": "guard; front", + "class": "B", + "effect": "Intercepts only front-origin or rear-origin attacks chosen in Prepare, but refreshes once.", + "tradeoff": "Wrong origin bypasses. Unlock: win after previewing both origins.", + "production": "I/O/V/S: two-face shield, origin selector, reversible clang." + }, + { + "id": "EQ-282", + "name": "Debtkeeper Mantle", + "fit": "garb; PF-H01", + "class": "B", + "effect": "Care Debt may be transferred to wearer from neighbor once.", + "tradeoff": "Transfer doubles next debt payment time. Unlock: clear PF-H01 deed.", + "production": "I/O/V/S: stitched mantle, debt arrow, heartbeat cloth." + }, + { + "id": "EQ-283", + "name": "Finisher's Empty Sheath", + "fit": "armament; pressure", + "class": "B", + "effect": "Execution action may deliberately stop target at survival floor and Mark it.", + "tradeoff": "Target acts immediately after. Unlock: win with zero overkill.", + "production": "I/O/V/S: empty sheath, survival line cue, blade stop." + }, + { + "id": "EQ-284", + "name": "Countertime Spur", + "fit": "garb; PF-H02", + "class": "B", + "effect": "Cadence-cut action may shift allied instead of enemy wind-up.", + "tradeoff": "User becomes Exposed. Unlock: complete three-band alternation.", + "production": "I/O/V/S: metronome spur, ally/enemy clock selector, sharp heel beat." + }, + { + "id": "EQ-285", + "name": "Horizon Fork", + "fit": "armament; PF-H03", + "class": "B", + "effect": "Guided projectile splits at planted polearm to front and rear targets.", + "tradeoff": "Guide recovery takes two basics. Unlock: defeat rear target through two units.", + "production": "I/O/V/S: forked spear-bow, split horizon cue, double flight." + }, + { + "id": "EQ-286", + "name": "Mobile Workshop", + "fit": "kit; PF-H04", + "class": "B", + "effect": "Carried device retains action progress while moved.", + "tradeoff": "Each move shortens device duration. Unlock: trigger three device modes.", + "production": "I/O/V/S: wheel pack, moving clock cue, rolling ratchet." + }, + { + "id": "EQ-287", + "name": "Eclipse Leaf", + "fit": "charm; PF-H05", + "class": "B", + "effect": "Shadow Text may attach to allied Guard and release when Guard breaks.", + "tradeoff": "Release affects both sides in area. Unlock: win from retained interrupt.", + "production": "I/V/S: eclipsed leaf, Guard-text cue, reversed burst." + }, + { + "id": "EQ-288", + "name": "Covenant Stamp", + "fit": "charm; PF-H06", + "class": "B", + "effect": "Resource loan may be repaid by equipment trigger instead of profession action.", + "tradeoff": "Failed repayment locks that item. Unlock: complete three distinct loans.", + "production": "I/V/S: knot stamp, item repayment cue, stamped pluck." + }, + { + "id": "EQ-289", + "name": "Three-Screen Prism", + "fit": "guard; any", + "class": "B", + "effect": "Choose one screen family to begin active; each successful block rotates family.", + "tradeoff": "Unchosen first attack bypasses. Unlock: break all three screen families.", + "production": "I/O/V/S: tri-prism shield, rotation cue, glass chord." + }, + { + "id": "EQ-290", + "name": "Position Author's Quill", + "fit": "kit; reorder", + "class": "B", + "effect": "Set one position as a trigger index for wearer's next three actions.", + "tradeoff": "Leaving index cancels sequence. Unlock: win after using every line band.", + "production": "I/O/V/S: map quill, indexed sequence cue, three strokes." + }, + { + "id": "EQ-291", + "name": "Enemy Clause Binder", + "fit": "kit; control", + "class": "B", + "effect": "Store one previewed enemy clause and delay its first activation.", + "tradeoff": "Second activation occurs early. Unlock: counter each archive clause.", + "production": "I/O/V/S: clasped page, late/early cue, binding snap." + }, + { + "id": "EQ-292", + "name": "Echo Source Needle", + "fit": "armament; any", + "class": "B", + "effect": "Attack on echo also applies a non-damaging Mark to source.", + "tradeoff": "Source gains one action advance. Unlock: defeat ten echoes via source rules.", + "production": "I/O/V/S: twin-point needle, echo-source tether, paired prick." + }, + { + "id": "EQ-293", + "name": "Railmaster's Watch", + "fit": "charm; timing", + "class": "B", + "effect": "Shift one wearer cooldown completion to chosen future rail stop.", + "tradeoff": "Cooldown makes no progress before stop. Unlock: preserve all cargo in elite route.", + "production": "I/V/S: station watch, future-stop lock, rail chime." + }, + { + "id": "EQ-294", + "name": "Current Reader", + "fit": "charm; reveal", + "class": "B", + "effect": "Revealing action also exposes resource and target band.", + "tradeoff": "Revealed enemy gains Guard. Unlock: win with no hidden category resolving.", + "production": "I/V/S: open-current lens, triple reveal card, sonar chord." + }, + { + "id": "EQ-295", + "name": "Synthesis Harness", + "fit": "garb; any", + "class": "B", + "effect": "Wearer can carry two region-counter items but only one is active per cadence.", + "tradeoff": "Switching active item delays basic. Unlock: counter two grammars in one fight.", + "production": "I/O/V/S: dual-loop harness, active-side cue, buckle shift." + }, + { + "id": "EQ-296", + "name": "Bosswheel Key", + "fit": "kit; any", + "class": "B", + "effect": "Once per boss, rotate one public schedule by one tick.", + "tradeoff": "Boss gains action advance after rotated entry. Unlock: clear both bosses in one region.", + "production": "I/O/V/S: radial key, wheel turn cue, heavy click." + }, + { + "id": "EQ-297", + "name": "Replacement Crest", + "fit": "charm; any", + "class": "B", + "effect": "Ally collapsing into wearer's former position inherits one positive position tag.", + "tradeoff": "Wearer loses tag immediately. Unlock: win after two mid-battle collapses.", + "production": "I/V/S: passing crest, position inheritance cue, crest slide." + }, + { + "id": "EQ-298", + "name": "No-Repeat Medallion", + "fit": "charm; any", + "class": "B", + "effect": "Three distinct target rules refresh item trigger.", + "tradeoff": "Repeating a rule Hinders wearer. Unlock: win using six target rules.", + "production": "I/V/S: three-arrow medal, unique pips, medal ticks." + }, + { + "id": "EQ-299", + "name": "Full-Line Standard", + "fit": "kit; support", + "class": "B", + "effect": "First enable action reaches every line band with shorter effect.", + "tradeoff": "Wearer cannot gain local resource that cadence. Unlock: deploy at core maximum capacity.", + "production": "I/O/V/S: tall segmented standard, band waves, broad flag tone." + }, + { + "id": "EQ-300", + "name": "Clean Result Lens", + "fit": "charm; any", + "class": "B", + "effect": "On first plan divergence, pause wearer's next automatic item trigger until cause is revealed.", + "tradeoff": "Trigger may lose its original timing window. Unlock: inspect 25 divergence records.", + "production": "I/V/S: clear ledger lens, pause-cause cue, focus tone." + }, + { + "id": "EQ-301", + "name": "One-End Crown", + "fit": "charm; front/rear", + "class": "B", + "effect": "Choose foremost or rearmost; wearer actions may only target from that end and gain line reach.", + "tradeoff": "Other-end legal targets are forbidden. Unlock: win with unchanged order.", + "production": "I/O/V/S: half-crown, endpoint selector, bright lock." + }, + { + "id": "EQ-302", + "name": "Zero-Guard Blade", + "fit": "armament; pressure", + "class": "B", + "effect": "While wearer has zero Guard, basics ignore protection links.", + "tradeoff": "Any Guard gain disables blade until spent. Unlock: defeat elite without gaining Guard.", + "production": "I/O/V/S: open-spine blade, bypass cue, dry ring." + }, + { + "id": "EQ-303", + "name": "Full-Guard Lamp", + "fit": "charm; enable", + "class": "B", + "effect": "At full Guard, next enable action becomes area across neighbors.", + "tradeoff": "It consumes all Guard. Unlock: prevent five hits in one battle.", + "production": "I/O/V/S: shield lamp, neighbor fan cue, bright discharge." + }, + { + "id": "EQ-304", + "name": "Empty-Resource Focus", + "fit": "armament; any", + "class": "B", + "effect": "At zero local resource, action uses alternate target rule: highest-resource enemy.", + "tradeoff": "It cannot generate resource. Unlock: complete battle with three zero-meter actions.", + "production": "I/O/V/S: hollow focus, zero-to-enemy meter cue, void hum." + }, + { + "id": "EQ-305", + "name": "Full-Resource Wager", + "fit": "charm; any", + "class": "B", + "effect": "Spend all local resource to copy next ally target rule.", + "tradeoff": "Illegal copy loses all spend and fizzles. Unlock: spend cap three ways.", + "production": "I/V/S: full wager gem, ally-copy cue, shattering chime." + }, + { + "id": "EQ-306", + "name": "Unscreened Bow", + "fit": "armament; projectile", + "class": "B", + "effect": "Projectiles ignore all screens but wearer becomes forced target of screen source.", + "tradeoff": "Force lasts until next basic. Unlock: break 30 screens.", + "production": "I/O/V/S: open-limb bow, source tether, piercing snap." + }, + { + "id": "EQ-307", + "name": "No-Cleanse Tablet", + "fit": "charm; impair", + "class": "B", + "effect": "Hindrances wearer applies cannot be cleansed early.", + "tradeoff": "They expire one cadence sooner and grant target Guard. Unlock: let 20 hindrances expire naturally.", + "production": "I/O/V/S: sealed tablet, locked short ring, hard stamp." + }, + { + "id": "EQ-308", + "name": "All-Cleanse Basin", + "fit": "kit; restore", + "class": "B", + "effect": "Once per battle cleanse every ally, oldest hindrance only.", + "tradeoff": "Removes oldest positive tag from each and delays wearer. Unlock: cleanse six tags in one fight.", + "production": "I/O/V/S: wide basin, line sweep cue, water chord." + }, + { + "id": "EQ-309", + "name": "Immobile Engine", + "fit": "kit; construct", + "class": "B", + "effect": "Device duration does not expire while wearer stays still.", + "tradeoff": "Any movement destroys device without Parts return. Unlock: device survives whole boss phase.", + "production": "I/O/V/S: anchored engine, root-clock cue, steady motor." + }, + { + "id": "EQ-310", + "name": "Wandering Engine", + "fit": "kit; construct", + "class": "B", + "effect": "Device follows wearer on every movement and acts after arriving.", + "tradeoff": "Each action reduces its remaining duration. Unlock: move device through all bands.", + "production": "I/O/V/S: legged engine, follow clock cue, quick gears." + }, + { + "id": "EQ-311", + "name": "First-Action Seal", + "fit": "charm; any", + "class": "B", + "effect": "Repeat wearer's first battle action at first phase change against new legal target.", + "tradeoff": "Until phase change, that action tag is unavailable. Unlock: predict first action in 20 battles.", + "production": "I/V/S: sealed opening card, delayed replay cue, wax break." + }, + { + "id": "EQ-312", + "name": "Last-Action Seal", + "fit": "charm; any", + "class": "B", + "effect": "On declared retreat, repeat wearer's last non-damaging action before exit.", + "tradeoff": "Retreat takes one tick longer. Unlock: retreat with all survivors twice.", + "production": "I/V/S: closing card, exit replay cue, low stamp." + }, + { + "id": "EQ-313", + "name": "Neighborless Mantle", + "fit": "garb; any", + "class": "B", + "effect": "With no living neighbor, wearer gains reach and can self-share resources.", + "tradeoff": "Receiving a neighbor removes all stored resource. Unlock: survive alone for ten cadences.", + "production": "I/O/V/S: open-side mantle, lone-band cue, cloth flare." + }, + { + "id": "EQ-314", + "name": "Crowded-Line Tabard", + "fit": "garb; any", + "class": "B", + "effect": "With two neighbors, item triggers can choose either side regardless of facing.", + "tradeoff": "Direct enemy targeting is restricted to foremost. Unlock: win at maximum deployment.", + "production": "I/O/V/S: three-panel tabard, two-side selector, fabric snap." + }, + { + "id": "EQ-315", + "name": "No-Item Oath", + "fit": "charm; any", + "class": "B", + "effect": "Disable all other equipment effects; profession basic gains one alternate legal target rule.", + "tradeoff": "This item occupies the only active equipment hook. Unlock: win one region without item triggers.", + "production": "I/V/S: blank oath medallion, disabled-slot cue, solemn click." + }, + { + "id": "EQ-316", + "name": "Item Chorus Frame", + "fit": "kit; any", + "class": "B", + "effect": "Three different equipped trigger tags in one battle schedule a non-damaging repeat of oldest.", + "tradeoff": "All three items gain cooldown. Unlock: activate eight distinct trigger tags.", + "production": "I/O/V/S: three-hook frame, chorus pips, layered clicks." + }, + { + "id": "EQ-317", + "name": "Exact Collapse Ring", + "fit": "charm; reorder", + "class": "B", + "effect": "Choose whether first allied defeat collapses from front or rear direction.", + "tradeoff": "Choice locks in Prepare and may expose opposite end. Unlock: review 20 collapse causes.", + "production": "I/V/S: split-direction ring, collapse selector, stone slide." + }, + { + "id": "EQ-318", + "name": "Counterfactual Slate", + "fit": "kit; any", + "class": "B", + "effect": "Training replay may swap this item for one cataloged alternative in the saved snapshot.", + "tradeoff": "Replay grants no reward and slate has no live-battle trigger. Unlock: complete ten training comparisons.", + "production": "I/O/V/S: two-column slate, A/B cue, chalk switch." + }, + { + "id": "EQ-319", + "name": "Eight-Region Compass", + "fit": "charm; any", + "class": "B", + "effect": "Choose one mastered region tag; first matching enemy rule Marks its source.", + "tradeoff": "Other region-rule sources prefer wearer. Unlock: clear all eight regions.", + "production": "I/V/S: eight-point compass, chosen motif cue, radial chime." + }, + { + "id": "EQ-320", + "name": "Open Guild Sign", + "fit": "kit; support", + "class": "B", + "effect": "First recruit replacement entering Prepare inherits one saved equipment-target preference from dismissed/dead predecessor.", + "tradeoff": "No item or stats transfer; preference must be legal and is shown before acceptance. Unlock: complete first clear.", + "production": "I/O/V/S: open sign frame, preference handoff cue, wooden sign tone." + } + ], + "artifacts": [ + { + "id": "AR-001", + "name": "Open Ledger", + "rule": "Every shop shows one extra recruit, but equipment offer count is one lower.", + "tradeoff": "Conflicts AR-002; shop header displays exchanged slots before entry.", + "production": "I/V/S: open roster pages, slot exchange cue, page fan." + }, + { + "id": "AR-002", + "name": "Toolwright's Window", + "rule": "Every shop shows one extra equipment item, but recruit offer count is one lower.", + "tradeoff": "Conflicts AR-001; shop header previews composition.", + "production": "I/V/S: tool window icon, reverse slot cue, latch slide." + }, + { + "id": "AR-003", + "name": "Common Cause", + "rule": "First Common recruit of each shop costs one product-defined tier less; Uncommon/Rare costs one tier more.", + "tradeoff": "Conflicts AR-004; every price shows artifact delta.", + "production": "I/V/S: one-notch banner, price arrows, soft stamp." + }, + { + "id": "AR-004", + "name": "Narrow Search", + "rule": "Shops guarantee one Uncommon-or-Rare recruit but suppress one base-profession role weight.", + "tradeoff": "Conflicts AR-003; suppressed role is chosen and visible for the run.", + "production": "I/V/S: narrow lens, rarity/role exchange cue, glass close." + }, + { + "id": "AR-005", + "name": "Second Interview", + "rule": "Once per shop, reject one recruit to generate a new presentation with the same combat record.", + "tradeoff": "Conflicts AR-006; no power reroll, replacement signature is previewed.", + "production": "I/V/S: two portrait frames, locked-rule cue, card slide." + }, + { + "id": "AR-006", + "name": "Fresh Aptitude", + "rule": "Once per shop, reroll one recruit's trait while keeping profession, grades, level, gear, and cost tier.", + "tradeoff": "Conflicts AR-005; old/new benefit and cost compare before acceptance.", + "production": "I/V/S: rotating trait badge, before/after cue, token turn." + }, + { + "id": "AR-007", + "name": "Full Bench", + "rule": "Owned reserve capacity is higher, but every undeployed recruit adds a small shop upkeep tier.", + "tradeoff": "Conflicts AR-008; upkeep total is shown before buying.", + "production": "I/V/S: long bench, reserve-to-cost cue, bench creak." + }, + { + "id": "AR-008", + "name": "Lean Company", + "rule": "Reserve capacity is lower; after a death, next legal recruit is guaranteed within recovery cost tier.", + "tradeoff": "Conflicts AR-007; capacity and guarantee state remain on roster/shop.", + "production": "I/V/S: short bench, vacancy guarantee cue, firm knock." + }, + { + "id": "AR-009", + "name": "Familiar Faces", + "rule": "Profession+trait duplicates may appear in one shop; buying one suppresses that signature for next two shops.", + "tradeoff": "Conflicts AR-010; duplicate warning explains breadth tradeoff.", + "production": "I/V/S: paired silhouettes, suppression clock, double card tap." + }, + { + "id": "AR-010", + "name": "Wide Casting", + "rule": "Each shop must offer distinct base professions while legal, but trait variety protection is disabled.", + "tradeoff": "Conflicts AR-009; repeated-trait risk shown on artifact state.", + "production": "I/V/S: twelve-spoke roster, profession spread cue, radial clicks." + }, + { + "id": "AR-011", + "name": "Narrow Vanguard", + "rule": "Deploy one fewer recruit; foremost starts every battle Guarded and gains forced-target priority.", + "tradeoff": "Conflicts AR-012; capacity loss and threat arrow show in Prepare.", + "production": "I/V/S: narrow shield line, capacity minus cue, shield rise." + }, + { + "id": "AR-012", + "name": "Long Company", + "rule": "Deploy one additional recruit up to core cap; no unit starts with Guard.", + "tradeoff": "Conflicts AR-011; expanded line and unguarded warning appear in preview.", + "production": "I/V/S: extended line icon, capacity plus cue, marching taps." + }, + { + "id": "AR-013", + "name": "Fixed Ends", + "rule": "Foremost and rearmost cannot be moved voluntarily; center swaps have shorter recovery.", + "tradeoff": "Conflicts AR-014; endpoint locks shown on every formation view.", + "production": "I/V/S: pinned end brackets, center arrows, stone pins." + }, + { + "id": "AR-014", + "name": "Rolling Ends", + "rule": "First voluntary endpoint swap each battle is free; center units receive longer movement recovery.", + "tradeoff": "Conflicts AR-013; available swap pip and center cost display.", + "production": "I/V/S: rolling brackets, endpoint exchange cue, wheel click." + }, + { + "id": "AR-015", + "name": "Paired Duties", + "rule": "Prepare partitions line into adjacent pairs; enable and Guard sharing inside pairs gain priority.", + "tradeoff": "Conflicts AR-016; cross-pair sharing is delayed and pair brackets show.", + "production": "I/V/S: paired links, partition cue, paired pluck." + }, + { + "id": "AR-016", + "name": "Open Weave", + "rule": "No pair or neighbor action may repeat the same recipient consecutively; first new recipient gains reach.", + "tradeoff": "Conflicts AR-015; previous recipient marker is always visible.", + "production": "I/V/S: open lattice, recipient trail, thread sweep." + }, + { + "id": "AR-017", + "name": "Front Inheritance", + "rule": "After an allied death, collapse always fills from rear toward front and new foremost inherits position tags.", + "tradeoff": "Conflicts AR-018; pre-battle collapse preview shows direction.", + "production": "I/V/S: forward arrows, tag handoff cue, ordered steps." + }, + { + "id": "AR-018", + "name": "Rear Preservation", + "rule": "After an allied death, collapse always fills from front toward rear and rearmost keeps its indexed position.", + "tradeoff": "Conflicts AR-017; preserved rear pin shows in preview.", + "production": "I/V/S: backward arrows, rear pin cue, reversed steps." + }, + { + "id": "AR-019", + "name": "Empty Place Doctrine", + "rule": "First allied vacancy each battle remains open for one cadence and counts as terrain.", + "tradeoff": "Conflicts AR-020; timer and targeting implications show on gap.", + "production": "I/V/S: hollow line slot, vacancy clock, low wind." + }, + { + "id": "AR-020", + "name": "Immediate Closure", + "rule": "All allied collapse resolves before on-defeat actions; on-defeat benefits resolve after closure.", + "tradeoff": "Conflicts AR-019; result timeline labels reordered hooks.", + "production": "I/V/S: closing brackets, hook-order cue, stone slide." + }, + { + "id": "AR-021", + "name": "First Word", + "rule": "In every battle, allied slowest cadence acts before enemy first basic.", + "tradeoff": "Conflicts AR-022; that ally's second action is delayed and forecast shows both.", + "production": "I/V/S: opening speech mark, order swap cue, clear strike." + }, + { + "id": "AR-022", + "name": "Last Reply", + "rule": "Allies do not gain opening action advances; first enemy major action completed refreshes all allied basics.", + "tradeoff": "Conflicts AR-021; risk window and refresh event are previewed.", + "production": "I/V/S: reply mark, major-to-party cue, answering chord." + }, + { + "id": "AR-023", + "name": "Clean Current", + "rule": "First hindrance applied by either side lasts one tick and cannot be extended.", + "tradeoff": "Conflicts AR-024; source-neutral rule banner names the consumed first tag.", + "production": "I/V/S: clear ring, one-tick cue, water flick." + }, + { + "id": "AR-024", + "name": "Deep Current", + "rule": "First hindrance applied by either side cannot be cleansed before midpoint.", + "tradeoff": "Conflicts AR-023; midpoint lock is explicit on status ring.", + "production": "I/V/S: deep ring, midpoint lock cue, low pulse." + }, + { + "id": "AR-025", + "name": "Honest Screens", + "rule": "All screens block one fewer action but reveal source and next target on block.", + "tradeoff": "Conflicts AR-026; remaining block count and reveal card display.", + "production": "I/V/S: thin screen eye, count-minus cue, glass reveal." + }, + { + "id": "AR-026", + "name": "Opaque Screens", + "rule": "Screens block one additional action; while active they also hide their owner's next target.", + "tradeoff": "Conflicts AR-025; hidden target is declared as artifact cost, never as bug.", + "production": "I/V/S: thick shutter screen, count-plus cue, muffled glass." + }, + { + "id": "AR-027", + "name": "Shared Tempo", + "rule": "At each cadence boundary, fastest allied and enemy basics both wait for their slower neighbor.", + "tradeoff": "Conflicts AR-028; paired clocks show every affected action.", + "production": "I/V/S: joined clocks, wait tethers, synchronized ticks." + }, + { + "id": "AR-028", + "name": "Broken Rhythm", + "rule": "Repeating an action cadence band advances the opposing side's slowest unit.", + "tradeoff": "Conflicts AR-027; repeat counter and recipient are forecast.", + "production": "I/V/S: broken metronome, opponent arrow cue, skipped beat." + }, + { + "id": "AR-029", + "name": "Grounded Contest", + "rule": "Airborne and concealed windows last one tick less for both sides; forced movement effects last one tick longer.", + "tradeoff": "Conflicts AR-030; global duration deltas show on preview tags.", + "production": "I/V/S: ground peg, duration arrows, stake hit." + }, + { + "id": "AR-030", + "name": "Passing Contest", + "rule": "Forced movement resistance is disabled for first attempt on both sides; airborne windows last one tick longer.", + "tradeoff": "Conflicts AR-029; first-attempt marker and flight clock show.", + "production": "I/V/S: passing cloud, movement-open cue, air rush." + }, + { + "id": "AR-031", + "name": "Counter Road", + "rule": "Route preview reveals one future enemy family and offers matching counter equipment after victory.", + "tradeoff": "Conflicts AR-032; reward family replaces a general reward slot.", + "production": "I/V/S/E: fork road with eye, counter preview cue, route bell." + }, + { + "id": "AR-032", + "name": "Unmapped Road", + "rule": "Future enemy identities stay hidden until node commitment; victory grants one extra broad reward choice.", + "tradeoff": "Conflicts AR-031; known mechanic tags and uncertainty class remain visible.", + "production": "I/V/S/E: fogged fork, uncertainty card, distant wind." + }, + { + "id": "AR-033", + "name": "Short March", + "rule": "Each region has one fewer ordinary battle before boss; shops have one fewer offer refresh.", + "tradeoff": "Conflicts AR-034; route length and lost refresh show at selection.", + "production": "I/V/S/E: shortened path, node-minus cue, quick steps." + }, + { + "id": "AR-034", + "name": "Long March", + "rule": "Each region adds one elite-option node and one recovery-option node; boss reward choice count is lower.", + "tradeoff": "Conflicts AR-033; added nodes and boss tradeoff show up front.", + "production": "I/V/S/E: extended path, node-plus cue, measured steps." + }, + { + "id": "AR-035", + "name": "Salvage Charter", + "rule": "Equipment rewards may be converted into two narrower counter-tag choices.", + "tradeoff": "Conflicts AR-036; conversion is explicit and cannot return to original.", + "production": "I/V/S: split tool charter, one-to-two cue, paper tear." + }, + { + "id": "AR-036", + "name": "Whole Goods", + "rule": "Equipment rewards cannot be split or rerolled; unchosen items increase next shop variety.", + "tradeoff": "Conflicts AR-035; variety counter persists on route bar.", + "production": "I/V/S: sealed crate, future-variety cue, lid close." + }, + { + "id": "AR-037", + "name": "Threat Dividend", + "rule": "Choosing an elite route adds one shop discount tier until any recruit dies.", + "tradeoff": "Conflicts AR-038; active/cleared dividend visible on prices.", + "production": "I/V/S: hazard coin, elite-to-price cue, coin ring." + }, + { + "id": "AR-038", + "name": "Safe Reserve", + "rule": "Recovery routes grant one locked low-cost recruit offer; elite rewards contain one fewer choice.", + "tradeoff": "Conflicts AR-037; locked offer and elite choice loss preview together.", + "production": "I/V/S: sheltered card, route-to-recruit cue, card latch." + }, + { + "id": "AR-039", + "name": "Region Memory", + "rule": "Revisited regions keep one previously encountered elite composition visible before route selection.", + "tradeoff": "Conflicts AR-040; remembered composition consumes one scouting option.", + "production": "I/V/S/E: route memory tablet, composition card, echoing map tone." + }, + { + "id": "AR-040", + "name": "New Weather", + "rule": "Revisited regions replace one ordinary composition with a disclosed cross-region pair.", + "tradeoff": "Conflicts AR-039; imported IDs and rules show before commitment.", + "production": "I/V/S/E: crossed weather vane, imported pair cue, mixed ambience sting." + }, + { + "id": "AR-041", + "name": "Open Positions", + "rule": "After a recruit death, next shop guarantees two affordable replacement roles missing from current deployment.", + "tradeoff": "Conflicts AR-042; equipment offers are reduced by one in that shop.", + "production": "I/V/S: two empty cards, role guarantee cue, open book." + }, + { + "id": "AR-042", + "name": "Kept Tools", + "rule": "After a recruit death, one lost equipment counter tag is guaranteed in next shop.", + "tradeoff": "Conflicts AR-041; no replacement-role guarantee is added.", + "production": "I/V/S: held tool outline, tag guarantee cue, tool knock." + }, + { + "id": "AR-043", + "name": "Hard Lesson", + "rule": "A death reveals one extra cause/counter comparison and increases next battle reward quality band.", + "tradeoff": "Conflicts AR-044; reward boost expires on retreat and never revives recruit.", + "production": "I/V/S: split lesson slate, loss-to-reward cue, sober stamp." + }, + { + "id": "AR-044", + "name": "Gentle Return", + "rule": "After any death, next route must include a recovery option and enemies there cannot be elite.", + "tradeoff": "Conflicts AR-043; forced route opportunity cost is previewed.", + "production": "I/V/S/E: sheltered return path, elite-cross cue, low route bell." + }, + { + "id": "AR-045", + "name": "Dismissal Market", + "rule": "Dismissing a living recruit adds their base role weight to next shop twice.", + "tradeoff": "Conflicts AR-046; dismissal yields no additional currency benefit.", + "production": "I/V/S: departing role card, double-weight cue, card slide." + }, + { + "id": "AR-046", + "name": "Long Contracts", + "rule": "Dismissal is disabled; owned recruits cost less to re-equip after a role change.", + "tradeoff": "Conflicts AR-045; disabled action and re-equip delta are always shown.", + "production": "I/V/S: bound roster cord, lock/discount cue, knot tighten." + }, + { + "id": "AR-047", + "name": "Survivor's Account", + "rule": "Each battle with no death adds one recovery credit; a death spends all credits to lower replacement cost tier.", + "tradeoff": "Conflicts AR-048; exact credits and spending preview are persistent.", + "production": "I/V/S: survival tally, credit-to-cost cue, bead count." + }, + { + "id": "AR-048", + "name": "Immediate Aid", + "rule": "No-death streak grants nothing; first death per region instantly creates one affordable recruit offer.", + "tradeoff": "Conflicts AR-047; one-per-region state is explicit.", + "production": "I/V/S: urgent open card, death-to-offer cue, fast bell." + }, + { + "id": "AR-049", + "name": "Shared History", + "rule": "On death, one mastered profession becomes more likely in replacement offers.", + "tradeoff": "Conflicts AR-050; no stats, traits, gear, name, or identity transfer.", + "production": "I/V/S: profession crest trail, offer-weight cue, fading chime." + }, + { + "id": "AR-050", + "name": "Clean Slate Company", + "rule": "Replacement offers ignore dead recruits' professions but guarantee a role not currently deployed.", + "tradeoff": "Conflicts AR-049; missing-role calculation is shown.", + "production": "I/V/S: blank roster slate, missing-role cue, chalk wipe." + }, + { + "id": "AR-051", + "name": "Practice Makes Breadth", + "rule": "Winning with three base professions not used last battle adds one profession-specific equipment choice.", + "tradeoff": "Conflicts AR-052; repeating a profession grants no artifact reward.", + "production": "I/V/S: rotating crests, breadth counter, three-note rise." + }, + { + "id": "AR-052", + "name": "Practice Makes Depth", + "rule": "Winning three battles with unchanged profession set adds one advanced-prerequisite offer.", + "tradeoff": "Conflicts AR-051; changing one profession resets count visibly.", + "production": "I/V/S: stacked crests, depth counter, steady three beats." + }, + { + "id": "AR-053", + "name": "Known Law", + "rule": "Choose one mastered region grammar to suppress from RG-08 ordinary encounters.", + "tradeoff": "Conflicts AR-054; suppressed grammar increases boss reward uncertainty.", + "production": "I/V/S/M: crossed motif seal, suppression cue, removed music stem." + }, + { + "id": "AR-054", + "name": "Full Synthesis", + "rule": "RG-08 ordinary encounters always combine two distinct known grammars; reward choices gain one counter-tag option.", + "tradeoff": "Conflicts AR-053; both grammar IDs show in preview.", + "production": "I/V/S/M: joined motif wheel, dual-rule cue, layered stem sting." + }, + { + "id": "AR-055", + "name": "Visible Adversity", + "rule": "One extra difficulty rule is active, but its exact schedule and targets are always shown.", + "tradeoff": "Conflicts AR-056; reward breadth rises, never base power.", + "production": "I/V/S: open hazard card, schedule cue, clear warning chord." + }, + { + "id": "AR-056", + "name": "Bounded Fog", + "rule": "One enemy target preference per battle is hidden until first action; no extra difficulty rule is added.", + "tradeoff": "Conflicts AR-055; hidden field and reveal condition are declared.", + "production": "I/V/S: one covered reticle, bounded fog cue, muffled click." + }, + { + "id": "AR-057", + "name": "Alternate Crown", + "rule": "Alternate bosses replace first-clear bosses; ordinary region length is shorter.", + "tradeoff": "Conflicts AR-058; boss identity and shortened practice path show at region entry.", + "production": "I/V/S/M: double-crown token, boss-swap cue, alternate motif." + }, + { + "id": "AR-058", + "name": "Complete Circuit", + "rule": "Player must face both bosses in each visited region with a recovery node between.", + "tradeoff": "Conflicts AR-057; second boss reward has fewer choices.", + "production": "I/V/S/M: paired crown path, two-boss schedule, linked boss cadence." + }, + { + "id": "AR-059", + "name": "Final Examination", + "rule": "Training comparisons are disabled during run; first plan divergence each boss grants one extra inspect pause.", + "tradeoff": "Conflicts AR-060; preparation view states no replay access.", + "production": "I/V/S: closed slate/open eye, divergence pause cue, solemn tone." + }, + { + "id": "AR-060", + "name": "Open Workshop", + "rule": "Training comparison is available at each shop; boss inspect does not pause simulation.", + "tradeoff": "Conflicts AR-059; training gives no rewards and time cost is explicit.", + "production": "I/V/S: open slate/clock eye, workshop cue, chalk-and-clock tone." } ], "enemies": [ { - "identity": "EN-O001 Ordinary, Bellgrass Nibbler", - "mechanic": "Bites the ally with most Guard for 45 and removes 8 Guard; if none has Guard, grazes nearest Front for 35. Flees to Rear after two bites.", - "read": "Ears flatten and a small shield icon enters its mouth for 0.9 seconds. Spend Guard elsewhere, Expose it during retreat, or block Rear.", - "progression": "Drops IT-021; CH-01 farm spokes. Allowed: iron-tooth variant removes 12 Guard but moves slower. Not allowed: hidden Guard read or Hush.", - "production": "Low seed-shaped body with oversized jaw, two bite frames and hop retreat; dry grass clip plus wooden shield nibble." + "id": "EN-R1-01", + "name": "Pane Nibbler", + "class": "ordinary", + "rule": "Bites the foremost unit; after two uninterrupted bites, chips Guard from that unit's neighbor.", + "responses": "Reorder the neighbor; interrupt the second bite. Teaches adjacency protection.", + "production": "Third bite becomes a two-target arc. P/A/V/S: low glass-jaw, double-bite ticks, chipped-square cue, brittle clicks." }, - { - "identity": "EN-O002 Ordinary, Gustback Ram", - "mechanic": "Charges the farthest aligned unit for 70 and pushes one band; collision with an occupied band deals 25 to both.", - "read": "Three hoof stamps and a white wedge across the whole lane for 1.2 seconds. Anchor target, vacate collision band, or push ram off alignment.", - "progression": "Drops IT-022; ridge routes. Allowed: tailwind variant charges faster after being moved. Not allowed: turn after charge begins.", - "production": "Broad wool sail and brass horns, exaggerated straight charge; hoof triplet, wind flap, distinct padded collision." + { + "id": "EN-R1-02", + "name": "Gust Finch", + "class": "ordinary", + "rule": "From rear, telegraphs a projectile at the rearmost allied unit and steps forward after firing.", + "responses": "Use projectile screen; pull the shooter into short reach. Tests rear safety.", + "production": "Each blocked shot shortens its next step. P/A/V/S: fork-wing silhouette, perch/loose, feather-arrow cue, wind snap." }, - { - "identity": "EN-O003 Ordinary, Loosewire Wisp", - "mechanic": "Orbits Mid; targets the next Tuned ally, dealing 50 and stealing Tuned. Without a Tuned target it sparks nearest device for 30.", - "read": "Forked line visibly connects to intended Tuned icon for 1 second. Consume Tuned, Hush the theft clause, or intercept with Guard.", - "progression": "Drops IT-023; relay ruins. Allowed: cold-wire variant steals 1 Charge instead. Not allowed: stealing profession resources without an icon.", - "production": "Knotted cable sprite with bright core, no humanoid ghost shape; electrical chirp resolves toward target side and crackles on theft." + { + "id": "EN-R1-03", + "name": "Terrace Ram", + "class": "ordinary", + "rule": "Headwind charge pushes the foremost allied unit one position rearward, targeting foremost only.", + "responses": "Brace against push; leave a durable replacement directly behind. Combines with collapse.", + "production": "Failed push grants it Guard. P/A/V/S: wedge-horn body, paw/charge, chevron lane cue, hoof rumble." }, - { - "identity": "EN-O004 Ordinary, Millhook Raker", - "mechanic": "Hooks the lowest-vitality Rear unit to Mid, then attacks it for 55 on next action. Changes target if it gains Anchored.", - "read": "Hook line draws in three segments for 1.1 seconds; target portrait gets a hook badge. Anchor, cut with Hush, or move target before final segment.", - "progression": "Drops IT-024; mill interior. Allowed: double-hook targets two units but attack power is 35. Not allowed: instant pull.", - "production": "Long wooden armature with sickle hook, windup spool animation; rope ratchet, hook whistle, heavy millboard clack." + { + "id": "EN-R1-04", + "name": "Bellstem Grazer", + "class": "ordinary", + "rule": "Eats the oldest positive tag on the foremost reachable ally instead of dealing damage.", + "responses": "Delay positive tag until after bite; expose an untagged front. Introduces dispel timing.", + "production": "Consumed tag makes next bite reach 2. P/A/V/S: tall stem-antler, sniff/pluck, hollow-plus cue, plucked chime." }, - { - "identity": "EN-O005 Ordinary, Hushwing Moth", - "mechanic": "Dusts the band containing the most armed secondary clauses; applies Hush to up to two units for 4 seconds and deals no damage.", - "read": "Wings close, broken-line ring appears over chosen band for 1.4 seconds. Spread clauses, interrupt with focused hit, or let basic actions proceed.", - "progression": "Drops IT-025; dusk encounters. Allowed: pale variant targets most resources instead. Not allowed: invisible Hush or band change after tell.", - "production": "Wide triangular wings with broken music-line pattern; fold/open authored pose, papery flutter and damped bell cutoff." + { + "id": "EN-R1-05", + "name": "Shardback", + "class": "ordinary", + "rule": "Reflects the first projectile each cadence to its source; reflection is previewed and cannot chain.", + "responses": "Use melee/spell first; spend a low-value projectile to open the screen.", + "production": "At half vitality, screen resets once. P/A/V/S: faceted shell, flare/turn, mirrored arrow cue, glass ping." }, - { - "identity": "EN-O006 Ordinary, Relay Tick", - "mechanic": "Attaches to the unit whose next active skill is soonest; while attached adds 1 second to that skill every 2 seconds, max 3. Dies after host is moved.", - "read": "Red bracket crawls from tick to target over 0.8 seconds. Move host, use Fallback, or kill before attachment.", - "progression": "Drops IT-026; broken signal towers. Allowed: armored shell takes one extra hit. Not allowed: attach to untargetable unit or boss-style immunity.", - "production": "Tiny six-legged insulator, readable red clamp; quick crawl and pop-off frames, ceramic ticks accelerating with each delay." + { + "id": "EN-R1-06", + "name": "Verge Stalker", + "class": "ordinary", + "rule": "Targets the first ally with reach greater than 1; otherwise attacks foremost.", + "responses": "Equip short reach; Guard the identified long-reach unit. Teaches target-filter preview.", + "production": "Marked target becomes Exposed after two hits. P/A/V/S: long forelegs, scan/pounce, reach-ruler cue, scrape/hiss." }, - { - "identity": "EN-O007 Ordinary, Grainplate Beetle", - "mechanic": "Faces Front with 35 Guard; attacks nearest for 40. When pushed, shell opens and it becomes Exposed but counterattacks pusher for 30.", - "read": "Shell seam glows and forelegs brace for 0.7 seconds before counter. Push with ranged controller, absorb counter, then focus opening.", - "progression": "Drops IT-027; granary cellars. Allowed: barley shell grants 45 Guard and slower attack. Not allowed: no-opening immovable version.", - "production": "Domed grain-sack carapace, clear closed/open silhouettes; seed rattle, shield scrape, soft shell hinge." + { + "id": "EN-R1-07", + "name": "Whistle Midge", + "class": "ordinary", + "rule": "A swarm delays the next action of whichever allied band contains the most units.", + "responses": "Balance band occupancy; cleanse the visible delay. Interacts with order bands.", + "production": "Repeats on a band only after another band is hit. P/A/V/S: triangular swarm, orbit/dive, band-bracket cue, filtered whistle." }, - { - "identity": "EN-E001 Elite, Crosswind Jackal", - "mechanic": "Every 5 seconds circles to the mirrored band and Marks the last unit that targeted it; lunges for 95 at that unit. Gains 20 stability if two consecutive attacks share a tag.", - "read": "Tail vane points to destination, then a striped target line persists 1.3 seconds. Vary tags, Anchor destination, or decoy the lunge.", - "progression": "Drops IT-012; high ridge hunt. Allowed in Second Weave: clockwise route becomes counterclockwise. Not allowed: untelegraphed destination or tag immunity.", - "production": "Lean canine made of kite cloth and bone spars; circling smear uses solid destination ghost; wind yelp, frame creak, sharp landing snap." + { + "id": "EN-R1-08", + "name": "Glassroot Sprout", + "class": "ordinary", + "rule": "Starts as a rear footprint and grows one position forward each cadence; on reaching front, shields all enemies behind it.", + "responses": "Defeat it early at range; push it backward before growth.", + "production": "Growth cannot be interrupted twice consecutively. P/A/V/S: staged crystal plant, three growth poses, numbered sprout cue, rising cracks." }, - { - "identity": "EN-E002 Elite, Silent Tollman", - "mechanic": "Raises a bell that Hushes all secondary clauses in one band, then strikes Hushed units for 80. Targets band with most queued actives.", - "read": "Bell has no ring but emits a high-contrast broken circle for 1.6 seconds and controller vibration pattern. Spread, cleanse Hush, or Break during lift.", - "progression": "Drops IT-013; tower approach. Allowed: delayed echo strike. Not allowed: audio-only telegraph or global Hush.", - "production": "Empty coat around a stone clapper, clearly nonhuman; slow bell lift, visual vibration lines, low air displacement plus accessible haptic cue spec." + { + "id": "EN-R1-09", + "name": "Crosswind Scribe", + "class": "ordinary", + "rule": "Draws a line between allied foremost and rearmost; next swap crossing the line becomes Hindered.", + "responses": "Avoid swapping that cadence; cleanse then use movement anyway.", + "production": "Uncrossed line converts to a weak area hit. P/A/V/S: kite-robed caster, draw/release, dotted span cue, chalk-wind stroke." }, - { - "identity": "EN-E003 Elite, Broken Vane Colossus", - "mechanic": "Rotates a 50-Guard face toward the band that last dealt damage; other bands are Exposed attack surfaces. Sweeps faced band for 85.", - "read": "Four-step gear rotation and broad rectangular sweep tell for 1.5 seconds. Alternate attacking bands, use piercing alignment, Break during rotation.", - "progression": "Drops IT-014; windmill core. Allowed: faster face but 35 Guard. Not allowed: simultaneous all-face Guard.", - "production": "Top-heavy vane golem with three numbered faces; full-body quarter turns, gear count clicks and deep wooden sweep." + { + "id": "EN-R1-10", + "name": "Ledge Hopper", + "class": "ordinary", + "rule": "Leaps over its own foremost neighbor to become front, then strikes the first ally whose target changed.", + "responses": "Hold targets stable; intercept the announced leap strike.", + "production": "If no target changed, Hopper becomes Exposed. P/A/V/S: spring-legged silhouette, vault/stab, target-turn cue, stone tap." }, - { - "identity": "EN-S001 Sub-boss, Windlass Matron", - "mechanic": "Deploys two EN-O006, then reels the farthest ally one band every 3 seconds. Each prevented reel costs 30 stability; at 0 stability her cage opens for 6 seconds.", - "read": "Two visible cables and a 1.8-second crank tell; cable order is numbered. Anchor one target, move the other, and destroy ticks between reels.", - "progression": "Drops IT-015; optional bell-foundry spur. Allowed Second Weave: cable order reverses. Not allowed: more than two active cables or hidden target swap.", - "production": "Towering spool-insect with basket thorax, open-cage Break pose; layered ratchet rhythm, two pitched cable strains, loud release latch." + { + "id": "EN-R1-11", + "name": "Gale Bailiff", + "class": "elite", + "rule": "Declares Stand Order on one indexed allied position; leaving it causes a line-wide push, remaining causes focused projectiles.", + "responses": "Choose a braced occupant; deliberately leave before ranged wind-up and absorb push.", + "production": "Alternates ordered index front/rear. P/A/V/S: tall banner coat, point/stamp, numbered pennant cue, gavel-gust event." }, - { - "identity": "EN-B001 Boss, Toll-Eater", - "mechanic": "Phase 1 devours timing pulses, delaying the most repeated allied tag by 1 second. Phase 2 charges across bands and gains 40 stability whenever a push succeeds. Phase 3 exposes its bell-core only after two forced moves are prevented by different allies.", - "read": "Repeated-tag icon appears 2 seconds before delay; charge uses full wedge and hoof count; core opening has a gold fracture ring. Vary tags, Anchor separate allies, then spend Break window.", - "progression": "Drops IT-016; CH-01 finale. Second Weave may add clinic or tower hazard from prior choice. Never hide repeated-tag read, require one profession, or shorten charge tell.", - "production": "Massive grazing beast with hollow bell ribcage, three phase silhouettes and authored collapse/recovery; sub-bass toll gains audible overtones as core opens, with non-audio pulse meter." + { + "id": "EN-R1-12", + "name": "Prism Ox", + "class": "elite", + "rule": "Occupies two enemy footprints; frontal damage rotates its prism, changing whether it screens projectiles, spells, or pushes.", + "responses": "Rotate with a cheap legal hit; attack through the currently unscreened family.", + "production": "At low vitality rotation occurs every hit. P/A/V/S: two-footprint ox, heavy pivot, three-shape prism cue, bass glass rotation." }, - { - "identity": "EN-O008 Ordinary, Whisper Reedling", - "mechanic": "Records the first secondary clause used, then repeats it at 40% for its allies. If Hushed before recording, attacks nearest for 35 instead.", - "read": "Its hollow stem displays the copied icon for 1.2 seconds before playback. Feed a weak clause, Hush, or defeat during inhale.", - "progression": "Drops IT-061; testimony channels. Allowed: records target rule instead of effect. Not allowed: copy ultimates, Echoes, or hidden source.", - "production": "Three-legged reed bundle with icon chamber; inflate/playback poses, reedy sample transformed enough to remain distinct from ally audio." + { + "id": "EN-R2-01", + "name": "Reed Hook", + "class": "ordinary", + "rule": "Pulls the rearmost allied unit one step forward, then attacks its new neighbor.", + "responses": "Brace/pull resist; place a durable unit at rear. Extends displacement lesson.", + "production": "Successful pull leaves a one-tick snare. P/A/V/S: hook-beak reed body, cast/haul, hooked-water cue, rope-wet snap." }, { - "identity": "EN-O009 Ordinary, Silt Lurker", - "mechanic": "Buries under least occupied band and erupts 3 seconds later for 70, applying Drift outward. It cannot retarget after burying.", - "read": "Mud ring slowly fills with three raised segments. Move away, Anchor to ignore Drift, or force another enemy into ring.", - "progression": "Drops IT-062; low-water paths. Allowed: larger ring and 4-second tell. Not allowed: invisible ring under terrain.", - "production": "Flat mud silhouette with bright eye stones, clean eruption column; wet suction, three bubble ticks, blunt splash." + "id": "EN-R2-02", + "name": "Mudlamp Leech", + "class": "ordinary", + "rule": "Attaches to lowest-vitality ally in reach 2 and converts incoming healing into its own Guard until removed by damage.", + "responses": "Hit the leech before healing; cleanse attachment then restore.", + "production": "At full Guard it detaches and moves rearward. P/A/V/S: glowing leech, latch/swell/drop, crossed-heal cue, wet pulse." }, { - "identity": "EN-O010 Ordinary, Lantern Leech", - "mechanic": "Attaches to ally with most profession resource, draining 1 every 2 seconds and glowing brighter; at 3 drained it bursts for 80. Moving bands detaches it but leaves one resource lost.", - "read": "Bracket line shows target and three body bulbs fill. Spend resource, move, or kill before third bulb.", - "progression": "Drops IT-063; ferry undersides. Allowed: drains Charge instead of profession resource. Not allowed: drain below zero or target without displayed value.", - "production": "Translucent slug with three lantern sacs, elastic detach; glassy suck ticks and bright pop warning." + "id": "EN-R2-03", + "name": "Silt Mimic", + "class": "ordinary", + "rule": "Copies the last allied basic target rule, not its damage, and attacks the mirrored legal candidate.", + "responses": "Feed it a harmless target rule; change party order so copied candidate is guarded.", + "production": "Two identical copied rules grant it speed. P/A/V/S: mud double, trace/strike, mirrored reticle cue, muffled copy hit." }, { - "identity": "EN-O011 Ordinary, Ferry Knotter", - "mechanic": "Links two enemies; 30% damage to one redirects to the other until they occupy different bands. Retargets only after link ends.", - "read": "Thick bracket tether appears over 1 second with destination arrows. Move one enemy, sever link, or use area damage deliberately.", - "progression": "Drops IT-064; ropewalks. Allowed: links self to ally with 20 Guard. Not allowed: link boss or hide redirect amount.", - "production": "Animated knot of wet rope with hook feet; tether physically sags, rope strain and knot cinch." + "id": "EN-R2-04", + "name": "Bank Tortoise", + "class": "ordinary", + "rule": "Marks its current indexed position; push or pull across that index creates a slowing mud patch.", + "responses": "Avoid displacement across mark; trigger it early then route around the known patch.", + "production": "Second crossing expands patch to neighbors. P/A/V/S: flat bank shell, stamp/tuck, muddy index cue, suction thud." }, { - "identity": "EN-O012 Ordinary, Glassbill Heron", - "mechanic": "Waits in Rear, then pierces the lowest-Guard aligned unit and one unit behind for 60 each. Changes alignment only between attacks.", - "read": "Beak reflects a straight two-target line for 1.3 seconds. Offset formation, add Guard, or pull it forward.", - "progression": "Drops IT-065; open pools. Allowed: moonbill targets highest Guard for 45. Not allowed: curved or cross-band pierce after tell.", - "production": "Tall clear beak and folded body, spear-neck strike; glass scrape rising to clean water knock." + "id": "EN-R2-05", + "name": "Fen Piper", + "class": "ordinary", + "rule": "Sound wind-up commands the foremost enemy to step back, changing enemy order before allies resolve.", + "responses": "Interrupt sound; reserve actions with flexible retarget.", + "production": "Each successful command adds one farther enemy. P/A/V/S: reed-mask piper, inhale/play, wave-arrow cue, captioned reed call." }, { - "identity": "EN-O013 Ordinary, Floodcap Hopper", - "mechanic": "Jumps onto a band and raises its water for 6 seconds; units entering gain Drift and skills cost 1 extra resource. Only one flooded band per hopper.", - "read": "Cap fills blue and landing band shows dotted ring for 1 second. Push before jump, avoid band, or cleanse with Current skills.", - "progression": "Drops IT-066; flood-control nodes. Allowed: shorter 4-second flood plus 35 landing damage. Not allowed: multiple simultaneous bands.", - "production": "Round mushroom-frog silhouette, squash jump and floating cap; hollow croak, water rise loop with clear end drain." + "id": "EN-R2-06", + "name": "Brackwater Wisp", + "class": "ordinary", + "rule": "Applies a hindrance that becomes stronger if cleansed before half its duration.", + "responses": "Let it expire under protection; cleanse only after the midpoint notch.", + "production": "Reapplication targets a different band. P/A/V/S: droplet light, tag/fade, split-duration ring, damp fizz." }, { - "identity": "EN-O014 Ordinary, Mute Eel", - "mechanic": "Swims between bands through flooded terrain; shocks the ally with most queued secondary clauses for 45 and Hush. Without flooded terrain it flops slowly in Front.", - "read": "A broken zigzag traces water path for 0.9 seconds. Remove flood, spread clauses, or Anchor target outside water.", - "progression": "Drops IT-067; deep channels. Allowed: shock two units for 25. Not allowed: teleport outside flooded terrain.", - "production": "Ribbon eel with black sound-notches, path-aligned swim; damp electric snap and audible dry flop state." + "id": "EN-R2-07", + "name": "Ferry Crab", + "class": "ordinary", + "rule": "Side-steps from enemy front to rear after being hit, then targets the attacker through allies.", + "responses": "Use line reach to finish; alternate low-impact attackers behind Guard.", + "production": "Stops moving when Hindered. P/A/V/S: wide ferry shell, scuttle/claw, attacker tether cue, shell clack." }, { - "identity": "EN-E004 Elite, Testimony Swarm", - "mechanic": "Three voice motes each record damage, healing, or movement. After all record, swarm plays them in reverse order against opposing targets. Destroying a mote removes its clause and 35 stability.", - "read": "Three labeled icons and a 2-second numbered playback rail. Feed harmless examples, Hush one mote, or focus the dangerous recorder.", - "progression": "Drops IT-052; sealed cache route. Allowed: reorder 1-3-2. Not allowed: unlabeled motes or copying boss actions.", - "production": "Three distinct glyph-motes around reed mask, persistent numbering; separate vocal textures replaced by instrument-like formants, not intelligible stolen speech." + "id": "EN-R2-08", + "name": "Drownseed Pod", + "class": "ordinary", + "rule": "On defeat, places a visible seed at the defeating ally's position; after two cadences it bursts unless that ally moves.", + "responses": "Plan a safe move after defeat; delay killing until movement is ready.", + "production": "Burst pulls both neighbors toward seed. P/A/V/S: buoy pod, swell/burst, seed countdown cue, bubble pop/bass pull." }, { - "identity": "EN-E005 Elite, Fen Bailiff", - "mechanic": "Places a seizure mark on the ally with most buffs; after 2 seconds removes oldest two buffs and converts each to 25 Guard for itself.", - "read": "Two stamp icons descend in order with 1.5-second warning. Spend/overwrite buffs, sever mark, or Break during second stamp.", - "progression": "Drops IT-053; private-ferry checkpoint. Allowed: takes one buff but gains 45 Guard. Not allowed: seize unremovable profession passives.", - "production": "Stilt-legged docket construct with seal hands; deliberate stamp windup, wet wood knock and paper seal tear." + "id": "EN-R2-09", + "name": "Mire Medic", + "class": "ordinary", + "rule": "Restores the enemy with the oldest hindrance, but each heal shortens that hindrance.", + "responses": "Focus the medic; use short hindrances so its heal removes setup.", + "production": "With no hindered ally, attacks allied healer. P/A/V/S: reed satchel, scoop/pour, shrinking-ring cue, gourd splash." }, { - "identity": "EN-E006 Elite, Undertow Loom", - "mechanic": "Weaves two water lanes that swap their occupants after 4 seconds, then blasts newly occupied bands for 70. Loses 20 stability per unit that leaves a lane early.", - "read": "Crossed blue rails fill from ends for 2 seconds. Exit lanes, Anchor, or exploit swap to reposition enemies.", - "progression": "Drops IT-054; filter-house basement. Allowed: parallel lanes pull inward instead. Not allowed: rail changes after fill begins.", - "production": "Loom frame riding on reeds, thick readable water ribbons; shuttle rhythm, rising cross-pan wash, strong completion clap." + "id": "EN-R2-10", + "name": "Fogjaw", + "class": "ordinary", + "rule": "Cannot be targeted beyond reach 1 until it attacks; its attack reveals it for one cadence and targets center band.", + "responses": "Hold a short-reach counter; expose a guarded center target to bait reveal.", + "production": "At half vitality reveal window shortens one tick. P/A/V/S: fog-maw silhouette, emerge/bite, open-eye cue, muffled-to-clear snap." }, { - "identity": "EN-S002 Sub-boss, Drowned Recorder", - "mechanic": "Selects three actions from prior segment's combat log and stages visible 50% replays. Each player response different from the original removes 40 stability; repeating the original grants it 20 Guard.", - "read": "A three-card timeline previews source, target, and countdown for 3 seconds. Change formation, target, or tag on each replay.", - "progression": "Drops IT-055; optional sunken archive. Allowed Second Weave: selects from current phase. Not allowed: unavailable log, hidden action, or more than three cards.", - "production": "Barnacled recording cabinet with rotating glass drums; spectral actions remain outline-only, archival crank and reversed-but-nonverbal motifs." + "id": "EN-R2-11", + "name": "Channel Widow", + "class": "elite", + "rule": "Threads two allied positions; healing either transfers the same amount as damage to the other until thread is cut by swapping them adjacent.", + "responses": "Perform the disclosed swap; stagger healing until one target is safe.", + "production": "Recasts on farthest pair after break. P/A/V/S: long-legged reed frame, thread/cinch, paired droplet cue, taut fiber tone." }, { - "identity": "EN-B002 Boss, Mire Cantor", - "mechanic": "Phase 1 stores the secondary clause of every third player skill. Phase 2 replays two stored clauses on hostile targets while rising water restricts one band. Phase 3 can be Broken by resolving three actives with different timing classes before its refrain ends.", - "read": "Counter rail visibly marks every third skill; stored icons sit above boss; 6-second refrain shows three timing slots. Feed safe clauses, cleanse Hush, vary instant/delayed/channeled actions.", - "progression": "Drops IT-056; CH-02 finale. Second Weave may add communal-filter or private-ferry lane rule. Never store passives, obscure stored icons, or require audio timing.", - "production": "Towering reed-organ amphibian with three throat chambers, water-level phase silhouettes; layered reed chords with visual metronome and haptic downbeat." + "id": "EN-R2-12", + "name": "Sluice Elder", + "class": "elite", + "rule": "Moves the region safe index frontward each cadence; units outside it gain Wet, and three Wet causes a pull.", + "responses": "Reorder with the moving safe index; cleanse Wet before third stack.", + "production": "Below half vitality safe index reverses direction. P/A/V/S: gate-backed elder, valve walk, numbered waterline cue, gate groan." }, { - "identity": "EN-O015 Ordinary, Ash-Quota Drone", - "mechanic": "Marks the ally that spent most resource this cycle; next shot deals 45 plus 20 per resource spent. Resets its ledger after shot.", - "read": "Abacus lights count exact bonus for 1.2 seconds. Alternate spenders, use zero-cost skill, or Guard marked ally.", - "progression": "Drops IT-101; quota gates. Allowed: counts Heat added instead. Not allowed: count hidden or prior encounters.", - "production": "Floating abacus furnace with one eye slot; bead-count animation, charcoal clicks and dry bolt." + "id": "EN-R3-01", + "name": "Cinder Tick", + "class": "ordinary", + "rule": "Attaches to the ally whose equipment triggered most recently and lengthens that item's cooldown.", + "responses": "Trigger a disposable item to bait; remove attachment before key proc.", + "production": "Detaching deals a small area burst. P/A/V/S: ember tick, leap/clamp, item-clock cue, metal tick/hiss." }, { - "identity": "EN-O016 Ordinary, Crucible Mite", - "mechanic": "Clings to allied device or zone source, adding 1 Heat/cost when it triggers; falls off after source is moved or recalled.", - "read": "Orange clamp bracket and visible plus-one icon. Recall, move source, or target mite directly.", - "progression": "Drops IT-102; workshop floors. Allowed: armored while attached. Not allowed: untargetable attachment.", - "production": "Coal-black beetle with ceramic pincers, hot glow at clamp; tiny tongs click and kettle hiss." + "id": "EN-R3-02", + "name": "Kiln Porter", + "class": "ordinary", + "rule": "Carries a hot vessel toward enemy front; on arrival, throws at allied front and leaves a hazard at that index.", + "responses": "Push porter back; defeat it while vessel is over an empty enemy index.", + "production": "Each push raises vessel countdown speed. P/A/V/S: vessel carrier, stagger/throw, heat-number cue, ceramic rattle." }, { - "identity": "EN-O017 Ordinary, Slagback Hauler", - "mechanic": "Pushes the nearest unit one band, leaving a 5-second slag patch that slows 25%. If push fails, self becomes Exposed.", - "read": "Low shovel wedge and bubbling destination patch for 1 second. Anchor, sidestep, or pull hauler onto its own slag.", - "progression": "Drops IT-103; slag channels. Allowed: larger slow patch, no damage. Not allowed: patch hidden by VFX.", - "production": "Broad cart-backed construct, shovel shove; viscous scrape and heavy cartwheel thunk." + "id": "EN-R3-03", + "name": "Glaze Hound", + "class": "ordinary", + "rule": "Targets the ally with the most active positive tags; hit seals one tag so it cannot refresh until expiry.", + "responses": "Spread positive tags; Guard the previewed target and accept a harmless seal.", + "production": "Three sealed tags grant Hound a second bite. P/A/V/S: glossy hound, sniff/lunge, wax-seal cue, glazed scrape." }, { - "identity": "EN-O018 Ordinary, Coinflame Sprite", - "mechanic": "Targets ally holding most unused resource, dealing 55 and converting 1 resource to enemy Guard. If all empty, attacks mint object instead.", - "read": "Coin outline appears above target and flips three times. Spend resource, Hush conversion, or bait with defender.", - "progression": "Drops IT-104; mint route. Allowed: targets most Charges. Not allowed: steal permanent currency.", - "production": "Flat flame around spinning blank coin, no face; metallic flips and brief flame intake." + "id": "EN-R3-04", + "name": "Draft Scamp", + "class": "ordinary", + "rule": "Opens a vent that advances every slow wind-up, allied and enemy, at its position.", + "responses": "Move desired caster into index; destroy vent before enemy major cast.", + "production": "Second vent opens behind it if first survives. P/A/V/S: soot mechanic, crank/fan, double-arrow clock cue, vent rush." }, { - "identity": "EN-O019 Ordinary, Pressure Widow", - "mechanic": "Plants a mine in least occupied band; it arms after 2 seconds and detonates for 75 when a resource is spent there. One mine active.", - "read": "Three-spoke pressure plate and numbered arming lights. Move, trigger with cheap protected action, or destroy mine.", - "progression": "Drops IT-105; lift shafts. Allowed: mine triggers on movement instead. Not allowed: invisible or instant arm.", - "production": "Long pipe legs and gauge abdomen, clear plate placement; spring ticks and pressure pop." + "id": "EN-R3-05", + "name": "Clinker Shell", + "class": "ordinary", + "rule": "Drops brittle armor when hit by three different action tags; same-tag hits harden it.", + "responses": "Diversify attacks; use same tag deliberately to delay defeat timing.", + "production": "Hardened state reflects pushes. P/A/V/S: clinker plates, chip/set, three-tool cue, ceramic knocks." }, { - "identity": "EN-O020 Ordinary, Chimney Skater", - "mechanic": "Traverses Rear to Front, leaving soot that Hushes the next secondary clause used in each crossed band. Reverses after reaching edge.", - "read": "Soot trail shows one broken-line charge per band. Wait it out, cleanse, or force direction early.", - "progression": "Drops IT-106; chimney walks. Allowed: trail Exposes instead of Hushes. Not allowed: both effects.", - "production": "Flat heat-resistant lizard with chimney sail; quick wall-run frames, brush scrape and cough-free soot poof." + "id": "EN-R3-06", + "name": "Spark Clerk", + "class": "ordinary", + "rule": "Tallies local-resource gains; after the third gain on one ally, steals the next gain and gives it to enemy rear.", + "responses": "Space resource gains; spend/disable before third.", + "production": "Tally moves to new ally after theft. P/A/V/S: ledger imp, mark/snatch, three-box cue, pencil spark." }, { - "identity": "EN-O021 Ordinary, Foundry Refrain", - "mechanic": "Repeats its last hammer action, gaining 20 power each repeat; changing target resets bonus. Always targets highest Guard.", - "read": "Hammer head displays repeat count and impact lane 0.9 seconds early. Redirect target, Hush bonus, or interrupt growing chain.", - "progression": "Drops IT-107; assembly halls. Allowed: alternating two targets with smaller gain. Not allowed: uncapped bonus beyond 3.", - "production": "Self-operating double hammer, red count rings; escalating anvil pitches with capped third tone." + "id": "EN-R3-07", + "name": "Furnace Kite", + "class": "ordinary", + "rule": "Airborne during allied basics, lands during equipment triggers and major actions.", + "responses": "Use equipment/major action while landed; delay basics to preserve legal target.", + "production": "Landing hit damages its enemy neighbors. P/A/V/S: ember kite, lift/dive, ground-window cue, canvas flare." }, { - "identity": "EN-E007 Elite, Mint Sentinel", - "mechanic": "Opens with 60 Guard and mirrors the party's most spent resource as a three-segment armor. Each different allied resource used removes one segment and 25 stability.", - "read": "Armor segments carry resource icons for full phase. Vary profession resources; use basic attacks only to survive.", - "progression": "Drops IT-092; mint vault. Allowed: selects least-spent resource in Second Weave. Not allowed: resource icon not present in party.", - "production": "Tall coin-press automaton, three removable chest shutters; stamping pulse and each segment cracks at separate pitch." + "id": "EN-R3-08", + "name": "Ashen Riveter", + "class": "ordinary", + "rule": "Marks two adjacent enemies with a metal link; damage to either grants the other Guard until link is interrupted.", + "responses": "Area-hit both simultaneously; pull them apart to break link.", + "production": "Repairs link once at half vitality. P/A/V/S: rivet arms, hammer/link, paired-plate cue, ringing rivets." }, { - "identity": "EN-E008 Elite, Strikebreaker Engine", - "mechanic": "Charges the band containing most allied zones/devices, destroying one and gaining 30 stability. If no object exists, it stalls and becomes Exposed.", - "read": "Toothed wedge locks onto object for 1.6 seconds. Recall, move, decoy with low-value device, or Anchor its path.", - "progression": "Drops IT-093; strike-line defense. Allowed: targets highest-duration object. Not allowed: destroy more than one per charge.", - "production": "Wedge-front tracked machine with official seal scraped off; chain drive, siren shown visually and audibly, crushing clamp." + "id": "EN-R3-09", + "name": "Pressure Newt", + "class": "ordinary", + "rule": "Stores damage during its wind-up and releases a fraction as line-wide heat; interrupting releases it early but weaker.", + "responses": "Interrupt early; pause damage during storage then burst after release.", + "production": "Storage cap rises each cycle. P/A/V/S: gauge-backed newt, inflate/vent, filling gauge cue, pressure whine." }, { - "identity": "EN-E009 Elite, Redline Crucible", - "mechanic": "Heat meter rises whenever either side spends resource; at 8 releases 120 band blast and resets. Venting, Hush, or zero-cost actions lower/freeze it.", - "read": "Huge shared eight-notch gauge fills centrally; blast band chosen at notch 6. Control spend timing and exit chosen band.", - "progression": "Drops IT-094; overpressure chamber. Allowed: threshold 6 with 90 blast. Not allowed: hidden gauge or target after notch 6.", - "production": "Walking crucible with public gauge, molten slit widens; eight percussive ticks and full-pressure roar with reduced-flash option." + "id": "EN-R3-10", + "name": "Toolmagnet", + "class": "ordinary", + "rule": "Pulls the allied unit with the most cooldown-ready equipment one step forward and disables one item for a cadence.", + "responses": "Put ready gear on front holder; trigger key gear before the pull.", + "production": "Disabled item type becomes its temporary screen. P/A/V/S: magnet limbs, point/pull, tool silhouette cue, magnetic clank." }, { - "identity": "EN-S003 Sub-boss, Debt Kiln", - "mechanic": "Assigns three visible debt tokens to resources spent. At 5 seconds, each token either deals 35 or is paid by spending a different resource type; every successful cross-payment removes 35 stability.", - "read": "Token lines connect debtor to acceptable alternate icons for 2 seconds. Build varied party, pace spending, or Break one token with intervention.", - "progression": "Drops IT-095; optional abandoned ledger kiln. Allowed: four smaller tokens in Second Weave. Not allowed: demand unavailable resource.", - "production": "Circular kiln with receipt ribbons, tokens physically orbit targets; paper crackle, furnace inhale, clear paid chime." + "id": "EN-R3-11", + "name": "Master Stoker", + "class": "elite", + "rule": "Assigns hot/cold states to alternating enemy positions; striking wrong state changes the target's next action into a burst.", + "responses": "Follow disclosed action-state match; reorder enemies to move state with position.", + "production": "Pattern reverses after an interrupt. P/A/V/S: forked stoker, stamp/fan, black-white shape pattern, alternating furnace beats." }, { - "identity": "EN-B003 Boss, Furnace Regent", - "mechanic": "Phase 1 levies Heat on repeated resource types. Phase 2 rotates furnace vents across bands; using the opposite resource class opens a vent and removes stability. Phase 3 overclocks, but alternating physical, magical, support tags creates successive 4-second openings.", - "read": "Tax icons and exact thresholds remain on UI; vents show element shape and destination for 2 seconds; phase 3 has a three-slot alternation rail.", - "progression": "Drops IT-096; CH-03 finale. Second Weave adds mint or worker-furnace debt clause. Never demand unavailable tags, hide Heat, or make vent damage unavoidable.", - "production": "Ceremonial foundry engine with crown-shaped exhaust, removable authority plates per phase; industrial rhythm changes meter when alternation succeeds." + "id": "EN-R3-12", + "name": "Walking Crucible", + "class": "elite", + "rule": "Occupies two footprints and builds Pressure from every action in battle; player may vent it by hitting a shown weak side, but vent pushes allied front.", + "responses": "Schedule weak-side hits with brace; race damage before cap.", + "production": "Below half vitality weak side swaps each cadence. P/A/V/S: two-foot crucible, lumber/vent, side-arrow gauge, deep boil/vent blast." }, { - "identity": "EN-O022 Ordinary, Margin Midge", - "mechanic": "Eats the shortest-duration buff from the nearest unit and becomes Tuned; if none, deals 35.", - "read": "Tiny buff icon moves into proboscis over 0.8 seconds. Spend short buff, Hush theft, or target before feeding.", - "progression": "Drops IT-141; annotated paths. Allowed: eats longest buff but moves slowly. Not allowed: remove unremovable passive.", - "production": "Oversized paper-wing gnat with icon-visible abdomen; page flutter and nib scratch." + "id": "EN-R4-01", + "name": "Margin Moth", + "class": "ordinary", + "rule": "Copies the last equipment trigger at reduced effect for the enemy side, using same legal target class.", + "responses": "Feed a harmless trigger; defeat before valuable proc.", + "production": "Copy gains full timing after three different triggers. P/A/V/S: page-wing moth, trace/flutter, copied-item outline, paper flick." }, { - "identity": "EN-O023 Ordinary, Footnote Vine", - "mechanic": "Roots in a band and Echoes the first movement skill used there at 40% on nearest enemy or ally according to original target side.", - "read": "Leaf displays source arrow and 1-second echo delay. Feed safe movement, change band, or prune vine.", - "progression": "Drops IT-142; charter groves. Allowed: Echo first Guard skill. Not allowed: chain Echo or boss skill.", - "production": "Curling vine shaped like bracket, source-colored outline; leaf rustle and softened copy cue." + "id": "EN-R4-02", + "name": "Root Indexer", + "class": "ordinary", + "rule": "Labels allied positions A/B/C; its attack cycles to the next occupied label regardless of movement.", + "responses": "Move a guard into next label; eliminate before cycle reaches fragile band.", + "production": "Empty label advances twice. P/A/V/S: root pointer, label/stab, letter-shape tabs, wooden tick." }, { - "identity": "EN-O024 Ordinary, Inkjaw Weevil", - "mechanic": "Bites the unit repeating the same action tag twice, dealing 85; otherwise nibbles Front for 30.", - "read": "A two-box repeat tracker appears above every unit, then jaw line for 0.9 seconds. Vary tags or Guard deliberate bait.", - "progression": "Drops IT-143; scriptorium nests. Allowed: tracks same target rather than tag. Not allowed: count basic and active as identical without icon.", - "production": "Black lacquer beetle with square jaws; stamp-like tracker and double paper punch." + "id": "EN-R4-03", + "name": "Erasure Slug", + "class": "ordinary", + "rule": "Removes the newest Mark or Hindered tag from enemy team and leaves an ink patch at source position.", + "responses": "Apply expendable tag last; use raw damage while it is ready.", + "production": "Ink patch shortens future tag duration there. P/A/V/S: white slug, wipe/trail, erased-ring cue, wet page scrape." }, { - "identity": "EN-O025 Ordinary, Charter Crane", - "mechanic": "Writes a 5-second rule ring: units inside cannot gain Tuned; crane targets band with most casters. Ring ends if crane moves.", - "read": "Beak traces complete ring for 1.3 seconds before rule activates. Push crane, leave band, or operate without Tuned.", - "progression": "Drops IT-144; canopy courts. Allowed: ring prevents Guard gain instead. Not allowed: both or global ring.", - "production": "Tall folded-paper bird with leafy joints; calligraphic ring remains high contrast, brush stroke and wooden beak tap." + "id": "EN-R4-04", + "name": "Footnote Jackal", + "class": "ordinary", + "rule": "Acts immediately after the slowest allied action and targets that actor.", + "responses": "Guard the slow actor; accelerate or cancel the slow action.", + "production": "Consecutive same target gains reach. P/A/V/S: narrow text-tail jackal, wait/pounce, footnote bracket cue, page snap." }, { - "identity": "EN-O026 Ordinary, Rootbound Clerk", - "mechanic": "Files incoming direct damage by tag; after three of one tag, gains 45 Guard against it until hit by another tag.", - "read": "Three labeled leaf tabs fill and Guard leaf appears. Vary tags, dispel, or wait for expiration.", - "progression": "Drops IT-145; record vaults. Allowed: stores two tags with 25 Guard each. Not allowed: permanent adaptation.", - "production": "Small desk-bodied golem with tabbed roots; drawer snaps and rustling file fan." + "id": "EN-R4-05", + "name": "Clause Beetle", + "class": "ordinary", + "rule": "Preview declares Repeat or Alternate; obeying grants beetle Guard, breaking exposes it but Hinders actor.", + "responses": "Break clause with durable actor; obey until a finisher is ready.", + "production": "Clause switches after exposure. P/A/V/S: split-shell beetle, stamp/flip, repeat/alternate glyphs, wax click." }, { - "identity": "EN-O027 Ordinary, Palimpsest Hare", - "mechanic": "Creates a decoy at half vitality when first hit; both swap bands every 2 seconds, but true hare retains a small underline. Decoy deals no damage.", - "read": "Split is preceded by page-peel for 1 second; underline is shape and brightness independent. Mark true source or use area damage.", - "progression": "Drops IT-146; moonlit margins. Allowed: three decoys with longer swap. Not allowed: remove identity marker.", - "production": "Long-eared ink wash hare and hatched decoy, clean swap arcs; paper peel and alternating wood taps." + "id": "EN-R4-06", + "name": "Leaf Counter", + "class": "ordinary", + "rule": "Counts target changes; third change causes the acting ally's action to retarget foremost.", + "responses": "Commit to targets; deliberately trigger on flexible area action.", + "production": "Count persists through enemy death. P/A/V/S: abacus vine, count/snap, three-leaf cue, bead rustle." }, { - "identity": "EN-O028 Ordinary, Redleaf Custodian", - "mechanic": "Sweeps the band after any player repeats a skill name, dealing 55 and removing one placed Plan/zone. Cooldown 4 seconds.", - "read": "Red leaf fan points to source band for 1.1 seconds. Vary skills, recall object, or Anchor defender.", - "progression": "Drops IT-147; pruned routes. Allowed: removes device instead of zone. Not allowed: remove more than one or react without cooldown.", - "production": "Fan-tailed forest automaton, red leaf semaphore; broom rush and crisp leaf clap." + "id": "EN-R4-07", + "name": "Citation Crow", + "class": "ordinary", + "rule": "Marks the source of every positive tag; when tag expires, pecks that source if reachable.", + "responses": "Use short tags from guarded source; cleanse the Crow's source marks.", + "production": "Multiple expiries queue distinct pecks. P/A/V/S: ink-beak bird, point/peck, source-arrow cue, quill tap." }, { - "identity": "EN-E010 Elite, Pruning Advocate", - "mechanic": "Selects the most-used allied active and bans its secondary clause for 8 seconds. Using three other active names removes ban and 30 stability.", - "read": "Banned skill remains visible with crossed secondary text; three empty response slots show progress. Diversify actions or Break during selection.", - "progression": "Drops IT-132; office grove. Allowed: bans most-used tag instead for 5 seconds. Not allowed: disable base action or basic attack.", - "production": "Shears-limbed topiary clerk, clause visibly clipped not erased; three snips and restoration rustle." + "id": "EN-R4-08", + "name": "Binding Vine", + "class": "ordinary", + "rule": "Links foremost allied and enemy units; push/pull on either mirrors onto the other when legal.", + "responses": "Avoid displacement; exploit mirror to pull enemy front out.", + "production": "Illegal mirror Hinders initiator. P/A/V/S: braided vine, knot/tug, mirrored arrows, fiber strain." }, { - "identity": "EN-E011 Elite, Clause Antler", - "mechanic": "Grows one antler branch per allied buff clause; at four, charges the most-buffed unit for 35 per branch. Dispelling any buff removes matching branch and 15 stability.", - "read": "Branch icons mirror exact buffs and charge line lasts 1.5 seconds. Limit buff stack, dispel, redirect charge.", - "progression": "Drops IT-133; disputed charter route. Allowed: grows from debuffs instead. Not allowed: unlabeled branches or more than four.", - "production": "Lean deerlike construct distinct from boss, asymmetric document antler; branch creaks and four-step hoof warning." + "id": "EN-R4-09", + "name": "Redraft Shade", + "class": "ordinary", + "rule": "First action that fizzles is repeated by the Shade against its own side's equivalent target.", + "responses": "Avoid fizzle; intentionally fizzle a restorative/benign action.", + "production": "After copying, becomes targetable at line reach. P/A/V/S: crossed-out shade, wait/rewrite, dashed replay cue, reversed page sound." }, { - "identity": "EN-E012 Elite, Errata Walker", - "mechanic": "Rewrites the last terrain rule: safe lane becomes hazard or hazard becomes safe for 4 seconds. It alternates inversion, visibly.", - "read": "Terrain preview flips pattern and displays 2-second countdown. Delay entry, Hush rewrite, or exploit beneficial inversion.", - "progression": "Drops IT-134; field desks. Allowed: invert target priority marker instead. Not allowed: change damage values or hide alternation.", - "production": "Stilted annotation frame with eraser feet, black/white pattern flip; chalk squeal then clean correction knock." + "id": "EN-R4-10", + "name": "Shelf Warden", + "class": "ordinary", + "rule": "Protects the enemy immediately behind; when that unit moves, Wardens swaps and protects the next.", + "responses": "Pull protected target two steps; attack Warden or use bypass.", + "production": "Each completed swap grants it Guard. P/A/V/S: shelf-plated guard, slide/brace, bookend cue, wood block." }, { - "identity": "EN-S004 Sub-boss, Unwritten Bailiff", - "mechanic": "Removes one UI label from its own next action, chosen from target, band, or secondary clause; players can restore it by using research, varied tags, or intervention respectively. Each restoration removes 45 stability.", - "read": "Missing field is an explicit blank box, never absent UI; 3-second preparation. Use matching information tool, then counter revealed action.", - "progression": "Drops IT-135; optional sealed annex. Allowed: blanks two fields with longer tell in Second Weave. Not allowed: blank timing or all fields.", - "production": "Featureless wooden docket with floating blank cards; restored labels physically attach, hollow paper knock and satisfying type-block return." + "id": "EN-R4-11", + "name": "Glossary Keeper", + "class": "elite", + "rule": "Declares one action tag as defined; only that tag can interrupt it, but every use also accelerates its major cast.", + "responses": "Reserve one defined-tag interrupt; race with other tags and accept cast.", + "production": "Defined tag changes after each interruption. P/A/V/S: many-tabbed keeper, name/cast, highlighted-tag shape, spoken caption tone." }, { - "identity": "EN-B004 Boss, Redaction Stag", - "mechanic": "Phase 1 erases the secondary clause of the most repeated active. Phase 2 prunes the most-used band, leaving two routes. Phase 3 marks a three-action “official version”; deliberately inserting a low-value different action exposes the contradiction and removes 50 stability.", - "read": "Usage counts remain public; pruning grows over 2 seconds; official sequence is displayed as three leaf cards. Bait with safe repetition, rotate bands, then contradict sequence.", - "progression": "Drops IT-136; CH-04 finale. Second Weave uses preserved/pruned archive choice. Never erase base actions, hide counts, or require lore-only answer.", - "production": "Ceremonial stag of red leaves and blank parchment, antlers lose strips per Break; brush orchestra drops instruments when redacting and restores them on contradiction." + "id": "EN-R4-12", + "name": "Palimpsest Hart", + "class": "elite", + "rule": "Records the first three allied actions, then replays their target rules in reverse as enemy attacks.", + "responses": "Seed safe target rules; reorder before reverse replay.", + "production": "At half vitality records four actions but displays all slots. P/A/V/S: layered-script antlers, record/replay, numbered reverse track, backward chime sequence." }, { - "identity": "EN-O029 Ordinary, Mirrorclaw Crab", - "mechanic": "Copies the Guard value of the first Front unit it sees, then loses 10 Guard whenever that unit changes bands. Attacks nearest for 40.", - "read": "Mirror shell shows source portrait for 1 second before copying. Move source, dispel, or attack before reflection.", - "progression": "Drops IT-181; tidal flats. Allowed: copy current speed instead. Not allowed: copy passives or maximum vitality.", - "production": "Wide crab with one polished and one rough claw, visible source cameo; glass scrape and shell clack." + "id": "EN-R5-01", + "name": "Mirror Skater", + "class": "ordinary", + "rule": "Creates a delayed footprint copy at its prior position; copy repeats only movement, not attacks.", + "responses": "Target the source shape; occupy or trap the announced copy path.", + "production": "Third copy path applies Hindered on crossing. P/A/V/S: blade-foot skater, glide/echo, solid-versus-hollow cue, delayed ice scrape." }, { - "identity": "EN-O030 Ordinary, Undertide Caller", - "mechanic": "Places a tide mark under the farthest ally; after 2 seconds it pulls target to Front and deals 50. If target moves first, caller is pulled instead and Exposed.", - "read": "Spiral line shows both possible destinations for 1.2 seconds. Move voluntarily, Anchor, or use the reversal.", - "progression": "Drops IT-182; reef channels. Allowed: pushes to Rear. Not allowed: retarget after mark.", - "production": "Conch-bodied crawler with rope tongue, bidirectional arrow VFX; conch inhale and taut-line snap." + "id": "EN-R5-02", + "name": "Salt Decoy", + "class": "ordinary", + "rule": "Appears as foremost but cannot attack; damage to it redirects part to the rearmost source and exposes attacker.", + "responses": "Use the redirect to reach source; dispel decoy before committing a fragile attacker.", + "production": "Source creates one replacement after decoy defeat. P/A/V/S: hollow salt double, crack/reform, tethered-source cue, dry fracture." }, { - "identity": "EN-O031 Ordinary, Manifest Gull", - "mechanic": "Steals the oldest Mark or target-priority flag and places it on itself; when hit because of stolen flag, drops it and becomes Exposed.", - "read": "Paper strip visibly travels from source to gull over 0.8 seconds. Delay attack, use area action, or exploit exposed bait.", - "progression": "Drops IT-183; harbor roofs. Allowed: steals shortest buff instead. Not allowed: steal unremovable boss/quest marker.", - "production": "Angular gull with receipt wings, paper transfer arc; sharp paper flap and cheeky seal stamp, no realistic bird distress." + "id": "EN-R5-03", + "name": "Beacon Ray", + "class": "ordinary", + "rule": "Marks the rearmost allied unit; the next enemy projectile reserves that unit ID, follows it through legal movement, and uses the current protection path.", + "responses": "Place an interceptor or Block charge by the marked unit; interrupt beacon wind-up.", + "production": "An intended-target AO_INTERCEPTED or actual-recipient AO_BLOCKED record leaves a revealing pool at the marked unit's reserved depth. P/A/V/S: luminous ray, fan/mark, persistent arc plus outcome-shaped pool cue, glass-water ping." }, { - "identity": "EN-O032 Ordinary, Copywake Deckhand", - "mechanic": "Creates a 50%-power outline of the last enemy basic attack and uses it on mirrored target. It cannot copy actives.", - "read": "Outline rehearses motion behind it for 1 second with source icon. Feed weak basic, Hush, or change mirrored target availability.", - "progression": "Drops IT-184; abandoned barges. Allowed: copy Guard gain instead of attack. Not allowed: active, passive, or Echo copy.", - "production": "Empty raincoat animated by mirror water, hatched outline actor; wet boot step and softened source impact." + "id": "EN-R5-04", + "name": "Undertow Hand", + "class": "ordinary", + "rule": "Emerges in allied rear for one cadence, attacks nearest unit, then returns to stored enemy index.", + "responses": "Keep rear defender; use attack that follows returning targets.", + "production": "Being hit while invading delays return. P/A/V/S: water hand silhouette, emerge/grab/sink, return-clock cue, suction slap." }, { - "identity": "EN-O033 Ordinary, Beacon Mantis", - "mechanic": "Locks forearms into a bright beacon and Marks the lowest-vitality ally for all nearby enemies 5 seconds. Moving mantis breaks beacon.", - "read": "Arms align with a diamond reticle for 1.3 seconds. Push/pull it, cleanse Mark, or use decoy.", - "progression": "Drops IT-185; rescue towers. Allowed: marks highest-resource ally. Not allowed: uncleanseable Mark or global range.", - "production": "Tall mantis with lamp forearms, beacon posture distinct from attack; lens focus whirr and clear lock tone." + "id": "EN-R5-05", + "name": "Twinwake Eel", + "class": "ordinary", + "rule": "Alternates source and echo states; only source can receive status, only echo can receive direct damage.", + "responses": "Time status then damage across states; use persistent area effect covering both.", + "production": "State swaps one tick faster below half vitality. P/A/V/S: doubled eel, phase/flick, filled/outline cue, alternating splash tones." }, { - "identity": "EN-O034 Ordinary, Glassfoam Anemone", - "mechanic": "Occupies one band and creates two harmless reflections plus one damaging tentacle strike for 60; true strike has a dotted base rather than solid.", - "read": "All three rise for 1.4 seconds; pattern identifies true one independent of color. Move from dotted lane or Break bulb with ranged hit.", - "progression": "Drops IT-186; shallow caves. Allowed: two true strikes at 40. Not allowed: identical patterns or random last-frame selection.", - "production": "Translucent flower body, foam outlines with patterned bases; bubble triplet and low true-strike thump." + "id": "EN-R5-06", + "name": "Flatglass Snail", + "class": "ordinary", + "rule": "Reflects target marks back to their source; unmarked attacks slowly remove its shell.", + "responses": "Avoid marks and chip shell; deliberately mark with a protected source to bait response.", + "production": "Shell break makes it fast and Exposed. P/A/V/S: mirror shell, reflect/shatter, returned-eye cue, glass scrape/break." }, { - "identity": "EN-O035 Ordinary, Moonlock Ray", - "mechanic": "Alternates silver and dark passes. Silver pass pauses buffs 2 seconds; dark pass pauses debuffs 2 seconds. Targets band with most timed states.", - "read": "Wing underside and large pause icons announce mode for 1.2 seconds. Spread timers or use the beneficial mode deliberately.", - "progression": "Drops IT-187; night-tide route. Allowed: alternation begins dark. Not allowed: random mode or state removal.", - "production": "Flat ray with clockwork moon disc, broad glide shadow; alternating open/closed chimes and water rush." + "id": "EN-R5-07", + "name": "Brine Caller", + "class": "ordinary", + "rule": "Summons one empty footprint behind foremost enemy; next defeated ordinary enemy leaves a temporary echo there.", + "responses": "Defeat Caller first; keep area response for the disclosed echo.", + "production": "Echo repeats only defeated unit's basic. P/A/V/S: conch caster, call/shape, empty-footprint cue, conch plus ghost hit." }, { - "identity": "EN-E013 Elite, Counterfeit Captain", - "mechanic": "Spawns a false copy with inverse target rule: true attacks lowest Guard, false feints highest Guard. Hitting false grants captain 20 stability; Mark transfers to true.", - "read": "True captain's order card has embossed border; copy is striped and slightly delayed 0.2 seconds. Mark, read target mismatch, or use area damage.", - "progression": "Drops IT-172; contraband pier. Allowed: swap true/copy once at 50% vitality with 2-second tell. Not allowed: remove embossed/striped distinction.", - "production": "Twin officer coats with materially different trim pattern, no face clone; offset whistle calls and one grounded boot cadence." + "id": "EN-R5-08", + "name": "Whitecap Lurker", + "class": "ordinary", + "rule": "Targets the ally whose predicted first target is invalidated, surfacing beside that ally.", + "responses": "Use retarget-follow actions; preserve original target until Lurker is revealed.", + "production": "Each invalidation increases surfacing damage. P/A/V/S: fin-shadow body, track/breach, broken-reticle cue, rising splash." }, { - "identity": "EN-E014 Elite, Twinwake Duelist", - "mechanic": "Mirrors the last movement path of its chosen rival, striking each band for 45. Rival changes only after being Hushed or unable to move.", - "read": "Rival bracket and ghost path remain visible 1.5 seconds ahead. Choose controlled mover, Anchor, or route through empty bands.", - "progression": "Drops IT-173; dueling quay. Allowed: inverse path. Not allowed: copy untargetable travel or change rival mid-path.", - "production": "Narrow two-ended saber and wake coat, ghost-footprints preview; paired blade swishes with delayed echo." + "id": "EN-R5-09", + "name": "Shallows Notary", + "class": "ordinary", + "rule": "Stamps source or echo on every summoned footprint; attacking the wrong stamp spends the attack with no effect.", + "responses": "Inspect stamps and set filters; use ground effect that legally covers both.", + "production": "Stamps swap after every enemy defeat. P/A/V/S: seal-backed crab, stamp/click, filled/hollow seal cue, waxy shell tap." }, { - "identity": "EN-E015 Elite, Customs Engine", - "mechanic": "Scans equipment behavior flags; targets unit with most behavior-changing items, suppressing one item clause for 6 seconds and gaining 25 Guard.", - "read": "Item icon and exact suppressed clause appear 2 seconds before beam. Spread behavior gear, Hush scan, or Break during inspection.", - "progression": "Drops IT-174; customs hall. Allowed: targets highest-tier item instead. Not allowed: suppress base stats, profession skills, or more than one item.", - "production": "Gate-shaped automaton with sliding lens and receipt printer; scan bars use stripes, procedural clicks and clear denial buzzer." + "id": "EN-R5-10", + "name": "Rescue Thief", + "class": "ordinary", + "rule": "Pulls lowest-vitality ally rearward, but steals its oldest positive tag as payment.", + "responses": "Let it rescue an untagged ally; brace or cleanse pull and heal in place.", + "production": "Stolen tag is granted to enemy source unit. P/A/V/S: rope-finned thief, cast/strip, tag-on-hook cue, rope hiss." }, { - "identity": "EN-S005 Sub-boss, Reef Notary", - "mechanic": "Certifies one of three decoys as “true” every 5 seconds; only certified unit can deal full damage, but attacking a different decoy reveals a contradiction and removes 35 stability.", - "read": "Three seals and a visible certification line last 2 seconds. Mark source, deliberately test one false seal, then focus exposed core.", - "progression": "Drops IT-175; optional customs reef. Allowed: four decoys in Second Weave. Not allowed: certification without visible seal or unavoidable reflected damage.", - "production": "Coral desk-beast with seal polyps, decoys are hatched foam; wet stamp rhythm and brittle coral crack on contradiction." + "id": "EN-R5-11", + "name": "Tidal Lens", + "class": "ordinary", + "rule": "Focuses all enemy rearmost-target actions onto one previewed ally for a cadence, then shifts to another band.", + "responses": "Guard focused ally; interrupt or reorder so redirected actions become illegal.", + "production": "Each legal hit extends focus one tick, capped. P/A/V/S: floating lens, focus/sweep, converging arrows, glass hum." }, { - "identity": "EN-S006 Sub-boss, Rescue Wrecker", - "mechanic": "Fires hooks at two lowest-vitality units, but each hook can be intercepted by a healthier unit crossing its line. Every successful intercept removes 30 stability and grants the rescuer Exposed.", - "read": "Parallel hook rails display order for 1.8 seconds. Plan cross-band intercepts, Anchor, or sever one hook.", - "progression": "Drops IT-176; optional wreck field. Allowed: third hook at 30 damage. Not allowed: target defeated unit or hide intercept cost.", - "production": "Salvage crane assembled from broken beacon parts, dual cable arms; rescue-bell motif detuned, cable count clicks." + "id": "EN-R5-12", + "name": "Duplicate Marshal", + "class": "elite", + "rule": "Creates a one-vitality echo of the allied foremost unit's profession basic and inserts it into enemy line.", + "responses": "Defeat echo before its basic; change foremost before creation to offer a manageable rule.", + "production": "Second creation copies current trait cost but not benefit. P/A/V/S: mirrored uniform, copy/salute, profession-outline cue, distorted allied basic." }, { - "identity": "EN-B005 Boss, Inverse Admiral", - "mechanic": "Phase 1 mirrors party formation and uses opposite target priorities. Phase 2 creates false objective beacons that punish identical scripts. Phase 3 links each ally to a mirrored enemy; different action tags across each pair remove stability, matching tags empower boss.", - "read": "Mirror map previews before lock; true objective has rescue-knot pattern; pair brackets display both queued tags for 2 seconds. Use asymmetric formation, distinct target rules, and varied paired actions.", - "progression": "Drops IT-177; CH-05 finale. Second Weave adds customs or rescue service clause. Never make true beacon color-only, copy player item data exactly, or hide paired tags.", - "production": "Admiralty figure built from inverted ship hull, reflection surface cracks per phase; reversed naval pulse resolves forward when player acts asymmetrically." + "id": "EN-R5-13", + "name": "Lowtide Colossus", + "class": "elite", + "rule": "Two-footprint body becomes targetable only where receding water exposes a shown side; wrong-side hits create undertow at attacker index.", + "responses": "Follow side countdown; use undertow immunity and attack wrong side deliberately for movement setup.", + "production": "Exposure sequence reverses below half vitality. P/A/V/S: broad tidal stone, rise/turn, left-right waterline cue, surf and stone bass." }, { - "identity": "EN-O036 Ordinary, Kiteknife Ray", - "mechanic": "Glides to band with strongest tailwind and slices all units there for 55, then Drift carries it onward.", - "read": "Kite tail points two bands ahead and wedge fills for 1 second. Change wind, leave band, or Anchor ray at prior stop.", - "progression": "Drops IT-221; outer wards. Allowed: headwind variant goes opposite forecast. Not allowed: forecast change after tail locks.", - "production": "Diamond kite creature with blade spars, stable destination ghost; taut cloth snap and slicing wind." + "id": "EN-R6-01", + "name": "Rail Pippit", + "class": "ordinary", + "rule": "Boards at enemy rear, rides forward one index per cadence, and drops a seed bomb opposite its stop.", + "responses": "Defeat before dangerous stop; move target away from shown opposite index.", + "production": "Skipped stop advances bomb timer. P/A/V/S: fruit-round bird, board/hop/drop, station-notch cue, rail chirp/pop." }, { - "identity": "EN-O037 Ordinary, Lift Thief", - "mechanic": "Drains 1 movement-related resource from the unit most recently moved and gains 25% speed; if none moved, attacks Front for 30.", - "read": "Hooked balloon line and resource icon for 0.9 seconds. Spend resource, Hush drain, or bait movement on protected unit.", - "progression": "Drops IT-222; lift docks. Allowed: steals Charge. Not allowed: steal unrelated resource or permanent route currency.", - "production": "Small balloon harness around grabber hands, elastic climb; gas squeak and latch click." + "id": "EN-R6-02", + "name": "Orchard Glider", + "class": "ordinary", + "rule": "Airborne until a slow allied action begins, then dives at that actor.", + "responses": "Bait dive with guarded slow action; use fast actions and wait for region stop.", + "production": "Interrupted dive returns airborne with Guard. P/A/V/S: leaf-wing glider, circle/dive, actor tether cue, canopy rush." }, { - "identity": "EN-O038 Ordinary, Pressure Rook", - "mechanic": "Occupies Mid and adds +1 or -1 Pressure based on last forced-move direction; at magnitude 3, blasts corresponding outer band for 75 and resets.", - "read": "Public signed gauge and outer-band ring at magnitude 2. Reverse movement, Calm, or exit forecast band.", - "progression": "Drops IT-223; weather boards. Allowed: blast Mid at zero after 6 seconds. Not allowed: hidden sign.", - "production": "Chess-rook-like weather tower without board motif, opposing vane faces; ascending/descending air columns." + "id": "EN-R6-03", + "name": "Cargo Mite", + "class": "ordinary", + "rule": "Occupies a cargo footprint; attacks against it risk damaging reward cargo unless attacker is adjacent.", + "responses": "Use reach-1 attacker; push mite off cargo before ranged damage.", + "production": "Damaged cargo makes Mite faster, preserving consequence. P/A/V/S: crate-clinging mite, grip/skitter, cargo-warning cue, wood scratch." }, { - "identity": "EN-O039 Ordinary, Cloud Mooring", - "mechanic": "Anchors nearest enemy and ally together; neither can move until one loses 30 Guard or link is severed. Mooring itself remains Rear.", - "read": "Thick bracket and 30-Guard lock icon for 1.1 seconds. Spend Guard, sever, or strike mooring at range.", - "progression": "Drops IT-224; tether bridges. Allowed: links two allies only. Not allowed: link boss or zero-Guard permanent lock.", - "production": "Floating anchor seed with paired ropes, visible tension; deep rope groan and release bell." + "id": "EN-R6-04", + "name": "Switch Ape", + "class": "ordinary", + "rule": "At each rail stop swaps foremost and rearmost enemies, then targets the allied unit whose target became illegal.", + "responses": "Use flexible retarget; interrupt the shown switch action.", + "production": "Legal target changes grant it Guard. P/A/V/S: lever-armed climber, pull/swing, endpoint-swap cue, heavy lever clack." }, { - "identity": "EN-O040 Ordinary, Lightning Scribe", - "mechanic": "Draws a zigzag through three units in action-order, 40 each; repeating a profession role increases next jump to 70.", - "read": "Numbered portraits and role icons show chain for 1.4 seconds. Reorder with Fallback, vary roles, or Guard repeated node.", - "progression": "Drops IT-225; storm script lanes. Allowed: reverse action-order chain. Not allowed: hidden sequence.", - "production": "Quill-shaped lightning body, numbered stroke path; pencil scratch turns into three electric plucks." + "id": "EN-R6-05", + "name": "Pearshot Wasp", + "class": "ordinary", + "rule": "Fires at center band; projectile becomes a hanging fruit hazard if blocked.", + "responses": "Let a mobile unit bait and then leave; destroy or trigger hanging fruit safely.", + "production": "Two hanging fruits fall together. P/A/V/S: pear-abdomen wasp, aim/sting, hanging-circle cue, buzz/thunk." }, { - "identity": "EN-O041 Ordinary, Calm-Eye Lure", - "mechanic": "Creates a safe ring granting 15 Guard per second, then after 4 seconds collapses for 80 to units still inside. It targets most injured band.", - "read": "Ring edge gains four inward teeth one per second. Use early safety, exit before fourth, or push enemies inside.", - "progression": "Drops IT-226; calm-eye pockets. Allowed: 3-second ring with 20 Guard. Not allowed: hidden collapse count.", - "production": "Soft cloud blossom with toothed inner rim, expansion/collapse frames; comforting hum gains four clear clicks." + "id": "EN-R6-06", + "name": "Brakevine", + "class": "ordinary", + "rule": "Roots the first unit to step during each stop window, ally or enemy.", + "responses": "Move after another unit triggers it; remain still and exploit rooted enemy.", + "production": "Root transfers to nearest neighbor on cleanse. P/A/V/S: rail vine, coil/snap, stop-window footprint, cable twang." }, { - "identity": "EN-O042 Ordinary, Ward Rotor", - "mechanic": "Rotates a 30-Guard shield from Front to Mid to Rear every 2 seconds and fires 45 at the band it leaves.", - "read": "Band arrow and numbered rotation disk are persistent. Attack unshielded band or move before trailing shot.", - "progression": "Drops IT-227; ward turbines. Allowed: reverse rotation. Not allowed: random or simultaneous shield.", - "production": "Three-bladed fan automaton, shield plate travels visibly; rotor cadence and departing-band pop." + "id": "EN-R6-07", + "name": "Platform Cook", + "class": "ordinary", + "rule": "Feeds foremost enemy at each stop, advancing its action; if the feeder is pushed front, feeds itself instead.", + "responses": "Push Cook forward; interrupt meal before high-impact front action.", + "production": "Every unused meal becomes a weak heal. P/A/V/S: apron shell, ladle/pass, bowl-arrow cue, pan and spoon events." }, { - "identity": "EN-E016 Elite, Storm Usher", - "mechanic": "Assigns Drift directions to all units; each voluntary move matching arrow removes 15 stability, resisting arrow gives unit 20 Guard but boss gains 10 stability.", - "read": "Individual arrows and 3-second choice window. Mix riding and resisting based on roles, Anchor critical units.", - "progression": "Drops IT-212; rotating ward route. Allowed: arrows rotate once midway with tell. Not allowed: forced choice without legal band.", - "production": "Tall vane conductor with many ribbons, individualized arrow shapes; wind ensemble pans by band and resolves per choice." + "id": "EN-R6-08", + "name": "Updraft Koi", + "class": "ordinary", + "rule": "Swims airborne through both lines; crossing a projectile path redirects that projectile to nearest legal unit.", + "responses": "Favor melee/spells; time projectiles between shown crossings.", + "production": "Redirected projectiles speed next crossing. P/A/V/S: ribbon-fin koi, arc/swim, path-cross cue, airy water swoop." }, { - "identity": "EN-E017 Elite, Crown Bailiff", - "mechanic": "Declares one band “essential”; units outside deal 20% less, units inside share incoming area damage. Declaration changes every 6 seconds.", - "read": "Large labeled band crest appears 2 seconds early. Decide whether to contest, use single-target damage, or Hush decree.", - "progression": "Drops IT-213; control spokes. Allowed: two lesser essential bands. Not allowed: no safe legal formation or color-only crest.", - "production": "Hollow ceremonial helm atop lift column, crest points physically; brass decree stab and air-pressure boundary." + "id": "EN-R6-09", + "name": "Applejack Coil", + "class": "ordinary", + "rule": "Rolls from enemy rear to front when hit, pushing enemy neighbors; at front, rolls into allied front once.", + "responses": "Freeze/impair before front; exploit its enemy push to break protection.", + "production": "Allied collision bounces it rearward and repeats cycle. P/A/V/S: coiled fruit shell, roll/bounce, route-chevron cue, rolling wooden knocks." }, { - "identity": "EN-E018 Elite, Rotation Engine", - "mechanic": "Battlefield object rotates lane hazards one band clockwise every 3 seconds; each hazard avoided due to forecast removes 20 stability. Engine attacks Rear for 40.", - "read": "Top UI map previews next two rotations with numbered arrows. Plan presets, move early, or freeze with Hush.", - "progression": "Drops IT-214; central ward axle. Allowed: counterclockwise. Not allowed: random direction or rotation faster than preview.", - "production": "Gyroscopic three-ring engine, mini-map mirrored on body; clockwork triple pulse and lock click on Break." + "id": "EN-R6-10", + "name": "Station Caller", + "class": "ordinary", + "rule": "Announces next rail stop; sound action gives airborne allies Untargetable until stop completes.", + "responses": "Cause AO_INTERRUPTED; otherwise hold attacks for landing and use ground hazards.", + "production": "Trigger STATION_CALL_DELAY observes the source's first AO_APPLIED Untargetable component with once_scope=action and allow_derived=false, delaying all rail arrivals one tick; AO_INTERRUPTED prevents both the application and delay. P/A/V/S: long-horn caller, announce/point, station wave plus outcome cue, captioned horn." }, { - "identity": "EN-S007 Sub-boss, Gale Tribunal", - "mechanic": "Presents three movement “rulings”: Anchor, ride Drift, or swap. A unit complying with a different ruling than previous unit removes 35 stability; repeating ruling triggers 55 area strike.", - "read": "Three giant cards and action-order slots show choices for 3 seconds. Assign varied responses across roles.", - "progression": "Drops IT-215; optional council spire. Allowed: reverse action order. Not allowed: require unavailable movement skill.", - "production": "Three-faced weather dais, each face uses shape-coded ruling; gavel wind cracks and distinct response chimes." + "id": "EN-R6-11", + "name": "Harvest Bail", + "class": "ordinary", + "rule": "Wraps the highest-Force allied unit and prevents basics; attacking the wrap also damages captive slightly.", + "responses": "Cleanse/cut with utility action; accept controlled damage and break quickly.", + "production": "Freed target gains one action advance. P/A/V/S: straw bundle, cast/bind, wrapped-fist cue, rope/straw strain." }, { - "identity": "EN-S008 Sub-boss, Stranded Thunderhead", - "mechanic": "Charges while stationary; every forced move releases 50 lightning in destination but removes 30 stability. At four Charge, global 120 blast.", - "read": "Four cloud bulbs fill and destination rings preview discharge. Move it into empty/enemy band, pace discharges, Break before four.", - "progression": "Drops IT-216; optional abandoned ward. Allowed: max 5 with 95 blast. Not allowed: unpreviewed destination damage.", - "production": "Dense cloud chained to broken house frame, bulbs clearly count; thunder pitch rises per charge and snaps directionally." + "id": "EN-R6-12", + "name": "Timetable Knight", + "class": "elite", + "rule": "Shows a three-stop schedule assigning strike, guard, and swap; repeats exactly unless interrupted, which rotates schedule.", + "responses": "Build response to fixed cycle; interrupt once to rotate dangerous event away.", + "production": "Below half vitality adds a fourth double-action stop, still shown. P/A/V/S: rail-sign armor, point/execute, four-cell schedule cue, metronomic rail hits." }, { - "identity": "EN-B006 Boss, Weather Crown", - "mechanic": "Phase 1 sets a fully previewed four-step gust cycle. Phase 2 marks one controller whose movement choices rotate hazards. Phase 3 alternates command and consensus: obeying all arrows empowers boss, disobeying all causes storm; mixed responses remove stability.", - "read": "Full cycle rail never disappears; controller wears crown bracket; final response meter shows obey/resist balance for 3 seconds. Anchor selectively, ride safe Drift, and mix responses.", - "progression": "Drops IT-217; CH-06 finale. Second Weave uses centralized or rotating governance clause. Never randomize without preview, require motion-only cues, or punish every legal choice.", - "production": "Floating crown of weather instruments around empty center, ward silhouettes orbit by phase; layered wind orchestra splits into controllable stems with reduced-audio visual meter." + "id": "EN-R6-13", + "name": "Orchard Engine", + "class": "elite", + "rule": "Two-footprint harvest machine pulls cargo and units toward center on each stop; jam meter rises when hit from both ends in one cadence.", + "responses": "Coordinate front/rear attacks to jam; brace and fight through center pressure.", + "production": "Jam releases cargo but triggers area steam. P/A/V/S: broad picker machine, reel/jam/vent, two-end meter cue, gears and steam captions." }, { - "identity": "EN-O043 Ordinary, Blanktag Walker", - "mechanic": "Targets the ally with most identity-based effects and suppresses one character talent for 4 seconds; base profession remains.", - "read": "Blank tag covers exact talent icon for 1.2 seconds. Spread signature reliance, Hush suppression, or focus walker.", - "progression": "Drops IT-261; registry shafts. Allowed: suppress one item clause instead. Not allowed: suppress profession or hide affected text.", - "production": "Empty tag rack on maintenance legs, no human mimic; tag slide and clean UI mute tone." + "id": "EN-R7-01", + "name": "Dusk Skimmer", + "class": "ordinary", + "rule": "Major action category is hidden until the region current reaches it; silhouette still shows legal target band.", + "responses": "Bring reveal equipment; stall until current exposes category.", + "production": "After reveal, Skimmer acts one tick sooner. P/A/V/S: flat luminous wings, skim/flare, sealed-to-open cue, sonar sweep." }, { - "identity": "EN-O044 Ordinary, Memory Broker Mite", - "mechanic": "Offers a visible bargain: lose oldest buff or take 65 damage. If player does not choose in 2 seconds, it takes buff. Each mite bargains once.", - "read": "Two-button choice appears beside target with hold-to-confirm protection. Choose based on state or defeat mite before expiry.", - "progression": "Drops IT-262; trade niches. Allowed: newest buff bargain. Not allowed: permanent inventory/memory loss.", - "production": "Small many-armed ledger bug, two physical offer cards; coinless card shuffle and decision tick." + "id": "EN-R7-02", + "name": "Blackwater Tithe", + "class": "ordinary", + "rule": "Steals one local resource from the richest reachable ally and exposes which enemy will spend it.", + "responses": "Spend before theft; bait with expendable resource and punish spender.", + "production": "Zero-resource target takes Hindered instead. P/A/V/S: cup-maw body, measure/drain, resource-arrow cue, hollow sip." }, { - "identity": "EN-O045 Ordinary, False Lantern", - "mechanic": "Projects a safe-lane marker over a hazard; its marker flickers with striped border while genuine safety is solid. On trigger deals 70 and Marks victim.", - "read": "Both markers appear 2 seconds before hazard; pattern and label distinguish. Research, inspect border, or destroy lantern.", - "progression": "Drops IT-263; guide tunnels. Allowed: false target-priority icon. Not allowed: color-only or pixel-level distinction.", - "production": "Crooked lamp with double shade, striped projection; friendly motif missing one beat, clear reveal crack." + "id": "EN-R7-03", + "name": "Circuit Eel", + "class": "ordinary", + "rule": "Links to nearest different enemy family; damage alternates across linked pair rather than staying on target.", + "responses": "Break distance link by reorder; use area damage to value both halves.", + "production": "Link repairs to next family once. P/A/V/S: luminous segmented eel, tether/flick, alternating-node cue, electric water pulse." }, { - "identity": "EN-O046 Ordinary, Namehook Crawler", - "mechanic": "Hooks the last unit called by an ally skill name/target command and pulls it one band, then becomes Exposed. If no named target, attacks nearest.", - "read": "Text-safe portrait hook and path line for 1 second. Use untargeted skill, Anchor, or exploit exposure.", - "progression": "Drops IT-264; old dispatch conduits. Allowed: tracks last Marked unit. Not allowed: speech-input dependence.", - "production": "Hooked cable crawler with portrait token, no written-name-only cue; token clack and cable zip." + "id": "EN-R7-04", + "name": "Lanternless Frog", + "class": "ordinary", + "rule": "Croak turns off predicted-target lines for one cadence but not target rules.", + "responses": "Pause/inspect before croak; use simple fixed-target basics.", + "production": "Each target change during darkness heals Frog. P/A/V/S: dark throat silhouette, inhale/croak, crossed-forecast cue, captioned bass croak." }, { - "identity": "EN-O047 Ordinary, Mapfold Crawler", - "mechanic": "Folds one formation band closed for 3 seconds; units in it move to nearest legal band, alternating Front then Rear priority.", - "read": "Paper walls rise over 1.5 seconds and destination arrows show each unit. Leave early, Anchor to remain at edge, or Hush fold.", - "progression": "Drops IT-265; collapsed maps. Allowed: longer 4-second fold with no damage. Not allowed: close two bands.", - "production": "Accordion map centipede, battlefield remains visible; paper concertina and boundary thump." + "id": "EN-R7-05", + "name": "Current Miser", + "class": "ordinary", + "rule": "Hoards expired positive and negative tags as charges, then releases all of one sign.", + "responses": "Stagger expiries; defeat before chosen-sign release or intentionally feed beneficial sign.", + "production": "Release sign alternates and is previewed. P/A/V/S: jar-backed wader, collect/pour, plus-minus jar cue, bottled fizz." }, { - "identity": "EN-O048 Ordinary, Mercy Bell Trap", - "mechanic": "Rings when an ally falls below 35% vitality, granting it 40 Guard but applying Hush for 5 seconds; then attacks it for 50. Can trigger once.", - "read": "Bell bracket appears as vitality approaches threshold and shows both Guard/Hush. Heal above threshold, cleanse after trigger, or destroy trap.", - "progression": "Drops IT-266; false shelters. Allowed: triggers at 25% with 60 Guard. Not allowed: conceal cost.", - "production": "Wall-mounted padded bell with clasp arm, benevolent-not-religious shape; soft comfort tone followed by audible clasp." + "id": "EN-R7-06", + "name": "Moonwake Needle", + "class": "ordinary", + "rule": "Targets the ally with the fullest local resource meter; hit locks gain but not spend for one cadence.", + "responses": "Spend before hit; Guard the named full-meter unit and coast on stored resource.", + "production": "Repeated same target extends lock, capped. P/A/V/S: needlefish silhouette, sight/dart, full-meter reticle, thin water snap." }, { - "identity": "EN-O049 Ordinary, Nullroot Guardian", - "mechanic": "Remains Anchored in Mid; every time an ally uses the same target rule twice, grows a root that blocks one projectile. Different rule burns one root.", - "read": "Up to three rule-labeled roots visible. Vary lowest/highest/Marked priorities or use melee.", - "progression": "Drops IT-267; maintenance gardens. Allowed: roots block movement skills instead. Not allowed: more than three or unlabeled rules.", - "production": "Black root knot around white maintenance tile, discrete barrier branches; low wood knocks keyed per root." + "id": "EN-R7-07", + "name": "Sump Herald", + "class": "ordinary", + "rule": "Marks one older enemy mechanic as returning: push, expiry, copy, or arrival; preview names which, and Herald triggers it once.", + "responses": "Counter the named mechanic; interrupt Herald and remove the imported threat.", + "production": "On survival, selects a second distinct known mechanic. P/A/V/S: four-tab herald, raise/trigger, legacy-tag cue, motif reprise event." }, { - "identity": "EN-E019 Elite, Registry Phantom", - "mechanic": "Copies the target rule, not the effect, of each allied active; after three rules it attacks using the majority rule for 110. A tied set makes it Exposed and loses 30 stability.", - "read": "Three rule cards remain above it and forecast exact chosen target. Feed three distinct rules to force tie or protect majority target.", - "progression": "Drops IT-252; official archive spur. Allowed: four-card 2-2 tie. Not allowed: copy hidden player AI settings beyond displayed rule.", - "production": "Translucent filing cabinet with silhouette cards, no person shape; card insertion and rule-specific locator tones." + "id": "EN-R7-08", + "name": "Darkbank Mason", + "class": "ordinary", + "rule": "Builds a wall footprint behind enemy front; wall blocks reveal current but also enemy projectiles.", + "responses": "Destroy wall to reveal; keep it to screen shots and use melee.", + "production": "Rebuilds at opposite end once. P/A/V/S: stone-carrying mason, stack/brace, occlusion rectangle cue, wet stone thud." }, { - "identity": "EN-E020 Elite, Comforter Automaton", - "mechanic": "Offers a 30-Guard aura to lowest-vitality band; units accepting twice become linked to it and redirected damage heals enemy. Leaving aura between pulses prevents link.", - "read": "Two-pulse bracket meter and explicit “second acceptance links” text. Use first safely then exit, sever link, or Hush second pulse.", - "progression": "Drops IT-253; quiet clinic ruins. Allowed: healing aura at lower value. Not allowed: hidden hostile link.", - "production": "Soft rounded care machine with visibly mechanical arms, avoids nurse caricature; soothing chord gains bracket click before second pulse." + "id": "EN-R7-09", + "name": "Echo Taxer", + "class": "ordinary", + "rule": "Whenever an allied equipment trigger repeats, delays the second and gains Guard.", + "responses": "Diversify triggers; time repeated proc after Guard strip.", + "production": "Third repetition steals the trigger target. P/A/V/S: tally-finned taxer, mark/hold, repeated-item brackets, stamping splash." }, { - "identity": "EN-E021 Elite, Debt Cartographer", - "mechanic": "Marks every band change as one route debt; at 4 debts, closes the most-used band for 4 seconds. Voluntary move in a previously unused direction removes one debt and 20 stability.", - "read": "Public per-band tally and closure preview at 3. Diversify movement directions, remain still, or Break tally device.", - "progression": "Drops IT-254; memory-map exchange. Allowed: count skill target changes instead. Not allowed: count forced movement as voluntary debt.", - "production": "Rolling map wheel with tally nails, closure wall folds from body; pencil ticks and route-stamp impact." + "id": "EN-R7-10", + "name": "Glowmire Nurse", + "class": "ordinary", + "rule": "Heals only unrevealed enemies; reveal converts queued heal into Hindered on that target.", + "responses": "Reveal during wind-up; focus already revealed targets to deny heal.", + "production": "At low vitality hides self once behind current. P/A/V/S: lamp-gourd nurse, tend/recoil, eye-cross heal cue, damp chime." }, { - "identity": "EN-S009 Sub-boss, Archive of One", - "mechanic": "Chooses one party member as “canonical”; only actions differing in role, target rule, or timing from that member remove 25 stability. Matching actions grant it 15 Guard. Canonical changes at phase half.", - "read": "Canonical portrait and three comparison icons are persistent. Queue deliberate differences and rotate support around chosen member.", - "progression": "Drops IT-255; optional sealed registry. Allowed: compare two canonical members with lower values. Not allowed: choose unavailable/reserve member.", - "production": "Monolithic portrait frame filled with blank light, comparison icons attach visibly; single instrument challenged by distinct reply instruments." + "id": "EN-R7-11", + "name": "Undertone Ray", + "class": "ordinary", + "rule": "Retaliates against damage family most used in prior cadence; retaliation family and target are previewed after tally.", + "responses": "Alternate damage families; Guard the declared retaliatory target.", + "production": "Three-family cadence makes it Exposed instead. P/A/V/S: broad ray with three bands, tally/pulse, family histogram cue, low harmonic pulse." }, { - "identity": "EN-S010 Sub-boss, Ring Tollkeeper", - "mechanic": "Controls three recovery doors. Opening one heals party 15% but adds its door clause to boss: Guard, speed, or Hush strike. Declining all opens Break window after 6 seconds.", - "read": "Doors show exact benefit/cost and boss body slot. Choose needed recovery, counter gained clause, or endure for Break.", - "progression": "Drops IT-256; optional maintenance ring. Allowed: one door pre-locked by prior scarcity choice. Not allowed: false text or permanent campaign loss.", - "production": "Circular gate machine with three unmistakable door icons; toll tones harmonize into boss layer, silence signals decline window visually too." + "id": "EN-R7-12", + "name": "Midnight Auditor", + "class": "elite", + "rule": "At battle start names one resource, one target rule, and one equipment tag; using all three in a cadence triggers a confiscating area action.", + "responses": "Avoid completing the triad; complete it under interrupt/Guard to open Auditor's Exposed state.", + "production": "Triad rotates after trigger. P/A/V/S: tall tabbed silhouette, list/seize, three-part checklist cue, stamped bass chord." }, { - "identity": "EN-B007 Boss, Vacant Saint", - "mechanic": "Phase 1 offers “safe” actions that give Guard while secretly building visible Reliance; at 3 Reliance, linked unit is Hushed and isolated. Phase 2 uses false relationship prompts, but correct counter is shown by established character links. Phase 3 breaks when three allies voluntarily forgo offered Guard and protect each other differently.", - "read": "Reliance meter and isolation path are explicit; relationship prompt always includes mechanical fallback icon for any party; refusal slots show three distinct protections.", - "progression": "Drops IT-257; CH-07 finale. Second Weave uses reveal/protect Nullmarket choice. Never require a particular recruit, exploit inaccessible lore, or disguise Reliance.", - "production": "Serene empty civic statue with opening chest of hooks, deliberately not sacred iconography; comforting motif becomes sparse as links appear, refusal restores ensemble." + "id": "EN-R7-13", + "name": "Abyss Conductor", + "class": "elite", + "rule": "Connects three enemies into a visible circuit; actions travel front-to-rear until one node is interrupted or displaced.", + "responses": "Break any node with interrupt; pull middle node out to ground circuit.", + "production": "Repairs circuit in reverse order below half vitality. P/A/V/S: many-armed conductor, connect/sweep, three-node current cue, directional electric rhythm." }, { - "identity": "EN-O050 Ordinary, Concordance Needle", - "mechanic": "Stitches two adjacent units' next target rules together; if rules differ both gain 10 Guard, if same both take 45.", - "read": "Paired rule cards and thread color plus pattern for 1 second. Queue different rules, sever stitch, or separate bands.", - "progression": "Drops IT-301; approach conduits. Allowed: stitch action tags instead. Not allowed: hidden comparison.", - "production": "Long needle relay with paired spools, stitch line outside bodies; thread zip and two-result chord." - }, + "id": "EN-R8-01", + "name": "Dawn Shard", + "class": "ordinary", + "rule": "Alternates projectile screen and spell screen each cadence while stepping toward front.", + "responses": "Attack with unscreened family; push rearward to gain more planning time.", + "production": "At front, both screens drop and basic becomes area. P/A/V/S: split-sun crystal, rotate/step, alternating screen shapes, bright turning chime." + }, { - "identity": "EN-O051 Ordinary, Uniform Chorister", - "mechanic": "Gains 15 Guard whenever two consecutive allied action tags match, max 45; loses all Guard and becomes Exposed on third distinct tag. Attacks lowest Guard for 40.", - "read": "A persistent three-slot tag rail fills above its mask 0.8 seconds before Guard resolves. Vary the sequence and use a third distinct tag to expose it.", - "progression": "Drops IT-302; Choir galleries. Allowed: tracks profession roles instead. Not allowed: both dimensions.", - "production": "Masked acoustic automaton with identical panels, not human cultist; monotone blocks crack into triad on exposure." - }, + "id": "EN-R8-02", + "name": "Route Binder", + "class": "ordinary", + "rule": "Links one allied step to one enemy step; first movement on either side forces the paired legal movement.", + "responses": "Stay still until link expires; exploit paired step to break enemy protection.", + "production": "Illegal pair Hinders both linked units. P/A/V/S: ribbon-stone body, tie/pull, paired footprints, taut route string." + }, { - "identity": "EN-O052 Ordinary, Mute Standard", - "mechanic": "Plants a banner that Hushes one band for 4 seconds; banner has 60 vitality and standard cannot plant another until destroyed/expired.", - "read": "Broken-line band ring and planting pose last 1.3 seconds. Move, destroy banner, or use base actions.", - "progression": "Drops IT-303; command halls. Allowed: banner suppresses Guard gain. Not allowed: mobile/global aura.", - "production": "Tripod shutter-banner with silent cloth, high-contrast torn-line emblem; pole drive and sudden band-pass mute." - }, + "id": "EN-R8-03", + "name": "Morning Copy", + "class": "ordinary", + "rule": "Records first profession resource spend and repeats only its cost on that recruit next cadence.", + "responses": "Delay spend until Copy defeated; spend a resource with harmless zero-state cost.", + "production": "Repeated cost converts to Hindered if meter is empty. P/A/V/S: pale silhouette slate, record/echo, empty-meter replay cue, reversed spend sound." + }, { - "identity": "EN-O053 Ordinary, Borrowed Role Frame", - "mechanic": "Scans nearest profession role and gains one listed base active at 60% power for two actions. It keeps enemy target side and cannot copy advanced/passive skills.", - "read": "Role icon and copied active card appear 1.5 seconds early. Present a controllable role, Hush secondary clause, or change nearest unit.", - "progression": "Drops IT-304; training chambers. Allowed: one different base active. Not allowed: character talent, item, or advanced copy.", - "production": "Neutral training mannequin with swappable tool silhouette, always striped enemy trim; assembly clack and deliberately simplified copied cue." - }, + "id": "EN-R8-04", + "name": "Crown Porter", + "class": "ordinary", + "rule": "Carries an enemy device, hindrance, or screen chosen in preview from an earlier region and drops it at center on defeat.", + "responses": "Plan counter for named cargo; time defeat when dropped rule helps or is harmless.", + "production": "Cargo activates once while carried below half vitality. P/A/V/S: ring-pack porter, carry/drop, cargo-icon crown cue, motif-specific container sound." + }, { - "identity": "EN-O054 Ordinary, Junction Sentry", - "mechanic": "Rotates target priority lowest vitality -> most resource -> Rear every action. Gains 20 power if player uses same priority in that action.", - "read": "Three-position dial and next target portrait remain visible. Change priority or Guard forecast target.", - "progression": "Drops IT-305; relay crossings. Allowed: reverse dial. Not allowed: random priority.", - "production": "Three-eyed gate orb with rotating dial, eye positions shape-coded; mechanical count and focused pulse." - }, + "id": "EN-R8-05", + "name": "Eightfold Finch", + "class": "ordinary", + "rule": "Cycles target filters: foremost, rearmost, richest resource, lowest vitality; current and next are shown.", + "responses": "Reorder/Spend to shape next target; interrupt dangerous filter transition.", + "production": "Cycle skips invalid filter and gains speed. P/A/V/S: eight-feather bird, point/dart, four-cell wheel cue, four-note target motif." + }, { - "identity": "EN-O055 Ordinary, Accord Parasite", - "mechanic": "Attaches to an allied link and converts 20% shared healing/Guard into its own vitality. Link remains severable; parasite dies when link expires naturally.", - "read": "Small third-node bracket appears and siphon value displays. Let link expire, sever, or target parasite.", - "progression": "Drops IT-306; civic accord rooms. Allowed: siphon damage redirect instead. Not allowed: untargetable node or more than one link.", - "production": "Triangular clip creature on tether, clearly separate hitbox; suction pluck and satisfying unclasp." - }, + "id": "EN-R8-06", + "name": "Reprise Ram", + "class": "ordinary", + "rule": "Repeats the last forced movement used by either side, targeting the same relative band.", + "responses": "Avoid displacement; feed a movement that benefits allied order before reprise.", + "production": "Two different movements combine into push then pull. P/A/V/S: ring-horn ram, recall/charge, replay-chevron cue, echoed hoof event." + }, { - "identity": "EN-O056 Ordinary, Silence Petal", - "mechanic": "Opens after three identical enemy or ally action tags, releasing 55 band damage and Hush to both sides. Different tag closes one petal.", - "read": "Three large petals carry tag icons and fill publicly. Vary actions or use enemy repetition against it.", - "progression": "Drops IT-307; final gardens. Allowed: four-petal lower damage. Not allowed: count off-screen actions.", - "production": "Black-white mechanical flower, petal count readable; three breathy openings and bilateral snap." - }, + "id": "EN-R8-07", + "name": "Zenith Mender", + "class": "ordinary", + "rule": "Converts first incoming hindrance into healing, second into Exposed, then resets.", + "responses": "Apply sacrificial hindrance before key control; use direct pressure and skip cycle.", + "production": "Below half vitality cycle begins with heal twice. P/A/V/S: sun-vial healer, turn/pour, two-state flask cue, bright inversion chime." + }, { - "identity": "EN-E022 Elite, Cadence Auditor", - "mechanic": "Audits four-action sequences; every duplicate resource type adds 25 stability, every distinct type removes 20. At sequence end it attacks the duplicate spender for 90.", - "read": "Four public slots show resource and owner. Arrange distinct spenders or protect duplicate target; zero-cost basic records as None once.", - "progression": "Drops IT-292; audit stair. Allowed: audits role tags. Not allowed: unavailable resource requirement or hidden sequence.", - "production": "Tall ledger metronome with four shutters; dry audit ticks and discordant duplicate alarm." - }, + "id": "EN-R8-08", + "name": "Nexus Tile", + "class": "ordinary", + "rule": "A mobile footprint copies the region hazard of the allied position opposite it; enemy handler moves it one step per cadence.", + "responses": "Occupy safe opposite index; destroy handler or push tile away.", + "production": "Tile reverses direction on area hit. P/A/V/S: floating stone tile, glide/inscribe, opposite-index cue, grinding motif blend." + }, { - "identity": "EN-E023 Elite, Firstline Executor", - "mechanic": "Deletes the oldest placed object every 5 seconds unless a newer different object is deployed, which redirects deletion and removes 25 stability. Attacks object owner for 55.", - "read": "Oldest/newest badges and 2-second deletion beam. Rotate device/zone types or recall oldest.", - "progression": "Drops IT-293; founder workshop. Allowed: deletes oldest buff instead at lower rate. Not allowed: quest object or no warning.", - "production": "Long cutting arm over chronological rail, numbered objects projected; tape advance and clean cut transient." - }, + "id": "EN-R8-09", + "name": "Goldwake Diver", + "class": "ordinary", + "rule": "Begins airborne, dives at first unit whose equipment and profession trigger in same cadence.", + "responses": "Separate trigger timing; bait dive onto guarded unit then focus grounded target.", + "production": "Successful dive steals one item cooldown step. P/A/V/S: gold ribbon diver, circle/plunge, dual-trigger reticle, high rush/impact." + }, { - "identity": "EN-E024 Elite, Consensus Breaker", - "mechanic": "Links three enemies; if party focuses one target, damage is divided and link gains stability. Three different allied targets within 3 seconds sever link and remove 45 stability.", - "read": "Three brackets and a public diversity timer. Split attacks briefly, sever, then focus.", - "progression": "Drops IT-294; council engine room. Allowed: four enemies with 4-second timer. Not allowed: link boss or require more targets than present.", - "production": "Triangular council machine with three faceplates, tethers pulse on target diversity; unison knock broken by separated clicks." - }, + "id": "EN-R8-10", + "name": "Last Clause", + "class": "ordinary", + "rule": "Chooses Repeat, Alternate, or Preserve based on the player's first two actions; selected rule remains visible.", + "responses": "Seed desired clause deliberately; break rule with resilient actor to expose it.", + "production": "Clause violation also advances imported enemy mechanic. P/A/V/S: root-ring beetle, observe/stamp, three-clause crown cue, page-stone click." + }, { - "identity": "EN-S011 Sub-boss, Founder Mask", - "mechanic": "Selects one founding principle card: safety, efficiency, or continuity. Repeating its favored action grants it Guard; demonstrating two different counter-principles removes 40 stability. Cards rotate every 7 seconds.", - "read": "Principle, favored action, and two legal counter tags are written/iconed for 2 seconds. Build varied responses, not lore guesses.", - "progression": "Drops IT-295; optional founder vault. Allowed: card order derived from prior choices. Not allowed: untranslated text-only clue or hidden counter.", - "production": "Large nonhuman relay mask with three rotating shutters, no cultural mask reference; formal chord changes orchestration per principle." - }, + "id": "EN-R8-11", + "name": "Daybreak Sentry", + "class": "ordinary", + "rule": "Guards enemy directly behind until current reveal reaches it; then swaps to rearmost and fires forward.", + "responses": "Pull protected unit before reveal; prepare projectile screen for disclosed swap shot.", + "production": "Each blocked shot shortens next reveal. P/A/V/S: prism spear sentry, brace/swap/fire, sun-track cue, spear chime and shot." + }, { - "identity": "EN-S012 Sub-boss, Sevenfold Gate", - "mechanic": "Runs seven one-action consequence locks, one per prior chapter. Correct counter opens lock and deals 25 stability; failing creates that region's known ordinary hazard, then moves on. No lock repeats.", - "read": "Lock displays region ID, reused counter icon, and 3-second response. Use learned mechanic or accept bounded hazard.", - "progression": "Drops IT-296; mandatory final approach. Allowed Second Weave: shuffled order. Not allowed: unlearned mechanic, permanent lock, or required recruit.", - "production": "Seven-ring doorway engine with region materials, each lock retains known shape language; seven motifs combine without becoming noise." - }, + "id": "EN-R8-12", + "name": "Circuit Regent", + "class": "elite", + "rule": "Selects three known rules from earlier regions and assigns them to front, center, rear enemy bands; assignments are fully previewed.", + "responses": "Reorder enemies to move rules; counter the most dangerous band and burst Regent.", + "production": "Surviving rule migrates on enemy defeat. P/A/V/S: triple-ring regent, assign/migrate, banded rule seals, layered motif stamps." + }, { - "identity": "EN-B008 Boss, First Silence", - "mechanic": "Phase 1 mutes the most repeated party resource and mirrors uniform roles. Phase 2 runs three linked telegraphs requiring defense, movement, and clause control by different roles. Phase 3 proposes a single-cadence “safe” state; every distinct role action writes one public Concord clause and removes stability. Final Reconciliation preserves all four clauses to end fight.", - "read": "Repetition counts, muted resource, role mirror, and linked requirements remain visible. Each phase has a 3-second planning pause; final four-slot clause rail cannot be color-only. Vary resources/roles, assign linked counters, preserve distinct clauses.", - "progression": "Drops IT-297; CH-08 finale and ending. Second Weave assembles one fully previewed clause from each governance choice. Never demand exact roster/profession, erase player input, use instant-kill uniformity check, or obscure final condition.", - "production": "Vast civic relay intelligence expressed as concentric shutters, not deity/humanoid; every prior regional material joins the phase model. Score begins near-silent, then restores eight motifs and settlement voices with complete caption/icon equivalents." + "id": "EN-R8-13", + "name": "Meridian Engine", + "class": "elite", + "rule": "Two-footprint engine advances a public eight-tick schedule of push, screen, copy, reveal, pull, heal denial, arrival, and rest.", + "responses": "Build for schedule weak ticks; interrupt once to insert a rest but accelerate next two ticks.", + "production": "At half vitality schedule runs backward, still visible. P/A/V/S: circular engine, eight phase motions, radial schedule cue, eight-event mechanical suite." } ], - "items": [ + "bosses": [ { - "identity": "IT-001 Waylamp Buckler", - "slot": "Offhand / shield", - "tier": "T1 / CH-01", - "flag": "B", - "effect": "First time wearer prevents forced movement, the attacker becomes Exposed; 8-second item cooldown. Use against wedge telegraphs.", - "build": "Synergy PR-B01; countered by Hushless ranged attacks that never move.", - "source": "SET-01 guild issue after segment 1; U-C.", - "production": "Half-moon lamp shield; shutter click and low flare." + "id": "BO-R1-01", + "name": "The Many-Paned Stag", + "class": "RG-01", + "rule": "Rotates three panes that screen projectile, spell, or forced movement; antler sweep pushes the current foremost after each rotation.", + "responses": "Rotate with cheap unscreened hit, then use open family; brace sweep and punish recovery. Failure: wrong family fed pane timing.", + "production": "Half vitality rotates two steps. P/A/V/S/M: two-footprint stag, pane-antler kit, tri-screen cue, glass-horn boss motif." }, { - "identity": "IT-002 Courier Splitsole", - "slot": "Feet / light gear", - "tier": "T1 / CH-01", - "flag": "B", - "effect": "After wearer changes bands, next basic attack within 3 seconds targets a different enemy if legal and gains 20 power.", - "build": "Synergy PR-B02,CHR-004; countered by single-target encounters and Anchored.", - "source": "Ridge-cache route preview; U-D.", - "production": "Split-toe wind boot; two-step whistle." + "id": "BO-R1-02", + "name": "Gale Loom", + "class": "RG-01", + "rule": "Stationary wind engine inserts a gust footprint front-to-rear; attacks on its weak spindle reverse gust direction.", + "responses": "Break spindle to redirect gust through enemies; hold stable order and race core. Failure: uncontrolled gust exposed rear.", + "production": "At half vitality two gusts move from opposite ends. P/A/V/S/M: loom-engine, spindle/gust phases, numbered wind paths, mechanical gale stem." }, { - "identity": "IT-003 Clinic Threadspool", - "slot": "Charm / medical tool", - "tier": "T1 / CH-01", - "flag": "B", - "effect": "First heal on an ally below 35% vitality also removes Exposed; if no Exposed, grants 10 Guard instead.", - "build": "Synergy PR-B04,CHR-003; countered by healing inversion or Hush on heal clause.", - "source": "Clinic service objective; U-T.", - "production": "Mint thread ring; stitch pluck." + "id": "BO-R2-01", + "name": "Sluiceback Mother", + "class": "RG-02", + "rule": "Shell carries a moving safe index; eggs at unsafe positions hatch pullers, while direct attacks shift the index.", + "responses": "Follow index and clear eggs; deliberately shift index to hatch where area attack is ready. Failure: third Wet/pull broke care order.", + "production": "Half vitality reverses index and hatches existing eggs. P/A/V/S/M: broad shell, egg/valve kit, tide ruler, wet percussion boss stem." }, { - "identity": "IT-004 Survey Pin", - "slot": "Head / optic", - "tier": "T1 / CH-01", - "flag": "B", - "effect": "Marking an enemy also displays its next destination band for 4 seconds; no damage change.", - "build": "Synergy PR-B06; countered by stationary or random-immune targets.", - "source": "Tower service objective; U-D.", - "production": "White route pin lens; map tack sound." - }, - { - "identity": "IT-005 Relay Crank", - "slot": "Mainhand / device tool", - "tier": "T1 / CH-01", - "flag": "B", - "effect": "Recalling a device makes its owner Tuned; once per 10 seconds.", - "build": "Synergy PR-B08,PR-A15; countered by device destruction before recall.", - "source": "Repair three relay boxes; U-C.", - "production": "Folding brass crank; ratchet-to-chime." - }, - { - "identity": "IT-006 Bellglass Fork", - "slot": "Mainhand / focus", - "tier": "T1 / CH-01", - "flag": "B", - "effect": "Detune that cleanses allied Hush creates a 40%-power Echo of the ally's suppressed secondary clause after 1 second; once per 8 seconds.", - "build": "Synergy PR-B03; countered by clauses with no legal target.", - "source": "SET-01 resonance shop after segment 3; U-C.", - "production": "Clear fork with crack; doubled glass tone." - }, - { - "identity": "IT-007 Anchor Seed", - "slot": "Consumable / field seed", - "tier": "T1 / CH-01", - "flag": "B", - "effect": "Chosen ally gains Anchored until it prevents one move or 6 seconds pass. Use before a visible wedge.", - "build": "Synergy PR-B05; countered by dispel, while enemy Hush does not remove the state.", - "source": "Farm rescue reward, then shop stock; U-P.", - "production": "Heavy square seed; root thump." - }, - { - "identity": "IT-008 Open-Seat Cord", - "slot": "Charm / link tool", - "tier": "T1 / CH-01", - "flag": "B", - "effect": "When wearer links two different profession roles, the slower one advances its next action by 0.5 seconds; once per link.", - "build": "Synergy PR-B11,CHR-001; countered by duplicate-role teams.", - "source": "Guild roster tutorial mastery; U-N.", - "production": "Two-color braided cord; paired heartbeat click." - }, - { - "identity": "IT-009 Signal Shutter", - "slot": "Offhand / command tool", - "tier": "T1 / CH-01", - "flag": "B", - "effect": "Priority Flare that a queued ally rejects refunds 1 Order and Marks the rejecting rule on UI; once per encounter.", - "build": "Synergy PR-B12,CHR-008; countered by parties with identical legal targeting.", - "source": "Tower repair or CHR-008 field note in CH-02; U-0.", - "production": "Red-white shutter fan; denial click then bell." - }, - { - "identity": "IT-010 Bottled Crosswind", - "slot": "Consumable / intervention", - "tier": "T1 / CH-01", - "flag": "B", - "effect": "Move one nonboss unit one band toward Rear. If movement fails, apply Exposed instead.", - "build": "Synergy push/pull builds; countered by movement immunity, which still allows Exposed unless immune to debuff.", - "source": "Ridge gather node; U-P.", - "production": "Corked wind spiral; pop and gust arrow." - }, - { - "identity": "IT-011 Millrace Hook", - "slot": "Mainhand / control pole", - "tier": "T1 / CH-01", - "flag": "B", - "effect": "On first hit against a Rear target, pull it to Mid; if Mid occupied, deal 30 extra and leave it Rear.", - "build": "Synergy PR-B01,PR-B10; countered by Anchored and crowded Mid.", - "source": "Windmill rescue chest; U-N.", - "production": "Wooden hook with waterwheel teeth; rope draw." - }, - { - "identity": "IT-012 Crosswind Spur", - "slot": "Feet / pursuit gear", - "tier": "T2 / CH-01", - "flag": "B", - "effect": "After enemy moves to mirrored band, wearer follows one band if legal and gains 1 Tempo; 6-second cooldown.", - "build": "Synergy PR-B02; countered by hazard destination or Anchored.", - "source": "Drop EN-E001; U-C.", - "production": "Vane heel spur; circling snap." - }, - { - "identity": "IT-013 Visible Clapper", - "slot": "Charm / accessibility bell", - "tier": "T2 / CH-01", - "flag": "B", - "effect": "First band-wide Hush telegraph each phase lasts 0.5 seconds longer and grants wearer 15 Guard when it resolves.", - "build": "Synergy anti-Hush timing; countered by single-target Hush.", - "source": "Drop EN-E002; U-N.", - "production": "Stone clapper with pulse marks; felted toll." - }, - { - "identity": "IT-014 Three-Face Gear", - "slot": "Charm / targeting gear", - "tier": "T2 / CH-01", - "flag": "B", - "effect": "After wearer hits a different band than last action, ignore 15 Guard and reveal target's defended face for 3 seconds.", - "build": "Synergy varied-band attackers; countered by one-band enemies.", - "source": "Drop EN-E003; U-D.", - "production": "Numbered tri-gear; quarter-turn clack." - }, - { - "identity": "IT-015 Matron Spindle", - "slot": "Relay / cable module", - "tier": "T2 / CH-01", - "flag": "B", - "effect": "When wearer Anchors an ally against a pull, create a 35-power counterline to puller and remove 10 stability. Once per 5 seconds.", - "build": "Synergy PR-B01,PR-B05; countered by pushes and non-stability ordinary units.", - "source": "Drop EN-S001; U-C.", - "production": "Basket spindle module; taut cable reply." - }, - { - "identity": "IT-016 Hollow Rib Bell", - "slot": "Relic / boss-bound", - "tier": "T2 / CH-01", - "flag": "B", - "effect": "Once per encounter, after two different allies prevent forced movement, immediately fill 20% Intervention and make both Tuned.", - "build": "Synergy mixed defenders; countered by encounters without movement.", - "source": "Drop EN-B001; U-0.", - "production": "Bone-free ceramic rib bell; two knocks into full chord." - }, - { - "identity": "IT-017 Tower Pennant", - "slot": "Back / signal cloth", - "tier": "T1 / CH-01", - "flag": "B", - "effect": "First Fallback movement leaves a 3-second lane; next ally crossing it gains 15 Guard.", - "build": "Synergy PR-B12; countered by static formations.", - "source": "Warning-tower route completion; U-D.", - "production": "Yellow pennant with arrow hem; cloth snap." - }, - { - "identity": "IT-018 Field Dose No. 3", - "slot": "Consumable / medicine", - "tier": "T1 / CH-01", - "flag": "B", - "effect": "Heal 60 and transfer Exposed from target to user for 2 seconds; cannot target self.", - "build": "Synergy protected healers/link tanks; countered by area focus on user.", - "source": "Clinic shop; U-P.", - "production": "Two-chamber teal vial; glass swap." - }, - { - "identity": "IT-019 Retune Lens", - "slot": "Head / intervention optic", - "tier": "T1 / CH-01", - "flag": "B", - "effect": "Retune intervention may target an enemy: remove Tuned/Charge and apply Hush for 2 seconds instead of allied effect.", - "build": "Synergy PR-B03; countered by enemies without a spendable state.", - "source": "Waylamp calibration challenge; U-0.", - "production": "Reversible amber lens; focus flip." - }, - { - "identity": "IT-020 Basin Charter Seal", - "slot": "Charm / accord item", - "tier": "T2 / CH-01", - "flag": "B", - "effect": "At encounter start choose clinic cadence (lowest-vitality ally gains 15 Guard) or tower cadence (first enemy telegraph is 0.4 seconds longer). Choice persists for encounter.", - "build": "Synergy any party; countered by choosing wrong forecast need.", - "source": "Chapter repair decision; U-0.", - "production": "Two-sided civic seal; heartbeat or tower ping." - }, - { - "identity": "IT-021 Nibbler Jawguard", - "slot": "Head / light armor", - "tier": "T1 / CH-01", - "flag": "S", - "effect": "While wearer has 20+ Guard, direct bites/melee hits deal 8 less damage; below 20 Guard, no effect.", - "build": "Synergy Guard sustain; countered by Guard removal from EN-O001.", - "source": "Drop EN-O001; U-N.", - "production": "Seed-tooth brow plate; dry clack." - }, - { - "identity": "IT-022 Ramwool Mantle", - "slot": "Body / cloth armor", - "tier": "T1 / CH-01", - "flag": "S", - "effect": "After being pushed, wearer gains 18 Guard for 4 seconds; does not prevent collision damage.", - "build": "Synergy mobile tanks; countered by pull or no movement.", - "source": "Drop EN-O002; U-D.", - "production": "Sail-wool shoulder wrap; padded rush." - }, - { - "identity": "IT-023 Loosewire Filament", - "slot": "Charm / coil", - "tier": "T1 / CH-01", - "flag": "S", - "effect": "While wearer is Tuned, magical attacks gain 14 power; bonus ends when Tuned is consumed.", - "build": "Synergy PR-B03; countered by Tuned theft EN-O003.", - "source": "Drop EN-O003; U-N.", - "production": "Knotted blue filament; live-wire hum." - }, - { - "identity": "IT-024 Millhook Cuff", - "slot": "Offhand / bracer", - "tier": "T1 / CH-01", - "flag": "S", - "effect": "Against pulled enemies, next direct hit within 3 seconds gains 18 power.", - "build": "Synergy PR-B10; countered by Anchored targets.", - "source": "Drop EN-O004; U-D.", - "production": "Rope-wrapped wrist hook; cinch snap." - }, - { - "identity": "IT-025 Mothdust Hood", - "slot": "Head / cloth armor", - "tier": "T1 / CH-01", - "flag": "S", - "effect": "First Hush on wearer each encounter lasts 1.5 seconds less, minimum 0.5 seconds.", - "build": "Synergy clause-heavy builds; countered by repeated Hush.", - "source": "Drop EN-O005; U-N.", - "production": "Patterned gray hood; soft flutter." - }, - { - "identity": "IT-026 Tick Insulator", - "slot": "Body / light armor", - "tier": "T1 / CH-01", - "flag": "S", - "effect": "Skill-delay effects on wearer are 25% shorter, rounded to nearest 0.1 second; no cooldown reduction otherwise.", - "build": "Synergy fast counters; countered by raw speed slow.", - "source": "Drop EN-O006; U-N.", - "production": "Ceramic shoulder pads; ticking dampener." - }, - { - "identity": "IT-027 Grainplate Shell", - "slot": "Body / heavy armor", - "tier": "T1 / CH-01", - "flag": "S", - "effect": "Gain 22 Guard while in Front and Anchored; lose it immediately on leaving Front or consuming Anchored.", - "build": "Synergy PR-B01; countered by Guard theft.", - "source": "Drop EN-O007; U-N.", - "production": "Domed grain cuirass; seed rattle." - }, - { - "identity": "IT-028 Aster Workboots", - "slot": "Feet / work gear", - "tier": "T1 / CH-01", - "flag": "S", - "effect": "Terrain slow is reduced by 20% while wearer has no profession resource.", - "build": "Synergy zero-resource cycles; countered by keeping reserves full.", - "source": "SET-01 shop; U-N.", - "production": "Patched brown boots; firm dirt step." - }, - { - "identity": "IT-029 Clinic Apron", - "slot": "Body / medical cloth", - "tier": "T1 / CH-01", - "flag": "S", - "effect": "Healing power +12 while wearer is below 60% vitality; no benefit when healthy.", - "build": "Synergy transferred-debuff healers; countered by focus fire.", - "source": "Clinic service shop; U-T.", - "production": "Mint pocket apron; bottle tap." - }, - { - "identity": "IT-030 Ridge Scope", - "slot": "Head / optic", - "tier": "T1 / CH-01", - "flag": "S", - "effect": "Ranged power +15 against enemies in a different band; same-band attacks unchanged.", - "build": "Synergy Rear attackers; countered by enemy dives.", - "source": "High ridge cache; U-N.", - "production": "Narrow brass scope; distant click." - }, - { - "identity": "IT-031 Windmill Greaves", - "slot": "Feet / heavy gear", - "tier": "T1 / CH-01", - "flag": "S", - "effect": "Collision damage taken is reduced by 18; ordinary direct damage unchanged.", - "build": "Synergy anti-push tanks; countered by clean displacement without collision.", - "source": "Mill route shop unlock; U-N.", - "production": "Slatted shin guards; millboard knock." - }, - { - "identity": "IT-032 Bellwether Band", - "slot": "Charm / ward", - "tier": "T1 / CH-01", - "flag": "S", - "effect": "When a boss telegraph begins, wearer gains 10 Guard for its duration; once per 6 seconds.", - "build": "Synergy slow boss tells; countered by ordinary attacks between tells.", - "source": "Chapter clear shop; U-C.", - "production": "Amber pulse ring; single low toll." - }, - { - "identity": "IT-033 Farmhand Mallet", - "slot": "Mainhand / blunt", - "tier": "T1 / CH-01", - "flag": "S", - "effect": "Direct power +16 against Anchored ordinary enemies; elites/bosses gain only +8.", - "build": "Synergy PR-B05; countered by movement-heavy unanchored targets.", - "source": "Farm rescue reward; U-N.", - "production": "Ashwood mallet; compact thud." - }, - { - "identity": "IT-034 Relay Cap", - "slot": "Head / work gear", - "tier": "T1 / CH-01", - "flag": "S", - "effect": "Device owners gain 8 Guard while their oldest device remains active.", - "build": "Synergy PR-B08; countered by object destruction.", - "source": "Relay repair shop; U-N.", - "production": "Blue insulator cap; coil buzz." - }, - { - "identity": "IT-035 Dusk Vial", - "slot": "Consumable / tonic", - "tier": "T1 / CH-01", - "flag": "S", - "effect": "Grant 25 Guard for 6 seconds; using in Rear grants only 15.", - "build": "Synergy Front rescue; countered by Guard theft.", - "source": "Dusk gather nodes; U-P.", - "production": "Purple glass dose; cork flick." - }, - { - "identity": "IT-036 Brace Rivet", - "slot": "Charm / reinforcement", - "tier": "T1 / CH-01", - "flag": "S", - "effect": "At maximum Brace, Guard gained is +10; below maximum no effect.", - "build": "Synergy PR-B01; countered by rapid resource spending.", - "source": "SET-01 smith; U-N.", - "production": "Square iron rivet; shield ping." - }, - { - "identity": "IT-037 Tempo Knot", - "slot": "Charm / movement token", - "tier": "T1 / CH-01", - "flag": "S", - "effect": "At 3 Tempo, movement skills gain 12 power; consuming Tempo below 3 removes bonus.", - "build": "Synergy PR-B02; countered by Anchored.", - "source": "Courier challenge; U-N.", - "production": "Blue cord knot; quick double step." - }, - { - "identity": "IT-038 Remedy Tin", - "slot": "Charm / medical supply", - "tier": "T1 / CH-01", - "flag": "S", - "effect": "At maximum Remedy, wearer takes 10 less damage from transferred debuffs.", - "build": "Synergy PR-B04; countered by direct damage.", - "source": "Clinic mastery reward; U-N.", - "production": "Flat mint tin; lid click." - }, - { - "identity": "IT-039 Insight Chalk", - "slot": "Charm / survey supply", - "tier": "T1 / CH-01", - "flag": "S", - "effect": "At 3+ Insight, Mark duration is 1 second longer.", - "build": "Synergy PR-B06; countered by dispel.", - "source": "Tower mastery reward; U-D.", - "production": "White chalk capsule; slate scratch." - }, - { - "identity": "IT-040 First-Light Coat", - "slot": "Body / guild cloth", - "tier": "T2 / CH-01", - "flag": "S", - "effect": "At full vitality, first direct hit deals 20 less damage; refreshes only next encounter.", - "build": "Synergy fragile Rear units; countered by chip terrain damage.", - "source": "CH-01 completion; U-N.", - "production": "Yellow patched guild coat; cloth brace." - }, - { - "identity": "IT-041 Reedmemory Pendant", - "slot": "Charm / recorder", - "tier": "T1 / CH-02", - "flag": "B", - "effect": "After wearer is Hushed, store the suppressed secondary clause; next basic attack releases it at 35% power if legal. One clause maximum.", - "build": "Synergy PR-B03,PR-B07; countered by clauses requiring a missing target.", - "source": "Testimony cache 1; U-N.", - "production": "Hollow reed locket; inhale then soft replay." - }, - { - "identity": "IT-042 Siltstep Waders", - "slot": "Feet / terrain gear", - "tier": "T1 / CH-02", - "flag": "B", - "effect": "Entering flooded terrain voluntarily cleanses Drift and makes next exit ignore forced movement; once per 8 seconds.", - "build": "Synergy PR-B10; countered by non-flood hazards.", - "source": "Low-water route; U-C.", - "production": "High dark waders; suction-release pair." - }, - { - "identity": "IT-043 Filterback Pack", - "slot": "Back / support device", - "tier": "T1 / CH-02", - "flag": "B", - "effect": "First removable debuff transferred to wearer each encounter is stored, not applied; using Shared Dose again releases it at half duration.", - "build": "Synergy PR-B04; countered by unremovable debuffs or Hush.", - "source": "Communal-filter objective; U-0.", - "production": "Reed filter backpack; liquid chamber swap." - }, - { - "identity": "IT-044 Ferry Captain Knot", - "slot": "Charm / link", - "tier": "T1 / CH-02", - "flag": "B", - "effect": "When two linked allies occupy different bands, forced movement on either is redirected to the healthier ally; once per 7 seconds.", - "build": "Synergy PR-B11; countered by equal-health area pressure.", - "source": "Defend both ferries; U-C.", - "production": "Broad river knot; rope redirect snap." - }, - { - "identity": "IT-045 Clause-Cut Reed", - "slot": "Mainhand / focus", - "tier": "T1 / CH-02", - "flag": "B", - "effect": "A basic attack against a Hushed enemy extends its Hush 1 second and makes user Tuned; once per enemy.", - "build": "Synergy PR-B03; countered by Hush immunity and cleanse.", - "source": "SET-02 resonance stall; U-D.", - "production": "Notched black reed; clipped note." - }, - { - "identity": "IT-046 Floodgate Token", - "slot": "Consumable / terrain control", - "tier": "T1 / CH-02", - "flag": "B", - "effect": "Remove one flooded band or create a 4-second flooded band with no damage; choose at use.", - "build": "Synergy PR-B10 and EN-O014 counterplay; countered by terrain lock.", - "source": "Filter-house craft; U-P.", - "production": "Two-sided water token; drain/fill sounds." - }, - { - "identity": "IT-047 Testimony Toggle", - "slot": "Head / information tool", - "tier": "T1 / CH-02", - "flag": "B", - "effect": "Once per encounter, invert the order of an enemy's visible replay sequence; unavailable if sequence is not numbered.", - "build": "Synergy against EN-E004,EN-S002; countered by single-action telegraphs.", - "source": "Recover all testimony caches; U-0.", - "production": "Three-position ear clip; numbered clicks reverse." - }, - { - "identity": "IT-048 Glassbill Sight", - "slot": "Head / optic", - "tier": "T1 / CH-02", - "flag": "B", - "effect": "Piercing attacks stop after first target but gain 35 power and Expose that target; toggle before encounter.", - "build": "Synergy precision ranged builds; countered by summon screens when toggle is wrong.", - "source": "Open-pool hunt; U-N.", - "production": "Long clear beak lens; glass focus sting." - }, - { - "identity": "IT-049 Undertow Bobbin", - "slot": "Relay / movement module", - "tier": "T1 / CH-02", - "flag": "B", - "effect": "First enemy moved through a placed zone wraps a line to its source; source's next hit pulls it back to prior band.", - "build": "Synergy PR-B05,PR-B08; countered by Anchored and zone destruction.", - "source": "Filter-house basement; U-C.", - "production": "Blue thread bobbin; wet rewind." - }, - { - "identity": "IT-050 Reserve Seat Tag", - "slot": "Charm / roster tool", - "tier": "T1 / CH-02", - "flag": "B", - "effect": "After a reserve swap between segments, incoming unit starts next encounter with 1 profession resource; outgoing unit starts later encounter with 10 Guard, not stackable.", - "build": "Synergy route adaptation; countered by sealed-loadout routes.", - "source": "Reserve-swap tutorial; U-0.", - "production": "Numbered ferry tag; seat latch." - }, - { - "identity": "IT-051 Waterline Compass", - "slot": "Offhand / route tool", - "tier": "T1 / CH-02", - "flag": "B", - "effect": "Safe Bearing may target two allies in the same band at 60% duration; if either leaves band early both effects end.", - "build": "Synergy PR-B06; countered by split hazards.", - "source": "Deep-channel side route; U-D.", - "production": "Floating needle compass; paired water ticks." - }, - { - "identity": "IT-052 Three-Voice Cylinder", - "slot": "Relic / echo module", - "tier": "T2 / CH-02", - "flag": "B", - "effect": "Store up to three different action tags; at three, next item Echo resolves the oldest at 50% and empties all. Cannot store Echo.", - "build": "Synergy varied parties; countered by Hush and repeated tags.", - "source": "Drop EN-E004; U-N.", - "production": "Triple glass drum; three timbres then release." - }, - { - "identity": "IT-053 Appeal Stamp", - "slot": "Charm / buff defense", - "tier": "T2 / CH-02", - "flag": "B", - "effect": "When an enemy would remove two buffs, choose one displayed buff to preserve; preserved buff loses 2 seconds duration. Once per 8 seconds.", - "build": "Synergy buff builds; countered by single-buff dispel and timeless buffs.", - "source": "Drop EN-E005; U-C.", - "production": "Reversible seal stamp; refusal knock." - }, - { - "identity": "IT-054 Crosscurrent Shuttle", - "slot": "Relay / terrain module", - "tier": "T2 / CH-02", - "flag": "B", - "effect": "Swapping bands via terrain grants wearer Anchored after arrival; Anchored is consumed on next prevented move.", - "build": "Synergy planned swap routes; countered by no-swap terrain.", - "source": "Drop EN-E006; U-N.", - "production": "Water-loom shuttle; crossed splash." - }, - { - "identity": "IT-055 Recorder Drum", - "slot": "Back / replay engine", - "tier": "T2 / CH-02", - "flag": "B", - "effect": "Once per encounter, replay wearer's last basic movement path without repeating its attack; movement is optional at trigger.", - "build": "Synergy PR-B02,PR-B10; countered by Anchored or hazardous prior path.", - "source": "Drop EN-S002; U-0.", - "production": "Barnacled hand drum; reversed step rhythm." - }, - { - "identity": "IT-056 Mire Refrain Pipe", - "slot": "Relic / boss-bound", - "tier": "T2 / CH-02", - "flag": "B", - "effect": "Every third different secondary clause used by party fills 10% Intervention; repeated clause resets count to 1.", - "build": "Synergy mixed profession actives; countered by Hush and uniform rotations.", - "source": "Drop EN-B002; U-0.", - "production": "Three-throat reed pipe; visible beat pulse." - }, - { - "identity": "IT-057 Union Filtercloth", - "slot": "Body / accord gear", - "tier": "T1 / CH-02", - "flag": "B", - "effect": "Cleansing Hush from an ally also makes its next movement ignore flooded terrain cost; 6-second item cooldown.", - "build": "Synergy PR-B04,PR-B10; countered by dry routes.", - "source": "Communal-filter decision; U-C.", - "production": "Layered reed cloth; water strain." - }, - { - "identity": "IT-058 Ferry Lockkey", - "slot": "Charm / accord gear", - "tier": "T1 / CH-02", - "flag": "B", - "effect": "At route preview, lock one forecasted water-depth change; doing so adds one ordinary encounter to that spoke.", - "build": "Synergy risk control; countered by routes with no depth change.", - "source": "Private-ferry decision; U-0.", - "production": "Brass key with water gauge; lock and distant splash." - }, - { - "identity": "IT-059 Safe-Depth Gauge", - "slot": "Offhand / intervention tool", - "tier": "T1 / CH-02", - "flag": "B", - "effect": "Retune used in flooded band also lowers water for 3 seconds; using outside flood grants only normal Retune.", - "build": "Synergy PR-B03,PR-B10; countered by flood immunity.", - "source": "Water-governance quest; U-D.", - "production": "Reed float gauge; descending glug." - }, - { - "identity": "IT-060 Published Warning", - "slot": "Charm / civic record", - "tier": "T2 / CH-02", - "flag": "B", - "effect": "First delayed hazard each encounter is revealed one segment earlier and deals 15 less damage if still triggered.", - "build": "Synergy information builds; countered by immediate attacks.", - "source": "Publish dangerous testimony; U-0.", - "production": "Waterproof warning strip; page unfurl tone." - }, - { - "identity": "IT-061 Whisper-Stem Loop", - "slot": "Charm / focus", - "tier": "T1 / CH-02", - "flag": "S", - "effect": "Echo power +12 while source and wearer have different roles; same-role Echo unchanged.", - "build": "Synergy CHR-007; countered by uniform parties.", - "source": "Drop EN-O008; U-N.", - "production": "Looping reed ring; quiet doubled chirp." - }, - { - "identity": "IT-062 Silt Lurker Plate", - "slot": "Body / medium armor", - "tier": "T1 / CH-02", - "flag": "S", - "effect": "Damage from delayed ground eruptions is reduced by 18 while wearer is moving; stationary wearer gains no reduction.", - "build": "Synergy mobile units; countered by direct hits.", - "source": "Drop EN-O009; U-N.", - "production": "Mudscale waist plates; damp thump." - }, - { - "identity": "IT-063 Leechlight Brooch", - "slot": "Charm / resource ward", - "tier": "T1 / CH-02", - "flag": "S", - "effect": "While at maximum profession resource, resource-drain resistance is 50%; after spending any resource, no effect.", - "build": "Synergy savers; countered by burst theft after spend.", - "source": "Drop EN-O010; U-N.", - "production": "Three-bulb brooch; glass fill ticks." - }, - { - "identity": "IT-064 Ropewalk Bracer", - "slot": "Offhand / link armor", - "tier": "T1 / CH-02", - "flag": "S", - "effect": "Linked wearer gains 12 Guard when entering a different band from partner; once per link.", - "build": "Synergy PR-B11; countered by same-band area plans.", - "source": "Drop EN-O011; U-N.", - "production": "Wet rope cuff; knot cinch." - }, - { - "identity": "IT-065 Glassbill Mantle", - "slot": "Back / ranged gear", - "tier": "T1 / CH-02", - "flag": "S", - "effect": "Piercing damage +14 against a second target; first-target damage unchanged.", - "build": "Synergy line attacks; countered by single targets.", - "source": "Drop EN-O012; U-N.", - "production": "Clear feather mantle; glass pass." - }, - { - "identity": "IT-066 Floodcap Hat", - "slot": "Head / terrain gear", - "tier": "T1 / CH-02", - "flag": "S", - "effect": "While standing in flooded terrain, gain 16 Guard; lose it on leaving.", - "build": "Synergy water-control parties; countered by Hush-cost pressure and drain.", - "source": "Drop EN-O013; U-N.", - "production": "Floating cap brim; hollow croak." - }, - { - "identity": "IT-067 Muted-Eel Cord", - "slot": "Charm / Hush ward", - "tier": "T1 / CH-02", - "flag": "S", - "effect": "Hushed wearer takes 12 less electrical/magical direct damage; no physical reduction.", - "build": "Synergy deliberate Hush; countered by physical focus.", - "source": "Drop EN-O014; U-N.", - "production": "Black-notched cord; damp spark." - }, - { - "identity": "IT-068 Stilthouse Sandals", - "slot": "Feet / terrain gear", - "tier": "T1 / CH-02", - "flag": "S", - "effect": "Movement speed +15% while water level is rising, not while stable/falling.", - "build": "Synergy forecast play; countered by dry maps.", - "source": "SET-02 shop; U-N.", - "production": "Reed-platform sandals; quick hollow steps." - }, - { - "identity": "IT-069 Ferry Pole Cap", - "slot": "Mainhand / control fitting", - "tier": "T1 / CH-02", - "flag": "S", - "effect": "Push/pull power +10 against enemies occupying flooded bands.", - "build": "Synergy PR-B10; countered by dry or Anchored targets.", - "source": "Ferry defense reward; U-N.", - "production": "Iron pole shoe; water shove." - }, - { - "identity": "IT-070 Cachekeeper Vest", - "slot": "Body / light armor", - "tier": "T1 / CH-02", - "flag": "S", - "effect": "At 2+ stored effects, wearer gains 14 Guard; emptied storage removes Guard.", - "build": "Synergy recorders/Echo items; countered by Hush forcing release.", - "source": "Testimony cache 2; U-N.", - "production": "Pocketed green vest; cylinder rattle." - }, - { - "identity": "IT-071 Ripple Lens", - "slot": "Head / optic", - "tier": "T1 / CH-02", - "flag": "S", - "effect": "Marks applied to submerged or buried enemies last 1.5 seconds longer; surfaced enemies use normal duration.", - "build": "Synergy PR-B06; countered by surface enemies.", - "source": "Open-pool shop; U-D.", - "production": "Concentric lens; ripple ping." - }, - { - "identity": "IT-072 Union Wristwrap", - "slot": "Offhand / cloth", - "tier": "T1 / CH-02", - "flag": "S", - "effect": "After cleansing an ally, healer gains 10 Guard for 4 seconds.", - "build": "Synergy PR-B04; countered by no-debuff fights.", - "source": "FAC-03 accord rank 1; U-D.", - "production": "Green reed wrap; cloth pull." - }, - { - "identity": "IT-073 Dry-Reed Quiver", - "slot": "Back / ammunition", - "tier": "T1 / CH-02", - "flag": "S", - "effect": "Ranged power +13 while wearer is outside flooded terrain.", - "build": "Synergy high-ground routes; countered by flood-heavy rooms.", - "source": "Stilthouse vendor; U-N.", - "production": "Dry tube quiver; reed knock." - }, - { - "identity": "IT-074 Deepwater Sash", - "slot": "Body / cloth armor", - "tier": "T1 / CH-02", - "flag": "S", - "effect": "Healing received +15 while in flooded terrain; movement cost remains.", - "build": "Synergy water rescue; countered by Hush and dry lanes.", - "source": "Deep channel chest; U-N.", - "production": "Blue weighted sash; low water tone." - }, - { - "identity": "IT-075 Voiceglass Chip", - "slot": "Charm / cadence token", - "tier": "T1 / CH-02", - "flag": "S", - "effect": "When Verse is Close, Call and Answer healing/Guard clauses gain 12 magnitude; other stages unchanged.", - "build": "Synergy PR-B07; countered by cadence disruption.", - "source": "CHR-006 mastery; U-N.", - "production": "Triangular voiceglass; close-stage bell." - }, - { - "identity": "IT-076 Fen Medic Clogs", - "slot": "Feet / support gear", - "tier": "T1 / CH-02", - "flag": "S", - "effect": "After transferring a debuff, movement speed +20% for 3 seconds.", - "build": "Synergy PR-B04; countered by Anchored.", - "source": "Filter clinic shop; U-D.", - "production": "Raised wooden clogs; brisk double knock." - }, - { - "identity": "IT-077 Reedbound Buckle", - "slot": "Charm / faction token", - "tier": "T1 / CH-02", - "flag": "S", - "effect": "Against enemies currently replaying a clause, wearer gains 15 power.", - "build": "Synergy anti-Echo fights; countered by direct attackers.", - "source": "FAC-03 favor reward; U-N.", - "production": "Braided buckle; answered note." - }, - { - "identity": "IT-078 Floodmark Salve", - "slot": "Consumable / medicine", - "tier": "T1 / CH-02", - "flag": "S", - "effect": "Heal 45; in flooded terrain heal 70 instead.", - "build": "Synergy water routes; countered by dry terrain.", - "source": "SET-02 clinic; U-P.", - "production": "Blue salve packet; smooth splash." - }, - { - "identity": "IT-079 Low-Tide Knife", - "slot": "Mainhand / blade", - "tier": "T2 / CH-02", - "flag": "S", - "effect": "Direct power +18 against enemies in a band with no terrain state.", - "build": "Synergy terrain clearing; countered by persistent hazards.", - "source": "Low-water route clear; U-N.", - "production": "Flat wave-edged knife; dry cut." - }, - { - "identity": "IT-080 Glassreed Raincoat", - "slot": "Body / medium cloth", - "tier": "T2 / CH-02", - "flag": "S", - "effect": "First Hush or Drift each phase lasts 1 second less; only the first of either qualifies.", - "build": "Synergy boss phases; countered by repeated clauses.", - "source": "CH-02 completion; U-N.", - "production": "Translucent reed coat; rain rolloff." - }, - { - "identity": "IT-081 Heatledger Clip", - "slot": "Charm / resource monitor", - "tier": "T2 / CH-03", - "flag": "B", - "effect": "After wearer spends the same resource cost twice, third active costs +1 but gains 45 power or healing; tracker then resets.", - "build": "Synergy planned bursts; countered by low maximum resources and Hush.", - "source": "Quota-gate quest; U-N.", - "production": "Three-bead clip; count then furnace pop." - }, - { - "identity": "IT-082 Ventstep Boots", - "slot": "Feet / cooling gear", - "tier": "T2 / CH-03", - "flag": "B", - "effect": "Crossing from Front to Rear or Rear to Front removes 1 Heat from oldest allied device; 7-second cooldown.", - "build": "Synergy PR-B02,PR-B08; countered by blocked Mid.", - "source": "Smelter-lift chest; U-C.", - "production": "Vented iron soles; two vents hiss." - }, - { - "identity": "IT-083 Strike-Line Banner", - "slot": "Back / zone tool", - "tier": "T2 / CH-03", - "flag": "B", - "effect": "First allied zone each encounter cannot be destroyed; instead its remaining duration becomes 2 seconds.", - "build": "Synergy PR-B05,PR-B08; countered by expiry or displacement of source.", - "source": "Honor strike line; U-0.", - "production": "Red work banner; brace drum." - }, - { - "identity": "IT-084 Attribution Tongs", - "slot": "Mainhand / craft tool", - "tier": "T2 / CH-03", - "flag": "B", - "effect": "When wearer's device deals Break stability, its creator gains 1 profession resource; once per 5 seconds.", - "build": "Synergy PR-B08,CHR-012; countered by ordinary enemies or device immunity.", - "source": "Credit Jori in foundry record; U-C.", - "production": "Signed long tongs; maker stamp ping." - }, - { - "identity": "IT-085 Shared-Quota Ring", - "slot": "Charm / link tool", - "tier": "T2 / CH-03", - "flag": "B", - "effect": "Linked allies may pay 1 of each other's resource costs; payer gains Exposed for 2 seconds. Once per link.", - "build": "Synergy PR-B11; countered by focus on payer and incompatible empty resources.", - "source": "Worker-furnace charter; U-D.", - "production": "Split iron ring; resource handoff clink." - }, - { - "identity": "IT-086 Slag Switch", - "slot": "Consumable / terrain tool", - "tier": "T2 / CH-03", - "flag": "B", - "effect": "Move one slag patch to adjacent band; enemies on destination take 45, allies take no damage but become Slowed 20% for 3 seconds.", - "build": "Synergy zone controllers; countered by fixed terrain.", - "source": "Slag-channel gather; U-P.", - "production": "Ceramic shovel token; viscous slide." - }, - { - "identity": "IT-087 Overheat Fuse", - "slot": "Relay / device module", - "tier": "T2 / CH-03", - "flag": "B", - "effect": "At 5 Heat, destroy oldest device instead of Hushing next device; destruction deals 70 to enemies in its band. Once per encounter.", - "build": "Synergy sacrificial devices; countered by empty enemy band.", - "source": "Overpressure chamber; U-N.", - "production": "Red breakaway fuse; sharp rupture." - }, - { - "identity": "IT-088 Mint Refusal Seal", - "slot": "Offhand / command token", - "tier": "T2 / CH-03", - "flag": "B", - "effect": "Once per encounter, reject an enemy resource tax: wearer loses all Guard instead of resource and becomes Tuned.", - "build": "Synergy resource-critical counters; countered when wearer has no Guard.", - "source": "Hidden infirmary ledger; U-0.", - "production": "Defaced silver seal; stamp crack." - }, - { - "identity": "IT-089 Alternator Blade", - "slot": "Mainhand / sword", - "tier": "T2 / CH-03", - "flag": "B", - "effect": "Alternating physical and magical damage tags gives next hit 25 power; repeating either tag applies Hush to wearer for 2 seconds.", - "build": "Synergy mixed-tag professions/items; countered by immunity forcing repeats.", - "source": "Foundry recipe trial; U-N.", - "production": "Black/copper split blade; alternating ring tones." - }, - { - "identity": "IT-090 Pressure Debt Gauge", - "slot": "Head / optic", - "tier": "T2 / CH-03", - "flag": "B", - "effect": "At magnitude 2+ Pressure, wearer sees next forced-move destination and may invert own Drift once per encounter.", - "build": "Synergy weather/Current builds; countered by no Pressure system.", - "source": "Lift control room; U-0.", - "production": "Signed temple gauge; needle flip." - }, - { - "identity": "IT-091 Cooling Harness", - "slot": "Body / device armor", - "tier": "T2 / CH-03", - "flag": "B", - "effect": "Bleed Valve at Heat 4+ also grants adjacent ally Anchored; if used below 4, no extra clause.", - "build": "Synergy PR-B08,PR-B01; countered by Hush or no adjacent ally.", - "source": "SET-03 smith rank 2; U-N.", - "production": "Pipe harness; valve-to-ground thunk." - }, - { - "identity": "IT-092 Mint Segment", - "slot": "Body / heavy armor", - "tier": "T2 / CH-03", - "flag": "B", - "effect": "Choose one profession resource at encounter start; first enemy effect that copies it copies None instead and segment breaks.", - "build": "Synergy against resource mirrors; countered by choosing wrong resource.", - "source": "Drop EN-E007; U-0.", - "production": "Removable chest shutter; coinpress crack." - }, - { - "identity": "IT-093 Breaker Tooth", - "slot": "Mainhand / device breaker", - "tier": "T2 / CH-03", - "flag": "B", - "effect": "First hit on enemy charging a placed object cancels object destruction and deals 30 stability; object loses 3 seconds duration.", - "build": "Synergy device parties; countered by no stability or uncharged deletion.", - "source": "Drop EN-E008; U-N.", - "production": "Toothed wedge head; chain-stop clang." - }, - { - "identity": "IT-094 Eight-Notch Glass", - "slot": "Charm / resource warning", - "tier": "T2 / CH-03", - "flag": "B", - "effect": "When shared Heat/pressure meter reaches one below burst, next zero-cost allied action reduces it by 2; once per phase.", - "build": "Synergy basic/zero-cost rotations; countered by no zero-cost action queued.", - "source": "Drop EN-E009; U-0.", - "production": "Eight-notch red glass; descending double tick." - }, - { - "identity": "IT-095 Cross-Payment Token", - "slot": "Charm / resource exchange", - "tier": "T3 / CH-03", - "flag": "B", - "effect": "Once per encounter, wearer may pay a visible resource debt with 1 different profession resource; doing so makes both holders Tuned.", - "build": "Synergy varied party; countered by uniform resources or empty reserves.", - "source": "Drop EN-S003; U-0.", - "production": "Two-metal token; exchange chime." - }, - { - "identity": "IT-096 Regent Ventplate", - "slot": "Relic / boss-bound", - "tier": "T3 / CH-03", - "flag": "B", - "effect": "After party uses physical, magical, then support tag in any order without repeat, open a 3-second window where resource costs cannot be increased.", - "build": "Synergy varied rotations; countered by Hush/forced duplicate.", - "source": "Drop EN-B003; U-0.", - "production": "Crown exhaust plate; three hits then vent roar." - }, - { - "identity": "IT-097 Worker Furnace Charter", - "slot": "Charm / accord item", - "tier": "T2 / CH-03", - "flag": "B", - "effect": "At route start choose one equipped item; its first upgrade effect is active for route without payment, but shop stock is one tier lower.", - "build": "Synergy planned core item; countered by needing broad shop upgrades.", - "source": "Worker-furnace decision; U-0.", - "production": "Soot-red charter tile; communal hammer beat." - }, - { - "identity": "IT-098 Mint Stability Writ", - "slot": "Charm / accord item", - "tier": "T2 / CH-03", - "flag": "B", - "effect": "First shop reroll each segment is locked to wearer's slot type; dismantling yields 20% less salvage for route.", - "build": "Synergy targeted builds; countered by broad salvage plans.", - "source": "Mint decision; U-0.", - "production": "Silver punched writ; precise press." - }, - { - "identity": "IT-099 Upgrade Preview Lens", - "slot": "Head / craft optic", - "tier": "T2 / CH-03", - "flag": "B", - "effect": "Before battle, toggle any U-D or U-C item between its current upgrade and one lower level; restores after battle.", - "build": "Synergy timing tests; countered by U-N,U-0,U-P.", - "source": "Complete upgrade tutorial challenge; U-0.", - "production": "Sliding two-scale lens; calibration clicks." - }, - { - "identity": "IT-100 Heat-Commons Pact", - "slot": "Relay / chapter accord", - "tier": "T3 / CH-03", - "flag": "B", - "effect": "Once per encounter, when three allies each spend a different resource, reduce every allied device Heat by 1 and grant party 8 Guard.", - "build": "Synergy mixed resource/device team; countered by no devices or duplicate resources.", - "source": "Resolve quota negotiation; U-0.", - "production": "Three-hand relay plate; shared anvil chord." - }, - { - "identity": "IT-101 Quota Abacus", - "slot": "Charm / resource gear", - "tier": "T2 / CH-03", - "flag": "S", - "effect": "After spending exactly 2 resource on one active, wearer gains 12 Guard for 4 seconds.", - "build": "Synergy two-cost rotations; countered by cost changes.", - "source": "Drop EN-O015; U-D.", - "production": "Charcoal abacus; two bead clicks." - }, - { - "identity": "IT-102 Crucible Pincers", - "slot": "Offhand / device armor", - "tier": "T2 / CH-03", - "flag": "S", - "effect": "Device vitality/Guard +18 while allied Heat is 3 or higher; below 3 no effect.", - "build": "Synergy hot builds; countered by early venting.", - "source": "Drop EN-O016; U-N.", - "production": "Ceramic pincers; hot clamp." - }, - { - "identity": "IT-103 Slagback Plate", - "slot": "Body / heavy armor", - "tier": "T2 / CH-03", - "flag": "S", - "effect": "While standing on a slow patch, wearer gains 20 Guard and speed penalty worsens by 5 percentage points.", - "build": "Synergy Anchored tanks; countered by ranged focus and Hush.", - "source": "Drop EN-O017; U-N.", - "production": "Black cart plate; sticky scrape." - }, - { - "identity": "IT-104 Coinflame Wick", - "slot": "Charm / resource gear", - "tier": "T2 / CH-03", - "flag": "S", - "effect": "At maximum profession resource, magical power +16; Guard gained is reduced by 5.", - "build": "Synergy burst casters; countered by resource theft.", - "source": "Drop EN-O018; U-N.", - "production": "Blank coin wick; bright flip." - }, - { - "identity": "IT-105 Pressure Widow Gauge", - "slot": "Head / hazard optic", - "tier": "T2 / CH-03", - "flag": "S", - "effect": "Damage from mines is reduced by 20 while wearer has 0 resource; otherwise unchanged.", - "build": "Synergy empty-resource units; countered by resource retention.", - "source": "Drop EN-O019; U-N.", - "production": "Three-spoke lens; spring ticks." - }, - { - "identity": "IT-106 Chimney Skates", - "slot": "Feet / traversal gear", - "tier": "T2 / CH-03", - "flag": "S", - "effect": "Crossing a soot trail grants 15% speed for 3 seconds but does not prevent Hush.", - "build": "Synergy quick cleansers; countered by Anchored.", - "source": "Drop EN-O020; U-D.", - "production": "Flat iron skates; brush rush." - }, - { - "identity": "IT-107 Refrain Hammer", - "slot": "Mainhand / blunt", - "tier": "T2 / CH-03", - "flag": "S", - "effect": "Repeating basic attacks on same target gains 10 power per repeat, max 30; changing target resets.", - "build": "Synergy fixed tanks; countered by repeat-punishing enemies.", - "source": "Drop EN-O021; U-N.", - "production": "Double-faced hammer; capped rising anvils." - }, - { - "identity": "IT-108 Kilnstep Gloves", - "slot": "Offhand / craft gear", - "tier": "T2 / CH-03", - "flag": "S", - "effect": "Upgrade-sourced numeric bonuses are 5% stronger while wearer is below 50% vitality.", - "build": "Synergy U-N items; countered by healing above threshold.", - "source": "SET-03 shop; U-T.", - "production": "Sooted orange gloves; leather flex." - }, - { - "identity": "IT-109 Furnace Mask", - "slot": "Head / heat armor", - "tier": "T2 / CH-03", - "flag": "S", - "effect": "Heat/pressure burst damage taken -22 while wearer is in Mid.", - "build": "Synergy gauge encounters; countered by band displacement.", - "source": "Furnace route chest; U-N.", - "production": "Slotted work mask; muffled vent." - }, - { - "identity": "IT-110 Strike Steward Sash", - "slot": "Body / cloth", - "tier": "T2 / CH-03", - "flag": "S", - "effect": "Guard granted to a different role is +10; self-Guard unchanged.", - "build": "Synergy CHR-009,PR-B12; countered by solo/self effects.", - "source": "Strike accord rank 1; U-N.", - "production": "Red-gray sash; group knock." - }, - { - "identity": "IT-111 Lift-Rail Greaves", - "slot": "Feet / heavy gear", - "tier": "T2 / CH-03", - "flag": "S", - "effect": "Forced movement speed is 30% slower, extending reaction time but not changing destination.", - "build": "Synergy manual intervention; countered by instant swaps.", - "source": "Smelter lift reward; U-N.", - "production": "Rail-clamp greaves; brake squeal." - }, - { - "identity": "IT-112 Sootglass Monocle", - "slot": "Head / optic", - "tier": "T2 / CH-03", - "flag": "S", - "effect": "Exposed enemies remain revealed through smoke/soot and take +12 ranged power.", - "build": "Synergy PR-B06; countered by cleanse.", - "source": "Chimney route vendor; U-N.", - "production": "Dark single lens; soot wipe." - }, - { - "identity": "IT-113 Assembly Apron", - "slot": "Body / device cloth", - "tier": "T2 / CH-03", - "flag": "S", - "effect": "Each active allied device grants wearer 4 Guard, maximum 12.", - "build": "Synergy device swarms; countered by object deletion.", - "source": "FAC-04 shop; U-N.", - "production": "Pocketed leather apron; tool rattle." - }, - { - "identity": "IT-114 Mint-Safe Cuff", - "slot": "Offhand / armor", - "tier": "T2 / CH-03", - "flag": "S", - "effect": "Resource-tax damage -15 while wearer holds 1 or less resource.", - "build": "Synergy spend-down play; countered by high reserves.", - "source": "Mint infirmary cache; U-N.", - "production": "Silver-lined cuff; dull stamp." - }, - { - "identity": "IT-115 Cooling Salts", - "slot": "Consumable / tonic", - "tier": "T2 / CH-03", - "flag": "S", - "effect": "Reduce allied Heat by 2; if Heat was 0, grant user 20 Guard instead.", - "build": "Synergy device builds; countered by no device pressure.", - "source": "SET-03 clinic; U-P.", - "production": "Blue salt ampoule; cooling hiss." - }, - { - "identity": "IT-116 Smelter Runner Wrap", - "slot": "Feet / cloth gear", - "tier": "T2 / CH-03", - "flag": "S", - "effect": "After crossing two bands in one action, wearer gains 14 Guard for 3 seconds.", - "build": "Synergy PR-B02; countered by Anchored.", - "source": "CHR-010 mastery; U-D.", - "production": "Singed ankle wrap; rail slide." - }, - { - "identity": "IT-117 Pressure Gauntlet", - "slot": "Offhand / control gear", - "tier": "T2 / CH-03", - "flag": "S", - "effect": "Forced-move power +12 while Pressure is nonzero; at zero no effect.", - "build": "Synergy CHR-012; countered by Calm effects.", - "source": "Overpressure optional clear; U-N.", - "production": "Gauge gauntlet; piston punch." - }, - { - "identity": "IT-118 Infirmary Ledgerleaf", - "slot": "Charm / medical record", - "tier": "T2 / CH-03", - "flag": "S", - "effect": "Healing +15 on allies carrying a transferred/suppressed debuff.", - "build": "Synergy PR-B04,PR-A08; countered by clean-state fights.", - "source": "Hidden ledger collection; U-N.", - "production": "Folded red leaf; page check." - }, - { - "identity": "IT-119 Embervault Mantle", - "slot": "Body / medium armor", - "tier": "T3 / CH-03", - "flag": "S", - "effect": "While at 3+ any profession resource, direct damage taken -10; resource drain removes benefit.", - "build": "Synergy resource savers; countered by taxes.", - "source": "Range summit chest; U-N.", - "production": "Layered black-orange mantle; banked coal hum." - }, - { - "identity": "IT-120 Kilnstep Masterwork", - "slot": "Mainhand / modular weapon", - "tier": "T3 / CH-03", - "flag": "S", - "effect": "Choose physical or magical tag before encounter; attacks of chosen tag gain 17 power, other tag loses 5.", - "build": "Synergy planned weakness; countered by shifting resistances.", - "source": "CH-03 completion craft; U-N.", - "production": "Reversible hammer/focus head; locking clunk." - }, - { - "identity": "IT-121 Marginkeeper Lens", - "slot": "Head / research optic", - "tier": "T2 / CH-04", - "flag": "B", - "effect": "First researched variant clause each encounter becomes a selectable target-priority condition for wearer.", - "build": "Synergy PR-B06,PR-A17; countered by unresearched/base enemies.", - "source": "Archive orientation; U-0.", - "production": "Leaf-tab lens; tab slides." - }, - { - "identity": "IT-122 Footnote Sandals", - "slot": "Feet / echo gear", - "tier": "T2 / CH-04", - "flag": "B", - "effect": "After an item Echo resolves, wearer returns to the band occupied before source skill if legal; 8-second cooldown.", - "build": "Synergy mobile Echoes; countered by Anchored or closed band.", - "source": "Annotation path; U-C.", - "production": "Bracket-strap sandals; page-turn step." - }, - { - "identity": "IT-123 Contradiction Brooch", - "slot": "Charm / cadence tool", - "tier": "T2 / CH-04", - "flag": "B", - "effect": "Repeating an active twice Arms brooch; using a different active consumes it to make user Tuned and Expose current target.", - "build": "Synergy deliberate bait patterns; countered by Hush on different skill.", - "source": "Preserve both charter leaves; U-N.", - "production": "Split leaf brooch; mismatch chord." - }, - { - "identity": "IT-124 Tactile Route Stake", - "slot": "Consumable / plan tool", - "tier": "T2 / CH-04", - "flag": "B", - "effect": "Place a 5-second safe crossing; first ally ignores terrain and first enemy entering becomes Marked.", - "build": "Synergy PR-A10,CHR-016; countered by ranged enemies.", - "source": "Unlettered root path; U-P.", - "production": "Raised white stake; ground tap." - }, - { - "identity": "IT-125 Echo-Limit Ribbon", - "slot": "Back / repeat ward", - "tier": "T2 / CH-04", - "flag": "B", - "effect": "Wearer's first Echo each encounter resolves at 55%; any second Echo is Hushed and grants 15 Guard instead.", - "build": "Synergy one decisive Echo; countered by multi-Echo builds.", - "source": "Field-desk tutorial; U-N.", - "production": "One bright/one cut ribbon; full then muted note." - }, - { - "identity": "IT-126 Living Index", - "slot": "Charm / target tool", - "tier": "T2 / CH-04", - "flag": "B", - "effect": "Marking a fully researched enemy also lists the last three action tags used against it; choosing unused tag adds 20 stability damage.", - "build": "Synergy varied parties; countered by ordinary enemies without stability.", - "source": "Complete 10 bestiary researches; U-0.", - "production": "Sprouting index tabs; three paper taps." - }, - { - "identity": "IT-127 Consent Pruner", - "slot": "Mainhand / utility shears", - "tier": "T2 / CH-04", - "flag": "B", - "effect": "Remove one allied timed buff early to prevent enemy theft; wearer heals target 30. Cannot remove debuffs/passives.", - "build": "Synergy against EN-O022,EN-E011; countered by no removable buff.", - "source": "Personal-testimony quest; U-N.", - "production": "Rounded pruning shears; clean snip and balm tone." - }, - { - "identity": "IT-128 Field Folio", - "slot": "Offhand / skill tool", - "tier": "T2 / CH-04", - "flag": "B", - "effect": "Once per encounter swap one equipped active for its profession's other listed active; new skill begins with 3-second cooldown.", - "build": "Synergy variant adaptation; countered by sealed loadout.", - "source": "Field-crafting unlock; U-0.", - "production": "Folding green folio; card slide." - }, - { - "identity": "IT-129 Palimpsest Ink", - "slot": "Consumable / target dye", - "tier": "T2 / CH-04", - "flag": "B", - "effect": "Paint one enemy for 6 seconds; decoys copy color but not dotted underline, and Mark always transfers to true source.", - "build": "Synergy decoy counters; countered by cleanse.", - "source": "Moonlit margin gather; U-P.", - "production": "Black-white ink ampoule; brush flick." - }, - { - "identity": "IT-130 Dispute Cord", - "slot": "Charm / link tool", - "tier": "T2 / CH-04", - "flag": "B", - "effect": "Linked allies using different action tags extend link 1 second, maximum +3; matching tags remove 1 second.", - "build": "Synergy PR-B11,CHR-015; countered by forced repeated counters.", - "source": "Mediator scene reward; U-D.", - "production": "Mismatched knotted cord; alternating plucks." - }, - { - "identity": "IT-131 Archive Errata Seal", - "slot": "Offhand / terrain tool", - "tier": "T2 / CH-04", - "flag": "B", - "effect": "Once per encounter, cancel a terrain inversion and preserve original rule for 3 seconds.", - "build": "Synergy against EN-E012; countered by terrain replacement rather than inversion.", - "source": "Restore field desk; U-0.", - "production": "Black-white flip seal; correction knock." - }, - { - "identity": "IT-132 Advocate Shear", - "slot": "Mainhand / anti-ban tool", - "tier": "T3 / CH-04", - "flag": "B", - "effect": "When an enemy bans a secondary clause, basic attacks by wearer fill one of the required response slots as a unique action once.", - "build": "Synergy anti-pruning; countered by base-action bans not present in contract.", - "source": "Drop EN-E010; U-0.", - "production": "Single long shear blade; response snip." - }, - { - "identity": "IT-133 Clause Antler Ring", - "slot": "Head / buff monitor", - "tier": "T3 / CH-04", - "flag": "B", - "effect": "At 3+ allied buff clauses, wearer may discard oldest buff to apply Exposed to a charging enemy; once per 6 seconds.", - "build": "Synergy buff control; countered by no charging target.", - "source": "Drop EN-E011; U-C.", - "production": "Small labeled antler circlet; branch crack." - }, - { - "identity": "IT-134 Errata Soleplate", - "slot": "Feet / terrain gear", - "tier": "T3 / CH-04", - "flag": "B", - "effect": "First inverted terrain crossed each phase treats wearer by original rule; UI shows both outcomes.", - "build": "Synergy PR-A10; countered by non-inversion hazards.", - "source": "Drop EN-E012; U-0.", - "production": "Reversible black/white sole; flip click." - }, - { - "identity": "IT-135 Blank-Fill Docket", - "slot": "Charm / information tool", - "tier": "T3 / CH-04", - "flag": "B", - "effect": "Once per encounter restore one missing telegraph field: target, band, or clause. If no field is missing, item remains unused.", - "build": "Synergy information checks; countered by timing-only pressure.", - "source": "Drop EN-S004; U-0.", - "production": "Sliding blank card; type-block return." - }, - { - "identity": "IT-136 Redaction Antler", - "slot": "Relic / boss-bound", - "tier": "T3 / CH-04", - "flag": "B", - "effect": "When wearer's active secondary clause is erased, its base action gains 35 power/healing and counts as a different action for sequence tests.", - "build": "Synergy clause-heavy builds; countered by full Hush before activation.", - "source": "Drop EN-B004; U-0.", - "production": "One red leaf tine; erased-to-solid chord." - }, - { - "identity": "IT-137 Preserved Annotation", - "slot": "Charm / accord item", - "tier": "T3 / CH-04", - "flag": "B", - "effect": "Route previews show optional variant clauses and one hidden counter icon; each preserved clue adds 5% enemy vitality on that route.", - "build": "Synergy research/collection; countered by rushed low-risk plans.", - "source": "Preserve disputed annotations; U-0.", - "production": "Layered leaf note; whisper-free page rustle." - }, - { - "identity": "IT-138 Pruned Shortcut Map", - "slot": "Charm / accord item", - "tier": "T3 / CH-04", - "flag": "B", - "effect": "Remove one ordinary encounter from a route, but first elite enters with 20 stability. Toggle at route start.", - "build": "Synergy speed clears; countered by weak elite control.", - "source": "Prune disputed annotations; U-0.", - "production": "Clean-cut map leaf; single shears snap." - }, - { - "identity": "IT-139 Right-to-Forget Case", - "slot": "Charm / cleanse tool", - "tier": "T2 / CH-04", - "flag": "B", - "effect": "Once per route, remove one optional character-memory modifier before combat; forgo its collection progress for that segment.", - "build": "Synergy relationship safety; countered by collection completion goals.", - "source": "Consent quest finale; U-0.", - "production": "Opaque green case; gentle latch." - }, - { - "identity": "IT-140 Many-Hands Commentary", - "slot": "Back / chapter accord", - "tier": "T3 / CH-04", - "flag": "B", - "effect": "After three different allies target one researched enemy, fourth ally may retarget freely without AI penalty and gains Tuned.", - "build": "Synergy coordinated Mark; countered by decoy splits.", - "source": "Chapter court resolution; U-0.", - "production": "Multi-tab mantle; layered page fan." - }, - { - "identity": "IT-141 Margin-Midge Wing", - "slot": "Charm / buff gear", - "tier": "T2 / CH-04", - "flag": "S", - "effect": "While wearer has exactly one timed buff, its magnitude is +12; zero or 2+ buffs get no bonus.", - "build": "Synergy minimalist buffs; countered by buff theft/addition.", - "source": "Drop EN-O022; U-N.", - "production": "Tabbed translucent wing; fine flutter." - }, - { - "identity": "IT-142 Footnote Tendril", - "slot": "Charm / Echo gear", - "tier": "T2 / CH-04", - "flag": "S", - "effect": "Item/profession Echo power +10 while source occupies a different band.", - "build": "Synergy cross-band Echo; countered by same-band clustering.", - "source": "Drop EN-O023; U-N.", - "production": "Bracket vine loop; soft repeat rustle." - }, - { - "identity": "IT-143 Inkjaw Guard", - "slot": "Head / repeat armor", - "tier": "T2 / CH-04", - "flag": "S", - "effect": "Damage from repeat-punishing attacks -20 while wearer's last two tags differ.", - "build": "Synergy varied rotations; countered by forced repeats.", - "source": "Drop EN-O024; U-N.", - "production": "Square-jaw brow plate; paper punch." - }, - { - "identity": "IT-144 Charter Feather", - "slot": "Mainhand / focus", - "tier": "T2 / CH-04", - "flag": "S", - "effect": "Power +14 against enemies maintaining a rule ring/zone.", - "build": "Synergy zone breakers; countered by direct attackers.", - "source": "Drop EN-O025; U-N.", - "production": "Leaf-paper feather; brush slash." - }, - { - "identity": "IT-145 Clerk Rootplate", - "slot": "Body / medium armor", - "tier": "T2 / CH-04", - "flag": "S", - "effect": "After taking three hits of one tag, gain 18 Guard until hit by another tag.", - "build": "Synergy predictable enemies; countered by mixed tags.", - "source": "Drop EN-O026; U-N.", - "production": "Tabbed root cuirass; drawer close." - }, - { - "identity": "IT-146 Hare Underline", - "slot": "Feet / decoy gear", - "tier": "T2 / CH-04", - "flag": "S", - "effect": "Decoys last 1 second longer while wearer remains in original band.", - "build": "Synergy PR-B09; countered by area damage/movement.", - "source": "Drop EN-O027; U-D.", - "production": "Ink underline anklet; page peel." - }, - { - "identity": "IT-147 Redleaf Fan", - "slot": "Offhand / zone armor", - "tier": "T2 / CH-04", - "flag": "S", - "effect": "Damage taken from reactions to repeated skills -18; object deletion still occurs.", - "build": "Synergy repeat bait; countered by primary damage.", - "source": "Drop EN-O028; U-N.", - "production": "Red leaf hand fan; crisp sweep." - }, - { - "identity": "IT-148 Margin House Robe", - "slot": "Body / caster cloth", - "tier": "T2 / CH-04", - "flag": "S", - "effect": "At 3 unique stored Facets/tags, wearer gains 16 Guard; duplicates do not count.", - "build": "Synergy PR-A05; countered by tag erasure.", - "source": "SET-04 shop; U-N.", - "production": "Tabbed scholar robe; three glass notes." - }, - { - "identity": "IT-149 Archive Gardener Glove", - "slot": "Offhand / zone gear", - "tier": "T2 / CH-04", - "flag": "S", - "effect": "Placed zones gain 10% duration while no other allied zone exists.", - "build": "Synergy single-zone builds; countered by multiple devices/zones.", - "source": "Groundskeeper quest; U-N.", - "production": "Bark glove; seed press." - }, - { - "identity": "IT-150 Specimen Satchel", - "slot": "Back / research gear", - "tier": "T2 / CH-04", - "flag": "S", - "effect": "Fully researched ordinary enemies drop 10% more salvage; no combat power.", - "build": "Synergy collection routes; countered by elites/unresearched enemies.", - "source": "Research 20 identities; U-0.", - "production": "Labeled green satchel; specimen latch." - }, - { - "identity": "IT-151 Canopy Bow", - "slot": "Mainhand / ranged", - "tier": "T2 / CH-04", - "flag": "S", - "effect": "Ranged power +16 when firing through an allied zone; outside zone line unchanged.", - "build": "Synergy PR-B05; countered by zone destruction.", - "source": "Canopy route chest; U-N.", - "production": "Bent living-wood bow; leaf-string twang." - }, - { - "identity": "IT-152 Disputed Leafplate", - "slot": "Body / heavy armor", - "tier": "T2 / CH-04", - "flag": "S", - "effect": "When two exclusive buffs collide, wearer gains 18 Guard before one is removed.", - "build": "Synergy later PR-A24; countered by dispel.", - "source": "Charter court vendor; U-N.", - "production": "Two-tone leaf scales; opposing chime." - }, - { - "identity": "IT-153 Quiet Reading Shoes", - "slot": "Feet / support gear", - "tier": "T2 / CH-04", - "flag": "S", - "effect": "Not acting for 2 seconds grants 12 Guard; acting removes it.", - "build": "Synergy PR-A11,PR-B07; countered by damage-over-time.", - "source": "Margin House study; U-N.", - "production": "Felted green shoes; room tone hush." - }, - { - "identity": "IT-154 Glossary Ribbon", - "slot": "Charm / localization token", - "tier": "T2 / CH-04", - "flag": "S", - "effect": "First enemy clause revealed each encounter remains displayed 2 seconds longer; no mechanical delay.", - "build": "Synergy comprehension; countered by already persistent UI.", - "source": "Complete archive glossary; U-D.", - "production": "White labeled ribbon; page marker." - }, - { - "identity": "IT-155 Rootpath Canteen", - "slot": "Consumable / tonic", - "tier": "T2 / CH-04", - "flag": "S", - "effect": "Heal 50; if user crossed terrain this action, heal 75.", - "build": "Synergy mobile route units; countered by Anchored.", - "source": "Rootpath gather; U-P.", - "production": "Bark canteen; water/leaf shake." - }, - { - "identity": "IT-156 Inkproof Cowl", - "slot": "Head / cloth armor", - "tier": "T2 / CH-04", - "flag": "S", - "effect": "Clause-suppression duration -20% while wearer is Marked; without Mark no effect.", - "build": "Synergy deliberate bait; countered by unmarked Hush.", - "source": "Redactor annex; U-N.", - "production": "Black wax cowl; ink rolloff." - }, - { - "identity": "IT-157 Court Listener Pin", - "slot": "Charm / link gear", - "tier": "T2 / CH-04", - "flag": "S", - "effect": "Linked allies with different roles receive +8 healing from shared effects.", - "build": "Synergy PR-B11; countered by same-role links.", - "source": "Mediator court reward; U-N.", - "production": "Two-ear pin; paired breath." - }, - { - "identity": "IT-158 Pruned-Branch Spear", - "slot": "Mainhand / polearm", - "tier": "T3 / CH-04", - "flag": "S", - "effect": "Power +19 while only two formation bands are legal; otherwise +0.", - "build": "Synergy pruned routes; countered by full formation.", - "source": "Pruned route optional chest; U-N.", - "production": "Clean forked spear; branch cut." - }, - { - "identity": "IT-159 Annotated Barkcoat", - "slot": "Body / medium armor", - "tier": "T3 / CH-04", - "flag": "S", - "effect": "Against a researched enemy, first hit per identity deals 16 less damage.", - "build": "Synergy bestiary completion; countered by summons/new variants.", - "source": "Preserve route optional chest; U-N.", - "production": "Written bark coat; tab confirmation." - }, - { - "identity": "IT-160 Verdant Archive Seal", - "slot": "Charm / chapter token", - "tier": "T3 / CH-04", - "flag": "S", - "effect": "At 4+ different action tags used this phase, party healing received +6%; resets next phase.", - "build": "Synergy varied parties; countered by Hush/repetition.", - "source": "CH-04 completion; U-N.", - "production": "Green civic seal; four-leaf chord." - }, - { - "identity": "IT-161 Truewake Compass", - "slot": "Offhand / identity optic", - "tier": "T3 / CH-05", - "flag": "B", - "effect": "Mark on a decoy transfers to source and reveals its next target rule for 3 seconds; once per identity.", - "build": "Synergy PR-B06,CHR-018; countered by decoyless fights.", - "source": "Harbor verification tutorial; U-D.", - "production": "Double needle, one solid; resolving ping." - }, - { - "identity": "IT-162 Rescue-Knot Harness", - "slot": "Body / movement gear", - "tier": "T3 / CH-05", - "flag": "B", - "effect": "When wearer intercepts a pull/hook line, original target gains Anchored and wearer becomes Exposed for 2 seconds.", - "build": "Synergy protectors; countered by area hooks/focus.", - "source": "Beacon rescue route; U-D.", - "production": "Orange rope harness; catch-and-brace." - }, - { - "identity": "IT-163 Asymmetric Rudder", - "slot": "Mainhand / control pole", - "tier": "T3 / CH-05", - "flag": "B", - "effect": "Forced move on an enemy chooses opposite direction from wearer's last forced move; if illegal, Expose instead.", - "build": "Synergy alternating movement; countered by Anchored.", - "source": "Reef route chest; U-N.", - "production": "Offset glass rudder; left/right water knocks." - }, - { - "identity": "IT-164 Split-Manifest Case", - "slot": "Charm / AI tool", - "tier": "T3 / CH-05", - "flag": "B", - "effect": "Store two target-priority presets; wearer swaps between them after hitting a decoy or true source.", - "build": "Synergy target scripts; countered by target-rule locks.", - "source": "Customs appeal quest; U-0.", - "production": "Two-pocket clear case; card swap." - }, - { - "identity": "IT-165 Moon-Tide Attuner", - "slot": "Relay / item module", - "tier": "T3 / CH-05", - "flag": "B", - "effect": "Choose one equipped item's conditional state before encounter; at moon-tide high, invert its band condition for battle. Numeric value unchanged.", - "build": "Synergy band-specific S items; countered by items without band conditions.", - "source": "Attunement unlock; U-0.", - "production": "Crescent tuning dial; high-tide flip." - }, - { - "identity": "IT-166 Beacon Return Flare", - "slot": "Consumable / rescue tool", - "tier": "T3 / CH-05", - "flag": "B", - "effect": "Move lowest-vitality ally to Rear and grant 20 Guard; if Rear closed/occupied, remain and become Anchored.", - "build": "Synergy rescue teams; countered by Rear hazards.", - "source": "Rescue contract stock; U-P.", - "production": "Orange diamond flare; upward whistle." - }, - { - "identity": "IT-167 Tideglass Decoy", - "slot": "Consumable / target tool", - "tier": "T3 / CH-05", - "flag": "B", - "effect": "Place 1-hit decoy in chosen band for 5 seconds; it inherits wearer's target priority but no buffs.", - "build": "Synergy PR-B09; countered by area damage and decoy-aware Marks.", - "source": "Tideglass workshop; U-P.", - "production": "Striped glass silhouette; splash-shatter." - }, - { - "identity": "IT-168 Appeal Lens", - "slot": "Head / information optic", - "tier": "T3 / CH-05", - "flag": "B", - "effect": "Once per encounter, change one enemy scan result from highest-tier item to lowest-tier item; scan remains visible.", - "build": "Synergy against item suppression; countered by no scan.", - "source": "Prove planted manifest; U-0.", - "production": "Reversible document lens; appeal stamp." - }, - { - "identity": "IT-169 Two-Cuff Coat", - "slot": "Body / identity cloth", - "tier": "T3 / CH-05", - "flag": "B", - "effect": "After wearer swaps with own decoy, choose to preserve buffs from origin or terrain state from destination, not both.", - "build": "Synergy PR-A18,CHR-019; countered by no meaningful state.", - "source": "Memory-echo protection quest; U-0.", - "production": "Mismatched cuffs; choice chime." - }, - { - "identity": "IT-170 Rescue-First Bell", - "slot": "Charm / intervention", - "tier": "T3 / CH-05", - "flag": "B", - "effect": "At 25% Intervention or higher, spend 25% to cancel one enemy target change onto ally below 30% vitality; once per encounter.", - "build": "Synergy fragile teams; countered by fixed target already on ally.", - "source": "Beacon authority decision; U-0.", - "production": "Orange handbell; cutoff ring." - }, - { - "identity": "IT-171 Customs Proofchain", - "slot": "Charm / targeting", - "tier": "T3 / CH-05", - "flag": "B", - "effect": "Three different allies hitting same Marked source make it immune to decoy redirection for 5 seconds.", - "build": "Synergy focus teams; countered by target bans and summons.", - "source": "Customs authority decision; U-D.", - "production": "Three-link glass chain; proof locks." - }, - { - "identity": "IT-172 Embossed Captain Seal", - "slot": "Head / decoy optic", - "tier": "T3 / CH-05", - "flag": "B", - "effect": "First false target hit each phase refunds attack cooldown by 1 second and Marks true source; no damage refund.", - "build": "Synergy fast correction; countered by no identifiable source.", - "source": "Drop EN-E013; U-N.", - "production": "Embossed brow seal; offset whistle." - }, - { - "identity": "IT-173 Twinwake Saber", - "slot": "Mainhand / blade", - "tier": "T3 / CH-05", - "flag": "B", - "effect": "Movement skill creates a 40%-power path strike 1 second later; wearer becomes Exposed until Echo resolves. Item Echo cannot Echo.", - "build": "Synergy PR-B02; countered by Anchored and retaliation.", - "source": "Drop EN-E014; U-N.", - "production": "Paired wake blade; delayed slash." - }, - { - "identity": "IT-174 Inspection Prism", - "slot": "Head / item defense", - "tier": "T3 / CH-05", - "flag": "B", - "effect": "When an item clause is suppressed, wearer may suppress a second own item clause to cleanse the first; second remains Hushed 6 seconds.", - "build": "Synergy multi-item loadouts; countered by single crucial item.", - "source": "Drop EN-E015; U-0.", - "production": "Sliding prism visor; two denial tones." - }, - { - "identity": "IT-175 Contradiction Seal", - "slot": "Charm / decoy breaker", - "tier": "T3 / CH-05", - "flag": "B", - "effect": "Hitting a noncertified decoy removes 20 stability from its certifier and refunds 50% action recovery; once per 4 seconds.", - "build": "Synergy against certification; countered by true-only enemies.", - "source": "Drop EN-S005; U-C.", - "production": "Cracked coral seal; brittle stamp." - }, - { - "identity": "IT-176 Intercept Winch", - "slot": "Back / hook defense", - "tier": "T3 / CH-05", - "flag": "B", - "effect": "Voluntarily crossing a visible hook rail pulls wearer into it and grants original target 30 Guard; wearer takes hook normally.", - "build": "Synergy tanks/linkers; countered by closed band and area hooks.", - "source": "Drop EN-S006; U-N.", - "production": "Compact orange winch; line catch." - }, - { - "identity": "IT-177 Inverse Sextant", - "slot": "Relic / boss-bound", - "tier": "T4 / CH-05", - "flag": "B", - "effect": "After party uses three different target priorities, next enemy mirror/copy clause resolves on its own side at 40% power; once per phase.", - "build": "Synergy diverse scripts; countered by uniform AI or noncopy enemies.", - "source": "Drop EN-B005; U-0.", - "production": "Inverted ship sextant; backward-to-forward chord." - }, - { - "identity": "IT-178 Rescue Beacon Charter", - "slot": "Charm / accord item", - "tier": "T3 / CH-05", - "flag": "B", - "effect": "Route preview exposes casualty-risk detours; accepting one starts party at -10 Guard but guarantees a rescue item reward.", - "build": "Synergy recovery builds; countered by fragile openers.", - "source": "Restore rescue beacons first; U-0.", - "production": "Orange civic plate; rescue pulse." - }, - { - "identity": "IT-179 Customs Verification Charter", - "slot": "Charm / accord item", - "tier": "T3 / CH-05", - "flag": "B", - "effect": "Shops identify one counterfeit offer per segment; rejecting it grants free reroll, buying it yields behavior item with one clause Hushed for route.", - "build": "Synergy risk buyers; countered by limited funds.", - "source": "Restore customs first; U-0.", - "production": "Clear seal plate; scan approve/deny." - }, - { - "identity": "IT-180 Port Lacuna Accord", - "slot": "Relay / chapter accord", - "tier": "T4 / CH-05", - "flag": "B", - "effect": "Once per encounter, when two allied actions have different targets and tags, create one 35-power shared Echo split between both targets.", - "build": "Synergy asymmetric parties; countered by one target or Hush.", - "source": "Resolve duplicate-manifest crisis; U-0.", - "production": "Twin tide relay; split water chord." - }, - { - "identity": "IT-181 Mirrorclaw Shell", - "slot": "Offhand / shield", - "tier": "T3 / CH-05", - "flag": "S", - "effect": "While wearer's Guard exactly matches an enemy's, direct power +15; any Guard change ends match.", - "build": "Synergy Guard copying; countered by chip damage.", - "source": "Drop EN-O029; U-N.", - "production": "Half-polished crab shield; glass clack." - }, - { - "identity": "IT-182 Undertide Conch", - "slot": "Charm / pull gear", - "tier": "T3 / CH-05", - "flag": "S", - "effect": "Pull power +14 when target is farther than one band; adjacent pulls unchanged.", - "build": "Synergy PR-B10; countered by Anchored.", - "source": "Drop EN-O030; U-N.", - "production": "Spiral blue conch; deep draw." - }, - { - "identity": "IT-183 Manifest Feather", - "slot": "Charm / Mark gear", - "tier": "T3 / CH-05", - "flag": "S", - "effect": "While wearer is Marked, speed +15%; unmarked no benefit.", - "build": "Synergy deliberate bait; countered by focus fire.", - "source": "Drop EN-O031; U-N.", - "production": "Receipt gull feather; paper flutter." - }, - { - "identity": "IT-184 Copywake Coat", - "slot": "Body / cloth", - "tier": "T3 / CH-05", - "flag": "S", - "effect": "Damage from copied basic attacks -18; copied actives unaffected.", - "build": "Synergy copy encounters; countered by original skills.", - "source": "Drop EN-O032; U-N.", - "production": "Hatched raincoat; wet boot echo." - }, - { - "identity": "IT-185 Beacon Forearm", - "slot": "Offhand / targeting gear", - "tier": "T3 / CH-05", - "flag": "S", - "effect": "Mark duration +1 second when wearer is lowest-vitality ally.", - "build": "Synergy rescue bait; countered by healing changing rank.", - "source": "Drop EN-O033; U-D.", - "production": "Lamp-braced gauntlet; focus ping." - }, - { - "identity": "IT-186 Foamline Mantle", - "slot": "Body / light armor", - "tier": "T3 / CH-05", - "flag": "S", - "effect": "Area damage -15 while wearer stands alone in band.", - "build": "Synergy spread formation; countered by forced clustering.", - "source": "Drop EN-O034; U-N.", - "production": "Dotted foam cape; bubble roll." - }, - { - "identity": "IT-187 Moonlock Buckle", - "slot": "Charm / timer gear", - "tier": "T3 / CH-05", - "flag": "S", - "effect": "Paused buffs resume with +1 second if wearer changed bands during pause.", - "build": "Synergy EN-O035 counterplay; countered by Anchored.", - "source": "Drop EN-O035; U-D.", - "production": "Moon-disc buckle; pause/resume chime." - }, - { - "identity": "IT-188 Port Lacuna Boots", - "slot": "Feet / harbor gear", - "tier": "T3 / CH-05", - "flag": "S", - "effect": "Speed +18% while a decoy occupies wearer's band.", - "build": "Synergy PR-B09; countered by area clearing.", - "source": "SET-05 shop; U-N.", - "production": "Glass-soled deck boots; twin steps." - }, - { - "identity": "IT-189 Reefguard Vest", - "slot": "Body / medium armor", - "tier": "T3 / CH-05", - "flag": "S", - "effect": "Guard gain +12 in Front during high tide; low tide no benefit.", - "build": "Synergy visible tide clock; countered by low tide.", - "source": "Reef route chest; U-N.", - "production": "Coral-panel vest; tide knock." - }, - { - "identity": "IT-190 Rescue Captain Rope", - "slot": "Back / link gear", - "tier": "T3 / CH-05", - "flag": "S", - "effect": "Healing received +14 immediately after pull/intercept, lasting 3 seconds.", - "build": "Synergy CHR-017; countered by anti-heal.", - "source": "Rescue rank 2; U-D.", - "production": "Orange coil; rope catch." - }, + "id": "BO-R2-02", + "name": "The Drowned Bell", + "class": "RG-02", + "rule": "Sound pulses link two allied positions; healing, movement, or cleanse on one echoes as a cost on the other.", + "responses": "Interrupt chosen pulse family; place two durable units in linked indices and stagger actions. Failure: linked cost chained through recovery.", + "production": "Each third pulse links three consecutive positions. P/A/V/S/M: submerged bell body, rope/current motions, link glyph suite, caption-first bell motif." + }, + { + "id": "BO-R3-01", + "name": "Furnace That Walks", + "class": "RG-03", + "rule": "Two-footprint kiln stores all battle actions as Pressure; weak-side vents push allies, strong-side damage accelerates rupture.", + "responses": "Alternate safe weak-side vent with brace; burst strong side before rupture. Failure: action density exceeded vent plan.", + "production": "Half vitality swaps weak/strong every cadence. P/A/V/S/M: walking kiln, side panels/vent, dual gauges, clay-metal boss rhythm." + }, + { + "id": "BO-R3-02", + "name": "Foreman Nine-Sparks", + "class": "RG-03", + "rule": "Commands eight small spark footprints plus self; every third identical player action tag promotes a spark into a copy of that tag's target rule.", + "responses": "Vary tags; allow a safe promotion then defeat promoted spark for reward charge. Failure: repetition built hostile copies.", + "production": "Half vitality promotes every second repeat but sparks lose Guard. P/A/V/S/M: tall stoker plus spark swarm, command/copy suite, repetition counter, nine-beat motif." + }, + { + "id": "BO-R4-01", + "name": "The Walking Index", + "class": "RG-04", + "rule": "Labels every position and advances a pointer after each action; boss action depends on pointer label: erase, copy, bind, or strike.", + "responses": "Manipulate action count to land safe label; interrupt to freeze pointer one action. Failure: unplanned action crossed dangerous label.", + "production": "Half vitality pointer moves backward on equipment triggers. P/A/V/S/M: root catalog giant, rotating tabs, full-line index cue, measured page-turn score." + }, + { + "id": "BO-R4-02", + "name": "Redaction Hart", + "class": "RG-04", + "rule": "Records four allied rules, visibly blacks out one target clause in each, then replays them against equivalent targets.", + "responses": "Seed rules whose missing clause becomes harmless; reorder before replay and interrupt most dangerous entry. Failure: seeded action converted to hostile target.", + "production": "Half vitality records six but displays replay order. P/A/V/S/M: ink-antler hart, record/redact/replay poses, crossed-clause cards, reversed string motif." + }, + { + "id": "BO-R5-01", + "name": "Mirror-Tide Leviathan", + "class": "RG-05", + "rule": "Source body and two echo footprints trade vulnerability: status, direct damage, and displacement each apply to one shown state.", + "responses": "Rotate action families with state; use persistent area and follow-source targeting. Failure: actions struck illegal echo state.", + "production": "Half vitality swaps state after every major action rather than cadence. P/A/V/S/M: long mirrored leviathan, three-state body kit, fill-pattern cues, phase-shift water score." + }, + { + "id": "BO-R5-02", + "name": "Beacon Below", + "class": "RG-05", + "rule": "Hidden source projects four surface lights; only one has a solid return tether, while false lights attack rearmost.", + "responses": "Inspect tether and strike source light; screen false projectiles and use area reveal. Failure: decoy focus left rear exposed.", + "production": "Half vitality true tether changes after every hit. P/A/V/S/M: submerged core/light rig, tether swaps, solid/dash accessibility, sonar-glass motif." + }, + { + "id": "BO-R6-01", + "name": "Grand Orchard Engine", + "class": "RG-06", + "rule": "Rail boss runs a four-stop schedule: board units, pull center, threaten cargo, vent. Player attacks can jam one future stop at cost of cargo Guard.", + "responses": "Jam dangerous stop with coordinated end attacks; preserve cargo and respond to fixed cycle. Failure: stop schedule collapsed line or cargo.", + "production": "Half vitality adds airborne harvest arm between stops. P/A/V/S/M: multi-car engine, stop-specific motions, timetable HUD cue, rail-orchard boss suite." + }, + { + "id": "BO-R6-02", + "name": "Queen of Updrafts", + "class": "RG-06", + "rule": "Airborne boss descends only when two different cadence bands overlap; landing pushes both lines outward and opens a damage window.", + "responses": "Synchronize two bands intentionally; guard outward push and burst on landing. Failure: uniform timing never grounded boss or bad landing order.", + "production": "Half vitality requires three bands but stays grounded longer. P/A/V/S/M: vast leaf-wing queen, circle/descent/launch, overlap clock cue, soaring-to-grounded motif." + }, + { + "id": "BO-R7-01", + "name": "Nightcurrent Judge", + "class": "RG-07", + "rule": "Hides one of four known major-action categories until current reveal; steals richest resource to power it, but stolen type predicts target band.", + "responses": "Spend to shape theft and prediction; accelerate reveal or interrupt after category opens. Failure: resource hoard powered unrevealed pressure.", + "production": "Half vitality current sweeps rear-to-front. P/A/V/S/M: basin-robed judge, steal/reveal/cast, resource-band clue cue, dark-to-bright score." + }, { - "identity": "IT-191 Verifier Sidearm", - "slot": "Mainhand / ranged", - "tier": "T3 / CH-05", - "flag": "S", - "effect": "Power +17 against a target whose rule is currently revealed.", - "build": "Synergy PR-B06; countered by hidden-rule enemies.", - "source": "Verification quest; U-N.", - "production": "Short lens-bow; seal shot." - }, - { - "identity": "IT-192 Tideglass Apron", - "slot": "Body / device cloth", - "tier": "T3 / CH-05", - "flag": "S", - "effect": "Recalled device value-to-healing +12 while device has over half duration remaining.", - "build": "Synergy PR-A15; countered by late recalls.", - "source": "Tideglass workshop; U-N.", - "production": "Etched clear apron; provenance tap." - }, - { - "identity": "IT-193 Moon-Tide Salts", - "slot": "Consumable / tonic", - "tier": "T3 / CH-05", - "flag": "S", - "effect": "High tide: gain 30 Guard. Low tide: heal 60. Tide is locked at use.", - "build": "Synergy tide planning; countered by wrong timing.", - "source": "Moon route gather; U-P.", - "production": "Silver/blue salt vial; two-mode wash." - }, - { - "identity": "IT-194 Customs Lamellar", - "slot": "Body / heavy armor", - "tier": "T3 / CH-05", - "flag": "S", - "effect": "Item-suppression duration -20% while wearer has 2+ S items equipped.", - "build": "Synergy stat loadouts; countered by behavior-heavy builds.", - "source": "Customs hall vendor; U-N.", - "production": "Clear document plates; scan rolloff." - }, - { - "identity": "IT-195 Asymmetric Earrings", - "slot": "Charm / cadence gear", - "tier": "T3 / CH-05", - "flag": "S", - "effect": "Alternating target sides grants +8 power per action, max 16; same side resets.", - "build": "Synergy multi-target combat; countered by single target.", - "source": "CHR-019 scene; U-N.", - "production": "Unequal glass drops; left/right chimes." - }, - { - "identity": "IT-196 Beaconkeeper Hood", - "slot": "Head / rescue gear", - "tier": "T3 / CH-05", - "flag": "S", - "effect": "At under 40% vitality, incoming Guard is +15; above threshold no effect.", - "build": "Synergy emergency rescue; countered by Guard removal.", - "source": "Beacon tower shop; U-T.", - "production": "Orange hood with diamond; alert tone." - }, - { - "identity": "IT-197 Tidal Appeal Token", - "slot": "Charm / faction gear", - "tier": "T3 / CH-05", - "flag": "S", - "effect": "Against certified/verified enemies, stability damage +10; ordinary power unchanged.", - "build": "Synergy sub-boss checks; countered by no stability.", - "source": "Dual-faction reputation; U-N.", - "production": "Two-seal token; docket click." - }, - { - "identity": "IT-198 Mirrorstep Cloak", - "slot": "Body / light armor", - "tier": "T3 / CH-05", - "flag": "S", - "effect": "First mirrored-target hit each encounter deals 22 less damage.", - "build": "Synergy boss opener; countered by later hits.", - "source": "Mirrorstep cliff chest; U-N.", - "production": "Split reflection cloak; glass slide." - }, - { - "identity": "IT-199 Lacuna Spyglass", - "slot": "Head / optic", - "tier": "T4 / CH-05", - "flag": "S", - "effect": "True-source Mark duration +2 seconds, but decoy Marks last 1 second less.", - "build": "Synergy decoy hunters; countered by Mark cleanse.", - "source": "All rescue/customs evidence; U-D.", - "production": "Long dual-focus glass; resolve click." - }, - { - "identity": "IT-200 Two-Tide Coat", - "slot": "Body / chapter armor", - "tier": "T4 / CH-05", - "flag": "S", - "effect": "When tide changes, wearer gains 18 Guard and loses 5% speed for 4 seconds.", - "build": "Synergy phase transitions; countered by static tide.", - "source": "CH-05 completion; U-D.", - "production": "Blue/silver reversible coat; tide turn." - }, - { - "identity": "IT-201 Rotating Steward Baton", - "slot": "Offhand / command tool", - "tier": "T3 / CH-06", - "flag": "B", - "effect": "Commanding a different ally than last command grants that ally 15 Guard; same ally twice gives no Guard.", - "build": "Synergy PR-B12,CHR-024; countered by single-counter specialists.", - "source": "First ward council; U-N.", - "production": "Four-color baton; handoff clicks." - }, - { - "identity": "IT-202 Kite-Rider Tether", - "slot": "Back / movement gear", - "tier": "T3 / CH-06", - "flag": "B", - "effect": "Voluntarily following Drift grants 1 Cover or Tempo matching profession; second follow within 5 seconds applies Exposed.", - "build": "Synergy CHR-021,PR-B02; countered by focus during exposure.", - "source": "Exposed updraft route; U-D.", - "production": "Bright kite tether; rush then warning snap." - }, - { - "identity": "IT-203 Consensus Dial", - "slot": "Charm / AI tool", - "tier": "T3 / CH-06", - "flag": "B", - "effect": "Before encounter assign obey or resist to two roles; first gust lets those roles auto-follow assignment, then dial turns off.", - "build": "Synergy mixed movement responses; countered by changed forecast.", - "source": "Two ward councils; U-0.", - "production": "Split arrow dial; two consent tones." - }, - { - "identity": "IT-204 Calm-Eye Umbrella", - "slot": "Offhand / zone tool", - "tier": "T3 / CH-06", - "flag": "B", - "effect": "Create a 4-second calm zone: Drift cannot move units inside, but their speed is 15% lower. One zone per encounter.", - "build": "Synergy stationary casters; countered by area collapse.", - "source": "Calm-eye detour; U-0.", - "production": "Angular white umbrella; wind drops." - }, - { - "identity": "IT-205 Weather Script Spool", - "slot": "Relay / forecast module", - "tier": "T3 / CH-06", - "flag": "B", - "effect": "Once per encounter reorder two adjacent steps in a fully previewed gust cycle; cannot change effects.", - "build": "Synergy formation presets; countered by unsequenced weather.", - "source": "Weather board repair; U-0.", - "production": "Numbered kite spool; adjacent swap." - }, - { - "identity": "IT-206 Liftshare Harness", - "slot": "Body / link gear", - "tier": "T3 / CH-06", - "flag": "B", - "effect": "Linked allies split forced movement: first moves, second becomes Anchored; alternate on next effect.", - "build": "Synergy PR-B11; countered by simultaneous movement and link sever.", - "source": "Stranded ward rescue; U-N.", - "production": "Paired lift straps; alternating latch." - }, - { - "identity": "IT-207 Headwind Vane", - "slot": "Head / pressure tool", - "tier": "T3 / CH-06", - "flag": "B", - "effect": "At positive Pressure wearer forces moves normally; at negative Pressure their pushes become pulls of same magnitude.", - "build": "Synergy PR-A16; countered by zero Pressure or illegal destination.", - "source": "Outer weather board; U-0.", - "production": "Reversible head vane; wind flips side." - }, - { - "identity": "IT-208 Four-Ward Preset Card", - "slot": "Charm / formation tool", - "tier": "T3 / CH-06", - "flag": "B", - "effect": "Once per encounter swap entire formation to saved legal preset over 1 second; units crossing hazards still trigger them.", - "build": "Synergy rotation fights; countered by Anchored/closed bands.", - "source": "Visit all four wards; U-0.", - "production": "Four-panel card; group footfall." - }, - { - "identity": "IT-209 Emergency Termglass", - "slot": "Charm / intervention", - "tier": "T3 / CH-06", - "flag": "B", - "effect": "When Intervention is spent on movement, begin a 6-second term; another movement intervention during term costs +10% meter and makes first user Tuned.", - "build": "Synergy intervention chains; countered by insufficient meter.", - "source": "Governance debate; U-D.", - "production": "Sandglass with rotating chair; double bell." - }, - { - "identity": "IT-210 Cloudbridge Stake", - "slot": "Consumable / route tool", - "tier": "T3 / CH-06", - "flag": "B", - "effect": "Create one crossing between Front and Rear for a single unit, skipping Mid; cannot bypass closed outer band.", - "build": "Synergy route escape; countered by Anchored and destination occupancy.", - "source": "Lift dock craft; U-P.", - "production": "Kite-line stake; long zip." - }, - { - "identity": "IT-211 Thunder Groundline", - "slot": "Offhand / discharge tool", - "tier": "T3 / CH-06", - "flag": "B", - "effect": "Forced-moving an enemy redirects its destination lightning to nearest enemy at 50%; wearer takes 15 recoil.", - "build": "Synergy PR-B10; countered by no discharge or enemy isolation.", - "source": "Abandoned ward route; U-N.", - "production": "Copper grounding cord; split thunder." - }, - { - "identity": "IT-212 Usher Ribbon", - "slot": "Back / Drift tool", - "tier": "T4 / CH-06", - "flag": "B", - "effect": "On Drift choice, wearer may resist without Guard or ride without resource gain to avoid empowering either side; once per phase.", - "build": "Synergy neutral choice; countered by mandatory destination mechanics.", - "source": "Drop EN-E016; U-0.", - "production": "Gray neutral ribbon; wind hush." - }, - { - "identity": "IT-213 Uncrowned Crest", - "slot": "Head / decree tool", - "tier": "T4 / CH-06", - "flag": "B", - "effect": "First band decree each phase can be contested: wearer outside essential band deals normal power but takes +10 direct damage.", - "build": "Synergy ranged contest; countered by low vitality.", - "source": "Drop EN-E017; U-N.", - "production": "Broken hollow crest; brass refusal." - }, - { - "identity": "IT-214 Rotation Gyro", - "slot": "Relay / terrain module", - "tier": "T4 / CH-06", - "flag": "B", - "effect": "Once per encounter freeze one forecast terrain rotation for 2 seconds, then it resumes from same step.", - "build": "Synergy timed crossings; countered by nonrotating hazards.", - "source": "Drop EN-E018; U-0.", - "production": "Three-ring gyro; lock then resume." - }, - { - "identity": "IT-215 Dissent Gavel", - "slot": "Mainhand / movement focus", - "tier": "T4 / CH-06", - "flag": "B", - "effect": "A movement response different from previous ally deals 25 stability to ruling source; repeating deals wearer 15 damage.", - "build": "Synergy varied party; countered by no stability or forced same response.", - "source": "Drop EN-S007; U-N.", - "production": "Vane gavel; contrary wind crack." - }, - { - "identity": "IT-216 Thunderchain Capacitor", - "slot": "Relay / charge module", - "tier": "T4 / CH-06", - "flag": "B", - "effect": "Forced move that causes destination discharge stores 1 Charge; at 3, next intervention costs 15% less and empties.", - "build": "Synergy movement controllers; countered by safe no-discharge paths.", - "source": "Drop EN-S008; U-0.", - "production": "Four-bulb capacitor; rising thunder ticks." - }, - { - "identity": "IT-217 Empty Crown Ring", - "slot": "Relic / boss-bound", - "tier": "T4 / CH-06", - "flag": "B", - "effect": "When party mixes obey and resist responses in one choice window, all responders gain 10 Guard and lowest-resource responder gains 1 resource.", - "build": "Synergy plural movement plans; countered by one-unit choices.", - "source": "Drop EN-B006; U-0.", - "production": "Open weather ring; split winds harmonize." - }, - { - "identity": "IT-218 Rotating Commons Charter", - "slot": "Charm / accord item", - "tier": "T4 / CH-06", - "flag": "B", - "effect": "Route order is random but fully previewed; clearing current first ward grants one free route reroll next segment.", - "build": "Synergy adaptive players; countered by rigid loadouts.", - "source": "Choose rotating stewardship; U-0.", - "production": "Four-hand charter wheel; passing knock." - }, - { - "identity": "IT-219 Central Lift Writ", - "slot": "Charm / accord item", - "tier": "T4 / CH-06", - "flag": "B", - "effect": "Lock route order before departure; every second encounter adds a command hazard that targets most-used band.", - "build": "Synergy planned loadouts; countered by repetitive formation.", - "source": "Choose centralized lift; U-0.", - "production": "Single-axis writ; firm lock tone." - }, - { - "identity": "IT-220 Updraft Commons Accord", - "slot": "Back / chapter accord", - "tier": "T4 / CH-06", - "flag": "B", - "effect": "Once per encounter, three allies in three bands may rotate clockwise together; each gains Drift opposite its move after 3 seconds.", - "build": "Synergy formation choreography; countered by closed bands/Anchored.", - "source": "Resolve storm crown; U-0.", - "production": "Three-arrow mantle; circular gust chord." - }, - { - "identity": "IT-221 Kiteknife Spar", - "slot": "Mainhand / blade", - "tier": "T3 / CH-06", - "flag": "S", - "effect": "Power +17 while wearer moves in same direction as forecast wind.", - "build": "Synergy Drift riders; countered by headwind/resist.", - "source": "Drop EN-O036; U-N.", - "production": "Taut kite blade; cloth slice." - }, - { - "identity": "IT-222 Lift-Thief Balloon", - "slot": "Back / speed gear", - "tier": "T3 / CH-06", - "flag": "S", - "effect": "After wearer loses a movement resource, speed +18% for 3 seconds.", - "build": "Synergy recovery pursuit; countered by no drain.", - "source": "Drop EN-O037; U-D.", - "production": "Small harness balloon; gas rise." - }, - { - "identity": "IT-223 Pressure-Rook Dial", - "slot": "Charm / pressure gear", - "tier": "T3 / CH-06", - "flag": "S", - "effect": "At Pressure magnitude 3, wearer gains 20 Guard until reset; at lower magnitude no effect.", - "build": "Synergy pressure control; countered by Calm.", - "source": "Drop EN-O038; U-N.", - "production": "Signed rook dial; peak click." - }, - { - "identity": "IT-224 Mooring Buckle", - "slot": "Charm / anchor gear", - "tier": "T3 / CH-06", - "flag": "S", - "effect": "While Anchored beside an enemy in same band, direct damage taken -14.", - "build": "Synergy Front tanks; countered by ranged different-band attacks.", - "source": "Drop EN-O039; U-N.", - "production": "Paired rope buckle; deep strain." - }, - { - "identity": "IT-225 Lightning Quill", - "slot": "Mainhand / magical focus", - "tier": "T3 / CH-06", - "flag": "S", - "effect": "Chain damage +12 when all chosen targets have different roles/tiers; duplicate class gets no bonus.", - "build": "Synergy diverse enemy waves; countered by uniform summons.", - "source": "Drop EN-O040; U-N.", - "production": "Electric quill rod; three plucks." - }, - { - "identity": "IT-226 Calm-Eye Petal", - "slot": "Charm / Guard gear", - "tier": "T3 / CH-06", - "flag": "S", - "effect": "Guard gained inside a safe ring +10; collapse damage is also +5.", - "build": "Synergy timed exit; countered by trapping effects.", - "source": "Drop EN-O041; U-N.", - "production": "White toothed petal; four clicks." - }, - { - "identity": "IT-227 Rotor Plate", - "slot": "Offhand / rotating shield", - "tier": "T3 / CH-06", - "flag": "S", - "effect": "Guard +18 in the band opposite forecast shield/hazard; changes as forecast rotates.", - "build": "Synergy rotation readers; countered by forecast denial.", - "source": "Drop EN-O042; U-N.", - "production": "Three-blade plate; moving shield hum." - }, - { - "identity": "IT-228 Updraft Sandals", - "slot": "Feet / movement gear", - "tier": "T3 / CH-06", - "flag": "S", - "effect": "Movement speed +15% when moving upward/onward with lift flow; against flow unchanged.", - "build": "Synergy route riders; countered by headwind.", - "source": "SET-06 shop; U-N.", - "production": "Kite-soled sandals; light lift." - }, - { - "identity": "IT-229 Council Speaker Shawl", - "slot": "Body / support cloth", - "tier": "T3 / CH-06", - "flag": "S", - "effect": "After an ally acts with different tag than wearer, both receive +8 healing for 4 seconds.", - "build": "Synergy cadence teams; countered by repeated tags.", - "source": "Ward council favor; U-D.", - "production": "Tokened cloud shawl; answer chime." - }, - { - "identity": "IT-230 Crown-Guard Plate", - "slot": "Body / heavy armor", - "tier": "T3 / CH-06", - "flag": "S", - "effect": "Intercepted damage -16 while original target remains visible; unlabeled attacks gain no reduction.", - "build": "Synergy CHR-023; countered by hidden/area damage.", - "source": "Former guard testimony; U-N.", - "production": "Stripped ceremonial plate; recoil clang." - }, - { - "identity": "IT-231 Dispatcher Earpiece", - "slot": "Head / command gear", - "tier": "T3 / CH-06", - "flag": "S", - "effect": "Order gain +1 on every fourth different commanded ally, once per encounter.", - "build": "Synergy CHR-024; countered by parties under four.", - "source": "Four-ward visit; U-0.", - "production": "Four-line earpiece; sequence pips." - }, - { - "identity": "IT-232 Weather-Kite Coat", - "slot": "Body / light armor", - "tier": "T3 / CH-06", - "flag": "S", - "effect": "Weather hazard damage -15 while wearer is moving; stationary no reduction.", - "build": "Synergy mobile units; countered by Anchored.", - "source": "Outer ward shop; U-N.", - "production": "Layered kite coat; rain flutter." - }, - { - "identity": "IT-233 Liftshare Gloves", - "slot": "Offhand / support gear", - "tier": "T3 / CH-06", - "flag": "S", - "effect": "Guard granted to an ally in another band is +9.", - "build": "Synergy cross-band supports; countered by clustering.", - "source": "Commons vendor; U-N.", - "production": "Long tether gloves; line pull." - }, - { - "identity": "IT-234 Calm-Air Tonic", - "slot": "Consumable / tonic", - "tier": "T3 / CH-06", - "flag": "S", - "effect": "Cleanse Drift and heal 45; if no Drift, heal only 30.", - "build": "Synergy storm routes; countered by Hush unrelated.", - "source": "SET-06 clinic; U-P.", - "production": "White vapor vial; quiet exhale." - }, - { - "identity": "IT-235 Stormglass Visor", - "slot": "Head / optic", - "tier": "T3 / CH-06", - "flag": "S", - "effect": "Forecast arrows remain 1.5 seconds longer after target changes; no delay to action.", - "build": "Synergy comprehension; countered by fixed no-arrow attacks.", - "source": "Weather board completion; U-D.", - "production": "Arrowed clear visor; weather ping." - }, - { - "identity": "IT-236 Ward-Rotation Belt", - "slot": "Charm / terrain gear", - "tier": "T3 / CH-06", - "flag": "S", - "effect": "After terrain rotates away from wearer's band, gain 12 Guard for 3 seconds.", - "build": "Synergy rotation maps; countered by stationary hazards.", - "source": "Central axle chest; U-D.", - "production": "Ringed belt disk; rotation lock." - }, - { - "identity": "IT-237 Skyhook Spear", - "slot": "Mainhand / polearm", - "tier": "T3 / CH-06", - "flag": "S", - "effect": "Direct attacks gain 18 power against enemies currently airborne or Drifting; grounded enemies take normal power.", - "build": "Synergy forced movement; countered by Anchored ground enemies.", - "source": "Kite hunt reward; U-N.", - "production": "Hooked sky spear; wind catch." - }, - { - "identity": "IT-238 Emergency Mantle", - "slot": "Back / command cloth", - "tier": "T4 / CH-06", - "flag": "S", - "effect": "Below 35% vitality, intervention meter gain from wearer +10%; above threshold normal.", - "build": "Synergy crisis play; countered by healing over threshold.", - "source": "Governance trial; U-T.", - "production": "Red time-limited mantle; urgent pulse." - }, - { - "identity": "IT-239 Crownless Cuirass", - "slot": "Body / heavy armor", - "tier": "T4 / CH-06", - "flag": "S", - "effect": "While no ally is designated controller/leader target, wearer gains 20 Guard; designation removes it.", - "build": "Synergy decentralized fights; countered by boss controller marks.", - "source": "Optional crown dismantle; U-N.", - "production": "Open-neck armor; absent crest resonance." - }, - { - "identity": "IT-240 Four-Ward Coat", - "slot": "Body / chapter armor", - "tier": "T4 / CH-06", - "flag": "S", - "effect": "Each distinct band occupied by allies grants wearer 6 Guard, maximum 18.", - "build": "Synergy spread formations; countered by band closure.", - "source": "CH-06 completion; U-N.", - "production": "Four-panel cloud coat; layered wind chord." - }, - { - "identity": "IT-241 Blank-Name Satchel", - "slot": "Back / identity ward", - "tier": "T4 / CH-07", - "flag": "B", - "effect": "First effect that targets a character talent instead targets wearer's lowest-tier item clause for 4 seconds.", - "build": "Synergy talent-critical units; countered by no suppressible item or repeated suppression.", - "source": "Nullmarket welcome quest; U-0.", - "production": "Face-down tags satchel; tag redirect." - }, - { - "identity": "IT-242 Escrow Memory Map", - "slot": "Charm / route tool", - "tier": "T4 / CH-07", - "flag": "B", - "effect": "Preview two unknown nodes; choosing one seals the other until route end but returns the map after completion.", - "build": "Synergy risk planning; countered by sealed-route contracts.", - "source": "Pay with guild record; U-0.", - "production": "Folding map with return cord; escrow latch." - }, - { - "identity": "IT-243 No-Name Lamp", - "slot": "Offhand / targeting ward", - "tier": "T4 / CH-07", - "flag": "B", - "effect": "Enemy identity-based target rules treat wearer as tied with all allies; deterministic tie breaks to highest Guard.", - "build": "Synergy CHR-025; countered by wearer having highest Guard unintentionally.", - "source": "Anonymous clinic; U-0.", - "production": "Blank-tag lamp; diffuse glow tone." - }, - { - "identity": "IT-244 False-Legend Scarf", - "slot": "Back / decoy tool", - "tier": "T4 / CH-07", - "flag": "B", - "effect": "First decoy hit draws a 4-second lure lane; next nonboss enemy entering becomes Marked and has one link severed.", - "build": "Synergy PR-B09,CHR-026; countered by ranged/Anchored enemy.", - "source": "Memory-cartographer quest; U-D.", - "production": "Paper-map scarf; route scribble." - }, - { - "identity": "IT-245 Maintenance Span Cord", - "slot": "Charm / link tool", - "tier": "T4 / CH-07", - "flag": "B", - "effect": "A link across two bands counts as empty alignment for piercing/Reach; projectile through it grants both linked allies 6 Guard.", - "build": "Synergy PR-A02,CHR-027; countered by link sever and band closure.", - "source": "Repair three bypasses; U-N.", - "production": "Thick ring-cord; span twang." - }, - { - "identity": "IT-246 Recoverable Legacy Box", - "slot": "Charm / recovery item", - "tier": "T4 / CH-07", - "flag": "B", - "effect": "Mark one equipped item before route; if lost to contract failure, recover it unupgraded after two victories. One marked item.", - "build": "Synergy high-risk contracts; countered by route abandonment before victories.", - "source": "Legacy recovery tutorial; U-0.", - "production": "Numbered metal box; two-lock cadence." - }, - { - "identity": "IT-247 Refusal Token", - "slot": "Consumable / bargain tool", - "tier": "T4 / CH-07", - "flag": "B", - "effect": "Decline one enemy choice/bargain without taking its default branch; wearer instead loses 20 Guard, or 20 vitality if no Guard.", - "build": "Synergy EN-O044,EN-S010 counters; countered by low vitality.", - "source": "Nullmarket vendor, one per route; U-P.", - "production": "Blank coin-sized tile; firm knock." - }, - { - "identity": "IT-248 Relationship Compass", - "slot": "Head / boss optic", - "tier": "T4 / CH-07", - "flag": "B", - "effect": "Relationship telegraphs show one mechanical fallback counter even when referenced recruit is absent; no power bonus.", - "build": "Synergy roster flexibility; countered by nonrelationship attacks.", - "source": "Complete three linked character scenes; U-0.", - "production": "Paired portrait compass; connection tone." - }, - { - "identity": "IT-249 Scarcity Ledger", - "slot": "Charm / contract tool", - "tier": "T4 / CH-07", - "flag": "B", - "effect": "Seal one item slot type for route; other equipped slots gain +8 Guard each, maximum 24. Choice cannot change midroute.", - "build": "Synergy minimal loadouts; countered by item-suppression enemies and missing utility.", - "source": "Contract difficulty unlock; U-0.", - "production": "Folded six-slot ledger; seal press." - }, - { - "identity": "IT-250 Unregistered Clinic Tag", - "slot": "Charm / healing tool", - "tier": "T4 / CH-07", - "flag": "B", - "effect": "First heal on each unlinked ally does not alter enemy lowest/highest-vitality target lock for 2 seconds.", - "build": "Synergy PR-B04,CHR-025; countered by adaptive target rules.", - "source": "Anonymous clinic cases; U-0.", - "production": "Face-down medical tag; quiet latch." - }, - { - "identity": "IT-251 Sealed Loadout Key", - "slot": "Charm / preparation tool", - "tier": "T4 / CH-07", - "flag": "B", - "effect": "On sealed-loadout route, one consumable slot remains replaceable between segments; replacement costs all remaining copy stock.", - "build": "Synergy adaptive consumables; countered by no reserve stock.", - "source": "First sealed contract clear; U-0.", - "production": "Single open slot key; seal crack." - }, - { - "identity": "IT-252 Rulecard Phantom", - "slot": "Head / target tool", - "tier": "T4 / CH-07", - "flag": "B", - "effect": "After enemy copies wearer's target rule, wearer may switch to a different saved rule immediately; 6-second cooldown.", - "build": "Synergy AI editors; countered by rule locks.", - "source": "Drop EN-E019; U-C.", - "production": "Three translucent cards; quick rule shuffle." - }, - { - "identity": "IT-253 Second-Pulse Clasp", - "slot": "Body / aura defense", - "tier": "T4 / CH-07", - "flag": "B", - "effect": "Leaving a beneficial enemy aura after first pulse grants 15 Guard and prevents its hostile link; once per aura source.", - "build": "Synergy disciplined movement; countered by Anchored/trapping.", - "source": "Drop EN-E020; U-N.", - "production": "Soft clasp with two ticks; exit chime." - }, - { - "identity": "IT-254 Debtless Routewheel", - "slot": "Relay / movement module", - "tier": "T4 / CH-07", - "flag": "B", - "effect": "First voluntary move in each direction does not count toward enemy route debts; repeated direction counts normally.", - "build": "Synergy varied movement; countered by forced or one-direction maps.", - "source": "Drop EN-E021; U-0.", - "production": "Three-arrow wheel; tally skip." - }, - { - "identity": "IT-255 Noncanonical Frame", - "slot": "Charm / diversity tool", - "tier": "T4 / CH-07", - "flag": "B", - "effect": "When enemy names canonical ally, wearer gains a displayed counter tag different from canonical role; using it deals 20 stability.", - "build": "Synergy mixed roles; countered by Hush or no stability.", - "source": "Drop EN-S009; U-N.", - "production": "Open portrait frame; reply instrument." - }, - { - "identity": "IT-256 Fourth Door Wedge", - "slot": "Offhand / recovery tool", - "tier": "T4 / CH-07", - "flag": "B", - "effect": "Once per encounter add “decline” to a three-offer enemy choice; choosing it delays all enemy actions 1 second and grants no recovery.", - "build": "Synergy Break setups; countered by urgent low vitality.", - "source": "Drop EN-S010; U-0.", - "production": "Plain door wedge; silence then clock tick." - }, - { - "identity": "IT-257 Refused Halo", - "slot": "Relic / boss-bound", - "tier": "T4 / CH-07", - "flag": "B", - "effect": "Forgoing offered Guard grants a unique protection based on wearer role: defender Anchored, striker Tuned, support cleanses Hush, controller gains 1 resource. Once per phase.", - "build": "Synergy role diversity; countered by offers without Guard.", - "source": "Drop EN-B007; U-0.", - "production": "Open civic ring, not sacred; four timbres." - }, - { - "identity": "IT-258 Anonymous Market Seal", - "slot": "Charm / accord item", - "tier": "T4 / CH-07", - "flag": "B", - "effect": "Protecting Nullmarket hides vendor identity and rerolls one stock row per visit toward missing collection IDs; public-office discounts do not apply.", - "build": "Synergy collection completion; countered by seeking office permits.", - "source": "Protect Nullmarket; U-0.", - "production": "Blank black seal; soft shuffle." - }, - { - "identity": "IT-259 Public Ring Register", - "slot": "Charm / accord item", - "tier": "T4 / CH-07", - "flag": "B", - "effect": "Revealing Nullmarket adds one public supply choice each route, but first enemy in CH-08 knows party's most-used target rule.", - "build": "Synergy broad supplies; countered by repetitive AI.", - "source": "Reveal Nullmarket; U-0.", - "production": "Open ring register; page broadcast." - }, - { - "identity": "IT-260 Hollow Meridian Accord", - "slot": "Relay / chapter accord", - "tier": "T4 / CH-07", - "flag": "B", - "effect": "Once per encounter, when a protected ally would be isolated, transfer one different ally's Guard, buff, or position response to keep link legal; player chooses.", - "build": "Synergy relational defense; countered by all allies sharing same missing state.", - "source": "Resolve buried ring; U-0.", - "production": "Three-path relay disk; chosen transfer chord." - }, - { - "identity": "IT-261 Blanktag Harness", - "slot": "Body / talent armor", - "tier": "T4 / CH-07", - "flag": "S", - "effect": "While character talent is suppressed, wearer gains 24 Guard; Guard ends when talent returns.", - "build": "Synergy suppression survival; countered by dispel/ordinary damage.", - "source": "Drop EN-O043; U-N.", - "production": "Blank-tag straps; shield swell." - }, - { - "identity": "IT-262 Broker's Offer Cards", - "slot": "Charm / choice gear", - "tier": "T4 / CH-07", - "flag": "S", - "effect": "After voluntarily losing a timed buff, wearer heals 35; once per 6 seconds.", - "build": "Synergy bargain effects; countered by no buff or forced theft.", - "source": "Drop EN-O044; U-C.", - "production": "Two small cards; accepted shuffle." - }, - { - "identity": "IT-263 Striped Lanternshade", - "slot": "Head / hazard optic", - "tier": "T4 / CH-07", - "flag": "S", - "effect": "False safety/hazard damage -20 if wearer had its striped marker visible for 1+ second.", - "build": "Synergy careful reading; countered by immediate hazards.", - "source": "Drop EN-O045; U-N.", - "production": "Striped shade visor; missing-beat warning." - }, - { - "identity": "IT-264 Namehook Bracer", - "slot": "Offhand / pull armor", - "tier": "T4 / CH-07", - "flag": "S", - "effect": "After being targeted by an explicit ally command, wearer gains 12 Guard for 3 seconds.", - "build": "Synergy command parties; countered by untargeted actions.", - "source": "Drop EN-O046; U-D.", - "production": "Token-hook cuff; portrait clack." - }, - { - "identity": "IT-265 Foldmap Greaves", - "slot": "Feet / band armor", - "tier": "T4 / CH-07", - "flag": "S", - "effect": "Forced evacuation from a closing band deals 18 less terrain/collision damage.", - "build": "Synergy route folds; countered by direct hits after move.", - "source": "Drop EN-O047; U-N.", - "production": "Accordion shin plates; paper thump." - }, - { - "identity": "IT-266 Mercy-Clasp Bell", - "slot": "Charm / crisis armor", - "tier": "T4 / CH-07", - "flag": "S", - "effect": "While Hushed below 35% vitality, Guard received +16; no bonus when either condition ends.", - "build": "Synergy emergency heals; countered by Guard theft.", - "source": "Drop EN-O048; U-T.", - "production": "Padded clasp bell; muffled comfort tone." - }, - { - "identity": "IT-267 Nullroot Plate", - "slot": "Body / medium armor", - "tier": "T4 / CH-07", - "flag": "S", - "effect": "Each different target rule used by wearer grants 5 Guard, max 15; repeating any rule resets.", - "build": "Synergy flexible AI; countered by one-target fights.", - "source": "Drop EN-O049; U-N.", - "production": "White tile/root scales; rule taps." - }, - { - "identity": "IT-268 Nullmarket Coat", - "slot": "Body / light armor", - "tier": "T4 / CH-07", - "flag": "S", - "effect": "While wearer has no name/identity Mark, speed +14%; Mark removes bonus.", - "build": "Synergy anonymous routes; countered by beacon Marks.", - "source": "SET-07 vendor; U-N.", - "production": "Tagless layered coat; quiet steps." - }, - { - "identity": "IT-269 Maintenance Belt", - "slot": "Charm / device gear", - "tier": "T4 / CH-07", - "flag": "S", - "effect": "Allied devices gain 15 power against buried or structural enemies; mobile creature targets receive normal power.", - "build": "Synergy PR-B08; countered by mobile creatures.", - "source": "Bypass repair reward; U-N.", - "production": "Manual-tool belt; wrench tap." - }, - { - "identity": "IT-270 Cartographer Inkshoe", - "slot": "Feet / plan gear", - "tier": "T4 / CH-07", - "flag": "S", - "effect": "Placed Plan duration +1 second if wearer entered its band after placement.", - "build": "Synergy PR-A10; countered by stationary play.", - "source": "Nara map route; U-D.", - "production": "Inked sole maps; route scratch." - }, - { - "identity": "IT-271 Anonymous Physician Coat", - "slot": "Body / healer cloth", - "tier": "T4 / CH-07", - "flag": "S", - "effect": "Healing +18 on allies with no active link; linked allies unchanged.", - "build": "Synergy CHR-025; countered by link-heavy party.", - "source": "Clinic vendor; U-N.", - "production": "Face-down tag coat; soft vial." - }, - { - "identity": "IT-272 Ring Maintainer Maul", - "slot": "Mainhand / blunt", - "tier": "T4 / CH-07", - "flag": "S", - "effect": "Power +20 against devices/gates; creature targets gain only +5.", - "build": "Synergy infrastructure encounters; countered by organic waves.", - "source": "CHR-027 mastery; U-N.", - "production": "Heavy service maul; deep bolt." - }, - { - "identity": "IT-273 Memory Escrow Vial", - "slot": "Consumable / recovery tonic", - "tier": "T4 / CH-07", - "flag": "S", - "effect": "Restore 1 spent profession resource and heal 30; cannot raise resource above 2.", - "build": "Synergy low-resource recovery; countered by high resource state.", - "source": "Escrow vendor; U-P.", - "production": "Sealed map-vial; return click." - }, - { - "identity": "IT-274 Quiet-Market Cowl", - "slot": "Head / Hush armor", - "tier": "T4 / CH-07", - "flag": "S", - "effect": "While Hushed, direct damage taken -12 and speed -5%; both end with Hush.", - "build": "Synergy deliberate silence; countered by area/terrain.", - "source": "Hidden stall; U-N.", - "production": "Dark soft cowl; damped footfall." - }, - { - "identity": "IT-275 Relationship Cord", - "slot": "Charm / link gear", - "tier": "T4 / CH-07", - "flag": "S", - "effect": "Healing/Guard shared between characters with a completed relationship scene is +9.", - "build": "Synergy narrative pair builds; countered by unmatched roster.", - "source": "Three pair scenes; U-N.", - "production": "Portrait-knot cord; paired motif." - }, - { - "identity": "IT-276 Contract Iron", - "slot": "Offhand / heavy armor", - "tier": "T4 / CH-07", - "flag": "S", - "effect": "On sealed-loadout routes, wearer begins each encounter with 18 Guard; normal routes grant 0.", - "build": "Synergy contract difficulty; countered by Guard theft.", - "source": "Contract tier 2; U-N.", - "production": "Sealed iron plate; contract stamp." - }, - { - "identity": "IT-277 False-Saint Shard", - "slot": "Charm / offer armor", - "tier": "T4 / CH-07", - "flag": "S", - "effect": "Damage from attacks following a beneficial enemy offer -18; offer's status cost remains.", - "build": "Synergy boss survival; countered by normal attacks.", - "source": "Vacant sanctuary chest; U-N.", - "production": "Open white shard; comfort motif crack." - }, - { - "identity": "IT-278 Bypass Lantern", - "slot": "Offhand / support light", - "tier": "T4 / CH-07", - "flag": "S", - "effect": "In optional sub-boss routes, lowest-vitality ally receives +10 healing; elsewhere no effect.", - "build": "Synergy mastery hunts; countered by main routes.", - "source": "All manual bypasses; U-N.", - "production": "Manual crank lamp; maintenance hum." - }, - { - "identity": "IT-279 Meridian Longcoat", - "slot": "Body / medium armor", - "tier": "T4 / CH-07", - "flag": "S", - "effect": "At 0 Intervention, wearer gains 20 Guard; any meter gain removes it.", - "build": "Synergy post-intervention survival; countered by passive meter gain.", - "source": "Ring-depth chest; U-N.", - "production": "Long black-white coat; empty pulse." - }, - { - "identity": "IT-280 Nullmarket Ledgerplate", - "slot": "Body / chapter armor", - "tier": "T4 / CH-07", - "flag": "S", - "effect": "Each empty equipment slot grants 7 Guard, maximum 21.", - "build": "Synergy scarcity builds; countered by lost utility and item scans.", - "source": "CH-07 completion; U-N.", - "production": "Three blank plate sockets; hollow knocks." - }, - { - "identity": "IT-281 Plural Cadence Ring", - "slot": "Charm / diversity tool", - "tier": "T4 / CH-08", - "flag": "B", - "effect": "Store distinct role tags, maximum 4; at 4, next Hush is resisted and ring empties. Duplicate tag resets storage to that tag.", - "build": "Synergy PR-A24; countered by duplicate-role rotations.", - "source": "First approach room; U-0.", - "production": "Four unmatched segments; ensemble build." - }, - { - "identity": "IT-282 Public Channel Pennant", - "slot": "Back / command tool", - "tier": "T4 / CH-08", - "flag": "B", - "effect": "First Order each phase displays its rule; if three different roles accept it, refund Order, otherwise reveal rejection and grant rejector 10 Guard.", - "build": "Synergy CHR-029,PR-B12; countered by parties under three roles.", - "source": "Open command records; U-0.", - "production": "Unfastened blue pennant; broadcast pips." - }, - { - "identity": "IT-283 Founder Revision Cord", - "slot": "Charm / buff tool", - "tier": "T4 / CH-08", - "flag": "B", - "effect": "Once per encounter preserve two colliding exclusive buffs for 3 seconds; afterward both return at half remaining duration.", - "build": "Synergy CHR-030,PR-A24; countered by dispel or timeless buffs.", - "source": "Founder evidence room; U-0.", - "production": "Plain ring on mended cord; revision chord." - }, - { - "identity": "IT-284 Noise-Floor Fork", - "slot": "Mainhand / Hush ward", - "tier": "T4 / CH-08", - "flag": "B", - "effect": "When four distinct roles act, spend 1 wearer resource to resist next party Hush; if no resource, trigger waits.", - "build": "Synergy CHR-028; countered by resource tax and uniformity.", - "source": "Defector warning route; U-0.", - "production": "Four-notch tuning fork; noise resolves." - }, - { - "identity": "IT-285 Linked-Telegraph Board", - "slot": "Offhand / planning tool", - "tier": "T4 / CH-08", - "flag": "B", - "effect": "Once per phase assign defense, movement, and clause-control icons to three different allies; each successful assignment deals 15 stability to source.", - "build": "Synergy final linked checks; countered by missing role capability/Hush.", - "source": "Approach training chamber; U-0.", - "production": "Three-slot slate; assignment clicks." - }, - { - "identity": "IT-286 Reconciliation Lamp", - "slot": "Relay / intervention module", - "tier": "T4 / CH-08", - "flag": "B", - "effect": "At full Intervention, replace normal command with Reconciliation: preserve up to four distinct allied state clauses for 4 seconds; meter empties.", - "build": "Synergy final phase/mixed buffs; countered by dispel and repeated clauses occupying slots.", - "source": "Repair seven approach relays; U-0.", - "production": "Open multicolor lamp; eight-part chord." - }, - { - "identity": "IT-287 Civic Reply Bell", - "slot": "Charm / timing tool", - "tier": "T4 / CH-08", - "flag": "B", - "effect": "After enemy active resolves, slowest ally may act immediately at 70% power; once per 10 seconds and only with legal active ready.", - "build": "Synergy PR-A24; countered by Hush/cooldowns.", - "source": "Concord Hall archive; U-C.", - "production": "Split handbell; answer strike." - }, - { - "identity": "IT-288 Different-Hands Harness", - "slot": "Body / resource link", - "tier": "T4 / CH-08", - "flag": "B", - "effect": "Three different profession resources spent within 5 seconds grant party 12 Guard; same resource twice resets window.", - "build": "Synergy varied resources; countered by taxes/uniform teams.", - "source": "Civic consequence room 3; U-N.", - "production": "Three-loop harness; resource triad." - }, - { - "identity": "IT-289 Junction Bypass Key", - "slot": "Consumable / route tool", - "tier": "T4 / CH-08", - "flag": "B", - "effect": "Skip one previously completed consequence room; its support bonus and hazard are both absent from final boss.", - "build": "Synergy speed/mastery runs; countered by needing room reward.", - "source": "Second visit to SET-08; U-P.", - "production": "Seven-tooth key; route lock." - }, - { - "identity": "IT-290 Accord-Safe Shears", - "slot": "Mainhand / link tool", - "tier": "T4 / CH-08", - "flag": "B", - "effect": "Sever an enemy redirect/link without removing allied links in same band; allied links lose 1 second duration instead.", - "build": "Synergy PR-A22; countered by no enemy link.", - "source": "Council engine room; U-N.", - "production": "Rounded dual shears; selective snip." - }, - { - "identity": "IT-291 Role-Mirror Lens", - "slot": "Head / copy optic", - "tier": "T4 / CH-08", - "flag": "B", - "effect": "When enemy copies wearer's base active, wearer becomes Tuned and copied clause is shown 0.5 seconds longer; once per enemy.", - "build": "Synergy counter-copy; countered by passive/advanced copies, which are forbidden anyway.", - "source": "Training chamber research; U-D.", - "production": "Striped role lens; simplified echo cue." - }, - { - "identity": "IT-292 Four-Slot Audit Rail", - "slot": "Charm / sequence tool", - "tier": "T5 / CH-08", - "flag": "B", - "effect": "Before a four-action audit, swap positions of two queued allies; their skills/targets remain. Once per phase.", - "build": "Synergy resource diversity; countered by action lock.", - "source": "Drop EN-E022; U-0.", - "production": "Four-shutter rail; adjacent slide." - }, - { - "identity": "IT-293 Newest-Object Tag", - "slot": "Relay / device defense", - "tier": "T5 / CH-08", - "flag": "B", - "effect": "When oldest object is targeted for deletion, deploy a 1-vitality dummy of different type as newest and redirect deletion; once per encounter.", - "build": "Synergy device/zone builds; countered by multi-delete effects.", - "source": "Drop EN-E023; U-0.", - "production": "Numbered dummy tag; tape cut." - }, - { - "identity": "IT-294 Three-Target Breaker", - "slot": "Mainhand / command weapon", - "tier": "T5 / CH-08", - "flag": "B", - "effect": "Hitting three different linked enemies within 3 seconds queues a 60-power strike on link source; 6-second cooldown.", - "build": "Synergy split targeting; countered by fewer targets or link cleanse.", - "source": "Drop EN-E024; U-C.", - "production": "Tri-prong signal weapon; three clicks then impact." - }, - { - "identity": "IT-295 Principle Shutter", - "slot": "Head / response tool", - "tier": "T5 / CH-08", - "flag": "B", - "effect": "On principle card reveal, choose one displayed counter tag; wearer's next matching action gains 25 stability damage, wrong tag gains none.", - "build": "Synergy varied loadouts; countered by Hush/unavailable chosen action.", - "source": "Drop EN-S011; U-N.", - "production": "Three-face temple shutter; principle chord." - }, - { - "identity": "IT-296 Seven-Ring Key", - "slot": "Charm / mastery tool", - "tier": "T5 / CH-08", - "flag": "B", - "effect": "A correct regional counter opens one stored ring; at 3 rings wearer gains Tuned, at 7 fill 20% Intervention, then empty.", - "build": "Synergy final approach/New Cycle+; countered by failed counters.", - "source": "Drop EN-S012; U-0.", - "production": "Seven-material key ring; motifs stack." - }, - { - "identity": "IT-297 First Silence Aperture", - "slot": "Relic / boss-bound", - "tier": "T5 / CH-08", - "flag": "B", - "effect": "When one party resource is muted, wearer may spend a different resource as if it were 1 of muted type; once per distinct resource per phase.", - "build": "Synergy mixed resources; countered by uniform party or full resource Hush.", - "source": "Drop EN-B008; U-0.", - "production": "Concentric open shutter; silence pierced by one note." - }, - { - "identity": "IT-298 Federated Charter", - "slot": "Charm / ending accord", - "tier": "T5 / CH-08", - "flag": "B", - "effect": "At encounter start choose one completed regional accord clause; only one active, and its listed route drawback also applies.", - "build": "Synergy build-specific choices; countered by selecting stale clause.", - "source": "Ending public charter; U-0.", - "production": "Eight-tab charter ring; selected motif." - }, - { - "identity": "IT-299 Second-Weave Shuttle", - "slot": "Relay / postgame tool", - "tier": "T5 / CH-08", - "flag": "B", - "effect": "Once per remixed route, exchange one previewed enemy variant clause with another cleared chapter's clause of same tier. Rewards stay tied to original route.", - "build": "Synergy mastery planning; countered by incompatible/no cleared clause.", - "source": "Unlock Second Weave; U-0.", - "production": "Eight-material loom shuttle; cross-region blend." - }, - { - "identity": "IT-300 Working-Scale Guild Key", - "slot": "Charm / chapter accord", - "tier": "T5 / CH-08", - "flag": "B", - "effect": "Once per encounter, if four different roles occupy at least two bands, prevent a global uniformity penalty and grant each role 6 Guard.", - "build": "Synergy mixed parties; countered by duplicate roles/band collapse.", - "source": "Complete public epilogue; U-0.", - "production": "Modest guild key with four teeth; door-to-ensemble." - }, - { - "identity": "IT-301 Concordance Needle", - "slot": "Mainhand / link weapon", - "tier": "T4 / CH-08", - "flag": "S", - "effect": "Direct power +18 while wearer and adjacent ally have different target rules; matching rules give no bonus.", - "build": "Synergy varied AI; countered by forced uniform targets.", - "source": "Drop EN-O050; U-N.", - "production": "Long paired-spool needle; thread zip." - }, - { - "identity": "IT-302 Chorister Panel", - "slot": "Body / uniformity armor", - "tier": "T4 / CH-08", - "flag": "S", - "effect": "After wearer uses third distinct action tag, gain 22 Guard for 4 seconds; duplicates reset count.", - "build": "Synergy varied rotations; countered by Hush/forced repeats.", - "source": "Drop EN-O051; U-D.", - "production": "Cracked identical panel; triad break." - }, - { - "identity": "IT-303 Mute-Standard Cloth", - "slot": "Back / Hush armor", - "tier": "T4 / CH-08", - "flag": "S", - "effect": "While standing in Hush band, wearer gains 16 Guard; secondary clauses remain suppressed.", - "build": "Synergy deliberate base actions; countered by Guard theft.", - "source": "Drop EN-O052; U-N.", - "production": "Torn-line banner cloth; band-pass mute." - }, - { - "identity": "IT-304 Role-Frame Joint", - "slot": "Charm / copy armor", - "tier": "T4 / CH-08", - "flag": "S", - "effect": "Damage from copied base actives -20; original and advanced actions unchanged.", - "build": "Synergy copy encounters; countered by noncopy attacks.", - "source": "Drop EN-O053; U-N.", - "production": "Striped mannequin joint; simplified impact." - }, - { - "identity": "IT-305 Sentry Dial", - "slot": "Head / target armor", - "tier": "T4 / CH-08", - "flag": "S", - "effect": "Guard +15 while wearer's current AI priority differs from forecast enemy priority.", - "build": "Synergy editable scripts; countered by target lock/matching needs.", - "source": "Drop EN-O054; U-N.", - "production": "Three-eye dial visor; target tick." - }, - { - "identity": "IT-306 Accord-Clip Plate", - "slot": "Body / link armor", - "tier": "T4 / CH-08", - "flag": "S", - "effect": "Linked healing/Guard siphoned by enemies is reduced by 12; siphon is not prevented.", - "build": "Synergy PR-B11; countered by direct link sever.", - "source": "Drop EN-O055; U-N.", - "production": "Triangular clip scales; unclasp tone." - }, - { - "identity": "IT-307 Silence-Petal Pin", - "slot": "Charm / cadence armor", - "tier": "T4 / CH-08", - "flag": "S", - "effect": "Damage from a three-repeat trigger -18 if wearer contributed no duplicate tag.", - "build": "Synergy varied actors; countered if wearer repeats.", - "source": "Drop EN-O056; U-N.", - "production": "Three-petal pin; bilateral snap." - }, - { - "identity": "IT-308 Concord Hall Coat", - "slot": "Body / medium armor", - "tier": "T4 / CH-08", - "flag": "S", - "effect": "Each active regional accord grants wearer 3 Guard, maximum 21; unavailable accords give none.", - "build": "Synergy consequence completion; countered by bypass routes.", - "source": "SET-08 shop; U-N.", - "production": "Eight-mended formal coat; motif stack." - }, - { - "identity": "IT-309 Public Record Lens", - "slot": "Head / information optic", - "tier": "T4 / CH-08", - "flag": "S", - "effect": "Revealed target rules persist 2 seconds longer and remain through one decoy swap.", - "build": "Synergy PR-B06; countered by cleanse/new rule.", - "source": "Open all command records; U-D.", - "production": "Clear civic lens; record lock." - }, - { - "identity": "IT-310 Founder Workglove", - "slot": "Offhand / device gear", - "tier": "T4 / CH-08", - "flag": "S", - "effect": "Device duration +10% while party has 3+ different profession roles.", - "build": "Synergy mixed device teams; countered by uniformity.", - "source": "Founder workshop; U-N.", - "production": "Plain repaired glove; careful tool taps." - }, - { - "identity": "IT-311 Reconciliation Sash", - "slot": "Body / support cloth", - "tier": "T4 / CH-08", - "flag": "S", - "effect": "While two exclusive buffs coexist, healing received +12; otherwise no effect.", - "build": "Synergy PR-A24,IT-283; countered by dispel.", - "source": "Final intervention tutorial; U-N.", - "production": "Four-color open sash; stable discord." - }, - { - "identity": "IT-312 Junction Guardplate", - "slot": "Body / heavy armor", - "tier": "T4 / CH-08", - "flag": "S", - "effect": "Against linked telegraph damage, take 16 less per different role assigned, max 48.", - "build": "Synergy final checks; countered by single unlinked attacks.", - "source": "Approach room 5; U-N.", - "production": "Three-icon chest plate; assigned knocks." - }, - { - "identity": "IT-313 Civic Reply Cuff", - "slot": "Offhand / timing gear", - "tier": "T4 / CH-08", - "flag": "S", - "effect": "Reaction/queued reply power +14 when wearer is slowest ally.", - "build": "Synergy PR-A24; countered by speed buffs changing order.", - "source": "Council archive; U-N.", - "production": "Open speech-bracket cuff; answer tap." - }, - { - "identity": "IT-314 Many-Cadence Tonic", - "slot": "Consumable / resource tonic", - "tier": "T4 / CH-08", - "flag": "S", - "effect": "Grant 1 profession resource; if previous ally spent different resource type, also heal 40.", - "build": "Synergy varied sequence; countered by duplicate resource.", - "source": "SET-08 clinic; U-P.", - "production": "Layered clear vial; two-resource chord." - }, - { - "identity": "IT-315 Quiet-Choir Lining", - "slot": "Body / Hush armor", - "tier": "T4 / CH-08", - "flag": "S", - "effect": "Party Hush resistance from items +10 percentage points while wearer has 1+ resource; no effect at zero.", - "build": "Synergy IT-284; countered by resource tax.", - "source": "Defector evidence room; U-N.", - "production": "Colored lining under gray; muffled motif opens." - }, - { - "identity": "IT-316 Relay Director Seal", - "slot": "Charm / command gear", - "tier": "T4 / CH-08", - "flag": "S", - "effect": "Order/Insight gain +1 after three different roles accept one target rule; once per encounter.", - "build": "Synergy CHR-029; countered by rejections/uniform roles.", - "source": "Director testimony; U-0.", - "production": "Broken official seal; public stamp." - }, - { - "identity": "IT-317 Maintenance Founder Belt", - "slot": "Charm / infrastructure gear", - "tier": "T4 / CH-08", - "flag": "S", - "effect": "Power +18 against gate/device identities while a linked ally occupies another band.", - "build": "Synergy CHR-027,PR-A02; countered by creature waves/link sever.", - "source": "Founder vault with Tovin; U-N.", - "production": "Old tool belt/ring; span clang." - }, - { - "identity": "IT-318 Eight-Region Mantle", - "slot": "Back / mastery gear", - "tier": "T5 / CH-08", - "flag": "S", - "effect": "For each chapter represented by one equipped item across party, party gains 1 Guard at encounter start, maximum 8. Only one mantle counts.", - "build": "Synergy collection builds; countered by concentrated chapter sets.", - "source": "Collect one item from every chapter; U-0.", - "production": "Eight material panels; short motif roll." - }, + "id": "BO-R7-02", + "name": "Choir of Empty Lamps", + "class": "RG-07", + "rule": "Four linked lamp bodies share one health pool; circuit direction determines target, damage family, and resource theft, all shown by current flow.", + "responses": "Displace a lamp to break circuit; interrupt conductor lamp and attack open body. Failure: intact circuit compounded three effects.", + "production": "Half vitality circuit splits into two shorter opposing loops. P/A/V/S/M: four-body lamp ensemble, link/break/rejoin, directional shape current, polyphonic captioned motif." + }, { - "identity": "IT-319 Concord Trial Blade", - "slot": "Mainhand / mastery weapon", - "tier": "T5 / CH-08", - "flag": "S", - "effect": "Power +22 during Break only; outside Break power -5.", - "build": "Synergy coordinated stability teams; countered by ordinary/no-stability enemies.", - "source": "Second Weave first boss clear; U-N.", - "production": "Multi-metal narrow blade; fracture chord." - }, + "id": "BO-R8-01", + "name": "Crown Meridian", + "class": "RG-08", + "rule": "Eight-tick wheel assigns one prior region rule to each tick and one line band; wheel is visible and can be rotated once by defeating a summoned key.", + "responses": "Plan cooldowns around wheel; defeat key to rotate lethal pairing into prepared counter. Failure: known synthesis pair exceeded redundancy.", + "production": "Half vitality wheel reverses and two nonadjacent ticks resolve together. P/A/V/S/M: ring nexus avatar, eight-rule animation suite, radial forecast, full motif reprise." + }, { - "identity": "IT-320 Aetherbound Guildcoat", - "slot": "Body / completion armor", - "tier": "T5 / CH-08", - "flag": "S", - "effect": "At four distinct allied roles, wearer gains 24 Guard; each duplicate role reduces it by 8, minimum 0.", - "build": "Synergy plural roster; countered by uniform parties and role copy.", - "source": "Complete main campaign; U-0.", - "production": "Yellow coat mended with eight regions; full guild motif." + "id": "BO-R8-02", + "name": "The Public Way", + "class": "RG-08", + "rule": "Living route construct mirrors the player's current order and assigns each mirror one disclosed enemy rule; changing order updates mirrors after a one-cadence lag.", + "responses": "Reorder to move dangerous mirror away from fragile unit; hold order and burst during lag. Failure: repeated changes fed lagged target mismatch.", + "production": "Half vitality locks one mirrored position for two cadences, clearly marked. P/A/V/S/M: full-line stone figures, lagged mirror motion, before/after order cue, eight-region resolution score." } ], - "chapters": [ - { - "identity": "CH-01 First Light, Broken Bell", - "learning": "Read formation bands, telegraphs, Guard, and one intervention.", - "region": "REG-01 / SET-01", - "route": "Two tutorial spokes converge at the windmill relay; unlock roster, three-band formation, equipment, and Waylamp Retune.", - "enemies": "EN-O001..007, EN-E001..003, EN-S001, EN-B001; items IT-001..040; recruits CHR-001..004.", - "boss": "EN-B001 tests Anchored versus knockback and Exposed timing. Rewards base professions PR-B01..06, guild clinic, and a repair priority choice.", - "change": "Aster Yard visibly powers the clinic or signal towers. New Cycle+ swaps the unpowered service into a harder rescue opener with a unique collection record." - }, - { - "identity": "CH-02 Voices in Glass", - "learning": "Distinguish a base action from its secondary clause; answer Hush and delayed hazards.", - "region": "REG-02 / SET-02", - "route": "Three reed channels with rising water; unlock consumables, route forecasts, testimony caches, and reserve swapping between segments.", - "enemies": "EN-O008..014, EN-E004..006, EN-S002, EN-B002; items IT-041..080; recruits CHR-005..008.", - "boss": "EN-B002 stores and replays player skill clauses; counters require varied timing, not raw damage. Rewards PR-B07..12 and FAC-03 accord.", - "change": "Chosen water governance changes later healing prices and whether CH-07 exposes safe crossings. New Cycle+ inverts reliable channels each visit." - }, - { - "identity": "CH-03 The Heat We Owe", - "learning": "Manage profession resources, upgrade opportunity cost, and Break windows.", - "region": "REG-03 / SET-03", - "route": "A low furnace route, dangerous smelter lift, and strike-line negotiation; unlock upgrading, dismantling, advanced professions, and resource previews.", - "enemies": "EN-O015..021, EN-E007..009, EN-S003, EN-B003; items IT-081..120; recruits CHR-009..012.", - "boss": "EN-B003 taxes repeated resource spending and exposes itself when heat is vented in alternating bands. Rewards PR-A01..04 and one foundry charter.", - "change": "Worker furnaces or the mint become the primary craft node. New Cycle+ carries the losing institution's debt into item acquisition rules." - }, - { - "identity": "CH-04 Leaves That Disagree", - "learning": "Exploit Echo without loops, investigate variants, and build for mixed enemy rules.", - "region": "REG-04 / SET-04", - "route": "Branching footnotes reconnect into a canopy court; unlock bestiary research, skill loadout variants, field crafting, and relationship scenes.", - "enemies": "EN-O022..028, EN-E010..012, EN-S004, EN-B004; items IT-121..160; recruits CHR-013..016.", - "boss": "EN-B004 erases the most repeated action and can be baited with a deliberate low-value pattern. Rewards PR-A05..08 and archive annotations.", - "change": "Preserved disputes add optional enemy clauses but reveal final-boss counters; pruning shortens routes but removes some collection evidence. New Cycle+ restores pruned branches as hostile redactions." - }, - { - "identity": "CH-05 Two Tides, One Name", - "learning": "Track decoys, retarget skills, and decide when duplication is a liability.", - "region": "REG-05 / SET-05", - "route": "Harbor, reef, and moon-tide routes alternate on a visible clock; unlock target-priority scripts, item attunement, rescue contracts, and dual-faction reputation.", - "enemies": "EN-O029..035, EN-E013..015, EN-S005..006, EN-B005; items IT-161..200; recruits CHR-017..020.", - "boss": "EN-B005 mirrors the party's formation and punishes identical target scripts; Break comes from asymmetric actions. Rewards PR-A09..12 and rescue/customs authority.", - "change": "The first restored service changes counterfeit rates, recruit availability, and CH-08 civilian support. New Cycle+ gives major enemies a single mirrored decoy phase." - }, - { - "identity": "CH-06 A Crown Made of Weather", - "learning": "Control forced movement, turn order, and rotating objectives across unstable terrain.", - "region": "REG-06 / SET-06", - "route": "Four floating wards rotate around a central calm eye; unlock formation presets, weather forecasts, advanced AI priorities, and intervention chaining.", - "enemies": "EN-O036..042, EN-E016..018, EN-S007..008, EN-B006; items IT-201..240; recruits CHR-021..024.", - "boss": "EN-B006 moves both teams with readable gust cycles; players must Anchor selectively and ride beneficial Drift. Rewards PR-A13..16 and lift governance.", - "change": "Central or rotating stewardship determines route certainty and who controls emergency interventions. New Cycle+ randomizes rotation order but previews it fully." - }, - { - "identity": "CH-07 The Market Beneath Names", - "learning": "Plan around scarce recovery, reversible sacrifice, and incomplete information.", - "region": "REG-07 / SET-07", - "route": "A descending ring where maps cost memories; unlock legacy recovery, contract difficulty, sealed loadouts, and optional sub-boss hunts.", - "enemies": "EN-O043..049, EN-E019..021, EN-S009..010, EN-B007; items IT-241..280; recruits CHR-025..027.", - "boss": "EN-B007 offers false safe actions and marks overprotected units; the reliable tell is relational, learned from character arcs. Rewards PR-A17..20 and Nullmarket covenant.", - "change": "Reveal/protect choice changes final reinforcements, achievement routes, and postgame vendors. New Cycle+ remembers one sacrificed item category as scarce for the run." - }, - { - "identity": "CH-08 A Concord of Many", - "learning": "Synthesize every prior system and preserve strategic diversity under pressure.", - "region": "REG-08 / SET-08", - "route": "Seven choice-dependent approach rooms feed the First Junction; unlock final skill slots, complete profession branches, and the reconciliation intervention.", - "enemies": "EN-O050..056, EN-E022..024, EN-S011..012, EN-B008; items IT-281..320; recruits CHR-028..030.", - "boss": "EN-B008 mutes repeated cadences, copies uniform resources, and is Broken only by three different roles resolving linked telegraphs. Rewards PR-A21..24, ending state, and Second Weave.", - "change": "Prior repairs determine services, allies, phase hazards, and epilogue panels. New Cycle+ carries one negotiated accord and replaces static scaling with remix clauses." - } - ], - "achievements": [ - { - "identity": "ACV-001 Two Feet on the Ground", - "requirement": "Break EN-B001 after two different allies prevent its forced moves; no specific profession required.", - "meaning": "Confirms CH-01 Anchored/formation learning goal.", - "reward": "Bellwether shield frame and boss counter replay card." - }, - { - "identity": "ACV-002 A Clause in Context", - "requirement": "During EN-B002, feed one harmless clause, cleanse one Hush, and complete its three-timing Break in one clear.", - "meaning": "Demonstrates reading storage, suppression, and timing rather than damage.", - "reward": "Glassreed subtitle border and isolated reed-organ music stem." - }, - { - "identity": "ACV-003 The Heat We Share", - "requirement": "Break EN-B003 with physical, magical, and support tags from three different characters while shared Heat is 6 or lower.", - "meaning": "Rewards varied resource planning in CH-03.", - "reward": "Kilnstep anvil desk prop and alternation timeline annotation." - }, - { - "identity": "ACV-004 Keep the Footnote", - "requirement": "Contradict EN-B004's official sequence using a non-repeated action, then clear without another clause erasure.", - "meaning": "Tests deliberate pattern bait and action diversity.", - "reward": "Living-leaf portrait frame and restored instrument stem." - }, - { - "identity": "ACV-005 One Name, Two Tides", - "requirement": "Break EN-B005 by resolving three linked pairs with different action tags and never striking a marked false beacon.", - "meaning": "Rewards asymmetric target scripts and decoy literacy.", - "reward": "Tideglass split-cuff palette and true-beacon replay overlay." - }, - { - "identity": "ACV-006 Weather Without a Crown", - "requirement": "In EN-B006 final phase, choose at least one obey and one resist response in each of three choice windows.", - "meaning": "Validates selective movement, not universal compliance/rebellion.", - "reward": "Four-ward kite mobile for guild hall." - }, - { - "identity": "ACV-007 Protection Freely Given", - "requirement": "Defeat EN-B007 after three different roles decline offered Guard and use three different protection types.", - "meaning": "Rewards relational defense and reading Reliance.", - "reward": "Open-ring profile title “No One Vanishes.”" - }, - { - "identity": "ACV-008 Stable Difference", - "requirement": "Finish EN-B008 with four distinct Concord clauses and no duplicated profession role among the four final contributors.", - "meaning": "Capstone synthesis of the campaign thesis.", - "reward": "Eight-region guildcoat palette and final ensemble stem selector." - }, - { - "identity": "ACV-009 Held, Not Hidden", - "requirement": "As PR-B01, prevent a move, turn the attacker Exposed, and protect an ally behind in one telegraph.", - "meaning": "Demonstrates Linekeeper positioning loop.", - "reward": "Linekeeper shield pose for character viewer." - }, - { - "identity": "ACV-010 No Refrain", - "requirement": "As PR-B02, hit three different targets and return to the starting band without repeating a target.", - "meaning": "Demonstrates Tempo and path memory.", - "reward": "Wayblade cyan trail palette." - }, - { - "identity": "ACV-011 Listening Field", - "requirement": "As PR-B03, reveal three damage tags, cleanse Hush, and spend Tuned on a legal counter.", - "meaning": "Demonstrates Pitch and state reading.", - "reward": "Resonant fork waveform frame." - }, - { - "identity": "ACV-012 Known Reactions", - "requirement": "As PR-B04, transfer two different debuffs, survive both, and heal their original carriers above 70%.", - "meaning": "Rewards planned triage, not raw heal total.", - "reward": "Patchworker field-case prop." - }, - { - "identity": "ACV-013 Patient Border", - "requirement": "As PR-B05, let one unused zone refund Root and use the next zone to stop a dive.", - "meaning": "Rewards forecast judgment and restraint.", - "reward": "Vergewarden seed-boundary cursor." - }, - { - "identity": "ACV-014 Margin Note", - "requirement": "As PR-B06, reveal a target rule and use its shown counter before that enemy acts.", - "meaning": "Rewards information conversion.", - "reward": "Pathfinder bestiary pencil set." - }, - { - "identity": "ACV-015 Room for Breath", - "requirement": "As PR-B07, use Measured Rest to prevent Hush, then complete Open/Turn/Close in order.", - "meaning": "Rewards cadence timing.", - "reward": "Chanter optional bell timbre." - }, - { - "identity": "ACV-016 Useful Waste", - "requirement": "As PR-B08, deploy, vent, and recall devices without reaching 5 Heat.", - "meaning": "Rewards device lifecycle, not quantity.", - "reward": "Relaywright miniature pylon prop." - }, - { - "identity": "ACV-017 Seen Elsewhere", - "requirement": "As PR-B09, have a decoy take a hit, delay the next telegraph, then leave its target band.", - "meaning": "Rewards prediction and escape.", - "reward": "Veilrunner striped decoy outline." - }, - { - "identity": "ACV-018 Circulation", - "requirement": "As PR-B10, rescue an ally from terrain and use a blocked enemy move to apply Exposed.", - "meaning": "Rewards support/control dual use.", - "reward": "Currentcaller tide-line cursor." - }, - { - "identity": "ACV-019 Terms Kept", - "requirement": "As PR-B11, let a link expire with both allies alive after they use different actions.", - "meaning": "Rewards correct partner selection.", - "reward": "Oathbinder twin-knot frame." - }, - { - "identity": "ACV-020 Clear Dispatch", - "requirement": "As PR-B12, have three different allies accept Orders, then use Fallback to avoid a lethal forecast.", - "meaning": "Rewards command transparency and timing.", - "reward": "Signal Marshal pennant skin." - }, - { - "identity": "ACV-021 A Wall with Articles", - "requirement": "With PR-A01 or PR-A02, remove 100 elite stability through intercepts, prevented movement, or distance in one encounter.", - "meaning": "Tests the two advanced Linekeeper branches without favoring one.", - "reward": "Bulwark/lancer split profile plate." - }, - { - "identity": "ACV-022 Across and Back", - "requirement": "With PR-A03 or PR-A04, cross all three bands, affect two different targets, and end outside a hazard.", - "meaning": "Tests advanced Wayblade movement discipline.", - "reward": "Pulse/gale route trace in replay." - }, - { - "identity": "ACV-023 Three Facets, No Loop", - "requirement": "With PR-A05 or PR-A06, resolve three different tags and one Echo without any Echo creating another.", - "meaning": "Tests advanced Resonant breadth and loop safety.", - "reward": "Prism/folio viewer background." - }, - { - "identity": "ACV-024 Care Has a Clock", - "requirement": "With PR-A07 or PR-A08, recover delayed damage or suppressed debuffs on three different allies in one encounter.", - "meaning": "Tests advanced healer forecasting/rotation.", - "reward": "Lifewright/judge triage timeline theme." - }, - { - "identity": "ACV-025 Borders Can Move", - "requirement": "With PR-A09 or PR-A10, counter three enemy moves using a zone, plan, or predicted path.", - "meaning": "Tests advanced terrain authorship.", - "reward": "Briar/switchback guild floor decal." - }, - { - "identity": "ACV-026 Before the Quarry Moves", - "requirement": "With PR-A11 or PR-A12, reveal and interrupt three different target rules before resolution.", - "meaning": "Tests predictive ranged command.", - "reward": "Farline/quarry sight reticle." - }, - { - "identity": "ACV-027 Useful Argument", - "requirement": "With PR-A13 or PR-A14, complete a six-action sequence with no duplicate tag and interrupt one enemy repetition.", - "meaning": "Tests cadence diversity.", - "reward": "Chorus/dissonance music mixer stem." - }, - { - "identity": "ACV-028 Built for Weather", - "requirement": "With PR-A15 or PR-A16, keep two devices alive while crossing Pressure from negative to positive.", - "meaning": "Tests deployment under changing state.", - "reward": "Relay/storm bench model." - }, - { - "identity": "ACV-029 One Original", - "requirement": "With PR-A17 or PR-A18, suppress a variant, expose a true source, and have a decoy absorb a targeted skill.", - "meaning": "Tests research and decoy identity.", - "reward": "Gloam/mirror striped portrait mat." - }, - { - "identity": "ACV-030 The Tide Returns", - "requirement": "With PR-A19 or PR-A20, move enemies in opposite directions and preserve one ally buff through a hazard.", - "meaning": "Tests advanced Currentcaller alternation.", - "reward": "Undertow/brine animated menu line." - }, - { - "identity": "ACV-031 Amend, Do Not Erase", - "requirement": "With PR-A21 or PR-A22, keep one allied link alive while severing an enemy link or Hush clause.", - "meaning": "Tests covenant versus severance judgment.", - "reward": "Woven/cut cord display prop." - }, - { - "identity": "ACV-032 Lead by Reply", - "requirement": "With PR-A23 or PR-A24, resolve a linked telegraph using three roles and let a fourth distinct role answer.", - "meaning": "Tests capstone command pluralism.", - "reward": "Field/concord four-role title plate." - }, - { - "identity": "ACV-033 The Other Service", - "requirement": "In chapter select, complete the CH-01 service objective not powered in the original run.", - "meaning": "Rewards seeing both civic outcomes without restarting.", - "reward": "Aster Yard day/night hub postcard." - }, - { - "identity": "ACV-034 Every Voice Has a Source", - "requirement": "Inspect all three testimony caches and their consent labels in CH-02.", - "meaning": "Rewards contextual exploration, not cache count alone.", - "reward": "Glassreed annotated transcript gallery." - }, - { - "identity": "ACV-035 Credit Where It Works", - "requirement": "Find CHR-012's maker mark, CHR-010's refused work order, and the hidden infirmary ledger in CH-03.", - "meaning": "Connects labor, safety, and attribution through authored scenes.", - "reward": "Kilnstep provenance plaque set." - }, - { - "identity": "ACV-036 Read by Hand", - "requirement": "Complete the tactile root path with CHR-016 recruited; screen-reader/high-contrast assists remain valid.", - "meaning": "Rewards accessible archive route discovery.", - "reward": "Tactile-map concept sheet in gallery." - }, - { - "identity": "ACV-037 No False Passenger", - "requirement": "Resolve both memory echoes in CHR-019's recruitment and inspect the rescue manifest correction.", - "meaning": "Rewards identity story exploration.", - "reward": "Two-cuff portrait variant." - }, - { - "identity": "ACV-038 Four Wards, Four Speakers", - "requirement": "Visit all ward councils and hear each emergency-authority proposal in CH-06.", - "meaning": "Rewards political/world exploration rather than a choice outcome.", - "reward": "Updraft council token display." - }, - { - "identity": "ACV-039 Maintenance Is Authorship", - "requirement": "Repair all manual bypasses and read the collective credit plaque in CH-07.", - "meaning": "Rewards infrastructure exploration and CHR-027's arc.", - "reward": "Nullmarket maintenance mural." - }, - { - "identity": "ACV-040 Seven Consequences", - "requirement": "In CH-08, complete every regional consequence room without using IT-289.", - "meaning": "Rewards synthesis; no difficulty or speed condition.", - "reward": "Concord Hall eight-panel diorama." - }, - { - "identity": "ACV-041 Open Roster", - "requirement": "Win one encounter with four distinct base roles and another with four distinct advanced roles.", - "meaning": "Encourages breadth without requiring every profession.", - "reward": "Guild roster four-color frame." - }, - { - "identity": "ACV-042 Tools, Not Trophies", - "requirement": "Trigger behavior clauses from one B item in each chapter allocation during any number of encounters.", - "meaning": "Rewards experimenting with eight items, not collecting 320.", - "reward": "Equipment viewer animated tool rack." - }, - { - "identity": "ACV-043 A Counter for Every Tier", - "requirement": "Correctly counter one ordinary, elite, sub-boss, and boss telegraph in a single chapter replay set.", - "meaning": "Rewards reading across tiers.", - "reward": "Four-tier bestiary tab skin." - }, - { - "identity": "ACV-044 Change of Practice", - "requirement": "Complete any five character arcs and view their changed hub idle poses.", - "meaning": "Rewards relationship engagement with choice of characters.", - "reward": "Hub “working together” illustration." - }, - { - "identity": "ACV-045 No One Required", - "requirement": "Clear a chapter boss once with none of its chapter's newly recruited characters.", - "meaning": "Confirms roster flexibility, not exclusion.", - "reward": "Neutral party-slot profile frame." - }, - { - "identity": "ACV-046 Readable at Any Speed", - "requirement": "Pause on three different telegraph types and inspect target, timing, and clause details; combat outcome irrelevant.", - "meaning": "Rewards comprehension features without stigmatizing assists.", - "reward": "Telegraph glossary theme." - }, - { - "identity": "ACV-047 One Remixed Route", - "requirement": "Finish one Second Weave route after changing loadout in response to its previewed clause.", - "meaning": "Rewards postgame adaptation, not endless rank.", - "reward": "Second Weave shuttle desk prop." - }, - { - "identity": "ACV-048 The Work Continues", - "requirement": "Complete COL-001..COL-008 and the Second Weave Concordance Trial once.", - "meaning": "Finite postgame closure tied to regional understanding.", - "reward": "Final title “Keeper of Working Agreements” and credits ensemble selector." - } - ], - "collections": [ - { - "identity": "COL-001 Bellwether Repair Ledger", - "entries": "Six entries: clinic intake, tower warning, mill hand account, EN-S001 counter sketch, EN-B001 core diagram, alternate-service cleanup.", - "acquisition": "First five are on critical/visible optional nodes; alternate service is chapter-select cleanup. No random drop.", - "display": "Aster Yard repair-table diorama." - }, - { - "identity": "COL-002 Glassreed Testimony Ledger", - "entries": "Six consent-labeled entries from three caches, filter decision, EN-S002, and EN-B002.", - "acquisition": "Cache map reveals all locations after boss; missed entries remain interactable.", - "display": "Source-labeled reed playback gallery." - }, - { - "identity": "COL-003 Embervault Labor Ledger", - "entries": "Six entries from strike line, mint infirmary, maker attribution, quota choice, EN-S003, and EN-B003.", - "acquisition": "Each route preview marks ledger node; decision-side counterpart opens in cleanup simulation.", - "display": "Kilnstep worker-credit wall." - }, - { - "identity": "COL-004 Verdant Annotation Ledger", - "entries": "Six entries from both charters, tactile path, consent case, EN-S004, and EN-B004.", - "acquisition": "Pruned content is represented by an authored record in cleanup, not a forced second campaign.", - "display": "Living charter leaf viewer." - }, - { - "identity": "COL-005 Mirrorstep Identity Ledger", - "entries": "Seven entries from rescue manifest, customs appeal, both Neve memories, two sub-bosses, and EN-B005.", - "acquisition": "Story entries are guaranteed; missed sub-bosses gain direct chapter-select nodes.", - "display": "Port Lacuna corrected manifest mural." - }, - { - "identity": "COL-006 Crownless Governance Ledger", - "entries": "Seven entries from four ward proposals, two sub-bosses, and EN-B006.", - "acquisition": "Council nodes never lock each other; postboss transit opens any missed ward.", - "display": "Rotating four-ward mobile." - }, - { - "identity": "COL-007 Hollow Maintenance Ledger", - "entries": "Seven entries from anonymous clinic, escrow map, three bypasses, either sub-boss, and EN-B007.", - "acquisition": "One of two sub-boss entries is sufficient; no disclosure choice is privileged.", - "display": "Nullmarket collective-credit plaque." - }, - { - "identity": "COL-008 First Junction Ledger", - "entries": "Eight entries: seven consequence-room records and EN-B008 public charter.", - "acquisition": "All consequence rooms selectable after ending; IT-289 use does not erase their record.", - "display": "Concord Hall eight-panel table." - }, - { - "identity": "COL-009 Frontline Practice Folio", - "entries": "Demonstrate signature loop once for PR-B01,PR-B11,PR-A01,PR-A02,PR-A21,PR-A22.", - "acquisition": "Bestiary simulation offers a suitable fixed encounter for each; no mastery level grind.", - "display": "Six-pose defender animation reel." - }, - { - "identity": "COL-010 Mobile Practice Folio", - "entries": "One valid signature trigger each for PR-B02,PR-B10,PR-A03,PR-A04,PR-A18,PR-A19.", - "acquisition": "Trigger checklist names legal encounter and accepts assist settings.", - "display": "Six-path movement trace viewer." - }, - { - "identity": "COL-011 Resonance Practice Folio", - "entries": "One signature trigger each for PR-B03,PR-B07,PR-A05,PR-A06,PR-A13,PR-A14.", - "acquisition": "Echo/repeat safeguards are checked by event, not damage total.", - "display": "Layered cadence mixer." - }, - { - "identity": "COL-012 Care Practice Folio", - "entries": "One signature trigger each for PR-B04,PR-B05,PR-A07,PR-A08,PR-A09,PR-A20.", - "acquisition": "Fixed simulation starts injured/debuffed so no farming is needed.", - "display": "Six-step care storyboard." - }, - { - "identity": "COL-013 Survey Practice Folio", - "entries": "One signature trigger each for PR-B06,PR-B09,PR-A10,PR-A11,PR-A12,PR-A17.", - "acquisition": "Fixed variants/decoys guarantee target availability.", - "display": "Target-rule overlay gallery." - }, - { - "identity": "COL-014 Relay Practice Folio", - "entries": "One signature trigger each for PR-B08,PR-B12,PR-A15,PR-A16,PR-A23,PR-A24.", - "acquisition": "Fixed resource/device sequence; one successful loop per profession.", - "display": "Relay and command prop turntable." - }, - { - "identity": "COL-015 Ordinary Counter Atlas", - "entries": "Correctly answer one identity from each ordinary seven-enemy chapter range: EN-O001..007 through EN-O050..056.", - "acquisition": "Only eight total answers required; player chooses any enemy per chapter.", - "display": "Ordinary silhouette/contact-sheet theme." - }, - { - "identity": "COL-016 Elite Counter Atlas", - "entries": "Break one of each chapter's three elites: EN-E001..003 through EN-E022..024.", - "acquisition": "Eight Breaks total; simulation unlocks after first chapter clear.", - "display": "Elite telegraph timeline gallery." - }, - { - "identity": "COL-017 Regional Hunt Atlas", - "entries": "Break six of EN-S001..EN-S012, with at least one from CH-01..04 and two from CH-05..08 collectively.", - "acquisition": "Half the sub-boss roster is sufficient; selected hunts are direct, not random.", - "display": "Regional sub-boss concept folio." - }, - { - "identity": "COL-018 Boss Counter Atlas", - "entries": "Record the primary Break condition for EN-B001..EN-B008 by executing it once.", - "acquisition": "Campaign clears can count retroactively from event log; no repeat if already demonstrated.", - "display": "Eight-boss phase-diagram wall." - }, - { - "identity": "COL-019 Behavior Tool Atlas", - "entries": "Trigger one B item effect from each 40-item chapter block; any eight qualifying items.", - "acquisition": "Owned loaner versions are available in simulation after chapter clear, so collection luck is irrelevant.", - "display": "Eight-tool animated equipment rack." - }, - { - "identity": "COL-020 Concordance Voices", - "entries": "View one completed relationship scene for each faction map: FAC-01 CHR-001/002, FAC-02 CHR-008/029, FAC-03 CHR-005/006, FAC-04 CHR-009/012, FAC-05 CHR-013/016, FAC-06 CHR-017/018, FAC-07 CHR-022/024, FAC-08 CHR-014/028.", - "acquisition": "Scene index shows requirements and cleanup locations; one scene per faction, with no romance or exhaustive roster requirement.", - "display": "Selectable settlement-voice layer for title theme." + "regions": [ + { + "id": "RG-01", + "name": "Windglass Verge", + "framing": "open grass terraces where suspended mineral panes redirect aether gusts. The guild charts a safe trade crossing.", + "pressure": "Introduces front-to-rear reach, basic protection, visible projectile screens, and simple pushes. Pressures the player to field a front holder without making one profession mandatory.", + "progression": "Two-threat tutorials become three-unit compositions; glass-wind hazard telegraphs a push one cadence ahead. Shops emphasize EQ-001..EQ-040; first clear opens all base profession shop weights.", + "assignment": "EN-R1-01..EN-R1-12; BO-R1-01..BO-R1-02; artifacts AR-001..AR-008.", + "production": "E/P/A/V/S/M: bright terrace layers, wind direction shapes, 12 silhouette kits, two boss scale kits, calm-to-gale music stem." + }, + { + "id": "RG-02", + "name": "Siltwake Fens", + "framing": "reed channels carry luminous sediment between movable banks. The guild reopens seasonal ferry paths.", + "pressure": "Introduces pulls, position-indexed hazards, hindrance expiry, and healing denial. Pressures stable order versus deliberate movement.", + "progression": "Tide markers shift the safe line index after a disclosed countdown; enemy pairs exploit whichever end the player leaves unsupported. Shops add EQ-041..EQ-080; route rewards add AR-009..AR-015.", + "assignment": "EN-R2-01..EN-R2-12; BO-R2-01..BO-R2-02.", + "production": "E/P/A/V/S/M: layered reeds/waterline, non-color tide notches, wet movement family, low pulse/hazard events, reed-and-drum tension stem." + }, + { + "id": "RG-03", + "name": "Emberloom Works", + "framing": "communal kilns weave heat through old ceramic conduits. The guild prevents cascading pressure faults.", + "pressure": "Introduces constructs, delayed bursts, item cooldown attacks, and Heat-like self-cost patterns. Pressures timing protection and device removal.", + "progression": "Every encounter declares one pressure valve position; occupying, vacating, or crossing it changes a known countdown. Shops add EQ-081..EQ-120; rewards add AR-016..AR-022.", + "assignment": "EN-R3-01..EN-R3-12; BO-R3-01..BO-R3-02.", + "production": "E/P/A/V/S/M: kiln layers, pressure gauges readable without color, construct/hot-metal families, vent captions, struck-clay industrial stem." + }, + { + "id": "RG-04", + "name": "Quillroot Archive", + "framing": "living root shelves preserve route contracts as changing leaf patterns. The guild restores public navigation copies.", + "pressure": "Introduces copied actions, target redirection, cleanse traps, and rule-text enemies. Pressures source diversity and inspection rather than raw output.", + "progression": "Encounters choose one disclosed archive clause: repeat, alternate, or preserve. Enemies reward obeying or deliberately breaking it. Shops add EQ-121..EQ-160; rewards add AR-023..AR-030.", + "assignment": "EN-R4-01..EN-R4-12; BO-R4-01..BO-R4-02.", + "production": "E/P/A/V/S/M: root stacks and leaf-script shapes, copy/erase motion family, paper/wood events with captions, plucked-string puzzle stem." + }, + { + "id": "RG-05", + "name": "Tideglass Reach", + "framing": "salt flats hold mirror pools that repeat silhouettes out of sequence. The guild stabilizes rescue beacons.", + "pressure": "Introduces decoys, delayed copies, rearmost intrusion, and identity-versus-footprint rules. Pressures legal target filters and rear recovery.", + "progression": "Preview distinguishes source from echo with shape and timing; some routes start with an empty rear arrival index. Shops add EQ-161..EQ-200; rewards add AR-031..AR-037.", + "assignment": "EN-R5-01..EN-R5-13; BO-R5-01..BO-R5-02.", + "production": "E/P/A/V/S/M: high-contrast salt/mirror layers, source/echo silhouette treatment, reflection timing VFX, water-glass events, reversed motif stem." + }, + { + "id": "RG-06", + "name": "Skyrail Orchard", + "framing": "fruit terraces hang from slow freight rails crossing strong updrafts. The guild makes harvest routes dependable.", + "pressure": "Introduces moving enemy order, airborne untargetability windows, falling arrivals, and contested center. Pressures flexible reach and action reservation.", + "progression": "Rail cars announce two future stops; enemies board or leave only at a shown stop. Rewards improve when the player preserves cargo footprints. Shops add EQ-201..EQ-240; rewards add AR-038..AR-045.", + "assignment": "EN-R6-01..EN-R6-13; BO-R6-01..BO-R6-02.", + "production": "E/P/A/V/S/M: orchard/rail parallax, stop glyphs, board/leap/fall families, rail clack with haptic-safe caption, airy string/percussion stem." + }, + { + "id": "RG-07", + "name": "Nightcurrent Basin", + "framing": "dark water channels reveal only what luminous current touches. The guild maps safe night crossings.", + "pressure": "Introduces forecast denial that must be actively revealed, resource theft, linked enemy circuits, and mixed-damage retaliation. Pressures scouting tools and diversified resource loops.", + "progression": "One visible current sweeps front to rear; it reveals a hidden action category before the action can become major. The player always has at least one non-item reveal route. Shops add EQ-241..EQ-280; rewards add AR-046..AR-052.", + "assignment": "EN-R7-01..EN-R7-13; BO-R7-01..BO-R7-02.", + "production": "E/P/A/V/S/M: dark-but-readable basin layers, luminance-safe reveal shapes, current-link VFX, sonar-like captions, sparse bass-to-bright reveal stem." + }, + { + "id": "RG-08", + "name": "Crown of Morn", + "framing": "the high route nexus folds all prior currents through a ring of dawnlit stone. The guild completes a stable public circuit.", + "pressure": "Synthesizes push/pull, expiry, constructs, copies, echoes, rail timing, and reveal without adding an undisclosed immunity. Pressures role redundancy, replacement depth, and adapting across consecutive fights.", + "progression": "Routes present two known grammars at once and one choice of recovery versus counter reward. Boss preview names every inherited rule source. Shops add EQ-281..EQ-320; rewards add AR-053..AR-060; clearing either boss completes the first-clear route and opens alternate-boss mastery paths.", + "assignment": "EN-R8-01..EN-R8-13; BO-R8-01..BO-R8-02.", + "production": "E/P/A/V/S/M: dawn nexus with eight readable current motifs, synthesis action families, motif-specific captions, layered reprise music with reduced-density mix." } ] } diff --git a/prototype/site/index.html b/prototype/site/index.html index 3dcdf746..2398ac04 100644 --- a/prototype/site/index.html +++ b/prototype/site/index.html @@ -1,64 +1,71 @@ - + - - Aetherbound Guild 完整游戏设计 + + Aetherbound Guild - Final Landscape Prototype - +
-
- - -
+ +
+ Game stage +
+ + + + +
+
+
+
diff --git a/prototype/site/styles.css b/prototype/site/styles.css index 0a4ee6da..7ba28267 100644 --- a/prototype/site/styles.css +++ b/prototype/site/styles.css @@ -1,329 +1,914 @@ -:root { - color-scheme: light; - --ink-950: #171c22; - --ink-800: #2b333b; - --ink-650: #46515b; - --paper-050: #f7f3e8; - --paper-100: #eee9dc; - --paper-200: #ddd4c2; - --white: #fffef9; - --aether: #32b8c6; - --gold: #e5b445; - --jade: #3f9e78; - --coral: #d95c55; - --command: #477ec7; - --violet: #8c63a8; - --copper: #b86d3f; - --secured: #287a5a; - --line: rgba(23, 28, 34, 0.16); - --shadow: 0 16px 38px rgba(23, 28, 34, 0.14); - --sidebar: 278px; - --topbar: 64px; - font-family: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif; -} - * { box-sizing: border-box; } -html { min-width: 320px; background: #e8e4da; } -body { margin: 0; color: var(--ink-950); background: var(--paper-100); letter-spacing: 0; } -button, input, select { font: inherit; letter-spacing: 0; } + +:root { + --ink-950: #182127; + --ink-840: #26343a; + --ink-700: #425159; + --mist-050: #f3f6f2; + --mist-120: #e8eeeb; + --mist-180: #d7e0dd; + --white: #fff; + --route-teal: #13818a; + --work-gold: #d6a72e; + --safe-jade: #27845e; + --danger-coral: #c94e52; + --uncertain-cobalt: #3969a8; + --neutral-silver: #88969b; + --focus-white: #fff; + --line: rgba(24, 33, 39, 0.17); + --line-strong: rgba(24, 33, 39, 0.36); + --shadow: 0 14px 34px rgba(24, 33, 39, 0.14); + --sidebar: 264px; + --topbar: 58px; + color-scheme: light; + font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + font-synthesis: none; +} + +html { min-width: 320px; background: var(--mist-050); } +body { margin: 0; color: var(--ink-950); background: var(--mist-050); letter-spacing: 0; } +body[data-text-scale="115"] { font-size: 115%; } +body[data-text-scale="130"] { font-size: 130%; } +button, input { font: inherit; letter-spacing: 0; } button { cursor: pointer; } -button:focus-visible, input:focus-visible, select:focus-visible { outline: 3px solid #fff; box-shadow: 0 0 0 5px var(--command); } +button:focus-visible, input:focus-visible, [tabindex]:focus-visible { outline: 3px solid var(--uncertain-cobalt); outline-offset: 2px; } +button:disabled { cursor: not-allowed; opacity: 0.48; } img { display: block; max-width: 100%; } -.skip-link { position: fixed; z-index: 100; left: 12px; top: -60px; padding: 10px 14px; color: #fff; background: var(--ink-950); } +.sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0, 0, 0, 0); } +.skip-link { position: fixed; z-index: 100; left: 12px; top: -60px; padding: 10px 14px; color: var(--white); background: var(--ink-950); } .skip-link:focus { top: 12px; } + .app-shell { min-height: 100vh; display: grid; grid-template-columns: var(--sidebar) minmax(0, 1fr); } -.sidebar { position: sticky; top: 0; height: 100vh; overflow-y: auto; color: #f8f6ef; background: var(--ink-950); border-right: 1px solid rgba(255,255,255,.08); z-index: 40; } -.brand-block { min-height: 94px; display: flex; gap: 12px; align-items: center; padding: 18px; border-bottom: 1px solid rgba(255,255,255,.1); } -.brand-block > div { min-width: 0; } +.sidebar { position: sticky; top: 0; z-index: 40; height: 100vh; display: flex; flex-direction: column; color: var(--mist-050); background: var(--ink-950); border-right: 1px solid #33444a; } +.brand-block { min-height: 84px; display: grid; grid-template-columns: 44px 1fr; align-items: center; gap: 12px; padding: 14px 18px; border-bottom: 1px solid rgba(255,255,255,.13); } +.brand-mark { width: 42px; height: 42px; display: grid; place-items: center; color: var(--ink-950); font-size: 14px; font-weight: 900; background: var(--work-gold); border: 2px solid #f0d980; border-radius: 4px; } .brand-block strong, .brand-block span { display: block; } -.brand-block strong { font-size: 15px; } -.brand-block span { margin-top: 3px; color: #bfc7cd; font-size: 12px; } -.brand-mark { flex: 0 0 42px; width: 42px; height: 42px; display: grid !important; place-items: center; color: var(--ink-950) !important; font-weight: 900; background: var(--gold); border: 2px solid #ffe295; border-radius: 4px; } -.primary-nav { padding: 14px 10px 90px; display: grid; gap: 4px; } -.nav-item { width: 100%; min-height: 48px; display: grid; grid-template-columns: 28px minmax(0, 1fr) auto; align-items: center; gap: 8px; padding: 8px 10px; color: #d5dadd; text-align: left; border: 0; border-left: 3px solid transparent; border-radius: 4px; background: transparent; } -.nav-item > span { font-size: 11px; color: #87939c; } -.nav-item > b { min-width: 25px; padding: 2px 5px; text-align: center; font-size: 10px; color: var(--ink-950); background: #c5cdd2; border-radius: 8px; } -.nav-item:hover { background: rgba(255,255,255,.06); } -.nav-item.is-active { color: #fff; border-left-color: var(--gold); background: rgba(229,180,69,.12); } -.nav-item.is-active > span { color: var(--gold); } -.nav-item.is-active > b { background: var(--gold); } -.sidebar-footer { position: sticky; bottom: 0; display: flex; gap: 10px; align-items: center; padding: 14px 18px; background: #12171c; border-top: 1px solid rgba(255,255,255,.1); } +.brand-block strong { font-size: 14px; } +.brand-block div > span { margin-top: 4px; color: #aebdc1; font-size: 11px; } +.primary-nav { display: grid; gap: 2px; padding: 16px 10px; } +.nav-item { min-height: 52px; display: grid; grid-template-columns: 28px 1fr auto; align-items: center; gap: 10px; padding: 9px 12px; color: #b9c6c9; text-align: left; background: transparent; border: 1px solid transparent; border-radius: 4px; } +.nav-item:hover { color: var(--white); background: rgba(255,255,255,.06); } +.nav-item.is-active { color: var(--white); background: #304047; border-color: #52676e; box-shadow: inset 4px 0 var(--work-gold); } +.nav-item > span { color: var(--work-gold); font-size: 11px; font-weight: 900; } +.nav-item b { font-size: 13px; } +.nav-item em { min-width: 28px; padding: 3px 5px; color: #c8d3d5; font-size: 10px; font-style: normal; text-align: center; border: 1px solid #52646a; border-radius: 3px; } +.sidebar-footer { margin-top: auto; display: flex; align-items: center; gap: 10px; padding: 15px 18px; border-top: 1px solid rgba(255,255,255,.13); } .sidebar-footer strong, .sidebar-footer span { display: block; } -.sidebar-footer strong { font-size: 11px; color: #fff; } -.sidebar-footer span { color: #9ca7af; font-size: 10px; } -.status-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--gold); box-shadow: 0 0 0 4px rgba(229,180,69,.15); } +.sidebar-footer strong { font-size: 10px; } +.sidebar-footer div span { margin-top: 3px; color: #9dafb4; font-size: 10px; } +.status-dot { width: 9px; height: 9px; background: var(--work-gold); border-radius: 50%; box-shadow: 0 0 0 4px rgba(214,167,46,.15); } + .page-shell { min-width: 0; } -.topbar { position: sticky; top: 0; z-index: 30; min-height: var(--topbar); display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 10px clamp(16px, 3vw, 38px); background: rgba(247,243,232,.94); border-bottom: 1px solid var(--line); backdrop-filter: blur(12px); } -.breadcrumbs { min-width: 0; display: flex; gap: 9px; align-items: center; font-size: 13px; } -.breadcrumbs span, .breadcrumbs b { color: #75808a; font-weight: 500; } +.topbar { position: sticky; top: 0; z-index: 30; min-height: var(--topbar); display: flex; align-items: center; justify-content: space-between; gap: 14px; padding: 8px 22px; background: rgba(255,255,255,.96); border-bottom: 1px solid var(--line); backdrop-filter: blur(12px); } +.breadcrumbs { min-width: 0; display: flex; align-items: center; gap: 9px; font-size: 12px; } +.breadcrumbs span { color: var(--ink-700); white-space: nowrap; } +.breadcrumbs b { color: var(--neutral-silver); } .breadcrumbs strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } -.top-actions { display: flex; gap: 10px; align-items: center; } -.evidence-badge, .chip { display: inline-flex; min-height: 26px; align-items: center; padding: 4px 8px; font-size: 11px; font-weight: 700; color: var(--ink-800); background: var(--paper-200); border: 1px solid rgba(23,28,34,.12); border-radius: 4px; } -.icon-button { width: 42px; height: 42px; padding: 0; display: grid; place-items: center; font-size: 22px; line-height: 1; color: var(--ink-950); background: transparent; border: 1px solid var(--line); border-radius: 4px; } -.icon-button:hover { background: #fff; } +.top-actions { display: flex; align-items: center; gap: 8px; } +.icon-button { width: 40px; height: 40px; display: inline-grid; place-items: center; color: var(--ink-950); font-size: 19px; background: var(--white); border: 1px solid var(--line-strong); border-radius: 4px; } +.icon-button:hover { background: var(--mist-120); } +.locale-control { display: flex; padding: 2px; background: var(--mist-120); border: 1px solid var(--line); border-radius: 4px; } +.locale-control button { min-height: 32px; padding: 4px 9px; color: var(--ink-700); background: transparent; border: 0; border-radius: 2px; } +.locale-control button.is-active { color: var(--white); background: var(--ink-840); } +.evidence-badge { padding: 6px 9px; color: #7d5410; font-size: 10px; font-weight: 800; background: #fff4ce; border: 1px solid #e4c969; border-radius: 3px; } .mobile-only { display: none; } -main { min-height: calc(100vh - var(--topbar)); padding: clamp(22px, 3.5vw, 54px); } -.view { width: min(100%, 1480px); margin: 0 auto; } -.view-heading { display: flex; justify-content: space-between; gap: 24px; align-items: flex-end; margin-bottom: 28px; } -.view-heading > div { max-width: 860px; } -.eyebrow { display: block; margin-bottom: 8px; color: var(--copper); font-size: 11px; font-weight: 900; text-transform: uppercase; } -h1, h2, h3, p { margin-top: 0; } -h1 { margin-bottom: 10px; font-size: clamp(28px, 3.3vw, 46px); line-height: 1.08; } -h2 { margin-bottom: 10px; font-size: 24px; line-height: 1.2; } -h3 { margin-bottom: 8px; font-size: 17px; } -p { color: var(--ink-650); line-height: 1.7; } -.view-heading p { max-width: 820px; margin-bottom: 0; } -.metric-row { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 1px; margin: 24px 0 36px; border: 1px solid var(--line); background: var(--line); } -.metric { min-height: 108px; padding: 18px; background: var(--white); } -.metric strong { display: block; margin-bottom: 7px; font-size: 30px; font-variant-numeric: tabular-nums; } -.metric span { color: var(--ink-650); font-size: 12px; } -.overview-hero { position: relative; min-height: 0; aspect-ratio: 16/9; overflow: hidden; background: var(--ink-950); border: 1px solid rgba(23,28,34,.32); box-shadow: var(--shadow); } -.overview-hero img { width: 100%; height: 100%; object-fit: contain; } -.overview-hero-copy { position: absolute; left: 3.5%; bottom: 5%; width: min(46%, 580px); padding: 20px 22px; color: #fff; background: rgba(23,28,34,.89); border-left: 5px solid var(--gold); } -.overview-hero-copy h2 { margin-bottom: 7px; font-size: clamp(20px, 2.3vw, 34px); } -.overview-hero-copy p { margin: 0; color: #dce4e8; line-height: 1.55; } -.section-band { margin-top: 42px; padding: 30px 0; border-top: 1px solid var(--line); } -.thesis-grid, .production-grid { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 18px; } -.info-block { min-height: 160px; padding: 20px; background: var(--white); border: 1px solid var(--line); border-radius: 6px; } -.info-block::before { content: ""; display: block; width: 42px; height: 4px; margin-bottom: 16px; background: var(--aether); } -.info-block:nth-child(2)::before { background: var(--gold); } -.info-block:nth-child(3)::before { background: var(--coral); } -.info-block p { margin-bottom: 0; font-size: 14px; } -.toolbar { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin-bottom: 22px; } -.search-input { min-width: min(100%, 320px); min-height: 44px; padding: 10px 12px; color: var(--ink-950); background: #fff; border: 1px solid var(--line); border-radius: 4px; } -.segmented { display: flex; flex-wrap: wrap; gap: 1px; border: 1px solid var(--line); background: var(--line); } -.segmented button { min-height: 42px; padding: 8px 12px; color: var(--ink-650); background: var(--white); border: 0; } -.segmented button.is-active { color: #fff; background: var(--ink-800); } -.screen-layout { display: grid; grid-template-columns: minmax(220px, 300px) minmax(0, 1fr); gap: clamp(18px, 2.5vw, 34px); align-items: start; } -.screen-index { position: sticky; top: calc(var(--topbar) + 20px); max-height: calc(100vh - var(--topbar) - 40px); overflow: auto; background: var(--white); border: 1px solid var(--line); } -.screen-index button { width: 100%; min-height: 58px; display: grid; grid-template-columns: 68px minmax(0,1fr) auto; gap: 8px; align-items: center; padding: 9px 12px; text-align: left; color: var(--ink-650); background: transparent; border: 0; border-bottom: 1px solid var(--line); } -.screen-index button span { font-size: 11px; font-weight: 800; color: var(--copper); } -.screen-index button b { overflow: hidden; font-size: 12px; text-overflow: ellipsis; white-space: nowrap; } -.screen-index button i { padding: 3px 5px; font-size: 9px; font-style: normal; font-weight: 800; white-space: nowrap; border: 1px solid var(--line); border-radius: 3px; } -.coverage-dedicated { color: #fff; background: var(--secured); } -.coverage-family { color: var(--ink-800); background: var(--paper-200); } -.coverage-missing { color: #fff; background: #a54640; } -.screen-index button.is-active { color: var(--ink-950); background: #f1ead8; box-shadow: inset 4px 0 var(--gold); } -.screen-detail { min-width: 0; } -.screen-stage-wrap { padding: clamp(8px, 1.2vw, 16px); background: #d9d4c7; border: 1px solid var(--line); box-shadow: var(--shadow); } -.game-stage { position: relative; width: 100%; aspect-ratio: 16/9; overflow: hidden; color: #fff; background: #26313a; isolation: isolate; } -.game-stage > img.stage-art { position: absolute; inset: 0; z-index: -2; width: 100%; height: 100%; object-fit: cover; } -.game-stage::after { content: ""; position: absolute; inset: 0; z-index: -1; pointer-events: none; background: linear-gradient(180deg, rgba(10,15,18,.48) 0, transparent 22%, transparent 70%, rgba(10,15,18,.68) 100%); } -.game-stage.stage-light { color: var(--ink-950); background: #e6e0d2; } -.game-stage.stage-light::after { background: linear-gradient(180deg, rgba(247,243,232,.2), rgba(247,243,232,.02) 55%, rgba(247,243,232,.55)); } -.game-stage.stage-dedicated::after, .game-stage.stage-missing::after { display: none; } -.game-stage button { min-height: 38px; color: inherit; border: 1px solid rgba(255,255,255,.34); border-radius: 4px; background: rgba(23,28,34,.84); } -.hud-top { position: absolute; inset: 2.2% 2.4% auto; height: 8%; display: flex; justify-content: space-between; gap: 8px; align-items: center; } -.hud-group { display: flex; gap: 7px; align-items: center; } -.hud-chip { min-height: 32px; display: flex; align-items: center; gap: 6px; padding: 5px 9px; font-size: clamp(9px, .85vw, 13px); font-weight: 800; color: #fff; background: rgba(23,28,34,.84); border: 1px solid rgba(255,255,255,.24); border-radius: 4px; } -.hud-chip i { width: 9px; height: 9px; border-radius: 50%; background: var(--gold); } -.hud-chip.risk i { background: var(--copper); } -.hud-chip.safe i { background: var(--secured); } -.stage-title { position: absolute; top: 13%; left: 4%; max-width: 43%; text-shadow: 0 2px 12px #000; } -.stage-title small { display: block; margin-bottom: 6px; color: #ffe295; font-weight: 900; } -.stage-title strong { display: block; font-size: clamp(17px, 2.2vw, 34px); line-height: 1.15; } -.stage-title p { margin: 8px 0 0; color: #fff; font-size: clamp(9px, .9vw, 14px); line-height: 1.45; } -.stage-bottom { position: absolute; left: 3%; right: 3%; bottom: 3%; min-height: 11%; display: flex; justify-content: space-between; gap: 12px; align-items: end; } -.stage-primary { min-width: 23%; padding: 10px 16px; font-weight: 900; color: var(--ink-950) !important; background: var(--gold) !important; border-color: #ffe49d !important; } -.stage-secondary { padding: 8px 12px; } -.route-map { position: absolute; inset: 18% 6% 18%; } -.route-line { position: absolute; left: 8%; right: 8%; top: 50%; height: 4px; background: rgba(50,184,198,.86); box-shadow: 0 0 10px rgba(50,184,198,.8); transform: rotate(-5deg); } -.route-node { position: absolute; width: clamp(34px, 4.5vw, 66px); aspect-ratio: 1; display: grid; place-items: center; color: #fff; font-size: clamp(10px, 1vw, 15px); font-weight: 900; background: var(--ink-800); border: 3px solid var(--aether); border-radius: 50%; box-shadow: 0 4px 16px rgba(0,0,0,.35); } -.route-node:nth-child(2) { left: 8%; top: 47%; } -.route-node:nth-child(3) { left: 32%; top: 31%; border-color: var(--gold); } -.route-node:nth-child(4) { left: 57%; top: 47%; border-color: var(--coral); } -.route-node:nth-child(5) { right: 7%; top: 22%; border-color: var(--secured); } -.battle-telegraph { position: absolute; right: 23%; top: 37%; width: 25%; height: 20%; border: 3px solid var(--coral); clip-path: polygon(8% 0,100% 28%,90% 100%,0 78%); background: rgba(217,92,85,.16); } -.battle-telegraph::after { content: "3.2s · CENTER"; position: absolute; right: 8%; top: 12%; padding: 4px 7px; color: #fff; font-size: clamp(8px, .8vw, 12px); font-weight: 900; background: var(--coral); } -.directive-dock { position: absolute; left: 36%; right: 36%; bottom: 3%; height: 12%; display: grid; grid-template-columns: 1fr 1fr; gap: 8px; } -.directive { display: grid; place-items: center; font-size: clamp(9px, .85vw, 13px); font-weight: 900; background: rgba(34,67,114,.94) !important; border: 2px solid #71a9ef !important; } -.directive.is-locked { opacity: .55; background: rgba(43,51,59,.9) !important; border-color: #777 !important; } -.cache-strap { position: absolute; top: 15%; right: 1.5%; bottom: 18%; width: 7%; display: flex; flex-direction: column; justify-content: space-between; align-items: center; padding: 8px 4px; background: rgba(51,32,22,.83); border: 1px solid rgba(255,206,154,.42); } -.cache-strap b { color: #ffd0a4; font-size: clamp(8px,.75vw,11px); writing-mode: vertical-rl; } -.cache-strap strong { color: #fff; font-size: clamp(11px,1vw,15px); } -.formation-board { position: absolute; inset: 18% 27% 17% 22%; display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: repeat(2,1fr); gap: 4%; transform: skewY(-2deg); } -.formation-slot { position: relative; display: grid; place-items: center; color: #fff; font-size: clamp(8px,.85vw,13px); font-weight: 800; background: rgba(43,51,59,.78); border: 2px solid rgba(50,184,198,.75); } -.formation-slot.is-filled { background: rgba(40,122,90,.82); border-color: #7cccae; } -.formation-slot.is-risk { background: rgba(151,58,52,.82); border-color: #ff9892; } -.settings-stage { position: absolute; inset: 10% 5% 7%; display: grid; grid-template-columns: 26% 1fr; color: var(--ink-950); background: rgba(247,243,232,.96); border: 1px solid rgba(23,28,34,.28); } -.settings-nav { padding: 5%; background: var(--ink-800); color: #fff; } -.settings-nav strong { display: block; margin-bottom: 7%; font-size: clamp(10px,1vw,16px); } -.settings-nav span { display: block; padding: 5% 3%; font-size: clamp(8px,.8vw,13px); border-left: 3px solid transparent; } -.settings-nav span:first-of-type { border-left-color: var(--gold); background: rgba(255,255,255,.08); } -.settings-content { padding: 5%; overflow: hidden; } -.settings-content h3 { font-size: clamp(12px,1.4vw,22px); } -.setting-row { min-height: 15%; display: grid; grid-template-columns: 1fr 42%; align-items: center; gap: 5%; font-size: clamp(8px,.8vw,13px); border-bottom: 1px solid var(--line); } -.fake-slider { height: 6px; background: var(--paper-200); } -.fake-slider i { display: block; width: 65%; height: 100%; background: var(--command); } -.toggle { justify-self: end; width: 38px; height: 20px; padding: 2px; background: var(--jade); border-radius: 10px; } -.toggle::after { content: ""; display: block; width: 16px; height: 16px; margin-left: auto; background: #fff; border-radius: 50%; } -.records-stage { position: absolute; inset: 13% 5% 7%; display: grid; grid-template-columns: 48% 1fr; gap: 3%; } -.records-art { min-width: 0; overflow: hidden; background: rgba(247,243,232,.9); border: 1px solid rgba(23,28,34,.25); } -.records-art img { width: 100%; height: 100%; object-fit: contain; } -.records-list { padding: 5%; color: var(--ink-950); background: rgba(247,243,232,.96); } -.records-list strong { display: block; font-size: clamp(11px,1.3vw,20px); } -.records-list p { font-size: clamp(8px,.8vw,12px); } -.record-line { padding: 4% 0; font-size: clamp(8px,.75vw,12px); border-bottom: 1px solid var(--line); } -.stage-generic-panel { position: absolute; right: 4%; top: 17%; bottom: 16%; width: 32%; padding: 3%; background: rgba(23,28,34,.9); border-left: 4px solid var(--gold); } -.stage-generic-panel h3 { font-size: clamp(11px,1.3vw,20px); } -.stage-generic-panel p { color: #dce4e8; font-size: clamp(8px,.78vw,12px); } -.stage-list-row { padding: 5% 0; font-size: clamp(8px,.75vw,12px); border-bottom: 1px solid rgba(255,255,255,.15); } -.boot-stage { position: absolute; inset: 0; display: grid; place-content: center; justify-items: center; padding: 8%; text-align: center; background: radial-gradient(circle at 50% 44%, #2f4650 0, #182127 43%, #0e1418 100%); } -.boot-sigil { position: relative; width: clamp(72px, 9vw, 138px); aspect-ratio: 1; margin-bottom: 5%; border: 2px solid rgba(229,180,69,.5); transform: rotate(45deg); } -.boot-sigil span, .boot-sigil i { position: absolute; display: block; background: var(--gold); box-shadow: 0 0 20px rgba(229,180,69,.45); } -.boot-sigil span { left: 48%; top: 8%; width: 4%; height: 84%; } -.boot-sigil i { left: 8%; top: 48%; width: 84%; height: 4%; } -.boot-title small { color: #b8c5cc; font-size: clamp(8px,.8vw,12px); font-weight: 800; letter-spacing: .12em; } -.boot-title strong { display: block; margin-top: 4px; font-size: clamp(23px,3vw,48px); } -.boot-title p { margin: 7px 0 0; color: #d8e0e3; font-size: clamp(9px,.9vw,14px); } -.boot-progress { width: min(48%, 420px); height: 5px; margin-top: 6%; overflow: hidden; background: rgba(255,255,255,.16); } -.boot-progress i { display: block; width: 68%; height: 100%; background: var(--gold); } -.boot-status { margin: 10px 0 0; color: #fff; font-size: clamp(9px,.8vw,13px); } -.boot-auto { margin-top: 5px; color: #8f9ba2; font-size: clamp(8px,.7vw,11px); } -.prototype-missing { position: absolute; inset: 0; display: grid; align-content: center; padding: 10% 12%; color: var(--ink-950); background: repeating-linear-gradient(-45deg, #f4efe3, #f4efe3 12px, #ede5d5 12px, #ede5d5 24px); } -.prototype-missing > span { margin-bottom: 12px; color: #a54640; font-size: clamp(8px,.75vw,12px); font-weight: 900; } -.prototype-missing > strong { max-width: 720px; font-size: clamp(20px,2.7vw,42px); line-height: 1.15; } -.prototype-missing > p { max-width: 680px; margin: 10px 0 22px; font-size: clamp(10px,.9vw,14px); } -.prototype-missing dl { width: min(100%, 760px); margin: 0; display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); gap: 1px; background: var(--line); border: 1px solid var(--line); } -.prototype-missing dl div { padding: 14px; background: rgba(255,254,249,.92); } -.prototype-missing dt { margin-bottom: 6px; color: var(--copper); font-size: clamp(8px,.7vw,10px); font-weight: 900; } -.prototype-missing dd { margin: 0; color: var(--ink-650); font-size: clamp(9px,.8vw,12px); line-height: 1.45; } -.screen-meta { margin-top: 24px; padding: 0 2px; } -.screen-meta-head { display: flex; justify-content: space-between; gap: 16px; align-items: start; } -.screen-id { color: var(--copper); font-weight: 900; } -.screen-meta h2 { margin: 4px 0 8px; } -.spec-grid { display: grid; grid-template-columns: repeat(3,minmax(0,1fr)); gap: 1px; margin-top: 18px; background: var(--line); border: 1px solid var(--line); } -.spec-cell { min-height: 125px; padding: 16px; background: var(--white); } -.spec-cell span { display: block; margin-bottom: 8px; color: var(--copper); font-size: 10px; font-weight: 900; text-transform: uppercase; } -.spec-cell p { margin: 0; font-size: 13px; line-height: 1.55; } -.pager { display: flex; gap: 8px; } -.pager button, .text-button, .flow-action { min-height: 42px; padding: 8px 13px; color: var(--ink-950); background: var(--white); border: 1px solid var(--line); border-radius: 4px; } -.pager button:hover, .text-button:hover { background: #efe5ca; } -.chapter-tabs { display: grid; grid-template-columns: repeat(8,minmax(0,1fr)); gap: 1px; margin-bottom: 22px; border: 1px solid var(--line); background: var(--line); } -.chapter-tabs button { min-height: 48px; color: var(--ink-650); background: var(--white); border: 0; } -.chapter-tabs button.is-active { color: #fff; background: var(--ink-800); } -.chapter-layout { display: grid; grid-template-columns: minmax(0, 1.4fr) minmax(280px, .6fr); gap: 26px; align-items: start; } -.chapter-art { aspect-ratio: 16/9; background: #c9c4b8; border: 1px solid var(--line); box-shadow: var(--shadow); } -.chapter-art img { width: 100%; height: 100%; object-fit: contain; } -.chapter-copy { padding: 22px; background: var(--white); border-left: 5px solid var(--aether); } -.chapter-copy p { font-size: 13px; } -.chapter-states { display: grid; grid-template-columns: repeat(3,minmax(0,1fr)); gap: 10px; margin-top: 18px; } -.chapter-state { padding: 13px; min-height: 105px; background: var(--white); border: 1px solid var(--line); } -.chapter-state b { display: block; margin-bottom: 6px; color: var(--copper); font-size: 11px; } -.chapter-state span { color: var(--ink-650); font-size: 12px; line-height: 1.45; } -.catalog-layout { display: grid; grid-template-columns: minmax(280px,.7fr) minmax(0,1.3fr); gap: 26px; align-items: start; } -.catalog-visual { position: sticky; top: calc(var(--topbar) + 20px); background: var(--white); border: 1px solid var(--line); } -.catalog-visual img { width: 100%; aspect-ratio: 1; object-fit: contain; } -.catalog-visual-copy { padding: 16px; border-top: 1px solid var(--line); } -.catalog-visual-copy p { margin: 0; font-size: 12px; } -.catalog-list { min-width: 0; display: grid; gap: 8px; } -.catalog-entry { display: grid; grid-template-columns: minmax(160px,.35fr) minmax(0,1fr); gap: 18px; padding: 16px; background: var(--white); border: 1px solid var(--line); border-left: 4px solid var(--paper-200); } -.catalog-entry:hover { border-left-color: var(--gold); } -.catalog-entry strong { display: block; margin-bottom: 4px; font-size: 13px; } -.catalog-entry small { color: var(--copper); font-weight: 800; } -.catalog-entry p { margin: 0; font-size: 12px; line-height: 1.5; } -.empty-state, .loading-state { padding: 46px; text-align: center; color: var(--ink-650); background: var(--white); border: 1px solid var(--line); } -.flow-shell { display: grid; grid-template-columns: minmax(0,1fr) 260px; gap: 24px; align-items: start; } -.flow-steps { display: grid; gap: 6px; } -.flow-steps button { min-height: 48px; display: grid; grid-template-columns: 26px 70px 1fr; align-items: center; gap: 8px; padding: 8px 10px; text-align: left; color: var(--ink-650); background: var(--white); border: 1px solid var(--line); border-left: 4px solid transparent; } -.flow-steps button.is-active { color: var(--ink-950); border-left-color: var(--gold); background: #f1ead8; } -.flow-steps button span { color: var(--copper); font-size: 11px; font-weight: 900; } -.flow-steps button b { overflow: hidden; font-size: 12px; text-overflow: ellipsis; white-space: nowrap; } -.flow-controls { display: flex; gap: 8px; margin-top: 16px; justify-content: flex-end; } -.flow-action { color: var(--ink-950); font-weight: 800; background: var(--gold); border-color: #c29428; } -.readiness-table { width: 100%; border-collapse: collapse; background: var(--white); } -.readiness-table th, .readiness-table td { padding: 13px 14px; text-align: left; vertical-align: top; border: 1px solid var(--line); font-size: 12px; line-height: 1.5; } -.readiness-table th { color: #fff; background: var(--ink-800); } -.state-open { color: #a54640; font-weight: 900; } -.state-ready { color: var(--secured); font-weight: 900; } -.stage-dialog { width: min(96vw, 1680px); max-width: none; padding: 54px 12px 12px; color: #fff; background: #090d10; border: 1px solid #4c5962; } -.stage-dialog::backdrop { background: rgba(5,8,10,.88); } -.dialog-close { position: absolute; right: 10px; top: 8px; width: 38px; height: 38px; color: #fff; font-size: 24px; background: transparent; border: 1px solid #64727b; border-radius: 4px; } -.stage-dialog .game-stage { width: min(100%, calc((100vh - 90px) * 16 / 9)); margin: auto; } -.nav-scrim { position: fixed; inset: 0; z-index: 35; background: rgba(10,14,17,.66); } -@media (max-width: 1100px) { - :root { --sidebar: 232px; } - .metric-row { grid-template-columns: repeat(2,minmax(0,1fr)); } - .thesis-grid, .production-grid { grid-template-columns: 1fr; } - .screen-layout { grid-template-columns: 220px minmax(0,1fr); } - .chapter-layout, .catalog-layout { grid-template-columns: 1fr; } - .catalog-visual { position: static; display: grid; grid-template-columns: minmax(220px,.6fr) 1fr; } - .catalog-visual img { max-height: 420px; } - .flow-shell { grid-template-columns: 1fr; } - .flow-steps { grid-template-columns: repeat(3,minmax(0,1fr)); } - .flow-steps button { grid-template-columns: 24px 1fr; } - .flow-steps button b { display: none; } +main { min-width: 0; padding: 24px; } +.view { width: min(100%, 1500px); margin: 0 auto; } +.view-heading { min-height: 78px; display: flex; align-items: start; justify-content: space-between; gap: 24px; margin-bottom: 18px; } +.view-heading h1 { margin: 4px 0 5px; font-size: 28px; line-height: 1.18; } +.view-heading p { max-width: 760px; margin: 0; color: var(--ink-700); font-size: 13px; line-height: 1.5; } +.eyebrow, .stage-kicker { display: block; color: var(--route-teal); font-size: 10px; font-weight: 900; text-transform: uppercase; } +.heading-badges { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 6px; } +.heading-badges span { padding: 6px 8px; color: var(--ink-700); font-size: 10px; font-weight: 800; background: var(--white); border: 1px solid var(--line); border-radius: 3px; } +.loading-state, .empty-state { padding: 48px; text-align: center; background: var(--white); border: 1px solid var(--line); } + +.stage-wrap { width: min(100%, 1240px); margin: 0 auto; background: #0c1519; box-shadow: var(--shadow); } +.game-stage { position: relative; width: 100%; aspect-ratio: 16 / 9; overflow: hidden; color: var(--mist-050); background: #23353b; container-name: stage; container-type: inline-size; isolation: isolate; } +.stage-art { position: absolute; inset: 0; z-index: -3; width: 100%; height: 100%; object-fit: cover; } +.stage-wash { position: absolute; inset: 0; z-index: -2; background: linear-gradient(90deg, rgba(9,20,24,.84) 0%, rgba(18,34,38,.42) 46%, rgba(8,16,20,.76) 100%); } +.stage-body { position: absolute; inset: 48px 0 0; } +.game-hud { position: absolute; z-index: 7; inset: 0 0 auto; height: 48px; display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 6px 10px; background: rgba(18,33,38,.92); border-bottom: 1px solid rgba(255,255,255,.22); } +.hud-left, .hud-right { display: flex; align-items: center; gap: 8px; min-width: 0; } +.hud-left strong { overflow: hidden; font-size: 11px; text-overflow: ellipsis; white-space: nowrap; } +.stage-icon { width: 30px; height: 30px; display: inline-grid; flex: 0 0 auto; place-items: center; color: inherit; font-size: 13px; font-weight: 900; background: rgba(243,246,242,.11); border: 1px solid rgba(255,255,255,.34); border-radius: 3px; } +.stage-icon:hover { background: rgba(243,246,242,.2); } +.screen-stamp { padding: 4px 6px; color: #1c2c32; font-size: 9px; font-weight: 900; background: var(--work-gold); border-radius: 2px; } +.resource, .save-state { font-size: 9px; white-space: nowrap; } +.resource { padding: 4px 6px; background: rgba(255,255,255,.1); border: 1px solid rgba(255,255,255,.18); border-radius: 2px; } +.save-state { color: #a9e0c3; } +.concept-label { position: absolute; z-index: 8; left: 8px; bottom: 7px; padding: 3px 5px; color: #2c363a; font-size: 8px; font-weight: 800; background: rgba(255,255,255,.88); border-left: 3px solid var(--work-gold); } +.action-dock { position: absolute; z-index: 6; right: 12px; bottom: 10px; display: flex; align-items: center; gap: 7px; } +.stage-primary, .stage-secondary { min-height: 34px; padding: 7px 12px; font-size: 10px; font-weight: 900; border-radius: 3px; } +.stage-primary { color: var(--ink-950); background: var(--work-gold); border: 1px solid #f1d067; box-shadow: inset 0 -3px rgba(117,76,0,.28); } +.stage-secondary { color: var(--mist-050); background: rgba(24,33,39,.88); border: 1px solid rgba(255,255,255,.36); } +.sheet-row { min-height: 30px; display: flex; align-items: center; padding: 6px 8px; color: var(--ink-950); font-size: 10px; background: var(--mist-050); border-bottom: 1px solid var(--line); } + +/* Opening company */ +.opening-composition, .creation-review, .contract-composition { height: 100%; padding: 2.2% 3.5% 5%; } +.opening-title { max-width: 54%; } +.opening-title h2, .contract-sheet h3, .creation-review h2 { margin: 3px 0; font-size: 20px; line-height: 1.15; } +.opening-title p { margin: 0; color: #d3e0e1; font-size: 10px; } +.offer-grid { height: 58%; display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; margin-top: 10px; } +.recruit-offer { min-width: 0; display: grid; grid-template-rows: minmax(0, .9fr) auto auto; color: var(--ink-950); background: rgba(243,246,242,.94); border: 2px solid transparent; border-radius: 5px; overflow: hidden; } +.recruit-offer.is-selected { border-color: var(--work-gold); box-shadow: inset 0 0 0 2px var(--ink-950); } +.offer-figure { min-height: 0; display: grid; place-items: center; position: relative; background: linear-gradient(150deg, #cfe5df, #7eb5b2); } +.offer-figure > span { width: 48px; height: 60px; display: grid; place-items: center; color: var(--white); font-size: 14px; font-weight: 900; background: var(--ink-840); border: 4px solid #60757a; border-radius: 45% 45% 18% 18%; } +.offer-figure small { position: absolute; left: 6px; bottom: 4px; font-size: 8px; font-weight: 900; } +.offer-copy { min-width: 0; padding: 5px 7px; } +.offer-copy strong { display: block; overflow-wrap: anywhere; font-size: 11px; } +.profession-seal { display: inline-block; margin-top: 2px; padding: 2px 4px; color: var(--white); font-size: 8px; font-weight: 800; background: var(--route-teal); border-radius: 2px; } +.offer-copy p { margin: 3px 0 0; color: var(--ink-700); font-size: 8px; line-height: 1.25; } +.offer-actions { min-height: 29px; display: grid; grid-template-columns: 1fr auto auto; align-items: center; gap: 3px; padding: 4px 5px; border-top: 1px solid var(--line); } +.offer-actions > span { font-size: 7px; font-weight: 800; } +.offer-actions > button:not(.stage-icon) { min-height: 23px; padding: 3px 5px; color: var(--ink-950); font-size: 8px; font-weight: 900; background: var(--white); border: 1px solid var(--line-strong); border-radius: 2px; } +.offer-actions .stage-icon { width: 23px; height: 23px; color: var(--ink-950); background: var(--mist-120); border-color: var(--line); } +.opening-footer { min-height: 41px; display: flex; align-items: center; justify-content: flex-end; gap: 7px; margin-top: 8px; } +.selection-count { margin-right: auto; display: flex; align-items: center; gap: 8px; } +.selection-count span { font-size: 9px; font-weight: 800; } +.selection-count strong { min-width: 46px; padding: 6px 8px; color: var(--ink-950); font-size: 14px; text-align: center; background: var(--work-gold); border-radius: 3px; } +.contract-composition { display: grid; grid-template-columns: 1.15fr .85fr; align-items: center; gap: 5%; } +.region-signal { align-self: end; padding-bottom: 10%; } +.region-signal span { display: inline-block; padding: 4px 6px; color: var(--ink-950); font-size: 9px; font-weight: 900; background: var(--work-gold); } +.region-signal h2 { margin: 5px 0; font-size: 27px; } +.region-signal p { max-width: 390px; margin: 0; font-size: 11px; } +.contract-sheet, .creation-review, .battle-sheet, .outcome-sheet { color: var(--ink-950); background: rgba(243,246,242,.96); border-left: 5px solid var(--route-teal); box-shadow: var(--shadow); } +.contract-sheet { padding: 16px; } +.contract-sheet dl { margin: 9px 0; } +.contract-sheet dl > div { display: grid; grid-template-columns: .8fr 1.2fr; gap: 8px; padding: 5px 0; font-size: 9px; border-bottom: 1px solid var(--line); } +.contract-sheet dt { color: var(--ink-700); } +.contract-sheet dd { margin: 0; font-weight: 800; } +.creation-review { width: 76%; min-height: 76%; margin: 0 auto; padding: 14px 18px; } +.chosen-pair { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; margin: 8px 0; } +.recruit-marker { min-width: 0; display: flex; align-items: center; gap: 7px; padding: 6px; color: var(--ink-950); background: var(--mist-120); border: 1px solid var(--line); border-radius: 4px; } +.recruit-marker.is-selected { border-color: var(--work-gold); } +.recruit-silhouette, .large-figure { width: 38px; height: 45px; display: grid; flex: 0 0 auto; place-items: center; color: var(--white); font-size: 10px; font-weight: 900; background: var(--ink-840); border: 3px solid var(--route-teal); border-radius: 45% 45% 18% 18%; } +.recruit-marker small, .recruit-marker strong, .recruit-marker em { display: block; } +.recruit-marker small { font-size: 7px; } +.recruit-marker strong { font-size: 10px; } +.recruit-marker em { color: var(--ink-700); font-size: 8px; font-style: normal; } +.unchosen-strip { display: grid; grid-template-columns: repeat(2, 1fr); gap: 5px; } +.unchosen-strip span { display: grid; grid-template-columns: auto 1fr auto; gap: 4px; padding: 4px 6px; color: var(--ink-700); font-size: 8px; border: 1px dashed var(--neutral-silver); } +.unchosen-strip em { font-style: normal; font-weight: 900; } +.creation-ledger, .operation-state, .receipt-state { margin-top: 8px; padding: 7px 9px; background: var(--white); border: 1px solid var(--line); } +.creation-ledger { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: 8px; } +.operation-state, .receipt-state { display: grid; grid-template-columns: auto 1fr; gap: 2px 8px; align-items: center; } +.operation-state strong, .receipt-state strong { font-size: 11px; } +.operation-state small, .receipt-state small { grid-column: 2; font-size: 8px; } +.operation-spinner { width: 18px; height: 18px; grid-row: 1 / 3; border: 3px solid var(--mist-180); border-top-color: var(--route-teal); border-radius: 50%; animation: spin .9s linear infinite; } +.receipt-state b { grid-row: 1 / 3; padding: 8px; color: var(--white); font-size: 9px; background: var(--safe-jade); } +.receipt-state strong i { color: var(--neutral-silver); font-style: normal; } +.review-actions { display: flex; justify-content: flex-end; gap: 7px; margin-top: 8px; } + +/* Market and roster */ +.market-composition, .market-review, .item-review, .roster-composition, .dismissal-review { height: 100%; position: relative; padding: 2.4% 3.2% 5.2%; } +.market-heading { display: flex; justify-content: space-between; align-items: end; gap: 12px; } +.market-heading h2 { margin: 3px 0 0; font-size: 19px; } +.company-meter { display: flex; align-items: baseline; gap: 5px; padding: 6px 9px; background: rgba(24,33,39,.88); border: 1px solid rgba(255,255,255,.3); } +.company-meter span { font-size: 8px; } +.company-meter strong { color: var(--work-gold); font-size: 16px; } +.company-meter i { color: var(--neutral-silver); } +.market-tabs { height: 29px; display: flex; gap: 1px; margin-top: 8px; } +.market-tabs button { padding: 5px 11px; color: #dce6e5; font-size: 8px; font-weight: 800; background: rgba(24,33,39,.84); border: 0; border-bottom: 3px solid transparent; } +.market-tabs button.is-active { color: var(--white); border-bottom-color: var(--work-gold); } +.market-surface { height: 61%; display: grid; grid-template-columns: 1.2fr .8fr; gap: 8px; } +.market-list { min-height: 0; display: grid; gap: 3px; padding: 7px; background: rgba(232,238,235,.94); } +.market-row { min-height: 0; display: grid; grid-template-columns: 34px 1fr auto; align-items: center; gap: 7px; padding: 5px 7px; color: var(--ink-950); text-align: left; background: var(--white); border: 1px solid var(--line); border-left: 4px solid transparent; } +.market-row.is-focused { border-left-color: var(--work-gold); box-shadow: inset 0 0 0 1px var(--ink-950); } +.row-avatar { width: 31px; height: 35px; display: grid; place-items: center; color: var(--white); font-size: 9px; font-weight: 900; background: var(--ink-840); border-radius: 40% 40% 15% 15%; } +.market-row small, .market-row strong, .market-row em { display: block; } +.market-row small { color: var(--route-teal); font-size: 7px; } +.market-row strong { font-size: 9px; } +.market-row em { color: var(--ink-700); font-size: 7px; font-style: normal; } +.market-row > b { font-size: 13px; } +.market-inspect { padding: 10px; color: var(--ink-950); background: rgba(255,255,255,.95); border-top: 4px solid var(--work-gold); } +.market-inspect h3 { margin: 3px 0; font-size: 15px; } +.market-inspect p { margin: 4px 0; font-size: 8px; line-height: 1.35; } +.fit-read { display: flex; justify-content: space-between; padding: 4px 0; font-size: 8px; border-bottom: 1px solid var(--line); } +.market-inspect .stage-primary { width: 100%; margin-top: 8px; } +.market-footer { display: flex; align-items: center; justify-content: flex-end; gap: 8px; margin-top: 5px; font-size: 8px; } +.market-footer span { margin-right: auto; } +.market-review { display: grid; grid-template-columns: .72fr 1.3fr .8fr; gap: 10px; align-items: stretch; } +.review-figure, .review-facts, .party-impact { min-width: 0; padding: 11px; color: var(--ink-950); background: rgba(243,246,242,.95); } +.review-figure { display: grid; place-items: center; position: relative; } +.review-figure .recruit-marker { width: 100%; } +.trait-glyph { position: absolute; right: 12px; top: 12px; color: var(--route-teal); font-size: 22px; } +.review-facts h2 { margin: 3px 0; font-size: 21px; } +.review-facts h3 { margin: 0 0 7px; color: var(--route-teal); font-size: 11px; } +.review-facts p { font-size: 9px; line-height: 1.4; } +.stat-radar { display: grid; grid-template-columns: repeat(4, 1fr); gap: 3px; } +.stat-radar span { padding: 5px; font-size: 7px; background: var(--mist-120); } +.stat-radar b { display: block; margin-top: 2px; font-size: 12px; } +.party-impact { border-left: 4px solid var(--work-gold); } +.party-impact > span, .party-impact > strong, .party-impact > small { display: block; } +.party-impact > span { font-size: 8px; font-weight: 900; } +.party-impact > strong { margin: 7px 0; color: var(--safe-jade); font-size: 16px; } +.party-impact p, .party-impact small { font-size: 8px; line-height: 1.35; } +.item-review { display: grid; grid-template-columns: .55fr 1.2fr .8fr; gap: 10px; color: var(--ink-950); } +.item-review > div, .item-review > aside { padding: 14px; background: rgba(243,246,242,.96); } +.item-object { display: grid; place-items: center; color: var(--route-teal); font-size: 64px; } +.item-object small { display: block; color: var(--ink-700); font-size: 9px; } +.item-review h2 { margin: 4px 0; font-size: 19px; } +.item-review p, .item-review aside { font-size: 9px; line-height: 1.4; } +.item-review aside b, .item-review aside span { display: block; margin-bottom: 5px; } +.delta-row { display: flex; justify-content: space-between; gap: 8px; padding: 6px; font-size: 8px; background: #e4f2ec; border-left: 3px solid var(--safe-jade); } +.delta-row + .delta-row { margin-top: 4px; } +.delta-row.danger { background: #f7e7e5; border-left-color: var(--danger-coral); } +.roster-composition { display: grid; grid-template-columns: 1.15fr .85fr; gap: 9px; } +.roster-list, .recruit-detail { color: var(--ink-950); background: rgba(243,246,242,.95); } +.roster-list { padding: 8px; } +.roster-row { width: 100%; min-height: 44px; display: grid; grid-template-columns: 1fr auto; align-items: center; color: var(--ink-950); background: var(--white); border: 1px solid var(--line); } +.roster-row + .roster-row { margin-top: 3px; } +.roster-row.is-focused { box-shadow: inset 4px 0 var(--work-gold); } +.roster-row .recruit-marker { border: 0; background: transparent; } +.roster-row > span { padding-right: 8px; font-size: 8px; } +.recruit-detail { padding: 13px; border-left: 5px solid var(--route-teal); } +.recruit-detail .large-figure { width: 58px; height: 72px; } +.recruit-detail h2 { margin: 5px 0; font-size: 18px; } +.recruit-detail p { margin: 0 0 7px; font-size: 9px; } +.detail-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 4px; } +.detail-grid span { padding: 5px; font-size: 7px; background: var(--mist-120); } +.detail-grid b { display: block; margin-top: 2px; font-size: 9px; } +.recruit-detail > button { margin: 8px 4px 0 0; } +.dismissal-review { display: grid; grid-template-columns: .7fr 1.3fr; gap: 10px; } +.dismissal-review > div { padding: 15px; color: var(--ink-950); background: rgba(243,246,242,.96); } +.dismissal-review h2 { margin: 4px 0 9px; font-size: 20px; } +.dismissal-review p { font-size: 9px; } + +/* Equipment, party and artifacts */ +.equipment-composition { height: 100%; display: grid; grid-template-columns: .9fr .62fr 1fr; gap: 8px; padding: 2.5% 3.2% 5%; color: var(--ink-950); } +.equipment-list, .equipment-wearer, .equipment-delta { min-width: 0; padding: 9px; background: rgba(243,246,242,.95); } +.equipment-list { display: grid; align-content: start; gap: 3px; } +.equipment-row { min-height: 43px; display: flex; align-items: center; gap: 8px; color: var(--ink-950); text-align: left; background: var(--white); border: 1px solid var(--line); } +.equipment-row.is-focused { border-left: 4px solid var(--work-gold); } +.equipment-row > span { width: 36px; font-size: 20px; text-align: center; } +.equipment-row strong, .equipment-row small { display: block; } +.equipment-row strong { font-size: 8px; } +.equipment-row small { font-size: 7px; } +.equipment-wearer { display: grid; place-items: center; align-content: center; text-align: center; } +.equipment-wearer .large-figure { width: 68px; height: 86px; font-size: 16px; } +.equipment-wearer strong { margin-top: 5px; font-size: 12px; } +.equipment-wearer small { font-size: 8px; } +.equipped-slot { margin-top: 8px; padding: 5px; font-size: 7px; background: var(--mist-120); } +.equipment-delta { border-top: 4px solid var(--safe-jade); } +.equipment-delta h2 { margin: 4px 0 8px; font-size: 14px; } +.equipment-delta p { font-size: 8px; line-height: 1.35; } +.equipment-delta .stage-primary { width: 100%; } +.party-composition { height: 100%; position: relative; padding: 2.5% 3.2% 5%; } +.party-title h2 { margin: 3px 0; font-size: 19px; } +.party-title h2 i { color: var(--work-gold); font-style: normal; } +.party-title p { margin: 0; font-size: 9px; } +.relation-layer { position: absolute; left: 16%; right: 23%; top: 27%; height: 32px; } +.relation { position: absolute; padding: 3px 6px; font-size: 7px; font-weight: 900; background: var(--mist-050); border-radius: 2px; } +.relation.protection { left: 40%; color: var(--route-teal); border-bottom: 3px solid var(--route-teal); } +.relation.reach { left: 5%; top: 20px; color: var(--uncertain-cobalt); border-bottom: 3px dashed var(--uncertain-cobalt); } +.party-cord { position: absolute; left: 6%; right: 6%; top: 40%; height: 105px; display: flex; align-items: center; justify-content: center; gap: 12px; } +.party-cord::before { content: ""; position: absolute; left: 7%; right: 7%; top: 61px; height: 3px; background: #d7e0dd; border: 1px solid var(--ink-950); } +.party-actor { position: relative; z-index: 2; min-width: 74px; height: 93px; display: grid; grid-template-columns: 1fr auto; grid-template-rows: 1fr auto auto; align-items: end; padding: 4px; color: var(--ink-950); background: rgba(243,246,242,.94); border: 2px solid var(--route-teal); border-radius: 4px; } +.party-actor.is-front { border-color: var(--danger-coral); } +.actor-figure { grid-column: 1 / 3; justify-self: center; align-self: center; width: 38px; height: 46px; display: grid; place-items: center; color: var(--white); font-size: 9px; font-weight: 900; background: var(--ink-840); border: 3px solid #739196; border-radius: 46% 46% 16% 16%; } +.party-actor > b { width: 20px; height: 20px; display: grid; place-items: center; color: var(--white); font-size: 9px; background: var(--ink-950); border-radius: 2px; } +.party-actor > strong { justify-self: end; font-size: 8px; } +.party-actor > em { grid-column: 1 / 3; color: var(--ink-700); font-size: 7px; font-style: normal; } +.cord-label { z-index: 2; width: 62px; font-size: 8px; font-weight: 900; text-align: center; } +.cord-label.rear { color: #b7e6e0; } +.cord-label.front { color: #ffc1bc; } +.party-read { position: absolute; right: 3.2%; top: 20%; width: 24%; display: grid; gap: 3px; padding: 8px; color: var(--ink-950); background: rgba(243,246,242,.96); border-left: 4px solid var(--work-gold); } +.party-read strong { font-size: 9px; } +.party-read span { font-size: 7px; } +.party-tools { position: absolute; right: 3.2%; bottom: 8%; display: flex; gap: 6px; } +.artifact-composition { height: 100%; display: grid; grid-template-columns: 1.25fr .75fr; grid-template-rows: auto 1fr; gap: 8px; padding: 2.5% 3.2% 5%; color: var(--ink-950); } +.artifact-heading { grid-column: 1 / 3; color: var(--mist-050); } +.artifact-heading h2 { margin: 3px 0; font-size: 19px; } +.artifact-ledger, .artifact-inspect { padding: 9px; background: rgba(243,246,242,.96); } +.artifact-row { width: 100%; min-height: 52px; display: grid; grid-template-columns: 42px 1fr auto; gap: 7px; align-items: center; color: var(--ink-950); text-align: left; background: var(--white); border: 1px solid var(--line); } +.artifact-row + .artifact-row { margin-top: 4px; } +.artifact-row.is-focused { border-left: 4px solid var(--work-gold); } +.artifact-emblem { font-size: 24px; text-align: center; } +.artifact-row small, .artifact-row strong, .artifact-row p { display: block; margin: 0; } +.artifact-row small { color: var(--route-teal); font-size: 7px; } +.artifact-row strong { font-size: 9px; } +.artifact-row p { font-size: 7px; } +.artifact-row em { font-size: 8px; font-style: normal; } +.artifact-inspect { border-top: 4px solid var(--route-teal); } +.artifact-inspect h3 { margin: 3px 0; font-size: 15px; } +.artifact-inspect p, .artifact-inspect span, .artifact-inspect small, .artifact-inspect b { display: block; margin: 5px 0; font-size: 8px; line-height: 1.4; } + +/* Risk and battle */ +.risk-board, .risk-review { height: 100%; padding: 2.5% 3.2% 5%; } +.risk-heading h2 { margin: 3px 0; font-size: 19px; } +.risk-options { height: 58%; display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin-top: 8px; } +.risk-option { min-width: 0; display: grid; align-content: start; gap: 4px; padding: 10px; color: var(--ink-950); text-align: left; background: rgba(243,246,242,.94); border: 2px solid transparent; border-radius: 4px; } +.risk-option.is-selected { border-color: var(--work-gold); } +.risk-option > span { width: 25px; height: 25px; display: grid; place-items: center; color: var(--white); font-size: 9px; background: var(--ink-840); } +.risk-option strong { font-size: 11px; } +.risk-option small, .risk-option em, .risk-option b { font-size: 8px; } +.risk-option div { margin-top: auto; display: flex; justify-content: space-between; gap: 5px; padding-top: 5px; border-top: 1px solid var(--line); } +.risk-option em { color: var(--safe-jade); font-style: normal; } +.risk-compare { min-height: 39px; display: flex; align-items: center; gap: 10px; margin-top: 7px; padding: 5px 7px; color: var(--ink-950); font-size: 8px; background: rgba(243,246,242,.94); } +.risk-compare span { font-weight: 900; } +.risk-compare .stage-primary { margin-left: auto; } +.risk-review { width: 82%; margin: 0 auto; color: var(--ink-950); background: rgba(243,246,242,.96); border-left: 5px solid var(--danger-coral); } +.risk-review h2 { margin: 4px 0; font-size: 21px; } +.threat-band { display: grid; grid-template-columns: repeat(4, 1fr); gap: 4px; } +.threat-band span { padding: 6px; font-size: 7px; background: var(--mist-120); } +.threat-band b { display: block; margin-top: 3px; font-size: 9px; } +.mini-party-line { display: flex; justify-content: center; gap: 5px; margin: 7px 0; padding: 6px; background: var(--ink-840); } +.mini-party-line .party-actor { min-width: 48px; height: 61px; } +.mini-party-line .actor-figure { width: 24px; height: 29px; } +.mini-party-line .party-actor > em { display: none; } +.risk-review p { max-width: 70%; font-size: 8px; } +.battle-composition, .battle-static { height: 100%; position: relative; padding: 2% 2.8% 4.8%; } +.battle-objective { max-width: 50%; } +.battle-objective h2 { margin: 3px 0; font-size: 17px; } +.battle-objective p { margin: 0; font-size: 8px; } +.playback-tools { position: absolute; right: 2.8%; top: 2%; display: flex; gap: 5px; } +.speed-control { display: flex; background: rgba(24,33,39,.9); border: 1px solid rgba(255,255,255,.3); } +.speed-control button { min-width: 30px; color: #dce7e6; font-size: 8px; background: transparent; border: 0; border-right: 1px solid rgba(255,255,255,.2); } +.speed-control button.is-active { color: var(--ink-950); background: var(--work-gold); } +.battle-line { position: absolute; left: 2.8%; right: 2.8%; top: 25%; bottom: 17%; display: grid; grid-template-columns: 1.12fr .32fr .72fr; align-items: end; gap: 5px; } +.battle-line::after { content: ""; position: absolute; left: 0; right: 0; bottom: 22px; height: 4px; background: rgba(243,246,242,.84); border: 1px solid var(--ink-950); } +.allied-line { z-index: 2; display: flex; align-items: end; justify-content: flex-end; gap: 4px; } +.allied-line .party-actor { min-width: 52px; height: 76px; } +.allied-line .actor-figure { width: 30px; height: 38px; } +.allied-line .edge-label { width: 42px; color: #d4e9e7; font-size: 7px; font-weight: 900; text-align: center; } +.action-gap { z-index: 3; align-self: center; } +.forecast-arrow { display: block; padding: 5px; color: var(--white); font-size: 7px; font-weight: 900; text-align: center; background: var(--danger-coral); border: 2px solid #ffb8b3; clip-path: polygon(0 0, 90% 0, 100% 50%, 90% 100%, 0 100%); } +.enemy-line { z-index: 2; display: flex; align-items: end; gap: 5px; } +.enemy-actor { min-width: 48px; height: 64px; display: grid; place-items: center; align-content: center; color: var(--white); font-size: 11px; font-weight: 900; background: #713c3e; border: 3px solid #d27978; border-radius: 48% 48% 20% 20%; } +.enemy-actor.elite { min-width: 67px; height: 88px; background: #4c5263; border-color: #a7b4d2; } +.enemy-actor small { display: block; margin-top: 3px; font-size: 6px; font-weight: 700; text-align: center; } +.battle-event-log { position: absolute; left: 2.8%; bottom: 5%; display: flex; gap: 4px; max-width: 65%; } +.battle-event-log span, .battle-event-log b { padding: 4px 5px; font-size: 6px; background: rgba(24,33,39,.9); border: 1px solid rgba(255,255,255,.25); } +.battle-event-log b { border-color: var(--work-gold); } +.caption-line { position: absolute; right: 2.8%; bottom: 5%; max-width: 31%; padding: 5px; color: var(--ink-950); font-size: 7px; background: rgba(243,246,242,.94); } +.inspect-sheet { position: absolute; z-index: 5; right: 2.8%; top: 18%; bottom: 12%; width: 32%; padding: 10px; color: var(--ink-950); background: rgba(243,246,242,.97); border-left: 4px solid var(--uncertain-cobalt); } +.inspect-sheet h3 { margin: 4px 0; font-size: 13px; } +.inspect-sheet dl { margin: 5px 0; } +.inspect-sheet dl > div { display: grid; grid-template-columns: .7fr 1.3fr; gap: 5px; padding: 3px 0; font-size: 7px; border-bottom: 1px solid var(--line); } +.inspect-sheet dd { margin: 0; font-weight: 800; } +.inspect-sheet .stage-primary { width: 100%; } +.battle-static .battle-line { opacity: .52; } +.battle-sheet { position: absolute; z-index: 5; right: 3%; top: 7%; width: 36%; padding: 12px; } +.battle-sheet h2 { margin: 4px 0 8px; font-size: 16px; } +.battle-sheet .speed-control { min-height: 30px; margin-top: 7px; } +.battle-composition.is-paused .battle-line { opacity: .7; } + +/* Outcomes */ +.result-composition, .loss-composition, .reward-composition, .recovery-composition, .outcome-sheet { height: 100%; position: relative; padding: 2.5% 3.2% 5%; color: var(--ink-950); background: rgba(232,238,235,.95); } +.result-title { display: grid; grid-template-columns: 90px 1fr; gap: 11px; } +.outcome-seal { display: grid; place-items: center; color: var(--white); font-size: 13px; font-weight: 900; background: var(--safe-jade); border: 4px double #b7e4cd; } +.result-title h2 { margin: 3px 0; font-size: 18px; } +.result-title p { margin: 0; font-size: 8px; } +.causal-timeline { position: relative; margin-top: 9px; padding: 8px; background: var(--white); } +.expected-track, .actual-track { display: grid; grid-template-columns: 70px repeat(3, 1fr); gap: 4px; align-items: center; } +.actual-track { margin-top: 5px; } +.expected-track b, .actual-track b { font-size: 7px; } +.expected-track span, .actual-track span { min-height: 28px; display: grid; place-items: center; padding: 4px; font-size: 7px; text-align: center; background: var(--mist-120); border: 1px solid var(--line); } +.actual-track span.is-divergence { color: var(--white); background: var(--danger-coral); border-color: #8d2c30; } +.causal-timeline svg { position: absolute; inset: 8px 0; width: 100%; height: calc(100% - 16px); pointer-events: none; } +.causal-timeline path { fill: none; stroke: var(--danger-coral); stroke-width: 1.2; } +.result-effects { display: grid; grid-template-columns: repeat(3, 1fr); gap: 5px; margin-top: 7px; } +.result-effects span { padding: 6px; font-size: 7px; background: var(--white); } +.result-effects b { display: block; margin-bottom: 2px; color: var(--route-teal); } +.loss-composition { display: grid; grid-template-columns: .65fr 1.35fr; gap: 12px; } +.fallen-figure { display: grid; place-items: center; align-content: center; background: #dce1de; border: 1px solid var(--line); } +.fallen-figure span { width: 90px; height: 115px; display: grid; place-items: center; color: #bbc4c2; font-size: 24px; font-weight: 900; background: #4c595d; border: 5px solid #7d8a8d; border-radius: 45% 45% 16% 16%; filter: grayscale(1); } +.fallen-figure i { margin-top: 7px; color: var(--danger-coral); font-size: 10px; font-style: normal; font-weight: 900; } +.loss-record { padding: 12px; background: var(--white); border-left: 5px solid var(--danger-coral); } +.loss-record h2 { margin: 4px 0; font-size: 21px; } +.loss-record > p, .loss-record > small { font-size: 8px; } +.loss-row { display: flex; justify-content: space-between; padding: 6px; font-size: 8px; border-bottom: 1px solid var(--line); } +.reward-heading h2, .recovery-heading h2 { margin: 3px 0; font-size: 19px; } +.reward-options, .recovery-paths { height: 61%; display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin-top: 8px; } +.reward-option, .recovery-path { min-width: 0; display: grid; align-content: start; gap: 3px; padding: 9px; color: var(--ink-950); text-align: left; background: var(--white); border: 2px solid transparent; border-radius: 4px; } +.reward-option.is-selected, .recovery-path.is-selected { border-color: var(--work-gold); } +.reward-object { display: grid; place-items: center; height: 45px; color: var(--route-teal); font-size: 32px; } +.reward-option small, .reward-option strong, .reward-option p, .reward-option em, .recovery-path span, .recovery-path strong, .recovery-path small, .recovery-path p { margin: 0; } +.reward-option small, .recovery-path small { color: var(--route-teal); font-size: 7px; } +.reward-option strong, .recovery-path strong { font-size: 10px; } +.reward-option p, .recovery-path p { font-size: 7px; line-height: 1.35; } +.reward-option em { margin-top: auto; padding-top: 4px; font-size: 7px; font-style: normal; font-weight: 900; border-top: 1px solid var(--line); } +.recovery-heading p { max-width: 70%; margin: 0; font-size: 8px; } +.recovery-path > span { width: 23px; height: 23px; display: grid; place-items: center; color: var(--white); font-size: 8px; background: var(--ink-840); } +.outcome-sheet { width: 74%; height: auto; min-height: 70%; margin: 0 auto; border-left-color: var(--danger-coral); } +.outcome-sheet h2 { margin: 5px 0 8px; font-size: 20px; } +.outcome-sheet p { font-size: 9px; line-height: 1.4; } + +/* Guild, system, progress, settings */ +.guild-composition, .forecast-composition, .system-workspace, .progress-composition, .records-composition, .settings-composition, .generic-composition { height: 100%; position: relative; padding: 2.5% 3.2% 5%; } +.guild-pressure { max-width: 48%; } +.guild-pressure h2 { margin: 3px 0; font-size: 19px; } +.guild-pressure p { margin: 0; font-size: 9px; } +.guild-destinations { position: absolute; left: 3.2%; right: 3.2%; top: 27%; display: grid; grid-template-columns: repeat(5, 1fr); gap: 5px; } +.guild-destinations button { min-height: 52px; display: grid; padding: 8px; color: var(--ink-950); font-size: 9px; font-weight: 900; text-align: left; background: rgba(243,246,242,.94); border: 1px solid var(--line); border-bottom: 4px solid var(--route-teal); } +.guild-destinations button.is-primary { border-bottom-color: var(--work-gold); } +.guild-destinations b { margin-top: auto; font-size: 7px; } +.muster-strip { position: absolute; left: 12%; right: 12%; bottom: 11%; display: flex; justify-content: center; gap: 5px; } +.muster-strip .party-actor { min-width: 56px; height: 67px; } +.muster-strip .actor-figure { width: 27px; height: 31px; } +.receipt-strip { position: absolute; right: 3.2%; bottom: 4%; display: flex; gap: 7px; padding: 5px 7px; color: var(--ink-950); font-size: 7px; background: var(--mist-050); border-left: 4px solid var(--safe-jade); } +.forecast-horizon { display: flex; align-items: center; gap: 6px; color: var(--white); font-size: 8px; font-weight: 900; } +.forecast-horizon i { flex: 1; height: 2px; background: var(--work-gold); } +.forecast-sheets { height: 67%; display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin-top: 12px; } +.forecast-sheets article { padding: 11px; color: var(--ink-950); background: rgba(243,246,242,.95); border-top: 4px solid var(--route-teal); } +.forecast-sheets article.uncertain { border-top-style: dashed; border-top-color: var(--uncertain-cobalt); } +.forecast-sheets span, .forecast-sheets b { font-size: 7px; } +.forecast-sheets h3 { margin: 4px 0; font-size: 13px; } +.forecast-sheets p { font-size: 8px; line-height: 1.4; } +.title-composition { height: 100%; display: grid; grid-template-columns: 1.15fr .85fr; align-items: end; gap: 6%; padding: 4% 5% 8%; } +.title-brand span, .title-brand strong { display: block; } +.title-brand span { font-size: 17px; } +.title-brand strong { color: var(--work-gold); font-size: 46px; line-height: .95; } +.title-brand small { display: block; margin-top: 8px; font-size: 10px; } +.run-summary { display: grid; gap: 5px; padding: 13px; color: var(--ink-950); background: rgba(243,246,242,.95); border-left: 5px solid var(--work-gold); } +.run-summary b, .run-summary span { font-size: 8px; } +.run-summary strong { font-size: 12px; } +.title-tools { position: absolute; right: 3%; top: 3%; display: flex; gap: 5px; } +.boot-composition { height: 100%; display: grid; place-items: center; align-content: center; color: var(--mist-050); text-align: center; background: radial-gradient(circle at center, #395c62, #182127 65%); } +.boot-mark { position: relative; width: 72px; height: 72px; display: grid; place-items: center; margin-bottom: 6px; } +.boot-mark i { position: absolute; inset: 0; border: 3px solid var(--work-gold); transform: rotate(45deg); } +.boot-mark span { font-size: 22px; font-weight: 900; } +.boot-composition h2 { margin: 5px 0; font-size: 22px; } +.verification-track { width: 260px; height: 6px; margin: 8px 0; overflow: hidden; background: #617177; } +.verification-track i { display: block; height: 100%; background: var(--work-gold); } +.boot-composition strong, .boot-composition small { font-size: 8px; } +.system-workspace { display: grid; grid-template-columns: 1fr .55fr; grid-template-rows: auto 1fr; gap: 8px; color: var(--ink-950); background: rgba(232,238,235,.95); } +.system-workspace > .stage-kicker, .system-workspace > h2 { grid-column: 1 / 3; } +.system-workspace > h2 { margin: -3px 0 0; font-size: 19px; } +.system-list { display: grid; gap: 4px; } +.system-row { min-height: 46px; display: grid; grid-template-columns: 32px 1fr auto; gap: 7px; align-items: center; color: var(--ink-950); text-align: left; background: var(--white); border: 1px solid var(--line); } +.system-row.is-focused { box-shadow: inset 4px 0 var(--work-gold); } +.system-row span { font-size: 8px; text-align: center; } +.system-row strong { font-size: 9px; } +.system-row em { padding-right: 8px; font-size: 7px; font-style: normal; } +.system-workspace aside { padding: 10px; background: var(--white); border-left: 4px solid var(--route-teal); } +.system-workspace aside b, .system-workspace aside p { font-size: 8px; } +.progress-composition { color: var(--ink-950); background: rgba(232,238,235,.96); } +.progress-heading { max-width: 70%; } +.progress-heading h2 { margin: 3px 0; font-size: 19px; } +.progress-heading p { margin: 0; font-size: 8px; } +.progress-path { display: flex; align-items: center; margin: 12px 0; } +.progress-path i { flex: 1; height: 3px; background: var(--neutral-silver); } +.path-node { min-width: 76px; padding: 8px; font-size: 8px; font-weight: 900; text-align: center; background: var(--white); border: 2px solid var(--neutral-silver); } +.path-node.is-complete { color: var(--white); background: var(--safe-jade); border-color: var(--safe-jade); } +.path-node.is-current { border-color: var(--work-gold); box-shadow: inset 0 -4px var(--work-gold); } +.progress-details { width: 62%; display: grid; gap: 3px; } +.records-composition { display: grid; grid-template-columns: .55fr 1.1fr .75fr; gap: 8px; color: var(--ink-950); background: rgba(232,238,235,.96); } +.records-categories, .record-grid, .record-inspect { padding: 8px; background: var(--white); } +.records-categories { display: grid; align-content: start; gap: 3px; } +.records-categories > strong { margin-bottom: 5px; font-size: 9px; } +.records-categories button { min-height: 29px; display: flex; justify-content: space-between; align-items: center; color: var(--ink-950); font-size: 8px; background: var(--mist-120); border: 1px solid transparent; } +.records-categories button.is-active { border-left: 4px solid var(--work-gold); } +.record-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 4px; } +.record-tile { min-width: 0; display: grid; place-items: center; align-content: center; padding: 4px; color: var(--ink-950); background: var(--mist-120); border: 1px solid var(--line); } +.record-tile.is-focused { border-color: var(--work-gold); } +.record-tile > span { width: 31px; height: 34px; display: grid; place-items: center; color: var(--white); font-size: 8px; background: var(--ink-840); } +.record-tile small, .record-tile strong, .record-tile em { font-size: 7px; font-style: normal; text-align: center; } +.record-inspect .large-figure { width: 65px; height: 78px; } +.record-inspect h2 { margin: 5px 0; font-size: 15px; } +.record-inspect p, .record-inspect b, .record-inspect span { display: block; margin: 4px 0; font-size: 8px; } +.settings-composition { display: grid; grid-template-columns: .6fr 1.35fr .7fr; gap: 1px; padding: 0; color: var(--ink-950); background: var(--line-strong); } +.settings-rail, .settings-workspace, .settings-preview { padding: 11px; background: var(--mist-050); } +.settings-rail { display: grid; align-content: start; gap: 3px; } +.settings-rail strong { margin-bottom: 5px; font-size: 10px; } +.settings-rail button { min-height: 28px; color: var(--ink-700); font-size: 8px; text-align: left; background: transparent; border: 0; border-left: 3px solid transparent; } +.settings-rail button.is-active { color: var(--ink-950); background: var(--mist-180); border-left-color: var(--work-gold); } +.settings-workspace h2 { margin: 3px 0 7px; font-size: 17px; } +.setting-control { min-height: 44px; display: grid; grid-template-columns: 1fr auto; align-items: center; gap: 8px; border-bottom: 1px solid var(--line); } +.setting-control strong, .setting-control small { display: block; } +.setting-control strong { font-size: 8px; } +.setting-control small { color: var(--ink-700); font-size: 7px; } +.segmented-control { display: flex; } +.segmented-control button, .menu-control { min-height: 26px; padding: 4px 6px; color: var(--ink-950); font-size: 7px; background: var(--white); border: 1px solid var(--line); } +.segmented-control button.is-active { color: var(--white); background: var(--ink-840); } +.switch { width: 34px; height: 20px; padding: 2px; background: var(--neutral-silver); border: 0; border-radius: 10px; } +.switch i { display: block; width: 16px; height: 16px; background: var(--white); border-radius: 50%; transform: translateX(0); } +.switch.is-on { background: var(--safe-jade); } +.switch.is-on i { transform: translateX(14px); } +.settings-actions { display: flex; justify-content: flex-end; gap: 6px; margin-top: 7px; } +.settings-preview { align-self: stretch; background: #dbe9e5; } +.settings-preview > span { font-size: 8px; font-weight: 900; } +.preview-target { margin-top: 12px; padding: 7px; color: var(--white); font-size: 7px; background: var(--danger-coral); border-left: 5px solid var(--ink-950); } +.preview-target b { display: block; font-size: 9px; } +.settings-preview p, .settings-preview strong { font-size: 8px; } +.generic-composition { display: grid; grid-template-columns: .7fr 1.3fr; gap: 10px; } +.generic-subject { display: grid; place-items: center; align-content: center; background: rgba(19,129,138,.82); border: 2px solid #9cdbda; } +.generic-subject span { font-size: 48px; font-weight: 900; } +.generic-subject strong { font-size: 10px; } +.generic-decision { padding: 13px; color: var(--ink-950); background: rgba(243,246,242,.96); } +.generic-decision h2 { margin: 4px 0; font-size: 18px; } +.generic-decision p { font-size: 8px; line-height: 1.4; } + +/* State variants */ +.state-variant-overlay { position: absolute; z-index: 20; inset: 0; display: grid; place-items: center; padding: 5%; background: rgba(12,22,26,.68); } +.state-variant-overlay.loading { background: rgba(12,22,26,.52); } +.variant-sheet { width: min(72%, 620px); padding: 16px; color: var(--ink-950); background: var(--mist-050); border-left: 6px solid var(--uncertain-cobalt); box-shadow: 0 18px 50px rgba(0,0,0,.35); } +.state-variant-overlay.error .variant-sheet { border-left-color: var(--danger-coral); } +.state-variant-overlay.return .variant-sheet { border-left-color: var(--safe-jade); } +.variant-sheet h2 { margin: 4px 0; font-size: 18px; } +.variant-sheet p { font-size: 9px; line-height: 1.45; } +.variant-sheet > div { display: flex; justify-content: flex-end; gap: 6px; } + +/* Gallery controls */ +.firstplay-controls { min-height: 52px; display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 12px; margin-top: 12px; } +.page-command { min-height: 42px; padding: 8px 12px; color: var(--ink-950); font-size: 11px; font-weight: 800; background: var(--white); border: 1px solid var(--line-strong); border-radius: 4px; } +.page-command.is-primary { background: var(--work-gold); border-color: #b98717; } +.flow-progress { display: flex; justify-content: center; gap: 3px; overflow-x: auto; scrollbar-width: thin; } +.flow-progress button { width: 22px; height: 28px; flex: 0 0 auto; padding: 0; color: var(--ink-700); font-size: 8px; background: var(--white); border: 1px solid var(--line); border-radius: 2px; } +.flow-progress button.is-complete { color: var(--white); background: var(--safe-jade); } +.flow-progress button.is-active { color: var(--ink-950); background: var(--work-gold); border-color: var(--ink-950); } +.screen-tools { display: grid; grid-template-columns: 1fr auto; align-items: center; gap: 12px; margin-bottom: 12px; } +.filter-scroll, .variant-control, .catalog-tabs, .region-tabs { display: flex; gap: 3px; overflow-x: auto; scrollbar-width: thin; } +.filter-scroll button, .variant-control button { min-height: 34px; flex: 0 0 auto; padding: 6px 9px; color: var(--ink-700); font-size: 9px; background: var(--white); border: 1px solid var(--line); border-radius: 3px; } +.filter-scroll button.is-active, .variant-control button.is-active { color: var(--white); background: var(--ink-840); } +.screen-browser { display: grid; grid-template-columns: 210px minmax(0, 1fr); gap: 16px; align-items: start; } +.screen-index { position: sticky; top: calc(var(--topbar) + 16px); max-height: calc(100vh - var(--topbar) - 48px); overflow: auto; background: var(--white); border: 1px solid var(--line); } +.screen-index button { width: 100%; min-height: 49px; display: grid; grid-template-columns: 58px 1fr; gap: 2px 7px; align-items: center; padding: 6px 8px; color: var(--ink-950); text-align: left; background: var(--white); border: 0; border-bottom: 1px solid var(--line); border-left: 4px solid transparent; } +.screen-index button.is-active { background: var(--mist-120); border-left-color: var(--work-gold); } +.screen-index span { color: var(--route-teal); font-size: 9px; font-weight: 900; } +.screen-index strong { overflow: hidden; font-size: 10px; text-overflow: ellipsis; white-space: nowrap; } +.screen-index em { grid-column: 2; color: var(--safe-jade); font-size: 7px; font-style: normal; font-weight: 900; } +.screen-inspection { min-width: 0; } +.screen-pager { display: flex; justify-content: space-between; gap: 8px; margin-top: 10px; } +.screen-pager button { min-height: 38px; padding: 7px 10px; color: var(--ink-950); font-size: 9px; background: var(--white); border: 1px solid var(--line); border-radius: 3px; } +.authority-summary { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1px; margin-top: 10px; background: var(--line); border: 1px solid var(--line); } +.authority-summary > div { min-height: 105px; padding: 11px; background: var(--white); } +.authority-summary span { color: var(--route-teal); font-size: 8px; font-weight: 900; text-transform: uppercase; } +.authority-summary p { margin: 5px 0 0; font-size: 10px; line-height: 1.45; } + +.region-tabs { margin-bottom: 12px; } +.region-tabs button { min-width: 126px; min-height: 45px; display: grid; padding: 6px 8px; color: var(--ink-700); text-align: left; background: var(--white); border: 1px solid var(--line); border-bottom: 3px solid transparent; } +.region-tabs button.is-active { color: var(--ink-950); border-bottom-color: var(--work-gold); } +.region-tabs span { font-size: 8px; font-weight: 900; } +.region-tabs strong { overflow: hidden; font-size: 10px; text-overflow: ellipsis; white-space: nowrap; } +.region-stage { position: relative; width: 100%; aspect-ratio: 16/7.2; overflow: hidden; color: var(--white); background: var(--ink-840); box-shadow: var(--shadow); } +.region-stage > img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; } +.region-stage::after { content: ""; position: absolute; inset: 0; background: linear-gradient(90deg, rgba(16,29,33,.86), rgba(16,29,33,.2) 58%, rgba(16,29,33,.55)); } +.region-stage .concept-label { z-index: 3; } +.region-title { position: absolute; z-index: 2; left: 4%; top: 12%; width: 38%; } +.region-title span { color: var(--work-gold); font-size: 11px; font-weight: 900; } +.region-title h2 { margin: 4px 0; font-size: 32px; } +.region-title p { font-size: 11px; line-height: 1.45; } +.region-route { position: absolute; z-index: 2; left: 35%; right: 4%; bottom: 16%; display: flex; align-items: center; } +.region-route i { flex: 1; height: 3px; background: var(--route-teal); border: 1px solid var(--white); } +.region-route button { min-width: 88px; min-height: 42px; color: var(--ink-950); font-size: 9px; font-weight: 900; background: var(--mist-050); border: 2px solid var(--route-teal); border-radius: 3px; } +.region-intel { display: grid; grid-template-columns: 1fr 1fr 1.25fr; gap: 1px; margin-top: 12px; background: var(--line); border: 1px solid var(--line); } +.region-intel article { min-height: 155px; padding: 14px; background: var(--white); } +.region-intel article > span { color: var(--route-teal); font-size: 9px; font-weight: 900; text-transform: uppercase; } +.region-intel p { font-size: 10px; line-height: 1.5; } +.identity-strip { display: grid; grid-template-columns: repeat(3, 1fr); gap: 4px; margin-top: 8px; } +.identity-strip b { min-width: 0; padding: 6px; font-size: 8px; background: var(--mist-120); border-left: 3px solid var(--route-teal); } +.identity-strip b.boss { border-left-color: var(--danger-coral); } +.identity-strip small { display: block; overflow: hidden; margin-top: 2px; font-size: 7px; font-weight: 600; text-overflow: ellipsis; white-space: nowrap; } + +.catalog-tabs { margin-bottom: 10px; } +.catalog-tabs button { min-width: 126px; min-height: 44px; display: flex; align-items: center; justify-content: space-between; gap: 9px; padding: 7px 9px; color: var(--ink-700); text-transform: capitalize; background: var(--white); border: 1px solid var(--line); border-bottom: 3px solid transparent; } +.catalog-tabs button.is-active { color: var(--ink-950); border-bottom-color: var(--work-gold); } +.catalog-tabs b { font-size: 10px; } +.catalog-toolbar { display: flex; justify-content: space-between; gap: 12px; margin-bottom: 12px; } +.search-control { min-width: min(360px, 42vw); min-height: 38px; display: flex; align-items: center; gap: 7px; padding: 0 10px; background: var(--white); border: 1px solid var(--line-strong); border-radius: 4px; } +.search-control input { width: 100%; min-width: 0; border: 0; outline: 0; } +.catalog-layout { display: grid; grid-template-columns: 320px minmax(0, 1fr); gap: 16px; align-items: start; } +.catalog-art { position: sticky; top: calc(var(--topbar) + 16px); background: var(--white); border: 1px solid var(--line); } +.catalog-art > img { width: 100%; aspect-ratio: 1; object-fit: contain; } +.catalog-art { position: sticky; } +.catalog-art .concept-label { bottom: auto; top: 8px; } +.catalog-art > div { padding: 12px; border-top: 1px solid var(--line); } +.catalog-art strong { font-size: 13px; } +.catalog-art p { margin: 5px 0 0; color: var(--ink-700); font-size: 10px; line-height: 1.45; } +.catalog-list { display: grid; gap: 5px; } +.catalog-entry { min-height: 74px; display: grid; grid-template-columns: minmax(165px, .38fr) 1fr 32px; gap: 12px; align-items: center; padding: 11px; background: var(--white); border: 1px solid var(--line); border-left: 4px solid var(--mist-180); border-radius: 3px; } +.catalog-entry:hover { border-left-color: var(--work-gold); } +.catalog-entry small, .catalog-entry strong, .catalog-entry em { display: block; } +.catalog-entry small { color: var(--route-teal); font-size: 8px; font-weight: 900; } +.catalog-entry strong { margin-top: 2px; font-size: 11px; } +.catalog-entry em { margin-top: 3px; color: var(--ink-700); font-size: 8px; font-style: normal; } +.catalog-entry p { margin: 0; font-size: 9px; line-height: 1.45; } +.catalog-entry .stage-icon { color: var(--ink-950); background: var(--mist-120); border-color: var(--line); } +.catalog-more { padding: 12px; color: var(--ink-700); font-size: 10px; text-align: center; background: var(--mist-120); } + +.review-groups { display: grid; gap: 1px; background: var(--line); border: 1px solid var(--line); } +.review-groups article { min-height: 106px; display: grid; grid-template-columns: 56px 1fr auto; gap: 18px; align-items: center; padding: 14px 18px; background: var(--white); } +.review-groups article > span { display: grid; place-items: center; width: 48px; height: 48px; color: var(--white); font-size: 14px; font-weight: 900; background: var(--route-teal); border-radius: 4px; } +.review-groups small { color: var(--route-teal); font-size: 8px; font-weight: 900; } +.review-groups h2 { margin: 3px 0; font-size: 16px; } +.review-groups p { margin: 0; color: var(--ink-700); font-size: 10px; line-height: 1.45; } +.review-boundary { display: grid; grid-template-columns: 1fr 1fr; gap: 1px; margin-top: 12px; background: var(--line); border: 1px solid var(--line); } +.review-boundary div { padding: 14px; background: var(--white); } +.review-boundary span, .review-boundary strong { display: block; } +.review-boundary span { color: var(--route-teal); font-size: 8px; font-weight: 900; text-transform: uppercase; } +.review-boundary strong { margin-top: 5px; font-size: 10px; line-height: 1.5; } + +/* Viewer */ +.stage-dialog { width: min(98vw, 1780px); height: min(96vh, 1080px); max-width: none; max-height: none; padding: 0; color: var(--white); background: #0b1114; border: 1px solid #53646b; } +.stage-dialog::backdrop { background: rgba(5,9,11,.88); } +.viewer-toolbar { height: 50px; display: flex; align-items: center; justify-content: space-between; padding: 5px 9px 5px 15px; background: #142127; border-bottom: 1px solid #53646b; } +.viewer-toolbar > span { font-size: 11px; font-weight: 900; } +.viewer-toolbar > div { display: flex; gap: 5px; } +.viewer-toolbar .icon-button { color: var(--white); background: #25343a; border-color: #52656c; } +.viewer-zoom { min-width: 58px; color: var(--white); background: #25343a; border: 1px solid #52656c; border-radius: 3px; } +.viewer-viewport { height: calc(100% - 50px); overflow: auto; display: grid; place-items: center; padding: 12px; } +#dialog-stage { min-width: 560px; margin: auto; transition: width .15s ease; } +#dialog-stage .game-stage, #dialog-stage .region-stage { width: 100%; } +.nav-scrim { position: fixed; inset: 0; z-index: 35; background: rgba(8,14,17,.66); } + +@keyframes spin { to { transform: rotate(360deg); } } + +@container stage (max-width: 760px) { + .game-hud { height: 38px; padding: 4px 7px; } + .stage-body { inset: 38px 0 0; } + .stage-icon { width: 24px; height: 24px; font-size: 10px; } + .resource { display: none; } + .stage-primary, .stage-secondary { min-height: 26px; padding: 4px 7px; font-size: 8px; } + .opening-title h2, .market-heading h2, .party-title h2, .risk-heading h2, .result-title h2, .reward-heading h2, .recovery-heading h2 { font-size: 14px; } + .opening-title p, .party-title p, .battle-objective p, .region-signal p { display: none; } + .offer-grid { height: 62%; gap: 4px; margin-top: 5px; } + .offer-copy p { display: none; } + .offer-figure > span { width: 32px; height: 37px; font-size: 9px; border-width: 2px; } + .offer-actions > span { display: none; } + .offer-actions { grid-template-columns: 1fr auto; } + .offer-copy strong { font-size: 8px; } + .profession-seal { font-size: 6px; } + .opening-footer { min-height: 29px; margin-top: 3px; } + .selection-count strong { min-width: 34px; padding: 3px 5px; font-size: 10px; } + .market-surface { height: 66%; } + .market-heading .stage-kicker, .market-footer, .party-read { display: none; } + .market-row { grid-template-columns: 27px 1fr auto; padding: 3px; } + .row-avatar { width: 24px; height: 27px; } + .market-inspect { padding: 6px; } + .market-inspect p { display: none; } + .party-cord { left: 2%; right: 2%; top: 32%; gap: 4px; } + .party-actor { min-width: 45px; height: 67px; } + .actor-figure { width: 26px; height: 31px; border-width: 2px; } + .party-tools { bottom: 6%; } + .relation-layer { display: none; } + .risk-options { height: 65%; } + .risk-option { padding: 5px; } + .risk-option small { display: none; } + .battle-objective { max-width: 62%; } + .battle-objective h2 { font-size: 12px; } + .battle-line { top: 23%; bottom: 18%; grid-template-columns: 1.1fr .35fr .7fr; } + .allied-line .party-actor { min-width: 37px; height: 58px; } + .allied-line .actor-figure { width: 21px; height: 26px; } + .allied-line .party-actor > strong, .allied-line .party-actor > em { display: none; } + .enemy-actor { min-width: 36px; height: 47px; font-size: 8px; } + .enemy-actor.elite { min-width: 45px; height: 63px; } + .enemy-actor small, .edge-label { display: none; } + .battle-event-log span { display: none; } + .battle-event-log b { display: block; } + .inspect-sheet { width: 40%; } + .inspect-sheet dl > div:nth-child(n+3) { display: none; } + .result-title { grid-template-columns: 65px 1fr; } + .result-effects span:nth-child(2) { display: none; } + .result-effects { grid-template-columns: repeat(2, 1fr); } + .reward-options, .recovery-paths { height: 66%; } + .reward-object { height: 28px; font-size: 19px; } + .reward-option p, .recovery-path p { display: none; } + .settings-preview { display: none; } + .settings-composition { grid-template-columns: .55fr 1.45fr; } + .setting-control { min-height: 34px; } + .generic-subject span { font-size: 30px; } } -@media (max-width: 900px) { - :root { --topbar: 56px; } - .mobile-only { display: grid; } +@container stage (max-width: 480px) { + .game-hud { height: 32px; } + .stage-body { inset: 32px 0 0; } + .hud-left strong, .save-state, .concept-label { display: none; } + .opening-composition, .creation-review, .contract-composition, .market-composition, .market-review, .item-review, .party-composition, .risk-board, .risk-review, .battle-composition, .battle-static, .result-composition, .loss-composition, .reward-composition, .recovery-composition, .guild-composition, .forecast-composition, .system-workspace, .progress-composition, .records-composition, .generic-composition { padding: 2% 2.5% 3%; } + .opening-title { max-width: 80%; } + .opening-title .stage-kicker { display: none; } + .opening-title h2 { font-size: 10px; } + .offer-grid { grid-template-columns: repeat(4, 1fr); height: 68%; gap: 2px; } + .offer-copy { padding: 2px; } + .offer-copy strong { font-size: 6px; } + .profession-seal { font-size: 5px; } + .offer-actions { min-height: 19px; padding: 1px; } + .offer-actions > button:not(.stage-icon) { min-height: 17px; padding: 1px 2px; font-size: 5px; } + .offer-actions .stage-icon { display: none; } + .offer-actions { grid-template-columns: 1fr; } + .opening-footer .stage-secondary { display: none; } + .selection-count span { display: none; } + .contract-sheet dl > div:nth-child(n+3) { display: none; } + .creation-review { width: 90%; min-height: 90%; padding: 6px 8px; } + .unchosen-strip { display: none; } + .recruit-marker { padding: 2px; } + .recruit-silhouette { width: 25px; height: 29px; } + .market-composition { padding-bottom: 3%; } + .market-heading h2 { font-size: 9px; } + .company-meter { padding: 3px; } + .company-meter span { display: none; } + .company-meter strong { font-size: 10px; } + .market-tabs { height: 20px; margin-top: 2px; } + .market-tabs button { padding: 2px 4px; font-size: 5px; } + .market-surface { height: 72%; grid-template-columns: 1.25fr .75fr; gap: 2px; } + .market-list { padding: 2px; } + .market-row { min-height: 0; } + .market-row em, .fit-read { display: none; } + .market-inspect h3 { font-size: 8px; } + .market-inspect .stage-primary { min-height: 18px; font-size: 5px; } + .market-review { grid-template-columns: .6fr 1fr .7fr; gap: 2px; } + .review-figure, .review-facts, .party-impact { padding: 4px; } + .review-facts h2 { font-size: 10px; } + .review-facts h3, .party-impact p, .party-impact small, .review-facts p { display: none; } + .stat-radar { grid-template-columns: repeat(2, 1fr); } + .party-impact > strong { font-size: 9px; } + .item-review { gap: 2px; } + .item-review > div, .item-review > aside { padding: 5px; } + .item-object { font-size: 30px; } + .item-review h2 { font-size: 9px; } + .item-review p, .item-review aside span { display: none; } + .equipment-composition { grid-template-columns: .9fr .55fr 1fr; gap: 2px; padding: 2%; } + .equipment-list, .equipment-wearer, .equipment-delta { padding: 4px; } + .equipment-row { min-height: 28px; } + .equipment-row:nth-of-type(n+4) { display: none; } + .equipment-wearer .large-figure { width: 36px; height: 44px; } + .equipment-wearer strong { font-size: 7px; } + .equipped-slot, .equipment-delta p { display: none; } + .equipment-delta h2 { font-size: 8px; } + .party-title .stage-kicker, .party-title p, .cord-label { display: none; } + .party-title h2 { font-size: 9px; } + .party-cord { top: 24%; height: 74px; } + .party-cord::before { top: 48px; } + .party-actor { min-width: 34px; height: 55px; padding: 2px; } + .actor-figure { width: 20px; height: 24px; } + .party-actor > strong, .party-actor > em { display: none; } + .party-tools .stage-icon { display: none; } + .party-tools { right: 2%; bottom: 3%; } + .risk-heading h2 { font-size: 9px; } + .risk-options { height: 70%; gap: 2px; margin-top: 3px; } + .risk-option { padding: 3px; } + .risk-option > span { width: 17px; height: 17px; font-size: 6px; } + .risk-option strong { font-size: 7px; } + .risk-option div b { display: none; } + .risk-compare { min-height: 24px; margin-top: 2px; padding: 2px; } + .risk-compare b:nth-of-type(n+2) { display: none; } + .risk-review { width: 92%; } + .risk-review h2 { font-size: 10px; } + .risk-review p { display: none; } + .threat-band span:nth-child(n+3) { display: none; } + .threat-band { grid-template-columns: repeat(2, 1fr); } + .mini-party-line { margin: 3px 0; padding: 2px; } + .battle-objective .stage-kicker, .playback-tools .stage-icon { display: none; } + .battle-objective h2 { font-size: 8px; } + .battle-line { top: 20%; bottom: 15%; gap: 1px; } + .allied-line { gap: 1px; } + .allied-line .party-actor { min-width: 26px; height: 42px; padding: 1px; } + .allied-line .actor-figure { width: 16px; height: 19px; } + .enemy-line { gap: 1px; } + .enemy-actor { min-width: 25px; height: 35px; } + .enemy-actor.elite { min-width: 31px; height: 45px; } + .forecast-arrow { padding: 2px; font-size: 5px; } + .caption-line { display: none; } + .inspect-sheet { top: 7%; bottom: 4%; width: 43%; padding: 4px; } + .inspect-sheet h3 { font-size: 8px; } + .inspect-sheet .stage-kicker, .inspect-sheet dl > div:nth-child(n+2) { display: none; } + .battle-sheet { top: 3%; width: 43%; padding: 5px; } + .battle-sheet h2 { font-size: 8px; } + .result-title { grid-template-columns: 45px 1fr; } + .result-title h2 { font-size: 9px; } + .result-title p { display: none; } + .outcome-seal { font-size: 7px; border-width: 2px; } + .causal-timeline { margin-top: 3px; padding: 3px; } + .expected-track, .actual-track { grid-template-columns: 42px repeat(3, 1fr); gap: 1px; } + .expected-track span, .actual-track span { min-height: 20px; padding: 1px; font-size: 5px; } + .result-effects { margin-top: 2px; } + .loss-composition { gap: 3px; } + .fallen-figure span { width: 44px; height: 57px; font-size: 12px; } + .loss-record { padding: 5px; } + .loss-record h2 { font-size: 10px; } + .loss-record > p, .loss-record > small { display: none; } + .reward-heading h2, .recovery-heading h2 { font-size: 9px; } + .recovery-heading p { display: none; } + .reward-options, .recovery-paths { height: 72%; gap: 2px; margin-top: 3px; } + .reward-option, .recovery-path { padding: 3px; } + .guild-pressure h2 { font-size: 9px; } + .guild-pressure p { display: none; } + .guild-destinations { top: 20%; gap: 2px; } + .guild-destinations button { min-height: 34px; padding: 3px; font-size: 6px; } + .muster-strip { bottom: 5%; } + .muster-strip .party-actor { min-width: 32px; height: 40px; } + .receipt-strip { display: none; } + .forecast-sheets { height: 74%; margin-top: 4px; gap: 2px; } + .forecast-sheets article { padding: 4px; } + .forecast-sheets h3 { font-size: 8px; } + .forecast-sheets p { display: none; } + .system-workspace { gap: 2px; } + .system-workspace > h2 { font-size: 10px; } + .system-row { min-height: 28px; } + .system-workspace aside { padding: 4px; } + .system-workspace aside p { display: none; } + .records-composition { gap: 2px; } + .records-categories, .record-grid, .record-inspect { padding: 3px; } + .records-categories button:nth-child(n+6) { display: none; } + .record-inspect p, .record-inspect b, .record-inspect span:not(.large-figure) { display: none; } + .settings-rail, .settings-workspace { padding: 4px; } + .settings-rail button { min-height: 20px; font-size: 5px; } + .settings-workspace h2 { font-size: 9px; } + .setting-control { min-height: 26px; } + .setting-control small { display: none; } + .generic-decision { padding: 5px; } + .generic-decision h2 { font-size: 9px; } + .generic-decision p { display: none; } + .variant-sheet { width: 90%; padding: 6px; } + .variant-sheet h2 { font-size: 9px; } + .variant-sheet p { font-size: 6px; } +} + +@media (max-width: 1160px) { + :root { --sidebar: 226px; } + main { padding: 18px; } + .screen-browser { grid-template-columns: 180px minmax(0, 1fr); gap: 12px; } + .catalog-layout { grid-template-columns: 260px minmax(0, 1fr); } + .region-title h2 { font-size: 26px; } +} + +@media (max-width: 880px) { + :root { --sidebar: 272px; --topbar: 54px; } .app-shell { display: block; } - .sidebar { - position: fixed; - left: 0; - top: 0; - width: min(88vw, 320px); - visibility: hidden; - pointer-events: none; - transform: translateX(calc(-100% - 2px)); - transition: transform 180ms ease, visibility 0s linear 180ms; - } - .sidebar.is-open { - visibility: visible; - pointer-events: auto; - transform: translateX(0); - transition: transform 180ms ease, visibility 0s; - } - .brand-block .icon-button { margin-left: -4px; color: #fff; border-color: rgba(255,255,255,.2); } - .topbar { padding: 7px 12px; } - .top-actions .evidence-badge { display: none; } - main { padding: 20px 12px 34px; } - .view-heading { display: block; margin-bottom: 20px; } - h1 { font-size: 29px; } - .metric-row { grid-template-columns: repeat(2,minmax(0,1fr)); margin: 18px 0 24px; } - .metric { min-height: 92px; padding: 14px; } - .metric strong { font-size: 25px; } - .overview-hero-copy { position: static; width: auto; padding: 16px; } - .overview-hero { aspect-ratio: auto; } - .overview-hero img { aspect-ratio: 16/9; object-fit: contain; } - .screen-layout { display: block; } - .screen-index { position: static; display: flex; max-height: none; overflow-x: auto; margin-bottom: 14px; } - .screen-index button { flex: 0 0 170px; grid-template-columns: 1fr auto; border-right: 1px solid var(--line); border-bottom: 0; } - .screen-index button > span { grid-column: 1 / -1; } - .screen-index button.is-active { box-shadow: inset 0 -4px var(--gold); } - .screen-index button b { white-space: normal; } - .screen-stage-wrap { padding: 5px; } - .screen-meta-head { display: block; } - .pager { margin-top: 12px; } - .spec-grid { grid-template-columns: 1fr; } - .prototype-missing dl { grid-template-columns: 1fr; } - .spec-cell { min-height: 0; } - .chapter-tabs { display: flex; overflow-x: auto; } - .chapter-tabs button { flex: 0 0 70px; } - .chapter-copy { padding: 16px; } - .chapter-states { grid-template-columns: 1fr; } - .catalog-visual { display: block; } - .catalog-visual img { max-height: none; } - .catalog-entry { grid-template-columns: 1fr; gap: 8px; } - .flow-steps { display: flex; overflow-x: auto; } - .flow-steps button { flex: 0 0 130px; grid-template-columns: 1fr; } - .flow-steps button span { display: none; } - .stage-title p, .stage-generic-panel p { display: none; } - .records-stage { grid-template-columns: 42% 1fr; } - .setting-row { grid-template-columns: 1fr 35%; } - .readiness-table { display: block; overflow-x: auto; } + .sidebar { position: fixed; left: 0; top: 0; width: var(--sidebar); transform: translateX(-102%); transition: transform .18s ease; box-shadow: 12px 0 32px rgba(0,0,0,.28); } + .sidebar.is-open { transform: translateX(0); } + .mobile-only { display: inline-grid; } + .brand-block { grid-template-columns: 34px 42px 1fr; } + .brand-block > .icon-button { width: 34px; height: 34px; color: var(--white); background: transparent; border-color: #60727a; } + .topbar { padding: 6px 12px; } + main { padding: 16px; } + .view-heading h1 { font-size: 23px; } + .screen-browser { grid-template-columns: 1fr; } + .screen-index { position: static; display: flex; max-height: none; overflow-x: auto; } + .screen-index button { min-width: 155px; border-left: 0; border-bottom: 4px solid transparent; } + .screen-index button.is-active { border-bottom-color: var(--work-gold); } + .catalog-layout { grid-template-columns: 1fr; } + .catalog-art { position: static; display: grid; grid-template-columns: minmax(180px, .7fr) 1fr; } + .catalog-art > img { aspect-ratio: 16/9; } + .catalog-art > div { border-top: 0; border-left: 1px solid var(--line); } + .region-intel { grid-template-columns: 1fr 1fr; } + .region-intel article:last-child { grid-column: 1 / 3; } } -@media (orientation: landscape) and (max-height: 560px) { - .topbar { position: static; } - main { padding-top: 12px; } - .view-heading { margin-bottom: 12px; } - .screen-index { position: static; } - .stage-dialog { padding-top: 44px; } +@media (max-width: 620px) { + .evidence-badge, .breadcrumbs > span, .breadcrumbs > b { display: none; } + .top-actions { gap: 4px; } + .locale-control button { min-height: 30px; padding: 3px 7px; font-size: 10px; } + main { padding: 12px; } + .view-heading { min-height: 58px; margin-bottom: 10px; } + .view-heading h1 { font-size: 19px; } + .view-heading p { display: none; } + .heading-badges span:nth-child(n+2) { display: none; } + .firstplay-controls { grid-template-columns: 1fr 1fr; gap: 8px; } + .flow-progress { grid-column: 1 / 3; grid-row: 1; justify-content: start; } + .page-command { min-height: 40px; } + .screen-tools { grid-template-columns: 1fr; } + .screen-index button { min-width: 132px; } + .authority-summary { grid-template-columns: 1fr; } + .authority-summary > div { min-height: auto; } + .region-stage { aspect-ratio: 16/9; } + .region-title { width: 62%; } + .region-title h2 { font-size: 19px; } + .region-title p { display: none; } + .region-route { left: 20%; } + .region-route button { min-width: 58px; min-height: 32px; font-size: 7px; } + .region-intel { grid-template-columns: 1fr; } + .region-intel article, .region-intel article:last-child { grid-column: auto; min-height: auto; } + .catalog-toolbar { display: grid; } + .search-control { min-width: 0; } + .catalog-art { display: block; } + .catalog-entry { grid-template-columns: 1fr 30px; gap: 7px; } + .catalog-entry > p { grid-column: 1 / 3; } + .review-groups article { grid-template-columns: 42px 1fr; gap: 10px; } + .review-groups article > span { width: 38px; height: 38px; } + .review-groups .page-command { grid-column: 2; justify-self: start; } + .review-boundary { grid-template-columns: 1fr; } + #dialog-stage { min-width: 520px; } } +@media (orientation: landscape) and (max-height: 560px) and (max-width: 920px) { + :root { --topbar: 44px; } + .topbar { min-height: 44px; } + .topbar .icon-button { width: 34px; height: 34px; } + main { padding: 7px 10px; } + .view-heading { min-height: 31px; align-items: center; margin-bottom: 5px; } + .view-heading .eyebrow, .view-heading p, .heading-badges { display: none; } + .view-heading h1 { margin: 0; font-size: 14px; } + .firstplay-view .stage-wrap, .screens-view .stage-wrap { width: min(100%, calc((100svh - 118px) * 16 / 9)); } + .firstplay-controls { min-height: 38px; grid-template-columns: auto 1fr auto; margin-top: 4px; } + .flow-progress { grid-column: auto; grid-row: auto; } + .flow-progress button { height: 22px; } + .page-command { min-height: 32px; padding: 4px 8px; font-size: 8px; } + .screen-tools { grid-template-columns: 1fr auto; margin-bottom: 4px; } + .filter-scroll button, .variant-control button { min-height: 27px; padding: 3px 6px; } + .screen-browser { display: block; } + .screen-index { display: none; } + .screen-pager, .authority-summary { display: none; } + .regions-view .view-heading, .catalog-view .view-heading, .review-view .view-heading { display: none; } + .region-tabs, .catalog-tabs { margin-bottom: 4px; } + .region-tabs button, .catalog-tabs button { min-height: 34px; } +} + +.high-contrast { --ink-950: #090d0f; --ink-840: #111b1f; --mist-050: #fff; --mist-120: #eef5f3; --line: rgba(0,0,0,.34); --line-strong: rgba(0,0,0,.62); } +.low-power .stage-art { filter: saturate(.7) contrast(.92); } +.reduced-motion * { animation-duration: .001ms !important; animation-iteration-count: 1 !important; scroll-behavior: auto !important; transition-duration: .001ms !important; } + @media (prefers-reduced-motion: reduce) { - *, *::before, *::after { scroll-behavior: auto !important; transition-duration: .001ms !important; animation-duration: .001ms !important; } + * { animation-duration: .001ms !important; animation-iteration-count: 1 !important; scroll-behavior: auto !important; transition-duration: .001ms !important; } } diff --git a/prototype/site/verify-r6.js b/prototype/site/verify-r6.js new file mode 100644 index 00000000..70637454 --- /dev/null +++ b/prototype/site/verify-r6.js @@ -0,0 +1,235 @@ +#!/usr/bin/env node +"use strict"; + +const assert = require("node:assert/strict"); +const fs = require("node:fs"); +const path = require("node:path"); +const { chromium } = require("playwright"); + +const root = path.resolve(__dirname, "../.."); +const baseURL = process.env.ABG_PROTOTYPE_URL || "http://127.0.0.1:8766"; +const outputDir = process.env.ABG_PROTOTYPE_EVIDENCE || path.join(root, "prototype/gallery/evidence/r6"); +const browserPath = process.env.ABG_BROWSER_PATH || "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"; + +const criticalScreens = { + "SYS-005": ".opening-composition", + "SHP-001": ".market-composition", + "SHP-002": ".market-review", + "EQP-002": ".equipment-composition", + "PTY-001": ".party-composition", + "BAT-002": ".battle-composition", + "OUT-001": ".result-composition", + "OUT-003": ".reward-composition", + "OUT-004": ".recovery-composition", + "PRO-003": ".records-composition", + "SET-002": ".settings-composition", +}; + +async function noHorizontalOverflow(page, label) { + const dimensions = await page.evaluate(() => ({ + scrollWidth: document.documentElement.scrollWidth, + clientWidth: document.documentElement.clientWidth, + })); + assert.ok(dimensions.scrollWidth <= dimensions.clientWidth + 1, `${label}: ${JSON.stringify(dimensions)}`); +} + +async function stageFitsViewport(page, label, requireVertical = false) { + const metrics = await page.locator(".game-stage").first().evaluate((stage) => { + const box = stage.getBoundingClientRect(); + return { left: box.left, right: box.right, top: box.top, bottom: box.bottom, width: box.width, height: box.height, viewportWidth: innerWidth, viewportHeight: innerHeight }; + }); + assert.ok(metrics.left >= -0.5 && metrics.right <= metrics.viewportWidth + 0.5, `${label} horizontal stage: ${JSON.stringify(metrics)}`); + if (requireVertical) assert.ok(metrics.top >= -0.5 && metrics.bottom <= metrics.viewportHeight + 0.5, `${label} vertical stage: ${JSON.stringify(metrics)}`); + assert.ok(Math.abs(metrics.width / metrics.height - 16 / 9) < 0.02, `${label} aspect ratio: ${JSON.stringify(metrics)}`); +} + +async function openView(page, view) { + const desktopButton = page.locator(`[data-view="${view}"]`); + if (!(await desktopButton.isVisible())) { + await page.locator("#open-nav").click(); + } + await desktopButton.click(); + await page.locator("main h1").waitFor({ state: "visible" }); +} + +async function waitForMobileNavClosed(page) { + await page.waitForFunction(() => { + const sidebar = document.querySelector("#sidebar"); + return sidebar && !sidebar.classList.contains("is-open") && sidebar.getBoundingClientRect().right <= 0.5; + }); +} + +async function selectScreen(page, id) { + await openView(page, "screens"); + const button = page.locator(`.screen-index [data-screen-id="${id}"]`); + await button.evaluate((element) => element.click()); + await page.locator(`[data-stage-id="${id}"]`).waitFor({ state: "visible" }); +} + +async function screenshot(page, name) { + const destination = path.join(outputDir, name); + await page.screenshot({ path: destination, fullPage: true }); + return destination; +} + +async function desktopAudit(browser, evidence) { + const errors = []; + const page = await browser.newPage({ viewport: { width: 1440, height: 1000 }, deviceScaleFactor: 1 }); + page.on("console", (message) => { if (message.type() === "error") errors.push(`console: ${message.text()}`); }); + page.on("pageerror", (error) => errors.push(`pageerror: ${error.message}`)); + await page.goto(baseURL, { waitUntil: "networkidle" }); + + assert.equal(await page.locator("#loading").count(), 0, "loading state clears"); + assert.equal(await page.locator(".nav-item").count(), 5, "gallery view count"); + assert.equal(await page.locator(".flow-progress button").count(), 23, "complete first-play state count"); + assert.equal(await page.locator(".recruit-offer").count(), 4, "four provisional offers"); + assert.equal(await page.locator(".recruit-offer.is-selected").count(), 0, "opening build is not preselected"); + await noHorizontalOverflow(page, "desktop opening"); + await stageFitsViewport(page, "desktop opening"); + evidence.push(await screenshot(page, "desktop-opening.png")); + + await page.locator('[data-offer-id="OFF-01"]').click(); + assert.equal(await page.locator(".recruit-offer.is-selected").count(), 1, "first provisional selection"); + await page.locator('[data-offer-id="OFF-03"]').click(); + assert.equal(await page.locator(".recruit-offer.is-selected").count(), 2, "second provisional selection"); + assert.ok(await page.locator(".opening-footer .stage-primary").isEnabled(), "Review Company enabled at 2/2"); + + await page.locator('[data-flow-index="7"]').click(); + assert.equal(await page.locator('[data-stage-id="SHP-001"] .company-meter strong').first().textContent(), "2", "first Market Company count"); + evidence.push(await screenshot(page, "desktop-market.png")); + await page.locator('[data-flow-index="12"]').click(); + assert.equal(await page.locator('[data-stage-id="PTY-001"] .party-actor').count(), 4, "party line actor count"); + assert.equal(await page.locator('[data-stage-id="PTY-001"] .party-actor').last().locator("> b").textContent(), "0", "rightmost position is 0"); + evidence.push(await screenshot(page, "desktop-formation.png")); + await page.locator('[data-flow-index="16"]').click(); + assert.ok(await page.locator('[data-stage-id="BAT-002"] .forecast-arrow').isVisible(), "battle forecast visible"); + assert.equal(await page.locator('[data-stage-id="BAT-002"] .allied-line .party-actor').count(), 4, "battle party line count"); + evidence.push(await screenshot(page, "desktop-battle.png")); + await page.locator('[data-flow-index="18"]').click(); + assert.ok(await page.locator('[data-stage-id="OUT-001"] .is-divergence').isVisible(), "result divergence visible"); + evidence.push(await screenshot(page, "desktop-result.png")); + await page.locator('[data-flow-index="22"]').click(); + assert.equal(await page.locator('[data-stage-id="OUT-004"] .recovery-path').count(), 3, "recovery paths visible"); + evidence.push(await screenshot(page, "desktop-recovery.png")); + + await openView(page, "screens"); + assert.equal(await page.locator(".screen-index button").count(), 50, "screen inventory count"); + const ids = await page.locator(".screen-index button span").allTextContents(); + assert.equal(new Set(ids).size, 50, "screen IDs unique"); + for (const id of ids) { + const button = page.locator(`.screen-index [data-screen-id="${id}"]`); + await button.evaluate((element) => element.click()); + assert.equal(await page.locator(".game-stage").first().getAttribute("data-stage-id"), id, `${id} owns its composition`); + assert.equal(await page.locator(".prototype-missing").count(), 0, `${id} has no missing placeholder`); + } + for (const [id, selector] of Object.entries(criticalScreens)) { + await selectScreen(page, id); + assert.ok(await page.locator(`[data-stage-id="${id}"] ${selector}`).isVisible(), `${id} critical composition`); + } + await page.locator('[data-screen-variant="error"]').click(); + assert.ok(await page.locator(".state-variant-overlay.error").isVisible(), "screen error variant inspectable"); + + await openView(page, "regions"); + assert.equal(await page.locator(".region-tabs button").count(), 8, "region count"); + for (let index = 0; index < 8; index += 1) { + await page.locator(`[data-region-index="${index}"]`).click(); + await page.waitForFunction(() => { + const image = document.querySelector(".region-stage img"); + return image && image.complete && image.naturalWidth > 0; + }); + } + evidence.push(await screenshot(page, "desktop-regions.png")); + + await openView(page, "catalogs"); + assert.equal(await page.locator(".catalog-tabs button").count(), 6, "searchable catalog family count"); + await page.locator('[data-catalog-type="professions"]').click(); + await page.locator('[data-catalog-filter="base"]').click(); + assert.equal(await page.locator(".catalog-entry").count(), 12, "base profession count"); + await page.locator('[data-catalog-type="equipment"]').click(); + await page.locator("[data-catalog-search]").fill("Stepback Soles"); + assert.equal(await page.locator(".catalog-entry").count(), 1, "equipment search result"); + assert.equal(await page.locator(".catalog-entry strong").textContent(), "Stepback Soles", "equipment search identity"); + evidence.push(await screenshot(page, "desktop-catalog.png")); + + await selectScreen(page, "SET-002"); + await page.locator('[data-text-scale="130"]').click(); + assert.equal(await page.locator("body").getAttribute("data-text-scale"), "130", "130% state applies"); + await page.locator('[data-setting-key="contrast"]').click(); + assert.match(await page.locator("body").getAttribute("class"), /high-contrast/, "high-contrast state applies"); + await page.locator('[data-locale="zh_CN"]').first().click(); + assert.equal(await page.locator("html").getAttribute("lang"), "zh-CN", "Simplified Chinese state applies"); + assert.match(await page.locator("main h1").textContent(), /显示与文字/, "selected screen localizes"); + evidence.push(await screenshot(page, "desktop-settings-zh-130.png")); + await page.locator('[data-text-scale="100"]').click(); + + await page.locator("#fullscreen-current").click(); + assert.ok(await page.locator("#stage-dialog").evaluate((dialog) => dialog.open), "stage viewer opens"); + await page.locator("#zoom-in").click(); + assert.equal(await page.locator("#zoom-reset").textContent(), "125%", "stage viewer zooms"); + await page.locator("#close-dialog").click(); + + assert.deepEqual(errors, [], `desktop browser errors: ${errors.join(" | ")}`); + await page.close(); +} + +async function responsiveAudit(browser, evidence) { + const fixtures = [ + { name: "tablet-battle.png", viewport: { width: 1024, height: 768 }, view: "screens", screen: "BAT-002", vertical: false }, + { name: "phone-portrait-opening.png", viewport: { width: 390, height: 844 }, view: "firstplay", vertical: true }, + { name: "phone-landscape-battle.png", viewport: { width: 844, height: 390 }, view: "firstplay", flow: 16, vertical: true }, + ]; + for (const fixture of fixtures) { + const page = await browser.newPage({ viewport: fixture.viewport, deviceScaleFactor: 1 }); + const errors = []; + page.on("pageerror", (error) => errors.push(error.message)); + await page.goto(`${baseURL}#${fixture.view}`, { waitUntil: "networkidle" }); + if (fixture.screen) await selectScreen(page, fixture.screen); + if (Number.isInteger(fixture.flow)) await page.locator(`[data-flow-index="${fixture.flow}"]`).click(); + if (fixture.viewport.width < 880) { + await page.locator("#open-nav").click(); + assert.match(await page.locator("#sidebar").getAttribute("class"), /is-open/, `${fixture.name} drawer opens`); + await page.locator("#close-nav").click(); + assert.doesNotMatch(await page.locator("#sidebar").getAttribute("class"), /is-open/, `${fixture.name} drawer closes`); + await waitForMobileNavClosed(page); + } + await noHorizontalOverflow(page, fixture.name); + await stageFitsViewport(page, fixture.name, fixture.vertical); + evidence.push(await screenshot(page, fixture.name)); + assert.deepEqual(errors, [], `${fixture.name} browser errors: ${errors.join(" | ")}`); + await page.close(); + } +} + +async function bundleAudit(browser) { + const bundle = path.join(root, "prototype/gallery/aetherbound-guild-prototype.html"); + assert.ok(fs.statSync(bundle).size > 1_000_000, "Gallery bundle contains embedded media"); + const page = await browser.newPage({ viewport: { width: 1280, height: 800 } }); + const external = []; + page.on("request", (request) => { + if (!request.url().startsWith("file:") && !request.url().startsWith("data:")) external.push(request.url()); + }); + await page.goto(`file://${bundle}`, { waitUntil: "load" }); + assert.equal(await page.locator(".recruit-offer").count(), 4, "Gallery bundle initializes offline"); + assert.deepEqual(external, [], `Gallery external requests: ${external.join(" | ")}`); + await page.close(); +} + +async function main() { + fs.mkdirSync(outputDir, { recursive: true }); + const browser = await chromium.launch({ headless: true, executablePath: browserPath }); + const evidence = []; + try { + await desktopAudit(browser, evidence); + await responsiveAudit(browser, evidence); + await bundleAudit(browser); + } finally { + await browser.close(); + } + console.log("ABG_R6_BROWSER_OK screens=50 flow_states=23 regions=8 catalogs=42,36,320,60,100,16 responsive=desktop,tablet,phone_portrait,phone_landscape bundle=offline"); + console.log(`evidence=${evidence.join(",")}`); +} + +main().catch((error) => { + console.error(error.stack || error); + process.exitCode = 1; +}); diff --git a/tools/build_gallery_bundle.py b/tools/build_gallery_bundle.py index fb938678..5ef5b104 100644 --- a/tools/build_gallery_bundle.py +++ b/tools/build_gallery_bundle.py @@ -1,18 +1,200 @@ #!/usr/bin/env python3 -"""Build a self-contained HTML artifact for sandboxed Gallery viewers.""" +"""Build current prototype data and a self-contained Gallery artifact.""" from __future__ import annotations import base64 import json +import re from pathlib import Path ROOT = Path(__file__).resolve().parents[1] SITE = ROOT / "prototype" / "site" +DATA_PATH = SITE / "data" / "catalog.json" DEFAULT_OUTPUT = ROOT / "prototype" / "gallery" / "aetherbound-guild-prototype.html" +def clean(value: str) -> str: + value = re.sub(r"\[([^]]+)\]\([^)]+\)", r"\1", value) + value = value.replace("**", "").replace("`", "") + return re.sub(r"\s+", " ", value).strip() + + +def table_rows(path: Path, id_pattern: str) -> list[list[str]]: + matcher = re.compile(id_pattern) + rows: list[list[str]] = [] + for line in path.read_text(encoding="utf-8").splitlines(): + if not line.startswith("|"): + continue + cells = [clean(cell) for cell in line.strip().strip("|").split("|")] + if cells and matcher.match(cells[0]): + rows.append(cells) + return rows + + +def split_identity(value: str, pattern: str) -> tuple[str, str]: + match = re.match(pattern, value) + if not match: + raise ValueError(f"invalid catalog identity: {value}") + return match.group(1), match.group(2) + + +def require_unique(entries: list[dict[str, str]], expected: int, label: str) -> None: + ids = [entry["id"] for entry in entries] + if len(entries) != expected or len(set(ids)) != expected: + raise ValueError(f"{label}: expected {expected} unique rows, received {len(entries)} / {len(set(ids))}") + + +def build_catalog() -> dict[str, object]: + screen_rows = table_rows( + ROOT / "docs/presentation/SCREEN_AND_STATE_MAP.md", + r"^(?:SYS|HUB|SHP|REC|EQP|ART|PTY|RSK|BAT|OUT|PRO|PST|SET)-\d{3}\b", + ) + screens = [] + for row in screen_rows: + match = re.match(r"^([A-Z]+-\d{3}) (.+) / ([A-Z]+)$", row[0]) + if not match or len(row) != 6: + raise ValueError(f"invalid screen row: {row[0]}") + screens.append( + { + "id": match.group(1), + "name": match.group(2), + "input": match.group(3), + "purpose": row[1], + "action": row[2], + "emptyLoading": row[3], + "errorConfirmation": row[4], + "interruptionReturn": row[5], + } + ) + + profession_rows = table_rows(ROOT / "docs/content/PROFESSION_CATALOG.md", r"^PF-[BAH]\d{2}$") + professions = [] + for row in profession_rows: + if len(row) < 6: + continue + family = {"B": "base", "A": "advanced", "H": "hidden"}[row[0][3]] + identity = row[1].split(";", 1) + cadence_index = 4 if len(row) == 7 else 3 + strategy_index = 5 if len(row) == 7 else 4 + professions.append( + { + "id": row[0], + "name": identity[0].strip(), + "family": family, + "role": identity[1].strip() if len(identity) > 1 else family, + "rules": row[2], + "cadence": row[cadence_index], + "strategy": row[strategy_index], + "production": row[-1], + } + ) + + traits = [ + { + "id": row[0], + "name": row[1], + "benefit": row[2], + "cost": row[3], + "evidence": row[4], + "prohibited": row[5], + } + for row in table_rows(ROOT / "docs/content/TRAIT_CATALOG.md", r"^TR-\d{3}$") + ] + + equipment = [] + for row in table_rows(ROOT / "docs/content/EQUIPMENT_CATALOG.md", r"^EQ-\d{3}\b"): + item_id, name = split_identity(row[0], r"^(EQ-\d{3}) (.+)$") + equipment.append( + { + "id": item_id, + "name": name, + "fit": row[1], + "class": row[2], + "effect": row[3], + "tradeoff": row[4], + "production": row[5], + } + ) + + artifacts = [] + for row in table_rows(ROOT / "docs/content/ARTIFACT_CATALOG.md", r"^AR-\d{3}\b"): + artifact_id, name = split_identity(row[0], r"^(AR-\d{3}) (.+)$") + artifacts.append( + { + "id": artifact_id, + "name": name, + "rule": row[1], + "tradeoff": row[2], + "production": row[3], + } + ) + + enemies = [] + bosses = [] + for row in table_rows(ROOT / "docs/content/ENEMY_CATALOG.md", r"^(?:EN-R\d-\d{2}|BO-R\d-\d{2})$"): + enemy_class, name = (part.strip() for part in row[1].split(";", 1)) + entry = { + "id": row[0], + "name": name, + "class": enemy_class, + "rule": row[2], + "responses": row[3], + "production": row[4], + } + (bosses if row[0].startswith("BO-") else enemies).append(entry) + + regions = [] + for row in table_rows(ROOT / "docs/content/REGION_CATALOG.md", r"^RG-\d{2}$"): + identity = row[1].split(";", 1) + regions.append( + { + "id": row[0], + "name": identity[0].strip(), + "framing": identity[1].strip() if len(identity) > 1 else "", + "pressure": row[2], + "progression": row[3], + "assignment": row[4], + "production": row[5], + } + ) + + expected = { + "screens": 50, + "professions": 42, + "traits": 36, + "equipment": 320, + "artifacts": 60, + "enemies": 100, + "bosses": 16, + "regions": 8, + } + entries = { + "screens": screens, + "professions": professions, + "traits": traits, + "equipment": equipment, + "artifacts": artifacts, + "enemies": enemies, + "bosses": bosses, + "regions": regions, + } + for label, count in expected.items(): + require_unique(entries[label], count, label) + + payload: dict[str, object] = { + "version": 2, + "status": "design-prototype-current-authority", + "authorityRevision": "recruit-line-design-r3", + "counts": expected, + **entries, + } + DATA_PATH.parent.mkdir(parents=True, exist_ok=True) + DATA_PATH.write_text(json.dumps(payload, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") + return payload + + def data_uri(path: Path) -> str: mime = "image/webp" if path.suffix == ".webp" else "application/octet-stream" encoded = base64.b64encode(path.read_bytes()).decode("ascii") @@ -20,10 +202,10 @@ def data_uri(path: Path) -> str: def main() -> None: + catalog = build_catalog() index = (SITE / "index.html").read_text(encoding="utf-8") styles = (SITE / "styles.css").read_text(encoding="utf-8") app = (SITE / "app.js").read_text(encoding="utf-8") - catalog = json.loads((SITE / "data" / "catalog.json").read_text(encoding="utf-8")) asset_paths = sorted((SITE / "assets" / "web").glob("*.webp")) asset_paths.append(SITE / "favicon.webp") @@ -33,28 +215,24 @@ def main() -> None: index = index.replace(relative, uri) app = app.replace(relative, uri) - catalog_json = json.dumps(catalog, ensure_ascii=False, separators=(",", ":")) - catalog_json = catalog_json.replace("<", "\\u003c") + catalog_json = json.dumps(catalog, ensure_ascii=False, separators=(",", ":")).replace("<", "\\u003c") app = app.replace("', - f"", - ) + index = index.replace('', f"") index = index.replace( '', - f'\n' - f"", + f'\n', ) - if 'href="styles.css"' in index or 'src="app.js"' in index: - raise RuntimeError("external stylesheet or script remains in bundle") - if "assets/web/" in index: - raise RuntimeError("external prototype asset remains in bundle") + forbidden = ('href="styles.css"', 'src="app.js"', "assets/web/") + remaining = [token for token in forbidden if token in index] + if remaining: + raise RuntimeError(f"external prototype dependency remains: {remaining}") DEFAULT_OUTPUT.parent.mkdir(parents=True, exist_ok=True) DEFAULT_OUTPUT.write_text(index, encoding="utf-8") + counts = catalog["counts"] + print(f"ABG_PROTOTYPE_DATA_OK counts={json.dumps(counts, separators=(',', ':'))}") print(f"ABG_GALLERY_BUNDLE_OK bytes={DEFAULT_OUTPUT.stat().st_size} output={DEFAULT_OUTPUT}")