卫戍协议:盟约 web remake — initial import
Online co-op browser remake of Arknights' Stronghold Protocol: Alliance (client-simulated combat, official waves/bonds/items/strategies, 3D board, facing wheel, operator loadout, official emotes, deployment scripts).
This commit is contained in:
commit
01a44cd288
408 files changed
+308986
No files matched your search
@@ -0,0 +1,156 @@
|
||||
# 00 · Research index and key numbers: 卫戍协议:盟约 (act2autochess, 盟约·下半)
|
||||
|
||||
Written 2026-09-27 by the completeness critic, after reading every file in this folder.
|
||||
|
||||
**Precedence rule:** where a file's body and its `## Addendum (critic)` disagree, **the addendum wins**. In JSON, `_criticAddendum` wins over the older fields.
|
||||
|
||||
Tags: **[DATA]** client game data · **[VERIFIED]** official or wiki rule text, or a screenshot · **[ASSUMED]** a proposal, kept in config.
|
||||
|
||||
## 1. Files
|
||||
|
||||
| File | What it holds | Key machine paths |
|
||||
|---|---|---|
|
||||
| `01-core-rules.md` / `01-core-data.json` | Modes, round schedule and timers, economy, shop, merging, LP, Final Assault and Hidden Core, 40 strategies (bands), 机变 choice events, scoring and tips. **Addendum A1–A5** has the verified rules, the ban rule and the enemy-multiplier table. | `modes`, `rounds`, `shopLevels`, `bands`, `choiceEvents`, `choiceAndEnemyEffects`, **`_criticAddendum`** (income, freeze, hand, bandDraft, bannedOperators, enemyStatMultipliers, specialPhase…) |
|
||||
| `02-bonds.md` / `02-bonds.json` | All 23 bonds (8 core, 15 add-on): activation, layer formulas, tier effects, layer sources and readers, band/choice/item interactions. Addendum: 华法琳 cap 12/24, ban interplay. | `bonds[*]`, `layerGarrisons`, `layerScalingGarrisons`, `bondGrantingItems` |
|
||||
| `03-operators.md` / `03-operators.json` | 133 chess ×2 (normal/elite): stats at the tier's status, range grids, the default skill with blackboard, talents, module, 特质 (garrison) blackboards, tokens, distribution. Addendum: **skill-trigger correction**, summons and hand, deploy rules, DIY. | `chess[*].stats/rangeGrid/skill/talents/garrisons/module`, `tokensUsedByPool`, `skillTriggerDataList` |
|
||||
| `04-items.md` / `04-items.json` | 56 equipment ×2 + 3 Arts: effects, formulas, merge, sources, 变形同构体 table, VI-tier combos. Addendum: **items can't be sold**, 机变 item card formats. | `items[*]`, `itemSources`, `bondGrantTable_for_变形同构体` |
|
||||
| `05-enemies-levels.md` / `05-enemies.json` / `05-maps.json` | Stage terrains (8 active), 38 wave templates with routes, 326 enemies, special-enemy pools, generation algorithm, bosses, bounties, LP rules. Addendum: DP, hidden-core thresholds, multi FUNNY rounds, stat scaling. | `05-maps.json: stages, roundLevels`; `05-enemies.json: enemies, specialEntries, bosses, bountyEffects, generation, _criticAddendum` |
|
||||
| `06-multiplayer-ux.md` | Co-op flow and state machine, 联防, shared vs individual, shared pool, cross-player effects, emotes and broadcasts, settlement, per-screen UI layout, style guide, server notes. Addendum: TL;DR fixes, banned-operator UI. | – |
|
||||
| `07-assets.md` / `07-assets.json` | Verified URL patterns and resolved URLs for avatars, portraits, skills, bond/item/band icons, UI, Spine (ops + enemies), BGM/SFX, fonts; build plan. Addendum: spot check 40/40 OK. | `operators[*]`, `enemies[*]`, `bonds`, `items`, `bands`, `autochessUi`, `audio` |
|
||||
|
||||
## 2. Match structure
|
||||
|
||||
| Item | Value | Tag |
|
||||
|---|---|---|
|
||||
| Players | Co-op 1–4 (PvE, no PvP). Solo 1. Tutorial = 1 human + 3 NPCs. | DATA/VERIFIED |
|
||||
| Modes | FUNNY 标准, NORMAL 险境, HARD 绝境, ABYSS 终极 (×solo/multi), plus training. FUNNY disables 10 bonds (laterano, egir, kazimierz, skillful, arcane, mira, invest, raid, solo, sunt) and 18 enemy keys; NORMAL disables the same 18 enemy keys. | DATA |
|
||||
| Rounds | Multi: FUNNY 14; NORMAL/HARD/ABYSS 14 + hidden R15. Solo: FUNNY **9** (boss R9); others 14 + R15. | DATA |
|
||||
| Pre-game | INFO_CHECK 25 s → BAND_CHECK 50 s (co-op: random-order sequential picks, one skip each, duplicates allowed, timeout → 华法琳) → BATTLE_CHECK 3 s | DATA/VERIFIED |
|
||||
| SP (机变) rounds (`isSpPrepare`) | multi FUNNY 3, 9 · multi NORMAL 3, 6, 9 · HARD/ABYSS 3, 9, 11 · solo NORMAL 6, 9 · solo FUNNY none | DATA |
|
||||
| 机变 format | Multi: 6 shared cards of one family; random pick order; 30 s first, 16 s others; timeout auto-assign. Solo: 3 cards, no timer. Opens at prep start, after income. | DATA/VERIFIED |
|
||||
| Round flow | round start (income, −1 upgrade price, wipe temp hand, refresh unfrozen slots, <进入休整期时> effects) → [机变] → prep → <休整期结束时> → combat (all boards in parallel, 2× speed) → 联防 if needed → LP loss → next | VERIFIED |
|
||||
|
||||
**Timers, co-op (s)** [DATA]. Solo in 下半 has **no** prep or 机变 timer.
|
||||
|
||||
| Round | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| Prep | 65 | 65 | 65 | 95 | 95 | 100 | 105 | 105 | 125 | 125 | 125 | 125 | 150 | 195 | 195 (HARD/ABYSS 215) |
|
||||
| Combat limit (`maxPlayTime`, game s [ASSUMED unit]) | 45 | 45 | 55 | 55 | 55 | 70 | 85 | 85 | 95 | 95 | 115 | 115 | 115 | boss | boss |
|
||||
| Wave level | 01 | 02 | 03 | 04 | 05 | 06 | 07 | h01 | h02 | h03 | h04 | h05 | h06 | h07_0X | h08_0X |
|
||||
|
||||
Boss rounds: the battle continues past the timer. Merged team LP drains **1/s after 150 s** (`bossTurnHpReduceTime`).
|
||||
|
||||
## 3. Economy
|
||||
|
||||
| Item | Value | Tag |
|
||||
|---|---|---|
|
||||
| Income per round | **4, 5, 6, 7, 8, 9, 10, 11, 12, 12…** = `min(3+r, 12)`. The same in every mode (no FUNNY bonus). Paid at round start. | R1–R3 VERIFIED; +1/round and cap 12 ASSUMED (alt cap 10) |
|
||||
| Leftover funds | Lost at prep end, except band 坎诺特 (carry over; +1 if ≥5 left) | VERIFIED |
|
||||
| Buy operator | T1 **2** · T2 **3** · T3 **3** · T4 **3** · T5 **4** · T6 **4** | DATA |
|
||||
| Buy item | 1–5 by item (`purchasePrice` of the `_a` entry). Golden items are never sold in the shop. | DATA |
|
||||
| Refresh | **1** (rerolls all slots, including frozen ones) | DATA/VERIFIED |
|
||||
| Freeze | Free. **One toggle freezes all unsold slots** until the next round start. | VERIFIED |
|
||||
| Sell operator | **+1** (normal or elite, from board or hand) | DATA/VERIFIED |
|
||||
| Sell item | **Not possible.** Destroy only, for 0. | VERIFIED |
|
||||
| Upgrade price (Lk→k+1) | NORMAL/HARD/ABYSS: **5, 8, 11, 12, 13** · multi FUNNY: 5, 8, 10, 11, 11 · solo FUNNY: 1, 1, 5, 8, 10 · training: 4, 4, 6, 9, 12. **−1 per round start (floor 0); resets to the next base after upgrading.** | DATA/VERIFIED |
|
||||
| Shop slots (ops + item) | NORMAL+: 3/4/4/5/5/5 + 1 · FUNNY: 3/4/4/4/4/5 + 1 · training: 3 ×6, item from L5 | DATA |
|
||||
| Shop cleared | Unfrozen slots are emptied at combat start and refilled at round start. | VERIFIED |
|
||||
| Bounty coins | 1–6 per bounty enemy, to its killer (a 联防 helper counts). 战术特训: paid only on a perfect clear in your own phase. | DATA |
|
||||
|
||||
**Shared pool (co-op), copies per operator:** T1 **12**, T2 **14**, T3 **18**, T4 **16**, T5 **8**, T6 **5** (缪尔赛思 4). An elite counts as 3. Every owned copy counts; shop displays don't. Eliminated or quitting players return their copies. [COMM, two independent sources]
|
||||
|
||||
**Shop odds [ASSUMED; the official odds are unpublished].** Each slot draws 1 copy uniformly from all remaining pool copies of unbanned, non-hidden chess with tier ≤ shop level. Duplicates in one roll are allowed; a screenshot shows 2× 蛇屠箱 in one roll. Resulting tier shares with full pools and no bans:
|
||||
|
||||
| Shop Lv | T1 | T2 | T3 | T4 | T5 | T6 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 1 | 100 % | – | – | – | – | – |
|
||||
| 2 | 44.7 % | 55.3 % | – | – | – | – |
|
||||
| 3 | 24.9 % | 30.8 % | 44.3 % | – | – | – |
|
||||
| 4 | 17.1 % | 21.2 % | 30.4 % | 31.3 % | – | – |
|
||||
| 5 | 15.0 % | 18.7 % | 26.8 % | 27.6 % | 11.9 % | – |
|
||||
| 6 | 14.0 % | 17.4 % | 25.0 % | 25.7 % | 11.1 % | 6.9 % |
|
||||
|
||||
The visible chess per tier are 16/17/19/22/19/19. The item slot uses the same tier shares, then picks uniformly within the tier [ASSUMED].
|
||||
|
||||
**Merge:** 3 copies of the same chess (board or hand) merge into 1 elite (`_b`), sent to the **hand**. 风丸 needs 2. Elites never merge. The equipment of the merged copies returns to the hand. Reward: the shop temporarily shows 3 operators of tier min(shopLv+1, 6) at price **0**; take 1; no refresh or freeze; gone at round end. A purchase that completes a merge is allowed with a full hand. [VERIFIED]
|
||||
|
||||
## 4. Board, hand, combat
|
||||
|
||||
| Item | Value | Tag |
|
||||
|---|---|---|
|
||||
| Deploy cap | **8** (`characterLimit`); **9** with 人事部文档. Summons don't use a slot [ASSUMED]. | DATA/VERIFIED |
|
||||
| Hand (整备区) | **10 regular + 5 temporary**, shared by operators, items and summon stacks. Full ⇒ no buy or withdraw. Passive overflow goes to temp; **temp blocks Ready**; temp is wiped at the next phase. Board↔hand swap is allowed when full. | VERIFIED |
|
||||
| Equipment | 2 per operator (board **or** hand). Locked; 3rd = replace, and the old one is destroyed. 2 identical normal items (equipped or not) merge into golden. | VERIFIED |
|
||||
| Deployment | Free, at t=0, order **top→bottom then left→right** (right-side boss player mirrored). Ranged units may use melee tiles. | VERIFIED |
|
||||
| DP | Start **10**, **+1/s**, cap **99**. Used only for auto-redeploy (original tile, respawn timer done, DP ≥ `cost`). | DATA/VERIFIED |
|
||||
| Skill auto-cast | Default: SP ready + about to attack/heal + an enemy in the **initial** range. `skillTriggerDataList` rows with `skillIndex` 0 = **skill 1 only** (TANK S1 → on damage: only 古米 and 灰毫 this season). charId rows per 03. | VERIFIED |
|
||||
| Speed | 2× forced, no manual control | VERIFIED |
|
||||
| Board geometry | 19×21 stage. Player board rows 9–12, cols 2–10. Gates (9,10) and (12,10); R1–3 use only the lower one. Goal (9,2). Col 9 is a non-deployable lane. Hand row 7 cols 0–9. Temp hand row 8 cols 4–8. Boss field rows 1–5. | DATA |
|
||||
| Bond counting | Distinct operators on board. 远见/奇迹/投资人 also count the hand. 绝技 counts elites. Layers persist all match; **no IN_BATTLE layer gains in 联防 or boss rounds**. | DATA/VERIFIED |
|
||||
|
||||
## 5. LP, 联防, Final Assault, Hidden Core
|
||||
|
||||
| Item | Value | Tag |
|
||||
|---|---|---|
|
||||
| Starting LP | Band `totalHp`: 20 (铃兰) … 45 (歌利亚); default 华法琳 28 | DATA |
|
||||
| Normal-round loss | 1 per enemy not killed (reached the goal or alive at timeout), **max 10 per round per player** | DATA/VERIFIED |
|
||||
| 联防 | Runs if ≥1 player leaked and ≥1 was perfect. **≤2 perfect helpers** keep HP%, SP and positions, and fight the union of leaked enemies (`escaped_single` / `escaped_multi`). No layer gains. Survivors cost their **source** player LP (cap 10). | VERIFIED |
|
||||
| Elimination | LP ≤ 0: out; copies return to the pool | VERIFIED/COMM |
|
||||
| Final Assault (R14) | LP of all alive players **merged**, no cap. Players in pairs, and an **odd player alone**. Movable bosses spawn one per alive player's side and share one HP pool. Overtime −1 LP/s after 150 s. Wave leaks cost `lifePointReduce`. | VERIFIED |
|
||||
| Boss HP pool (`bloodPoint`, F/N/H/A) | boss_1 247.5k/675k/1.8M/3.6M · boss_2 225k/400k/800k/3M · boss_3 285k/708.75k/2M/4M · boss_4 307.5k/708.75k/2.1M/4.2M · boss_5 200k/390k/780k/3M · boss_6 285k/705k/1.99M/3.98M · boss_7 277.5k/787.5k/2M/4M. Pick weights 6/6/6/5/10/5/5. | DATA |
|
||||
| Hidden Core (R15, 险境+) | Solo: activated layers **> 350** and LP > 1. Co-op: team sum **> 1200** and merged LP > 1. Bosses boss_8/9/10 (weights 50/40/40; HP N 937.5k/900k/1.0125M, H 3.6M/2.8M/3.8M, A 7.2M/3.95M/7.6M). Failure doesn't affect the clear. | VERIFIED/DATA |
|
||||
|
||||
**Enemy scaling (non-boss)**, per mode and round [VERIFIED via PRTS, user-sourced]:
|
||||
- `atk × base × 1.1^k`, `hp × base × 1.2^k`.
|
||||
- Base values: solo FUNNY/NORMAL 0.7 (HP 0.75 per data), solo HARD 0.8, solo ABYSS 1.0, multi FUNNY/NORMAL 0.8, multi HARD/ABYSS 1.0.
|
||||
- k climbs to 5 (solo NORMAL), 4 (solo HARD), 7 (solo ABYSS), 1 (multi FUNNY), 7 (multi NORMAL) and 8 (multi HARD/ABYSS) by R14.
|
||||
- ABYSS also gets move speed ×1.15 from R3.
|
||||
- Full round-by-round arrays: `01-core-data.json → _criticAddendum.enemyStatMultipliers`.
|
||||
|
||||
## 6. Per-match bans (VERIFIED rule)
|
||||
|
||||
The server draws a disabled bond set **D**: **3 core + 4 add-on** in NORMAL/HARD/ABYSS (observed in ABYSS; [ASSUMED] for NORMAL/HARD), and **the static list + 0 core + 1 add-on** in FUNNY. Weight-0 bonds are never drawn.
|
||||
|
||||
**An operator is banned iff all its bonds ∈ D.** At 3 + 4 that averages ≈22 banned operators. The briefing shows lit and greyed bonds plus the banned list; the in-match dropdown shows banned counts per bond. The rule reproduces a real screenshot's counts (7/6/5/5/5/4/3) exactly (01 A2).
|
||||
|
||||
## 7. Contradictions found and resolved
|
||||
|
||||
| Topic | Conflict | Resolution |
|
||||
|---|---|---|
|
||||
| Hidden-core thresholds | 05: 300/1000 vs 01/02/06: 350/1200 | **350/1200** (下半); 300/1000 was 上半 |
|
||||
| DP | 05: initialCost 0 vs 01/06: 10 | **10**. 05 read the terrain file, not the round level. |
|
||||
| FUNNY round count | 05: 9 | Solo 9, **multi 14** |
|
||||
| Enemy multipliers | 06: flat 0.7/0.8; 01: per-mode table; 05: invented mapping | Per-round table (§5) |
|
||||
| Freeze | 01: per slot | **Whole shop, one toggle** |
|
||||
| Item sell | 04: 1 fund | **Not sellable** (destroy for 0) |
|
||||
| 机密商店 | 04: 3 items of tier ≥ IV | **6 cards (multi), any tier I–VI, duplicates allowed** |
|
||||
| Band choice | 01: 3 random + reroll; 06: full grid draft | **Full grid, random order, one skip, duplicates allowed** |
|
||||
| Banned bonds | 01: 1 core + 1 add-on | **3 + 4 (NORMAL+), subset rule** |
|
||||
| TANK skill rule | 03: any skill index | **Skill 1 only** |
|
||||
| 联防 partner rule | 01: fewest leaks | Meaningless; **highest LP, then seat** [ASSUMED] |
|
||||
| FUNNY income bonus | 01: +2 | **None** (official intro shows 4 at R1 in 标准) |
|
||||
| 华法琳 granted cap | data 7/14 vs patch 12/24 | **12/24** (official 3/27 notice) |
|
||||
|
||||
## 8. Remaining open questions, with recommended defaults
|
||||
|
||||
| # | Question | Default (config) |
|
||||
|---|---|---|
|
||||
| 1 | Income after R3 and its cap | +1/round, **cap 12** (alt 10) |
|
||||
| 2 | Shop tier odds | Copy-weighted pool draw (table in §3); a per-level odds table as an optional override |
|
||||
| 3 | Item slot odds and server pools `pool_equip_*` | Same tier shares; pool contents as in 04 §8 |
|
||||
| 4 | Disabled-bond counts for NORMAL/HARD | 3 core + 4 add-on |
|
||||
| 5 | 机变 family per SP round, card pools, 道具补给 tiers | 01 A4 table: HARD+ R3/R9 悬赏, R11 道具补给/机密商店. 道具补给 tier windows R3 I–IV, R6 II–V, R9 III–VI, R11 IV–VI. |
|
||||
| 6 | Boss HP pool vs alive players | `bloodPoint × alive/4`; solo ×0.25 |
|
||||
| 7 | Pair order in the Final Assault | Alive players by seat: (1,2), (3,4); an odd player gets an `_s` map |
|
||||
| 8 | 联防 helper choice when >2 are perfect; leaked-enemy HP | Highest LP, then seat; leaked enemies re-enter at full HP |
|
||||
| 9 | Per-turn band-draft timer | 12 s, with the 50 s step cap |
|
||||
| 10 | Unit of `maxPlayTime` | Game seconds (the sim runs 2× real-time) |
|
||||
| 11 | Do summons use deploy slots? | No |
|
||||
| 12 | Special-enemy replacement counts and faction pick | 05 §3.2 algorithm (`k = clamp(round(be_t/be_new), 1, 5)`) |
|
||||
| 13 | Do A3 multipliers apply to bounty and special enemies? | Yes, the current round's k |
|
||||
| 14 | Title (评语) criteria | 06 §10.5 mapping; one title per player, each title used once |
|
||||
| 15 | 炎佑 spawn, AI and model; token Spines | 02 §3.1 assumptions; 07 §5.6 fallbacks |
|
||||
| 16 | DIY (甄选) slots | Disabled in v1; curated 6★ list in v2 |
|
||||
| 17 | Co-op disconnect | Keep the seat; auto-ready at the deadline; auto-pick drafts; optional AI takeover |
|
||||
| 18 | Hidden boss selection | Weighted 50/40/40, independent of the R14 boss |
|
||||
| 19 | Tile rendering | Procedural (no 2D map art exists); see 07 §7 |
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,926 @@
|
||||
# 01 · Core Rules: loop, economy, shop, rounds, modes, strategies (bands)
|
||||
|
||||
Scope: 卫戍协议:盟约. The season data is `act2autochess` (盟约 下半, CN start 2026‑03‑14). The data key `act1autochess` is 盟约 上半, kept here for reference only.
|
||||
|
||||
Machine-readable companion: `01-core-data.json`. It holds every table below plus the raw data. That includes the per-mode round schedule, shop tables, all 40 bands with buff blackboards, choice effects, tips, broadcasts, bosses and reward factors.
|
||||
|
||||
Confidence tags used throughout:
|
||||
- **[DATA]**: read directly from the client game data (`activity_table.json` and the level JSON files).
|
||||
- **[WIKI]**: taken from official help text as quoted by PRTS or BWIKI, or from the official patch notes.
|
||||
- **[COMM]**: community-measured (NGA, Bahamut, bilibili, note.com).
|
||||
- **[INFER]**: derived from the data by arithmetic.
|
||||
- **[ASSUMED]**: not documented anywhere I could find. These are proposed values that we can tune.
|
||||
|
||||
---
|
||||
|
||||
## 0. TL;DR constants for the server
|
||||
|
||||
| Constant | Value | Tag |
|
||||
|---|---|---|
|
||||
| Funds per round | R1=4, R2=5, R3=6, then +1/round, capped at **10** | R1–R3 [INFER from band_lmlee: R1+R2+R3 = 15]; growth and cap [ASSUMED] |
|
||||
| Standard (FUNNY) mode | +2 funds/round on top of the above | [ASSUMED] ("初始资源更加丰富") |
|
||||
| Leftover funds | Lost when the prep phase ends. Only band 坎诺特 keeps them. | [WIKI] |
|
||||
| Refresh | 1 fund (`shopRefreshPrice`=1) | [DATA][WIKI] |
|
||||
| Sell any operator (normal or elite) | +1 fund (`chessSoldPrice`=1) | [DATA][WIKI] |
|
||||
| Buy operator, by tier I..VI | 2 / 3 / 3 / 3 / 4 / 4 | [DATA] |
|
||||
| Shop upgrade price (NORMAL/HARD/ABYSS, both solo and multi), level 1→2…5→6 | 5, 8, 11, 12, 13 | [DATA] |
|
||||
| Upgrade price change | −1 per round (floor 0). Resets to the next level's base after an upgrade. | [WIKI] |
|
||||
| Shop slots (operators + items) | 3+1 / 4+1 / 4+1 / 5+1 / 5+1 / 5+1 (NORMAL+). `storeCntMax`=6 | [DATA] |
|
||||
| Board cap / bench cap | 8 (`maxBattleChessCnt`) / 10 (`maxDeckChessCnt`) | [DATA] |
|
||||
| Max LP lost per normal round | 10 (`costPlayerHpLimit`) | [DATA][WIKI] |
|
||||
| Starting LP | the band's `totalHp` (20–45) | [DATA] |
|
||||
| Merge | 3 identical → elite (精锐). 风丸 needs only 2. Elites never merge further. | [DATA] |
|
||||
| Promotion reward | Free pick of 1 from 3 random operators of tier min(shopLevel+1, 6) | [COMM] |
|
||||
| Shared pool copies per operator, tier I..VI | 12 / 14 / 18 / 16 / 8 / 5. An elite occupies 3 copies. | [COMM] |
|
||||
| Rounds: multi FUNNY / other multi / solo FUNNY / other solo | 14 / 14 (+15 hidden) / 9 / 14 (+15 hidden) | [DATA] |
|
||||
| Players (同盟模拟) | up to 4, co-op PvE | [WIKI] |
|
||||
|
||||
---
|
||||
|
||||
## 1. Modes (`modeDataDict`) [DATA]
|
||||
|
||||
`modeType`: LOCAL = tutorial, SINGLE = 独立模拟 (solo), MULTI = 同盟模拟 (co-op, up to 4 players; also called 联合模拟 in tips).
|
||||
|
||||
| modeId | Name / code | Type | Difficulty | specialPhaseTime (s) | Active bonds | Unlock (`preposedMode`) | effectDescList |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| mode_training_1 | 入门协议 AC‑TR‑1 | LOCAL | TRAINING | 150 | all 23 | – | ·仅可使用预置的调配干员 ·无奖励 ·无法用于解锁策略 |
|
||||
| mode_single_funny | 标准模拟 AC‑1 | SINGLE | FUNNY | 150 | 13 (10 inactive) | training | ·可以快速完成作战 ·常规奖励 |
|
||||
| mode_single_normal | 险境模拟 AC‑2 | SINGLE | NORMAL | 150 | 23 | funny (solo or multi) | ·可使用盟约数增加 ·大幅增加奖励 |
|
||||
| mode_single_hard | 绝境模拟 AC‑3 | SINGLE | HARD | 150 | 23 | normal | ·作战环境困难 ·出现更加危险的敌人 |
|
||||
| mode_single_abyss | 终极模拟 AC‑4 | SINGLE | ABYSS | 150 | 23 | hard ×2 ("通关2次【绝境模拟】") | ·作战环境无比困难 ·出现极度危险的敌人 (startTime 2026‑03‑27) |
|
||||
| mode_multi_funny | 标准模拟 | MULTI | FUNNY | 16 | 13 | training | ·作战环境较为温和 ·常规奖励 |
|
||||
| mode_multi_normal | 险境模拟 | MULTI | NORMAL | 16 | 23 | funny | as solo |
|
||||
| mode_multi_hard | 绝境模拟 | MULTI | HARD | 16 | 23 | normal | as solo |
|
||||
| mode_multi_abyss | 终极模拟 | MULTI | ABYSS | 16 | 23 | hard ×2 | as solo |
|
||||
|
||||
- **FUNNY inactive bonds:** lateranoShip, egirShip, kazimierzShip, skillfulShip, arcaneShip, miraShip, investShip, raidShip, soloShip, suntShip.
|
||||
- **FUNNY and NORMAL also disable 18 dangerous enemies** (`inactiveEnemyKey`, e.g. `enemy_1112_emppnt`, `enemy_1207_sfji`, `enemy_1072_dlancer`…). HARD and ABYSS have none disabled.
|
||||
- **Mode description (PRTS 下半):** 标准模拟 = "轻松的协议模式,作战环境较为温和,**初始资源更加丰富**,升级条件更加宽松。无法使用全部盟约。可获得卫戍认证并解锁策略。"
|
||||
|
||||
Enemy HP and ATK multipliers by mode [WIKI, PRTS 下半]:
|
||||
|
||||
| | FUNNY | NORMAL | HARD | ABYSS |
|
||||
|---|---|---|---|---|
|
||||
| 独立 (solo) | ×0.7 | ×0.7 | ×0.8 | ×1.0 |
|
||||
| 同盟 (multi) | ×0.8 | ×0.8 | ×1.0 | ×1.0 |
|
||||
|
||||
Solo is shorter and uses lower enemy numbers. Solo has no time limit on prep or choice phases in 下半. You may leave and return within 24 h (`singleReconnectTime`=86400). Trophies (奖杯) are **only** awarded in multi [WIKI + tip].
|
||||
|
||||
Reward currency: 卫戍认证 (`act2autochess_token_chess`).
|
||||
|
||||
- **Formula:** `baseRewardDataList[roundsCleared].count × difficultyFactor × modeFactor` [INFER; verified against the 250/400/425 per full clear reported on note.com].
|
||||
- **baseRewardDataList (round → count):** 10, 20, … 100 (R10), 120, 140, 160, 200 (R14).
|
||||
- **difficultyFactor:** FUNNY 1.0, NORMAL 1.6, HARD 1.7, ABYSS 1.7.
|
||||
- **modeFactor:** 1.25 for both SINGLE and MULTI.
|
||||
- **Daily bonus:** earn 200 → +300 ("每日防卫目标", resets 04:00).
|
||||
|
||||
### Training (入门协议)
|
||||
- **Format:** 4 rounds on stage `act1autochess_m01`.
|
||||
- **Players:** band 歌利亚 (`band_sarkazb`, 45 LP) plus 3 NPC teammates (`trainingNpcList`: 华法琳/阿米娅/杜遥夜 bands). Preset operators only.
|
||||
- **Boss:** `boss_7` (“萨米的意志”) in R4. R3 has a choice event (`equip_free_1_tr`).
|
||||
- **Enemy types:** FLY, TIMES, ELEMENT.
|
||||
- **Bonds:** `trBondIds` = 14 bonds, of which 5 are banned (`trBannedBondIds`: kjerag, stead, indom, swift, visi).
|
||||
- **Shop:** L1–L6 upgrade 4/4/6/9/12/99. 3 operator slots at every level; the item slot appears only at L5+.
|
||||
- **Prep time:** 999 s.
|
||||
|
||||
---
|
||||
|
||||
## 2. Match lobby → start (`enterStepList`) [DATA]
|
||||
|
||||
| Step | Time (s) | Hint at (s) | Title |
|
||||
|---|---|---|---|
|
||||
| INFO_CHECK | 25 | 5 | 确认本局信息 |
|
||||
| BAND_CHECK | 50 | 15 | 选择策略 |
|
||||
| BATTLE_CHECK | 3 | 0 | 协议启动 |
|
||||
|
||||
**INFO_CHECK** shows the match configuration. The screen shows:
|
||||
- the stage map (`stageDatasDict`, weight 50 each): FUNNY = act1 m01 only; NORMAL = act1 m01–m04 + act2 m01–m04; HARD/ABYSS = act1 m02–m04 + act2 m01–m04. act1 m05–m07 have weight 0 (unused);
|
||||
- the R14 boss (weighted: boss_1 胄 6, boss_2 铳 6, boss_3 管 6, boss_4 昆图斯 5, boss_5 卢西恩 10, boss_6 阿利斯泰尔 5, boss_7 萨米的意志 5);
|
||||
- the special-enemy types (3 of FLY/TIMES/ELEMENT/DOT/INVISIBLE/REFLECTION, `specialEnemyNum`=3);
|
||||
- the **banned bonds ("B位")**. Bonds with `weight`=10 are bannable. 投资人, 调和, 协防, 绝技 have weight 0 and are never banned.
|
||||
- Number banned per match: [ASSUMED] 1 core + 1 add-on. The exact count was not found.
|
||||
- Tip: "归属于特定盟约的干员只有部分会出现在调度中心内". Proposal: an operator is removed from the pool only if *all* its bonds are inactive or banned [ASSUMED].
|
||||
|
||||
**BAND_CHECK:** each player picks one strategy ("策略/分队" = band) from the unlocked bands.
|
||||
- Tip: "联合模拟在选择策略时可以进行一次跳过". [ASSUMED] Each player is offered 3 random unlocked bands and may reroll once.
|
||||
- Bands are not exclusive between teammates [ASSUMED].
|
||||
- Clearing 3 times with a band (`victorCount`=3) grants a corner badge (角标).
|
||||
|
||||
**Before the match (out-of-match loadout):**
|
||||
- Players fill 2 DIY slots at tier V and 2 at tier VI (`chess_char_5_diy1/2`, `chess_char_6_diy1/2`) with their own operators. Community: "自己五阶放一个白铁".
|
||||
- They can borrow up to **20 support operators** (`borrowCount`=20; "助战8变20人"). These cover NORMAL-type chess they don't own. Otherwise the chess falls back to `backupCharId`.
|
||||
|
||||
---
|
||||
|
||||
## 3. Round schedule [DATA]
|
||||
|
||||
Columns: `turnInfoDataDict` (prep time, boss flags), `battleDataDict` (level, SP flag) and each level's `options.maxPlayTime` (combat time limit).
|
||||
|
||||
Definitions:
|
||||
- `normalPhaseTime` = **prep (休整期) time limit in seconds**. Solo = 300. PRTS 上半: "各轮次均有300秒的决策时间"; in 下半 solo prep became unlimited.
|
||||
- `isSpPrepare` = this round's prep is preceded by a **机变阶段** (choice event). Community counts it as "decision after round N−1".
|
||||
- `specialPhaseTime` = the choice-phase timer: multi 16 s per picker (first picker 30 s, ~70 s total); solo 150 s, unlimited in 下半.
|
||||
- Combat (`maxPlayTime`) is the round level's time limit. Enemies still alive at the limit count as leaked [ASSUMED; community "超时" complaints agree].
|
||||
- All round levels have DP `initialCost`=10, +1 DP/s, max 99, 8 deploy slots.
|
||||
|
||||
### Multi (同盟) — NORMAL / HARD / ABYSS (FUNNY = same but ends at R14 and SP rounds differ)
|
||||
|
||||
| R | Prep s | Combat s | Level | SP before prep (FUNNY / NORMAL / HARD+ABYSS) | Notes |
|
||||
|---|---|---|---|---|---|
|
||||
| 1 | 65 | 45 | act1_01 | – | first 3 rounds: enemies only use the lower red gate [COMM] |
|
||||
| 2 | 65 | 45 | act1_02 | – | |
|
||||
| 3 | 65 | 55 | act1_03 | ✔ / ✔ / ✔ | decision after R2 |
|
||||
| 4 | 95 | 55 | act1_04 | | upper route enemies from R4 [COMM] |
|
||||
| 5 | 95 | 55 | act1_05 | | |
|
||||
| 6 | 100 | 70 | act1_06 | – / ✔ / – | decision after R5 (NORMAL) |
|
||||
| 7 | 105 | 85 | act1_07 | | |
|
||||
| 8 | 105 | 85 | act1_h01 | | |
|
||||
| 9 | 125 | 95 | act1_h02 | ✔ / ✔ / ✔ | decision after R8 |
|
||||
| 10 | 125 | 95 | act1_h03 | | |
|
||||
| 11 | 125 | 115 | act1_h04 | – / – / ✔ | decision after R10 (HARD+) |
|
||||
| 12 | 125 | 115 | act1_h05 | | |
|
||||
| 13 | 150 | 115 | act1_h06 | | |
|
||||
| 14 | 195 | boss (120 s level; −1 LP/s after `bossTurnHpReduceTime`=150 s) | h07_0X (boss_1..7) | | **最终攻势** (Final Assault). Last round for FUNNY. |
|
||||
| 15 | 195 (NORMAL) / 215 (HARD, ABYSS) | boss | h08_0X (boss_8..10) | | **隐秘核心** (Hidden Core); only if its conditions are met (§10) |
|
||||
|
||||
### Solo (独立)
|
||||
|
||||
| Mode | Rounds | SP rounds (`isSpPrepare`) | Prep | Notes |
|
||||
|---|---|---|---|---|
|
||||
| single_funny | **9** | none | 300 | R9 = boss (uses `_S` boss levels). No decisions. |
|
||||
| single_normal | 14 (+15) | 6, 9 (decisions after R5 = 道具补给, R8 = 战术决策) | 300 | |
|
||||
| single_hard | 14 (+15) | 3, 9, 11 | 300 | |
|
||||
| single_abyss | 14 (+15) | 3, 9, 11 | 300 | |
|
||||
|
||||
Solo boss levels are the `…_S` variants (`level_act1autochess_h07_0X_S`).
|
||||
|
||||
Bosses (`bossInfoDict`, HP pool by difficulty FUNNY / NORMAL / HARD / ABYSS) [DATA]:
|
||||
|
||||
| bossId | Enemy | Pick weight | HP F / N / H / A | Hidden |
|
||||
|---|---|---|---|---|
|
||||
| boss_1 | 假想敌:胄 | 6 | 247 500 / 675 000 / 1 800 000 / 3 600 000 | |
|
||||
| boss_2 | 假想敌:铳 | 6 | 225 000 / 400 000 / 800 000 / 3 000 000 | |
|
||||
| boss_3 | 假想敌:管 | 6 | 285 000 / 708 750 / 2 000 000 / 4 000 000 | |
|
||||
| boss_4 | 盐风主教昆图斯 | 5 | 307 500 / 708 750 / 2 100 000 / 4 200 000 | |
|
||||
| boss_5 | 卢西恩,“猩红血钻” (new in act2) | 10 | 200 000 / 390 000 / 780 000 / 3 000 000 | |
|
||||
| boss_6 | 阿利斯泰尔,帝国余晖 | 5 | 285 000 / 705 000 / 1 990 000 / 3 980 000 | |
|
||||
| boss_7 | “萨米的意志” | 5 | 277 500 / 787 500 / 2 000 000 / 4 000 000 | |
|
||||
| boss_8 | 假想敌:胄 (hidden) | 50 | 750 000 / 937 500 / 3 600 000 / 7 200 000 | ✔ |
|
||||
| boss_9 | 假想敌:铳 (hidden) | 40 | 675 000 / 900 000 / 2 800 000 / 3 950 000 | ✔ |
|
||||
| boss_10 | 假想敌:管 (hidden) | 40 | 825 000 / 1 012 500 / 3 800 000 / 7 600 000 | ✔ |
|
||||
|
||||
Boss HP scaling:
|
||||
- The boss HP is one shared pool for the whole team.
|
||||
- It shrinks when teammates are eliminated or leave [COMM: "联机队友变少,最后boss血条也会变少"].
|
||||
- Proposal: `hp = bloodPoint × alivePlayers / 4` [ASSUMED]. Solo uses `bloodPoint × 0.25` [ASSUMED].
|
||||
|
||||
---
|
||||
|
||||
## 4. Phase flow of one round
|
||||
|
||||
```
|
||||
[round start] ──► (机变阶段 if isSpPrepare) ──► 休整期 (prep) ──► 各自行动阶段 (own combat) ──► 联防 (unite, multi only, if needed) ──► 结算 (settlement) ──► next round
|
||||
```
|
||||
|
||||
### 4.1 Round start ("进入休整期时") — proposed server order [WIKI + ASSUMED order]
|
||||
1. `round += 1`. If round > 1: `upgradePrice = max(0, upgradePrice − 1)` [WIKI: "升级调度中心所需的资金每回合-1直至0,升级后重置"].
|
||||
2. `funds = income(round)` + pending coins earned since the last prep (bounties, 暴行-type "下回合加钱", band 玛恩纳, etc.).
|
||||
- Funds do **not** carry over [WIKI: "没有用完的资金无法留到下一回合"].
|
||||
- Exception, band 坎诺特 (`coin_carry_over {capital:5, interest:1, max:1}`): keep leftovers, +1 if leftover ≥ 5.
|
||||
3. Destroy everything in the 临时整备区 (temporary overflow bench) [tip: "处于临时整备区的调度资源,在进入下一回合后会自动销毁"].
|
||||
4. If `isSpPrepare`: run the 机变阶段 choice (§12) before the shop opens.
|
||||
5. Free automatic shop refresh of all **non-frozen** slots [ASSUMED, auto-chess convention]. Promotion-reward slots from last round are gone.
|
||||
6. Fire "<进入休整期时>" effects: bands (e.g. 小贾斯汀 R1/4/7/10, 杰西卡 R4/7/10/13, 松桐 on even rounds…), operator traits (garrison), equipment.
|
||||
7. Start the prep timer (`normalPhaseTime`; solo unlimited in 下半).
|
||||
|
||||
### 4.2 Prep (休整期): what a player can do [WIKI/tips/COMM]
|
||||
- **Buy** an operator (tier price) or an item from the shop. Bought units go to the bench (待部署区/整备区, max 10). If the bench is full, they go to the temp area and are destroyed at the next round.
|
||||
- **Sell** any operator or item for **1 fund** by dragging it to the shop area. Tip: "拖拽干员至整备区可以直接撤退干员" = drag a board unit to the bench to un-deploy it.
|
||||
- **Refresh** the shop: 1 fund. Several effects make refreshes free: 奇迹 bond proc, the "补给" choice.
|
||||
- **Freeze** shop slots. Tip: "调度中心即使冻结,依然可以主动刷新". [ASSUMED] Freezing is per slot and free. Frozen slots survive refreshes and the next round start; toggle to unfreeze.
|
||||
- **Upgrade** the 调度中心 (shop level 1→6) at the current price. Broadcast: "{0}博士将调度中心等级提升为{1}级".
|
||||
- **Arrange** the board: max 8 deployed operators. Grid position matters for traits (前方/周围4格/8格, 同一行, 最右边…).
|
||||
- **Equip** items to operators on the board or the bench (下半 allows the bench). Use 法术 (MAGIC) items on map tiles.
|
||||
- **Look** at teammates' boards and at the enemies for this round (right-top magnifier: route / enemy preview).
|
||||
- **Emotes** (multi). **Ready** (准备): cancellable until all players are ready. Once everyone is ready, combat starts ("全体参与者就绪之前可随时取消准备").
|
||||
- At prep end: fire "<休整期结束时>" effects (e.g. 助力 +2 layers to all active bonds), then funds are cleared.
|
||||
|
||||
### 4.3 Combat (各自行动阶段)
|
||||
Each player fights their own copy of the round level independently. There is no PvP.
|
||||
- **Deployment:** automatic, paying DP (start 10, +1/s). **Redeploy also costs DP** [COMM].
|
||||
- **Deploy order:**
|
||||
- 上半: left→right, bottom→top.
|
||||
- 下半: top→bottom, then left→right. The last-placed unit has the highest taunt.
|
||||
- **Skills:** fire automatically. Units with summons deploy the summon on first deployment regardless of SP [COMM].
|
||||
- **Perfect clear (完美作战):** every enemy killed before the time limit, none reached the objective.
|
||||
- **Bond stacking:**
|
||||
- "<战斗中>" triggers work only here, never in 联防 or boss rounds [COMM].
|
||||
- Layers persist all match. Tip: "叠加的盟约会在单次模拟中始终保留,但只有在盟约被激活时才会发挥作用".
|
||||
- Only active bonds gain layers in most cases.
|
||||
|
||||
### 4.4 联防 (Unite / joint defense), multi only [WIKI]
|
||||
- **Trigger:** some but not all players failed to clear perfectly.
|
||||
- **Setup:** 1–2 players who *did* clear perfectly field their board as-is. They face the **union of all enemies the other players leaked**, using the escaped-battle template `level_act1autochess_escaped_multi` (char limit 20).
|
||||
- **Rules:**
|
||||
- Bond stacking is disabled ("该阶段不能叠加层数").
|
||||
- Bounty kills here pay the killer.
|
||||
- Only perfect-clear teammates can defend (tip).
|
||||
- Community: in 下半 the result shown is the *defended* player's view.
|
||||
- **LP loss:** enemies that also survive 联防 cost their original owner LP (cap 10 per round).
|
||||
- **No perfect player:** leaks cost LP directly.
|
||||
- **Partner choice:** [ASSUMED] the defenders are the 2 perfect players with the fewest leaks this round, tie broken by seat index. The official selection rule is unknown.
|
||||
|
||||
### 4.5 Settlement
|
||||
- Each player loses `min(10, number of their enemies not killed)` LP [WIKI: "每回合最多-10血 (就算大漏50个也-10)"]. `enemy.lifePointReduce` is 1 for almost all regular enemies. Use 1 per enemy (see 05-enemies-levels.md).
|
||||
- **Bounty coins:**
|
||||
- Kill-type bounty: whoever kills the enemy (owner or 联防 helper) gets the coins.
|
||||
- "战术特训" type: coins if the chooser cleared perfectly in their own phase.
|
||||
- Coins are credited to the next prep.
|
||||
- **Elimination:** LP ≤ 0 → the player is out.
|
||||
- Multi: their operators return to the shared pool immediately [COMM]. Boss HP drops.
|
||||
- Community calls ≤10 LP "斩杀线" (one bad round kills you).
|
||||
- Score/rewards use rounds cleared (`roundScoreDataList`, `baseRewardDataList`).
|
||||
|
||||
---
|
||||
|
||||
## 5. Economy
|
||||
|
||||
### 5.1 Income per round
|
||||
- **Official text:** "每回合开始时,将会进入休整期并且提供一定量的资金…没有用完的资金无法留到下一回合。" The amounts are not published.
|
||||
- **Evidence:**
|
||||
- Band 老鲤 `give_coin_in_round`: R1 = 0, R2 = 0, **R3 = 15**. It reads "第1、2回合的资金暂存至第3回合发放", so **R1+R2+R3 = 15**.
|
||||
- Linear +1/round then gives **4, 5, 6**. Start 3 gives 12 and start 5 gives 18, so only 4 fits.
|
||||
- NGA: "2回合升本…亏一块". The R2 upgrade costs 4, and 5 − 4 = 1 is left over, which only fits R2 = 5.
|
||||
- NGA: "3回合都做不到连买三张". With 6 funds at shop L2, three purchases are impossible.
|
||||
- **Proposal:** `income(r) = min(3 + r, 10)` → 4,5,6,7,8,9,10,10,10…
|
||||
- Cap 10 [ASSUMED]. The 2024 season capped at 10–12, and cap 12 is a fine alternative.
|
||||
- FUNNY: +2 per round [ASSUMED].
|
||||
- **Other income sources [DATA]:**
|
||||
- Bounties (1–6 coins).
|
||||
- Choice "财富" (+1 to every teammate).
|
||||
- Bonds: 远见 "<每叠加10层>获得一次2资金"; 奇迹 "<每叠加100层>获得20资金" and chance of a free next refresh.
|
||||
- Items: 骑士储蓄罐 (1–6), 炎 VI items (+2 per acquisition, max 3/round).
|
||||
- Operator traits: 红豆 0-cost, 暴行 "下回合加钱"…
|
||||
- Bands: 玛恩纳 (+1 per Kazimierz bought, max 3), 坎诺特 interest, 鸭爵 (+1 per duck-type enemy killed).
|
||||
|
||||
### 5.2 Spending [DATA unless noted]
|
||||
|
||||
| Action | Cost |
|
||||
|---|---|
|
||||
| Buy operator (`shopCharChessInfoData`) | tier I **2**, II **3**, III **3**, IV **3**, V **4**, VI **4**. The same price is charged if the shop offers an elite copy (e.g. "升华" choice). |
|
||||
| Buy item (`trapChessDataDict.purchasePrice`) | 1–5 by item (tier I items 1, most tier II–IV 2, tier VI 3–4, advanced/金 items 5). See 04-items.md. |
|
||||
| Refresh | 1 (`shopRefreshPrice`) |
|
||||
| Sell (operator of any tier, normal *or* elite) | refund **1** (`chessSoldPrice`=1 for all rows). Community special case: selling 煌 gives 1 fund + transforms. |
|
||||
| Upgrade shop level N→N+1 | `initialUpgradePrice[N]` − rounds elapsed since reaching N (floor 0) |
|
||||
|
||||
Shop upgrade base prices (`shopLevelDataDict`, price shown at level N = cost to go N→N+1) [DATA]:
|
||||
|
||||
| Mode | L1→2 | L2→3 | L3→4 | L4→5 | L5→6 | Operator slots at L1..L6 | Item slots |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| NORMAL / HARD / ABYSS (solo & multi) | 5 | 8 | 11 | 12 | 13 | 3,4,4,5,5,5 | 1 at every level |
|
||||
| multi_funny | 5 | 8 | 10 | 11 | 11 | 3,4,4,4,4,5 | 1 |
|
||||
| single_funny | 1 | 1 | 5 | 8 | 10 | 3,4,4,4,4,5 | 1 |
|
||||
| training | 4 | 4 | 6 | 9 | 12 | 3 ×6 | 0 (L1–4), 1 (L5–6) |
|
||||
|
||||
Level 6 has price 99 (no further upgrade). Level tag colours: #434343, #626654, #445760, #615B74, #6C5E41, #5d341e.
|
||||
|
||||
The 20-fund 绮良 / 55-fund 帕格尼尼 band thresholds count **funds spent** (buy, refresh and upgrade) [ASSUMED: all spending].
|
||||
|
||||
---
|
||||
|
||||
## 6. Shop (调度中心)
|
||||
|
||||
- **Slots:** `charChessCount` operator slots + `itemCount` item slots, total ≤ `storeCntMax` = 6.
|
||||
- **Tier availability:** shop level L offers operators of tier ≤ L [WIKI/COMM: "商店等级决定会卖的干员最高阶级"]. Items also ≤ L [ASSUMED].
|
||||
- **Chess counts per tier (`charShopChessDatas`, 133 chess):**
|
||||
|
||||
| Tier | Visible (PRESET / NORMAL / DIY slots) | Hidden (not in shop; only granted by effects) |
|
||||
|---|---|---|
|
||||
| I | 16 PRESET | 4 (incl. Pith's special 盟约·辅助干员) |
|
||||
| II | 17 PRESET | 2 |
|
||||
| III | 13 PRESET + 6 NORMAL | 2 |
|
||||
| IV | 9 PRESET + 13 NORMAL | 4 |
|
||||
| V | 2 PRESET + 17 NORMAL + 2 DIY | 3 PRESET + 1 NORMAL (百炼嘉维尔) |
|
||||
| VI | 2 PRESET + 17 NORMAL + 2 DIY | 1 (妮芙) |
|
||||
|
||||
Chess types:
|
||||
- PRESET = fixed system operator.
|
||||
- NORMAL = uses the player's own operator (or a borrowed support). If neither is available it uses `backupCharId` (预备干员).
|
||||
- DIY = a player-chosen own operator in a tier V/VI slot.
|
||||
- **Shared pool (multi) [COMM, bilibili BV1JWy3BkEpt + note.com]:**
|
||||
- Each operator has a fixed number of copies shared by all 4 players: **I 12, II 14, III 18, IV 16, V 8, VI 5** (缪尔赛思 4).
|
||||
- An elite occupies 3 copies. Copies in a shop display do **not** occupy the pool.
|
||||
- All owned copies (board + bench, however obtained) do.
|
||||
- If owned copies ≥ cap, that operator can no longer roll.
|
||||
- Eliminated or quitting players' copies return immediately.
|
||||
- DIY slots: [ASSUMED] private per player, with the same copy caps as their tier.
|
||||
- **Roll odds [ASSUMED; the official odds are unpublished]:**
|
||||
- Each empty operator slot draws one copy uniformly at random from **all remaining pool copies** of non-hidden chess with tier ≤ shop level (Hearthstone-Battlegrounds model).
|
||||
- This matches community observations: "一本卡池最小所以好凑三连", "三本大大稀释浓度", "卡池变大了三连概率低".
|
||||
- Resulting share of tiers at L6 ≈ I 14%, II 17%, III 25%, IV 26%, V 11%, VI 7%.
|
||||
- Optional: never show the same operator twice in one roll, except via 梓兰's special refresh.
|
||||
- **Special refreshes:** band effects replace the normal roll.
|
||||
- 杜遥夜: first 2 active refreshes each round guarantee 1 Yan.
|
||||
- 梓兰: every refresh contains 2 copies of one operator and freezes one.
|
||||
- 佩佩: after upgrading to L2/4/6, one Sargon-priority refresh.
|
||||
- 寻呼模块 / 信标: special 3- or 2-choice refresh.
|
||||
- **Promotion reward slot:** see §7. Tip: "晋级的特殊奖励无法被刷新、冻结,也不会保留至下一回合".
|
||||
|
||||
---
|
||||
|
||||
## 7. Merging (精锐 / elite promotion) [DATA + WIKI]
|
||||
|
||||
- **Merge rule:** 3 copies with the same `chessId` merge automatically into `upgradeChessId`, the `_b` elite. Copies on the board or bench all count.
|
||||
- WIKI: "三位同名干员(无论是否部署)会自动合并且晋级为精锐干员".
|
||||
- `upgradeNum`=3 for 132 chess; **风丸 `chess_char_2_11_a` needs 2**.
|
||||
- Elites have `upgradeNum`=0: **no further merging**.
|
||||
- **Equipment:** anything the merged units carried returns to the bench. Tip: "干员晋级后已配发装备会回收至整备区".
|
||||
- **Bond traits** of "<获得时>" type: a triple stacks 1+1+2 (the elite value is double) [COMM].
|
||||
- **Stats (`shopCharChessInfoData`):**
|
||||
|
||||
| Tier | Normal copy | Elite copy |
|
||||
|---|---|---|
|
||||
| I | E1 Lv55, skill 4 | E2 Lv50, skill 7, module lv1 |
|
||||
| II | E1 Lv60 | E2 Lv55 |
|
||||
| III–V | E2 Lv1, skill 4 | E2 Lv60, skill 7, module lv1 |
|
||||
| VI | E2 Lv1, skill 4 | E2 Lv60, skill 7, module lv3 |
|
||||
|
||||
Trust 0. Owned-operator training adds `cultivateEffectList`: E1 +5% ATK/DEF; E2 +10% ATK, +5% DEF/HP; E2 Lv60 +10% all.
|
||||
- **Promotion reward [COMM]:** after a merge the player gets a special shop offer. They pick **1 of 3 random operators of tier min(shopLevel+1, 6)**, free.
|
||||
- Sources: "碰出來可以選一個階級+1的幹員"; "资金0でランダムに選ばれた3体の中から1体"; NGA "卡一本…三连给的二本".
|
||||
- Reward pools are named `pool_chess_shop_{N}_reward` in the data (老鲤 draws from `pool_chess_shop_2_reward` / `_4_reward`).
|
||||
- It cannot be refreshed or frozen and expires at round end.
|
||||
- **Broadcast:** "{0}博士的{1}干员晋升为精锐".
|
||||
|
||||
---
|
||||
|
||||
## 8. Board, bench and bonds (limits only; details in 02-bonds.md)
|
||||
- **Board:** 8 deployed operators (`maxBattleChessCnt`, level `characterLimit`=8).
|
||||
- **Bench:** 10 (`maxDeckChessCnt`), plus a temporary overflow area that is wiped each round.
|
||||
- **Board and bench swaps:** in 下半 operators on the bench and the board can be swapped even with a full bench.
|
||||
- **Bond activation:** most bonds count only board operators (`activeCondition` BOARD).
|
||||
- 远见 / 奇迹 / 投资人 are BOARD_AND_DECK: bench units count too. Tip: "一些特殊的盟约不需要部署干员也能激活生效".
|
||||
- `fallbackBondId`=emptyShip (协防干员): the bond for operators with no faction bond.
|
||||
|
||||
---
|
||||
|
||||
## 9. Life points (目标生命值)
|
||||
- **Start:** the band's `totalHp`: 20 (铃兰) … 45 (歌利亚). See §11.
|
||||
- **Normal rounds:** lose 1 per enemy not killed (leaked or alive at timeout, after 联防), **max 10 per round** (`costPlayerHpLimit`=10) [DATA+WIKI].
|
||||
- **Loss:** LP ≤ 0 → eliminated.
|
||||
- Multi: the team wins if anyone survives to kill the R14 boss [ASSUMED: the team result is shared, and the clear counts for everyone still in].
|
||||
- Quitting counts as elimination.
|
||||
- **Final assault (R14/R15):**
|
||||
- All remaining LP of all players merge into one pool; there is no 10 cap.
|
||||
- After the boss round has run `bossTurnHpReduceTime` = 150 s, the team loses 1 LP per second.
|
||||
- If regular wave enemies reach the goal and bring LP to 0, the team fails immediately [WIKI].
|
||||
|
||||
## 10. Final Assault and Hidden Core [WIKI, PRTS 下半]
|
||||
- **最终攻势 (R14):**
|
||||
- Players are paired. Each pair shares one boss battlefield: one plays the left half and one the right half ("两名参与者会处于同一个战场,但无法查看另一组队友的战场情况").
|
||||
- For the right-side player the board is mirrored ("你的最左边是你的最右边").
|
||||
- Everyone damages one shared boss HP bar ("所有人将一起对敌方领袖造成伤害"). Some bosses appear on both sides and share HP.
|
||||
- Broadcasts at 20/50/80% damage share per player: "{0}博士对敌方领袖造成的伤害超过20%!".
|
||||
- **隐秘核心 (R15, NORMAL+ only):**
|
||||
- Entry condition after passing R14:
|
||||
- solo: activated bond layers total **> 350** and LP > 1;
|
||||
- multi: sum over all players **> 1200** and LP sum > 1.
|
||||
- (盟约 上半 values were 300 / 1000.)
|
||||
- The boss is weighted among 胄/铳/管 hidden versions (50/40/40).
|
||||
- Failing it does not affect the clear or the reward. Success shows a special banner and awards more trophies.
|
||||
|
||||
---
|
||||
|
||||
## 11. Strategies / bands (`bandDataListDict`, 40 entries) [DATA]
|
||||
|
||||
A band is the player's commander/"分队" chosen at BAND_CHECK. It sets **starting LP** (`totalHp`) and grants one permanent rule-changing effect (`effectType` BAND_INITIAL). Common fields: `victorCount`=3 (3 clears → badge) and `bandRewardModulus`=1.0.
|
||||
|
||||
`band_zumama` (森蚺, 上半 only) is defined in `autoChessData.bandDataDict` but absent from act2.
|
||||
|
||||
Modes column: L=LOCAL(training), S=SINGLE, M=MULTI. Raw rich-text is kept in the JSON as `descRaw`.
|
||||
|
||||
| # | bandId | Name | LP | Modes | Effect (plain text) | Key buff params | Unlock |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 1 | `band_bldsk` | 华法琳 | 28 | L,S,M | 【重点监护】开始作战时,使场上每个不同等阶的1个随机我方干员的所属盟约层数+2 | `prep_finish_char_bond_add_layer` {"layer": 2.0} | - |
|
||||
| 2 | `band_amiya` | 阿米娅 | 25 | L,S,M | 【众志合一】场上存在3、4或5种以上激活盟约时,所有干员攻击力、生命值分别+20/30/40% | `env_gbuff_new_with_verify` {"key": "act1autochess_band2_buff", "atk_1": 0.2, "atk_2": 0.3, "atk_3": 0.4, "max_hp_1": 0.2, "max_hp_2": 0.3, "max_hp_3": 0.4, "value_1": 3.0, "value_2": 4.0, "value_3": 5.0} | - |
|
||||
| 3 | `band_duyaoy` | 杜遥夜 | 29 | L,S,M | 【广交豪杰】每回合前2次主动刷新为特殊刷新:优先刷新出1名<炎>干员 / 在<炎>部分干员缺席时体验可能不完整 | `band_first_self_refresh_present_char` {"bond": "yanShip", "count": 1.0} | - |
|
||||
| 4 | `band_sarkazb` | 歌利亚 | 45 | L,S,M | 【坚不可摧】初始目标生命值为45点 | | - |
|
||||
| 5 | `band_orchid` | 梓兰 | 30 | S,M | 【猎头顾问】每次主动刷新均变为特殊刷新:必定刷新2名同名干员,并冻结其中一名;第10回合获得1个<寻呼模块> / <寻呼模块>:装备时销毁,立即在调度中心中刷新三名与该干员盟约相同的干员,免费获得其中一名!(不超过当前调度中心等级) | `band_shop_refresh_copy_max_lv_char` {"count": 1.0}; `preparation_start_gain_chess_from_round` {"round": 10.0, "count": 1.0, "type": "equip", "chess": "chess_item_4_01_e_a"} | 在【标准模拟】中通过第9回合后解锁 |
|
||||
| 6 | `band_justin` | 小贾斯汀 | 23 | S,M | 【私募基金】在第1、4、7、10回合进入休整期时获得1个<骑士储蓄罐> / <骑士储蓄罐>:装备时随机获得1~6资金并销毁 | `preparation_start_gain_chess_from_round` {"round": 1.0, "count": 1.0, "type": "equip", "chess": "chess_item_3_12_e_a"}; `preparation_start_gain_chess_from_round` {"round": 4.0, "count": 1.0, "type": "equip", "chess": "chess_item_3_12_e_a"}; `preparation_start_gain_chess_from_round` {"round": 7.0, "count": 1.0, "type": "equip", "chess": "chess_item_3_12_e_a"}; `preparation_start_gain_chess_from_round` {"round": 10.0, "count": 1.0, "type": "equip", "chess": "chess_item_3_12_e_a"} | 通关【标准模拟】后解锁 |
|
||||
| 7 | `band_ermengard` | 埃芒加德 | 27 | S,M | 【命结之秘】战斗中前3个被击倒的干员立刻复活! | `env_gbuff_new_with_verify` {"key": "act1autochess_band28_buff", "max_respawn_cnt": 3.0} | 在【险境模拟】中通过第9回合后解锁 |
|
||||
| 8 | `band_lmlee` | 老鲤 | 27 | S,M | 【得闲饮茶】第1、2回合的资金暂存至第3回合发放;第3回合进入休整期时,获得2、4阶随机干员各1名 | `give_coin_in_round` {"round": 1.0, "coin": 0.0}; `give_coin_in_round` {"round": 2.0, "coin": 0.0}; `give_coin_in_round` {"round": 3.0, "coin": 15.0}; `prep_start_gain_chess_from_pool_in_round` {"round": 3.0, "type": "char", "pool": "pool_chess_shop_2_reward", "count": 1.0}; `prep_start_gain_chess_from_pool_in_round` {"round": 3.0, "type": "char", "pool": "pool_chess_shop_4_reward", "count": 1.0} | 通关任意模拟2次解锁 |
|
||||
| 9 | `band_kirara` | 绮良 | 26 | S,M | 【通关奖励】每使用20资金,获得一名不高于当前调度中心等级的随机干员 | `band_coin_cost_gain_random_char_by_shop_level` {"coin_cnt": 20.0, "count": 1.0} | 在【险境模拟】中通过第13回合后解锁 |
|
||||
| 10 | `band_pepe` | 佩佩 | 23 | S,M | 【博学多通】升级调度中心至2、4和6级后,获得1次特殊刷新:此次刷新出现的干员优先为<萨尔贡>干员 / 在<萨尔贡>部分干员缺席时体验可能不完整 | `up_shop_next_refresh_must_present_bond_char` {"bond": "sargonShip", "cnt": 0.0, "price": 0.0, "lvlist": "2,4,6"} | 通关时的结算阵容中,包含6名【萨尔贡】干员解锁 |
|
||||
| 11 | `band_harold` | 哈洛德 | 23 | S,M | 【人才盲盒】从第4回合开始每2回合获得1名<维多利亚>干员 / 在<维多利亚>部分干员缺席时体验可能不完整 | `gain_bond_char_per_round` {"bond": "victoriaShip", "round": 4.0, "count": 1.0, "preround": 2.0} | 通关时的结算阵容中,包含6名【维多利亚】干员解锁 |
|
||||
| 12 | `band_sciurus` | 休露丝 | 24 | S,M | 【雪域礼赠】每回合购买的首名<谢拉格>干员消耗资金为1 / 在<谢拉格>部分干员缺席时体验可能不完整 | `first_buy_in_round_char_price_change` {"bond": "kjeragShip", "price": 1.0} | 通关时的结算阵容中,包含6名【谢拉格】干员解锁 |
|
||||
| 13 | `band_paganini` | 潘格尼尼 | 24 | S,M | 【定制铳械】累计花费55资金后,获得1名4阶及以上随机的精锐<拉特兰>干员 / 在<拉特兰>部分干员缺席时体验可能不完整 | `band_cost_coin_reach_cnt_gain_chess_from_pool` {"coin_cnt": 55.0, "count": 1.0, "type": "char", "pool": "pool_char_later"} | 多场模拟中【拉特兰】盟约累计200层解锁 |
|
||||
| 14 | `band_clementia` | 克莱门莎 | 26 | S,M | 【崇高牺牲】<阿戈尔>干员被击倒时,提供等同于该干员等阶的<阿戈尔>盟约层数 / 在<阿戈尔>部分干员缺席时体验可能不完整 | `env_gbuff_new_with_verify` {"key": "act1autochess_band13_buff", "bond_type": "bond_by_id", "bond_id": "egirShip", "bond_add_type": "by_charlevel"} | 多场模拟中【阿戈尔】盟约累计200层解锁 |
|
||||
| 15 | `band_emperor` | 大帝 | 26 | S,M | 【加急调派】我方干员每次部署后再部署时间减少50% | `env_gbuff_new_with_verify` {"key": "act1autochess_band16_buff", "respawn_time": -0.5, "value": 0.0} | 通关时本局内,累计获取过6名特种干员解锁 |
|
||||
| 16 | `band_mberry` | 桑葚 | 28 | S,M | 【药枚实验】战斗开始时,使最右边的所有我方单位获得效果:每次攻击时有25%的概率获得1层护盾(最多1层) | `env_gbuff_new_with_verify` {"key": "act1autochess_band17_buff", "prob": 0.25} | 通关任意模拟4次解锁 |
|
||||
| 17 | `band_humus` | 休谟斯 | 24 | L,S,M | 【回收利用】地面干员技能结束时使周围四格随机1名干员获得3点技力 | `env_gbuff_new_with_verify` {"key": "act1autochess_band18_buff", "sp": 3.0} | 通关任意模拟3次解锁 |
|
||||
| 18 | `band_quintus` | 昆图斯 | 31 | S,M | 【不稳定要素】第3回合获得1件特殊装备<突变细胞> / <突变细胞>:战斗结束后使装备者变为高一阶的随机干员(最高6阶) | `preparation_start_gain_chess_from_round` {"round": 3.0, "count": 1.0, "type": "equip", "chess": "chess_item_5_08_e_a"} | 通关任意模拟3次解锁 |
|
||||
| 19 | `band_yu` | 余 | 27 | S,M | 【文火慢炖】第8回合开始时,若仅激活了1个盟约,使其增加36层;否则使所有已激活盟约增加12层 | `round_start_bond_check_gain_layer` {"round": 8.0, "factioncount": 1.0, "count1": 36.0, "count2": 12.0} | 在【标准模拟】中通过第9回合后解锁 |
|
||||
| 20 | `band_doberm` | 杜宾 | 30 | S,M | 【加练!】每2个回合获得1个特殊法术<教鞭> / <教鞭>:使用后为下场战斗添加额外敌人,若自身战斗完美作战可获得资金 | `preparation_start_gain_chess_every_n_round` {"round": 2.0, "count": 1.0, "type": "trap", "chess": "chess_item_6_03_m"} | 通关任意模拟1次解锁 |
|
||||
| 21 | `band_cathy` | 凯瑟琳 | 26 | S,M | 【定向投放】每次升级调度中心时,在调度中心刷新随机3件装备,可以选择并获得其中1件 | `up_shop_add_special_goods` {"count": 3.0, "choice": 1.0, "pool": "pool_equip_kathe"} | - |
|
||||
| 22 | `band_malkie` | 马克维茨 | 28 | S,M | 【商业包装】初始获得1个<商业包装方案> / <商业包装方案>:每出售8名任意干员后,获得1名装备者的同盟约普通干员 | `preparation_start_gain_chess_from_round` {"round": 1.0, "count": 1.0, "type": "equip", "chess": "chess_item_5_07_e_a"} | 通关任意模拟1次解锁 |
|
||||
| 23 | `band_qalaisa` | 卡莱莎 | 26 | S,M | 【食腐之蝶】我方干员被击倒时,场上剩余我方单位攻击力+20%(最大200%,持续至该干员被击倒或战斗结束) | `env_gbuff_new_with_verify` {"key": "act1autochess_band15_buff", "atk": 0.2, "max_stack_cnt": 10.0} | 通关任意模拟1次解锁 |
|
||||
| 24 | `band_chen` | 陈 | 22 | S,M | 【以己之长】所有干员造成的物理和法术伤害变为弱点伤害(根据敌人的防御力和法术抗性变更伤害类型) | `env_gbuff_new_with_verify` {"key": "act1autochess_band19_buff"} | - |
|
||||
| 25 | `band_damaztic` | “变形者集群” | 29 | S,M | 【变形同构】每5回合获得1件特殊装备<变形同构体> / <变形同构体>:与特定装备一同装备时装备者将视为特定盟约成员 | `preparation_start_gain_chess_from_round` {"round": 5.0, "count": 1.0, "type": "equip", "chess": "chess_item_6_09_e_a"}; `preparation_start_gain_chess_from_round` {"round": 10.0, "count": 1.0, "type": "equip", "chess": "chess_item_6_09_e_a"}; `preparation_start_gain_chess_from_round` {"round": 15.0, "count": 1.0, "type": "equip", "chess": "chess_item_6_09_e_a"} | 通关任意模拟1次解锁 |
|
||||
| 26 | `band_pith` | Pith | 24 | S,M | 【优等生】第1回合获得1名可以造成神经、灼燃、凋亡损伤的特殊干员,其属于调和盟约:可以使部分盟约人数计数+1 | `preparation_start_gain_chess_from_round` {"round": 1.0, "count": 1.0, "type": "char", "chess": "chess_char_1_15_a"} | - |
|
||||
| 27 | `band_dusk` | 夕 | 28 | S,M | 【墨色真颜】若你的场上存在同名干员,这些干员攻击力+30% / 【幻画为真】第1回合获得1个特殊法术<画卷> / <画卷>:使用后可以复制该法术范围内的1名干员(包括精锐状态和携带的装备) | `preparation_start_gain_chess_from_round` {"round": 1.0, "count": 1.0, "type": "trap", "chess": "chess_item_6_02_m"}; `env_gbuff_new_with_verify` {"key": "act2autochess_band12_buff", "atk": 0.3} | 通关任意模拟1次解锁 |
|
||||
| 28 | `band_cannot` | 坎诺特 | 27 | S,M | 【利滚利】每回合剩余的资金可以继承,剩余至少5资金时,每回合额外获得1资金 | `coin_carry_over` {"capital": 5.0, "interest": 1.0, "max": 1.0} | - |
|
||||
| 29 | `band_ducklord` | 鸭爵 | 29 | S,M | 【“神秘顾客”】从第5回合起,你和队友遭遇的部分敌人可能会替换为<鸭爵><高普尼克><流泪小子><圆仔>,击倒这些敌人者获得1资金奖励(包括联防阶段) | `round_start_all_player_change_enemy_2` {"min": 0.0, "max": 2.0, "enemylist": "enemy_2002_bearmi_2,enemy_2034_sythef_2,enemy_2085_skzjxd_2,enemy_2001_duckmi_2", "round": 5.0, "count": 1.0, "minweight": 0.6, "maxweight": 0.99} | 通关任意模拟1次解锁 |
|
||||
| 30 | `band_lisa` | 铃兰 | 20 | S,M | 【御守之力】每个回合开始时,触发战场上一名干员的获得时效果一次(优先选择最靠右和最靠下) | `round_start_activate_char_chess_effect_in_board` {"event_type": "SERVER_GAIN", "count": 1.0} | - |
|
||||
| 31 | `band_vodfox` | 巫恋 | 22 | S,M | 【替身娃娃】每回合首次出售初始干员时,改为与调度中心中随机一名干员交换 | `first_sell_char_chess_exchange_char_chess_in_shop` {"count": 1.0} | - |
|
||||
| 32 | `band_ioleta` | 伊奥莱塔·罗素 | 29 | S,M | 【统御号令】战斗开始时,场上每有一个精锐干员,精锐干员的攻击力,生命值+10% | `env_gbuff_new_with_verify` {"key": "act2autochess_band3_buff", "atk_per_cnt": 0.1, "max_hp_per_cnt": 0.1} | - |
|
||||
| 33 | `band_jesica` | 杰西卡 | 22 | S,M | 【集结指示】在第4、7、10、13回合进入休整期时获得1个<寻呼模块> / <寻呼模块>:装备时销毁,立即在调度中心中刷新三名与该干员盟约相同的干员,免费获得其中一名!(不超过当前调度中心等级) | `preparation_start_gain_chess_from_round` {"round": 4.0, "count": 1.0, "type": "equip", "chess": "chess_item_4_01_e_a"}; `preparation_start_gain_chess_from_round` {"round": 7.0, "count": 1.0, "type": "equip", "chess": "chess_item_4_01_e_a"}; `preparation_start_gain_chess_from_round` {"round": 10.0, "count": 1.0, "type": "equip", "chess": "chess_item_4_01_e_a"}; `preparation_start_gain_chess_from_round` {"round": 13.0, "count": 1.0, "type": "equip", "chess": "chess_item_4_01_e_a"} | 通关任意模拟1次解锁 |
|
||||
| 34 | `band_mlyss` | 缪尔赛思 | 28 | S,M | 【至纯凝结】在第1回合开始时获得一个进阶<博士投影> / 进阶<博士投影>:任意干员可装备,立即使该干员晋升为精锐干员 | `preparation_start_gain_chess_from_round` {"round": 1.0, "count": 1.0, "type": "equip", "chess": "chess_item_5_06_e_b"} | 通关任意模拟1次解锁 |
|
||||
| 35 | `band_makiri` | 松桐 | 24 | S,M | 【九流之缘】偶数回合的休整期开始时,随机获得调度中心的一名干员 | `round_start_gain_char_chess_in_shop_every_n_round` {"round": 2.0, "count": 1.0} | - |
|
||||
| 36 | `band_fang` | 芬 | 24 | S,M | 【协力共进】第8、10、12、14回合时,获得1个<信标> / <信标>:装备后销毁携带干员,并在调度中心刷新两名同等阶干员免费获取其中一名;原干员在下回合传递给对应盟约人数最多的队友 | `preparation_start_gain_chess_from_round` {"round": 8.0, "count": 1.0, "type": "equip", "chess": "chess_item_5_04_e_a"}; `preparation_start_gain_chess_from_round` {"round": 10.0, "count": 1.0, "type": "equip", "chess": "chess_item_5_04_e_a"}; `preparation_start_gain_chess_from_round` {"round": 12.0, "count": 1.0, "type": "equip", "chess": "chess_item_5_04_e_a"}; `preparation_start_gain_chess_from_round` {"round": 14.0, "count": 1.0, "type": "equip", "chess": "chess_item_5_04_e_a"} | 通关任意模拟3次解锁 |
|
||||
| 37 | `band_mlynar` | 玛恩纳 | 24 | S,M | 【业务指标】每购买一名<卡西米尔>干员,下回合开始时资金+1(每回合至多3资金) / 在<卡西米尔>部分干员缺席时体验可能不完整 | `round_start_gain_coin_by_bond_char_chess_buy` {"bond": "kazimierzShip", "count": 1.0, "max_count": 3.0} | 通关时的结算阵容中,包含6名【卡西米尔】干员解锁 |
|
||||
| 38 | `band_chiave` | 贾维 | 23 | S,M | 【团伙行动】主动刷新6次调度中心后获得一名不高于当前调度中心等级的<叙拉古>干员(每回合至多获得2名) / 在<叙拉古>部分干员缺席时体验可能不完整 | `refresh_shop_count_gain_coin_bond_char_chess` {"refresh_count": 6.0, "bond": "siracusaShip", "max_count": 2.0} | 通关时的结算阵容中,包含6名【叙拉古】干员解锁 |
|
||||
| 39 | `band_narant` | 娜仁图亚 | 26 | S,M | 【见者有份】偶数回合进入休整期时,调度中心特殊刷新两件装备,免费获取其中一件;萨尔贡盟约<在场6名不同【萨尔贡】干员>效果替换为【萨尔贡】干员技能开启后,周围八格干员同时享受该干员携带的不高于V阶的装备效果,持续60秒 / 在<萨尔贡>部分干员缺席时体验可能不完整 | `preparation_start_add_special_goods_every_n_round` {"round": 2.0, "count": 1.0, "type": "equip", "pool": "pool_equip_narant", "refresh_cnt": 2.0, "choice_cnt": 1.0} | 通关时的结算阵容中,包含6名【萨尔贡】干员解锁 |
|
||||
| 40 | `band_amedic` | Touch | 28 | S,M | 【外勤医疗】所有玩家场地上出现一名<预备干员-医疗>;战斗开始时,若场上至少有两名精锐干员,则替换为<Touch> | `auto_chess_change_map` {"common_condition": "condition_golden_chess_le", "cnt": 1.0, "char_605_cmedic#1": 1.0, "char_605_cmedic#2_multi_only": 1.0, "char_605_cmedic#3": 1.0, "char_605_cmedic#4_multi_only": 1.0, "char_613_acmedc#1": 0.0, "char_613_acmedc#2_multi_only": 0.0, "char_613_acmedc#3": 0.0, "char_613_acmedc#4_multi_only": 0.0}; `auto_chess_change_map` {"common_condition": "condition_golden_chess_ge", "cnt": 2.0, "char_613_acmedc#1": 1.0, "char_613_acmedc#2_multi_only": 1.0, "char_613_acmedc#3": 1.0, "char_613_acmedc#4_multi_only": 1.0, "char_605_cmedic#1": 0.0, "char_605_cmedic#2_multi_only": 0.0, "char_605_cmedic#3": 0.0, "char_605_cmedic#4_multi_only": 0.0} | 通关任意模拟3次解锁 |
|
||||
|
||||
Band notes for implementation:
|
||||
- **Economy bands:**
|
||||
- 坎诺特 (carry-over + interest). `constData.noMoneyTipsBand`=[band_cannot]: the "leftover funds will be lost" warning is not shown to this band.
|
||||
- 老鲤: R1/R2 income 0, R3 15, plus 1 random tier II and 1 random tier IV at R3.
|
||||
- 小贾斯汀 (piggy bank 1–6).
|
||||
- 绮良: 1 random operator of tier ≤ shop level per 20 funds spent.
|
||||
- 帕格尼尼: an elite Laterano of tier ≥ IV after 55 funds spent (`pool_char_later`).
|
||||
- 玛恩纳: +1 next round per Kazimierz bought, max 3.
|
||||
- 贾维: 6 active refreshes → 1 Siracusa operator, max 2/round.
|
||||
- **Shop-manipulation bands:** 杜遥夜, 梓兰, 佩佩, 凯瑟琳 (on every shop upgrade, choose 1 of 3 items), 巫恋 (the first sale of a normal operator each round swaps it with a random shop operator), 娜仁图亚 (even rounds: 1 of 2 items free).
|
||||
- **Free-unit bands:** 哈洛德 (a Victoria operator every 2 rounds from R4), 松桐 (even rounds: a random shop operator), Pith (R1 special 调和 operator `chess_char_1_15_a`), 缪尔赛思 (R1 advanced 博士投影 = instant elite), 昆图斯 (R3 突变细胞), 变形者集群 (变形同构体 at R5/10/15), 杰西卡 / 芬 (寻呼模块 / 信标 at fixed rounds), 杜宾 (教鞭 every 2 rounds: add enemies, earn coins on perfect).
|
||||
- **Combat bands:** 阿米娅, 埃芒加德, 大帝, 桑葚, 休谟斯, 卡莱莎, 陈, 夕, 伊奥莱塔, Touch (swaps a map token 预备干员-医疗 → Touch if ≥2 elites), 余 (R8 bond burst), 华法琳, 克莱门莎, 铃兰 (at each round start re-trigger 1 operator's "获得时" effect).
|
||||
- **Multi-only effects:**
|
||||
- 鸭爵 affects teammates too. From R5, 0–2 enemies per round are replaced by 鸭爵/高普尼克/流泪小子/圆仔, each worth 1 coin to the killer.
|
||||
- 芬's 信标 passes the operator to a teammate.
|
||||
|
||||
---
|
||||
|
||||
## 12. 机变阶段: choice events (`effectChoiceInfoDict`, 109 entries incl. `_s` solo variants) [DATA + WIKI]
|
||||
|
||||
| choiceType | effectType | Name | Ids | What it does |
|
||||
|---|---|---|---|---|
|
||||
| EQUIP_FREE | EQUIP | 道具补给 | equip_free_1..4 (+_tr) | Pick 1 free item |
|
||||
| EQUIP_FREE | EQUIP | 机密商店 | artifact_paid_1..5 | Pick 1 free (special) item |
|
||||
| BOUNTY_HUNT | ENEMY_GAIN | 悬赏决策 | enemy_initial_1..10, bounty_hunter_1..15, bossInitial_1..6 | Pick a bounty: extra enemies in your next 1 / 2 / all battles; coins on kill or on perfect |
|
||||
| BUFF_SELECT | BUFF_GAIN | 战术决策 | buff_select_1..4, hardbuff_select_1..3, terrain_m01_1…m07_1 | Team buff, enemy debuff or map change |
|
||||
| PERSONAL_CHOOSE | ENEMY_GAIN | 悬赏决策 | hunter_band_1 | Personal bounty pick (pool server-side) |
|
||||
|
||||
The `_s` ids are the solo copies with identical text.
|
||||
|
||||
When they happen:
|
||||
- Rounds with `isSpPrepare`. PRTS (multi): FUNNY after R2/R8 (no bounties); NORMAL after R2/R5/R8; HARD+ after R2/R8 (bounties fixed) and R10 (no 战术决策).
|
||||
- Solo NORMAL: R5 道具补给, R8 战术决策.
|
||||
- Proposed mapping [ASSUMED]:
|
||||
- HARD/ABYSS: R3 = bounty (enemy_initial / bounty_hunter tier I–II); R9 = bounty (tier II–III); R11 = 道具补给 or 机密商店.
|
||||
- NORMAL: R3 bounty, R6 道具补给, R9 战术决策.
|
||||
- FUNNY: R3 道具补给, R9 战术决策.
|
||||
|
||||
Choice format:
|
||||
- **Multi:** 6 options shared by the team. Players pick 1 each in turn (first picker 30 s, others 16 s, `specialPhaseTime`=16, ~70 s total).
|
||||
- **Solo:** 3 options (3选1), time unlimited in 下半.
|
||||
- Effects worded "若存在其他队友则他们也获得" apply to everyone.
|
||||
|
||||
Bounty semantics (buff keys) [DATA]:
|
||||
- **Kill bounty** `add_enemy_kill_gain_coin {count, enemy_id, coin, round}`:
|
||||
- Adds `count` copies of `enemy_id` to the chooser's next `round` battles (99 = all remaining).
|
||||
- Whoever kills it (the chooser or a 联防 teammate) gets `coin`.
|
||||
- `enemyPrice` = coin value (1–6).
|
||||
- **Perfect bounty** `add_enemy_selfbattle_win_gain_coin` / `next_battle_add_enemy_win_gain_coin` ("战术特训"): adds enemies; coins only if the chooser clears perfectly in their own phase.
|
||||
- **多轮悬赏 · 假想敌 (enemyInitial_1..6):** adds 1 imaginary enemy to every subsequent battle, 1 coin each kill.
|
||||
|
||||
Team buffs (BUFF_GAIN, `allybuff_select_*`):
|
||||
- 列装: 2 random tier‑I items.
|
||||
- 盟誓 x8: bond layers +8…12 for specific bonds.
|
||||
- 财富: +1 fund.
|
||||
- 补给: next 2 refreshes free, stackable.
|
||||
- 整备: next item bought is advanced.
|
||||
- 升华: next operator bought is elite.
|
||||
- 驰援 x8: 1 random operator of a nation bond.
|
||||
- 自愈, 火力, 征召, 无瑕, 锐利.
|
||||
|
||||
Enemy debuffs (`enemydebuff_select_1..9`): all/elite/leader enemies get −ATK%, −DEF or −RES.
|
||||
|
||||
Map changes (`map_m0X_*`): remove barricades, turn them into shooting platforms, stop a sandstorm, remove bushes.
|
||||
|
||||
The full list of 182 choice, enemy and char-map effects is in Appendix A.
|
||||
|
||||
Enemy-side global modifiers (`aceffect_enemy_*`, type ENEMY):
|
||||
- 急行军: move speed +15%.
|
||||
- 补给线: HP +8%; 补给线II: HP +20%.
|
||||
- 攻坚装备: ATK +10%, HP +20%.
|
||||
- 攻坚装备II: ×0.8 / ×0.8.
|
||||
- 攻坚装备III: ATK ×0.7, HP ×0.75.
|
||||
|
||||
The last two look like the solo/easy stat reductions. [ASSUMED] Map them per mode as in §1.
|
||||
|
||||
---
|
||||
|
||||
## 13. Scoring, trophies, titles, tips, broadcasts
|
||||
|
||||
- **`roundScoreDataList`** (score by rounds cleared) [DATA]: 0→0, 1→10, 2→20, 3→30, 4→50, 5→70, 6→90, 7→110, 8→130, 9→150, 10→170, 11→200, 12→230, 13→260, 14→300. Used for the result screen and history [ASSUMED purpose].
|
||||
- **Trophies (成就奖杯), multi only** [WIKI PRTS 下半]:
|
||||
|
||||
| Rounds passed | 标准 | 险境 | 绝境 | 终极 |
|
||||
|---|---|---|---|---|
|
||||
| ≤4 | 0 | 0 | 0 | 0 |
|
||||
| ≤8 | 1 | 1 | 1 | 1 |
|
||||
| ≤11 | 2 | 2 | 2 | 2 |
|
||||
| ≤13 | 2 | 3 | 3 | 3 |
|
||||
| 14 (clear) | 3 | 4 | 5 | 6 |
|
||||
| ?? (hidden core) | – | 5 | 7 | 8 |
|
||||
|
||||
- **Trophy tiers (`medalDataList`):** 0, 10, 30, 60, 100 → trophy_level1..5 icons. The tier is shown in rooms and at band selection and is used for matchmaking ("精确搜寻").
|
||||
- **End-of-match titles (`playerTitleDataDict`):** 卫戍之星, 不朽盟约, 坚若磐石, 精英云集, 万事俱备, 挥金如土. [ASSUMED meanings]: top boss damage, most bond layers, least LP lost, most elites, most items, most funds spent.
|
||||
- **Broadcasts (`broadcastList`)**, in priority order (`{0}` = player, `{1}` = operator/level, `{2}` = amount):
|
||||
- BOSS_HIT (30): "{0}博士对敌方领袖造成的伤害超过20% / 50% / 80%!"
|
||||
- CHAR_DAMAGE (20): "{0}博士的{1}干员造成的伤害量达到{2}", at 200 000 / 500 000 / 1 000 000.
|
||||
- SHOP_LEVEL (11): "{0}博士将调度中心等级提升为{1}级", for levels 2–6.
|
||||
- BOND_EFFECT (10): "叠加层数".
|
||||
- GOLDEN_CHAR (2): "{0}博士的{1}干员晋升为精锐".
|
||||
- CHAR_GIFT (1): "{0}博士给你赠送了{1}".
|
||||
- **Report reasons (`reportPlayerDataList`):** 消极游戏, 故意捣乱, 中途退出, 不当言论, 骚扰, 作弊, 脚本, 其他.
|
||||
- **Emote themes:** emoticon_autochess_basic, emoticon_originium_slug, emoticon_autochess_basic_2, emoticon_foolsday_doctor / _amiya / _wisdel. Chat CD 1 s, bubble 3 s (`chatCD`, `chatTime`).
|
||||
- **Other constData:**
|
||||
- ping colours <60 / <200 / ≥200 ms;
|
||||
- `invitationSendCd` 60 s; `matchTimeMax` 120 s;
|
||||
- `bossTrailerStartRound` 3 (boss preview from R3);
|
||||
- hint timers 10 s;
|
||||
- `singleClosureStayTime` 15 s.
|
||||
- Price colours: discount #59f4ca, premium #ff5454, normal #ffc600.
|
||||
|
||||
### Game tips (`gameTipsList`, all weight 50), CN → EN
|
||||
1. 只有在联合模拟中才能获得奖杯 → Trophies are only earned in co-op (joint) simulation.
|
||||
2. 联合模拟在选择策略时可以进行一次跳过 → In co-op you may skip once while choosing a strategy.
|
||||
3. 归属于特定盟约的干员只有部分会出现在调度中心内 → Only some operators of certain alliances appear in the Dispatch Center.
|
||||
4. 调度中心即使冻结,依然可以主动刷新 → Even when frozen, the Dispatch Center can still be manually refreshed.
|
||||
5. 晋级的特殊奖励无法被刷新、冻结,也不会保留至下一回合 → Special promotion rewards can't be refreshed or frozen and don't carry to the next round.
|
||||
6. 处于临时整备区的调度资源,在进入下一回合后会自动销毁 → Resources in the temporary bench are destroyed when the next round begins.
|
||||
7. 一些特殊的盟约不需要部署干员也能激活生效 → Some special alliances activate without deploying operators.
|
||||
8. 干员晋级后已配发装备会回收至整备区,需要重新配置 → After promotion, equipped items return to the bench and must be re-equipped.
|
||||
9. 两件同名装备可以合成一件更强力的装备 → Two identical items merge into a stronger one.
|
||||
10. 特定的装备组合可以为干员赋予额外的盟约效果 → Certain item combos grant an operator an extra alliance.
|
||||
11. 叠加的盟约会在单次模拟中始终保留,但只有在盟约被激活时才会发挥作用 → Alliance stacks persist for the whole run but only work while the alliance is active.
|
||||
12. 多数情况下只有已经激活的盟约才可进行叠加 → Usually only active alliances can gain stacks.
|
||||
13. 休整期可以查看队友的战场情况 → During the rest phase you can view teammates' battlefields.
|
||||
14. 休整期可以查看当前回合即将迎击的敌方单位 → During the rest phase you can view this round's incoming enemies.
|
||||
15. 拖拽干员至整备区可以直接撤退干员 → Drag an operator to the bench to withdraw it.
|
||||
16. 全体参与者就绪之前可随时取消准备,准备战斗后将无法进行操作 → You can cancel Ready until everyone is ready; after the battle starts no actions are possible.
|
||||
17. 只有达成完美作战的队友可以进行联防 → Only teammates with a perfect clear can join the joint defense.
|
||||
18. 进行联防时,盟约不会继续叠加 → Alliances don't gain stacks during joint defense.
|
||||
19. 最终攻势中,两名参与者会处于同一个战场,但无法查看另一组队友的战场情况 → In the Final Assault, two participants share one battlefield but can't see the other pair's.
|
||||
20. 最终攻势中,所有人将一起对敌方领袖造成伤害 → In the Final Assault, everyone damages the enemy leader together.
|
||||
21. 达成特定的条件,可在最终攻势后解锁隐秘核心 → Meeting certain conditions unlocks the Hidden Core after the Final Assault.
|
||||
|
||||
---
|
||||
|
||||
## 14. Implementation notes for an authoritative server
|
||||
|
||||
Proposed server state per player:
|
||||
|
||||
```
|
||||
{ lp, funds, pendingFunds, shopLevel, upgradePrice, roundsAtLevel, shopSlots[6]{chessId|itemId, frozen, special},
|
||||
board[8]{chessId,pos,items[]}, bench[10], tempBench[], bondLayers{bondId:int}, spentTotal, refreshCountRound, perfectThisRound, eliminated }
|
||||
```
|
||||
|
||||
- Shared state: `pool{chessId:copiesLeft}` (multi), `round`, `phase`, `choiceQueue`, `bannedBonds`, `bossId`, `stageId`, `teamLp` (final).
|
||||
- Phase timers come from `turnInfoDataDict[mode][round].normalPhaseTime`. When a timer expires, auto-ready the player; they keep whatever they did. The combat limit comes from the round level's `maxPlayTime`.
|
||||
- Round-start order and settlement: §4.
|
||||
- Pool bookkeeping must be atomic, since two players can buy the last copy at once. Shop-displayed copies are not reserved, so the purchase fails if the pool is empty [COMM behaviour].
|
||||
- Merge check runs after every acquisition, including gifts, band grants and item effects. Board and bench copies both count.
|
||||
- Suggested defaults for undocumented values:
|
||||
- income `min(3+r, 10)`, FUNNY +2;
|
||||
- copy-weighted shop roll;
|
||||
- per-slot free freeze;
|
||||
- banned bonds per match: 1 core + 1 add-on;
|
||||
- boss HP `× alive/4` (solo ×0.25).
|
||||
|
||||
---
|
||||
|
||||
## 15. Open questions
|
||||
1. **Exact income after R3, and the cap.** The formula is inferred: `3+r` is solid for R1–R3 only; the cap of 10 is a guess (could be 12). FUNNY's "更加丰富" bonus is unknown.
|
||||
2. **Official shop tier odds.** Unpublished. The copy-weighted model is consistent with community remarks but unverified.
|
||||
3. **Number of bonds banned per match** and exactly which operators disappear ("只有部分会出现").
|
||||
4. **Band offer count and skip semantics** at BAND_CHECK (3 offered + 1 reroll assumed).
|
||||
5. **Which choice-event ids occur at which SP round** (server-side pools). The same applies to the `pool_*` contents.
|
||||
6. **Boss HP scaling** with player count, and solo boss HP.
|
||||
7. **联防 defender selection** when more than 2 players are perfect. Whether 1 or 2 defenders fight (PRTS: "1~2名").
|
||||
8. **Round-15 hidden boss selection.** Is it weighted random, or tied to the R14 boss? Thresholds: 下半 350/1200 vs 上半 300/1000. The sibling doc 05 uses 300/1000; act2 should use **350/1200**.
|
||||
9. **Whether the team result counts for eliminated players** (trophies are by "自身的通过回合数", i.e. per player rounds survived).
|
||||
|
||||
## 16. Sources
|
||||
- Game data: Kengxxiao/ArknightsGameData zh_CN (`activity_table.json` → `autoChessData`, `activity.AUTOCHESS_SEASON.act2autochess`; level JSONs).
|
||||
- PRTS: https://prts.wiki/w/卫戍协议 (raw); https://prts.wiki/w/卫戍协议:盟约 (上半); https://prts.wiki/w/卫戍协议:盟约_下半 (modes, hidden core, trophies).
|
||||
- BWIKI 盟约 玩法介绍: https://wiki.biligame.com/arknights/盟约 (refresh 1, sell 1, merge, funds not kept, upgrade −1/round).
|
||||
- Official patch notes: https://ak.hypergryph.com/news/5114.
|
||||
- Bahamut guides: https://forum.gamer.com.tw/C.php?bsn=33651&snA=12294 and snA=12316 (10 LP cap, B位, decision rounds, deploy order, pool rules).
|
||||
- NGA: tid 45713703 (economy / leveling), 45597280, 45645958, 46479287, 46592301 (mechanics and bugs), 46551276 (R3 bounty numbers).
|
||||
- bilibili BV1JWy3BkEpt (shared pool 12/14/18); note.com yu_channel_jp (pool I–VI = 12/14/18/16/8/5); note.com aik0aaac (250/400/425 rewards).
|
||||
- arknights.wiki.gg/wiki/Stronghold_Protocol (upgrade costs, 10 LP cap).
|
||||
|
||||
---
|
||||
|
||||
## Appendix A: all choice / enemy / char-map effects (`effectInfoDataDict` minus EQUIP/BOND/BAND/GARRISON)
|
||||
|
||||
| effectId | Type | Name | Bounty funds | Effect |
|
||||
|---|---|---|---|---|
|
||||
| `aceffect_char_1` | CHAR_MAP | 未精英化 | 0 | 无相关加成 |
|
||||
| `aceffect_char_2` | CHAR_MAP | 精英阶段1 | 0 | 攻击力和防御力+5% |
|
||||
| `aceffect_char_3` | CHAR_MAP | 精英阶段2 | 0 | 攻击力+10%,防御力和最大生命值+5% |
|
||||
| `aceffect_char_4` | CHAR_MAP | 精英阶段2-60级 | 0 | 攻击力、防御力和最大生命值+10% |
|
||||
| `enemyeffect_1` | ENEMY_GAIN | 无人机护障·P·战术特训 | 2 | 为自身下场作战添加3只无人机护障·P,若各自行动阶段就达成完美作战,获得2资金 |
|
||||
| `enemyeffect_2` | ENEMY_GAIN | 法术大师A2·多轮战术特训 | 2 | 之后的每场作战添加2只法术大师A2,若各自行动阶段就达成完美作战,获得2资金 |
|
||||
| `enemyeffect_3_2` | ENEMY_GAIN | 法术大师A2·悬赏 | 2 | 为自身下场作战添加1只法术大师A2,将其击倒者获得2资金 |
|
||||
| `enemyeffect_3_3` | ENEMY_GAIN | 元核孽生者·悬赏 | 3 | 为自身下场作战添加1只元核孽生者,将其击倒者获得3资金 |
|
||||
| `enemyeffect_3_4` | ENEMY_GAIN | 山海众头目·悬赏 | 2 | 为自身下场作战添加1只山海众头目,将其击倒者获得2资金 |
|
||||
| `enemyeffect_3_2_e` | ENEMY_GAIN | “萨科塔之眼”·悬赏 | 2 | 为自身下场作战添加1只“萨科塔之眼”,将其击倒者获得2资金 |
|
||||
| `enemyeffect_3_3_e` | ENEMY_GAIN | 幽灵组长·悬赏 | 1 | 为自身下场作战添加1只幽灵组长,将其击倒者获得1资金 |
|
||||
| `enemyeffect_3_4_e` | ENEMY_GAIN | 重装防御者·悬赏 | 1 | 为自身下场作战添加1只重装防御者,将其击倒者获得1资金 |
|
||||
| `enemyeffect_3_5_e` | ENEMY_GAIN | 重弩突袭者·悬赏 | 2 | 为自身下场作战添加1只重弩突袭者,将其击倒者获得2资金 |
|
||||
| `enemyeffect_4` | ENEMY_GAIN | 山海众头目·多轮悬赏 | 1 | 之后的每场作战添加1只山海众头目,将其击倒者获得1资金 |
|
||||
| `enemyeffect_5_1` | ENEMY_GAIN | 源石虫·特训 | 0 | 为自身下场作战添加1只源石虫,但不获得资金 |
|
||||
| `enemyeffect_5` | ENEMY_GAIN | 鸭爵·悬赏 | 3 | 为自身下场作战添加1只鸭爵,将其击倒者获得3资金 |
|
||||
| `enemyeffect_6` | ENEMY_GAIN | 高普尼克·悬赏 | 3 | 为自身下场作战添加1只高普尼克,将其击倒者获得3资金 |
|
||||
| `enemyeffect_7` | ENEMY_GAIN | 流泪小子·悬赏 | 3 | 为自身下场作战添加1只流泪小子,将其击倒者获得3资金 |
|
||||
| `enemyeffect_8` | ENEMY_GAIN | 圆仔·悬赏 | 3 | 为自身下场作战添加1只圆仔,将其击倒者获得3资金 |
|
||||
| `enemyeffect_b_1` | ENEMY_GAIN | 碎骨·悬赏 | 1 | 为自身下场作战添加1个碎骨,将其击倒者获得1资金 |
|
||||
| `enemyeffect_b_2` | ENEMY_GAIN | 萨卡兹百夫长·悬赏 | 2 | 为自身下场作战添加1个萨卡兹百夫长,将其击倒者获得2资金 |
|
||||
| `enemyeffect_b_3` | ENEMY_GAIN | 弑君者·悬赏 | 1 | 为自身下场作战添加1个弑君者,将其击倒者获得1资金 |
|
||||
| `enemyeffect_b_4` | ENEMY_GAIN | 泥岩·悬赏 | 4 | 为自身下场作战添加1个泥岩,将其击倒者获得4资金 |
|
||||
| `enemyeffect_b_5` | ENEMY_GAIN | 腐败骑士·悬赏 | 3 | 为自身下场作战添加1个腐败骑士,将其击倒者获得3资金 |
|
||||
| `enemyeffect_b_6` | ENEMY_GAIN | 凋零骑士·悬赏 | 3 | 为自身下场作战添加1个凋零骑士,将其击倒者获得3资金 |
|
||||
| `enemyeffect_b_7` | ENEMY_GAIN | “遗弃者”·悬赏 | 4 | 为自身下场作战添加1个“遗弃者”,将其击倒者获得4资金 |
|
||||
| `enemyeffect_b_8` | ENEMY_GAIN | 喷气人·悬赏 | 3 | 为自身下场作战添加1个喷气人,将其击倒者获得3资金 |
|
||||
| `enemyeffect_b_9` | ENEMY_GAIN | 杰斯顿·威廉姆斯·悬赏 | 4 | 为自身下场作战添加1个杰斯顿·威廉姆斯,将其击倒者获得4资金 |
|
||||
| `enemyeffect_b_10` | ENEMY_GAIN | W·悬赏 | 1 | 为自身下场作战添加1个W,将其击倒者获得1资金 |
|
||||
| `enemyeffect_b_11` | ENEMY_GAIN | “鼠王”·悬赏 | 2 | 为自身下场作战添加1个“鼠王”,将其击倒者获得2资金 |
|
||||
| `enemyeffect_b_12` | ENEMY_GAIN | “庞贝”·悬赏 | 2 | 为自身下场作战添加1个“庞贝”,将其击倒者获得2资金 |
|
||||
| `enemyeffect_b_13` | ENEMY_GAIN | 大鲍勃·悬赏 | 2 | 为自身下场作战添加1个大鲍勃,将其击倒者获得2资金 |
|
||||
| `enemyeffect_b_14` | ENEMY_GAIN | “自在”·悬赏 | 4 | 为自身下场作战添加1个“自在”,将其击倒者获得4资金 |
|
||||
| `enemyeffect_b_15` | ENEMY_GAIN | 锏·悬赏 | 5 | 为自身下场作战添加1个锏,将其击倒者获得5资金 |
|
||||
| `enemyeffect_b_16` | ENEMY_GAIN | 扎罗,“狼之主”·悬赏 | 5 | 为自身下场作战添加1个扎罗,“狼之主”,将其击倒者获得5资金 |
|
||||
| `enemyeffect_b_17` | ENEMY_GAIN | “墓碑”·悬赏 | 4 | 为自身下场作战添加1个“墓碑”,将其击倒者获得4资金 |
|
||||
| `enemyeffect_b_18` | ENEMY_GAIN | 迷路的巨像·悬赏 | 5 | 为自身下场作战添加1个迷路的巨像,将其击倒者获得5资金 |
|
||||
| `enemyeffect_b_19` | ENEMY_GAIN | 澪·悬赏 | 3 | 为自身下场作战添加1个澪,将其击倒者获得3资金 |
|
||||
| `enemyeffect_b_20` | ENEMY_GAIN | “巨大的丑东西”·悬赏 | 5 | 为自身下场作战添加1个“巨大的丑东西”,将其击倒者获得5资金 |
|
||||
| `enemyeffect_b_21` | ENEMY_GAIN | “复仇者”·悬赏 | 6 | 为自身下场作战添加1个“复仇者”,将其击倒者获得6资金 |
|
||||
| `enemyeffect_b_22` | ENEMY_GAIN | “邪魔的利刃”·悬赏 | 3 | 为自身下场作战添加1个“邪魔的利刃”,将其击倒者获得3资金 |
|
||||
| `enemyeffect_b_23` | ENEMY_GAIN | 陷落雪祀·悬赏 | 3 | 为自身下场作战添加1个陷落雪祀,将其击倒者获得3资金 |
|
||||
| `enemyeffect_b_24` | ENEMY_GAIN | 纠缠藤蔓·悬赏 | 3 | 为自身下场作战添加1个纠缠藤蔓,将其击倒者获得3资金 |
|
||||
| `allybuff_select_1` | BUFF_GAIN | 列装 | 0 | 你获得2件随机1阶装备,若存在其他队友则他们也获得 |
|
||||
| `allybuff_select_2_1` | BUFF_GAIN | 斯卡蒂的盟誓 | 0 | 你的阿戈尔、突袭和坚守盟约层数+8,若存在其他队友则他们也获得 |
|
||||
| `allybuff_select_2_2` | BUFF_GAIN | 诗怀雅的盟誓 | 0 | 你的炎和投资人盟约层数+10,若存在其他队友则他们也获得 |
|
||||
| `allybuff_select_2_3` | BUFF_GAIN | 风笛的盟誓 | 0 | 你的维多利亚、远见和不屈盟约层数+8,若存在其他队友则他们也获得 |
|
||||
| `allybuff_select_2_4` | BUFF_GAIN | 银灰的盟誓 | 0 | 你的谢拉格、投资人、迅捷盟约层数+8,若存在其他队友则他们也获得 |
|
||||
| `allybuff_select_2_5` | BUFF_GAIN | 莫斯提马的盟誓 | 0 | 你的拉特兰、奥术盟约层数+10,若存在其他队友则他们也获得 |
|
||||
| `allybuff_select_2_6` | BUFF_GAIN | 缇缇的盟誓 | 0 | 你的萨尔贡、精准盟约层数+10,若存在其他队友则他们也获得 |
|
||||
| `allybuff_select_2_7` | BUFF_GAIN | 玛恩纳的盟誓 | 0 | 你的卡西米尔盟约层数+12,若存在其他队友则他们也获得 |
|
||||
| `allybuff_select_2_8` | BUFF_GAIN | 德克萨斯的盟誓 | 0 | 你的叙拉古、突袭盟约层数+10,若存在其他队友则他们也获得 |
|
||||
| `allybuff_select_3` | BUFF_GAIN | 财富 | 0 | 你获得1资金,若存在其他队友则他们也获得 |
|
||||
| `allybuff_select_4` | BUFF_GAIN | 补给 | 0 | 你接下来的2次刷新变为免费(可叠加),若存在其他队友则他们也获得 |
|
||||
| `allybuff_select_5` | BUFF_GAIN | 整备 | 0 | 你接下来购买的1件装备变为进阶品质 |
|
||||
| `allybuff_select_6` | BUFF_GAIN | 升华 | 0 | 你接下来购买的1名干员变为精锐状态 |
|
||||
| `allybuff_select_7_1` | BUFF_GAIN | 炎盟约驰援 | 0 | 你获得1名炎盟约的随机干员棋子 |
|
||||
| `allybuff_select_7_2` | BUFF_GAIN | 谢拉格驰援 | 0 | 你获得1名谢拉格盟约的随机干员棋子 |
|
||||
| `allybuff_select_7_3` | BUFF_GAIN | 萨尔贡驰援 | 0 | 你获得1名萨尔贡盟约的随机干员棋子 |
|
||||
| `allybuff_select_7_4` | BUFF_GAIN | 叙拉古驰援 | 0 | 你获得1名叙拉古盟约的随机干员棋子 |
|
||||
| `allybuff_select_7_5` | BUFF_GAIN | 卡西米尔驰援 | 0 | 你获得1名卡西米尔盟约的随机干员棋子 |
|
||||
| `allybuff_select_7_6` | BUFF_GAIN | 拉特兰驰援 | 0 | 你获得1名拉特兰盟约的随机干员棋子 |
|
||||
| `allybuff_select_7_7` | BUFF_GAIN | 维多利亚驰援 | 0 | 你获得1名维多利亚盟约的随机干员棋子 |
|
||||
| `allybuff_select_7_8` | BUFF_GAIN | 阿戈尔驰援 | 0 | 你获得1名阿戈尔盟约的随机干员棋子 |
|
||||
| `allybuff_select_11` | BUFF_GAIN | 自愈 | 0 | 你获得:我方单位每次受到伤害时回复50点生命值;若存在其他队友则他们也获得此效果 |
|
||||
| `allybuff_select_13` | BUFF_GAIN | 火力 | 0 | 你获得:休整期结束时若手牌区至少有3个单位,我方所有干员无视敌人20法术抗性;若存在其他队友则他们也获得此效果 |
|
||||
| `allybuff_select_14` | BUFF_GAIN | 征召 | 0 | 你获得:开始作战时若场上至少有一行存在3名干员,所有干员的再部署时间-50%;若存在其他队友则他们也获得此效果 |
|
||||
| `allybuff_select_18` | BUFF_GAIN | 无瑕 | 0 | 你获得:干员在生命值为满时,攻击力、防御力+30%;若存在其他队友则他们也获得此效果 |
|
||||
| `allybuff_select_19` | BUFF_GAIN | 锐利 | 0 | 你获得:休整期结束时若手牌区为空,我方所有干员无视敌人30%的防御力;若存在其他队友则他们也获得此效果 |
|
||||
| `enemydebuff_select_1` | BUFF_GAIN | 排斥:乏力 | 0 | 全部敌人获得减益效果:攻击力-5% |
|
||||
| `enemydebuff_select_2` | BUFF_GAIN | 排斥:脆弱 | 0 | 全部敌人获得减益效果:防御力-100 |
|
||||
| `enemydebuff_select_3` | BUFF_GAIN | 排斥:致幻 | 0 | 全部敌人获得减益效果:法术抗性-3 |
|
||||
| `enemydebuff_select_4` | BUFF_GAIN | 责罚:乏力 | 0 | 精英敌人获得减益效果:攻击力-6% |
|
||||
| `enemydebuff_select_5` | BUFF_GAIN | 责罚:脆弱 | 0 | 精英敌人获得减益效果:防御力-150 |
|
||||
| `enemydebuff_select_6` | BUFF_GAIN | 责罚:致幻 | 0 | 精英敌人获得减益效果:法术抗性-5 |
|
||||
| `enemydebuff_select_7` | BUFF_GAIN | 裁决:乏力 | 0 | 领袖敌人获得减益效果:攻击力-7% |
|
||||
| `enemydebuff_select_8` | BUFF_GAIN | 裁决:脆弱 | 0 | 领袖敌人获得减益效果:防御力-200 |
|
||||
| `enemydebuff_select_9` | BUFF_GAIN | 裁决:致幻 | 0 | 领袖敌人获得减益效果:法术抗性-7 |
|
||||
| `aceffect_enemy_1` | ENEMY | 急行军 | 0 | 所有敌人移动速度+15% |
|
||||
| `aceffect_enemy_2` | ENEMY | 补给线 | 0 | 所有敌人最大生命值+8% |
|
||||
| `aceffect_enemy_2_2` | ENEMY | 补给线II | 0 | 所有敌人最大生命值+20% |
|
||||
| `aceffect_enemy_3` | ENEMY | 攻坚装备 | 0 | 所有敌人攻击力+10%,最大生命值+20% |
|
||||
| `aceffect_enemy_4` | ENEMY | 攻坚装备II | 0 | 所有敌人攻击力-20%,最大生命值-20% |
|
||||
| `aceffect_enemy_5` | ENEMY | 攻坚装备III | 0 | 所有敌人攻击力-30%,最大生命值-25% |
|
||||
| `enemyInitial_1` | ENEMY_GAIN | 多轮悬赏 · 假想敌:蚀裂 | 1 | 后续每场作战添加1只假想敌:蚀裂(被击倒时造成持续伤害),击倒它的你或队友获得1资金 |
|
||||
| `enemyInitial_2` | ENEMY_GAIN | 多轮悬赏 · 假想敌:淤困 | 1 | 后续每场作战添加1只假想敌:淤困(可造成元素损伤),击倒它的你或队友获得1资金 |
|
||||
| `enemyInitial_3` | ENEMY_GAIN | 多轮悬赏 · 假想敌:骨刺 | 1 | 后续每场作战添加1只假想敌:骨刺(拥有隐匿),击倒它的你或队友获得1资金 |
|
||||
| `enemyInitial_4` | ENEMY_GAIN | 多轮悬赏 · 假想敌:黑云 | 1 | 后续每场作战添加1只假想敌:黑云(空中敌人),击倒它的你或队友获得1资金 |
|
||||
| `enemyInitial_5` | ENEMY_GAIN | 多轮悬赏 · 假想敌:再生 | 1 | 后续每场作战添加1只假想敌:再生(需要一定攻击次数击破),击倒它的你或队友获得1资金 |
|
||||
| `enemyInitial_6` | ENEMY_GAIN | 多轮悬赏 · 假想敌:镜膜 | 1 | 后续每场作战添加1只假想敌:镜膜(拥有折射),击倒它的你或队友获得1资金 |
|
||||
| `map_m01_1` | BUFF_GAIN | 模拟战场演变·模式一 | 0 | 移除场地上全部阻隔工事 |
|
||||
| `map_m02_1` | BUFF_GAIN | 模拟战场演变·模式二 | 0 | 场地上全部阻隔工事变为射击台 |
|
||||
| `map_m02_2` | BUFF_GAIN | 模拟战场演变·模式三 | 0 | 移除场地上全部阻隔工事 |
|
||||
| `map_m03_1` | BUFF_GAIN | 模拟战场演变·模式四 | 0 | 移除场地左侧的阻隔工事 |
|
||||
| `map_m03_2` | BUFF_GAIN | 模拟战场演变·模式五 | 0 | 场地右侧的射击台变为可以部署高台干员和地面干员的地面 |
|
||||
| `map_m04_1` | BUFF_GAIN | 模拟战场演变·模式六 | 0 | 移除场地上全部阻隔工事 |
|
||||
| `map_m06_1` | BUFF_GAIN | 模拟战场演变·模式八 | 0 | 场地中的沙尘暴停止 |
|
||||
| `map_m07_1` | BUFF_GAIN | 模拟战场演变·模式九 | 0 | 场上的树丛全部消失 |
|
||||
| `enemyeffect_10_1` | ENEMY_GAIN | 战术特训·飞行I | 1 | 为自身下场战斗添加1只妖怪,若各自行动阶段就达成完美作战,获得1资金 |
|
||||
| `enemyeffect_10_2` | ENEMY_GAIN | 战术特训·飞行II | 2 | 为自身下场战斗添加1只暴鸰,若各自行动阶段就达成完美作战,获得2资金 |
|
||||
| `enemyeffect_10_3` | ENEMY_GAIN | 战术特训·飞行III | 3 | 为自身下场战斗添加1只帝国炮火中枢先兆者,若各自行动阶段就达成完美作战,获得3资金 |
|
||||
| `enemyeffect_10_4` | ENEMY_GAIN | 悬赏·飞行I | 1 | 为自身接下来两场作战添加1只妖怪,将其击倒者获得1资金 |
|
||||
| `enemyeffect_10_5` | ENEMY_GAIN | 悬赏·飞行II | 2 | 为自身接下来两场作战添加1只暴鸰,将其击倒者获得2资金 |
|
||||
| `enemyeffect_10_6` | ENEMY_GAIN | 悬赏·飞行III | 3 | 为自身接下来两场作战添加1只法术大师A1,将其击倒者获得3资金 |
|
||||
| `enemyeffect_11_1` | ENEMY_GAIN | 战术特训·频次I | 1 | 为自身下场战斗添加1只磨砻,若各自行动阶段就达成完美作战,获得1资金 |
|
||||
| `enemyeffect_11_2` | ENEMY_GAIN | 战术特训·频次II | 2 | 为自身下场战斗添加1只烹泉,若各自行动阶段就达成完美作战,获得2资金 |
|
||||
| `enemyeffect_11_3` | ENEMY_GAIN | 战术特训·频次III | 3 | 为自身下场战斗添加1只新硎,若各自行动阶段就达成完美作战,获得3资金 |
|
||||
| `enemyeffect_11_4` | ENEMY_GAIN | 悬赏·频次I | 1 | 为自身接下来两场作战添加1只磨砻,将其击倒者获得1资金 |
|
||||
| `enemyeffect_11_5` | ENEMY_GAIN | 悬赏·频次II | 2 | 为自身接下来两场作战添加1只烹泉,将其击倒者获得2资金 |
|
||||
| `enemyeffect_11_6` | ENEMY_GAIN | 悬赏·频次III | 3 | 为自身接下来两场作战添加1只清明,将其击倒者获得3资金 |
|
||||
| `enemyeffect_12_1` | ENEMY_GAIN | 战术特训·损伤I | 1 | 为自身下场战斗添加1只底海滑动者,若各自行动阶段就达成完美作战,获得1资金 |
|
||||
| `enemyeffect_12_2` | ENEMY_GAIN | 战术特训·损伤II | 2 | 为自身下场战斗添加1只炽焰源石虫,若各自行动阶段就达成完美作战,获得2资金 |
|
||||
| `enemyeffect_12_3` | ENEMY_GAIN | 战术特训·损伤III | 3 | 为自身下场战斗添加1只灼藤,若各自行动阶段就达成完美作战,获得3资金 |
|
||||
| `enemyeffect_12_4` | ENEMY_GAIN | 悬赏·损伤I | 1 | 为自身接下来两场作战添加1只底海滑动者,将其击倒者获得1资金 |
|
||||
| `enemyeffect_12_5` | ENEMY_GAIN | 悬赏·损伤II | 2 | 为自身接下来两场作战添加1只控潮术师,将其击倒者获得2资金 |
|
||||
| `enemyeffect_12_6` | ENEMY_GAIN | 悬赏·损伤III | 3 | 为自身接下来两场作战添加1只术师快艇,将其击倒者获得3资金 |
|
||||
| `enemyeffect_13_1` | ENEMY_GAIN | 战术特训·持续I | 1 | 为自身下场战斗添加1只逐腐兽,若各自行动阶段就达成完美作战,获得1资金 |
|
||||
| `enemyeffect_13_2` | ENEMY_GAIN | 战术特训·持续II | 2 | 为自身下场战斗添加1只萨卡兹枯朽战士组长,若各自行动阶段就达成完美作战,获得2资金 |
|
||||
| `enemyeffect_13_3` | ENEMY_GAIN | 战术特训·持续III | 3 | 为自身下场战斗添加1只尖端萨卡兹枯朽战车,若各自行动阶段就达成完美作战,获得3资金 |
|
||||
| `enemyeffect_13_4` | ENEMY_GAIN | 悬赏·持续I | 1 | 为自身接下来两场作战添加1只萨卡兹枯朽战士组长,将其击倒者获得1资金 |
|
||||
| `enemyeffect_13_5` | ENEMY_GAIN | 悬赏·持续II | 2 | 为自身接下来两场作战添加1只逐腐兽,将其击倒者获得2资金 |
|
||||
| `enemyeffect_13_6` | ENEMY_GAIN | 悬赏·持续III | 3 | 为自身接下来两场作战添加1只萨卡兹枯朽战车,将其击倒者获得3资金 |
|
||||
| `enemyeffect_14_1` | ENEMY_GAIN | 战术特训·隐匿I | 1 | 为自身下场战斗添加1只隐形弩手,若各自行动阶段就达成完美作战,获得1资金 |
|
||||
| `enemyeffect_14_2` | ENEMY_GAIN | 战术特训·隐匿II | 2 | 为自身下场战斗添加1只节日爵士乐手,若各自行动阶段就达成完美作战,获得2资金 |
|
||||
| `enemyeffect_14_3` | ENEMY_GAIN | 战术特训·隐匿III | 3 | 为自身下场战斗添加1只家族灭迹人,若各自行动阶段就达成完美作战,获得3资金 |
|
||||
| `enemyeffect_14_4` | ENEMY_GAIN | 悬赏·隐匿I | 1 | 为自身接下来两场作战添加1只隐形弩手,将其击倒者获得1资金 |
|
||||
| `enemyeffect_14_5` | ENEMY_GAIN | 悬赏·隐匿II | 2 | 为自身接下来两场作战添加1只隐形术师,将其击倒者获得2资金 |
|
||||
| `enemyeffect_14_6` | ENEMY_GAIN | 悬赏·隐匿III | 3 | 为自身接下来两场作战添加1只山海众头目,将其击倒者获得3资金 |
|
||||
| `enemyeffect_15_1` | ENEMY_GAIN | 战术特训·折射I | 1 | 为自身下场战斗添加1只深池方阵战士,若各自行动阶段就达成完美作战,获得1资金 |
|
||||
| `enemyeffect_15_2` | ENEMY_GAIN | 战术特训·折射II | 2 | 为自身下场战斗添加1只深池暗影术师队长,若各自行动阶段就达成完美作战,获得2资金 |
|
||||
| `enemyeffect_15_3` | ENEMY_GAIN | 战术特训·折射III | 3 | 为自身下场战斗添加1只深池伙友卫队精英,若各自行动阶段就达成完美作战,获得3资金 |
|
||||
| `enemyeffect_15_4` | ENEMY_GAIN | 悬赏·折射I | 1 | 为自身接下来两场作战添加1只深池方阵战士,将其击倒者获得1资金 |
|
||||
| `enemyeffect_15_5` | ENEMY_GAIN | 悬赏·折射II | 2 | 为自身接下来两场作战添加1只深池暗影术师,将其击倒者获得2资金 |
|
||||
| `enemyeffect_15_6` | ENEMY_GAIN | 悬赏·折射III | 3 | 为自身接下来两场作战添加1只深池伙友卫队,将其击倒者获得3资金 |
|
||||
| `enemyeffect_16_1` | ENEMY_GAIN | 悬赏·特异III | 3 | 为自身下场战斗添加1只泥岩巨像,将其击倒者获得3资金 |
|
||||
| `enemyeffect_16_2` | ENEMY_GAIN | 悬赏·特异III | 3 | 为自身下场战斗添加1只“越长尘”,将其击倒者获得3资金 |
|
||||
| `enemyeffect_16_3` | ENEMY_GAIN | 悬赏·特异III | 3 | 为自身下场战斗添加1只狂暴宿主组长,将其击倒者获得3资金 |
|
||||
| `enemyeffect_16_4` | ENEMY_GAIN | 悬赏·特异III | 3 | 为自身下场战斗添加1只温顺的武装大驮兽,将其击倒者获得3资金 |
|
||||
| `enemyeffect_16_5` | ENEMY_GAIN | 悬赏·特异III | 3 | 为自身下场战斗添加1只萨卡兹骸骨拷打者,将其击倒者获得3资金 |
|
||||
| `enemyeffect_16_6` | ENEMY_GAIN | 悬赏·特异III | 3 | 为自身下场战斗添加1只高准度伦蒂尼姆城防自行炮,将其击倒者获得3资金 |
|
||||
| `enemyeffect_16_7` | ENEMY_GAIN | 悬赏·特异III | 3 | 为自身下场战斗添加1只乌顶巨角卢鲁,将其击倒者获得3资金 |
|
||||
| `enemyeffect_16_8` | ENEMY_GAIN | 悬赏·特异III | 3 | 为自身下场战斗添加1只伊利昂的木驮兽,将其击倒者获得3资金 |
|
||||
| `enemyeffect_16_9` | ENEMY_GAIN | 悬赏·特异II | 2 | 为自身下场战斗添加1只拥霜羽兽,将其击倒者获得2资金 |
|
||||
| `enemyeffect_16_10` | ENEMY_GAIN | 悬赏·特异II | 2 | 为自身下场战斗添加1只异质裂兽·α,将其击倒者获得2资金 |
|
||||
| `enemyeffect_16_11` | ENEMY_GAIN | 悬赏·损伤I | 1 | 为自身下场战斗添加1只心虚设计师,将其击倒者获得1资金 |
|
||||
| `enemyeffect_16_12` | ENEMY_GAIN | 悬赏·特异I | 1 | 为自身下场战斗添加1只转译基底·α,将其击倒者获得1资金 |
|
||||
| `enemyeffect_10_7` | ENEMY_GAIN | 悬赏·飞行I | 1 | 为自身下场战斗添加1只法术大师A2,将其击倒者获得1资金 |
|
||||
| `enemyeffect_10_8` | ENEMY_GAIN | 悬赏·飞行II | 2 | 为自身下场战斗添加1只枯朽萃聚使徒,将其击倒者获得2资金 |
|
||||
| `enemyeffect_11_7` | ENEMY_GAIN | 悬赏·频次I | 1 | 为自身下场战斗添加1只沏虹,将其击倒者获得1资金 |
|
||||
| `enemyeffect_11_8` | ENEMY_GAIN | 悬赏·频次II | 2 | 为自身下场战斗添加1只新硎,将其击倒者获得2资金 |
|
||||
| `enemyeffect_12_7` | ENEMY_GAIN | 悬赏·损伤II | 2 | 为自身下场战斗添加1只灼藤,将其击倒者获得2资金 |
|
||||
| `enemyeffect_12_8` | ENEMY_GAIN | 悬赏·损伤II | 2 | 为自身下场战斗添加1只异光体孽生者,将其击倒者获得2资金 |
|
||||
| `enemyeffect_13_7` | ENEMY_GAIN | 悬赏·持续I | 1 | 为自身下场战斗添加1只假想敌:蚀裂,将其击倒者获得1资金 |
|
||||
| `enemyeffect_13_8` | ENEMY_GAIN | 悬赏·持续II | 2 | 为自身下场战斗添加1只尖端萨卡兹枯朽战车,将其击倒者获得2资金 |
|
||||
| `enemyeffect_14_7` | ENEMY_GAIN | 悬赏·隐匿I | 1 | 为自身下场战斗添加1只重弩突袭者,将其击倒者获得1资金 |
|
||||
| `enemyeffect_14_8` | ENEMY_GAIN | 悬赏·隐匿II | 2 | 为自身下场战斗添加1只家族暗影灭迹人,将其击倒者获得2资金 |
|
||||
| `enemyeffect_15_7` | ENEMY_GAIN | 悬赏·折射II | 2 | 为自身下场战斗添加1只深池重甲卫士队长,将其击倒者获得2资金 |
|
||||
| `enemyeffect_15_8` | ENEMY_GAIN | 悬赏·折射II | 2 | 为自身下场战斗添加1只愤怒的守墓石像,将其击倒者获得2资金 |
|
||||
| `enemyeffect_17_1` | ENEMY_GAIN | 悬赏·特异I | 1 | 为自身接下来两场作战添加1只雪孩子,将其击倒者获得1资金 |
|
||||
| `enemyeffect_17_2` | ENEMY_GAIN | 悬赏·特异I | 1 | 为自身接下来两场作战添加1只新手祭司学徒,将其击倒者获得1资金 |
|
||||
| `enemyeffect_17_3` | ENEMY_GAIN | 悬赏·特异I | 1 | 为自身接下来两场作战添加1只冒失的小弟,将其击倒者获得1资金 |
|
||||
| `enemyeffect_17_4` | ENEMY_GAIN | 悬赏·特异II | 2 | 为自身接下来两场作战添加1只骇笑看客,将其击倒者获得2资金 |
|
||||
| `enemyeffect_17_5` | ENEMY_GAIN | 悬赏·特异II | 2 | 为自身接下来两场作战添加1只水遁忍者,将其击倒者获得2资金 |
|
||||
| `enemyeffect_17_6` | ENEMY_GAIN | 悬赏·特异III | 3 | 为自身接下来两场作战添加1只自制投石机,将其击倒者获得3资金 |
|
||||
| `enemyeffect_18_1` | ENEMY_GAIN | 悬赏·损伤I | 1 | 为自身接下来两场作战添加1只临时收音师,将其击倒者获得1资金 |
|
||||
| `enemyeffect_18_2` | ENEMY_GAIN | 悬赏·特异I | 1 | 为自身接下来两场作战添加1只迷茫的修理小助手,将其击倒者获得1资金 |
|
||||
| `enemyeffect_18_3` | ENEMY_GAIN | 悬赏·特异I | 1 | 为自身接下来两场作战添加1只高能源石虫,将其击倒者获得1资金 |
|
||||
| `enemyeffect_18_4` | ENEMY_GAIN | 悬赏·特异II | 2 | 为自身接下来两场作战添加1只圣堂剑士,将其击倒者获得2资金 |
|
||||
| `enemyeffect_18_5` | ENEMY_GAIN | 悬赏·特异II | 2 | 为自身接下来两场作战添加1只寻仇者,将其击倒者获得2资金 |
|
||||
| `enemyeffect_18_6` | ENEMY_GAIN | 悬赏·损伤III | 3 | 为自身接下来两场作战添加1只主角阵营角色,将其击倒者获得3资金 |
|
||||
| `enemyeffect_19_1` | ENEMY_GAIN | 悬赏·特异I | 1 | 为自身接下来两场作战添加1只节日气球,将其击倒者获得1资金 |
|
||||
| `enemyeffect_19_2` | ENEMY_GAIN | 悬赏·特异I | 1 | 为自身接下来两场作战添加1只简饲源石虫,将其击倒者获得1资金 |
|
||||
| `enemyeffect_19_3` | ENEMY_GAIN | 悬赏·折射I | 1 | 为自身接下来两场作战添加1只深池侦察犬pro,将其击倒者获得1资金 |
|
||||
| `enemyeffect_19_4` | ENEMY_GAIN | 悬赏·飞行II | 2 | 为自身接下来两场作战添加1只吉兆飞鳞,将其击倒者获得2资金 |
|
||||
| `enemyeffect_19_5` | ENEMY_GAIN | 悬赏·特异II | 2 | 为自身接下来两场作战添加1只咸鳞汁推荐者,将其击倒者获得2资金 |
|
||||
| `enemyeffect_19_6` | ENEMY_GAIN | 悬赏·损伤III | 3 | 为自身接下来两场作战添加1只反派阵营角色,将其击倒者获得3资金 |
|
||||
| `enemyeffect_20_1` | ENEMY_GAIN | 悬赏·持续I | 1 | 为自身接下来两场作战添加1只萨卡兹枯朽战士,将其击倒者获得1资金 |
|
||||
| `enemyeffect_20_2` | ENEMY_GAIN | 悬赏·频次I | 1 | 为自身接下来两场作战添加1只俗心,将其击倒者获得1资金 |
|
||||
| `enemyeffect_20_3` | ENEMY_GAIN | 悬赏·特异I | 1 | 为自身接下来两场作战添加1只潜伏者,将其击倒者获得1资金 |
|
||||
| `enemyeffect_20_4` | ENEMY_GAIN | 悬赏·特异II | 2 | 为自身接下来两场作战添加1只“独轮车玩具”,将其击倒者获得2资金 |
|
||||
| `enemyeffect_20_5` | ENEMY_GAIN | 悬赏·损伤II | 2 | 为自身接下来两场作战添加1只无胄盟清扫小队,将其击倒者获得2资金 |
|
||||
| `enemyeffect_20_6` | ENEMY_GAIN | 悬赏·损伤III | 3 | 为自身接下来两场作战添加1只鼎沸,将其击倒者获得3资金 |
|
||||
|
||||
---
|
||||
|
||||
## Addendum (critic)
|
||||
|
||||
Written by the completeness critic on 2026-09-27, after cross-reading 01–07. New sources:
|
||||
- PRTS `卫戍协议/帮助` and the raw wikitext of `卫戍协议:盟约_下半` §开始模拟.
|
||||
- The raw wikitext of the BWIKI page `盟约` and of `盟约/S.W.E.E.P.报告`.
|
||||
- The official gameplay-intro long image (`img.71acg.net/sykb~bbs/pc/1763033996225879`, 800×13685, in 10 slices).
|
||||
- The TW/CN screenshots already listed in 06 §15.
|
||||
- The official 3/27 notice (`ak.hypergryph.com/news/8584`).
|
||||
|
||||
Local copies are in `scratchpad/gd/extra/critic/` (`bw_盟约.txt`, `bw_sweep.txt`, `bw_卫戍协议_1.txt`, `intro_00..09.jpg`, screenshots). Tags: **[VERIFIED]** = from an official or wiki rule text or a screenshot. **[ASSUMED]** = still a proposal.
|
||||
|
||||
### A1. Corrections and confirmations to this file
|
||||
|
||||
| § | Was | Now | Tag |
|
||||
|---|---|---|---|
|
||||
| 0, 5.1 | income R1–R3 = 4/5/6 inferred. Cap 10. FUNNY +2 | **R1 = 4, R2 = 5, R3 = 6 confirmed by screenshots.** R1 = 4: official intro (标准, round 1, funds 4, board empty) and TW client R1. R2 = 5: TW R2, upgrade price 4. R3 = 6: official intro 标准 R3 and the co-op 道具补给 screenshot at R3. **FUNNY gets no bonus** (the official intro shows 4 at R1 in 标准). Cap still unknown: **recommend `income(r) = min(3 + r, 12)`**, because the predecessor 卫戍协议 (2024) used "从第2回合开始每回合获得资金数+1,上限12" and 盟约's upgrade prices (5/8/11/12/13) are one step above 2024's (5/6/8/11/12). Keep the cap in config (10 is the alternative). | VERIFIED R1–R3; cap ASSUMED |
|
||||
| 4.1 | round-start auto refresh [ASSUMED] | Confirmed: "进入此阶段时,触发<进入休整期时>的效果,分配一定资金,刷新调度中心未被冻结的位置". Income is granted **before** the 机变 phase: funds are visible behind every 机变 overlay screenshot. | VERIFIED |
|
||||
| 4.2 / 14 | freeze per slot [ASSUMED] | **One 冻结 button freezes ALL unsold slots**, operators and item: "【冻结】会将当前整备区的全部未售出栏位冻结,将其保留至下一回合。点击【解冻】可以解除该操作". The freeze is consumed at the next round start. In the official intro, frozen cards reappear in R3 and the button reads 冻结 again. A manual refresh is allowed while frozen (tip 4) and rerolls every slot, frozen ones included (2024 rule "重新调配包括冻结中的所有干员和道具"). Keep a per-slot `frozen` flag internally, because 梓兰 freezes one card. | VERIFIED |
|
||||
| new | – | At **combat start, all unfrozen shop contents are cleared** ("进入作战期后,栏上若未处于冻结状态则清空全部物资"). | VERIFIED |
|
||||
| 4.2 / 8 | bench 10 + temp area | **Hand (手牌区/整备区) = 10 regular + 5 temporary slots**, shared by operators, **items** and hand-deployable **summons**. Several summons of one owner stack into 1 slot; summons of different owners don't stack.<br>When the regular hand is full, every action that would add a card is refused: buy, and withdraw from the board. Exception: a purchase that completes a 3-merge nets −1 card, so allow it.<br>Passive gains (merge result, band/trait/item grants, items returned by promotion) overflow into the temp slots. **While temp is non-empty the player cannot start combat.** Temp is wiped when the next phase starts.<br>A board↔hand swap is allowed even with a full hand. Cards fill hand slots **right→left**. | VERIFIED |
|
||||
| 5.2 | – | **Items cannot be sold** ("多余的装备无法进行出售,可以销毁"). They can only be destroyed for 0 funds. Operators sell for 1 from board or hand. | VERIFIED |
|
||||
| 7 | promotion reward [COMM] | Confirmed (PRTS 帮助, BWIKI, official intro). On acquiring the 3rd copy:<br>1. The 3rd copy is not created, and the 2 owned copies are destroyed wherever they are.<br>2. **1 elite goes to the hand, not to a board tile.** Their equipment returns to the hand.<br>3. The shop then temporarily shows **3 operators of tier min(shopLevel+1, 6) at price 0**. The official intro shows "II 0 ×3" after a tier-I merge at L1 and "III 0 ×3" at L2.<br>4. The player takes **1**. The offer cannot be refreshed or frozen and expires at round end. | VERIFIED |
|
||||
| 2 | BAND_CHECK "3 random + reroll" [ASSUMED] | **All unlocked bands are shown.** In co-op, players pick **one at a time in a random order** shown on the left ("以随机顺序进行策略轮选"). Each co-op player may **skip once**. The step lasts 50 s; on timeout the band is 华法琳. **Duplicates are allowed:** the official illustration shows 2 teammates' picks still un-greyed in the grid. [ASSUMED] 12 s per turn inside the 50 s step. | VERIFIED except the per-turn timer |
|
||||
| 2 | banned bonds "1 core + 1 add-on" [ASSUMED] | Replaced by the verified rule in **A2**. | VERIFIED |
|
||||
| 1, 12 | one ×0.7/×0.8 multiplier per mode; `aceffect_enemy_*` mapping [ASSUMED] | Replaced by the **per-round table in A3**. | VERIFIED (PRTS, user-sourced) |
|
||||
| 4.3 | "automatic, paying DP" | At battle start **all board units deploy for free**, one by one in order: 下半 top→bottom, then left→right; right-side players in the boss round are mirrored.<br>**DP starts at 10, +1/s, cap 99.** These are the round-level `options`. `initialCost` 0 in `m0X` is the terrain file, not the round level.<br>DP is only spent on **automatic redeploy**: the unit returns to its original tile when its respawn timer is done, the tile is free, and DP ≥ `cost`.<br>Deploy effects do not fire during prep placement. Battle speed is forced to **2×**. | VERIFIED |
|
||||
| 4.3 | leaked/timeout | When `maxPlayTime` ends, the battle stops. Every enemy not killed (still alive, or reached the goal) is "未击倒" and feeds 联防/LP. [ASSUMED] `maxPlayTime` is **game-time** seconds, so the client at 2× shows it ticking twice as fast. Last spawns land at 15/38/73 s against limits of 45/55/115 s, which leaves the time needed to kill walkers. | VERIFIED + ASSUMED unit |
|
||||
| 3 | solo prep 300 s | 下半 solo has **no timer** on prep or 机变 ("休整期及机变阶段没有时间限制…24小时内随时返回"). Treat `normalPhaseTime` 300 and `specialPhaseTime` 150 as an optional "timed solo" setting. | VERIFIED |
|
||||
| 4.4 | 联防 partner rule "fewest leaks" | Meaningless, because helpers are perfect by definition. There are **at most 2 helpers**: "所有防卫成功的玩家(最多2名)". Default choice: highest LP, then seat index [ASSUMED]. 1 helper uses `escaped_single` (8 units); 2 helpers use `escaped_multi` (20). | VERIFIED cap |
|
||||
| 10 | Final Assault | Players are paired. **With an odd count the leftover player forms their own group** ("如有落单的玩家将单独成组") and uses the `_s` map.<br>**Movable bosses spawn one per alive player's side** and share the HP pool ("对于可移动的领袖敌人,将在每个存活玩家的一侧生成并行动").<br>**The boss HP pool is not affected by the A3 multipliers** ("领袖单位于服务器的生命值加成不受上述加成影响").<br>Overtime −1 LP/s starts at `bossTurnHpReduceTime` = 150 s. The level's 120 s `maxPlayTime` is not a hard stop in boss rounds: "计时结束后战斗仍然会继续".<br>Wave enemies that bring the merged LP to 0 end the match at once. | VERIFIED |
|
||||
| 3 (table) | multi FUNNY = 14 rounds | Confirmed from data: **multi FUNNY has 14 rounds, no R15.** **Solo FUNNY has 9 rounds** (boss `h07_01_S` at R9). The 05 doc's "FUNNY has 9 rounds" applies to solo only. | VERIFIED |
|
||||
|
||||
### A2. Per-match disabled bonds and banned operators (VERIFIED)
|
||||
|
||||
**Rule.** At INFO_CHECK the server picks a disabled bond set `D`. **An operator is removed from the pool iff every one of its bonds is in `D`** (or in the mode's static `inactiveBondIdList`).
|
||||
|
||||
**Proof 1.** Screenshot `i.meee.com.tw/9H7Kugy.png` (终极, 下半, in-match dropdown "本局禁用干员情况") shows these banned counts per bond: 维多利亚 **7**, 阿戈尔 **6**, 谢拉格 **5**, 精准 **5**, 助力 **5**, 奥术 **4**, 奇迹 **3**. Take D = those 7 bonds and count the visible, non-DIY act2 chess whose `bondIds ⊆ D`. The result is exactly 7/6/5/5/5/4/3, over 25 operators. An exact match on 7 numbers cannot be coincidence.
|
||||
|
||||
**Proof 2.** The official intro (上半 标准) greys only 坚守. Its 本局禁用干员 list shows exactly the 2 chess whose only bond is 坚守 (tier I and tier V).
|
||||
|
||||
```
|
||||
core = bonds with autoChessData.bondInfoDict[b].isPower (8)
|
||||
addon = other bonds with weight > 0 (11; 投资人/调和/协防干员/绝技 have weight 0 → never disabled)
|
||||
D = weightedSample(core, Nc) ∪ weightedSample(addon, Na) // all weights are 10 → uniform
|
||||
banned = { visible non-DIY chess c : c.bondIds ≠ [] ∧ c.bondIds ⊆ (D ∪ mode.inactiveBondIdList) } (+ their _b elites)
|
||||
```
|
||||
|
||||
- **Nc/Na:**
|
||||
- Observed: 终极 3 core greyed in 2 separate matches, with 3 + 4 in the dropdown. 上半 标准: 0 + 1.
|
||||
- **Recommend NORMAL/HARD/ABYSS = 3 core + 4 add-on.** A simulation gives a mean of 22 banned operators (range 12–29).
|
||||
- **Recommend FUNNY = static list + 0 core + 1 add-on.** The static FUNNY list alone removes 27 operators.
|
||||
- Nc/Na for NORMAL/HARD are [ASSUMED].
|
||||
- **Other bonds:** a disabled bond can still be activated through members that also carry a non-disabled bond, and through 变形同构体 items. The briefing marks such bonds with "部分盟约所含干员阵容不完整".
|
||||
- **UI:** the briefing shows a core row and an add-on row (lit = complete, grey + badge = incomplete) plus a "本局禁用干员" portrait list. The in-match info dropdown shows per-bond banned counts.
|
||||
- **DIY/support picks** may be affected ("禁用盟约有可能影响自选的支援干员"). In the remake, a DIY pick whose derived bond is in D is still allowed [ASSUMED].
|
||||
|
||||
### A3. Enemy HP/ATK multipliers by mode and round (replaces §1 table and the §12 mapping)
|
||||
|
||||
Source: PRTS `卫戍协议:盟约_下半` §开始模拟. PRTS flags it as user-provided, but it is the only per-round data available.
|
||||
|
||||
Formula: `atkMul = base × 1.1^k`, `hpMul = base × 1.2^k × extra`, using the same `k` for ATK and HP except where noted. DEF and RES are unchanged.
|
||||
|
||||
Each `k` is one stack of the data effect 攻坚装备 (ATK +10 %, HP +20 %, multiplicative). `base` 0.8 = 攻坚装备II. `base` 0.7 = 攻坚装备III: data says ATK ×0.7 / HP ×0.75, PRTS shows 0.7 for both. Use the data values. `extra` 1.08 = 补给线. **终极 (ABYSS): enemy move speed ×1.15 from round 3** (急行军). **Leader HP pools are excluded.**
|
||||
|
||||
| Mode | base | k for rounds 1…14 | hidden (R15) |
|
||||
|---|---|---|---|
|
||||
| solo 标准 FUNNY (9 rounds) | 0.7 | 0 ×9 | – |
|
||||
| solo 险境 NORMAL | 0.7 | 0,0,0,1,1,1,1,2,2,2,3,4,5,5 | 5 [ASSUMED = R14] |
|
||||
| solo 绝境 HARD | 0.8 | 0,0,0,0,1,1,1,1,2,2,3,3,4,4 | 4 |
|
||||
| solo 终极 ABYSS | 1.0 | 1,2,2,2,2,3,3,3,3,4,5,5,6,7 | 7 |
|
||||
| multi 标准 FUNNY | 0.8 | 0 ×11, then 1,1,1 | – |
|
||||
| multi 险境 NORMAL | 0.8 | 0,1,1,2,2,2,2,3,4,4,5,6,7,7 | 7 [ASSUMED = R14] |
|
||||
| multi 绝境 HARD | 1.0 | 1,2,2,3,3,3,3,3,4,5,6,6,7,8 | 8 |
|
||||
| multi 终极 ABYSS, **ATK** | 1.0 | 1,2,2,3,3,4,5,5,5,5,6,6,7,8 | 8 |
|
||||
| multi 终极 ABYSS, **HP** | 1.0 | 1,2,2,3,4,4\*,7,8,8,8,9,10,10\*,10\* (\* = ×1.08) | 10\* |
|
||||
|
||||
Machine-readable copy: `01-core-data.json → _criticAddendum.enemyStatMultipliers`.
|
||||
|
||||
### A4. 机变 (special draft) details
|
||||
|
||||
- **Timing:** it opens at the start of that round's prep, after income.
|
||||
- **Multi:**
|
||||
- One **family** per SP round and 6 shared cards.
|
||||
- Pick order is random, not seat order (screenshots show out-of-seat order). Everyone takes exactly 1 card.
|
||||
- Timers: 30 s for the first picker, 16 s for the others. On timeout a random remaining card is auto-assigned.
|
||||
- **Solo:** 3 cards, pick 1, no timer.
|
||||
- **Family per SP round.** What is documented:
|
||||
- FUNNY never has bounties.
|
||||
- HARD+ R3 and R9 are bounties; R11 has no 战术决策 (PRTS/Bahamut).
|
||||
- Solo NORMAL: R6 = 道具补给, R9 = 战术决策 (PRTS note "5道具补给8战术决策").
|
||||
- Bahamut: 悬赏 is common, 战术决策 rare.
|
||||
|
||||
Recommended defaults [ASSUMED where not listed above]:
|
||||
|
||||
| Mode | SP rounds | Family |
|
||||
|---|---|---|
|
||||
| multi/solo HARD, ABYSS | 3, 9, 11 | R3 悬赏 (`enemy_initial_*`), R9 悬赏 (`bounty_hunter_*`/`bossInitial_*`), R11 道具补给 50 % / 机密商店 50 % |
|
||||
| multi NORMAL | 3, 6, 9 | weighted: 悬赏 50, 道具补给 25, 机密商店 10, 战术决策 15 |
|
||||
| solo NORMAL | 6, 9 | R6 道具补给, R9 战术决策 |
|
||||
| multi FUNNY | 3, 9 | 道具补给 45, 战术决策 35, 机密商店 20 |
|
||||
- **Card contents, observed:**
|
||||
- 机密商店: 6 random equipment of **any tier I–VI**, duplicates allowed (screenshot: VI, III, V, I, V, I).
|
||||
- 道具补给: 6 random equipment. At R3 the observed tiers were II–IV, with a duplicate.
|
||||
- 悬赏: 6 bounty effects (coins 6/2/1/2/3/1).
|
||||
- 战术决策: a mix of `allybuff_select_*` (盟誓/列装/财富/补给…), `enemydebuff_select_*`, and the current stage's `terrain_*`.
|
||||
- [ASSUMED] 道具补给 tier windows: R3 I–IV, R6 II–V, R9 III–VI, R11 IV–VI. Solo draws 3 cards from the same pools.
|
||||
|
||||
### A5. Other resolved items
|
||||
- The **华法琳** granted-trait cap should be **12 / 24 per battle**. The official 3/27 notice changed it and PRTS lists 7/14 → 12/24. The client data still shows 7/14, even though the other 3/27 changes (奇迹 18 %, 远见 80/150, 商业包装方案 8/7) are already in it. See 02.
|
||||
- The skill auto-cast rows with `skillIndex` 0 mean **skill 1 only** (BWIKI "重装职业干员 技能1,受到伤害后自动释放"). See 03.
|
||||
- Asset URLs: 40 random URLs from `07-assets.json` were re-checked on 2026-09-27; 40/40 returned `200`.
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,481 @@
|
||||
# 04 - Items (装备 EQUIP / 法术 MAGIC) - 卫戍协议:盟约 (act2autochess)
|
||||
|
||||
Source of truth: `activity_table.json -> activity.AUTOCHESS_SEASON.act2autochess` (`trapChessDataDict`, `trapShopChessDatas`, `effectInfoDataDict`, `effectBuffInfoDataDict`) + `character_table.json` (trap_*) + `skill_table.json` (sktok_*). Data corresponds to 盟约 **下半** (contains 下半 items 简易通讯机/紧急调度券/天马之枪 etc. and the 下半 changes to 奥术法阵 and 商业包装方案). Machine-readable version: `04-items.json` (every entry, raw buffs/blackboards, flattened `params`, `implFormula`).
|
||||
|
||||
Tags: **[DATA]** = read directly from game data, **[WEB]** = community/official web source, **[ASSUMED]** = our proposal where sources are silent.
|
||||
|
||||
## 1. Key facts (TL;DR)
|
||||
|
||||
- 59 shop-table entries: **56 EQUIP** items (each has normal `_a` + golden/进阶 `_b` chess entry = 112) + **3 MAGIC** Arts (no golden) = 115 chess entries in `trapChessDataDict`. [DATA]
|
||||
- Tier (`itemLevel`) I-VI. Distinct buyable equipment by tier: I:5, II:7, III:12, IV:12, V:9, VI:11. Normal prices 1-5 funds; every golden entry has `purchasePrice` 5. [DATA]
|
||||
- Shop (调度中心) has **1 item slot at every shop level** in all real modes (`shopLevelDataDict[*][L].itemCount = 1`; training mode 0 until L5). Season 1 only had items from shop level 5. [DATA]
|
||||
- **Max 2 equipment per operator**; equipped items are locked; a 3rd equip = replace (the replaced item is destroyed). Items return to hand when the operator is promoted (3->elite) or sold. [WEB: PRTS 卫戍协议/帮助, arknights.wiki.gg, in-game tip]
|
||||
- **2 identical normal items auto-merge into 1 golden** (`upgradeNum=2`). `upgradeNum=100` = never merges (寻呼模块, 信标, 拟态物质, 突变细胞, 人事部文档, 变形同构体; talent note "本装备不会合并为进阶品质"). [DATA]
|
||||
- Many items are **consumed on equip** ("装备时销毁"): economy/recruit effects. They need an operator target but never take a slot. [DATA]
|
||||
- `trapDuration`: -1 on all normal EQUIP (permanent), 0 on golden & MAGIC (unused by us). `canGiveBond=true` only on 变形同构体; `giveBondId` is set on 18 items (14 bonds) and is the lookup table used by 变形同构体. `givePowerId` always null. [DATA]
|
||||
- **MAGIC (法术)**: 画卷, 教鞭, “神秘顾客”; all `hideInShop=true`; only granted by strategies (bands). Drag onto a map tile during prep; instant. Limit: max **2** current-round Arts on the map; all Arts removed at round end. [DATA + WEB wiki.gg]
|
||||
|
||||
## 2. Rules for implementation
|
||||
|
||||
| Rule | Value / behaviour | Source |
|
||||
|---|---|---|
|
||||
| Equip slots per operator | 2 | [WEB] PRTS 帮助 "每名干员最多可佩戴2件装备" |
|
||||
| Who can be equipped | Operators on the battlefield **or in hand/整备区** (下半) | [WEB] ak.hypergryph.com/news/5114 "装备可直接配置在处于整备区的干员身上" |
|
||||
| Unequip | Not allowed. Items leave an operator only on: operator promoted to elite, item merges to golden, operator sold -> items go to hand (overflow to 5 temporary hand slots, which are wiped at next phase) | [WEB] PRTS/bwiki, in-game tip "干员晋级后已配发装备会回收至整备区,需要重新配置" |
|
||||
| Replacement | Drop an item on an operator with 2 items -> choose 1 equipped item to **destroy**; cancel allowed | [WEB] PRTS 帮助 "达到上限强行佩戴会改为替换装备"; wiki.gg |
|
||||
| Merge | 2 x same normal (`_a`, upgradeNum 2) -> 1 golden (`_b`), automatic, immediate | [DATA]+[WEB] tip "两件同名装备可以合成一件更强力的装备" |
|
||||
| Merge counts equipped copies? | Yes: copies in hand and on operators both count; resulting golden goes to hand (slot freed) | [ASSUMED] (consistent with "道具晋级" being a removal condition) |
|
||||
| Non-mergeable | upgradeNum 100 items (list above); golden entries have upgradeNum 0 | [DATA] |
|
||||
| Consume-on-equip | Effects tagged `kind=consume_on_equip` resolve once on drop, item destroyed, no slot used | [DATA] |
|
||||
| Hand capacity | Items share the 10 regular hand slots with operators (+5 temporary) | [DATA] constData.maxDeckChessCnt=10; [WEB] PRTS 帮助 |
|
||||
| Shop item slot | 1 slot per refresh at all shop levels (L1-L6) | [DATA] shopLevelDataDict.itemCount |
|
||||
| Shop item pool | Non-hidden normal EQUIP with tier <= shop level (mirrors operator rule "调度中心等级≥干员所在等阶") | [ASSUMED] |
|
||||
| Shop item tier odds | Reuse operator tier-odds of that shop level, then uniform within tier; if tier has no item fall back to lower tier | [ASSUMED] |
|
||||
| Item price | `purchasePrice` of `_a` entry (1-5) | [DATA] |
|
||||
| Golden in shop | Never; golden only via merge or effects (整备 buff: "你接下来购买的1件装备变为进阶品质"; band 至纯凝结 gives golden 博士投影) | [DATA]/[ASSUMED] |
|
||||
| Refresh / freeze | Item slot refreshes (1 fund, constData.shopRefreshPrice) and freezes together with operator slots | [ASSUMED] |
|
||||
| Sell item | Unequipped item in hand sells for 1 fund (normal or golden) | [ASSUMED] (official text only states operators sell for 1) |
|
||||
| Stacking | Different items on one operator stack: %ATK/%DEF/%HP additive with other % buffs (`final = base*(1+Σ%)+flat`), ASPD flat additive, `damage_scale` multipliers multiply, procs roll independently. Normal+golden copy of same item may coexist and both apply | [ASSUMED] |
|
||||
| Bond-gated effects | "若携带者为【X】盟约干员" checks the operator's bonds **including** a bond granted by 变形同构体 | [ASSUMED] |
|
||||
| Arts usage | Drag onto a map tile during 休整期; instant resolve; 画卷 range `1-1` = placed tile + tile in front; others `0-1` | [DATA] range_table |
|
||||
| Arts limit | Max 2 current-round Arts on map at once; all Arts destroyed at round end | [WEB] wiki.gg Stronghold_Protocol |
|
||||
| Free item events | 道具补给 (`equip_free_*`, choiceType EQUIP_FREE) in 机变阶段: after rounds 2/8 (标准), 2/5/8 (险境), 2/8/10 (绝境+). Offer 3 items (tier <= shopLevel+1, cap 6), pick 1 free. 机密商店 (`artifact_paid_*`, also EQUIP_FREE, "无需消耗资金"): offer 3 items tier >= IV, pick 1 | [WEB] Bahamut snA=12294 (rounds); offer size/tier [ASSUMED] |
|
||||
|
||||
### Shop item slots by mode (itemCount per shop level) [DATA]
|
||||
|
||||
| Mode | L1 | L2 | L3 | L4 | L5 | L6 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| mode_training_1 | 0 (ops 3) | 0 (ops 3) | 0 (ops 3) | 0 (ops 3) | 1 (ops 3) | 1 (ops 3) |
|
||||
| mode_single_funny | 1 (ops 3) | 1 (ops 4) | 1 (ops 4) | 1 (ops 4) | 1 (ops 4) | 1 (ops 5) |
|
||||
| mode_single_normal | 1 (ops 3) | 1 (ops 4) | 1 (ops 4) | 1 (ops 5) | 1 (ops 5) | 1 (ops 5) |
|
||||
| mode_single_hard | 1 (ops 3) | 1 (ops 4) | 1 (ops 4) | 1 (ops 5) | 1 (ops 5) | 1 (ops 5) |
|
||||
| mode_single_abyss | 1 (ops 3) | 1 (ops 4) | 1 (ops 4) | 1 (ops 5) | 1 (ops 5) | 1 (ops 5) |
|
||||
| mode_multi_funny | 1 (ops 3) | 1 (ops 4) | 1 (ops 4) | 1 (ops 4) | 1 (ops 4) | 1 (ops 5) |
|
||||
| mode_multi_normal | 1 (ops 3) | 1 (ops 4) | 1 (ops 4) | 1 (ops 5) | 1 (ops 5) | 1 (ops 5) |
|
||||
| mode_multi_hard | 1 (ops 3) | 1 (ops 4) | 1 (ops 4) | 1 (ops 5) | 1 (ops 5) | 1 (ops 5) |
|
||||
| mode_multi_abyss | 1 (ops 3) | 1 (ops 4) | 1 (ops 4) | 1 (ops 5) | 1 (ops 5) | 1 (ops 5) |
|
||||
|
||||
## 3. Full item list (EQUIP)
|
||||
|
||||
Columns: normal id (golden = same id with `_b`), name / EN name [EN names for 下半-new items are our translation], tier, price (normal; golden always 5), category, normal effect -> **golden** effect, giveBond (for 变形同构体), merge.
|
||||
|
||||
### Tier I
|
||||
|
||||
| id | name | EN | price | cat | normal effect | golden effect | giveBond | merge |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| `chess_item_1_01_e_a` | 维式重锤 | Victorian Hammer | 1 | STAT | 攻击力+15% | 攻击力+25% | 维多利亚(victoriaShip) | x2 |
|
||||
| `chess_item_1_02_e_a` | 坚守盾牌 | Durable Shield | 1 | STAT | 防御力+20% | 防御力+35% | 坚守(steadShip) | x2 |
|
||||
| `chess_item_1_03_e_a` | 盟约之币 | Alliance Coin | 1 | ECONOMY | 装备时销毁,并获得1资金 | 装备时销毁,并获得2资金 | | x2 |
|
||||
| `chess_item_1_04_e_a` | 随身身份牌 | Portable ID Tag | 1 | BOND | 装备时销毁,并使携带者所属盟约层数+3(无需激活盟约) | 装备时销毁,并使携带者所属盟约层数+6(无需激活盟约) | | x2 |
|
||||
| `chess_item_1_05_e_a` | 源石溶剂 | Originium Solvent | 1 | STAT | 携带者每秒流失60点生命值,攻击力+40% | 携带者每秒流失60点生命值,攻击力+60% | | x2 |
|
||||
|
||||
### Tier II
|
||||
|
||||
| id | name | EN | price | cat | normal effect | golden effect | giveBond | merge |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| `chess_item_2_01_e_a` | 不屈弹射器 | Tough Launcher | 1 | STAT | 再部署时间-30%,生命值-30% | 再部署时间-50%,生命值-30% | 不屈(indomShip) | x2 |
|
||||
| `chess_item_2_02_e_a` | 紧急调度券 | Emergency Dispatch Voucher | 2 | RECRUIT | 装备时销毁,随机获取当前调度中心内的1名干员 (调度中心中对应干员消失) | 装备时销毁,随机获取当前调度中心内的2名干员 (调度中心中对应干员消失) | | x2 |
|
||||
| `chess_item_2_03_e_a` | 战栗维式重锤 | Frightening Victorian Hammer | 2 | ON_HIT | 攻击力+20%;若携带者是地面干员则攻击时有10%概率使目标战栗2秒 | 攻击力+35%;若携带者是地面干员则攻击时有10%概率使目标战栗2秒 | 维多利亚(victoriaShip) | x2 |
|
||||
| `chess_item_2_04_e_a` | 萨尔贡浓茶 | Sargonian Teaspresso | 2 | STAT | 技力自然回复速度+0.15/秒 | 技力自然回复速度+0.25/秒 | 萨尔贡(sargonShip) | x2 |
|
||||
| `chess_item_2_05_e_a` | 精打细算玩偶 | Thrifty Doll | 3 | ECONOMY | 装备时销毁,之后每回合开始时额外获得1资金 | 装备时销毁,之后每回合开始时额外获得2资金 | | x2 |
|
||||
| `chess_item_2_06_e_a` | 简易通讯机 | Simple Communicator | 2 | RECRUIT | 装备时销毁,随机获得1名与该干员有相同盟约的干员 | 装备时销毁,随机获得2名与该干员有相同盟约的干员 | | x2 |
|
||||
| `chess_item_2_07_e_a` | 见钱眼开玩偶 | Money-Eyed Doll | 1 | ECONOMY | 装备时销毁,下回合额外获得2资金 | 装备时销毁,下回合额外获得4资金 | | x2 |
|
||||
|
||||
### Tier III
|
||||
|
||||
| id | name | EN | price | cat | normal effect | golden effect | giveBond | merge |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| `chess_item_3_01_e_a` | 叙拉古正装 | Siracusan Formalwear | 2 | STAT | 攻击速度+15,携带者部署方向左右两侧的我方干员攻击速度+10 | 攻击速度+25,携带者部署方向左右两侧的我方干员攻击速度+15 | 叙拉古(siracusaShip) | x2 |
|
||||
| `chess_item_3_02_e_a` | 精准狙击镜 | Precision Scope | 2 | ON_HIT | 攻击距离自身3格及以上的目标时,伤害提高30% | 攻击距离自身3格及以上的目标时,伤害提高50% | 精准(preciShip) | x2 |
|
||||
| `chess_item_3_03_e_a` | 激光发射器 | Laser Sighter | 2 | STAT | 攻击无视目标25%法术抗性 | 攻击无视目标45%法术抗性 | | x2 |
|
||||
| `chess_item_3_04_e_a` | 炎国短刀 | Yanese Dagger | 2 | ON_HIT | 每开启一次技能,获得5%的攻击力加成(最多叠加10次) | 每开启一次技能,获得8%的攻击力加成(最多叠加10次) | 炎(yanShip) | x2 |
|
||||
| `chess_item_3_05_e_a` | 迅捷作战粮 | Quick Combat Rations | 2 | SP | 部署时,获得3点技力;每有一个同盟约的其他干员,额外获得3点技力 | 部署时,获得6点技力;每有一个同盟约的其他干员,额外获得6点技力 | 迅捷(swiftShip) | x2 |
|
||||
| `chess_item_3_06_e_a` | 歌利亚头盔 | Goliath Helmet | 2 | STAT | 生命值+25%;部署时若身前一格没有其他干员,生命值额外+15% | 生命值+45%;部署时若身前一格没有其他干员,生命值额外+25% | | x2 |
|
||||
| `chess_item_3_07_e_a` | 阿戈尔重刃 | Aegirian Blade | 2 | STAT | 攻击力+40%,攻击速度-10 | 攻击力+60%,攻击速度-10 | 阿戈尔(egirShip) | x2 |
|
||||
| `chess_item_3_08_e_a` | 奥术法阵 | Pocket Arts Circle | 1 | STAT | 法术抗性+20,攻击使目标失去特殊能力5秒 | 法术抗性+30,攻击使目标失去特殊能力5秒 | 奥术(arcaneShip) | x2 |
|
||||
| `chess_item_3_09_e_a` | 坚固维式重锤 | Durable Victorian Hammer | 2 | SURVIVAL | 攻击力+25%;首次受到致命伤害时生命值不低于1,持续8秒 | 攻击力+45%;首次受到致命伤害时生命值不低于1,持续8秒 | 维多利亚(victoriaShip) | x2 |
|
||||
| `chess_item_3_10_e_a` | 加速维式重锤 | Speedy Victorian Hammer | 2 | STAT | 攻击力+25%;攻击速度+30 | 攻击力+45%;攻击速度+30 | 维多利亚(victoriaShip) | x2 |
|
||||
| `chess_item_3_11_e_a` | 突袭手雷 | Raid Grenade | 1 | ON_HIT | 每次部署后的10秒内,攻击时使目标晕眩2秒 | 每次部署后的15秒内,攻击时使目标晕眩2秒 | 突袭(raidShip) | x2 |
|
||||
| `chess_item_3_12_e_a` | 骑士储蓄罐 | Knight Piggy Bank | 3 | ECONOMY | 装备时销毁,并随机获得1~6资金 | 装备时销毁,并随机获得2~12资金 | | x2 |
|
||||
|
||||
### Tier IV
|
||||
|
||||
| id | name | EN | price | cat | normal effect | golden effect | giveBond | merge |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| `chess_item_4_01_e_a` | 寻呼模块 | Dispatch Module | 4 | RECRUIT | 装备时销毁,立即特殊刷新一次调度中心,出现三名与该干员有相同盟约的干员,免费获取其中一名!(不高于当前调度中心等级) | 装备时销毁,立即特殊刷新一次调度中心,出现三名与该干员有相同盟约的干员,免费获取其中一名!(不高于当前调度中心等级) | | no |
|
||||
| `chess_item_4_02_e_a` | 蜂鸣器 | Buzzer | 1 | SURVIVAL | 更容易受到攻击,生命值+40% | 更容易受到攻击,生命值+60% | | x2 |
|
||||
| `chess_item_4_03_e_a` | 有限加速器 | Miniature Accelerator | 2 | ON_HIT | 每次攻击或治疗后,本场战斗中攻击速度+1,最高60层 | 每次攻击或治疗后,本场战斗中攻击速度+2,最高60层 | | x2 |
|
||||
| `chess_item_4_04_e_a` | 伪装服 | Disguise Outfit | 1 | SURVIVAL | 首次受到伤害后获得隐匿,持续15秒 | 首次受到伤害后获得隐匿,持续25秒 | | x2 |
|
||||
| `chess_item_4_05_e_a` | 防暴盾 | Riot Shield | 2 | SURVIVAL | 阻挡敌人时,受到来自非自身阻挡单位的伤害降低40% | 阻挡敌人时,受到来自非自身阻挡单位的伤害降低70% | | x2 |
|
||||
| `chess_item_4_06_e_a` | 休眠子裔 | Dormant Heir | 2 | SURVIVAL | 每攻击1个目标,回复自身2%最大生命值 | 每攻击1个目标,回复自身4%最大生命值 | | x2 |
|
||||
| `chess_item_4_07_e_a` | 卡西米尔竞技旗 | Kazimierz Tournament Banner | 2 | ON_HIT | 部署后15秒内造成的伤害提升至135%,随后逐渐衰减 | 部署后15秒内造成的伤害提升至160%,随后逐渐衰减 | 卡西米尔(kazimierzShip) | x2 |
|
||||
| `chess_item_4_08_e_a` | 拉特兰桥夹 | Lateran Clip | 1 | ON_HIT | 子弹类技能剩余一发子弹时有50%概率恢复40%的子弹(每次部署最多触发3次) | 子弹类技能剩余一发子弹时有60%概率恢复60%的子弹(每次部署最多触发3次) | 拉特兰(lateranoShip) | x2 |
|
||||
| `chess_item_4_09_e_a` | 灼燃维式重锤 | Burning Victorian Hammer | 2 | ON_HIT | 攻击力+30%;造成法术伤害附带相当于10%伤害的灼燃损伤 | 攻击力+50%;造成法术伤害附带相当于10%伤害的灼燃损伤 | 维多利亚(victoriaShip) | x2 |
|
||||
| `chess_item_4_10_e_a` | 浓缩嗅盐 | Concentrated Smelling Salts | 2 | SURVIVAL | 生命值大于70%时,免疫晕眩、冻结等特殊状态 | 生命值大于40%时,免疫晕眩、冻结等特殊状态 | | x2 |
|
||||
| `chess_item_4_11_e_a` | 护盾无人机 | Protection Drone | 2 | SURVIVAL | 治疗时有10%概率使目标获得1层护盾(最多1层) | 治疗时有15%概率使目标获得1层护盾(最多1层) | | x2 |
|
||||
| `chess_item_4_12_e_a` | M3茧甲 | M3 Cocoon Shell | 3 | SURVIVAL | 战斗阶段被击倒时立刻复活(一场战斗仅1次) | 战斗阶段被击倒时立刻复活(一场战斗仅2次) | | x2 |
|
||||
|
||||
### Tier V
|
||||
|
||||
| id | name | EN | price | cat | normal effect | golden effect | giveBond | merge |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| `chess_item_5_01_e_a` | 催泪瓦斯 | Teargas Can | 2 | ON_HIT | 攻击时有3%概率使目标获得一层麻痹 | 攻击时有5%概率使目标获得一层麻痹 | | x2 |
|
||||
| `chess_item_5_02_e_a` | 谢拉格不融冰 | Kjeragi Nevermeltice | 2 | ON_HIT | 攻击时有12%概率对目标施加1.5秒的寒冷 | 攻击时有20%概率对目标施加1.5秒的寒冷 | 谢拉格(kjeragShip) | x2 |
|
||||
| `chess_item_5_03_e_a` | 双模机械臂 | Bimodule Robotic Arm | 3 | ON_HIT | 攻击力+30%,自身造成物理和法术伤害时,伤害类型转化为弱点伤害 | 攻击力+50%,自身造成物理和法术伤害时,伤害类型转化为弱点伤害 | | x2 |
|
||||
| `chess_item_5_04_e_a` | 信标 | Transmitter (Beacon) | 3 | RECRUIT | 装备时,目标干员和本装备销毁并进行一次特殊刷新,出现两名与携带者同等阶的干员,免费获取其中一名 / 若在同盟模拟中且存在其他队友,下个休整期向相应盟约人数最多的队友发送1个原干员 / 相应盟约人数相同则随机发送 / 无法装备给自编干员 | 装备时,目标干员和本装备销毁并进行一次特殊刷新,出现两名与携带者同等阶的干员,免费获取其中一名 / 若在同盟模拟中且存在其他队友,下个休整期向相应盟约人数最多的队友发送1个原干员 / 相应盟约人数相同则随机发送 / 无法装备给自编干员 | | no |
|
||||
| `chess_item_5_05_e_a` | 拟态物质 | Mimic Matter | 4 | RECRUIT | 装备时销毁,若已拥有至少2名该初始干员,则再获得1名该初始干员;否则随机获得1名同盟约初始干员 | 装备时销毁,若已拥有至少2名该初始干员,则再获得1名该初始干员;否则随机获得1名同盟约初始干员 | | no |
|
||||
| `chess_item_5_06_e_a` | 博士投影 | Doctor Hologram | 5 | RECRUIT | 任意干员可装备,下个回合开始时销毁,并使该干员晋升为精锐干员 | 任意干员可装备,立即使该干员晋升为精锐干员 | | x2 |
|
||||
| `chess_item_5_07_e_a` | 商业包装方案 | Commercial Packaging Plan | 3 | RECRUIT | 每出售8名干员,额外获得一个与此装备携带者的同盟约初始干员(不高于当前调度中心等级) | 每出售7名干员,额外获得一个与此装备携带者的同盟约初始干员(不高于当前调度中心等级) | | x2 |
|
||||
| `chess_item_5_08_e_a` | 突变细胞 | Mutated Cells | 2 | RECRUIT | 战斗结束后,装备者替换为高一阶的随机干员 | 战斗结束后,装备者替换为高一阶的随机干员 | | no |
|
||||
| `chess_item_5_09_e_a` | 天马之盔 | Pegasus Helm | 3 | SET | 生命值+50%,若与“天马之枪”一起装备,每秒回复8%最大生命值。 | 生命值+75%,若与“天马之枪”一起装备,每秒回复8%最大生命值。 | | x2 |
|
||||
|
||||
### Tier VI
|
||||
|
||||
| id | name | EN | price | cat | normal effect | golden effect | giveBond | merge |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| `chess_item_6_01_e_a` | 天马之枪 | Pegasus Lance | 3 | SET | 攻击力+40%,若与“天马之盔”一起装备,造成伤害时额外造成30%的真实伤害 | 攻击力+60%,若与“天马之盔”一起装备,造成伤害时额外造成30%的真实伤害 | | x2 |
|
||||
| `chess_item_6_02_e_a` | 铳骑之威 | Gun-Knight's Might | 4 | BOND_SIGNATURE | 攻击力+40%;若携带者为【拉特兰】盟约干员,该干员每次攻击时,有35%概率额外对攻击范围内一名敌人发射子弹造成150%攻击力的物理伤害 / 若该【拉特兰】盟约干员同时装备“拉特兰桥夹”,子弹伤害改为300%攻击力 | 攻击力+60%;若携带者为【拉特兰】盟约干员,该干员每次攻击时,有35%概率额外对攻击范围内一名敌人发射子弹造成150%攻击力的物理伤害 / 若该【拉特兰】盟约干员同时装备“拉特兰桥夹”,子弹伤害改为300%攻击力 | | x2 |
|
||||
| `chess_item_6_03_e_a` | 天师古鼎 | Tianshi's Cauldron | 4 | BOND_SIGNATURE | 生命值+45%;若携带者为【炎】盟约干员,本回合每获得过1名干员战斗开始后攻击速度+25(最多3层) / 若该【炎】盟约干员同时装备“炎国短刀”,每次获得干员时获得2资金(每回合最多3次) | 生命值+70%;若携带者为【炎】盟约干员,本回合每获得过1名干员战斗开始后攻击速度+25(最多3层) / 若该【炎】盟约干员同时装备“炎国短刀”,每次获得干员时获得2资金(每回合最多3次) | | x2 |
|
||||
| `chess_item_6_04_e_a` | 海沟实验体 | Trench Test Subject | 4 | BOND_SIGNATURE | 获得180点伤害减免;若携带者为【阿戈尔】盟约干员,自身受到伤害时对伤害来源造成自身攻击力50%的法术伤害(每0.5秒最多触发一次) / 若该【阿戈尔】盟约干员同时装备“阿戈尔重刃”,则自身受到伤害时额外造成一次50%攻击力的法术伤害(每0.5秒最多触发一次) | 获得300点伤害减免;若携带者为【阿戈尔】盟约干员,自身受到伤害时对伤害来源造成自身攻击力50%的法术伤害(每0.5秒最多触发一次) / 若该【阿戈尔】盟约干员同时装备“阿戈尔重刃”,则自身受到伤害时额外造成一次50%的攻击力的法术伤害(每0.5秒最多触发一次) | | x2 |
|
||||
| `chess_item_6_05_e_a` | 蒸汽之心 | Steam Heart | 4 | BOND_SIGNATURE | 攻击速度+35;若携带者为【维多利亚】盟约干员,该干员获得当前场上所有维式重锤特殊效果 / 若该【维多利亚】盟约干员同时装备“维式重锤”系列装备,该“维式重锤”装备特殊效果获得强化(效果变为2倍) | 攻击速度+55;若携带者为【维多利亚】盟约干员,该干员获得当前场上所有维式重锤特殊效果 / 若该【维多利亚】盟约干员同时装备“维式重锤”系列装备,该“维式重锤”装备特殊效果获得强化(效果变为2倍) | | x2 |
|
||||
| `chess_item_6_06_e_a` | 耶拉冈德之泪 | Kjeragandr's Tears | 4 | BOND_SIGNATURE | 法术抗性+30;若携带者为【谢拉格】盟约干员,该干员攻击范围内被寒冷或冻结的敌人每秒受到一次自身攻击力30%的法术伤害 / 若该【谢拉格】盟约干员同时装备“谢拉格不融冰”,则使自身攻击范围内寒冷或冻结的敌人每秒受到的法术伤害提升至100%攻击力 | 法术抗性+50;若携带者为【谢拉格】盟约干员,该干员攻击范围内被寒冷或冻结的敌人每秒受到一次自身攻击力30%的法术伤害 / 若该【谢拉格】盟约干员同时装备“谢拉格不融冰”,则使自身攻击范围内寒冷或冻结的敌人每秒受到的法术伤害提升至100%攻击力 | | x2 |
|
||||
| `chess_item_6_07_e_a` | 黄沙罗盘 | Desert Compass | 4 | BOND_SIGNATURE | 初始技力+30;若携带者为【萨尔贡】盟约干员,该干员首次技能结束时立刻回复30点技力 / 若该【萨尔贡】盟约干员同时装备“萨尔贡浓茶”,每次开启技能时为全部【萨尔贡】干员回复3点技力 | 初始技力+50;若携带者为【萨尔贡】盟约干员,该干员首次技能结束时立刻回复30点技力 / 若该【萨尔贡】盟约干员同时装备“萨尔贡浓茶”,每次开启技能时为全部【萨尔贡】干员回复3点技力 | | x2 |
|
||||
| `chess_item_6_08_e_a` | 人事部文档 | HR File | 4 | RECRUIT | 装备时销毁,最大可部署人数变为9 | 装备时销毁,最大可部署人数变为9 | | no |
|
||||
| `chess_item_6_09_e_a` | 变形同构体 | Damazti Isomorph | 3 | BOND_GRANT | 携带者获得额外盟约(由另一件携带装备而定) / 具体对应关系可在模拟中查看本装备天赋栏 | 携带者获得额外盟约(由另一件携带装备而定) / 具体对应关系可在模拟中查看本装备天赋栏 | | no |
|
||||
| `chess_item_6_10_e_a` | 骑士戒律 | Knightly Code | 4 | BOND_SIGNATURE | 再部署时间-40%;若携带者为【卡西米尔】盟约干员,开启技能后20s内,使攻击范围内敌人攻击速度-35%,移动速度-35% / 若该【卡西米尔】盟约干员同时装备“卡西米尔竞技旗”,该卡西米尔干员技能持续期间,攻击力+100%,且受到致命伤害时不撤退,技能结束后退场 | 再部署时间-60%;若携带者为【卡西米尔】盟约干员,开启技能后20s内,使攻击范围内敌人攻击速度-35%,移动速度-35% / 若该【卡西米尔】盟约干员同时装备“卡西米尔竞技旗”,该卡西米尔干员技能持续期间,攻击力+100%,且受到致命伤害时不撤退,技能结束后退场 | | x2 |
|
||||
| `chess_item_6_11_e_a` | 家族徽章 | Family Crest | 4 | BOND_SIGNATURE | 技力自然回复速度+0.2/秒;若携带者为【叙拉古】盟约干员,该干员处于隐匿状态时,攻击力逐渐提升至200%,持续至隐匿结束后首次造成伤害或干员离场 / 若该【叙拉古】盟约干员同时装备“叙拉古正装”,该叙拉古干员失去隐匿后首次造成伤害时额外造成800%攻击力的真实伤害 | 技力自然回复速度+0.35/秒;若携带者为【叙拉古】盟约干员,该干员处于隐匿状态时,攻击力逐渐提升至200%,持续至隐匿结束后首次造成伤害或干员离场 / 若该【叙拉古】盟约干员同时装备“叙拉古正装”,该叙拉古干员失去隐匿后首次造成伤害时额外造成800%攻击力的真实伤害 | | x2 |
|
||||
|
||||
## 4. Implementable categories and formulas
|
||||
|
||||
Param names below are the keys of `items[].normal.params` / `items[].golden.params` in the JSON (flattened blackboards; duplicate keys get suffix `_1`). Values shown as normal / golden.
|
||||
|
||||
### STAT - 属性型 Flat stat modifiers (always on while equipped)
|
||||
|
||||
- **维式重锤** (`chess_item_1_01_e_a`, TI, 1) - ATK% += atk (additive with other ATK% buffs)
|
||||
params: `atk=0.15/0.25`; buff keys: `env_gbuff_new_with_verify`
|
||||
- **坚守盾牌** (`chess_item_1_02_e_a`, TI, 1) - DEF% += def
|
||||
params: `def=0.2/0.35`; buff keys: `env_gbuff_new_with_verify`
|
||||
- **源石溶剂** (`chess_item_1_05_e_a`, TI, 1) - ATK% += atk; in battle carrier loses `damage` HP per second (periodic self-damage, true/unmitigated [ASSUMED], can kill the carrier [ASSUMED]).
|
||||
params: `atk=0.4/0.6, damage=60.0`; buff keys: `env_gbuff_new_with_verify, env_gbuff_new_with_verify`
|
||||
- **不屈弹射器** (`chess_item_2_01_e_a`, TII, 1) - respawnTime *= (1 + respawn_time) (i.e. -30%/-50%); maxHP% += max_hp (-30%).
|
||||
params: `respawn_time=-0.3/-0.5, max_hp=-0.3`; buff keys: `env_gbuff_new_with_verify`
|
||||
- **萨尔贡浓茶** (`chess_item_2_04_e_a`, TII, 2) - spRecoveryPerSec += sp_recovery_per_sec (flat, on top of base 1 SP/s for auto-recovery skills).
|
||||
params: `sp_recovery_per_sec=0.15/0.25`; buff keys: `env_gbuff_new_with_verify`
|
||||
- **叙拉古正装** (`chess_item_3_01_e_a`, TIII, 2) - Carrier ASPD += attack_speed. Allies deployed on the 2 tiles left/right of the carrier (perpendicular to its facing direction) get ASPD += attack_speed_1 while the carrier is on the field.
|
||||
params: `attack_speed=15.0/25.0, at_root=1.0, attack_speed_1=10.0/15.0`; buff keys: `env_gbuff_new_with_verify, char_dynamic_ability_new`
|
||||
- **激光发射器** (`chess_item_3_03_e_a`, TIII, 2) - Carrier's attacks ignore magic_resist_penetrate (percent) of target RES: effRES = RES * (1 - p).
|
||||
params: `magic_resist_penetrate=0.25/0.45`; buff keys: `env_gbuff_new_with_verify`
|
||||
- **歌利亚头盔** (`chess_item_3_06_e_a`, TIII, 2) - maxHP% += init_max_hp; additionally, if at deploy time the tile directly in front of the carrier (facing direction) has no allied operator, maxHP% += ex_max_hp.
|
||||
params: `init_max_hp=0.25/0.45, ex_max_hp=0.15/0.25`; buff keys: `env_gbuff_new_with_verify`
|
||||
- **阿戈尔重刃** (`chess_item_3_07_e_a`, TIII, 2) - ATK% += atk; ASPD += attack_speed (-10).
|
||||
params: `atk=0.4/0.6, attack_speed=-10.0`; buff keys: `env_gbuff_new_with_verify`
|
||||
- **奥术法阵** (`chess_item_3_08_e_a`, TIII, 1) - RES += magic_resistance (flat); each attack applies 失去特殊能力 (silence: enemy loses its special abilities/talents) to target for `silence` s.
|
||||
params: `magic_resistance=20.0/30.0, silence=5.0`; buff keys: `env_gbuff_new_with_verify, env_gbuff_new_with_verify`
|
||||
- **加速维式重锤** (`chess_item_3_10_e_a`, TIII, 2) - ATK% += atk; ASPD += attack_speed (the hammer 'special effect' = the ASPD part).
|
||||
params: `atk=0.25/0.45, attack_speed=30.0`; buff keys: `env_gbuff_new_with_verify, env_gbuff_new_with_verify`
|
||||
|
||||
### ON_HIT - 战斗触发 On-attack / on-skill / time-window combat effects
|
||||
|
||||
- **战栗维式重锤** (`chess_item_2_03_e_a`, TII, 2) - ATK% += atk. If carrier is a MELEE(ground) operator: on each attack, prob chance to apply 战栗(Tremble: target cannot normal-attack while blocked) for disarmed_duration s. Special effect doubled (prob x2 [ASSUMED]) when carrier also has 蒸汽之心 and is Victoria.
|
||||
params: `atk=0.2/0.35, prob=0.1, disarmed_duration=2.0`; buff keys: `env_gbuff_new_with_verify, env_gbuff_new_with_verify`
|
||||
- **精准狙击镜** (`chess_item_3_02_e_a`, TIII, 2) - If distance(carrier tile, target) >= radius (3 tiles, Chebyshev/Euclid on tile grid [ASSUMED Euclidean]), outgoing damage *= damage_scale.
|
||||
params: `radius=3.0, damage_scale=1.3/1.5`; buff keys: `env_gbuff_new_with_verify`
|
||||
- **炎国短刀** (`chess_item_3_04_e_a`, TIII, 2) - Each time the carrier activates a skill: stacks = min(stacks+1, atk_buff_cnt); ATK% += atk * stacks. Stacks reset each battle.
|
||||
params: `prob=1.0, atk=0.05/0.08, atk_buff_cnt=10.0`; buff keys: `env_gbuff_new_with_verify`
|
||||
- **突袭手雷** (`chess_item_3_11_e_a`, TIII, 1) - For `duration` s after EACH deploy, every attack stuns the target for `stun` s.
|
||||
params: `stun=2.0, duration=10.0/15.0`; buff keys: `env_gbuff_new_with_verify`
|
||||
- **有限加速器** (`chess_item_4_03_e_a`, TIV, 2) - After each attack or heal: stacks = min(stacks+1, max_buff_cnt); ASPD += attack_speed * stacks. Resets each battle.
|
||||
params: `attack_speed=1.0/2.0, max_buff_cnt=60.0, atk=0.0`; buff keys: `env_gbuff_new_with_verify`
|
||||
- **卡西米尔竞技旗** (`chess_item_4_07_e_a`, TIV, 2) - After each deploy: outgoing damage *= damage_scale for `interval` (15) s; afterwards every ex_interval (0.5) s the multiplier changes by damage_scale_minus until it reaches 1.0.
|
||||
params: `damage_scale=1.35/1.6, interval=15.0, ex_interval=0.5, damage_scale_minus=-0.04/-0.07`; buff keys: `env_gbuff_new_with_verify`
|
||||
- **拉特兰桥夹** (`chess_item_4_08_e_a`, TIV, 1) - Ammo-type skills: when ammo remaining becomes 1, prob chance to restore ceil(ammo_percent * maxAmmo) [ASSUMED rounding] bullets; max max_trigger_cnt triggers per deploy.
|
||||
params: `prob=0.5/0.6, ammo_percent=0.4/0.6, max_trigger_cnt=3.0`; buff keys: `env_gbuff_new_with_verify`
|
||||
- **灼燃维式重锤** (`chess_item_4_09_e_a`, TIV, 2) - ATK% += atk. When dealing ARTS damage: also inflict 灼燃损伤(Burn elemental damage) = damage_scale * that damage.
|
||||
params: `atk=0.3/0.5, damage_scale=0.1`; buff keys: `env_gbuff_new_with_verify, env_gbuff_new_with_verify`
|
||||
- **催泪瓦斯** (`chess_item_5_01_e_a`, TV, 2) - On attack: prob chance to add 1 layer of 麻痹(Paralysis: each layer interrupts one enemy normal attack, max 3 layers).
|
||||
params: `prob=0.03/0.05`; buff keys: `env_gbuff_new_with_verify`
|
||||
- **谢拉格不融冰** (`chess_item_5_02_e_a`, TV, 2) - On attack: prob chance to apply 寒冷(Cold: ASPD -30; cold again while cold -> Frozen) for `cold` s.
|
||||
params: `prob=0.12/0.2, cold=1.5`; buff keys: `env_gbuff_new_with_verify`
|
||||
- **双模机械臂** (`chess_item_5_03_e_a`, TV, 3) - ATK% += atk; carrier's physical and arts damage becomes 弱点伤害(weakness damage): each hit is dealt as whichever of physical/arts yields MORE damage against that target's DEF/RES.
|
||||
params: `atk=0.3/0.5`; buff keys: `env_gbuff_new_with_verify, env_gbuff_new_with_verify`
|
||||
|
||||
### SURVIVAL - 生存 Survival (taunt, shields, undying, revive, DR, CC-immunity)
|
||||
|
||||
- **坚固维式重锤** (`chess_item_3_09_e_a`, TIII, 2) - ATK% += atk. First time per battle carrier would take lethal damage: HP cannot drop below 1 for undeadable_duration s.
|
||||
params: `atk=0.25/0.45, undeadable_duration=8.0`; buff keys: `env_gbuff_new_with_verify, env_gbuff_new_with_verify`
|
||||
- **蜂鸣器** (`chess_item_4_02_e_a`, TIV, 1) - tauntLevel = 1 (enemies prefer this unit as target); maxHP% += max_hp.
|
||||
params: `taunt_level=1.0, max_hp=0.4/0.6`; buff keys: `env_gbuff_new_with_verify, env_gbuff_new_with_verify`
|
||||
- **伪装服** (`chess_item_4_04_e_a`, TIV, 1) - First time the carrier takes damage in a battle: gain 隐匿(Camouflage: not targeted by ranged enemies unless blocking) for `duration` s.
|
||||
params: `duration=15.0/25.0`; buff keys: `env_gbuff_new_with_verify`
|
||||
- **防暴盾** (`chess_item_4_05_e_a`, TIV, 2) - While the carrier is blocking >=1 enemy: damage taken from sources NOT blocked by the carrier *= damage_scale.
|
||||
params: `damage_scale=0.6/0.3`; buff keys: `env_gbuff_new_with_verify`
|
||||
- **休眠子裔** (`chess_item_4_06_e_a`, TIV, 2) - For each target hit by an attack: heal self hp_ratio * maxHP.
|
||||
params: `hp_ratio=0.02/0.04`; buff keys: `env_gbuff_new_with_verify`
|
||||
- **浓缩嗅盐** (`chess_item_4_10_e_a`, TIV, 2) - While HP/maxHP > hp_ratio: immune to stun, freeze, sleep, and other CC 'special states' [ASSUMED list: stun/freeze/sleep/levitate/palsy].
|
||||
params: `hp_ratio=0.7/0.4`; buff keys: `env_gbuff_new_with_verify`
|
||||
- **护盾无人机** (`chess_item_4_11_e_a`, TIV, 2) - Each heal the carrier performs: prob chance to give the healed target 1 shield layer (max max_stack_cnt layers; 1 layer blocks one instance of damage).
|
||||
params: `prob=0.1/0.15, max_stack_cnt=1.0`; buff keys: `env_gbuff_new_with_verify`
|
||||
- **M3茧甲** (`chess_item_4_12_e_a`, TIV, 3) - When the carrier is defeated during the battle phase: revive immediately in place at full HP [ASSUMED full HP] up to max_respawn_cnt times per battle.
|
||||
params: `max_respawn_cnt=1.0/2.0`; buff keys: `env_gbuff_new_with_verify`
|
||||
|
||||
### SP - 技力 SP gain
|
||||
|
||||
- **迅捷作战粮** (`chess_item_3_05_e_a`, TIII, 2) - On deploy: SP += sp_each_person * (1 + N), N = number of OTHER deployed operators sharing at least one bond with the carrier [ASSUMED interpretation].
|
||||
params: `sp_each_person=3.0/6.0`; buff keys: `env_gbuff_new_with_verify`
|
||||
|
||||
### ECONOMY - 经济 Consumed on equip, gives funds
|
||||
|
||||
- **盟约之币** (`chess_item_1_03_e_a`, TI, 1) - On equip: destroy item, player.funds += randInt(min,max) (normal 1, golden 2). Does not use an equip slot.
|
||||
params: `min=1.0/2.0, max=1.0/2.0`; buff keys: `equip_destory_gain_random_coin`
|
||||
- **精打细算玩偶** (`chess_item_2_05_e_a`, TII, 3) - On equip: destroy item; register a permanent player effect: at the start of every subsequent round player.funds += count (stackable).
|
||||
params: `count=1.0/2.0`; buff keys: `gain_coin_when_round_start`
|
||||
- **见钱眼开玩偶** (`chess_item_2_07_e_a`, TII, 1) - On equip: destroy item; at the start of NEXT round only: player.funds += count.
|
||||
params: `count=2.0/4.0`; buff keys: `use_equip_gain_coin_when_next_round_start`
|
||||
- **骑士储蓄罐** (`chess_item_3_12_e_a`, TIII, 3) - On equip: destroy item, player.funds += randInt(min,max) inclusive (normal 1-6, golden 2-12).
|
||||
params: `min=1.0/2.0, max=6.0/12.0`; buff keys: `equip_destory_gain_random_coin`
|
||||
|
||||
### RECRUIT - 调度 Roster manipulation (get / transform / promote operators, deploy cap)
|
||||
|
||||
- **紧急调度券** (`chess_item_2_02_e_a`, TII, 2) - On equip: destroy item; pick `count` random operator(s) currently displayed in the player's shop (调度中心) slots, move them to hand for free; those shop slots become empty.
|
||||
params: `count=1.0/2.0`; buff keys: `use_equip_reward_random_char_chess_in_shop`
|
||||
- **简易通讯机** (`chess_item_2_06_e_a`, TII, 2) - On equip: destroy item; give player `count` random NORMAL-quality operator(s) that share at least one bond with the target operator (tier <= current shop level [ASSUMED]).
|
||||
params: `count=1.0/2.0`; buff keys: `use_equip_reward_char_chess_with_same_bond`
|
||||
- **寻呼模块** (`chess_item_4_01_e_a`, TIV, 4) - On equip: destroy item; open a special shop refresh with refresh_cnt(3) operators sharing a bond with the target (tier <= current shop level); player takes choice_cnt(1) of them for free. Never merges (upgradeNum=100).
|
||||
params: `refresh_cnt=3.0, choice_cnt=1.0`; buff keys: `use_equip_reward_special_goods_char_chess`
|
||||
- **信标** (`chess_item_5_04_e_a`, TV, 3) - On equip: destroy BOTH the item and the target operator; special refresh of refresh_cnt(2) operators of the SAME tier as the target, take choice_cnt(1) free. Multiplayer: at next prep phase send 1 copy of the original operator to the teammate who has the most operators of that operator's bond(s) (tie -> random). Cannot target DIY(自编) operators. Never merges.
|
||||
params: `refresh_cnt=2.0, choice_cnt=1.0`; buff keys: `use_equip_recruit_new_char_and_give_char_to_player_most_bond`
|
||||
- **拟态物质** (`chess_item_5_05_e_a`, TV, 4) - On equip: destroy item; if player owns >= 2 NORMAL copies of the target operator (field+hand), give 1 more normal copy (usually triggers 3->elite merge); else give 1 random normal operator sharing a bond with the target. Never merges.
|
||||
params: `-`; buff keys: `use_equip_reward_char_chess`
|
||||
- **博士投影** (`chess_item_5_06_e_a`, TV, 5) - Normal: equip onto any normal operator (occupies a slot until next round start), at the start of the next round destroy item and promote the operator to elite(精锐/golden). Golden: on equip, destroy item and promote immediately. On promotion, equipped items return to hand.
|
||||
params: `-`; buff keys: `equip_round_start_upgrade_char`
|
||||
- **商业包装方案** (`chess_item_5_07_e_a`, TV, 3) - Stays equipped. Counter of operators SOLD by the player (any): every `count` sales, give 1 random NORMAL operator sharing a bond with the carrier, tier <= current shop level.
|
||||
params: `count=8.0/7.0`; buff keys: `sell_char_count_gain_equip_owner_bond`
|
||||
- **突变细胞** (`chess_item_5_08_e_a`, TV, 2) - After the battle ends: replace the carrier with a random operator one tier higher (max tier 6); item consumed [ASSUMED]. Keeps elite status? [ASSUMED: result is NORMAL quality; other equipped item returns to hand]. Never merges.
|
||||
params: `-`; buff keys: `char_chess_transformation_equip`
|
||||
- **人事部文档** (`chess_item_6_08_e_a`, TVI, 4) - On equip: destroy item; player's max deployable operator count becomes `count` (9) (base maxBattleChessCnt = 8). Never merges; a second copy has no further effect [ASSUMED].
|
||||
params: `count=9.0`; buff keys: `equip_destory_deployment_cnt_change`
|
||||
|
||||
### BOND - 盟约层数 Bond-layer consumables
|
||||
|
||||
- **随身身份牌** (`chess_item_1_04_e_a`, TI, 1) - On equip: destroy item; for EACH bond of the target operator: bondLayer[bond] += layer (works even if that bond is not activated).
|
||||
params: `layer=3.0/6.0`; buff keys: `use_equip_reward_char_chess_bond_layer`
|
||||
|
||||
### BOND_GRANT - 盟约赋予 Grants an extra bond
|
||||
|
||||
- **变形同构体** (`chess_item_6_09_e_a`, TVI, 3) - Carrier additionally counts as a member of bond B where B = giveBondId of the OTHER item equipped on the same operator (see bondGrantTable). No effect if the other item has giveBondId=null. Never merges.
|
||||
params: `-`; buff keys: ``
|
||||
|
||||
### SET - 套装 Two-piece set (天马)
|
||||
|
||||
- **天马之盔** (`chess_item_5_09_e_a`, TV, 3) - maxHP% += max_hp. If carrier also holds 天马之枪 (either quality): regen hp_recovery_per_sec_by_max_hp_ratio * maxHP per second.
|
||||
params: `max_hp=0.5/0.75, hp_recovery_per_sec_by_max_hp_ratio=0.08`; buff keys: `env_gbuff_new_with_verify, env_gbuff_new_with_verify`
|
||||
- **天马之枪** (`chess_item_6_01_e_a`, TVI, 3) - ATK% += atk. If carrier also holds 天马之盔: every damage instance additionally deals atk_scale * ATK as TRUE damage [ASSUMED: % of ATK, per blackboard key atk_scale; description says 30% true damage].
|
||||
params: `atk=0.4/0.6, atk_scale=0.3`; buff keys: `env_gbuff_new_with_verify, env_gbuff_new_with_verify`
|
||||
|
||||
### BOND_SIGNATURE - VI阶盟约专属 Bond-gated signature items (bonus if carrier has bond X, extra bonus if paired with bond's base item)
|
||||
|
||||
- **铳骑之威** (`chess_item_6_02_e_a`, TVI, 4) - ATK% += atk. If carrier has bond Laterano: on each attack, prob chance to fire an extra bullet at 1 enemy in range dealing atk_scale_1 * ATK physical damage; if carrier also holds 拉特兰桥夹 -> atk_scale_2 * ATK.
|
||||
params: `prob=0.35, atk_scale_1=1.5, atk_scale_2=3.0, atk=0.4/0.6`; buff keys: `env_gbuff_new_with_verify, env_gbuff_new_with_verify`
|
||||
- **天师古鼎** (`chess_item_6_03_e_a`, TVI, 4) - maxHP% += max_hp. If carrier has bond Yan: at battle start ASPD += attack_speed * min(k, max_cnt), k = operators the player acquired during THIS round's prep. If also holding 炎国短刀: each time the player acquires an operator, funds += count (max `max` times per round).
|
||||
params: `attack_speed=25.0, max_cnt=3.0, max_hp=0.45/0.7, count=2.0, max=3.0`; buff keys: `env_gbuff_new_with_verify, env_gbuff_new_with_verify, equip_with_another_gain_coin_when_gain_char`
|
||||
- **海沟实验体** (`chess_item_6_04_e_a`, TVI, 4) - Flat damage reduction: each incoming hit reduced by `value` (180/300, min 0 [ASSUMED]). If carrier has bond Aegir: when taking damage, deal atk_scale * ATK arts damage to the source (internal CD lock_duration 0.5 s); if also holding 阿戈尔重刃, one additional hit of atk_scale * ATK arts (same CD).
|
||||
params: `lock_duration=0.5, atk_scale=0.5, value=180.0/300.0`; buff keys: `env_gbuff_new_with_verify, env_gbuff_new_with_verify`
|
||||
- **蒸汽之心** (`chess_item_6_05_e_a`, TVI, 4) - ASPD += attack_speed_1 (35/55). If carrier has bond Victoria: gains the special effects of every hammer (灼燃/坚固/加速/战栗) currently equipped by ANY of the player's on-field operators (burn 10% of arts dmg, undying 8 s, ASPD +30, 10% tremble 2 s). If it also holds a hammer-series item, that hammer's special effect is doubled (burn 20%, undying 16 s, ASPD +60, tremble prob 20% [ASSUMED doubling targets]).
|
||||
params: `damage_scale=0.1, undeadable_duration=8.0, attack_speed=30.0, prob=0.1, disarmed_duration=2.0, attack_speed_1=35.0/55.0`; buff keys: `env_gbuff_new_with_verify, env_gbuff_new_with_verify`
|
||||
- **耶拉冈德之泪** (`chess_item_6_06_e_a`, TVI, 4) - RES += magic_resistance. If carrier has bond Kjerag: every `interval` (1 s) each Cold or Frozen enemy inside the carrier's attack range takes atk_scale * ATK arts damage; atk_scale_ex (100%) if carrier also holds 谢拉格不融冰.
|
||||
params: `atk_scale=0.3, interval=1.0, atk_scale_ex=1.0, magic_resistance=30.0/50.0`; buff keys: `char_dynamic_ability_new, env_gbuff_new_with_verify`
|
||||
- **黄沙罗盘** (`chess_item_6_07_e_a`, TVI, 4) - Initial SP += init_sp (30/50). If carrier has bond Sargon: when its FIRST skill ends, SP += sp (30). If also holding 萨尔贡浓茶: each time the carrier activates a skill, all Sargon operators on field gain addition_sp (3) SP.
|
||||
params: `sp=30.0, addition_sp=3.0, init_sp=30.0/50.0`; buff keys: `env_gbuff_new_with_verify`
|
||||
- **骑士戒律** (`chess_item_6_10_e_a`, TVI, 4) - respawnTime *= (1 + respawn_time) (-40%/-60%). If carrier has bond Kazimierz: for `duration` (20) s after activating a skill, enemies inside its attack range get ASPD x attack_speed(0.65) and move speed x move_speed(0.65) (i.e. -35%). If also holding 卡西米尔竞技旗: during skill duration ATK% += atk (+100%), and lethal damage does not retreat it; it retreats when the skill ends.
|
||||
params: `respawn_time=-0.4/-0.6, max_hp=0.0, duration=20.0, atk=1.0, move_speed=0.65, attack_speed=0.65`; buff keys: `env_gbuff_new_with_verify, env_gbuff_new_with_verify, char_dynamic_ability_new`
|
||||
- **家族徽章** (`chess_item_6_11_e_a`, TVI, 4) - spRecoveryPerSec += sp_recovery_per_sec (0.2/0.35). If carrier has bond Siracusa: while Camouflaged, ATK% += atk_per_sec per second (2%/s) up to max_atk (+100%, i.e. 200% ATK); the bonus lasts until the first damage dealt after camouflage ends, or until the carrier leaves the field. If also holding 叙拉古正装: that first hit after losing camouflage additionally deals atk_scale (800%) * ATK true damage.
|
||||
params: `sp_recovery_per_sec=0.2/0.35, atk_per_sec=0.02, max_atk=1.0, atk_scale=8.0`; buff keys: `env_gbuff_new_with_verify, env_gbuff_new_with_verify`
|
||||
|
||||
### MAGIC - 法术 Arts: placed on a map tile, not equipped
|
||||
|
||||
- **“神秘顾客”** (`chess_item_6_01_m`, TVI, 2) - Drag onto the field: choose a special bounty (hunter_band_1). When actively destroyed: +1 fund and the item passes to the next player. UNUSED in act2 (no band/garrison grants it) - implement last or skip.
|
||||
params: `count=1.0`; buff keys: `trap_create_self_choice, trap_disney_special`
|
||||
- **画卷** (`chess_item_6_02_m`, TVI, 2) - Drag onto a map tile during prep. Range 1-1 = the tile itself + the tile in front (facing). Gives the player a copy of 1 operator inside that range, INCLUDING elite status and equipped items (copies go to hand). Consumed.
|
||||
params: `-`; buff keys: `trap_copy_front_char`
|
||||
- **教鞭** (`chess_item_6_03_m`, TVI, 2) - Drag onto the field during prep: opens a personal bounty choice (choice event hunter_band_1). The chosen bounty adds extra enemies to your next battle; killing them / perfect defence grants funds (see ENEMY_GAIN '...悬赏' effects). Consumed.
|
||||
params: `-`; buff keys: `trap_create_self_choice`
|
||||
|
||||
## 5. 变形同构体 (Damazti Isomorph) bond-grant table [DATA]
|
||||
|
||||
Carrier gains the bond of its OTHER equipped item. From `trapChessDataDict[*].giveBondId` (also listed in the trap talent text).
|
||||
|
||||
| bond | items that grant it |
|
||||
|---|---|
|
||||
| 维多利亚 (`victoriaShip`) | 维式重锤(chess_item_1_01_e), 战栗维式重锤(chess_item_2_03_e), 坚固维式重锤(chess_item_3_09_e), 加速维式重锤(chess_item_3_10_e), 灼燃维式重锤(chess_item_4_09_e) |
|
||||
| 坚守 (`steadShip`) | 坚守盾牌(chess_item_1_02_e) |
|
||||
| 不屈 (`indomShip`) | 不屈弹射器(chess_item_2_01_e) |
|
||||
| 萨尔贡 (`sargonShip`) | 萨尔贡浓茶(chess_item_2_04_e) |
|
||||
| 叙拉古 (`siracusaShip`) | 叙拉古正装(chess_item_3_01_e) |
|
||||
| 精准 (`preciShip`) | 精准狙击镜(chess_item_3_02_e) |
|
||||
| 炎 (`yanShip`) | 炎国短刀(chess_item_3_04_e) |
|
||||
| 迅捷 (`swiftShip`) | 迅捷作战粮(chess_item_3_05_e) |
|
||||
| 阿戈尔 (`egirShip`) | 阿戈尔重刃(chess_item_3_07_e) |
|
||||
| 奥术 (`arcaneShip`) | 奥术法阵(chess_item_3_08_e) |
|
||||
| 突袭 (`raidShip`) | 突袭手雷(chess_item_3_11_e) |
|
||||
| 卡西米尔 (`kazimierzShip`) | 卡西米尔竞技旗(chess_item_4_07_e) |
|
||||
| 拉特兰 (`lateranoShip`) | 拉特兰桥夹(chess_item_4_08_e) |
|
||||
| 谢拉格 (`kjeragShip`) | 谢拉格不融冰(chess_item_5_02_e) |
|
||||
|
||||
Note: 9 bonds cannot be obtained this way (灵巧, 助力, 远见, 奇迹, 投资人, 调和, 协防, 独行, 绝技 have no item).
|
||||
|
||||
## 6. VI-tier bond signature items and combos [DATA]
|
||||
|
||||
| item | base stat (normal/golden) | needs bond | bond effect | combo partner | combo effect |
|
||||
|---|---|---|---|---|---|
|
||||
| 铳骑之威 | ATK +40%/+60% | 拉特兰 | 35% on attack: extra bullet 150% ATK phys to 1 enemy in range | 拉特兰桥夹 | bullet 300% ATK |
|
||||
| 天师古鼎 | HP +45%/+70% | 炎 | battle start ASPD +25 per operator acquired this round (max 3) | 炎国短刀 | +2 funds per operator acquired (max 3/round) |
|
||||
| 海沟实验体 | flat DR 180/300 | 阿戈尔 | on hit taken: 50% ATK arts to source (0.5 s CD) | 阿戈尔重刃 | extra 50% ATK arts hit (0.5 s CD) |
|
||||
| 蒸汽之心 | ASPD +35/+55 | 维多利亚 | gains special effects of all hammers equipped on your field | 维式重锤系列 | that hammer's special effect x2 |
|
||||
| 耶拉冈德之泪 | RES +30/+50 | 谢拉格 | cold/frozen enemies in range take 30% ATK arts per s | 谢拉格不融冰 | 100% ATK per s |
|
||||
| 黄沙罗盘 | initial SP +30/+50 | 萨尔贡 | first skill end: +30 SP | 萨尔贡浓茶 | each skill cast: all Sargon +3 SP |
|
||||
| 骑士戒律 | redeploy -40%/-60% | 卡西米尔 | 20 s after skill: enemies in range ASPD/move x0.65 | 卡西米尔竞技旗 | during skill ATK +100%, no retreat on lethal, retreats when skill ends |
|
||||
| 家族徽章 | SP regen +0.2/+0.35 /s | 叙拉古 | while camouflaged ATK +2%/s up to 200%, until first damage after camo | 叙拉古正装 | first hit after camo: +800% ATK true damage |
|
||||
| 天马之枪 (no bond) | ATK +40%/+60% | - | - | 天马之盔 | +30% true damage on each damage instance |
|
||||
| 天马之盔 (T5, no bond) | HP +50%/+75% | - | - | 天马之枪 | regen 8% maxHP per s |
|
||||
|
||||
Combo check: `equip_chess_id` in blackboard is the partner's id WITHOUT the `_a/_b` suffix -> either quality satisfies it.
|
||||
|
||||
## 7. MAGIC (法术 / Arts) [DATA]
|
||||
|
||||
| id | name | EN | tier | price | range | effect | obtained from |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| `chess_item_6_01_m` | “神秘顾客” | "Mystery Customer" | 6 | 2 (hidden) | `0-1` [{'row': 0, 'col': 0}] | 拖拽至场上使用后,选择一项特殊悬赏任务进行挑战;主动销毁时获得1份资金,并将“神秘顾客”传递给下一名玩家 | nothing in act2 (legacy/unused) |
|
||||
| `chess_item_6_02_m` | 画卷 | Dusk's Scroll | 6 | 2 (hidden) | `1-1` [{'row': 0, 'col': 0}, {'row': 0, 'col': 1}] | 拖拽至场上使用后,获得范围内的干员(包括精锐状态和装备!) | band_dusk (【幻画为真】 round 1) |
|
||||
| `chess_item_6_03_m` | 教鞭 | Pointing Stick | 6 | 2 (hidden) | `0-1` [{'row': 0, 'col': 0}] | 拖拽至场上使用后,选择一项悬赏任务进行挑战 | band_doberm (【加练!】 every 2 rounds) |
|
||||
|
||||
- Buff keys: 画卷 `trap_copy_front_char{}`; 教鞭 `trap_create_self_choice{choice_event=hunter_band_1}`; 神秘顾客 additionally `trap_disney_special{count=1}`.
|
||||
- `hunter_band_1` (choiceType PERSONAL_CHOOSE, "悬赏决策") pool is server-side. [ASSUMED] offer 3 random `enemyeffect_b_*` bounties (e.g. 碎骨·悬赏 +1, 萨卡兹百夫长·悬赏 +2, 泥岩·悬赏 +4, 锏·悬赏 +5, “复仇者”·悬赏 +6 funds; buff `add_enemy_kill_gain_coin{count,enemy_id,coin,round=1}`): adds 1 enemy to your next battle, killer gets `coin` funds.
|
||||
- 画卷 copy: duplicates the operator (same chess id incl. elite `_b`) AND clones its equipped items into the copy [DATA desc "包括精锐状态和装备"]; copy goes to hand [ASSUMED]; if hand full -> temporary hand.
|
||||
|
||||
## 8. Item sources other than the shop [DATA]
|
||||
|
||||
| source | id | trigger / what |
|
||||
|---|---|---|
|
||||
| BAND_INITIAL band_orchid | `aceffect_band_23` | 【猎头顾问】每次主动刷新均变为特殊刷新:必定刷新2名同名干员,并冻结其中一名;第10回合获得1个<寻呼模块> / <寻呼模块>:装备时销毁,立即在调度中心中刷新三名与该干员盟约相同的干员,免费获得其中一名!(不超过当前调度中心等级) -> `chess_item_4_01_e_a` {'round': 10.0, 'count': 1.0, 'type': 'equip'} |
|
||||
| BAND_INITIAL band_doberm | `aceffect_band_25` | 【加练!】每2个回合获得1个特殊法术<教鞭> / <教鞭>:使用后为下场战斗添加额外敌人,若自身战斗完美作战可获得资金 -> `chess_item_6_03_m` {'round': 2.0, 'count': 1.0, 'type': 'trap'} |
|
||||
| BAND_INITIAL band_cathy | `aceffect_band_26` | 【定向投放】每次升级调度中心时,在调度中心刷新随机3件装备,可以选择并获得其中1件 -> `pool_equip_kathe` {'count': 3.0, 'choice': 1.0} |
|
||||
| BAND_INITIAL band_malkie | `aceffect_band_27` | 【商业包装】初始获得1个<商业包装方案> / <商业包装方案>:每出售8名任意干员后,获得1名装备者的同盟约普通干员 -> `chess_item_5_07_e_a` {'round': 1.0, 'count': 1.0, 'type': 'equip'} |
|
||||
| BAND_INITIAL band_damaztic | `aceffect_band_40` | 【变形同构】每5回合获得1件特殊装备<变形同构体> / <变形同构体>:与特定装备一同装备时装备者将视为特定盟约成员 -> `chess_item_6_09_e_a` {'round': 5.0, 'count': 1.0, 'type': 'equip'} |
|
||||
| BAND_INITIAL band_damaztic | `aceffect_band_40` | 【变形同构】每5回合获得1件特殊装备<变形同构体> / <变形同构体>:与特定装备一同装备时装备者将视为特定盟约成员 -> `chess_item_6_09_e_a` {'round': 10.0, 'count': 1.0, 'type': 'equip'} |
|
||||
| BAND_INITIAL band_damaztic | `aceffect_band_40` | 【变形同构】每5回合获得1件特殊装备<变形同构体> / <变形同构体>:与特定装备一同装备时装备者将视为特定盟约成员 -> `chess_item_6_09_e_a` {'round': 15.0, 'count': 1.0, 'type': 'equip'} |
|
||||
| BAND_INITIAL band_quintus | `aceffect_band_41` | 【不稳定要素】第3回合获得1件特殊装备<突变细胞> / <突变细胞>:战斗结束后使装备者变为高一阶的随机干员(最高6阶) -> `chess_item_5_08_e_a` {'round': 3.0, 'count': 1.0, 'type': 'equip'} |
|
||||
| BAND_INITIAL band_dusk | `aceffect_band_45` | 【墨色真颜】若你的场上存在同名干员,这些干员攻击力+30% / 【幻画为真】第1回合获得1个特殊法术<画卷> / <画卷>:使用后可以复制该法术范围内的1名干员(包括精锐状态和携带的装备) -> `chess_item_6_02_m` {'round': 1.0, 'count': 1.0, 'type': 'trap'} |
|
||||
| BAND_INITIAL band_justin | `aceffect_band_47` | 【私募基金】在第1、4、7、10回合进入休整期时获得1个<骑士储蓄罐> / <骑士储蓄罐>:装备时随机获得1~6资金并销毁 -> `chess_item_3_12_e_a` {'round': 1.0, 'count': 1.0, 'type': 'equip'} |
|
||||
| BAND_INITIAL band_justin | `aceffect_band_47` | 【私募基金】在第1、4、7、10回合进入休整期时获得1个<骑士储蓄罐> / <骑士储蓄罐>:装备时随机获得1~6资金并销毁 -> `chess_item_3_12_e_a` {'round': 4.0, 'count': 1.0, 'type': 'equip'} |
|
||||
| BAND_INITIAL band_justin | `aceffect_band_47` | 【私募基金】在第1、4、7、10回合进入休整期时获得1个<骑士储蓄罐> / <骑士储蓄罐>:装备时随机获得1~6资金并销毁 -> `chess_item_3_12_e_a` {'round': 7.0, 'count': 1.0, 'type': 'equip'} |
|
||||
| BAND_INITIAL band_justin | `aceffect_band_47` | 【私募基金】在第1、4、7、10回合进入休整期时获得1个<骑士储蓄罐> / <骑士储蓄罐>:装备时随机获得1~6资金并销毁 -> `chess_item_3_12_e_a` {'round': 10.0, 'count': 1.0, 'type': 'equip'} |
|
||||
| BAND_INITIAL band_jesica | `aceffect_band_54` | 【集结指示】在第4、7、10、13回合进入休整期时获得1个<寻呼模块> / <寻呼模块>:装备时销毁,立即在调度中心中刷新三名与该干员盟约相同的干员,免费获得其中一名!(不超过当前调度中心等级) -> `chess_item_4_01_e_a` {'round': 4.0, 'count': 1.0, 'type': 'equip'} |
|
||||
| BAND_INITIAL band_jesica | `aceffect_band_54` | 【集结指示】在第4、7、10、13回合进入休整期时获得1个<寻呼模块> / <寻呼模块>:装备时销毁,立即在调度中心中刷新三名与该干员盟约相同的干员,免费获得其中一名!(不超过当前调度中心等级) -> `chess_item_4_01_e_a` {'round': 7.0, 'count': 1.0, 'type': 'equip'} |
|
||||
| BAND_INITIAL band_jesica | `aceffect_band_54` | 【集结指示】在第4、7、10、13回合进入休整期时获得1个<寻呼模块> / <寻呼模块>:装备时销毁,立即在调度中心中刷新三名与该干员盟约相同的干员,免费获得其中一名!(不超过当前调度中心等级) -> `chess_item_4_01_e_a` {'round': 10.0, 'count': 1.0, 'type': 'equip'} |
|
||||
| BAND_INITIAL band_jesica | `aceffect_band_54` | 【集结指示】在第4、7、10、13回合进入休整期时获得1个<寻呼模块> / <寻呼模块>:装备时销毁,立即在调度中心中刷新三名与该干员盟约相同的干员,免费获得其中一名!(不超过当前调度中心等级) -> `chess_item_4_01_e_a` {'round': 13.0, 'count': 1.0, 'type': 'equip'} |
|
||||
| BAND_INITIAL band_mlyss | `aceffect_band_55` | 【至纯凝结】在第1回合开始时获得一个进阶<博士投影> / 进阶<博士投影>:任意干员可装备,立即使该干员晋升为精锐干员 -> `chess_item_5_06_e_b` {'round': 1.0, 'count': 1.0, 'type': 'equip'} |
|
||||
| BAND_INITIAL band_fang | `aceffect_band_57` | 【协力共进】第8、10、12、14回合时,获得1个<信标> / <信标>:装备后销毁携带干员,并在调度中心刷新两名同等阶干员免费获取其中一名;原干员在下回合传递给对应盟约人数最多的队友 -> `chess_item_5_04_e_a` {'round': 8.0, 'count': 1.0, 'type': 'equip'} |
|
||||
| BAND_INITIAL band_fang | `aceffect_band_57` | 【协力共进】第8、10、12、14回合时,获得1个<信标> / <信标>:装备后销毁携带干员,并在调度中心刷新两名同等阶干员免费获取其中一名;原干员在下回合传递给对应盟约人数最多的队友 -> `chess_item_5_04_e_a` {'round': 10.0, 'count': 1.0, 'type': 'equip'} |
|
||||
| BAND_INITIAL band_fang | `aceffect_band_57` | 【协力共进】第8、10、12、14回合时,获得1个<信标> / <信标>:装备后销毁携带干员,并在调度中心刷新两名同等阶干员免费获取其中一名;原干员在下回合传递给对应盟约人数最多的队友 -> `chess_item_5_04_e_a` {'round': 12.0, 'count': 1.0, 'type': 'equip'} |
|
||||
| BAND_INITIAL band_fang | `aceffect_band_57` | 【协力共进】第8、10、12、14回合时,获得1个<信标> / <信标>:装备后销毁携带干员,并在调度中心刷新两名同等阶干员免费获取其中一名;原干员在下回合传递给对应盟约人数最多的队友 -> `chess_item_5_04_e_a` {'round': 14.0, 'count': 1.0, 'type': 'equip'} |
|
||||
| BAND_INITIAL band_narant | `aceffect_band_60` | 【见者有份】偶数回合进入休整期时,调度中心特殊刷新两件装备,免费获取其中一件;萨尔贡盟约<在场6名不同【萨尔贡】干员>效果替换为【萨尔贡】干员技能开启后,周围八格干员同时享受该干员携带的不高于V阶的装备效果,持续60秒 / 在<萨尔贡>部分干员缺席时体验可能不完整 -> `pool_equip_narant` {'round': 2.0, 'count': 1.0, 'type': 'equip', 'refresh_cnt': 2.0, 'choice_cnt': 1.0} |
|
||||
| BOND | `bondeffect_victoria` | 携带装备的【维多利亚】干员伤害提升至{0:0%}(受层数影响) / <每叠加25层>获得一件带有随机特殊效果的维式重锤 / <在场6名不同【维多利亚】干员>【维多利亚】干员每携带1件装备攻击力+50%,携带进阶装备改为+80% -> `pool_equip_vict` {'layer': 25.0, 'count': 1.0} |
|
||||
| BUFF_GAIN | `allybuff_select_1` | 你获得2件随机1阶装备,若存在其他队友则他们也获得 -> `pool_equip_shop_1` {'count': 2.0} |
|
||||
| GARRISON | `garrison_45_a` | <进入休整期时>获得1件随机装备 -> `pool_equip_normal` {'count': 1.0, 'conditionkey': 'character_target_inboard'} |
|
||||
| GARRISON 卡涅利安(char_426_billro), 蜜蜡(char_344_beewax) | `garrison_49_a` | <获得时>获得1件“迅捷作战粮” -> `chess_item_3_05_e_a` {'count': 1.0} |
|
||||
| GARRISON 缪尔赛思(char_249_mlyss) | `garrison_76_a` | <获得时>获得1个“变形同构体” -> `chess_item_6_09_e_a` {'count': 1.0} |
|
||||
| GARRISON 洛洛(char_4040_rockr) | `garrison_91_a` | <获得时>随机制造1件洛洛的定制品 -> `pool_equip_rockr` {'count': 1.0} |
|
||||
| GARRISON 耶拉(char_4013_kjera) | `garrison_92_a` | <获得时>获得1件“谢拉格不融冰” -> `chess_item_5_02_e_a` {'count': 1.0} |
|
||||
| GARRISON 佩佩(char_4058_pepe) | `garrison_94_a` | <进入休整期时>获得1件“盟约之币”或“萨尔贡浓茶”,有小概率发现“黄沙罗盘” -> `pool_equip_pepe` {'count': 1.0, 'conditionkey': 'character_target_inboard'} |
|
||||
| GARRISON 凯瑟琳(char_4162_cathy) | `garrison_127_a` | <进入休整期时>若当前为奇数回合,获得1件随机装备 -> `pool_equip_normal` {'round_list': '1,3,5,7,9,11,13,15', 'count': 1.0, 'conditionkey': 'character_target_inboard'} |
|
||||
| GARRISON 诗怀雅(char_308_swire) | `garrison_133_a` | <获得时>获得1个“盟约之币” -> `chess_item_1_03_e_a` {'count': 1.0} |
|
||||
| GARRISON | `garrison_134_a` | 本干员三合一为精锐状态时获得1件高阶装备:“骑士戒律” -> `None` {} |
|
||||
| GARRISON | `garrison_135_a` | <获得时>获得1件“卡西米尔竞技旗” -> `chess_item_4_07_e_a` {'count': 1.0} |
|
||||
| GARRISON | `garrison_45_b` | <进入休整期时>获得2件随机装备 -> `pool_equip_normal` {'count': 2.0, 'conditionkey': 'character_target_inboard'} |
|
||||
| GARRISON 卡涅利安(char_426_billro), 蜜蜡(char_344_beewax) | `garrison_49_b` | <获得时>获得2件“迅捷作战粮” -> `chess_item_3_05_e_a` {'count': 2.0} |
|
||||
| GARRISON 缪尔赛思(char_249_mlyss) | `garrison_76_b` | <获得时>获得2个“变形同构体” -> `chess_item_6_09_e_a` {'count': 2.0} |
|
||||
| GARRISON 洛洛(char_4040_rockr) | `garrison_91_b` | <获得时>随机制造2件洛洛的定制品 -> `pool_equip_rockr` {'count': 2.0} |
|
||||
| GARRISON 耶拉(char_4013_kjera) | `garrison_92_b` | <获得时>获得2件“谢拉格不融冰” -> `chess_item_5_02_e_a` {'count': 2.0} |
|
||||
| GARRISON 佩佩(char_4058_pepe) | `garrison_94_b` | <进入休整期时>获得2件“盟约之币”或“萨尔贡浓茶”,有概率发现“黄沙罗盘” -> `pool_equip_pepe` {'count': 2.0, 'conditionkey': 'character_target_inboard'} |
|
||||
| GARRISON 凯瑟琳(char_4162_cathy) | `garrison_127_b` | <进入休整期时>若当前为奇数回合,获得2件随机装备 -> `pool_equip_normal` {'round_list': '1,3,5,7,9,11,13,15', 'count': 2.0, 'conditionkey': 'character_target_inboard'} |
|
||||
| GARRISON 诗怀雅(char_308_swire) | `garrison_133_b` | <获得时>获得2个“盟约之币” -> `chess_item_1_03_e_a` {'count': 2.0} |
|
||||
| GARRISON | `garrison_134_b` | <获得时>获得1件【骑士戒律】 -> `chess_item_6_10_e_a` {'count': 1.0} |
|
||||
| GARRISON | `garrison_135_b` | <获得时>获得2件【卡西米尔竞技旗】 -> `chess_item_4_07_e_a` {'count': 2.0} |
|
||||
|
||||
Pools referenced but NOT defined in client data (server-side) - proposed contents [ASSUMED]:
|
||||
|
||||
- `pool_equip_normal` (凯瑟琳/garrison_45/127): any non-hidden normal EQUIP with tier <= shop level.
|
||||
- `pool_equip_shop_1` (列装): tier I normal EQUIP.
|
||||
- `pool_equip_vict` (维多利亚 bond, every 25 layers): {灼燃, 坚固, 加速, 战栗}维式重锤, uniform.
|
||||
- `pool_equip_pepe` (佩佩): 盟约之币 45%, 萨尔贡浓茶 45%, 黄沙罗盘 10% (golden 佩佩: 40/40/20).
|
||||
- `pool_equip_rockr` (洛洛 "定制品"): {有限加速器, 激光发射器, 护盾无人机, 双模机械臂, 蜂鸣器} uniform.
|
||||
- `pool_equip_kathe` (band_cathy 定向投放, on each shop upgrade 3 choose 1) and `pool_equip_narant` (band_narant, every even round 2 choose 1): tier <= new shop level normal EQUIP.
|
||||
- garrison_45 / 134 / 135 exist but are not referenced by any operator in `charChessDataDict` (unused this season).
|
||||
|
||||
## 9. Status / damage terms used by items
|
||||
|
||||
- **晕眩 Stun**: cannot move, block, attack or use skills
|
||||
- **寒冷 Cold**: ASPD -30; if Cold is applied again while Cold -> Frozen
|
||||
- **冻结 Frozen**: cannot move, attack or use skills; (AK standard) RES -15 while frozen
|
||||
- **战栗 Tremble**: while blocked, cannot perform normal attacks (implemented as disarm-when-blocked)
|
||||
- **麻痹 Paralysis**: each layer cancels one enemy normal attack; max 3 layers
|
||||
- **失去特殊能力 Silence(enemy)**: enemy loses its special abilities/talents for the duration
|
||||
- **隐匿 Camouflage**: not targeted by enemy attacks unless blocking
|
||||
- **护盾 Shield layer**: each layer absorbs one instance of damage completely
|
||||
- **灼燃损伤 Burn (elemental)**: accumulates on target; (AK standard) at 1000 burst for 7000 arts damage and RES -20 for 10 s; simplify if needed
|
||||
- **弱点伤害 Weakness damage**: deals physical or arts, whichever the target resists less
|
||||
- **伤害减免 Flat DR**: each hit reduced by a fixed value
|
||||
- **嘲讽 tauntLevel**: higher tauntLevel is targeted first by enemies
|
||||
|
||||
## 10. Changes vs season 1 (act1autochess) [DATA]
|
||||
|
||||
- 13 new items: 天马之枪, 源石溶剂, 家族徽章, 天马之盔, 精打细算玩偶, 骑士储蓄罐, 见钱眼开玩偶, 卡西米尔竞技旗, 随身身份牌, 骑士戒律, 紧急调度券, 简易通讯机, 叙拉古正装. None removed.
|
||||
- Items now sold from shop level 1 (1 slot) instead of level 5.
|
||||
- Tier/price changes (act1 tier,price -> act2): 盟约之币 [4, 3]->[1, 1]; 不屈弹射器 [1, 1]->[2, 1]; 萨尔贡浓茶 [3, 2]->[2, 2]; 激光发射器 [2, 2]->[3, 2]; 炎国短刀 [2, 1]->[3, 2]; 迅捷作战粮 [2, 2]->[3, 2]; 歌利亚头盔 [2, 2]->[3, 2]; 阿戈尔重刃 [1, 1]->[3, 2]; 奥术法阵 [1, 2]->[3, 1]; 坚固维式重锤 [2, 2]->[3, 2]; 加速维式重锤 [2, 2]->[3, 2]; 寻呼模块 [5, 4]->[4, 4]; 蜂鸣器 [2, 1]->[4, 1]; 有限加速器 [2, 2]->[4, 2]; 伪装服 [3, 1]->[4, 1]; 防暴盾 [3, 2]->[4, 2]; 休眠子裔 [4, 1]->[4, 2]; 拉特兰桥夹 [3, 2]->[4, 1]; 灼燃维式重锤 [2, 2]->[4, 2]; 护盾无人机 [4, 3]->[4, 2]; 催泪瓦斯 [4, 2]->[5, 2]; 谢拉格不融冰 [4, 2]->[5, 2]; 双模机械臂 [4, 4]->[5, 3]; 信标 [5, 1]->[5, 3]; 商业包装方案 [6, 3]->[5, 3]; 突变细胞 [6, 2]->[5, 2]; 人事部文档 [6, 5]->[6, 4]; 变形同构体 [6, 4]->[6, 3].
|
||||
- arknights.wiki.gg "Stronghold_Protocol_Alliance/Items" reflects older global data (e.g. 维式重锤 +10%); do NOT use its numbers, use this file.
|
||||
|
||||
## 11. Open questions / assumptions to confirm
|
||||
|
||||
1. Shop item tier odds and whether item slot shares the operator odds table (server-side). [ASSUMED above]
|
||||
2. Item sell value (1 fund assumed) - no official statement found.
|
||||
3. Whether equipped copies count toward the 2-copy merge (assumed yes).
|
||||
4. Exact contents of server pools (`pool_equip_*`) and of `hunter_band_1` bounty choices.
|
||||
5. 道具补给 / 机密商店 offer size and tier (3-pick-1 assumed); round schedule taken from a community post.
|
||||
6. M3茧甲 revive HP (full assumed); 突变细胞 result quality (normal assumed) and whether the other equipped item returns to hand.
|
||||
7. 天马之枪 "30% true damage": `atk_scale=0.3` suggests 30% of ATK per damage instance; alternative reading 30% of damage dealt. We use 30% ATK.
|
||||
8. 蒸汽之心 doubling for 战栗锤: prob or duration? (we double prob 10%->20%).
|
||||
|
||||
## 12. Sources
|
||||
|
||||
- Game data: Kengxxiao/ArknightsGameData zh_CN (activity_table act2autochess, character_table, skill_table, range_table).
|
||||
- PRTS 卫戍协议/帮助: https://prts.wiki/w/%E5%8D%AB%E6%88%8D%E5%8D%8F%E8%AE%AE/%E5%B8%AE%E5%8A%A9
|
||||
- PRTS 卫戍协议:盟约 下半 (change log 奥术法阵, 商业包装方案): https://prts.wiki/w/%E5%8D%AB%E6%88%8D%E5%8D%8F%E8%AE%AE%EF%BC%9A%E7%9B%9F%E7%BA%A6_%E4%B8%8B%E5%8D%8A
|
||||
- Official 更新公告 (new items; equip on 整备区): https://ak.hypergryph.com/news/5114
|
||||
- arknights.wiki.gg Stronghold Protocol (equip rules, Arts limit): https://arknights.wiki.gg/wiki/Stronghold_Protocol ; items (EN names): https://arknights.wiki.gg/wiki/Stronghold_Protocol_Alliance/Items
|
||||
- Bahamut 衛戍協議:盟約入門介紹 (道具補給 rounds): https://forum.gamer.com.tw/C.php?bsn=33651&snA=12294
|
||||
- In-game tips (autoChessData.gameTipsList): "两件同名装备可以合成一件更强力的装备", "特定的装备组合可以为干员赋予额外的盟约效果", "干员晋级后已配发装备会回收至整备区,需要重新配置".
|
||||
|
||||
---
|
||||
|
||||
## Addendum (critic)
|
||||
|
||||
Written 2026-09-27 by the completeness critic. Sources: the official gameplay-intro long image (§装备, §休整期), BWIKI `盟约` §道具, PRTS `卫戍协议/帮助` §装备/手牌区, and screenshots `i.meee.com.tw/Mb2mtd9.png` (机密商店) and `SEbySVl.png` (战术决策).
|
||||
|
||||
Corrections to §2 and §11:
|
||||
|
||||
| Rule | Was | Now | Tag |
|
||||
|---|---|---|---|
|
||||
| Sell item | 1 fund [ASSUMED] | **Items cannot be sold.** Unwanted items can only be **destroyed for 0 funds**: "多余的装备无法进行出售,可以销毁" (official intro) and "多余的道具只能被销毁,无法出售获得资金" (BWIKI). UI: drag to a destroy zone and confirm. | VERIFIED |
|
||||
| Merge counts equipped copies | yes [ASSUMED] | Confirmed: "两个同名道具(无论是否被装备)会自动合并且晋级…并自动返回整备区". The golden goes to the hand, and the slot it came from is freed. | VERIFIED |
|
||||
| Unequip | – | Confirmed. An item is locked on its operator and leaves only when the operator is promoted, when the item itself merges, or when the operator is sold. In every case it returns to the hand. Replacing an item destroys the replaced one. | VERIFIED |
|
||||
| Who can be equipped | board or hand (下半) | Confirmed (BWIKI: "可直接配置在处于整备区的干员身上"). | VERIFIED |
|
||||
| Hand capacity | 10 shared + 5 temp | Confirmed: "手牌区域分为10个常规手牌区和5个临时手牌区". Items, operators and summon stacks all use it. With a full regular hand you **cannot buy**, items included. Passive gains overflow into temp, and temp blocks readying. | VERIFIED |
|
||||
| Refresh/freeze covers the item slot | [ASSUMED] | Confirmed: the single 冻结 button freezes **all** unsold slots, the item slot included. A refresh rerolls the item slot too. | VERIFIED |
|
||||
| Shop item pool / tier odds | tier ≤ shop level, operator odds | The tier cap is confirmed by "※仅在调度中心等级 ≥ 干员所在等阶时,该干员才有可能出现在栏位中" for operators, and mirrored for items. The odds are still [ASSUMED]. **Recommended:** pick the tier with the same copy-weighted tier shares as operators (see 00-INDEX), then draw uniformly within the tier. | ASSUMED |
|
||||
| 道具补给 / 机密商店 format | 3-pick-1, 机密商店 tier ≥ IV | **Multi: 6 cards shared by the team, each player takes 1.** Solo: 3 cards. **机密商店 draws from all tiers I–VI with duplicates.** A screenshot shows 变形同构体 (VI), 骑士储蓄罐 (III), 双模机械臂 (V) ×2 and 盟约之币 (I) ×2. **道具补给** at R3 (上半 data) showed tiers II–IV, including 有限加速器 ×2. [ASSUMED] tier windows for 道具补给: R3 I–IV, R6 II–V, R9 III–VI, R11 IV–VI. All cards are `_a` (normal) items. | VERIFIED format; tiers partly ASSUMED |
|
||||
| 列装 (`allybuff_select_1`) | 2 random tier-I items | Confirmed: "你获得2件随机1阶装备,若存在其他队友则他们也获得". | VERIFIED |
|
||||
| Arts (MAGIC) | max 2 on the map | Unchanged. Only bands grant them (画卷, 教鞭). | – |
|
||||
|
||||
Other notes:
|
||||
- **人事部文档** (`chess_item_6_08_e`) sets the deploy cap to **9**: "最大可部署人数变为9". The UI counter "剩余可放置角色" must read the cap per player, not the constant 8.
|
||||
- The item card in the shop shows the tier chip and a price badge. There is always exactly 1 item slot at every level in all real modes (`itemCount` = 1).
|
||||
@@ -0,0 +1,446 @@
|
||||
# 05 · Enemies, Waves, Bosses, Maps — 卫戍协议:盟约 (act2autochess)
|
||||
|
||||
Research deliverable for the architect. It comes with two data files:
|
||||
|
||||
- `05-maps.json` (~200 KB): 11 stage terrains (8 active), 38 round/wave templates with routes, and helper ground paths.
|
||||
- `05-enemies.json` (~340 KB): 326 enemies (stats, abilities, skills, autochess roles), special-enemy pools, the per-mode round schedule, bosses, bounty effects, the recommended generation algorithm, and LP rules.
|
||||
|
||||
Sources:
|
||||
- Official: Kengxxiao/ArknightsGameData zh_CN. The files used are `activity_table.autoChessData` and `activity_table.activity.AUTOCHESS_SEASON.act2autochess`, plus `enemy_database`, `enemy_handbook_table`, `character_table` (devices), and `levels/act1autochess|act2autochess`.
|
||||
- Community: PRTS (卫戍协议/帮助, 卫戍协议:盟约 + 战场一览, 下半/战场一览), arknights.wiki.gg/Stronghold_Protocol, forum.gamer.com.tw (#12294, #12316), and the official notice ak.hypergryph.com/news/5114.
|
||||
- Anything the data does not state is marked **[ASSUMED]**.
|
||||
|
||||
---
|
||||
|
||||
## 1. How a match is put together (data flow)
|
||||
|
||||
```
|
||||
modeId ──► stageDatasDict (weighted) ──► ONE stage map (terrain) for the whole match (05-maps.json stages)
|
||||
└─► battleDataDict[mode][round] ──► wave TEMPLATE level (routes+spawns) (05-maps.json roundLevels)
|
||||
└─ template enemy keys = placeholders ─► replaced by special-enemy pools (05-enemies.json)
|
||||
turnInfoDataDict[mode][round] ─► rest-phase time, isBossTurn, boss overtime (150 s)
|
||||
```
|
||||
|
||||
- The round levels (`level_act1autochess_01…h06`, `h07_xx`, `h08_xx`, `tr01/02/04`) have their own `mapData`, but it is only a generic all-road grid. **Ignore that grid.** Take the terrain from the stage chosen at match start, and use only the round level's `routes`, `waves` and `branches`.
|
||||
- WALK routes in the templates have no checkpoints (start (9,10) or (12,10) → end (9,2)). The server must pathfind on the real stage grid.
|
||||
- FLY routes carry explicit N-shaped checkpoints. PRTS confirms: "空中敌人路线为N形或反N形".
|
||||
|
||||
## 2. Maps
|
||||
|
||||
### 2.1 Coordinate convention (verified)
|
||||
- Position `[row, col]`: row 0 is the **bottom** row and col 0 is the left column.
|
||||
- The tile at (row, col) is `tiles[ mapData.map[H-1-row][col] ]`. `map[0]` in the raw file is the **top** row. This was verified because route start/end points fall on `tile_start` / `tile_end` only under this convention.
|
||||
- In `05-maps.json`, `stage.rows[i]` is row i (bottom first). `rowsTopDown` holds the same grid printed top-first for human reading.
|
||||
- 1 tile = 1 world unit. Every level uses `moveMultiplier` 0.5, so effective speed is about `moveSpeed × 0.5` tiles/s **[ASSUMED engine semantics; community rule of thumb]**.
|
||||
|
||||
### 2.2 Layout of every stage (19 rows × 21 cols; several areas on one grid)
|
||||
|
||||
| rows | area |
|
||||
|---|---|
|
||||
| 14–18 | Enemy preview pen: the next-round enemies are displayed here during the rest phase. `enemy_place_rect ((14,7),(18,13))`; row 16 is `previewNotAlloed`. |
|
||||
| 13, 6 | Hard separators (`X`). The act2 m01 blowers sit on them. |
|
||||
| **9–12** | **Normal-round battlefield.** Cols 2–10 are the LOCAL player's board. Cols 11–18 are the slot used to display the partner's board (`player_map_lr_offset` 8, `player_map_lr_boundary_col` 10). |
|
||||
| 8 | Cols 4–8: 5 hand tiles *without* `isValidHand`. Not bench slots **[ASSUMED: staging/equipment display]**. |
|
||||
| **7** | **Bench**: cols 0–9, 10 slots (`isValidHand`=1; constData `maxDeckChessCnt` = 10). |
|
||||
| **1–5** | **Boss / final-offensive battlefield** shared by 2 players: left half cols 2–10, right half cols 10–18. |
|
||||
| 0 | Boss-area benches: cols 0–9 (left player), cols 11–20 (right player). |
|
||||
|
||||
Normal board, per player:
|
||||
- Enemy gates: `S` at (9,10) ("lower red gate"; rounds 1–3 use only this one) and at (12,10).
|
||||
- Protection objective: `E` at (9,2).
|
||||
- Col 9 is a floor lane you cannot deploy on.
|
||||
- Deploy cap is 8 (`characterLimit`).
|
||||
- DP: `initialCost` 0 / `maxCost` 99. DP is irrelevant because units auto-deploy.
|
||||
- Ranged units may use melee tiles.
|
||||
|
||||
Boss board:
|
||||
- Teleport-outs / spawns `O` at (2,10) and (5,10).
|
||||
- Ends `E` at (2,2) and (2,18).
|
||||
- Teleport-ins `I` at (1,3) and (1,17).
|
||||
- Multi-player boss routes cross **both** halves: walk to (1,3), DISAPPEAR, wait 3 s, APPEAR at (5,10), then cross the other half. The two paired players therefore defend in series.
|
||||
- Single-player `*_s` templates use only the left half.
|
||||
|
||||
### 2.3 Legend (glyphs in `rows`)
|
||||
|
||||
| glyph | tile | height | build | ground-passable | notes |
|
||||
|---|---|---|---|---|---|
|
||||
| `#` | forbidden | HIGH | – | no (fly only) | void |
|
||||
| `X` | forbidden | HIGH | – | no (nothing) | separator |
|
||||
| `r` | road | LOW | ALL | yes | main deploy tile (melee **or** ranged) |
|
||||
| `R` | road | LOW | NONE | yes | (act1 m06 only) |
|
||||
| `f` / `p` | floor | LOW | NONE | yes | lane col 9 / preview pen |
|
||||
| `h` | wall | HIGH | RANGED | no | high ground |
|
||||
| `b` | fence_bound | LOW | ALL | no (fly only) | deployable, but ground enemies path around it |
|
||||
| `a` / `A` | achand | HIGH | – | – | bench slot / non-bench hand tile |
|
||||
| `S` `E` `I` `O` | start / end / telin / telout | LOW | NONE | yes | |
|
||||
| `m` | mire | LOW | ALL | yes | +1 stack every 3 s: atk-speed −5, move −5 %; max 10; cleared on leaving |
|
||||
| `g` | smog | LOW | ALL | yes | an operator here cannot be targeted by enemy **ranged** attacks |
|
||||
| `d` | deepsea | LOW | ALL | yes | enemies take 40 dmg/s, atk-speed −60, move ×0.6 |
|
||||
| `i` | infection | LOW | ALL | yes | 70 true dmg/s to allies on it and enemies crossing it; +20 % ATK, +20 ASPD; 300 s |
|
||||
|
||||
### 2.4 Stage pool (`stageDatasDict`)
|
||||
|
||||
| stage | PRTS name | weight | modes | deploy tiles on normal board (ranged-only) | devices (`predefines.tokenInsts`) |
|
||||
|---|---|---|---|---|---|
|
||||
| act1autochess_m01 | 战场#01 | 50 | training, FUNNY, NORMAL | 22 (0) | 阻隔工事 ×12 (crate, HP 100; reroutes enemies; an enemy it blocks destroys it) |
|
||||
| act1autochess_m02 | 战场#02 | 50 | NORMAL/HARD/ABYSS | 21 (0) | 阻隔工事 ×16, 射击台 ×16 (hidden; lets high-ground ops sit on it) |
|
||||
| act1autochess_m03 | 战场#03 | 50 | NORMAL/HARD/ABYSS | 19 (0) | 射击台 ×16 (visible), 阻隔工事 ×8 |
|
||||
| act1autochess_m04 | 战场#04 活性源石 | 50 | NORMAL/HARD/ABYSS | 19 (0) | 阻隔工事 ×12; 8 `i` tiles |
|
||||
| act2autochess_m01 | 战场#05 源石流发生装置 | 50 | NORMAL/HARD/ABYSS | 16 (3) | 8 blowers (`trap_013_blower`) in rows 13/6, cols 5/9/13/17 (boss area 5/9/11/15), facing DOWN, 3 tiles. Operators facing the airflow direction get ATK +30 %, facing against it −30 %. Enemies moving with the flow get move +80 %, against it −50 %. |
|
||||
| act2autochess_m02 | 战场#06 沼泽控制 | 50 | NORMAL/HARD/ABYSS | 19 (3) | `trap_098_mire` controller; 阻隔工事 ×4 on the col-9 lane (forces the upper gate around) |
|
||||
| act2autochess_m03 | 战场#07 排气格栅 | 50 | NORMAL/HARD/ABYSS | 23 (0) | `g` smog tiles; 阻隔工事 ×10. The rune references `tile_reed` (ignite 15 s / 40 dmg) with no reed tiles present, so it is probably a leftover. |
|
||||
| act2autochess_m04 | 战场#08 涨潮控制 | 50 | NORMAL/HARD/ABYSS | 25 (0) | `trap_042_tidectrl`: deep water `d` on the lanes |
|
||||
| act1 m05 / m06 / m07 | season-1 #05–#07 | **0** | – | – | Disabled this season: deepsea+canoe, sandstorm+mounds, bushes. Kept in the JSON for reference. |
|
||||
|
||||
Always-present hidden controllers:
|
||||
- `trap_1112_acblzd` 盟约寒风 at (18,0): Kjerag bond, periodic cold on all enemies.
|
||||
- `trap_1104_aclasert` “双眼皮” turrets (HP 3000, ATK 900) on m01. They scale with the top bond's layers and are bond-activated. See the bond research.
|
||||
|
||||
`groundPathsHelper` in each stage holds the shortest 8-direction path (no corner cutting) for every gate→end pair. It also has a variant with crates treated as blocked. Use it for tests; the server should re-path live, because crates break.
|
||||
|
||||
Example (act2autochess_m01, top row first):
|
||||
```
|
||||
12 ####hrrr#fS#hrrr#fS## S(12,10)/(9,10) → E(9,2); snake path via (9,7)-(12,7)-(12,5)-(9,5)
|
||||
11 ####hr#r#f##hr#r#f###
|
||||
10 ####hr#r#f##hr#r#f###
|
||||
9 ##Errr#rrrSrrr#rrrS##
|
||||
8 ####AAAAA##I#########
|
||||
7 aaaaaaaaaa########### bench
|
||||
```
|
||||
|
||||
## 3. Waves
|
||||
|
||||
### 3.1 Round schedule (from `battleDataDict` + `turnInfoDataDict` + template `maxPlayTime`)
|
||||
|
||||
Template slot codes:
|
||||
- N = `enemy_1422_lrsldr`, E = `1427_lrnazg`, S = `1425_lrcmra` (ground)
|
||||
- NF = `1005_yokai`, EF = `1042_frostd`, SF = `1040_bombd` (fly)
|
||||
- T = `1000_gopro_2`, TF = `1041_lazerd` (token; used only in the escaped templates)
|
||||
|
||||
| R | template | battle s | rest s (multi) | 机变 (multi NORMAL) | composition | total |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 1 | act1autochess_01 | 45 | 65 | | N2 NF2 + literal 源石虫 ×2 | 6 |
|
||||
| 2 | 02 | 45 | 65 | | N6 NF9 | 15 |
|
||||
| 3 | 03 | 55 | 65 | Y | N10 E1 NF9 EF2 | 22 |
|
||||
| 4 | 04 | 55 | 95 | | N4 E1 S1 NF8 EF3 SF2 | 19 |
|
||||
| 5 | 05 | 55 | 95 | | N11 E2 S1 NF13 EF3 SF2 | 32 |
|
||||
| 6 | 06 | 70 | 100 | Y | N13 E2 S2 NF16 EF3 SF3 | 39 |
|
||||
| 7 | 07 | 85 | 105 | | N14 E4 S3 NF15 EF5 SF2 | 43 |
|
||||
| 8 | h01 | 85 | 105 | | N11 E3 S4 NF8 EF5 SF4 | 35 |
|
||||
| 9 | h02 | 95 | 125 | Y | N15 E3 S2 NF8 EF5 SF4 | 37 |
|
||||
| 10 | h03 | 95 | 125 | | N15 E4 S4 NF9 EF5 SF4 | 41 |
|
||||
| 11 | h04 | 115 | 125 | | N13 E4 S7 NF11 EF6 SF5 | 46 |
|
||||
| 12 | h05 | 115 | 125 | | N15 E9 S10 NF17 EF10 SF9 | 70 |
|
||||
| 13 | h06 | 115 | 150 | | N13 E12 S13 NF11 EF10 SF10 | 69 |
|
||||
| 14 | boss (h07_xx) | until the boss dies; −1 LP/s after 150 s | 195 | | boss + escorts | |
|
||||
| 15 | hidden core (h08_xx) | same | 195 (215 HARD/ABYSS) | | | |
|
||||
|
||||
Mode differences:
|
||||
- **FUNNY (标准)** has 9 rounds: 01–07, h01, then the boss in round 9.
|
||||
- **Single modes** have rest time 300. The 下半 update made it unlimited, with a 24 h reconnect window.
|
||||
- `specialPhaseTime` (机变阶段) is 150 s in single and 16 s in multi.
|
||||
- 机变 rounds (`isSpPrepare`) by mode:
|
||||
|
||||
| mode | 机变 rounds |
|
||||
|---|---|
|
||||
| multi NORMAL | 3, 6, 9 |
|
||||
| multi FUNNY | 3, 9 |
|
||||
| multi HARD/ABYSS | 3, 9, 11 |
|
||||
| single NORMAL | 6, 9 |
|
||||
| single HARD/ABYSS | 3, 9, 11 |
|
||||
| single FUNNY | none |
|
||||
| training | 3 |
|
||||
|
||||
- Training has 4 rounds (slime / ghost, then boss_7). Its rest time is 999 s.
|
||||
|
||||
Timing: every action in a template has `preDelay` (seconds from battle start) and `interval` between its `n` spawns. Enemy AI ends the battle when all enemies are dead, or when the battle time runs out (any enemies still alive then count as leaked).
|
||||
|
||||
### 3.2 Enemy factions & special enemies (特训敌人)
|
||||
|
||||
Official ingredients:
|
||||
- `constData`: `templateEnemy*` (8 placeholders), `specialEnemyNum` 3, `minReplacedEnemyCount` 1, `maxReplacedEnemyCount` 5, `enemyTypeIdentifierToFillRandom` 1 (= SPECIAL), `enemyMaxHpFactor` 1, `enemyAtkFactor` 5, `enemyDefFactor` 3, `enemyMagicResistanceFactor` 3.
|
||||
- `specialEnemyRandomTypeDict`: FLY/TIMES/ELEMENT/DOT/INVISIBLE/REFLECTION have count 3, weight 3. SPECIAL has count −1 (always available).
|
||||
- Type names (`enemyTypeDatas`):
|
||||
|
||||
| type | name | description |
|
||||
|---|---|---|
|
||||
| SPECIAL | 特异 | high damage and toughness |
|
||||
| FLY | 飞行 | many aerial units |
|
||||
| TIMES | 频次 | needs a number of hits to kill |
|
||||
| ELEMENT | 元素 | element damage |
|
||||
| DOT | 持续 | damage over time |
|
||||
| INVISIBLE | 隐匿 | stealth |
|
||||
| REFLECTION | 折射 | refraction |
|
||||
|
||||
- `specialEnemyInfoDict` has 67 entries. Each is a trio: special key, `attachedNormalEnemyKeys`, `attachedEliteEnemyKeys`, plus `randomWeight` (8–15) and `isInFirstHalf`.
|
||||
- `randomEnemyAttributeDict` has 324 entries: `enemyBattleEffectivenessFactor` (0.1–1.2), `isFlyEnemy`, and `extraEnemyKeyList` (summons).
|
||||
- `modeDataDict.inactiveEnemyKey` bans 18 strong keys in FUNNY/NORMAL.
|
||||
- wiki.gg: "Starting from Alliance there can be up to 3 enemy factions per Protocol, along with a boss chosen from a separate pool… enemies do not get strategies and only get generic stat buffs as rounds escalate."
|
||||
|
||||
**Recommended generation [ASSUMED reconstruction]** (also in `05-enemies.json → generation.recommendedAlgorithm`):
|
||||
1. **Match start:** pick 3 of the 6 typed factions (uniform). Training uses FLY, TIMES and ELEMENT.
|
||||
2. **Round r ≤ 7** uses entries with `firstHalf`=true. **Rounds 8–13** use `firstHalf`=false; these are the upgraded "_2" enemies.
|
||||
3. **Ground entry G:** a weighted pick among the chosen non-FLY factions plus SPECIAL, for the current half.
|
||||
4. **Fly entry F:** a weighted FLY pick, only if FLY was chosen. Otherwise the fly slots keep yokai / frostd / bombd.
|
||||
5. **Replace:** S → G.key, N → G.N, E → G.E. SF → F.key, NF → F.N, EF → F.E. Literal keys stay unchanged (round-1 slime, boss escorts).
|
||||
6. **Count:** each replaced template enemy becomes `k = clamp(round(be(template)/be(new)), 1, 5)` copies, where `be = (hp + 5·atk + 3·def + 3·res) / enemyBattleEffectivenessFactor`.
|
||||
- With this formula almost all second-half specials map 1 : 1.
|
||||
- Swarm enemies map up to 5 : 1: 炽焰/灼热源石虫, 萨科塔之翼, 步兵.
|
||||
- `k` is precomputed in `specialEntries.rows[].kS / N[][2] / E[][2]`.
|
||||
- Optionally cap the total spawn count per round at about 1.5 × the template count.
|
||||
7. **Stat scaling [ASSUMED]:** season effects `aceffect_enemy_1..5` exist (急行军 +15 % speed, 补给线 +8 % HP, 补给线II +20 % HP, 攻坚装备 +10 % ATK / +20 % HP, 攻坚装备II ×0.8 / ×0.8, 攻坚装备III ATK ×0.7 / HP ×0.75), but no data links them to modes or rounds. Proposed mapping:
|
||||
|
||||
| when | effect |
|
||||
|---|---|
|
||||
| FUNNY | III |
|
||||
| NORMAL | II |
|
||||
| HARD | ×1 |
|
||||
| ABYSS | 攻坚装备 + 急行军 |
|
||||
| rounds 8–10 | +补给线 |
|
||||
| rounds 11–13 | 补给线II |
|
||||
|
||||
“炎佑” (9012_acloon) and the 墨魂 minis (msf*) are excluded, following their `enemy_exclude` lists.
|
||||
8. **Bounties (机变阶段 悬赏决策):** there are 129 ENEMY_GAIN effects (`bountyEffects`). Each adds N copies of an enemy to the chooser's next 1 / 2 / all battles.
|
||||
- `kill_gain_coin`: the killer earns coin.
|
||||
- `selfbattle_win_gain_coin`: pays coin if the chooser's own combat phase is perfect.
|
||||
- 战术特训 enemies are at 70 % HP/ATK/DEF in single mode (PRTS patch note).
|
||||
|
||||
### 3.3 Unite phase (联防) template
|
||||
`level_act1autochess_escaped_multi` has 8 SPAWN slots (N, E, S, NF, EF, SF, T, TF; up to 5 each). Its routes start on the partner half at (9,18) / (12,18) and cross to (9,2). The single variant is `escaped_single`. For the remake, spawning the leaked enemies at the helper's own gates is acceptable.
|
||||
|
||||
## 4. LP (目标生命值) rules
|
||||
- **Start LP** is the band's `totalHp` (20–45; 歌利亚 training band = 45).
|
||||
- **Normal rounds:**
|
||||
- Unkilled enemies (reached the objective, or still alive at the time limit) cost LP. Official help: "根据未击倒敌人的数量…每回合最多扣除10点".
|
||||
- The cap is `costPlayerHpLimit` = 10.
|
||||
- **[ASSUMED]** Each counted enemy costs 1, excluding `notCountInTotal` units and boss parts. `lifePointReduce` is not used here, because several regular faction enemies (王庭军战士, 逐火战士, 萨科塔之翼 …) have `lpr` 0.
|
||||
- **Team mode:**
|
||||
- Leaks are held back. If at least one player leaked and at least one player cleared perfectly, a 联防 phase runs: up to 2 perfect players fight the union of all leaked enemies.
|
||||
- Survivors of the 联防 phase then cost their owners' LP (cap 10).
|
||||
- If nobody cleared perfectly, leaks cost LP immediately.
|
||||
- Bonds do not stack during 联防.
|
||||
- **Boss round:**
|
||||
- All LP merge into one pool with no cap.
|
||||
- After 150 s, every second costs 1 LP.
|
||||
- **[ASSUMED]** Each leaked enemy costs its `lpr`: most bosses 2, 盐风主教昆图斯 1, 卢西恩 30, typical enemies 1.
|
||||
- **Hidden core (round 15, NORMAL+):**
|
||||
- Single: activated bond layers > 300 and LP > 1.
|
||||
- Multi: total layers across all players > 1000 and LP sum > 1.
|
||||
|
||||
`lpr` distribution across the 326 exported enemies: 255 ×1, 42 ×0, 21 ×2, 5 ×5, 2 ×30, 1 ×3. Among act2-relevant enemies: 175 ×1, 27 ×0, 20 ×2.
|
||||
|
||||
## 5. Bosses (`bossInfoDict`: season weights / HP pool + global enemyId)
|
||||
|
||||
bloodPoint is the boss HP pool for each difficulty. Per the notices, it is **shared by all players/battlefields**. `boss_battle_multi_player` spawns a mirrored copy on the partner half that shares HP. **[ASSUMED]** Single mode uses the same value.
|
||||
|
||||
| id | enemy | name | w | bloodPoint FUNNY / NORMAL / HARD / ABYSS | DB hp / atk / def / res | lpr | key abilities (handbook) |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| boss_1 | 9013_acstmk | 假想敌:胄 | 6 | 247 500 / 675 000 / 1 800 000 / 3 600 000 | 600000/650/1000/25 | 2 | Random magic beam. 灭顶之灾: shell at the highest-ATK operator; 3×3 stun + physical DoT; the shell can be shot down. <20 % HP: damage taken ×0.5 and an extra shell. Every 50 s summons drones (yokai, `boss_summon_enemy`). |
|
||||
| boss_2 | 9017_achunt | 假想敌:铳 | 6 | 225 000 / 400 000 / 800 000 / 3 000 000 | 120000/750/1100/60 | 2 | Targets highest DEF. Erosion damage. Unblockable. ASPD ramps on the same target (+80, 5 stacks). 最终之罚: charge at the highest-DEF unit. Two copies in multi. |
|
||||
| boss_3 | 9021_acduml | 假想敌:管 | 6 | 285 000 / 708 750 / 2 000 000 / 4 000 000 | 85000/300/700/50 | 2 | Summons “余音” (9023_acdums) every 40 s (20 s below 50 % HP). 裂管之奏: triple hit on each 余音 (AoE magic + apoptosis). |
|
||||
| boss_4 | 1521_dslily | 盐风主教昆图斯 | 5 | 307 500 / 708 750 / 2 100 000 / 4 200 000 | 100000/380/500/50 | 1 | Hits the 2 highest-DEF targets. 大潮 (global magic + neural), 崩坍, 断裂生殖 (子代 `trap_039_dstnta` stun). 物种爆发 kills everything after a long time. |
|
||||
| boss_5 | 2016_csphtm | 卢西恩,“猩红血钻” | 10 | 200 000 / 390 000 / 780 000 / 3 000 000 | 80000/1500/600/40 | **30** | 40 % evade while unblocked. Blinks behind its blocker and leaves 不祥幻影 (2017_csphts). 40 % DEF penetration + neural. Two copies in multi. |
|
||||
| boss_6 | 9032_aclionk | 阿利斯泰尔,帝国余晖 | 5 | 285 000 / 705 000 / 1 990 000 / 3 980 000 | 81000/820/1030/20 | 2 | 王权号令 (plus-shaped strike, drops equipment 10028/29/30). 莫非王土 animates the equipment. ≤50 %: +DEF, RES 45, 2 equipment at once. Eventually kills everything. |
|
||||
| boss_7 | 9033_acdeer | “萨米的意志” | 5 | 277 500 / 787 500 / 2 000 000 / 4 000 000 | 240000/800/800/40 | 2 | 冰凌 (hits the whole column). 自然涌动 (stun + magic DoT). ≤50 %: damage taken ×0.4 and 2 targets. Training boss. |
|
||||
| boss_8 | 9013_acstmk_2 | 假想敌:胄 (隐秘核心) | 50 | 750 000 / 937 500 / 3 600 000 / 7 200 000 | 1200000/750/1200/30 | 2 | Adds 斩胄之剑 / 破胄之锤 (9014/9015; invulnerable until shot down). |
|
||||
| boss_9 | 9017_achunt_2 | 假想敌:铳 (隐秘核心) | 40 | 675 000 / 900 000 / 2 800 000 / 3 950 000 | 120000/750/1100/60 | 2 | Linked to 3 “碎铳之簧” (9018/19/20) that take damage for it. Damage taken ×0.2. |
|
||||
| boss_10 | 9021_acduml_2 | 假想敌:管 (隐秘核心) | 40 | 825 000 / 1 012 500 / 3 800 000 / 7 600 000 | 85000/300/700/50 | 2 | Comes with 假想敌:弦 (9022_acdumm). |
|
||||
|
||||
Boss escorts per level (template keys still get replaced) are in `05-maps.json roundLevels.*h07*/h08*`:
|
||||
- boss_1: 重装防御组长 ×14 (`1006_shield_2`)
|
||||
- boss_2: 愧悔魂灵圣杯 (`1430_lrrook`, 100k HP, 0 ATK)
|
||||
- boss_3: 堂皇 (`1209_sfden_2`)
|
||||
- boss_4: 复核洋流使者 (`1438_dspred`)
|
||||
- boss_5: 骇笑看客 (`2009_csaudc`) and 绯红歌伶 (`2010_csdcr`)
|
||||
- boss_6: “萨科塔昂首” (`10085_hllevi_2`)
|
||||
- boss_7: 冰爆源石虫 (`1067_snslime`) and 游击队盾卫 (`1081_sotisd`)
|
||||
- hidden cores: “帝国的甲胄” (`10027_vtsk`), 假想敌:淤困 (`9007_acelem`), 假想敌:再生 (`9010_acpupp`)
|
||||
|
||||
## 6. Enemy stat tables (raw level-0; full data incl. skills/talents in `05-enemies.json.enemies`)
|
||||
|
||||
Columns: rk N/E/B; spd is moveSpeed; bat is base attack time in seconds; range in tiles (−1 or 0 means melee or no attack); mv W = walk, F = fly.
|
||||
|
||||
Official autochess overrides already applied:
|
||||
- 灼藤 (10067_ftsjc): ATK 400
|
||||
- 元核孽生者 (1439_dslntf): ATK 400, talent `3.hp_ratio` 0.2
|
||||
|
||||
Both come from `level_autochess_enemy_data`.
|
||||
|
||||
### Template placeholders (constData)
|
||||
| key | name | rk | hp | atk | def | res | spd | bat | range | lpr | mv | dmg | slot / be |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| 1422_lrsldr | 萨卡兹枯朽前锋 | N | 4700 | 300 | 100 | 40 | 0.8 | 3 | -1 | 1 | W | PHYS/MAGI | Normal be=6620 |
|
||||
| 1427_lrnazg | “灵幛” | E | 15000 | 900 | 500 | 50 | 0.7 | 5 | 1.3 | 1 | W | PHYS | Elite be=21150 |
|
||||
| 1425_lrcmra | 孽罪奇美拉 | E | 20000 | 800 | 1000 | 50 | 0.6 | 5 | -1 | 1 | W | PHYS/MAGI | Special be=27150 |
|
||||
| 1005_yokai | 妖怪 | N | 800 | 0 | 50 | 0 | 0.9 | 2.3 | 0 | 1 | F | NO_D | NormalFly be=950 |
|
||||
| 1042_frostd | 寒霜 | E | 6500 | 100 | 600 | 30 | 0.9 | 1 | 2.5 | 1 | F | NO_D | EliteFly be=8890 |
|
||||
| 1040_bombd | 暴鸰 | E | 4000 | 800 | 150 | 30 | 0.6 | 5 | 2 | 1 | F | PHYS | SpecialFly be=8540 |
|
||||
| 1000_gopro_2 | 猎狗pro | N | 1700 | 260 | 0 | 20 | 1.9 | 1.4 | 0 | 1 | W | PHYS | Token be=3060 |
|
||||
| 1041_lazerd | 法术大师A1 | N | 2700 | 220 | 100 | 65 | 1.5 | 2.15 | 1.8 | 1 | F | MAGI | TokenFly be=4772 |
|
||||
|
||||
### Special (特训) entries: S-slot enemy, with attached N / E (k = copies per replaced template enemy)
|
||||
| key | name | rk | hp | atk | def | res | spd | bat | range | lpr | mv | dmg | type,half,w · kS · N(k) · E(k) |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| 1041_lazerd | 法术大师A1 | N | 2700 | 220 | 100 | 65 | 1.5 | 2.15 | 1.8 | 1 | F | MAGI | FLY,1st,w10 · k2 · “萨科塔之翼”×1 · 妖怪MKII×2 |
|
||||
| 1355_mrfly | 护障 | N | 6000 | 0 | 80 | 40 | 1.2 | 2 | 2.5 | 1 | F | NO_D | FLY,1st,w10 · k1 · 妖怪×1 · 妖怪MKII×2 |
|
||||
| 1017_defdrn | 御4 | N | 4000 | 0 | 150 | 20 | 0.8 | 2 | 2.5 | 1 | F | NO_D | FLY,1st,w10 · k2 · 妖怪×1 · 妖怪MKII×2 |
|
||||
| 10084_hlegle | “萨科塔之眼” | N | 5500 | 1000 | 150 | 30 | 0.7 | 3 | 1.3 | 0 | F | PHYS | FLY,1st,w10 · k1 · “萨科塔之翼”×1 · 妖怪MKII×2 |
|
||||
| 1407_hummbd | 远眺 | N | 4500 | 250 | 120 | 20 | 0.7 | 3 | 2 | 1 | F | PHYS | FLY,1st,w10 · k1 · 妖怪×1 · 妖怪MKII×2 |
|
||||
| 1005_yokai_3 | 威龙 | E | 30000 | 660 | 170 | 0 | 0.5 | 3.8 | 2 | 1 | F | PHYS | FLY,2nd,w10 · k1 · 妖怪×1 · 妖怪MKII×2 |
|
||||
| 1112_emppnt | 帝国炮火先兆者 | E | 13000 | 1000 | 800 | 50 | 0.5 | 5 | 2 | 1 | F | PHYS | FLY,2nd,w10 · k1 · 妖怪×1 · 妖怪MKII×2 · banned FUNNY+NORMAL |
|
||||
| 1041_lazerd_2 | 法术大师A2 | E | 6000 | 600 | 140 | 65 | 0.8 | 3.5 | 3 | 1 | F | MAGI | FLY,2nd,w10 · k1 · 妖怪MKII×1 · 寒霜×1 |
|
||||
| 9009_acfort | 假想敌:黑云 | E | 24000 | 500 | 150 | 20 | 0.5 | 3 | 2.5 | 1 | F | PHYS | FLY,2nd,w10 · k1 · 妖怪MKII×1 · 威龙×1 |
|
||||
| 1195_sfyin_2 | 明鉴 | N | 3100 | 390 | 0 | 20 | 1.5 | 1.5 | 0 | 1 | W | PHYS | TIMES,1st,w10 · k2 · 磨砻×1 · 俗心×1 |
|
||||
| 1288_duskls_2 | 深池逐火精锐战士 | N | 6000 | 180 | 100 | 50 | 0.7 | 2 | 0 | 0 | W | MAGI | TIMES,1st,w10 · k3 · 深池逐火战士×1 · 深池逐火战士×2 |
|
||||
| 1197_sfshu | 俗心 | N | 2500 | 320 | 60 | 0 | 1.4 | 1.4 | 0 | 1 | W | PHYS | TIMES,1st,w10 · k2 · 磨砻×1 · 俗心×1 |
|
||||
| 1292_duskld | 深池逐火护卫 | E | 10000 | 350 | 550 | 60 | 0.5 | 3.5 | 0 | 0 | W | MAGI | TIMES,2nd,w10 · k1 · 深池逐火战士×1 · 深池逐火精锐战士×2 |
|
||||
| 1207_sfji | 沉沙 | E | 11000 | 1100 | 600 | 30 | 1.3 | 2.2 | 0 | 1 | W | PHYS | TIMES,2nd,w10 · k1 · 磨砻×1 · 俗心×1 · banned FUNNY+NORMAL |
|
||||
| 1199_sfjin | 身观 | E | 6500 | 700 | 750 | 0 | 0.8 | 4 | 0 | 1 | W | PHYS | TIMES,2nd,w10 · k1 · 磨砻×1 · 俗心×1 |
|
||||
| 9010_acpupp | 假想敌:再生 | E | 12000 | 1100 | 300 | 40 | 0.5 | 5 | -1 | 1 | W | PHYS | TIMES,2nd,w10 · k1 · 俗心×1 · 雅气×1 |
|
||||
| 1161_tidmag | 控潮术师 | N | 6000 | 200 | 200 | 60 | 0.7 | 2.5 | 2.2 | 1 | W | MAGI | ELEMENT,1st,w10 · k1 · 潜水员×1 · 码头水手×1 |
|
||||
| 1305_mhslim_2 | 炽焰源石虫 | N | 1800 | 80 | 0 | 0 | 0.8 | 2 | 1.8 | 1 | W | MAGI | ELEMENT,1st,w10 · k5 · 灼热源石虫×5 · 炽焰源石虫×5 |
|
||||
| 2025_syufo | 掠海漂移体 | E | 20000 | 500 | 250 | 40 | 0.6 | 4 | 2.6 | 1 | W | PHYS | ELEMENT,2nd,w10 · k1 · 骨海漂流体×1 · 骨海漂流体×4 |
|
||||
| 1161_tidmag_2 | 领潮员 | N | 8000 | 260 | 220 | 60 | 0.7 | 2.5 | 2.2 | 1 | W | MAGI | ELEMENT,2nd,w10 · k1 · 潜水员×1 · 码头水手长×1 |
|
||||
| 1439_dslntf | 元核孽生者 | E | 30000 | 400 | 0 | 70 | 0.25 | 3 | 0 | 1 | W | PHYS | ELEMENT,2nd,w10 · k1 · 底海滑动者×1 · 富营养的滑动者×4 |
|
||||
| 1275_dwlock_2 | 萨卡兹王庭军精锐术师 | E | 14000 | 500 | 250 | 50 | 0.8 | 4 | 2.5 | 1 | W | MAGI | ELEMENT,2nd,w10 · k1 · 萨卡兹王庭军战士×1 · 萨卡兹王庭军精锐战士×2 · banned FUNNY+NORMAL |
|
||||
| 9007_acelem | 假想敌:淤困 | E | 36000 | 600 | 200 | 40 | 0.5 | 1 | -1 | 1 | W | MAGI | ELEMENT,2nd,w10 · k1 · 萨卡兹王庭军战士×1 · 萨卡兹王庭军精锐战士×2 |
|
||||
| 1234_dsubrl | 深溟巢涌者 | E | 10000 | 140 | 550 | 60 | 0.8 | 1 | 1.6 | 1 | W | MAGI | DOT,1st,w10 · k1 · 单核掠食者×1 · 异光体掠食者×2 |
|
||||
| 1272_nhtank | 萨卡兹枯朽战车 | E | 12000 | 750 | 750 | 10 | 0.7 | 4.5 | 2.2 | 1 | W | PHYS | DOT,1st,w10 · k1 · 萨卡兹枯朽战士×1 · 萨卡兹枯朽战士组长×3 |
|
||||
| 1270_nhstlk | 逐腐兽 | E | 12000 | 550 | 150 | 20 | 1.4 | 1.8 | 0 | 1 | W | PHYS/MAGI | DOT,1st,w10 · k2 · 萨卡兹枯朽战士×1 · 萨卡兹枯朽战士组长×3 |
|
||||
| 1234_dsubrl_2 | 富营养的巢涌者 | E | 14000 | 160 | 550 | 60 | 0.8 | 1 | 1.6 | 1 | W | MAGI | DOT,2nd,w10 · k1 · 异光体掠食者×1 · 异光体掠食者×2 · banned FUNNY+NORMAL |
|
||||
| 10122_uacann_2 | 集团军重型火炮 | N | 10000 | 500 | 350 | 0 | 0.8 | 5 | 10 | 1 | W | PHYS | DOT,2nd,w10 · k1 · 萨卡兹枯朽战士组长×1 · 萨卡兹枯朽战士组长×3 · banned FUNNY+NORMAL |
|
||||
| 1272_nhtank_2 | 尖端萨卡兹枯朽战车 | E | 15000 | 850 | 750 | 10 | 0.7 | 4.5 | 2.2 | 1 | W | PHYS | DOT,2nd,w10 · k1 · 萨卡兹枯朽战士组长×1 · 疯狂的逐腐兽×1 · banned FUNNY+NORMAL |
|
||||
| 9006_actoxi | 假想敌:蚀裂 | E | 15000 | 400 | 400 | 10 | 0.6 | 1.5 | -1 | 1 | W | MAGI | DOT,2nd,w15 · k1 · 萨卡兹枯朽战士组长×1 · 疯狂的逐腐兽×1 |
|
||||
| 1299_ymkilr | 山海众头目 | E | 8500 | 800 | 250 | 20 | 1.1 | 2.5 | 1.2 | 1 | W | PHYS | INVISIBLE,1st,w10 · k1 · 宿主士兵×2 · 隐形弩手×3 |
|
||||
| 10034_cnvsax | 节日爵士乐手 | E | 10000 | 650 | 300 | 10 | 0.7 | 1 | 2.5 | 1 | W | PHYS/MAGI | INVISIBLE,1st,w10 · k2 · 宿主士兵×2 · 隐形弩手×3 |
|
||||
| 10042_prtrop_2 | 扶桥老手 | N | 8000 | 720 | 300 | 30 | 0.65 | 2 | -1 | 1 | W | PHYS | INVISIBLE,1st,w10 · k2 · 寻险水手×1 · 架桥船工×2 |
|
||||
| 1389_winbab_2 | 访问团强攻冠军 | N | 7000 | 650 | 400 | 10 | 0.6 | 3 | 3.5 | 1 | W | PHYS | INVISIBLE,2nd,w10 · k1 · 访问团新兵×1 · 隐形弩手组长×2 |
|
||||
| 1299_ymkilr_2 | 山海众秘使 | E | 11000 | 1000 | 300 | 20 | 1.1 | 2.5 | 1.2 | 1 | W | PHYS | INVISIBLE,2nd,w10 · k1 · 萨卡兹枯朽辟路前锋×1 · 隐形弩手组长×2 |
|
||||
| 1404_msnip | 重弩突袭者 | N | 6000 | 400 | 180 | 60 | 0.7 | 3.5 | -1 | 1 | W | MAGI | INVISIBLE,2nd,w10 · k1 · 潜伏者×2 · 隐形弩手组长×2 |
|
||||
| 9008_acbunn | 假想敌:骨刺 | E | 12000 | 360 | 300 | 60 | 0.5 | 4 | 2 | 1 | W | MAGI | INVISIBLE,2nd,w10 · k1 · 业余竞演者×1 · 隐形弩手组长×2 · banned FUNNY+NORMAL |
|
||||
| 1174_duholy | 深池伙友卫队 | E | 15000 | 900 | 900 | 0 | 0.8 | 4 | 1.4 | 1 | W | PHYS | REFLECTION,1st,w10 · k1 · 深池侦察兵×1 · 深池重甲卫士×1 |
|
||||
| 1168_dumage | 深池暗影术师 | N | 4500 | 300 | 150 | 20 | 1.1 | 3 | 2.5 | 1 | W | MAGI | REFLECTION,1st,w10 · k4 · 深池侦察犬×1 · 深池方阵战士×3 |
|
||||
| 1170_dushld | 深池重甲卫士 | E | 7000 | 700 | 750 | 0 | 0.7 | 4 | 0 | 1 | W | PHYS | REFLECTION,1st,w10 · k2 · 深池侦察兵×1 · 深池方阵战士×3 |
|
||||
| 1174_duholy_2 | 深池伙友卫队精英 | E | 20000 | 1100 | 1000 | 0 | 0.8 | 4 | 1.4 | 1 | W | PHYS | REFLECTION,2nd,w10 · k1 · 深池侦察队长×1 · 深池重甲卫士队长×1 · banned FUNNY+NORMAL |
|
||||
| 1170_dushld_2 | 深池重甲卫士队长 | E | 9000 | 900 | 1100 | 0 | 0.7 | 4 | 0 | 1 | W | PHYS | REFLECTION,2nd,w10 · k1 · 深池侦察队长×1 · 深池方阵指挥官×2 |
|
||||
| 1172_dugago | 守墓石像 | E | 10000 | 550 | 550 | 0 | 0.5 | 4 | 1.6 | 1 | W | PHYS/MAGI | REFLECTION,2nd,w10 · k1 · 深池侦察队长×1 · 深池方阵指挥官×2 |
|
||||
| 9011_acrefr | 假想敌:镜膜 | E | 18000 | 1000 | 600 | 0 | 0.5 | 5.5 | -1 | 1 | W | PHYS | REFLECTION,2nd,w10 · k1 · 深池侦察队长×1 · 深池重甲卫士队长×1 |
|
||||
| 1010_demon_2 | 萨卡兹大剑组长 | E | 15000 | 750 | 250 | 50 | 0.85 | 2 | 0 | 1 | W | PHYS | SPECIAL,1st,w10 · k1 · 萨卡兹刀兵×1 · 萨卡兹大剑手×2 |
|
||||
| 1045_hammer | 粉碎攻坚手 | E | 10000 | 1000 | 1000 | 0 | 0.5 | 3.5 | 2.5 | 1 | W | PHYS | SPECIAL,1st,w10 · k1 · 宿主士兵×2 · 步兵×5 |
|
||||
| 1118_lidbox_2 | 拳师囚犯 | E | 9500 | 400 | 400 | 0 | 1.6 | 1 | 0 | 1 | W | PHYS | SPECIAL,1st,w10 · k2 · 普通囚犯×1 · 老练囚犯×2 |
|
||||
| 1325_cbgpro_2 | 高级军用猎狗 | N | 4600 | 360 | 0 | 30 | 1.7 | 1.5 | 0 | 1 | W | PHYS | SPECIAL,1st,w10 · k3 · 猎狗pro×2 · 军用猎狗×3 |
|
||||
| 1121_lifbos | 重犯 | E | 20000 | 800 | 400 | 0 | 0.8 | 3 | 0 | 1 | W | PHYS | SPECIAL,1st,w10 · k1 · 普通囚犯×1 · 老练囚犯×2 |
|
||||
| 1006_shield_3 | 重装五十夫长 | E | 40000 | 1000 | 1200 | 0 | 0.75 | 2.6 | 0 | 1 | W | PHYS | SPECIAL,2nd,w10 · k1 · 宿主士兵×2 · 重装侦察兵×1 |
|
||||
| 1329_cbshld | 弧光镜卫 | N | 10000 | 700 | 3300 | 60 | 0.75 | 3 | 0 | 1 | W | PHYS | SPECIAL,2nd,w10 · k1 · Dor-1号失败品×1 · 莱茵生命防卫科高级成员×2 |
|
||||
| 1045_hammer_2 | 粉碎攻坚组长 | E | 20000 | 1500 | 2000 | 0 | 0.5 | 3.5 | 2.5 | 1 | W | PHYS | SPECIAL,2nd,w10 · k1 · 宿主重装士兵×1 · 宿主重装士兵×1 |
|
||||
| 1387_winshd | 访问团持盾者 | E | 12000 | 500 | 1200 | 20 | 0.5 | 3 | 0 | 1 | W | PHYS | SPECIAL,2nd,w10 · k1 · 访问团新兵×1 · 访问团老兵×1 |
|
||||
| 1121_lifbos_2 | 传奇重犯 | E | 25000 | 1000 | 500 | 0 | 0.8 | 3 | 0 | 1 | W | PHYS | SPECIAL,2nd,w10 · k1 · 老练囚犯×1 · 强壮囚犯×1 |
|
||||
| 1320_wdrrl_2 | 萨卡兹悖谬暴虐兵长 | E | 25000 | 1200 | 800 | 20 | 0.8 | 2.9 | 0 | 1 | W | PHYS | SPECIAL,2nd,w10 · k1 · 萨卡兹枯朽辟路前锋×1 · 萨卡兹大剑手×2 |
|
||||
| 10124_uashld_2 | 集团军中坚盾卫 | E | 25000 | 950 | 1800 | 60 | 0.7 | 3.8 | 1 | 1 | W | PHYS | SPECIAL,2nd,w10 · k1 · 宿主士兵×2 · 宿主重装士兵×1 |
|
||||
| 1328_cbjedi | 弧光锋卫 | E | 10000 | 700 | 550 | 50 | 0.75 | 3 | 0 | 1 | W | MAGI | SPECIAL,1st,w10 · k1 · Dor-1号失败品×1 · 莱茵生命防卫科高级成员×2 |
|
||||
| 1355_mrfly_2 | 护障·P | N | 10000 | 0 | 80 | 50 | 1.2 | 2 | 2.5 | 1 | F | NO_D | FLY,1st,w8 · k1 · 妖怪×1 · 御4×2 · banned FUNNY+NORMAL |
|
||||
| 1197_sfshu_2 | 雅气 | N | 3350 | 410 | 70 | 0 | 1.4 | 2 | 0 | 1 | W | PHYS | TIMES,1st,w8 · k1 · 磨砻×1 · 雅气×1 · banned FUNNY+NORMAL |
|
||||
| 10067_ftsjc | 灼藤 | E | 13000 | 400 | 250 | 65 | 0.85 | 3.5 | -1 | 1 | W | MAGI | ELEMENT,2nd,w8 · k1 · 卷心籽×1 · 灼藤×1 · banned FUNNY+NORMAL |
|
||||
| 1270_nhstlk_2 | 疯狂的逐腐兽 | E | 16000 | 700 | 200 | 20 | 1.4 | 1.8 | 0 | 1 | W | PHYS/MAGI | DOT,2nd,w8 · k1 · 萨卡兹枯朽战士×1 · 萨卡兹枯朽战士组长×3 · banned FUNNY+NORMAL |
|
||||
| 1283_sgkill | 家族灭迹人 | E | 12000 | 800 | 800 | 45 | 0.9 | 3 | 1.8 | 1 | W | PHYS | INVISIBLE,2nd,w8 · k1 · 业余竞演者×1 · 隐形弩手组长×2 · banned FUNNY+NORMAL |
|
||||
| 1175_dushdo_2 | 深池伙友影刃精英 | E | 15000 | 580 | 550 | 0 | 0.8 | 2.1 | 1.4 | 1 | W | MAGI | REFLECTION,2nd,w8 · k1 · 深池侦察犬×1 · 深池伙友卫队精英×1 · banned FUNNY+NORMAL |
|
||||
| 1254_lypa_2 | 测试用动力装甲 | E | 10000 | 850 | 800 | 20 | 1.2 | 1.3 | 0 | 1 | W | PHYS | SPECIAL,2nd,w10 · k2 · Dor-1号失败品×1 · 莱茵生命防卫科高级成员×2 · banned FUNNY+NORMAL |
|
||||
| 1425_lrcmra_2 | 渎罪奇美拉 | E | 25000 | 1200 | 1200 | 50 | 0.6 | 5 | -1 | 1 | W | PHYS/MAGI | SPECIAL,2nd,w10 · k1 · 萨卡兹枯朽辟路前锋×1 · 萨卡兹大剑手×2 · banned FUNNY+NORMAL |
|
||||
| 1329_cbshld_2 | 弧光镜卫长 | N | 13000 | 900 | 3500 | 60 | 0.75 | 3 | 0 | 1 | W | PHYS | SPECIAL,2nd,w10 · k1 · Dor-α号失败品×1 · Dor-β号复制体×2 · banned FUNNY+NORMAL |
|
||||
| 1072_dlancer | 萨卡兹穿刺手 | E | 6000 | 450 | 150 | 40 | 0.25 | 4 | 0 | 1 | W | PHYS | SPECIAL,2nd,w10 · k3 · 萨卡兹刀兵×1 · 萨卡兹大剑组长×1 · banned FUNNY+NORMAL |
|
||||
|
||||
### Attached normal/elite enemies (N/E slots)
|
||||
| key | name | rk | hp | atk | def | res | spd | bat | range | lpr | mv | dmg | abilities |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| 10083_hlbird | “萨科塔之翼” | N | 1500 | 0 | 0 | 30 | 0.9 | 1 | -1 | 0 | F | NO_D | 飞行单位; 生命值首次降至一半以下时,在数秒内陷入恐惧 |
|
||||
| 1005_yokai_2 | 妖怪MKII | N | 1550 | 220 | 50 | 0 | 0.9 | 3 | 2 | 1 | F | PHYS | 飞行单位 |
|
||||
| 1005_yokai | 妖怪 | N | 800 | 0 | 50 | 0 | 0.9 | 2.3 | 0 | 1 | F | NO_D | 飞行单位 |
|
||||
| 1042_frostd | 寒霜 | E | 6500 | 100 | 600 | 30 | 0.9 | 1 | 2.5 | 1 | F | NO_D | 飞行单位; 周围的我方单位的攻击速度大幅度降低 |
|
||||
| 1005_yokai_3 | 威龙 | E | 30000 | 660 | 170 | 0 | 0.5 | 3.8 | 2 | 1 | F | PHYS | 飞行单位 |
|
||||
| 1195_sfyin | 磨砻 | N | 2000 | 310 | 0 | 20 | 1.5 | 1.5 | 0 | 1 | W | PHYS | 被击倒后生成2个<木制瑞印> |
|
||||
| 1197_sfshu | 俗心 | N | 2500 | 320 | 60 | 0 | 1.4 | 1.4 | 0 | 1 | W | PHYS | 被击倒后生成3个<小说卷轴> |
|
||||
| 1288_duskls | 深池逐火战士 | N | 5000 | 150 | 50 | 50 | 0.7 | 2 | 0 | 0 | W | MAGI | 位于燃烧的芦苇丛附近时攻击额外造成灼燃损伤; 被击倒时暂时变为隐匿、需要5次伤害击倒的<怨恨的余烬>,一段时间后重生 |
|
||||
| 1288_duskls_2 | 深池逐火精锐战士 | N | 6000 | 180 | 100 | 50 | 0.7 | 2 | 0 | 0 | W | MAGI | 位于燃烧的芦苇丛附近时攻击额外造成灼燃损伤; 被击倒时暂时变为隐匿、需要5次伤害击倒的<暴怒的余烬>,一段时间后重生 |
|
||||
| 1197_sfshu_2 | 雅气 | N | 3350 | 410 | 70 | 0 | 1.4 | 2 | 0 | 1 | W | PHYS | 被击倒后生成3个<诗画卷轴> |
|
||||
| 1158_divman | 潜水员 | N | 3300 | 240 | 150 | 20 | 0.9 | 2.7 | 1.9 | 1 | W | PHYS | 免疫水蚀,在水中攻击力提升并获得隐匿 |
|
||||
| 1160_hvyslr | 码头水手 | E | 10000 | 800 | 800 | 20 | 0.7 | 3.5 | 0 | 1 | W | PHYS | 能在数次攻击后晕眩我方单位; “水蚀”状态下快速损失生命 |
|
||||
| 1305_mhslim | 灼热源石虫 | N | 1200 | 50 | 0 | 0 | 0.8 | 2 | 1.8 | 1 | W | MAGI | 攻击造成灼燃损伤 |
|
||||
| 1305_mhslim_2 | 炽焰源石虫 | N | 1800 | 80 | 0 | 0 | 0.8 | 2 | 1.8 | 1 | W | MAGI | 攻击造成灼燃损伤 |
|
||||
| 2021_syfish | 骨海漂流体 | N | 4000 | 250 | 150 | 10 | 1.2 | 2 | 0 | 1 | W | PHYS | 攻击额外造成侵蚀损伤 |
|
||||
| 1160_hvyslr_2 | 码头水手长 | E | 14000 | 1000 | 1000 | 20 | 0.7 | 3.5 | 0 | 1 | W | PHYS | 能在数次攻击后晕眩我方单位; “水蚀”状态下快速损失生命 |
|
||||
| 1148_dssbr | 底海滑动者 | N | 2800 | 280 | 130 | 10 | 1.1 | 2 | 0 | 1 | W | PHYS | 攻击额外造成神经损伤 |
|
||||
| 1148_dssbr_2 | 富营养的滑动者 | N | 3600 | 360 | 150 | 10 | 1.1 | 2 | 0 | 1 | W | PHYS | 攻击额外造成神经损伤 |
|
||||
| 1229_darmy | 萨卡兹王庭军战士 | N | 4200 | 240 | 220 | 40 | 0.9 | 2.5 | -1 | 0 | W | MAGI | 攻击造成凋亡损伤 |
|
||||
| 1229_darmy_2 | 萨卡兹王庭军精锐战士 | N | 5500 | 380 | 280 | 40 | 0.9 | 2.5 | -1 | 0 | W | MAGI | 攻击造成凋亡损伤 |
|
||||
| 1433_dsbasi | 单核掠食者 | N | 4300 | 280 | 0 | 10 | 1.6 | 1.1 | -1 | 1 | W | PHYS | |
|
||||
| 1433_dsbasi_2 | 异光体掠食者 | N | 5700 | 350 | 0 | 10 | 1.6 | 1.1 | -1 | 1 | W | PHYS | |
|
||||
| 1267_nhpbr | 萨卡兹枯朽战士 | N | 4500 | 380 | 100 | 20 | 0.8 | 2.5 | 0 | 1 | W | PHYS | 被击倒时释放污染秽蚀,使周围我方持续损失生命 |
|
||||
| 1267_nhpbr_2 | 萨卡兹枯朽战士组长 | N | 5500 | 450 | 100 | 20 | 0.8 | 2.5 | 0 | 1 | W | PHYS | 被击倒时释放污染秽蚀,使周围我方持续损失生命 |
|
||||
| 1270_nhstlk_2 | 疯狂的逐腐兽 | E | 16000 | 700 | 200 | 20 | 1.4 | 1.8 | 0 | 1 | W | PHYS/MAGI | 攻击使目标在一段时间内持续受到法术伤害,目标接受治疗时解除此效果 |
|
||||
| 1043_zomsbr | 宿主士兵 | N | 2500 | 250 | 100 | 30 | 0.9 | 1.8 | 2.5 | 1 | W | PHYS | 能够自然回复生命 |
|
||||
| 1019_jshoot | 隐形弩手 | N | 1800 | 260 | 100 | 20 | 0.9 | 2.7 | 2.2 | 1 | W | PHYS | 隐匿 |
|
||||
| 10043_sailor | 寻险水手 | N | 5500 | 350 | 50 | 10 | 0.9 | 2 | -1 | 1 | W | PHYS | 经过悬索桥或被<盐坨子炮>传送时,移动速度短暂提升 |
|
||||
| 10042_prtrop | 架桥船工 | N | 6000 | 600 | 150 | 30 | 0.65 | 2 | -1 | 1 | W | PHYS | 隐匿; 可以架设可通行的悬索桥 |
|
||||
| 1381_winman | 访问团新兵 | N | 5800 | 300 | 100 | 0 | 0.9 | 1.7 | 0 | 1 | W | PHYS | |
|
||||
| 1019_jshoot_2 | 隐形弩手组长 | N | 2700 | 310 | 130 | 20 | 0.9 | 2.7 | 2.2 | 1 | W | PHYS | 隐匿 |
|
||||
| 1422_lrsldr_2 | 萨卡兹枯朽辟路前锋 | N | 5500 | 350 | 100 | 40 | 0.8 | 3 | -1 | 1 | W | PHYS/MAGI | 位于源石污染区内时,攻击造成法术伤害 |
|
||||
| 1009_lurker | 潜伏者 | N | 2200 | 300 | 90 | 20 | 1 | 2 | 0 | 1 | W | PHYS | 隐匿 |
|
||||
| 10031_cnvsld | 业余竞演者 | N | 4000 | 300 | 100 | 0 | 1.5 | 2 | -1 | 1 | W | PHYS | 隐匿; 狂欢时刻失去隐匿 |
|
||||
| 1166_dusbr | 深池侦察兵 | N | 3000 | 280 | 110 | 0 | 1 | 2 | 0 | 1 | W | PHYS | 折射 |
|
||||
| 1170_dushld | 深池重甲卫士 | E | 7000 | 700 | 750 | 0 | 0.7 | 4 | 0 | 1 | W | PHYS | 折射 |
|
||||
| 1165_duhond | 深池侦察犬 | N | 2800 | 300 | 0 | 0 | 1.7 | 1.4 | 0 | 1 | W | PHYS | 折射 |
|
||||
| 1169_duphlx | 深池方阵战士 | N | 4000 | 300 | 300 | 0 | 1 | 2.5 | 1.5 | 1 | W | PHYS | 其他方阵战士位于附近时,防御力提升(可叠加); 折射 |
|
||||
| 1166_dusbr_2 | 深池侦察队长 | N | 4400 | 380 | 180 | 0 | 1 | 2 | 0 | 1 | W | PHYS | 折射 |
|
||||
| 1170_dushld_2 | 深池重甲卫士队长 | E | 9000 | 900 | 1100 | 0 | 0.7 | 4 | 0 | 1 | W | PHYS | 折射 |
|
||||
| 1169_duphlx_2 | 深池方阵指挥官 | N | 6000 | 450 | 400 | 0 | 1 | 2.5 | 1.5 | 1 | W | PHYS | 其他方阵指挥官位于附近时,防御力提升(可叠加); 折射 |
|
||||
| 1071_dftman | 萨卡兹刀兵 | N | 2800 | 300 | 70 | 50 | 1 | 2.5 | 0 | 1 | W | PHYS | |
|
||||
| 1010_demon | 萨卡兹大剑手 | E | 7500 | 600 | 230 | 50 | 0.85 | 2 | 0 | 1 | W | PHYS | |
|
||||
| 1046_agent | 步兵 | N | 2500 | 280 | 85 | 40 | 1.1 | 2 | 0 | 1 | W | PHYS | |
|
||||
| 1116_liprr | 普通囚犯 | N | 5500 | 280 | 60 | 0 | 1.1 | 2 | 0 | 1 | W | PHYS | 初始为禁锢状态,禁锢状态下攻击速度降低; 攻击数次后解放,解放后攻击力提升 |
|
||||
| 1116_liprr_2 | 老练囚犯 | N | 7500 | 380 | 60 | 0 | 1.1 | 2 | 0 | 1 | W | PHYS | 初始为禁锢状态,禁锢状态下攻击速度降低; 攻击数次后解放,解放后攻击力提升 |
|
||||
| 1000_gopro_2 | 猎狗pro | N | 1700 | 260 | 0 | 20 | 1.9 | 1.4 | 0 | 1 | W | PHYS | |
|
||||
| 1325_cbgpro | 军用猎狗 | N | 3800 | 290 | 0 | 30 | 1.7 | 1.5 | 0 | 1 | W | PHYS | |
|
||||
| 1402_tgshd_2 | 重装侦察兵 | E | 13000 | 700 | 1500 | 0 | 0.7 | 3 | -1 | 1 | W | PHYS | 被攻击时使攻击者暴露5秒; 暴露状态下的我方无法通过封阻物避开敌方视线,且受到的伤害提升 |
|
||||
| 1251_lysyta | Dor-1号失败品 | N | 2750 | 310 | 0 | 50 | 1.5 | 1.8 | 0 | 1 | W | PHYS | 接触未激活的<R系列动力装甲>时,为其回复一定技力 |
|
||||
| 1249_lysdb_2 | 莱茵生命防卫科高级成员 | N | 6000 | 485 | 300 | 0 | 1 | 2.8 | 0 | 1 | W | PHYS | 可以抵挡一次物理或法术伤害 |
|
||||
| 1061_zomshd | 宿主重装士兵 | E | 10000 | 600 | 800 | 0 | 0.75 | 2.6 | 0 | 1 | W | PHYS | 能够自然回复生命 |
|
||||
| 1381_winman_2 | 访问团老兵 | N | 7800 | 400 | 200 | 0 | 0.9 | 1.7 | 0 | 1 | W | PHYS | |
|
||||
| 1119_vofsd | 强壮囚犯 | E | 11000 | 600 | 700 | 0 | 0.8 | 3.3 | 0 | 1 | W | PHYS | 初始为禁锢状态,禁锢状态下攻击速度降低; 攻击数次后解放,解放后攻击力提升、法术抗性提升且能够自然回复生命 |
|
||||
| 1017_defdrn | 御4 | N | 4000 | 0 | 150 | 20 | 0.8 | 2 | 2.5 | 1 | F | NO_D | 飞行单位; 为周围敌军持续提供防御力加成 |
|
||||
| 10065_ftzlc | 卷心籽 | N | 3800 | 240 | 0 | 5 | 1 | 1.7 | -1 | 1 | W | PHYS | 可以被<灼藤>或<灼芯>点燃; 点燃状态下死亡后对周围造成大量法术伤害 |
|
||||
| 10067_ftsjc | 灼藤 | E | 13000 | 400 | 250 | 65 | 0.85 | 3.5 | -1 | 1 | W | MAGI | 攻击额外造成灼燃损伤; 首次攻击前,攻击力不断提升且首次攻击对目标和周围造成法术伤害和灼燃损伤 |
|
||||
| 1174_duholy_2 | 深池伙友卫队精英 | E | 20000 | 1100 | 1000 | 0 | 0.8 | 4 | 1.4 | 1 | W | PHYS | 容易受到我方单位攻击; <深池伙友影刃精英>位于附近时,激活力场使周围我方攻击速度下降; 折射 |
|
||||
| 1251_lysyta_2 | Dor-α号失败品 | N | 3200 | 360 | 50 | 50 | 1.5 | 1.8 | 0 | 1 | W | PHYS | 接触未激活的<R系列动力装甲>时,为其回复一定技力 |
|
||||
| 1252_lysytb_2 | Dor-β号复制体 | N | 9000 | 420 | 50 | 50 | 0.9 | 3.2 | 2.2 | 1 | W | PHYS | 接触未激活的<R系列动力装甲>时,为其回复一定技力 |
|
||||
| 1010_demon_2 | 萨卡兹大剑组长 | E | 15000 | 750 | 250 | 50 | 0.85 | 2 | 0 | 1 | W | PHYS | |
|
||||
|
||||
## 7. Open questions / assumptions to confirm
|
||||
1. **Replacement algorithm.** Is there one special entry per round or one per spawn action? Is the k-copies formula right? It is inferred from `min/maxReplacedEnemyCount` and the BE factors, and is not documented anywhere.
|
||||
2. **Enemy stat scaling.** It is unknown how `aceffect_enemy_*` map to modes and rounds. `difficultyFactorInfo` (1.0/1.6/1.7/1.7) and `modeFactorInfo` (1.25) look like **reward** coefficients: PRTS notes "获取卫戍认证系数提升至×1.25".
|
||||
3. **Boss HP in single mode.** It may be the same bloodPoint or a scaled one. The multi pool is shared by 4 players across 2 battlefields.
|
||||
4. **Leak weighting.** The rule is by count; whether `lpr` ever matters outside boss rounds is unknown.
|
||||
5. **Row 8 / row 1 non-bench hand tiles:** exact use is unknown (temporary staging for 临时整备区?).
|
||||
6. **4-player lobbies.** Normal rounds use 4 separate boards. Boss rounds put pairs on 2 boss battlefields. It is not known how partners are assigned for 联防 (proposal: the 2 perfect players with the lowest index).
|
||||
|
||||
---
|
||||
|
||||
## Addendum (critic)
|
||||
|
||||
Written 2026-09-27 by the completeness critic. It supersedes the conflicting lines above. Sources: round-level `options` re-read from the level JSONs, PRTS `卫戍协议:盟约_下半` §开始模拟 and §隐秘核心, PRTS `卫戍协议/帮助`, and BWIKI `盟约`.
|
||||
|
||||
| § | Was | Now | Tag |
|
||||
|---|---|---|---|
|
||||
| 2.2 "DP initialCost 0 / DP irrelevant" | from the `m0X` terrain files | The **round levels** (`01…h06`, `h07/h08`, `escaped_*`) have `initialCost` **10**, `costIncreaseTime` 1 s and `maxCost` 99. The value 0 belongs to the terrain files, which are not used for battle options. **DP matters:** initial deployment is free, but auto-redeploy after a knock-out needs DP ≥ the unit's `cost` (BWIKI "在再部署时间归零、地块可部署且部署费用足够后,将在原位置自动部署"). | VERIFIED |
|
||||
| 2.2 row 8 "5 hand tiles [ASSUMED staging]" | – | They are the **5 temporary hand slots** (临时手牌区): "溢出的手牌会临时存放至整备区前方的5个空位上". | VERIFIED |
|
||||
| 3.1 "FUNNY has 9 rounds" | – | Only **solo** FUNNY has 9 rounds (R9 = boss `h07_01_S` and its alternatives). **Multi FUNNY has 14 rounds** (R14 boss, no R15), with SP rounds 3 and 9. | VERIFIED (data) |
|
||||
| 3.2 step 7, stat scaling [ASSUMED] | FUNNY III / NORMAL II … | **Replaced by the per-mode, per-round table in 01 Addendum A3** (`01-core-data.json → _criticAddendum.enemyStatMultipliers`). `atk × base × 1.1^k`, `hp × base × 1.2^k (× 1.08 in the ABYSS rounds marked there)`. DEF and RES unchanged. Leader HP pools are excluded. **ABYSS: all enemies move ×1.15 from R3.** Apply it after the special-enemy replacement, on the level-0 stats. | VERIFIED (PRTS, user-sourced) |
|
||||
| 4 "Hidden core: >300 / >1000" | 上半 values | **下半: solo > 350 activated layers and LP > 1; multi team sum > 1200 and merged LP > 1.** Available on 险境 and harder. | VERIFIED |
|
||||
| 4 boss round | – | The boss HP pool is not scaled by A3. Overtime −1 LP/s starts after `bossTurnHpReduceTime` = 150 s. The battle does not end at the level's 120 s ("计时结束后战斗仍然会继续"). Wave enemies that reach a goal subtract their `lifePointReduce` from the merged LP; at 0 the team fails at once. **Movable bosses spawn one per alive player's side**, and all of them share the pool. | VERIFIED |
|
||||
| 3.1 timeout | "alive at the limit count as leaked" | Confirmed: "在作战时间结束后,如果战场中存在仍未被击杀的敌人,就无法达成完美作战。根据最终未击倒的敌方数量,扣除其来源玩家的目标生命值(每回合最多10点)". The combat ends at `maxPlayTime`. [ASSUMED] The limit is in game-time seconds; combat always runs at 2×. | VERIFIED |
|
||||
| 3.3 联防 | helpers | At most 2 helpers. They keep their end-of-combat HP ratio, SP and positions. With 1 helper use `escaped_single`; with 2 use `escaped_multi`. Survivors cost their **source** player LP, capped at 10. | VERIFIED |
|
||||
|
||||
Still [ASSUMED] from this file:
|
||||
- The special-enemy replacement counts `k`.
|
||||
- The per-round faction pick.
|
||||
- The spawn-lane mapping when a leaked enemy is replayed in 联防.
|
||||
- Whether bounty and special enemies also receive the A3 multipliers. Recommend **yes**, using the current round's `k`.
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,872 @@
|
||||
# 06 · Multiplayer (同盟模拟 / 联合模拟) and in-game UI/UX flow
|
||||
|
||||
Scope: how the co-op mode of 卫戍协议:盟约 (season `act2autochess`, "盟约·下半"; 上半 = `act1autochess`) works, and what each screen looks like, so we can build a similar but original UI.
|
||||
|
||||
Legend:
|
||||
- **[DATA]** read from the official game data (`activity_table.json`, `autoChessData`, `act2autochess`, level JSONs, `display_meta_table.json`).
|
||||
- **[OFF]** from an official Hypergryph announcement or the official gameplay-intro long image.
|
||||
- **[WIKI]** from BWIKI or PRTS (community wikis that copy in-game text).
|
||||
- **[COMM]** from community guides, videos or screenshots.
|
||||
- **[SHOT]** seen directly in a screenshot (URLs in §15).
|
||||
- **[ASSUMED]** our proposal where nothing authoritative was found.
|
||||
|
||||
Rich-text tags such as `<@ba.vup>…</>` are stripped. Rules this doc shares with the core loop (economy, bonds, LP) are covered in `01-core-rules.md` and `05-enemies-levels.md`. This doc only restates what multiplayer needs.
|
||||
|
||||
---
|
||||
|
||||
## 0. TL;DR: the 20 facts the architect needs
|
||||
|
||||
1. **This is co-op, not PvP.** 1–4 players (a "同盟", alliance) fight AI waves. Each player has their **own board, bench, shop, funds, shop level, bonds and LP**. Nothing attacks another player. The only rivalry is indirect: the **shared operator pool** ("抢牌/卡牌") and bounty kills. [OFF][WIKI][COMM]
|
||||
2. **Entry.** 独立模拟 (solo) or 同盟模拟 (co-op). Co-op has two ways in:
|
||||
- **联合模拟**: create a room and share a 同盟密钥 (room key), or join with a key or invite.
|
||||
- **搜寻队友**: matchmaking, either 精确搜寻 (similar trophy level) or 快速搜寻 (fastest).
|
||||
- Unticking 【房间未满4人时搜寻队友】 starts a room with fewer than 4 players. [OFF 5114][WIKI]
|
||||
3. **Enemy scaling.** Every enemy's HP and ATK are ×0.70 in solo and ×0.80 in co-op. [WIKI PRTS 下半]
|
||||
4. **Pre-game steps** (`enterStepList`) [DATA]:
|
||||
- `INFO_CHECK` "确认本局信息": 25 s, warning at 5 s. Players press 准备就绪; the screen shows "已就绪 x/4".
|
||||
- `BAND_CHECK` "选择策略": 50 s, warning at 15 s. A **draft in random order** shown on the left. In co-op each player may **skip once** ("联合模拟在选择策略时可以进行一次跳过"). On timeout 华法琳 (`band_bldsk`) is picked.
|
||||
- `BATTLE_CHECK` "协议启动": 3 s.
|
||||
5. **Round loop (co-op):** [机变 draft on SP rounds] → 休整期 prep (timer, with ready/unready) → simultaneous auto-combat → 联防 unite phase if needed → LP loss → next round. **Round 14 = 最终攻势** (Final Assault). **Round 15 = 隐秘核心** (Hidden Core, optional). 标准 difficulty ends at round 14 with no hidden core.
|
||||
6. **Co-op prep timer** (`turnInfoDataDict.normalPhaseTime`, seconds, rounds 1→15) [DATA]: `65,65,65,95,95,100,105,105,125,125,125,125,150,195,195`. Round 15 is `215` in 绝境 and 终极.
|
||||
- Solo was 300 s in 上半 and is **unlimited** in 下半, with pause, leave and resume allowed. [OFF 5114]
|
||||
- Combat time limit = the round level's `maxPlayTime`: `45,45,55,55,55,70,85,85,95,95,115,115,115,120,120`.
|
||||
7. **Ready check.** "全体参与者就绪之前可随时取消准备,准备战斗后将无法进行操作". You can un-ready until everyone is ready. Combat starts when all players are ready or when the timer runs out. [DATA tip]
|
||||
8. **机变阶段** (special draft phase), co-op:
|
||||
- Offers **6 cards**; each player **takes 1 in turn**, and a taken card is gone. 16 s per picker (`specialPhaseTime`=16), 30 s for the first picker. On timeout the pick is **auto-assigned**. [DATA][WIKI][SHOT]
|
||||
- Solo offers 3 cards and has no time limit in 下半.
|
||||
- It happens in the prep of rounds where `isSpPrepare`:
|
||||
- co-op 标准: rounds 3, 9
|
||||
- co-op 险境: rounds 3, 6, 9
|
||||
- co-op 绝境/终极: rounds 3, 9, 11
|
||||
|
||||
That is, "after round 2/8", "2/5/8" and "2/8/10". [DATA]
|
||||
9. **Team cards.** 战术决策 cards marked `icon_team_buff` give the effect **to the picker and to all teammates** ("若存在其他队友则他们也获得"). `icon_player_buff` cards are personal. [DATA]
|
||||
10. **联防 (Unite / joint defense).** Runs when at least one player leaked and at least one player cleared perfectly (完美作战).
|
||||
- **Up to 2** perfect players move their operators, in their end-of-combat state, onto a temporary field (临时阵地) and fight **the union of all leaked enemies**.
|
||||
- Enemies that survive cost their **source** player LP, capped at **10 per round**.
|
||||
- Bond stacking is disabled during 联防.
|
||||
- A bounty target killed by a helper pays the helper. [WIKI][DATA][COMM]
|
||||
11. **LP.** Each player's LP = their strategy's `totalHp` (20–45). Loss is capped at **10 per round** (`costPlayerHpLimit`=10). A player at 0 LP is **out**, and all their units go back to the shared pool at once. [DATA][COMM]
|
||||
12. **Final Assault (round 14).**
|
||||
- All players' remaining LP **merge into one pool** (no cap).
|
||||
- Players are **paired 2 + 2 onto two merged battlefields**, each partner holding one half (left or right).
|
||||
- **Everyone damages the same boss HP pool**: some leaders spawn on both sides of a field and share HP.
|
||||
- After `bossTurnHpReduceTime`=150 s the pool loses **1 LP per second**.
|
||||
- "最终攻势中,两名参与者会处于同一个战场,但无法查看另一组队友的战场情况". [DATA][OFF][WIKI]
|
||||
13. **Hidden Core (round 15, 险境+).**
|
||||
- Co-op: the sum of all players' activated bond stacks > **1200** and merged LP > 1.
|
||||
- Solo: > 350 and LP > 1.
|
||||
- In 上半 the thresholds were 1000 and 300.
|
||||
- Failing round 15 does not affect clear status or rewards. [WIKI PRTS 下半]
|
||||
14. **Shared pool** (co-op): copies per operator name by tier I..VI = **12 / 14 / 18 / 16 / 8 / 5** (Muelsyse 4).
|
||||
- An elite occupies 3 copies. Shop-displayed cards don't count.
|
||||
- The shop can't roll an operator whose owned copies (all players' boards, benches and effects) have reached the cap.
|
||||
- Units of players who are eliminated or who quit return immediately. [COMM video BV1JWy3BkEpt/BV1ZTUjBaEyy]
|
||||
15. **No free trading or gifting.** The only player-to-player transfers are item or strategy effects:
|
||||
- 信标 (Beacon, from 芬's strategy): sends the original operator to the teammate with the most members of that bond. This fires the broadcast "X博士给你赠送了{1}".
|
||||
- "神秘顾客" (鸭爵's strategy): passed to the next player.
|
||||
- Team buff cards. [DATA]
|
||||
16. **Communication is emotes only.** There is no text chat.
|
||||
- `chatCD`=1 s between emotes; a bubble shows for `chatTime`=3 s.
|
||||
- Room emotes: 10. Battle emotes: 6 per theme. Themes: 卫戍 basic, basic_2, 源石虫, plus 3 paid April-Fools themes.
|
||||
- An auto **broadcast ticker** reports boss-damage %, big DPS, shop levels, elite promotions and gifts. [DATA]
|
||||
17. **Disconnect / leave.**
|
||||
- Solo: leave anytime and resume within 24 h (`singleReconnectTime`=86400).
|
||||
- Co-op: the match continues. A "断线重连" button appears on the hub. Timers keep running and the missing player's choices auto-resolve (draft auto-assign, strategy default); their board keeps auto-fighting.
|
||||
- Quitting counts as a defeat: units return to the pool and the boss HP pool shrinks.
|
||||
- 模拟重载时间: ending a sim within 20 s of starting blocks the next start for a while (anti-abuse). [OFF][WIKI][SHOT][ASSUMED details]
|
||||
18. **Trophies (奖杯), co-op only.** By rounds passed × difficulty (§10). Levels at 0 / 10 / 30 / 60 / 100 cumulative trophies (`medalDataList`). Trophy level feeds 精确搜寻 and is shown on name cards. [DATA][WIKI]
|
||||
19. **Settlement per player.** Rounds passed, one **评语/title** out of 卫戍之星, 不朽盟约, 坚若磐石, 精英云集, 万事俱备, 挥金如土 (`playerTitleDataDict`), trophies, 卫戍认证 (tokens), 点赞 (like) and 举报 (report, 8 reasons, at most 3 reports). [DATA][WIKI]
|
||||
20. **Visual language.**
|
||||
- Near-black green-grey panels with **mint/teal (#4ed8af / #35d8b4 / #59f4ca)** accents, gold price badges (#ffc600), red for danger and exit.
|
||||
- Seven-segment "COUNTDOWN" digits top-right; they go orange at ≤10 s.
|
||||
- Round mint bond discs, roman-numeral tier chips, a hexagon coin badge and a green "tower" LP icon.
|
||||
- A tilted 3D board with the shop as a bottom card bar. [DATA colors][SHOT]
|
||||
|
||||
---
|
||||
|
||||
## 1. Terminology (CN → proposed EN → data id)
|
||||
|
||||
| CN (in-game) | EN (ours) | Where / id |
|
||||
|---|---|---|
|
||||
| 独立模拟 | Solo Simulation | `modeType: SINGLE` |
|
||||
| 同盟模拟 | Alliance / Co-op Simulation | `modeType: MULTI` |
|
||||
| 联合模拟 | Private Alliance (room + key) | co-op sub-entry |
|
||||
| 搜寻队友 (精确/快速) | Matchmaking (Precise / Quick) | co-op sub-entry |
|
||||
| 同盟密钥 | Alliance Key (room code) | — |
|
||||
| 入门协议 | Tutorial Protocol | `mode_training_1`, `modeType: LOCAL`. It runs with 3 NPC teammates (`trainingNpcList`). |
|
||||
| 标准/险境/绝境/终极 模拟 | Standard / Perilous / Desperate / Ultimate | `FUNNY/NORMAL/HARD/ABYSS`; colors `f6a329 / e85a1a / e73118 / ff0024` |
|
||||
| 确认本局信息 | Briefing | `INFO_CHECK` |
|
||||
| 选择策略 / 策略 | Strategy (commander) | `BAND_CHECK`, `bandDataListDict` |
|
||||
| 协议启动 | Protocol start | `BATTLE_CHECK` |
|
||||
| 休整期 | Rest (prep) phase | `normalPhaseTime` |
|
||||
| 机变阶段 | Contingency draft | `specialPhaseTime`, `isSpPrepare`, `effectChoiceInfoDict` |
|
||||
| 作战期 / 各自行动阶段 | Combat / individual action phase | level `maxPlayTime` |
|
||||
| 联防 / 联防阶段 | Unite (joint-defense) phase | `escapedBattleTemplateMap{Single,Multi}Player` |
|
||||
| 完美作战 | Perfect clear | — |
|
||||
| 目标生命值 | LP (target life) | `bandDataListDict.totalHp`, `costPlayerHpLimit` |
|
||||
| 最终攻势 | Final Assault (round 14) | `isBossTurn`, `bossTurnHpReduceTime` |
|
||||
| 隐秘核心 | Hidden Core (round "??" = 15) | `isHidingBoss` |
|
||||
| 调度中心 | Dispatch Center (shop) | `shopLevelDataDict` |
|
||||
| 整备区 / 临时整备区 | Standby area (bench, 10) / temp overflow (5) | `maxDeckChessCnt`=10 |
|
||||
| 战场区 | Battlefield (max 8 units) | `maxBattleChessCnt`=8 |
|
||||
| 冻结 / 解冻 | Freeze / Unfreeze (lock shop) | — |
|
||||
| 刷新 | Refresh (reroll, 1 fund) | `shopRefreshPrice`=1 |
|
||||
| 晋级 / 精锐 | Promote / Elite (3→1) | — |
|
||||
| 奖杯 / 奖杯等级 | Trophies / Trophy level | `medalDataList` |
|
||||
| 评语 | Commendation (title) | `playerTitleDataDict` |
|
||||
| 卫戍认证 | Garrison Certificate (reward token) | `act2autochess_token_chess` |
|
||||
| 交流 | Emote | `enabledEmoticonThemeIdList` |
|
||||
|
||||
---
|
||||
|
||||
## 2. Mode matrix
|
||||
|
||||
| | 独立模拟 (solo) | 同盟模拟 (co-op) |
|
||||
|---|---|---|
|
||||
| Players | 1 | 1–4. Normally 4; fewer if "房间未满4人时搜寻队友" is unticked. |
|
||||
| Enemy HP/ATK factor | ×0.70 | ×0.80 |
|
||||
| Prep timer | none (下半); 300 s (上半) | `normalPhaseTime` table (§4.2) |
|
||||
| 机变 draft | 3 choose 1, no timer (data: 150 s in 上半) | 6 cards, 1 each in turn; 16 s each, 30 s first |
|
||||
| SP rounds (`isSpPrepare`) | 标准 none (9-round mode); 险境 6, 9; 绝境/终极 3, 9, 11 | 标准 3, 9; 险境 3, 6, 9; 绝境/终极 3, 9, 11 |
|
||||
| Rounds | 标准: 9 (boss on 9). Others: 14 + optional 15. | 标准: 14 (no 15). Others: 14 + optional 15. |
|
||||
| 联防 | none | yes (§5) |
|
||||
| Boss round | single field, all your lanes | pairs on merged fields, shared HP pool |
|
||||
| Hidden core threshold | stacks > 350, LP > 1 | team stacks > 1200, merged LP > 1 |
|
||||
| Pause / leave | yes, 24 h resume, 【放弃模拟】 to settle | no pause; reconnect via 断线重连 |
|
||||
| Trophies | none ("只有在联合模拟中才能获得奖杯") | yes (§10) |
|
||||
| Reward factor (`modeFactorInfo`) | ×1.25 (was ×1 before 11/18) | ×1.25 |
|
||||
| Strategy unlock / mode unlock | Shared between solo and co-op in 下半 | Shared between solo and co-op in 下半 |
|
||||
|
||||
Mode unlocks (`preposedMode`) [DATA]:
|
||||
- 标准 needs 入门协议.
|
||||
- 险境 needs 标准 cleared (solo or co-op).
|
||||
- 绝境 needs 险境 cleared.
|
||||
- 终极 needs **2 clears** of 绝境.
|
||||
|
||||
"盟约数增加" means 标准 bans 10 bonds (`inactiveBondIdList`) and some enemies (`inactiveEnemyKey`).
|
||||
|
||||
---
|
||||
|
||||
## 3. Lobby, rooms and matchmaking
|
||||
|
||||
### 3.1 Hub → mode select [OFF intro image][SHOT]
|
||||
|
||||
- **Left column:** 成就统计 (stats), 报酬说明 (rewards info), 每日防卫目标 (daily 200 tokens → +300), 关键目标 (missions), 功勋兑换处 (milestone shop; 60 levels in `milestoneList`).
|
||||
- **Right column:** S.W.E.E.P.报告 (codex), 物资调配处 (roster config), 模拟邀约 (pending invites).
|
||||
- **Bottom-right mode buttons:**
|
||||
- `独立模拟`
|
||||
- a group labelled `同盟模拟` holding `联合模拟` and `搜寻队友`
|
||||
- **Reconnect:** if you have a live co-op sim, the mode buttons are replaced by **【断线重连】**.
|
||||
- **Tutorial:** 入门协议 is reachable bottom-left of the co-op screen and is forced on first entry.
|
||||
|
||||
### 3.2 联合模拟 (private room)
|
||||
|
||||
- **选择同盟方式** offers two options:
|
||||
- **【创建同盟】**
|
||||
- **输入同盟密钥 + 【加入同盟】** (join with a key)
|
||||
- **Room screen** (one tall card per seat, 4 seats):
|
||||
- Each card shows the player's assistant (secretary) art, a `博士 #1234` tag, the trophy-level chess icon and a "…" emote button.
|
||||
- The creator's card is tagged **创建者**. A ready seat shows **☑ 已就绪**.
|
||||
- **Header:**
|
||||
- a lifetime countdown, "13:29 后同盟将自动销毁". Rooms self-destruct after about 15 min idle [ASSUMED 15:00].
|
||||
- "当前延迟 11ms", the ping.
|
||||
- **Footer:**
|
||||
- a pill `[快速搜寻 | ♜ 标准模拟]` showing search mode and difficulty (difficulty tinted in mode color).
|
||||
- "*同盟人数达标,准许进入模拟"
|
||||
- a big mint **准备就绪** button.
|
||||
- **Rules:**
|
||||
- The creator can change difficulty and invite friends.
|
||||
- Invites have a 60 s cooldown per invite (`invitationSendCd`=60).
|
||||
- Unticking "房间未满4人时搜寻队友" lets the room start with fewer than 4. If it is ticked, the room fills the empty seats through matchmaking.
|
||||
|
||||
### 3.3 搜寻队友 (matchmaking)
|
||||
|
||||
- Pick difficulty on **选择模拟协议**:
|
||||
- Left: a gold hologram of the fortress/barge.
|
||||
- Right: stacked difficulty cards with "已选定" check or lock text such as "通关同盟模拟【标准模拟】后解锁".
|
||||
- Pick the search mode from a dropdown, then press 【开始搜寻】:
|
||||
- **精确搜寻**: "更容易搜寻到实力相近的队友", matched by trophy level/count.
|
||||
- **快速搜寻**: "更快速地搜寻队友".
|
||||
- Matching tips (`gameTipsList`, 21 tips, weight 50 each) rotate every 5 s (`matchingTipRotateInterval`).
|
||||
- Matching timeout `matchTimeMax` = 120 s. What happens next is not documented. [ASSUMED] Offer "start with current members" or "keep searching"; in our build, fill with bots.
|
||||
|
||||
### 3.4 Ping display (`pingConds`) [DATA]
|
||||
|
||||
A pill next to the exit button shows `NNms`, colored by tier:
|
||||
- `ping.low` for < 60 ms
|
||||
- `ping.medium` for 60–199 ms
|
||||
- `ping.high` for ≥ 200 ms
|
||||
|
||||
[ASSUMED] Colors mint / amber / red. Screenshots show the number in amber/orange at 58–85 ms.
|
||||
|
||||
### 3.5 Anti-abuse
|
||||
|
||||
- **模拟重载时间:** after starting a sim there are 20 s during which ending it blocks starting a new one immediately. [WIKI]
|
||||
- Abandoning before the first prep phase gives no settlement plus a penalty wait (【等待模拟重载】). [WIKI]
|
||||
|
||||
---
|
||||
|
||||
## 4. Match flow in co-op (state machine)
|
||||
|
||||
```
|
||||
LOBBY ─► MATCHED ─► INFO_CHECK(25s) ─► BAND_CHECK(50s draft) ─► BATTLE_CHECK(3s)
|
||||
└─► for round r = 1..14(15):
|
||||
[SP_DRAFT if isSpPrepare[r]] (6 cards, sequential picks, 16s/30s)
|
||||
PREP(normalPhaseTime[r]) ── all ready? ──► COMBAT(maxPlayTime[r]) (all boards in parallel)
|
||||
COMBAT_END: each board is PERFECT or LEAKED (alive enemies at timeout count as leaked)
|
||||
if any LEAKED and any PERFECT: UNITE(联防) on temp field
|
||||
LP_LOSS per source player (cap 10); players at 0 LP → ELIMINATED
|
||||
r==14: FINAL_ASSAULT (merged LP, pairs, shared boss HP)
|
||||
r==15 only if hidden-core condition met (险境+)
|
||||
└─► SETTLEMENT (team page → personal page → rewards)
|
||||
```
|
||||
|
||||
### 4.1 INFO_CHECK "1/2 确认本局信息" (25 s, hint 5 s) [DATA][SHOT]
|
||||
|
||||
Shows:
|
||||
- the enemy leader (portrait, name, lore)
|
||||
- up to 3 special enemy types (`specialEnemyNum`=3, e.g. 特训敌人·隐匿/飞行/折射)
|
||||
- **核心盟约** row and **附加盟约** row of bond discs. Lit = active. Greyed with a badge = "部分盟约所含干员阵容不完整" (some of its operators won't appear).
|
||||
- **本局禁用干员** (banned operators this match)
|
||||
|
||||
Footer: "已就绪 2/4" with 4 person pips, plus **准备就绪**. When everyone is ready or the timer ends, the draft starts.
|
||||
|
||||
### 4.2 BAND_CHECK "2/2 选择策略" (50 s, hint 15 s) [DATA][OFF][SHOT]
|
||||
|
||||
- **Left:** the seat list in **random draft order**. Each row: avatar, name#id, trophy badge, name-card art, and a state box:
|
||||
- `…` waiting
|
||||
- `⌛ 决策中` choosing
|
||||
- chosen strategy icon + 🔍 + ✓ when done
|
||||
- **Right:** a 4-column grid of 40 strategy portraits (`bandDataListDict`) and a detail pane: portrait, **初始生命值 N**, name and effect. Bottom: **确认选择**.
|
||||
- An orange rook badge on a portrait = cleared with that strategy 3 times (`victorCount`=3, the corner badge "角标").
|
||||
- **One skip per player** in co-op: pass your turn and pick later. [DATA tip]
|
||||
- Timeout → `band_bldsk` 华法琳.
|
||||
- Unlock conditions come from `bandDataDict.unlockDesc`.
|
||||
- Whether two players may pick the same strategy is not documented. [ASSUMED] **Allowed** (the community only talks about "宣示主权", declaring a bond to teammates, not about locks). A picked strategy shows the picker's avatar on its portrait.
|
||||
|
||||
### 4.3 Prep phase 休整期 (co-op timer) [DATA]
|
||||
|
||||
| Round | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| Prep s (`normalPhaseTime`, multi) | 65 | 65 | 65 | 95 | 95 | 100 | 105 | 105 | 125 | 125 | 125 | 125 | 150 | 195 | 195 (绝境/终极: 215) |
|
||||
| Combat s (level `maxPlayTime`) | 45 | 45 | 55 | 55 | 55 | 70 | 85 | 85 | 95 | 95 | 115 | 115 | 115 | 120 | 120 |
|
||||
| Wave level | 01 | 02 | 03 | 04 | 05 | 06 | 07 | h01 | h02 | h03 | h04 | h05 | h06 | h07_0X | h08_0X |
|
||||
|
||||
- 标准 co-op ends at round 14 and has no 15.
|
||||
- The **countdown turns orange** at ≤10 s (`hintTimeNormalPhase`/`FightPhase`/`SpecialPhase`/`DotPhase` = 10). [SHOT: "01" orange]
|
||||
- PRTS gives a simplified "各轮次均有70秒的决策时间". Use the data table.
|
||||
- A full 4-player match takes about 29 min of prep, 21 min of combat, plus 联防 and drafts ≈ **50–60 min**. That is a known community pain point ("燒時間條"). We should support a fast-timer preset.
|
||||
|
||||
Prep rules relevant to co-op [DATA tips][WIKI]:
|
||||
- **Ready:** 准备就绪 toggles ready. "全体参与者就绪之前可随时取消准备,准备战斗后将无法进行操作". Once ready you cannot act, but you can still un-ready until everyone is ready.
|
||||
- **Overflow:** "若非主动溢出,溢出的手牌会临时存放至整备区前方的5个空位上,直到溢出情况排除才可开始进行作战". Overflowed bench cards sit on 5 temp slots and **block readying**. They are destroyed at the next round ("处于临时整备区的调度资源,在进入下一回合后会自动销毁").
|
||||
- **Scouting:** "休整期可以查看队友的战场情况" and "…查看当前回合即将迎击的敌方单位". Tap a teammate's avatar in the left list to view their board (read-only). The 🔍▶▶ button shows the enemy preview board.
|
||||
- **Promotion reward:** the reward operator can't be refreshed or frozen and doesn't carry over.
|
||||
- **Upgrade cost** drops by 1 each round until 0 [SHOT: 5 → 4 → 3 over rounds 1–3].
|
||||
|
||||
### 4.4 Special draft 机变阶段 (co-op) [DATA][WIKI][SHOT]
|
||||
|
||||
- **Header:** `悬赏决策 | 选定悬赏目标,获取额外奖励。` with the sub-line "倒计时结束后仍未选定将自动分配".
|
||||
- **Right header:** "当前轮到你决策" when it's your turn, or "{name} 正在决策… ⌛", plus the countdown.
|
||||
- **Grid:** 3×2 = **6 cards**. A taken card greys out and shows the taker's avatar badge in its top-right corner.
|
||||
- **Left list:** ✓ = picked, `…` = picking, exit-door icon = player left.
|
||||
- **Pick order:** it is **not** simply seat order; screenshots show out-of-seat order. [ASSUMED] Random per draft; alternatively lowest-LP-first as a catch-up rule.
|
||||
- **Card families** (`effectChoiceInfoDict`, `choiceType` / name / text color `#35d8b4`, or `#f2bd3e` for the "_s" special variant):
|
||||
|
||||
| choiceType | Name | Contents (see `04-items.md` / `05-enemies-levels.md`) |
|
||||
|---|---|---|
|
||||
| `BOUNTY_HUNT` | 悬赏决策 | Adds an enemy to *your* next combat. "将其击倒者获得N资金": the killer, including a 联防 helper, gets the funds. Multi-round 假想敌: "击倒它的你或队友获得1资金". 战术特训 variants: "若各自行动阶段就达成完美作战,获得N资金" (perfect in your own phase, not via 联防). |
|
||||
| `EQUIP_FREE` | 道具补给 / 机密商店 | Free equipment (tier chip I–VI on card). |
|
||||
| `BUFF_SELECT` | 战术决策 | `icon_team_buff`: you **and every teammate** get it (列装, the 8 "…的盟誓" +8/10/12 stacks, 财富 +1 fund, 补给 2 free refreshes, 自愈, 火力, 征召, 无瑕, 锐利). `icon_player_buff`: only you (整备, 升华, 7×"盟约驰援"). |
|
||||
| `PERSONAL_CHOOSE` | 悬赏决策 (hunter strategy) | Personal-only variant. |
|
||||
|
||||
- The terrain cards (`terrain_m0X`, "模拟战场演变") change the map. [ASSUMED] They apply to the **picker's own board**.
|
||||
|
||||
### 4.5 Combat (各自行动阶段)
|
||||
|
||||
- All boards fight **at the same time** on the server. The client camera switches to the battle view. [SHOT]
|
||||
- 2× speed. No manual control and no pause in co-op.
|
||||
- **HUD center capsule:** `killed/total` (e.g. `4/9`), orange-bordered.
|
||||
- **Right edge:** a DP counter `⊂ 71`. DP starts at 10, gains +1 per second (`costIncreaseTime`=1) and caps at 99. Redeploys cost DP.
|
||||
- **When your board finishes:** the bottom bar reads **"⌛ 作战结束,等待队友完成作战"**. A bottom view switcher `‹ 自己 ›` cycles through teammates' live battles; you watch, you don't control.
|
||||
- **Result per board:** PERFECT (all enemies dead) or LEAKED (enemies reached the goal, or were alive at timeout).
|
||||
- [ASSUMED] Enemies that reach the protection point during combat are removed from your board and **queued as "leaked"** for 联防. They are **not** charged immediately. Charging happens after 联防.
|
||||
|
||||
---
|
||||
|
||||
## 5. 联防 Unite phase: exact rules and our implementation
|
||||
|
||||
Rules as published [WIKI BWIKI/PRTS][DATA tips][COMM]:
|
||||
1. **Trigger:** at least one player leaked and at least one player is PERFECT. Only perfect players may help ("只有达成完美作战的队友可以进行联防").
|
||||
2. **Helpers:** 1 or 2 perfect players ("达成完美作战的玩家(最多2名)将迎战所有突破了防线的敌人"). PRTS: "1~2名完美作战玩家的阵地以其当前状态,迎接所有非完美作战玩家未能击杀的敌人的集合".
|
||||
3. **State carried over:** helpers' operators keep their **HP ratio, SP and deployment positions** from the end of their own combat and are moved to a **临时阵地**.
|
||||
4. **Enemies:** the helpers face the **union** of all non-perfect players' leaked enemies.
|
||||
5. **No stacking:** 【盟约】 stacking is disabled ("进行联防时,盟约不会继续叠加"; <战斗中> triggers don't fire). The HUD shows the bond row with the tooltip **"层数叠加已禁用"**. [SHOT]
|
||||
6. **LP:** enemies still alive when 联防 ends deduct LP from **their source player**. The cap is 10 per player per round. A fully successful 联防 means the owner loses nothing.
|
||||
7. **Bounties:** a bounty or 假想敌 carries its reward to whoever kills it, so a helper can collect a teammate's bounty. Band 鸭爵: "…击倒这些敌人者获得1资金(包括联防阶段)".
|
||||
|
||||
Data behind it [DATA]:
|
||||
- The template maps are `level_act1autochess_escaped_single` (characterLimit 8) and `level_act1autochess_escaped_multi` (characterLimit 20). They share one 21×19 geometry: two lanes (left and right halves), a start at the right edge (row 9, col 18) and the goal at the left (row 9, col 2).
|
||||
- Waves are **placeholders**: 5 × each of 8 template enemies (`templateEnemyNormal/Elite/Special(+Fly)/Token(+Fly)` in `autoChessData.constData`), spawned at 3/10/17 s on routes 0–7. The server swaps in the real leaked enemies by category.
|
||||
- `maxPlayTime` = 1.0 is a placeholder, overridden at runtime.
|
||||
- **[ASSUMED interpretation]** `escaped_single` is used with 1 helper and `escaped_multi` with 2 helpers (8+8 operators, plus summons, fit in 20).
|
||||
|
||||
What is not published, and what we propose [ASSUMED]:
|
||||
|
||||
| Question | Proposal |
|
||||
|---|---|
|
||||
| Which 2 helpers if 3 are perfect? | The two with the **most remaining LP**, ties broken by seat index. Alternative: random. Show "联防: A、B" in the banner. |
|
||||
| Where do helpers stand? | Helper 1 keeps their layout on the **left half**, helper 2 on the **right half**. The single-helper map uses the left half. |
|
||||
| Timer | Same as that round's combat `maxPlayTime`. [SHOT: countdown 64 during a round-12 联防, consistent with 115 s] |
|
||||
| Spawn order | Group leaked enemies by type, spawn in 3 staggered batches (t = 3/10/17 s). Keep `sourcePlayerId` on each enemy. |
|
||||
| What non-helpers do | Watch. The view switcher auto-focuses the 联防 field. Banner "联防阶段" (orange). The owners' LP counters tick down live as enemies escape. |
|
||||
| Enemy stats | Unchanged from the source board's round/difficulty. |
|
||||
| Helper operator death | Counts only for 联防. Helper boards reset normally for the next round. |
|
||||
|
||||
Visual [SHOT]: the banner is a dark strip with orange chevrons and orange-skull icons reading **联防阶段**. The top capsule shows the kill counter `1/4` and the round `回合 12`.
|
||||
|
||||
---
|
||||
|
||||
## 6. What is shared vs individual
|
||||
|
||||
| Element | Per player | Shared by the team |
|
||||
|---|---|---|
|
||||
| Board (8 deploy slots), bench (10 + 5 overflow), shop and shop level, funds, freeze state | ✔ | |
|
||||
| Strategy (band) and its LP pool (`totalHp`) | ✔ (merged at round 14) | ✔ from the Final Assault on |
|
||||
| Bonds and stacks | ✔ | Hidden-core check uses the **team sum** |
|
||||
| Enemy waves per round | Same round template for everyone [ASSUMED same seed and composition]. Per-player additions from bounties/特训 are "为自身下场作战添加". | Special-enemy types and boss are the same for the whole match (briefing) |
|
||||
| Operator pool (copies per name) | | ✔ (§7) |
|
||||
| Leaked enemies → 联防 | | ✔ helpers fight them |
|
||||
| Boss HP | | ✔ one pool across both boss fields |
|
||||
| 机变 card set | | ✔ one 6-card pool, each takes 1 |
|
||||
| Team-buff cards | | ✔ picker + teammates |
|
||||
| Timers, ready gate | | ✔ everyone waits for the slowest (prep ends when all ready or timer) |
|
||||
| Rewards / trophies | ✔ (own rounds passed) | Team result affects rounds passed |
|
||||
|
||||
---
|
||||
|
||||
## 7. Shared operator pool (co-op) [COMM, tested by players]
|
||||
|
||||
- **Copies per operator name:**
|
||||
|
||||
| Tier | I | II | III | IV | V | VI |
|
||||
|---|---|---|---|---|---|---|
|
||||
| Copies | 12 | 14 | 18 | 16 | 8 | 5 |
|
||||
|
||||
Exception: 缪尔赛思 (Muelsyse) has 4.
|
||||
- A **normal** unit uses 1 copy and an **elite** uses 3.
|
||||
- **Counted:** units on every player's battlefield, bench and temp bench, from any source (buy, reward, strategy effect, 拟态/copy effects).
|
||||
- **Not counted:** cards currently displayed in any shop.
|
||||
- When owned copies ≥ the cap, a refresh can't roll that name. Some effects fail when the cap is hit (杜遥夜's search; possibly 拟态物质 or 煌's sell effect).
|
||||
- Selling (1 fund per bench unit) returns copies. A player's **defeat or quit returns all their copies immediately**.
|
||||
- The server must own the pool (authoritative) and update it in real time for everyone.
|
||||
|
||||
---
|
||||
|
||||
## 8. Cross-player interactions (complete list found)
|
||||
|
||||
1. **Team buffs** from 战术决策 (§4.4).
|
||||
2. **Bounties via 联防:** helpers can kill another player's bounty and take the funds.
|
||||
3. **信标 Beacon.** Item `eff_acarm109` (normal) / `eff_acgarm109` (advanced); strategy 芬 【协力共进】 grants one on rounds 8, 10, 12 and 14.
|
||||
- Equipping it destroys the carrier and the Beacon.
|
||||
- You get a special refresh with 2 operators of the same tier and take 1 free.
|
||||
- "若在同盟模拟中且存在其他队友,下个休整期向相应盟约人数最多的队友发送1个原干员;相应盟约人数相同则随机发送;无法装备给自编干员".
|
||||
- The receiver sees the broadcast "{0}博士给你赠送了{1}" (`CHAR_GIFT`, priority 1).
|
||||
4. **"神秘顾客".** Strategy 鸭爵 (`eff_acdisney`): "拖拽至场上使用后,选择一项特殊悬赏任务进行挑战;主动销毁时获得1份资金,并将"神秘顾客"传递给下一名玩家". From round 5, "你和队友遭遇的部分敌人可能会替换为<鸭爵><高普尼克><流泪小子><圆仔>".
|
||||
5. **Touch** 【外勤医疗】: "所有玩家场地上出现一名<预备干员-医疗>", which affects all players.
|
||||
6. **Shared boss field (round 14/15):** partners' debuffs on the boss (e.g. 奥术 magic vulnerability) help each other. The community notes they don't stack: the higher value wins ("共享型buff會跟對面搶").
|
||||
7. **Emotes** and the broadcast ticker (§9).
|
||||
8. **No direct trading, gifting, lending of funds, or item passing.** "Giving back" in guides just means not buying, or selling so the copy returns to the pool.
|
||||
|
||||
**PvP:** none. There is no versus mode in 盟约 (上 or 下). Competition is only over the shared pool and the post-match comparisons (titles, likes, damage broadcasts). An older, unrelated mode `ENEMY_DUEL` exists elsewhere in the game.
|
||||
|
||||
---
|
||||
|
||||
## 9. Communication, broadcasts, reporting
|
||||
|
||||
### 9.1 Emotes [DATA display_meta_table][WIKI]
|
||||
|
||||
- **Where:** bottom-left **【交流】** button with a robot-face icon. It opens a panel of 6 (battle) or 10 (room) emotes; swipe left/right to switch theme.
|
||||
- **Display:** a bubble near the sender's avatar in the left player list, and over their board [ASSUMED] for `chatTime`=3 s.
|
||||
- **Cooldown:** `chatCD`=1 s.
|
||||
- **Enabled themes** (`enabledEmoticonThemeIdList`): `emoticon_autochess_basic`, `emoticon_originium_slug`, `emoticon_autochess_basic_2`, and the paid `emoticon_foolsday_doctor/_amiya/_wisdel`.
|
||||
- **Room scene** (`AUTOCHESS_ROOM`, basic theme), picIds:
|
||||
- hello, thanks, happy, question, sorry
|
||||
- scared, thinking, waiting, nice_cooperate, working
|
||||
- **Battle scene** (`AUTOCHESS_BATTLE`):
|
||||
- basic: happy, scared, sorry, thanks, thinking, nice_cooperate
|
||||
- basic_2 (下半): **没问题! 敬礼! 欢呼! 酷! 伤心 快死了**
|
||||
- 源石虫 theme: 合作愉快! 谢谢! 对不起! 再见! ??? 很快就好!
|
||||
- Look: an **octagonal mint glyph face** on a dark tile. Our emote art must be original.
|
||||
|
||||
### 9.2 Broadcast ticker (`autoChessData.broadcastList`) [DATA]
|
||||
|
||||
A scrolling banner. The highest priority wins. It starts `broadcastBeginDelay`=1 s after the trigger.
|
||||
|
||||
| id | priority | Text (player name highlighted) | Trigger |
|
||||
|---|---|---|---|
|
||||
| comment_boss_hit_1/2/3 | 30 | {0}博士对敌方领袖造成的伤害超过20% / 50% / 80%! | player's share of the boss pool |
|
||||
| comment_char_damage_1/2/3 | 20 | {0}博士的{1}干员造成的伤害量达到{2} | 200,000 / 500,000 / 1,000,000 |
|
||||
| comment_shop_level_1..5 | 11 | {0}博士将调度中心等级提升为{1}级 | shop level 2..6 |
|
||||
| comment_bond_effect | 10 | 叠加层数 | stack milestone [ASSUMED] |
|
||||
| comment_golden_char | 2 | {0}博士的{1}干员晋升为精锐 | promotion |
|
||||
| comment_char_gift | 1 | {0}博士给你赠送了{1} | Beacon transfer |
|
||||
|
||||
### 9.3 Like / report at settlement [DATA]
|
||||
|
||||
- 点赞 (like) teammates.
|
||||
- 举报 (report), at most 3 reports (`reportMaxNum`). Reasons:
|
||||
- 消极游戏: 挂机、不作为等消极行为
|
||||
- 故意捣乱: 阻碍其他玩家游戏
|
||||
- 中途退出: 游戏过程中离开
|
||||
- 不当言论: 使用了不恰当的名称或签名
|
||||
- 骚扰: 进行令人不快的行为
|
||||
- 作弊: 使用非常规手段进行游戏
|
||||
- 脚本: 利用第三方工具刷取奖励
|
||||
- 其他: 其他举报原因
|
||||
|
||||
---
|
||||
|
||||
## 10. Final Assault, Hidden Core, elimination, settlement
|
||||
|
||||
### 10.1 Final Assault (round 14) [DATA][OFF][WIKI][SHOT]
|
||||
|
||||
- **Merged LP:** at the start, `teamLP = Σ remaining LP of alive players`. The HUD shows a single tower-LP number, e.g. `13`.
|
||||
- **Pairing:** "博士们将被两两分组,每一组都会进入一个合并场地". Level maps `h07_0X`/`h08_0X`: a 21×19 field whose boss spawns in the middle (row 3, col 10) and whose ends are at the left (col 2–3) and right (col 17). Solo uses `…_s` maps with all routes going left.
|
||||
- [ASSUMED] With 4 players: seats (1,2) and (3,4). With 3: a pair plus a single on an `_s`-style map. With 2: one pair.
|
||||
- The left/right player assignment mirrors taunt/deploy priority for the right-side player ("你的最左邊是你的最右邊").
|
||||
- **Each player** redeploys their own lineup onto their half. The camera has left/right/`全景` (panorama) views (`‹ 全景 ›` switcher).
|
||||
- **Boss HP:** one pool per match (`act2autochess.bossInfoDict.bloodPoint*`):
|
||||
|
||||
| Boss | Enemy id | Standard | 险境 | 绝境 | 终极 | Hidden? | Weight |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| boss_1 | enemy_9013_acstmk | 247,500 | 675,000 | 1,800,000 | 3,600,000 | no | 6 |
|
||||
| boss_2 | enemy_9017_achunt | 225,000 | 400,000 | 800,000 | 3,000,000 | no | 6 |
|
||||
| boss_3 | enemy_9021_acduml | 285,000 | 708,750 | 2,000,000 | 4,000,000 | no | 6 |
|
||||
| boss_4 | enemy_1521_dslily | 307,500 | 708,750 | 2,100,000 | 4,200,000 | no | 5 |
|
||||
| boss_5 | enemy_2016_csphtm | 200,000 | 390,000 | 780,000 | 3,000,000 | no | 10 |
|
||||
| boss_6 | enemy_9032_aclionk | 285,000 | 705,000 | 1,990,000 | 3,980,000 | no | 5 |
|
||||
| boss_7 | enemy_9033_acdeer | 277,500 | 787,500 | 2,000,000 | 4,000,000 | no | 5 |
|
||||
| boss_8 | enemy_9013_acstmk_2 | 750,000 | 937,500 | 3,600,000 | 7,200,000 | **yes** | 50 |
|
||||
| boss_9 | enemy_9017_achunt_2 | 675,000 | 900,000 | 2,800,000 | 3,950,000 | **yes** | 40 |
|
||||
| boss_10 | enemy_9021_acduml_2 | 825,000 | 1,012,500 | 3,800,000 | 7,600,000 | **yes** | 40 |
|
||||
|
||||
- "部分敌方领袖会同时出现在战场的左右两侧,两侧的敌方领袖共享生命值(敌方领袖的总生命值不变)". Both fields and both sides drain the same pool.
|
||||
- The community reports fewer surviving players mean a smaller boss bar. [ASSUMED] `bossHP = bloodPoint × aliveAtRound14 / 4`, floored at 1/4.
|
||||
- **Boss immunity:** the boss takes no 侵蚀 (erosion) damage ("最终攻势中,敌方领袖不会受到侵蚀损伤").
|
||||
- **No stacking:** <战斗中> stacking is disabled in the boss fight. [COMM]
|
||||
- **Overtime:** after `bossTurnHpReduceTime` = 150 s, the team LP drains 1/s.
|
||||
- [ASSUMED] Minions that reach a goal also cost team LP (per-enemy LP cost; 2 for bosses per `lifePointReduce`), with no 10 cap.
|
||||
- Team LP 0 → defeat.
|
||||
- Boss dead → victory.
|
||||
- **Broadcasts:** at 20/50/80 % of total boss HP dealt by one player.
|
||||
- **Laggy clients:** the community notes "網速不好/幀率過低可能會導致boss戰傷害丟失". Our server-authoritative sim avoids this.
|
||||
|
||||
### 10.2 Hidden Core (round "??" = 15) [WIKI PRTS 下半][DATA]
|
||||
|
||||
- **Condition (险境/绝境/终极 only):**
|
||||
- co-op: Σ over all players of activated bond stacks > 1200, and merged LP > 1
|
||||
- solo: > 350 and LP > 1
|
||||
- Enemies are "被源石所侵蚀" upgraded 假想敌 (boss_8..10).
|
||||
- Failing doesn't change clear status or 卫戍认证.
|
||||
- Clearing it gives extra trophies (§10.4) and a special notice.
|
||||
- Timer: prep 195 s (215 s in 绝境/终极), combat 120 s.
|
||||
|
||||
### 10.3 Elimination and leaving [COMM][WIKI][SHOT]
|
||||
|
||||
- **Elimination:** a player at 0 LP before round 14 is eliminated ("战败"). Their units return to the pool and the boss pool shrinks.
|
||||
- [ASSUMED] Eliminated players may stay and spectate (view switcher) or leave. Their settlement uses the rounds they passed.
|
||||
- **Quitting** (中途退出) is treated the same, plus it can be reported.
|
||||
- The left-list avatar becomes a red "exit door" icon. [SHOT Mb2mtd9]
|
||||
- Two grey robot "x-eyes" placeholders are seen in a boss screenshot. [ASSUMED] They mean dead or left seats.
|
||||
- **Disconnection** (not a quit):
|
||||
- Official text: "若博士在模拟的作战回合中不慎失去神经同步,可以在一段时间内通过活动主页重新返回作战". The hub shows 【断线重连】. In-game error text: "神经网络连接丢失,请重新连接(错误号:400)".
|
||||
- [ASSUMED] Meanwhile the player's board keeps its last lineup and auto-fights. Prep timers expire with no purchases, drafts auto-assign, and the strategy defaults to 华法琳 if disconnected before the draft.
|
||||
|
||||
### 10.4 Trophies (co-op only) [WIKI PRTS 下半 + BWIKI table]
|
||||
|
||||
| Rounds passed | 标准 | 险境 | 绝境 | 终极 |
|
||||
|---|---|---|---|---|
|
||||
| 0–4 | 0 | 0 | 0 | 0 |
|
||||
| 5–8 | 1 | 1 | 1 | 1 |
|
||||
| 9–11 | 2 | 2 | 2 | 2 |
|
||||
| 12–13 | 2 | 3 | 3 | 3 |
|
||||
| 14 (成功卫戍) | 3 | 4 | 5 | 6 |
|
||||
| ?? (隐秘核心 cleared) | — | 5 | 7 | 8 |
|
||||
|
||||
Trophy level (`medalDataList`): Lv1 at 0, Lv2 at 10, Lv3 at 30, Lv4 at 60, Lv5 at 100 cumulative, with icons `trophy_level1..5_icon`. The art is chess pieces, rook → king, in bronze/silver/gold. The trophy level is shown in rooms, in the strategy draft and on the result card, and is used by 精确搜寻.
|
||||
|
||||
`roundScoreDataList` (round → 0,10,20,30,50,70,90,110,130,150,170,200,230,260,300) is a per-round score. [ASSUMED] It is a hidden MMR/"实力" input for 精确搜寻.
|
||||
|
||||
### 10.5 Commendations 评语 (`playerTitleDataDict`) [DATA; criteria ASSUMED]
|
||||
|
||||
The six titles, with our proposed award rules. The official conditions are unpublished.
|
||||
|
||||
| id | Title | Our rule |
|
||||
|---|---|---|
|
||||
| comment_1 | **卫戍之星** (Star of the Garrison) | Highest damage to the enemy leader. Only on a win. |
|
||||
| comment_2 | **不朽盟约** | Highest total activated bond stacks. |
|
||||
| comment_3 | **坚若磐石** | Least LP lost / most LP remaining. |
|
||||
| comment_4 | **精英云集** | Most promotions to elite (晋级次数). |
|
||||
| comment_5 | **万事俱备** | Most equipment fitted / merged [ASSUMED]. |
|
||||
| comment_6 | **挥金如土** | Most funds spent. |
|
||||
|
||||
Evidence:
|
||||
- A 176-game co-op player shows the six counts 20 / 32 / 25 / 26 / 29 / 19 (sum 151 ≈ 0.86 per game). This suggests **each player receives at most one title per match**: the category where they rank best relative to teammates, each title used at most once per match. [ASSUMED]
|
||||
- 卫戍之星 is visibly rarer (about 25 % of wins for a strong player).
|
||||
- The web stats page tracks exactly: 盟约最高叠加数, 单局最多消耗资金, 单局最多晋级次数, 单局最多击败数. This supports the mapping.
|
||||
|
||||
### 10.6 Settlement screens [WIKI][SHOT]
|
||||
|
||||
1. **Team summary:** "展示同盟的通过回合数,本局耗时和完成日期。同时会显示每个玩家的通过回合数及其获得评语". Each row gets like and report buttons. [layout ASSUMED]
|
||||
2. **Personal page** [SHOT rZEmfyJ]:
|
||||
- **Top left:** STRONGHOLD PROTOCOL logo, the difficulty tag (red "绝境模拟") and a big mint headline **模拟完成** (or failure text). "通过回合 **15**" in huge numerals. Boss medallions with ✓ (round-14 boss and hidden-core boss).
|
||||
- **Player card:** avatar, `Dr.name#1234`, trophy-level badge with total (e.g. 180), "获得奖杯 **7**".
|
||||
- **Right:** the final lineup as tier-chipped portrait cards. Empty slots read "NO INFO". Below it, a bond row with stacks (359 / 136 / 34 …).
|
||||
- **Bottom bar:** "获得卫戍认证! **+425** 常规获得 **+300** 每日防卫目标", then "LV. 38 LEVEL UP! 125/200" (milestone progress bar), then **下一步**.
|
||||
- **Background:** a dark topographic Terra map with a glowing orange "TARGET POINT".
|
||||
3. **Rewards:** tokens = `baseReward[roundsPassed] × difficultyFactor × modeFactor`.
|
||||
- Base per round 1..14 (`baseRewardDataList`): 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 120, 140, 160, 200.
|
||||
- Difficulty (`difficultyFactorInfo`): FUNNY 1.0, NORMAL 1.6, HARD 1.7, ABYSS 1.7.
|
||||
- Mode: ×1.25.
|
||||
- Check: 200 × 1.7 × 1.25 = **425** ✓ (matches the screenshot).
|
||||
- The daily target is 200 tokens → +300 bonus.
|
||||
4. **Stats web page** (`ak-webview…/autoChess/act1autochess`):
|
||||
- totals for solo and co-op: 总模拟数, 成功卫戍, 绝境突破
|
||||
- a **hexagon radar** of the 6 titles
|
||||
- 已获奖杯, 已获赞
|
||||
- best stacks, most funds spent, most promotions, most kills
|
||||
- top-3 bonds and strategies, and the badged strategies
|
||||
|
||||
---
|
||||
|
||||
## 11. UI layout of each screen (reference 1920×1080 landscape, from screenshots)
|
||||
|
||||
Coordinates are approximate fractions of a 16:9 screen. Everything is our own art; only the layout idea is borrowed.
|
||||
|
||||
### 11.1 Global chrome (all in-match screens)
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────────────────────────────┐
|
||||
│[⇦]58ms [🔍] 回合 [ 3 ] ( ⌂ 休息一下 ) ♜ 27 [🔍▶▶] ┃59┃≡ │
|
||||
│ exit+ping info round phase / kill capsule LP enemy preview COUNTDOWN│
|
||||
│ (◉3 灵巧)(◉0 迅捷)(◉ 精准)(◉ 助力) ← active-bond strip [☑ 准备就绪]│
|
||||
│┌──┐ │
|
||||
││P1│ ♜24 … ← player list: avatar, LP, state (…/✓/⌛/door) │
|
||||
││P2│ ♜24 ✓ │
|
||||
││P3│ ♜23 │
|
||||
││Me│ ♜27 (green person badge = you) │
|
||||
│└──┘ │
|
||||
│ [☺ 交流] bottom-left │
|
||||
└──────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
- **Exit:** top-left 64 px dark-red square, white "door-arrow" glyph. Asks for confirmation. In co-op it offers 暂离 or 放弃.
|
||||
- **Ping:** pill at about x = 4–7 %. Amber number + "ms".
|
||||
- **Top HUD:** a thin dark bar with bracket frames `[ ]`, centered at about x = 25–75 %, y = 2–6 %. Small techno micro-labels ("RHODES ISLAND STATION SERVICE").
|
||||
- The **center capsule** has a mint outline in prep and shows a phase label (e.g. "休息一下").
|
||||
- In combat and 联防 it has an orange outline and shows `killed/total`.
|
||||
- In the boss round it shows `killed/total` plus an orange boss HP bar with a boss glyph.
|
||||
- **Round box:** "回合" + a white box number.
|
||||
- **LP:** green rook-tower icon + number.
|
||||
- **Enemy-preview button:** amber bracket frame `[🔍 ▶▶]`. It swaps the view to the enemy staging board (a separate tiled grid showing this round's enemies standing in formation). The same frame shows `[🔍 ◀◀]` to go back.
|
||||
- **Countdown:** top-right, 7-segment digits about 90 px tall, mint (#5fe3b0-ish).
|
||||
- "COUNTDOWN" microtext underneath.
|
||||
- A vertical 5-bar gauge to the right that empties with time.
|
||||
- Orange at ≤10 s.
|
||||
- **准备就绪:** dark button with mint border and checkbox, under the countdown. When checked it fills mint.
|
||||
- **Bond strip:** round mint discs (about 56 px) with a black glyph and an outer segmented ring.
|
||||
- The stack count sits over the bottom of the disc and the name below.
|
||||
- Sorted by stacks descending, left → right.
|
||||
- Grey disc = present but not active.
|
||||
- Tap → detail popup (thresholds and current effect).
|
||||
- **Player list:** left edge, x ≈ 1–5 %, y ≈ 25–70 %. 4 square portraits (about 90 px) in dark frames with a green LP number.
|
||||
- Status glyph to the right: `…` acting / not ready, ✓ ready or picked, ⌛ deciding, red door = left.
|
||||
- Tap → view that player's board (read-only).
|
||||
- Emote bubbles pop next to it.
|
||||
|
||||
### 11.2 Prep phase (休整期) [SHOT c32edaf / 4995084 / a7a712ab]
|
||||
|
||||
```
|
||||
(board: tilted 3D grid, ~60 % of the screen, centered-left; enemy spawn = red wire-cube on the right,
|
||||
protect point = blue wire-cube with ⚠ on the left; operators show a tier chip "I" above their heads)
|
||||
wooden bench strip (10 pads) directly under the board = 整备区; +5 temp pads in front when overflowing
|
||||
剩余可放置角色: 6 ← right, above buttons
|
||||
[❄ 冻结] [⟳ 刷新 (1)] ← light-blue / amber
|
||||
┌────────┬───────────┬───────────┬───────────┬──(item)──┬──────────────┐
|
||||
│ (4) │ I (2) │ I (2) │ I (2) │ │ ◆◆◆ 5 │
|
||||
│ LEVEL │ [art] │ [art] │ [art] │ │ 目前资金 │
|
||||
│ 1 │ ⚙炎 │ ⚙助力 │ ⚙精准 │ │ ✕ 收起 │
|
||||
│ 升级 │ ⚔ 惊蛰 │ ⚔ 暴行 │ ⚔ 跃跃 │ │ │
|
||||
└────────┴───────────┴───────────┴───────────┴──────────┴──────────────┘
|
||||
bottom shop bar ≈ x 38 %→98 %, y 74 %→97 %
|
||||
```
|
||||
|
||||
- **Level card:** mint-filled card with "LEVEL" + a big number in a bracket frame and the label 升级. The upgrade cost is a hexagon badge on top. It greys out when you can't afford it.
|
||||
- **Operator card:** dark card, teal 1 px border.
|
||||
- Top-left: tier chip (I–VI, white on black; gold border for V/VI [ASSUMED]).
|
||||
- Top-center: price hexagon badge. Gold number; `#59f4ca` when discounted, `#ff5454` when marked up (`constData.discountColor/premiumColor/normalColor`).
|
||||
- Right: half-body art. Left: a watermark of the first bond's glyph.
|
||||
- Bottom rows: bond icon + bond name(s), then class icon + name.
|
||||
- A frozen card gets an icy-blue overlay and a ❄ at the bottom. A promotion reward shows price **0**.
|
||||
- **Item card:** in 下半 every non-tutorial mode has `itemCount`=1 at every shop level, so one equipment slot is always shown. 入门 has it only from L5, as does the older tip "调度中心会在升至5级后开始售卖装备". Same card shape with an equipment icon and a tier chip.
|
||||
- **Funds card:** hexagon badge with a coin glyph (three stacked gold triangles) and the amount, "目前资金", and **✕ 收起**, which collapses the shop to reveal the bench and board.
|
||||
- **Freeze / refresh:** 冻结 is pale blue with a snowflake; it toggles to 解冻. 刷新 is amber with a cycle icon and a cost badge.
|
||||
- **Deploy interaction:** drag a card or bench unit onto the board. Legal tiles light green, illegal red. While dragging, a red "✕ 点击取消" corner zone appears. Dragging a unit back to the bench retreats it. Selling is a separate sell action [ASSUMED drag onto the funds card]. Equipment: drag onto a unit (board or bench). There is no facing step in auto-chess. [ASSUMED]
|
||||
- **Remaining deploy counter:** "剩余可放置角色: N" = 8 − deployed (`maxBattleChessCnt`).
|
||||
|
||||
### 11.3 Combat [SHOT 05db364c / fc6673cd]
|
||||
|
||||
- The camera zooms in on the lane.
|
||||
- The capsule shows `n/m` kills. Right edge: DP `⊂ 59`.
|
||||
- When finished: bottom-center message pill "⌛ 作战结束,等待队友完成作战", and the view switcher `‹ 自己 ›` (arrows cycle P1…P4).
|
||||
- The bond strip stays visible. No shop.
|
||||
|
||||
### 11.4 联防 [SHOT GwtDIAW]
|
||||
|
||||
- Orange banner "联防阶段" at phase start.
|
||||
- The HUD capsule shows `1/4` kills. The bond strip is dimmed with the tooltip "层数叠加已禁用".
|
||||
- The field is a wide two-half arena. Helpers' operators keep their HP bars and SP.
|
||||
- The view switcher defaults to the 联防 field. Non-helpers can switch to it.
|
||||
- Owners' LP in the left list decrements live as enemies escape.
|
||||
|
||||
### 11.5 机变 draft overlay [SHOT Wrkhtxv / Mb2mtd9 / SEbySVl]
|
||||
|
||||
- A full-width dark translucent overlay over the board. The left player list stays visible.
|
||||
- Title at top-left in large mint-white text with the family name (悬赏决策 / 道具补给 / 机密商店 / 战术决策), then `|`, then the grey description.
|
||||
- Right: "当前轮到你决策" (mint), or "{name} 正在决策… ⌛", plus the countdown.
|
||||
- 3×2 grid of cards (about 23 % × 26 % of the screen each), light grey-glass panels:
|
||||
- icon (enemy portrait, equipment or team-buff tower glyph) and bold title
|
||||
- description with keywords highlighted blue (`ba.vup`: "下场作战", numbers)
|
||||
- an equipment tier chip in the top-left (orange frame, roman numeral)
|
||||
- a taken card turns lighter/greyed and carries the taker's avatar in a round badge at its top-right
|
||||
- Behind the overlay, the funds pill and "可放置角色" remain visible at the right.
|
||||
|
||||
### 11.6 Strategy draft and briefing
|
||||
|
||||
Covered in §4.1–4.2. Both are full-screen dark panels:
|
||||
- a fine scan-line texture
|
||||
- difficulty tag (colored glyph + text) at top-left next to exit/ping
|
||||
- step indicator "**1**/2 确认本局信息" or "**2**/2 选择策略" (big mint numeral)
|
||||
- countdown at top-right
|
||||
- a mint primary button bottom-right (准备就绪 / 确认选择)
|
||||
|
||||
### 11.7 Final Assault [SHOT YRY8ar1]
|
||||
|
||||
- A wide single field seen from above-front with MARTHE-branded barge docks.
|
||||
- The HUD capsule shows `4/9` kills and the boss HP bar (orange, with a boss glyph); the team LP number follows.
|
||||
- The boss has its own red bar under its sprite.
|
||||
- Bottom-center `‹ 全景 ›` switches left half / panorama / right half.
|
||||
- The countdown keeps running. After the 150 s mark, show a red "DOT" warning; team LP drains 1/s (the `hintTimeDotPhase`=10 s warning before that).
|
||||
- The damage-share broadcast ticker is at the top-center.
|
||||
|
||||
### 11.8 Room / matchmaking / result: see §3 and §10.6
|
||||
|
||||
---
|
||||
|
||||
## 12. Visual style guide (for an original look-alike)
|
||||
|
||||
**Palette.** Official hex values come from data; the rest are sampled by eye.
|
||||
|
||||
| Token | Hex | Use |
|
||||
|---|---|---|
|
||||
| bg-0 | #0c0f0e | page and backdrop (near-black green-grey) |
|
||||
| bg-1 | #141816 | panels |
|
||||
| bg-2 | #1e2421 | cards |
|
||||
| line | #2f3a35 | 1 px borders, grid |
|
||||
| mint-500 | #4ed8af [DATA training color] | primary accent, ready buttons, headings |
|
||||
| mint-400 | #59f4ca [DATA discount] | highlights, discounted price |
|
||||
| mint-600 | #35d8b4 [DATA choice text] | secondary accent text |
|
||||
| mint-glow | #17f9b7 [WIKI header] | glows, countdown digits |
|
||||
| gold | #ffc600 [DATA normalColor] | prices, coins, "当前轮到你" |
|
||||
| gold-2 | #f2bd3e [DATA special choice] | special/rare card text |
|
||||
| amber | #f6a329 [DATA 标准] | refresh button, 标准 difficulty |
|
||||
| orange | #e85a1a [DATA 险境] | combat capsule border, 联防 banner, low-time digits |
|
||||
| red | #e73118 [DATA 绝境] / #ff0024 [DATA 终极] / #ff5454 [DATA premium] | danger, exit button, markup |
|
||||
| ice | #9fd4ff [ASSUMED] | freeze button and frozen overlay |
|
||||
| text-hi | #f2f2f2 | primary text |
|
||||
| text-lo | #8a948f | secondary |
|
||||
| Shop-level tag colors (`shopLevelDisplayDataDict`) | L1 #434343, L2 #626654, L3 #445760, L4 #615B74, L5 #6C5E41, L6 #5d341e | level chip background |
|
||||
|
||||
**Typography** (original game: Novecento/Bender-style Latin, Source Han Sans CJK). Our choice [ASSUMED], using freely licensed fonts:
|
||||
- CJK UI: "Noto Sans SC" 400/500/700.
|
||||
- Latin display (microtext "STRONGHOLD PROTOCOL", "LEVEL", "COUNTDOWN"): "Rajdhani" or "Oxanium", uppercase, +8 % tracking.
|
||||
- Countdown and big numerals: a 7-segment font ("DSEG7 Classic", npm `dseg`) or "Share Tech Mono".
|
||||
- Numbers in badges: "Barlow Condensed" 700.
|
||||
|
||||
**Shapes and iconography:**
|
||||
- Rectangles with 1–2 px mint borders and **corner brackets `[ ]`** instead of rounded boxes. Hexagon badges for prices and cost. Circles for bond discs. Chess pieces for trophy levels. A tower (rook) icon for LP.
|
||||
- Diagonal "chevron" arrows (»») for flow. Hazard-stripe accents (yellow/black) only on the physical barge and board props.
|
||||
- Scan-line and noise overlays on panels. Topographic-map and radar-circle decorations on the hub and result screens. Tiny techno labels in 8–10 px caps.
|
||||
- Tier chips use roman numerals I–VI; elite units get a gold outline or glow.
|
||||
|
||||
**Motion:**
|
||||
- Cards slide up from the bottom (shop).
|
||||
- Bond disc rings fill clockwise as stacks grow.
|
||||
- Countdown digits flicker at ≤10 s.
|
||||
- The broadcast ticker slides in from the right. Emote bubbles pop with a 150 ms scale.
|
||||
- Phase banners ("联防阶段", "最终攻势") wipe in horizontally with chevrons.
|
||||
|
||||
**Do not copy:** Arknights logos, the "MARTHE" branding, character art, the exact emote art, or fonts. Build our own glyph set in the same spirit.
|
||||
|
||||
---
|
||||
|
||||
## 13. Implementation notes for our Node authoritative server [ASSUMED design]
|
||||
|
||||
- **Match states:** `LOBBY → BRIEFING(25) → BAND_DRAFT(50) → BOOT(3) → {SP_DRAFT? → PREP → COMBAT → UNITE? → RESOLVE}×N → FINAL → (HIDDEN) → SETTLE`. All timers are server-side; clients only render `deadlineTs`.
|
||||
- **Ready gate:**
|
||||
- `PREP` ends when `every(alive players).ready` or the deadline passes.
|
||||
- Ready is blocked while that player's temp-bench overflow is non-empty.
|
||||
- At the deadline, destroy overflow units, then auto-ready.
|
||||
- **Draft engine** (bands and 机变):
|
||||
- Keep an order array and one `activeSeat`.
|
||||
- Per-turn timer: bands [ASSUMED] 12 s each within the 50 s step; 机变 16 s, 30 s for the first.
|
||||
- Allow one "skip" per player in the band draft (it moves the player to the end of the order).
|
||||
- Timeout → auto-pick: bands → `band_bldsk`; 机变 → a random remaining card.
|
||||
- **Combat:**
|
||||
- Simulate all boards in one tick loop (same seed per round).
|
||||
- Record leaked enemies with `sourcePlayerId`, type, remaining HP [ASSUMED: they re-enter at full HP] and bounty tag.
|
||||
- Then run UNITE on a fresh sim instance with helper snapshots (position, HP %, SP).
|
||||
- **Emotes:** `emote{seat,id}`, rate-limited to 1/s server-side, relayed to all.
|
||||
- **Broadcasts** are server-generated from events.
|
||||
- **Disconnect:**
|
||||
- Keep the seat for the whole match (the real game allows a return "within a period"). While away, the bot policy is "do nothing, auto-ready at deadline, auto-pick drafts".
|
||||
- Offer an **AI takeover** option: a simple buy/merge/deploy heuristic, like the tutorial NPCs (`trainingNpcList` = 华法琳/阿米娅/杜遥夜 bots with 120 trophies).
|
||||
- Reconnect restores the full state snapshot.
|
||||
- **Bots for empty seats:** the real tutorial is a 4-seat match with 3 NPCs. We can reuse that idea to let 1–3 humans play with bots.
|
||||
- **Spectating:** read-only board views of any seat at any time. During FINAL, hide the other pair's field to match the official rule.
|
||||
- **Anti-grief:** report and like at settlement, and the 20 s "重载" cooldown. Optional for us.
|
||||
- **Timer presets:** "Official" (data table) and "Fast" (×0.5 prep, keep combat). Official matches run about 55 min.
|
||||
|
||||
---
|
||||
|
||||
## 14. PvP?
|
||||
|
||||
**No.** 盟约 has no versus mode (confirmed by all sources: official announcements, BWIKI, PRTS, guides). "同盟" means alliance. The teams never fight each other. Indirect competition only:
|
||||
- the shared operator pool ("卡牌/抢牌")
|
||||
- who kills a bounty during 联防
|
||||
- the damage-share broadcasts
|
||||
- the per-match commendations
|
||||
|
||||
---
|
||||
|
||||
## 15. Screenshot / reference URLs (not downloaded; for the UI designer)
|
||||
|
||||
Official:
|
||||
- Official gameplay-intro long image (800×13685; hub, room, matchmaking, briefing, strategy draft, prep/shop, drag-deploy, freeze, promotion, equipment…): https://img.71acg.net/sykb~bbs/pc/1763033996225879 (mirrored from the 11/13 2025 official post "「卫戍协议:盟约」玩法介绍")
|
||||
- Event banners:
|
||||
- https://patchwiki.biligame.com/images/arknights/c/cc/t7tdfvs7j0xpzphw620i2iqi4qoh34v.jpg (下半)
|
||||
- https://patchwiki.biligame.com/images/arknights/0/03/qeasnqofhr3ffa0bhlbbp0j9854smy9.jpg (上半)
|
||||
- Icons:
|
||||
- trophy lvl1: https://patchwiki.biligame.com/images/arknights/9/96/b2qsb5k5jss4gnzox3a6c0b1gv5uy5g.png
|
||||
- team-buff icon: https://patchwiki.biligame.com/images/arknights/4/49/en8v6no3jtgdnvcydolnksu6pflv3co.png
|
||||
- title icon 1: https://patchwiki.biligame.com/images/arknights/2/20/7ltxu8xxexf8nyegz3wrnplfnx28k15.png
|
||||
- emote "合作愉快": https://patchwiki.biligame.com/images/arknights/0/03/rneluobt0fhtix8oy4xp2x33jelzkvn.png
|
||||
|
||||
In-game screenshots (players, CN/TW):
|
||||
- Final Assault HUD (shared field, boss bar, `‹全景›`): https://i.meee.com.tw/YRY8ar1.png
|
||||
- 联防 HUD ("层数叠加已禁用", player list with LP, `‹自己›`): https://i.meee.com.tw/GwtDIAW.png
|
||||
- Briefing 1/2 (leader, special enemies, bonds, 已就绪 2/4): https://i.meee.com.tw/1BJDbxX.png
|
||||
- Strategy draft 2/2 (order list, 决策中): https://i.meee.com.tw/BOzwbwn.png
|
||||
- Enemy preview board: https://i.meee.com.tw/wdRAguq.png
|
||||
- Info dropdown (strategy + bans per bond): https://i.meee.com.tw/9H7Kugy.png
|
||||
- 机变 drafts:
|
||||
- 悬赏决策: https://i.meee.com.tw/Wrkhtxv.png
|
||||
- 机密商店 (with a left player): https://i.meee.com.tw/Mb2mtd9.png
|
||||
- 战术决策: https://i.meee.com.tw/SEbySVl.png
|
||||
- Bond strip: https://i.meee.com.tw/e3UUYq8.png
|
||||
- Emote usage: https://i.meee.com.tw/86HwPAh.png
|
||||
- Countdown turning orange: https://i.meee.com.tw/WcxNEfR.png
|
||||
- Result / personal settlement: https://i.meee.com.tw/rZEmfyJ.png
|
||||
- Roster config 物资调配处: https://i.meee.com.tw/KJGydN0.png
|
||||
- Trophy table (PRTS 上半): https://i.meee.com.tw/LYFkxSZ.png
|
||||
- Prep phase with shop (TW client):
|
||||
- https://truth.bahamut.com.tw/s01/202606/forum/33651/c32edaf6528776921fa0587c77edc291.JPG
|
||||
- https://truth.bahamut.com.tw/s01/202606/forum/33651/4995084674285fdfefc218c7015258c0.JPG
|
||||
- https://truth.bahamut.com.tw/s01/202606/forum/33651/a7a712ab367e8855c5a177dd945464fd.JPG
|
||||
- Combat end, "等待队友完成作战":
|
||||
- https://truth.bahamut.com.tw/s01/202606/forum/33651/05db364c3424cfd55778af95ce5cc077.JPG
|
||||
- https://truth.bahamut.com.tw/s01/202606/forum/33651/fc6673cd4ee25defcc599d17fc5d3f5d.JPG
|
||||
- Stats web page (title hexagon radar): https://truth.bahamut.com.tw/s01/202604/forum/33651/a8947d6e34ee687641d438d4df66235d.JPG
|
||||
- Strategy badges grid: https://truth.bahamut.com.tw/s01/202604/forum/33651/b5db3a1d005cf0b681814a9920b451af.JPG
|
||||
|
||||
---
|
||||
|
||||
## 16. Open questions and assumptions (review before spec freeze)
|
||||
|
||||
1. **联防 helper selection** when 3 or more players are perfect, and the exact 联防 timer. Proposed: highest LP, and the round's combat time.
|
||||
2. **Boss HP scaling** with the number of alive players. Community-confirmed that it shrinks; the formula is unknown. Proposed: linear n/4.
|
||||
3. **Pairing rule** for the Final Assault (seat order vs LP), and the 3-player layout.
|
||||
4. **Strategy draft exclusivity.** Proposed: duplicates allowed. The per-turn time inside the 50 s step is also unknown.
|
||||
5. **机变 pick order.** Screenshots show non-seat order. Proposed: random (alternative: lowest LP first).
|
||||
6. **Title (评语) criteria** (§10.5) are inferred.
|
||||
7. **Disconnect behavior** (idle vs AI) and the co-op reconnect window. The official text says only "一段时间内". Solo is 24 h.
|
||||
8. **`storeCntMax`=6, `singleClosureStayTime`=15, `bossTrailerStartRound`=3, `specialPhaseStayTime`=1:** semantics are unclear. Guesses: max shop cards, the solo result-screen stay, the round from which the boss preview shows, and a 1 s pause between draft picks.
|
||||
9. **Do leaked enemies keep their damage** when entering 联防? Proposed: full HP.
|
||||
10. **Terrain 机变 cards** (`map_m0X`): do they apply to the picker only or to all boards? Proposed: picker only.
|
||||
|
||||
## Sources
|
||||
|
||||
- Official:
|
||||
- https://ak.hypergryph.com/news/5114 (下半 update: fewer-than-4 start, 24 h solo leave, boss both sides with shared HP)
|
||||
- https://ak.hypergryph.com/news/9697
|
||||
- https://ak.hypergryph.com/news/8584
|
||||
- https://ak.hypergryph.com/news/2830 (上半: "和另外三位玩家组队")
|
||||
- BWIKI:
|
||||
- https://wiki.biligame.com/arknights/盟约 (full play rules incl. 联防, 最终攻势, emotes, trophies, tips)
|
||||
- https://wiki.biligame.com/arknights/盟约/S.W.E.E.P.报告
|
||||
- PRTS: https://prts.wiki/w/卫戍协议:盟约_下半 and https://prts.wiki/w/卫戍协议:盟约 (70 %/80 % factors, 16 s/30 s draft, 6-choose-1, hidden core 350/1200, trophy table with 终极)
|
||||
- arknights.wiki.gg:
|
||||
- https://arknights.wiki.gg/wiki/Stronghold_Protocol
|
||||
- https://arknights.wiki.gg/wiki/Stronghold_Protocol_Alliance
|
||||
- Bahamut guides:
|
||||
- https://forum.gamer.com.tw/C.php?bsn=33651&snA=12294
|
||||
- https://forum.gamer.com.tw/C.php?bsn=33651&snA=12316
|
||||
- https://forum.gamer.com.tw/C.php?bsn=33651&snA=12256
|
||||
- https://forum.gamer.com.tw/C.php?bsn=33651&snA=12522
|
||||
- Shared-pool videos: https://www.bilibili.com/video/BV1JWy3BkEpt/ and https://www.bilibili.com/video/BV1ZTUjBaEyy/
|
||||
- Interview: https://www.bilibili.com/video/BV17L9MBXEBY/ (机核 × 大黄, design background)
|
||||
- Data: `activity_table.json` (`autoChessData`, `act2autochess`), `levels/act1autochess/*escaped*`, `h07_*`, `display_meta_table.json` (saved to `scratchpad/gd/extra/multiplayer/`)
|
||||
|
||||
---
|
||||
|
||||
## Addendum (critic)
|
||||
|
||||
Written 2026-09-27 by the completeness critic. Sources: the official gameplay-intro long image (`img.71acg.net/sykb~bbs/pc/1763033996225879`, sliced in `scratchpad/gd/extra/critic/intro_*.jpg`), PRTS `卫戍协议/帮助`, PRTS `卫戍协议:盟约_下半` §开始模拟, BWIKI `盟约`, and a re-read of the §15 screenshots.
|
||||
|
||||
### D1. Corrections to the TL;DR
|
||||
|
||||
| # | Was | Now |
|
||||
|---|---|---|
|
||||
| 3 | "HP/ATK ×0.70 solo, ×0.80 co-op" | Too coarse. The multiplier depends on **mode and round**. 标准/险境 co-op start at 0.8; 绝境/终极 co-op start at 1.1¹/1.2¹ and grow to 1.1⁸/1.2⁸ by R14. Full table: 01 Addendum A3. |
|
||||
| 4 | band draft | Confirmed: "以随机顺序进行策略轮选,顺序会显示在左侧". **All unlocked strategies are shown** (not a random 3). **Duplicates are allowed:** in the official illustration, the strategies already taken by P1/P2 are not greyed in P3's grid. One skip per player. |
|
||||
| 6 | solo "unlimited" | Confirmed by BWIKI (下半): "休整期及机变阶段没有时间限制…24小时内随时返回". |
|
||||
| 8 | 机变 | Funds for the round are already granted when the overlay opens: the funds pill reads 13/11/17 behind the three screenshots. The family (悬赏 / 道具补给 / 机密商店 / 战术决策) is the **same for all 6 cards** of one phase. Pick order is **not** seat order. Recommended per-round families: 01 Addendum A4. |
|
||||
| 10 | 联防 | Confirmed: "所有防卫成功的玩家(最多2名)将以其阵地当前的状态,迎接所有防卫失败玩家未击倒敌人的集合". Helpers keep "生命比例、技力、部署位置". |
|
||||
| 12 | Final Assault pairing | Players are paired, and **an odd player forms a group alone** ("如有落单的玩家将单独成组"). Movable leaders spawn **one per alive player's side**, all sharing HP. The HP pool is excluded from the round multipliers. The official intro shows R4 of the tutorial with a merged LP of 105 = 45 + 20 + 20 + 20. |
|
||||
| 15 | gifting | Unchanged: 信标 is the only operator transfer. |
|
||||
| new | – | **Per-match banned operators are shown to everyone.** At briefing: core and add-on rows with greyed bonds carrying the badge "部分盟约所含干员阵容不完整", plus a 本局禁用干员 portrait list. In match: the info dropdown shows "本局禁用干员情况" with a red person-✕ badge = number of banned operators in each bond. Rule: 01 Addendum A2. The pool is **shared**, so bans apply to the whole team. |
|
||||
|
||||
### D2. Answers to §16 open questions
|
||||
|
||||
1. **Helper selection (>2 perfect):** still unpublished. Keep "highest LP, then seat". The timer is the round's `maxPlayTime`.
|
||||
2. **Boss HP vs player count:** still unpublished. What is known: bloodPoint is one pool, it is unaffected by multipliers, and each alive player has their own boss spawn. Keep `bloodPoint × alive/4`, with a solo value of 0.25 [ASSUMED].
|
||||
3. **Pairing:** odd player alone (verified). Pair order: seats (1,2) and (3,4) among alive players [ASSUMED].
|
||||
4. **Strategy exclusivity:** allowed duplicates (official illustration). Per-turn timer [ASSUMED] 12 s.
|
||||
5. **机变 pick order:** random per phase (screenshots). "Lowest LP first" is not supported by any evidence.
|
||||
8. **`storeCntMax` = 6** = 5 operator slots + 1 item slot at L4–L6. That reading is consistent with `shopLevelDataDict`.
|
||||
9. **Leaked enemies in 联防:** unknown. Keep "full HP" [ASSUMED].
|
||||
10. **Terrain cards:** picker only [ASSUMED]. Terrain cards exist only for the current stage (`terrain_m0X`).
|
||||
|
||||
### D3. UI facts read from the screenshots
|
||||
|
||||
- **Prep:**
|
||||
- The shop bar holds, in order: `LEVEL n` card (upgrade cost hexagon on top), operator cards, the item card in 下半, and the funds card with "✕ 收起".
|
||||
- A frozen shop tints **all** cards icy and the button toggles to "解冻".
|
||||
- Reward cards after a merge show **price 0** with the next tier's chip.
|
||||
- Above the buttons, "剩余可放置角色: N" = cap − deployed. The cap is 9 with 人事部文档.
|
||||
- **Combat:**
|
||||
- The capsule shows `killed/total`. The DP counter sits at the right edge.
|
||||
- The bond strip stays visible. In 联防 and the boss round it carries the tooltip "层数叠加已禁用".
|
||||
- **Final Assault:** eliminated seats show a grey robot "x-eyes" avatar in the left list. The view switcher reads `‹ 全景 ›`.
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,478 @@
|
||||
# 07 — Art and audio assets: sources, feasibility and the final plan
|
||||
|
||||
Scope: every art and audio asset the fan remake of **卫戍协议:盟约 (act2autochess)** needs, with **URL patterns that have been checked**, measured hit rates, file sizes and fallbacks.
|
||||
Machine-readable companion: **`docs/research/07-assets.json`**. It maps every id to resolved URLs and byte sizes: 138 operators, 20 tokens, 200 enemies, 23 bonds, 59 shop items, 40 bands, the UI sprite groups and the audio banks.
|
||||
**All 4,451 unique URLs in that JSON were HEAD-checked on 2026-09-27 and returned `200`.**
|
||||
|
||||
Probe artifacts are in the scratchpad at `…/scratchpad/gd/extra/assets/`:
|
||||
- Git-tree listings: `y_*.txt`, `fx_spine.txt`, `am_enemies.txt`, `aa2_*.txt`, `aa2v_*.txt`.
|
||||
- Id lists: `charids.txt`, `enemyids.txt`, `tokenids.txt`, `trapids.txt`.
|
||||
- Spine sample: `spine_sample/`.
|
||||
- Browser render proof: `spine_test.png`, produced from `spine_test.html`.
|
||||
- Generator script: `gen_assets_json.py`.
|
||||
|
||||
---
|
||||
|
||||
## 0. TL;DR: the final plan
|
||||
|
||||
| Class | Source (primary) | Pattern | Hit rate (pool) | Typical file | Fallback |
|
||||
|---|---|---|---|---|---|
|
||||
| a) Avatar (square) | yuanyan3060/ArknightsGameResource `avatar/` | `{charId}.png`, E2: `{charId}_2.png` | **138/138**; E2 122/138 | 180×180 PNG, ~58 KB | E2 missing → base `{charId}.png` (the 16 misses are the 预备干员/Sharp/Pith/… `char_60x/61x` ids that have no E2 art) |
|
||||
| b) Half-body portrait | same repo `portrait/` | `{charId}_1.png`, E2 `_2.png` | **138/138**; E2 122/138 | 180×360 PNG, ~117 KB | `_1` |
|
||||
| b') Full art (detail panel only) | same repo `skin/` | `{charId}_1b.png`, E2 `_2b.png` | 138/138; E2 122/138 | 681×1317, ~0.8 MB (E2 ~3.2 MB) | portrait `_1`; lazy-load only |
|
||||
| c) Skill icon | same repo `skill/` | `skill_icon_{skill.iconId ?? skillId}.png` (percent-encode `[` `]`) | **317/317** (all skills of pool operators; 144 are default skills) | 128×128, ~19 KB | `arts/ui/[uc]charcommon/skills/empty_skill.png` |
|
||||
| d) Profession / sub-profession | ArknightsAssets/ArknightsAssets2 `@cn` `assets/dyn/arts/…` | `profession_hub/icon_{prof}.png`, `ui/subprofessionicon/sub_{subProfessionId}_icon.png` | 8/8, **58/58** | ~12 KB / ~2 KB | battlecard `icon_profession_*.png` |
|
||||
| e) Enemy icon | yuanyan `enemy/` | `{enemyId}.png` | **200/200** | ~158×158, ~44 KB | none needed |
|
||||
| f) **Bond icons: the real autochess ones** | AA2 `ui/autochess/[uc]autochesscommon/arts/bondicon/` | `{iconId.toLowerCase()}.png`, e.g. `icon_yanship.png` | **23/23** | ~110×98 white glyph, ~4 KB | `arts/camplogo/logo_{nation}.png` (see §4) |
|
||||
| g) **Item / trap icons: the real autochess ones** | AA2 `…/arts/shopitemicon/` | `{trapId}.png` | **59/59** (56 EQUIP + 3 MAGIC) | ~137×157, ~19 KB | none needed |
|
||||
| g') Band (strategy) icons | AA2 `…/arts/bandicon/` | `icon_{bandId minus "band_"}.png` | **40/40** | 180×180, ~69 KB | — |
|
||||
| h) Map tiles | **none usable**: the game map is a 3D Unity scene | — | — | — | **Draw tiles procedurally** (§7). Use real autochess backdrops for the lobby and prep screens. |
|
||||
| i) UI: rarity, elite, chess-level, shop, HUD | AA2 `ui/autochess/…` (537 PNGs) + `arts/rarity_hub`, `elite_hub` | see JSON `autochessUi`, `arts` | 100% | 0.3–250 KB | CSS-drawn panels (Unity 9-slice borders are not in the dump) |
|
||||
| j) Fonts | Google Fonts + self-hosted Bender / Novecento | §8 | — | — | system CJK |
|
||||
| k) BGM + SFX: **the real game audio** | AA2 `@voice` branch `assets/dyn/audio/sound_beta_2/…` | mapped by `audio_data.json` banks | BGM 3/3; per-operator SFX **138/138**; enemies 185/200; autochess UI SFX 47 banks | mp3; BGM ~2 MB, SFX 5–60 KB | WebAudio-synthesized blips (§6.4) |
|
||||
| l) **Battle Spine (in-battle chibi)** | operators: **fexli/ArknightsResource `spine/`**; enemies: **isHarryh/Ark-Models `models_enemies/`** | `spine/{id}/{id}/{Front\|Back}/{id}.{skel,atlas,png}`; enemies via `models_data.json` `assetList` | ops Front **138/138**, Back 135/138; enemies **198/200** | median op front+back ≈ 690 KB; enemy ≈ 134 KB | missing Back → mirrored Front; missing enemy → static icon sprite (§5.6) |
|
||||
| Spine runtime | **PixiJS 7.4.2 + pixi-spine 4.0.6** (UMD from jsDelivr) | — | render checked in headless Chrome | 456 KB + 362 KB | — |
|
||||
|
||||
**Size budget, all classes, only what the pool needs**
|
||||
|
||||
| | Size |
|
||||
|---|---|
|
||||
| Raw | ≈ 200 MB (≈ 700 MB if full art is included, so leave full art out of the bundle) |
|
||||
| After build-time optimization | **≈ 65–75 MB**: WebP for images, gzip/brotli for skel |
|
||||
| Initial page load (lazy-loading Spine per board) | **< 6 MB** |
|
||||
|
||||
---
|
||||
|
||||
## 1. Id inventory (from `act2autochess`)
|
||||
|
||||
| Set | Count | Notes |
|
||||
|---|---|---|
|
||||
| Operators (`charShopChessDatas[*].charId ∪ backupCharId`) | **138 unique charIds** over 133 chess | 74 PRESET, 55 NORMAL, 4 DIY. DIY chess have `charId=null`, so the operator is chosen at runtime and uses the chosen operator's assets. Chess levels 1–6: 20/19/21/26/25/22. |
|
||||
| Most chess are `evolvePhase=PHASE_2` | 94 PHASE_2 (+ 39 PHASE_1) non-golden; every golden chess is PHASE_2 | → Prefer **E2 avatar/portrait** (`_2`) and fall back to `_1`. |
|
||||
| Tokens/summons referenced by pool operators | 20 | `displayTokenDict` and `overrideTokenKey`. Bond summon "炎佑" (Yan 6/9) has no token id in the data, see §5.6. |
|
||||
| Enemies | **200** | Union of `enemyInfoDict`, `specialEnemyInfoDict`, `bossInfoDict`-linked ids and level files. All 200 are in `enemy_handbook_table`. |
|
||||
| Bonds | 23 | `bondInfoDict[*].iconId`: `icon_yanShip` … `icon_suntShip` |
|
||||
| Shop items | 59 | `trapShopChessDatas[*].trapId` = `trap_10xx_acarmNNN` and friends |
|
||||
| Bands (strategies) | 40 | `bandDataListDict` keys `band_*` |
|
||||
| Sub-professions in pool | 58 | e.g. `fastshot`, `protector`, `ritualist`, `primprotector`, `counsellor`, `hunter`… |
|
||||
| Nations in pool | 18 + None | bolivar, columbia, egir, higashi, iberia, kazimierz, kjerag, laterano, leithanien, lungmen, rhodes, rim, sami, sargon, siracusa, ursus, victoria, yan |
|
||||
|
||||
Newest operators in the pool, all verified present in every class: `char_4211_snhunt` 雪猎, `char_4207_branch` 折桠, `char_4196_reckpr` 录武官, `char_4194_rmixer` 信仰搅拌机, `char_4193_lemuen` 蕾缪安, `char_4191_tippi` 蒂比, `char_1047_halo2` 溯光星源, `char_1046_sbell2` 圣聆初雪, `char_1045_svash2` 凛御银灰, and the activity-only `char_616_pithst` 盟约·辅助干员 and `char_617_sharp2` 领主·Sharp.
|
||||
|
||||
---
|
||||
|
||||
## 2. Sources evaluated
|
||||
|
||||
| Repo | Branch | Updated | What it has | Verdict |
|
||||
|---|---|---|---|---|
|
||||
| `yuanyan3060/ArknightsGameResource` | `main` | 2026-09-24 | avatar (incl. `token_*`, non-autochess `trap_*`), portrait, skin (full art `b`), skill, enemy, item, item_rarity_img, map (not autochess) | **Primary for 2D portraits and icons.** AGPL-3.0 applies to its code; the art is © Hypergryph. |
|
||||
| `ArknightsAssets/ArknightsAssets2` | `cn` (art), `voice` (all audio) | 2026-09-23 | Full ArknightsStudio dump: `assets/dyn/ui/autochess/**` (real autochess UI), `activity/[uc]act2autochess/**`, `arts/**` (camplogo, profession, rarity, elite, subprofession, loading illustrations), `battle/[pack]common/**`, and all audio under `@voice` | **Primary for autochess-specific icons, UI and ALL audio.** Battle spine here is incomplete: atlas/skel without PNGs. |
|
||||
| `fexli/ArknightsResource` | `main` | 2026-09-20 | `spine/{charId}/{charId}/{Front,Back}/` battle models + base (`build_*`) models + skins; `camplogo`, `charpor`, `skills`… | **Primary for operator battle Spine** |
|
||||
| `isHarryh/Ark-Models` | `main` | 2026-08-02 | `models_enemies/` enemy battle Spine (PC build, PMA forced), `models/` base (基建) chibis only, `models_illust/` dynamic illustrations; `models_data.json` index | **Primary for enemy battle Spine.** Its operator models are base chibis, not battle chibis. |
|
||||
| `Aceship/Arknight-Images` | `main` | **2024-05** (stale) | avatars etc. | Hit rate **89/138**. It lacks every 2024+ operator. Not recommended. |
|
||||
| PRTS `media.prts.wiki/{md5[0]}/{md5[0:2]}/{文件名}` | — | live | e.g. `头像_德克萨斯.png` returns 200 | Last-resort fallback only: Chinese-name keyed, and hotlinking is discouraged. `torappu.prts.wiki` timed out from this host. |
|
||||
| `web.hycdn.cn` (official CDN) | — | — | guessed avatar path → 404 | not usable |
|
||||
| `TimWangZi/The-font-of-Arknights` | `master` | — | Bender, Novecento Wide, 思源宋体 | font source (§8) |
|
||||
|
||||
**CDN behaviour, all checked**
|
||||
- `raw.githubusercontent.com` returns `access-control-allow-origin: *` with `cache-control: max-age=300`.
|
||||
- `cdn.jsdelivr.net/gh/<repo>@<branch>/…` works with CORS `*` and a 7-day cache for yuanyan, fexli, Ark-Models and AA2 `@cn`.
|
||||
- **jsDelivr returns 404 for the AA2 `@voice` branch.** Use raw for audio.
|
||||
- Do **not** hotlink at runtime (GitHub rate limits, availability, and it is impolite). **Mirror at build time** (§9).
|
||||
|
||||
**Path gotchas**
|
||||
- `[uc]` → `%5Buc%5D` and `[pack]` → `%5Bpack%5D`.
|
||||
- Skill icons such as `skill_icon_skcom_atk_up[1].png` need `%5B1%5D`. curl's globbing also breaks on unencoded brackets.
|
||||
- Skin ids contain `#` → `%23`. Skins are not needed.
|
||||
- Bond `iconId` is camelCase in data (`icon_yanShip`) but **lower-case on disk** (`icon_yanship.png`).
|
||||
- Band icon = `icon_` + bandId minus `band_`.
|
||||
- Liskarm's default battle model lives at `spine/char_107_liskam/char_107_liskarm/…`, a dump-side typo.
|
||||
- `char_1012_skadi2` has a single `Spine/` folder instead of `Front/` and `Back/`.
|
||||
- Enemy spine filenames can differ from the folder name: `1043_zomsbr/enemy_1043_zomsabr.*`, `1169_duphlx/enemy_1169_duphx.*`. **Always use `models_data.json → data[key].assetList`.** `07-assets.json` already resolves this.
|
||||
|
||||
---
|
||||
|
||||
## 3. 2D portraits and icons (classes a–e, i)
|
||||
|
||||
### a) Avatars
|
||||
- URL: `https://raw.githubusercontent.com/yuanyan3060/ArknightsGameResource/main/avatar/{charId}.png`
|
||||
- E2 variant: `{charId}_2.png`.
|
||||
- Mirror: `https://cdn.jsdelivr.net/gh/yuanyan3060/ArknightsGameResource@main/avatar/…`.
|
||||
- Checked by curling all 138 charIds (xargs -P16): **138/138** 200. E2 variant: 122/138.
|
||||
- The 16 without E2 are `char_600_cpione, 601_cguard, 602_cdfend, 603_csnipe, 604_ccast, 605_cmedic, 606_csuppo, 607_cspec, 608_acpion, 609_acguad, 610_acfend, 611_acnipe, 612_accast, 613_acmedc, 614_acsupo, 615_acspec`. They have no E2 art in-game, so use the base image.
|
||||
- Size 180×180 RGBA, avg 58 KB (8.4 MB for the set, preferring E2). WebP q88 comes to about 15 KB each.
|
||||
- Tokens: `avatar/{tokenId}.png` hits **15/20**.
|
||||
- Missing: `token_10012_rosmon_shield`, `token_10039_ulpia_block`, `token_10040_siege2_vlion`, `token_10057_svash2_eagle`, `token_10058_sbell2_icetgt`.
|
||||
- Fallback: owner operator avatar with a small "召唤物" badge, or the battlecard `icon_profession_token.png`.
|
||||
|
||||
### b) Portraits
|
||||
- `…/portrait/{charId}_1.png` (E2 `_2.png`), 180×360 半身像 (the squad-card crop used on shop cards). **138/138**; E2 122/138. Avg 117 KB, about 31 KB as WebP q88.
|
||||
- Full art `…/skin/{charId}_1b.png` is 681×1317, avg 787 KB; E2 `_2b` averages 3.2 MB. Use it only in the operator detail modal, lazy-loaded. Keep it out of the bundle; fetch on demand from jsDelivr.
|
||||
|
||||
### c) Skill icons
|
||||
- `…/skill/skill_icon_{iconId}.png`, where `iconId = skill_table[skillId].iconId ?? skillId`. **317/317** (every skill of every pool operator, after percent-encoding brackets). 128×128, avg 19 KB.
|
||||
- The shop only shows the chess's default skill (`defaultSkillIndex`), which is 144 distinct icons (≈ 2.7 MB raw).
|
||||
|
||||
### d) Profession and sub-profession
|
||||
- `https://raw.githubusercontent.com/ArknightsAssets/ArknightsAssets2/cn/assets/dyn/arts/profession_hub/icon_{caster|medic|pioneer|sniper|special|support|tank|warrior}.png`
|
||||
- Large white variant: `profession_large_hub/icon_profession_{p}_large_white.png`.
|
||||
- Small battle-card variant: `arts/ui/[uc]battlecommon/ui_battle_new/battlecard/icon_profession_{p}.png`, which also includes `…_token.png`.
|
||||
- Sub-profession: `…/arts/ui/subprofessionicon/sub_{subProfessionId}_icon.png`. **58/58**, ~2 KB white glyphs.
|
||||
|
||||
### e) Enemies
|
||||
- `…yuanyan…/enemy/{enemyId}.png`, **200/200**, avg 44 KB.
|
||||
- The boss HP-bar portrait style exists as `arts/ui/[uc]battlecommon/ui_battle_new/enemybossinfo/…` for only a few bosses. Use the enemy icon inside `sprite_enemy_boss_avatar_bg.png`.
|
||||
|
||||
### i) Rarity, elite and misc UI (all 200)
|
||||
- Rarity stars: `arts/rarity_hub/rarity_{0..5}.png`, plus `rarity_yellow_{i}`, `rarity_black_{i}` and `rarity_left_{i}`.
|
||||
- Autochess-specific: `ui/autochess/[uc]autochessouter/arts/charraritysprite/rarity_{0..5}.png`.
|
||||
- Elite icons: `arts/elite_hub/elite_{0..3}.png`, `_large`, `_card`.
|
||||
- Autochess `eliteIconId` values (`shopCharChessInfoData[*].eliteIconId`) map to `…/[uc]autochessouter/arts/charelitesprite/{char_elite_base_1|char_elite_base_2|char_elite_gold_2}.png`. Also available: `char_elite_detail_*`.
|
||||
- Chess tier (等阶 1–6): `…/chesslevelsprite/chess_level_icon_{0..6}.png`, `chess_level_detail_{0..6}.png`.
|
||||
- Shop card: `…/autochess_shop_card_item/img_chess_level_{1..6}.png`, `frame_lv{1..3}.png`, `bg_common.png`, `ice_matte.png` (frozen), `icon_ice.png`.
|
||||
- Shop level (调度中心): `…/shoplevelsprite/shop_level_icon_{1..6}.png`, `shop_level_tag_{1..6}.png` (150×595 vertical banners). Tag bg colours in data: `#434343, #626654, #445760, #615B74, #6C5E41, #5d341e`.
|
||||
- Garrison (特质) type icons: `…/garrisontypeicon/{icon_battle|icon_bond|icon_gold|icon_support}.png`, plus `s_` small versions. These match `garrisonDataDict[*].eventTypeIcon`.
|
||||
- Mode icons `mode_{normal|hard|abyss|funny|training}_icon.png`. Buff icons `icon_{boss_debuff|enemy_debuff|player_buff|stage_buff|team_buff}.png`, matching `effectDecoIconId`.
|
||||
- Title icons `comment_icon_{1..6}.png` (playerTitle `picId`). Trophies `trophy_level{1..5}_icon.png`. Enemy-type icons `{fly|times|dot|element|invisible|reflection|special}_icon.png`, matching `enemyInfoDict` keys.
|
||||
- Bond board pips: `…/[uc]autochessbattle/arts/bondboardicon/{n}_{k}.png` (1_0 … 4_4).
|
||||
- HUD: `…/hud/autochess_hud_panel/*.png` (55 files: `icon_hp`, `icon_battle`, `icon_boss`, `icon_coop`, `icon_rest`, `hp_bar`, `bg_*`…).
|
||||
- Shop: `…/shop/autochess_shop/*.png` (`refresh_icon`, `frozen_icon`, `upgrade_max`, `bg_money`, `cost_free`…).
|
||||
- Equip slot: `…/act2autochess_equip_slot_panel/*.png`. Round banner: `…/dialog/round_start_dialog/*.png`.
|
||||
- Loading illustrations (1920-class, ~0.9 MB each): `arts/loadingillusts/loading_ac_{core|normal|hard|abyss|funny|prototype|train|training}.png`.
|
||||
- `modeDataDict.loadingPicId` values such as `loading_AC_core` → lower-case the id.
|
||||
- Lobby / backdrop art:
|
||||
- `activity/[uc]act2autochess/prefabs/act2autochess_activity_stage/{entry_bkg_01,entry_bkg_02,bkg_01,bkg_02,bg_mountains_tiled,season_logo,img_coin}.png`.
|
||||
- Mode select: `ui/autochess/[uc]autochessouter/modechoice/auto_chess_mode_choice_state/{normal,hard,abyss,funny}_rhodes_island.png`.
|
||||
- Battle ready: `…/battleready/auto_chess_battle_ready_state/{bg_mountain1,bg_mountain2,bg_terrain,rhodes}.png`.
|
||||
- Battle common sprites: `battle/[pack]common/sprites/{sprite_shadow,sprite_direction_arrow,sprite_direction_ring,sprite_box_shadow}.png` and `…/projectiles/projectile_arrow.png`.
|
||||
- Battle UI: `arts/ui/[uc]battlecommon/ui_battle_new/{btn_speed_1x,btn_speed_2x,btn_pause,slider_hp_back,slider_hp_fill,sprite_skill_ready…}.png`.
|
||||
- Caveat: Unity sprite 9-slice borders are not in the dump. Use the art for icons, badges and backdrops, and draw frames and panels in CSS or canvas.
|
||||
|
||||
---
|
||||
|
||||
## 4. Bond icons (f): the real ones are available
|
||||
|
||||
`https://raw.githubusercontent.com/ArknightsAssets/ArknightsAssets2/cn/assets/dyn/ui/autochess/%5Buc%5Dautochesscommon/arts/bondicon/{iconId lowercased}.png`
|
||||
All 23 are verified: white glyphs on transparent, so tint via CSS `filter` or canvas `globalCompositeOperation='source-in'`. Nation fallbacks come from `arts/camplogo/logo_{id}.png` (44 logos, 20–110 KB). The non-nation fallbacks below are [ASSUMED] suggestions.
|
||||
|
||||
| bondId | Name | Real icon file | Bytes | Fallback |
|
||||
|---|---|---|---|---|
|
||||
| yanShip | 炎 | `icon_yanship.png` | 5466 | camplogo/logo_yan.png |
|
||||
| sargonShip | 萨尔贡 | `icon_sargonship.png` | 2845 | camplogo/logo_sargon.png |
|
||||
| victoriaShip | 维多利亚 | `icon_victoriaship.png` | 4267 | camplogo/logo_victoria.png |
|
||||
| kjeragShip | 谢拉格 | `icon_kjeragship.png` | 5255 | camplogo/logo_kjerag.png |
|
||||
| lateranoShip | 拉特兰 | `icon_lateranoship.png` | 4725 | camplogo/logo_laterano.png |
|
||||
| egirShip | 阿戈尔 | `icon_egirship.png` | 4715 | camplogo/logo_egir.png |
|
||||
| siracusaShip | 叙拉古 | `icon_siracusaship.png` | 6956 | camplogo/logo_siracusa.png |
|
||||
| kazimierzShip | 卡西米尔 | `icon_kazimierzship.png` | 4288 | camplogo/logo_kazimierz.png |
|
||||
| preciShip | 精准 | `icon_preciship.png` | 4872 | sub_fastshot_icon |
|
||||
| swiftShip | 迅捷 | `icon_swiftship.png` | 3675 | icon_profession_pioneer |
|
||||
| skillfulShip | 灵巧 | `icon_skillfulship.png` | 4166 | sub_executor_icon |
|
||||
| arcaneShip | 奥术 | `icon_arcaneship.png` | 4114 | icon_profession_caster |
|
||||
| steadShip | 坚守 | `icon_steadship.png` | 2702 | icon_profession_tank |
|
||||
| deputShip | 助力 | `icon_deputship.png` | 3726 | icon_profession_support |
|
||||
| visiShip | 远见 | `icon_visiship.png` | 3451 | garrisontypeicon/icon_gold |
|
||||
| miraShip | 奇迹 | `icon_miraship.png` | 4945 | garrisontypeicon/icon_gold (tinted) |
|
||||
| investShip | 投资人 | `icon_investship.png` | 2058 | garrisontypeicon/icon_gold |
|
||||
| raidShip | 突袭 | `icon_raidship.png` | 2982 | sub_executor_icon |
|
||||
| indomShip | 不屈 | `icon_indomship.png` | 3439 | sub_unyield_icon |
|
||||
| maniShip | 调和 | `icon_maniship.png` | 3124 | garrisontypeicon/icon_bond |
|
||||
| emptyShip | 协防干员 | `icon_emptyship.png` | 2762 | battlecard icon_profession_token |
|
||||
| soloShip | 独行 | `icon_soloship.png` | 2169 | sub_lord_icon |
|
||||
| suntShip | 绝技 | `icon_suntship.png` | 3366 | elite_hub/elite_2.png |
|
||||
|
||||
Band / strategy icons (g'): `…/[uc]autochesscommon/arts/bandicon/icon_{bldsk|amiya|duyaoy|sarkazb|orchid|justin|ermengard|lmlee|kirara|pepe|harold|sciurus|paganini|clementia|emperor|mberry|humus|quintus|yu|doberm|cathy|malkie|qalaisa|chen|damaztic|pith|dusk|cannot|ducklord|lisa|vodfox|ioleta|jesica|mlyss|makiri|fang|mlynar|chiave|narant|amedic}.png`. All **40/40** are 180×180 "STRATEGY" cards, ~69 KB each.
|
||||
|
||||
## 5. Items / traps (g)
|
||||
`…/[uc]autochesscommon/arts/shopitemicon/{trapId}.png`, **59/59**, ~137×157 on a transparent background, avg 19 KB, e.g. `trap_1041_acarm041` 维式重锤.
|
||||
- The 3 non-shop special traps are effect ids with no icons: `trap_copy_front_char`, `trap_create_self_choice`, `trap_disney_special`. Use the icon of the item that grants them.
|
||||
- Rarity backgrounds for item frames: yuanyan `item_rarity_img/sprite_item_r{1..6}.png`.
|
||||
- Level-placed traps (`trap_1104_aclasert`, `trap_1105_accrate`, `trap_1112_acblzd`, `trap_098_mire`, `trap_013_blower`, `trap_042_tidectrl`) have no autochess icon. Draw them as tile overlays.
|
||||
|
||||
---
|
||||
|
||||
## 5b. Battle Spine (l): the real in-battle animated chibis
|
||||
|
||||
### 5.1 Sources and verification
|
||||
- **Operators (fexli):** `https://raw.githubusercontent.com/fexli/ArknightsResource/main/spine/{charId}/{charId}/{Front|Back}/{charId}.{skel|atlas|png}`
|
||||
- jsDelivr: `https://cdn.jsdelivr.net/gh/fexli/ArknightsResource@main/spine/…`.
|
||||
- **Front 138/138. Back 135/138**: missing for `char_4134_cetsyr` 魔王, `char_291_aglina` 安洁莉娜 and `char_1012_skadi2` 浊心斯卡蒂. Skadi2 has one model in a `Spine/` folder. These are supporters that are often shown only from the front.
|
||||
- One texture page per model.
|
||||
- **Enemies (Ark-Models):** `https://raw.githubusercontent.com/isHarryh/Ark-Models/main/models_enemies/{enemyId minus "enemy_"}/{assetList[.skel|.atlas|.png]}`. **198/200.**
|
||||
- Missing: `enemy_1305_mhslim(_2)`. AA2 has its atlas and skel but not its PNG.
|
||||
- **Sample downloaded:** `char_102_texas` Front and Back plus `enemy_1007_slime` → `…/scratchpad/gd/extra/assets/spine_sample/`.
|
||||
- Texas Front: skel 187,826 B, atlas 4,903 B, png 65,126 B (512×512).
|
||||
- Texas Back: 73,065 / 3,346 / 47,290 B (256×256).
|
||||
- Slime: 16,567 / 552 / 11,659 B (128×128).
|
||||
- **Skel header:** read with a varint-string parser, and again with the pixi-spine 3.8 `SkeletonBinary` in Node. Every sampled file reports **version `3.8.99`**: 11 operators and 5 enemies.
|
||||
- **Browser proof:** headless Chrome rendered Texas Front (Attack_Loop), Texas Back, 雪猎 Front and enemy “自在” (`enemy_1517_xi`, boss) with PixiJS 7.4.2 and pixi-spine 4.0.6 loaded **directly from jsDelivr**, with no errors. Screenshot: `…/scratchpad/gd/extra/assets/spine_test.png`.
|
||||
|
||||
### 5.2 Sizes
|
||||
|
||||
| Set | Raw | Optimized (skel+atlas gzip ≈ 24%, PNG → lossless WebP ≈ 50%) |
|
||||
|---|---|---|
|
||||
| Operators Front (138) | skel 44.3 + png 20.6 + atlas 1.2 = 66 MB | — |
|
||||
| Operators Back (135) | skel 24.6 + png 16.7 + atlas 0.8 = 42 MB | — |
|
||||
| **Operators total** | **108 MB**; median op 690 KB; max `char_427_vigil` 3.1 MB | **≈ 36 MB** |
|
||||
| **Enemies (198)** | skel 14.9 + png 11.1 + atlas 0.5 = **26.6 MB**; avg 134 KB | **≈ 9 MB** |
|
||||
|
||||
Gzip measurements: texas skel 188 KB → 46 KB; snhunt 659 KB → 122 KB; ghost2 933 KB → 184 KB. A texas 512² PNG goes from 65 KB to 31 KB as lossless WebP.
|
||||
**Estimate for 133 ops + 60 enemies on one server: about 110 MB raw, about 38 MB served.** A client only downloads the models on its board or in its shop, typically 10–25 models = 5–15 MB.
|
||||
|
||||
### 5.3 Runtime: use pixi-spine, not official spine-ts 3.8
|
||||
- CDN:
|
||||
- `https://cdn.jsdelivr.net/npm/pixi.js@7.4.2/dist/pixi.min.js` (456 KB)
|
||||
- `https://cdn.jsdelivr.net/npm/pixi-spine@4.0.6/dist/pixi-spine.js` (362 KB, UMD → `PIXI.spine`, auto-detects 3.7/3.8/4.0/4.1)
|
||||
- Or `@pixi-spine/all-3.8@4.0.6/dist/pixi-spine-3.8.js` (148 KB) for a 3.8-only build.
|
||||
- npm: `pixi.js@7`, `pixi-spine@4.0.6`. pixi-spine 4 needs PixiJS **7**, not 8.
|
||||
- Load with `PIXI.Assets.load(url.skel)`. The `.atlas` and `.png` must sit next to it with the same basename. Then `new PIXI.spine.Spine(res.spineData)` and `spine.state.setAnimation(0, name, loop)`.
|
||||
- **Why not official spine-ts 3.8** (`cdn.jsdelivr.net/gh/EsotericSoftware/spine-runtimes@3.8/spine-ts/build/spine-webgl.js`, reachable):
|
||||
1. Its atlas parser only treats `rotate: true|90` as rotated. **Arknights atlases use `rotate: 270`** (seen in ghost2 and ulpia), so those regions render wrong.
|
||||
2. The fexli atlases **omit the `size:` line**. pixi-spine falls back to the real texture size; spine-ts 3.8 divides by page width 0.
|
||||
- Atlas quirks to normalize at build time:
|
||||
- Insert `size: W,H` after the page name, read from the PNG.
|
||||
- If PNGs are converted to WebP, rename the page line.
|
||||
- **Alpha:**
|
||||
- fexli operator textures are **straight alpha**: a 512² texas texture has 193 pixels with RGB > A, up to 108 over. Load them normally.
|
||||
- Ark-Models enemy textures are **premultiplied** (README: "强制启用 PMA"; slime has 1 violation of ≤2). Add a `pma: true` page line to those atlases (pixi-spine honours it and sets `ALPHA_MODES.PMA`), or set `baseTexture.alphaMode = PIXI.ALPHA_MODES.PMA`. Otherwise edges come out dark.
|
||||
- Licensing note: pixi-spine is MIT, but it embeds Spine Runtime code under the Spine Runtimes License, which technically expects a Spine Editor licence. This is commonly tolerated for non-commercial fan tools, and should be noted in the credits.
|
||||
|
||||
### 5.4 Animation names (parsed; the naming varies, so build a resolver)
|
||||
|
||||
| Unit | Animations |
|
||||
|---|---|
|
||||
| char_103_angel (F) | Attack, Default, Die, Idle, Start |
|
||||
| char_102_texas (F) | Attack_Start/Loop/End, Default, Die, Idle, Skill, Start. **Back model has no Die, no Skill.** |
|
||||
| char_172_svrash (F) | Attack, Combat, Combat_Down, Default, Die, Idle, Skill, Start |
|
||||
| char_350_surtr (F) | Attack, Die, Idle, Skill_2, Skill_2_Down, Skill_3_Begin/Idle/Loop, Start |
|
||||
| char_2015_dusk (F) | Attack, Die, Idle, Skill2_Begin/Loop/End, Skill3_Attack, Start. No underscore after "Skill". |
|
||||
| char_4211_snhunt (F) | Attack_Begin/Loop/End, Attack_Down_*, Reload_*, Skill_1, Skill_2_Begin/Loop/End, Skill_Down_*, Die, Idle, Start. Events: `BeastOnAttack`, `OnAttack`, `OnStart`. |
|
||||
| char_1023_ghost2 (F) | Attack, Attack_Down, Die, Die_B, Idle, Idle_B, Skill_1, Skill_3_*, Start, Start_B… |
|
||||
| char_4134_cetsyr (F) | no Attack; Skill_{1,2,3}_Begin/Loop/End, Idle, Die, Stun, Stun_Begin, Start |
|
||||
| char_1012_skadi2 (Spine) | no Attack; Skill_{n}_Begin/Loop, Idle, Die, Stun, Start |
|
||||
| char_600_cpione, char_616_pithst | Attack, Default, Die, Idle, Start |
|
||||
| enemy_1007_slime | Attack, Default, Die, Idle, Move_Begin/Loop/End |
|
||||
| enemy_1000_gopro_2 | … + Run_Begin/Loop/End |
|
||||
| enemy_1502_crowns | Appear, Attack, Die, Disappear, Idle, Move |
|
||||
| enemy_1517_xi (boss) | Attack_01, Attack_02, Die, Idle, Move, Revive_01, Skill_01, Skill_01_02, Skill_02_Begin/Loop/End. Events: OnAttack, OnPlayAudio. |
|
||||
| enemy_9009_acfort | Attack, Die, Idle, Move, Skill_1_Begin/Loop/End, Skill_2 |
|
||||
|
||||
**Resolver.** Precompute it at build time by parsing every skel in Node with `@pixi-spine/runtime-3.8`; see `spinetest/parse.cjs` in the scratchpad. Emit `anims.json`, then resolve each role in order:
|
||||
- `idle`: `Idle` → `Default`.
|
||||
- `deploy`: `Start` (fall back to `Idle`).
|
||||
- `attack`:
|
||||
- `Attack`;
|
||||
- else `Attack_Start|Attack_Begin` → `Attack_Loop` → `Attack_End`;
|
||||
- else `Combat`;
|
||||
- else (pure supporter) `Skill_1_Loop`, or just `Idle` with a flash.
|
||||
- Prefer non-`_Down` variants. Use `_Down` when the target is below the unit on screen.
|
||||
- `skill`, for the chess's default skill index n (1-based):
|
||||
- `Skill_{n}_Begin` → `Skill_{n}_Loop` (while active) → `Skill_{n}_End`;
|
||||
- else `Skill{n}_Begin/Loop/End`;
|
||||
- else `Skill_{n}`;
|
||||
- else `Skill`;
|
||||
- else fall back to `attack`.
|
||||
- During a skill, `Skill_{n}_Idle` replaces `idle` when present.
|
||||
- `die`: `Die` (if the Back model lacks it, swap to the Front model for the death animation), else fade out over 0.5 s.
|
||||
- `move` (enemies): `Move_Begin` → `Move_Loop` → `Move_End`; else `Move`; else `Run_Loop`.
|
||||
- `stun`: `Stun_Begin` → `Stun`, else freeze the current track at `timeScale = 0`.
|
||||
- **Hit timing:** apply damage and spawn projectiles on the Spine event `OnAttack` (operators and enemies). If no event fires, use 50% of the attack animation. Scale the attack animation's `timeScale` to `animDuration / attackInterval` so it matches the simulated attack speed.
|
||||
|
||||
### 5.5 Direction and scale
|
||||
- **Operators:**
|
||||
- Front model when facing right or down.
|
||||
- Front mirrored (`scale.x = -1`) when facing left.
|
||||
- Back model when facing up; if there is no Back model, use Front.
|
||||
- **Enemies:** single model; flip x by the sign of horizontal velocity. The model faces right by default. [ASSUMED from standard Arknights behaviour; verify by eye]
|
||||
- **Scale [ASSUMED]:** skeleton height is ~360–450 units for a standard chibi. Start with `scale = tilePx / 300` so a chibi stands about 1.2 tiles tall, and tune by eye. Anchor at the feet (Spine origin 0,0 is at the feet).
|
||||
- Put `battle/[pack]common/sprites/sprite_shadow.png` under each unit.
|
||||
|
||||
### 5.6 Gaps and fallbacks
|
||||
- **Tokens/summons:** fexli has the **default** battle Spine for only 1/20 tokens (`token_10000_silent_healrb`); the rest exist only as skin variants (e.g. `…vodfox_doll_witch_2`). AA2 has their atlas and skel but no PNGs.
|
||||
- Options, in order of preference:
|
||||
1. Use the first skin-variant Spine, listed in `tokens[*].battleSpineSkinVariantsOnly` in the JSON. It looks slightly off-model, but it animates.
|
||||
2. Draw the token avatar (15/20) as a circular sprite with a bob tween.
|
||||
3. Draw a procedural glyph.
|
||||
- **"炎佑" (Yan-bond summon), [ASSUMED]:** no token id is in the data. Render it with the `token_10015_dusk_drgn` skin-variant Spine tinted orange-red, or with the Yan bond glyph plus fire particles.
|
||||
- **enemy_1305_mhslim:** reuse `enemy_1007_slime` Spine with a hue shift, or fall back to the icon sprite.
|
||||
- **General policy:** if any Spine load fails, render the square avatar or enemy icon in a rarity-coloured diamond with a tween (idle bob, lunge on attack, flash on hit). The game must never block on Spine.
|
||||
|
||||
---
|
||||
|
||||
## 6. Audio (k): the real audio is available in AA2 `@voice`
|
||||
|
||||
Base: `https://raw.githubusercontent.com/ArknightsAssets/ArknightsAssets2/voice/assets/dyn/audio/sound_beta_2/` (CORS `*`; jsDelivr 404s on this branch). The mapping comes from `excel/audio_data.json`, downloaded to `…/extra/assets/audio_data.json`. For an `asset` like `Audio/Sound_Beta_2/CustomSE/act1autochess/act1autochess_b_ui_roundstart`, strip the prefix, lower-case it and append `.mp3`.
|
||||
|
||||
### 6.1 BGM (verified)
|
||||
|
||||
| Level bgmEvent / context | Files | Size |
|
||||
|---|---|---|
|
||||
| act2autochess `m01–m04` use `bgmEvent=act1autochess_shop` → bank `battle.ON_GAME_READY.act1autochess_shop` | `music/act1autochess/m_bat_act1autochess_loop.mp3` | 2.0 MB |
|
||||
| Lobby: `sys.ON_ACTIVITY_LOADED.act1autochess` | `music/act1autochess/m_sys_act1autochess_intro.mp3`, then loop `m_sys_act1autochess_loop.mp3` | 1.1 + 1.1 MB |
|
||||
| `h07_05` levels use `bgmEvent=rglk1phantomcastle` | `music/rogue_1/m_bat_rglk1phantomcastle_intro.mp3` + `_loop.mp3` | 1.0 + 1.5 MB |
|
||||
|
||||
Play the intro, then crossfade to a looping `AudioBufferSourceNode` (`crossfade: 1.0` s in the bank).
|
||||
|
||||
### 6.2 Autochess UI and battle SFX (47 banks, all resolved, in `07-assets.json → audio.autochessSfxBanks`)
|
||||
Key bank names, which make good event names for our code:
|
||||
- **Shop:** `ui.ON_ACT1AUTOCHESS_SHOP_UPGRADE`, `…SHOP_LOCK`, `…GETMONEY`.
|
||||
- **Equipment and bonds:** `battle.ON_ACT1AUTOCHESS_EQUIP_DONE`, `…CHAR_BONUS` (3-merge upgrade), `…EQUIP_BONUS`, `…ADD_BOND` (buffup).
|
||||
- **Round flow:** `ui.…ROUNDSTART`, `…BATTLESTART`, `…BATTLESTART_BOSS`, `…REST`, `…YOURTURN`, `…YOURTURN_CIRCLE`, `…COUNTDOWN`.
|
||||
- **Boss rounds:** `…BOSSROUND_{TEAM,SINGLE,SECRET}`, `…KILLBOSS{,_ALL,_NORMAL}`, `…DEFENCE_{START,UNITE}`.
|
||||
- **End of battle and settlement:** `…BATTLEOVER_{REDUCE,NOREDUCE,NORMAL}`, `…SETTLEMENT_{SUCCEED,FAIL,TEAM,BOSSSIGN}`.
|
||||
- **Matchmaking and lobby:** `…MATCH_{SUCCEED,FAIL,CANCEL}`, `…PLAYER_{JOINROOM,READY}`, `…STRATEGY`, `…LOAD`, `…START`, `…GOFIRST`, `…DISCONNECT`, `…BROADCASTHINT`, `…ENTER_DANGER`.
|
||||
- **Other:** `battle.ON_CUSTOM_TRIGGER.autochess_kill_gain_coin`, `battle.ON_ACT1AUTOCHESS_MAGIC_PLACE_BATTLE`.
|
||||
- Files are under `customse/act1autochess/*.mp3` (46 files, 5–75 KB). Generic sounds: `battle/b_char/b_char_set.mp3` (deploy), `battle/b_enemy/b_enemy_dead_{n,h}.mp3`, `battle/b_ui/b_ui_{win,lose}.mp3`, `general/g_ui/g_ui_btn_{h,u}.mp3`, `g_ui_confirm_h.mp3`.
|
||||
|
||||
### 6.3 Per-unit combat SFX (exact, from the data)
|
||||
Banks are keyed by unit id:
|
||||
- `battle.ON_ABILITY_START.{charId}.attack` (swing or fire)
|
||||
- `battle.ON_ABILITY_HIT.{charId}.attack` (impact)
|
||||
- `battle.ON_UNIT_BORN.{id}`, `battle.ON_UNIT_DEAD.{id}`
|
||||
- `battle.ON_SKILL_START.{skillId}` (skill activation)
|
||||
|
||||
Coverage: **138/138 operators** and **185/200 enemies** have at least one bank; the remaining 15 enemies use a generic `e_atk`/`e_imp` sound. `07-assets.json` lists the resolved URLs per unit (`operators[*].sfx`, `operators[*].skills[*].sfx`, `enemies[*].sfx`).
|
||||
|
||||
The pool's needed set is **691 mp3 = 8.7 MB**:
|
||||
- `player/p_atk`, `p_imp`, `p_skill`: 452 files, 6.8 MB
|
||||
- `enemy/e_*`: 223 files, 2.6 MB
|
||||
- `battle/`: 0.9 MB
|
||||
- `customse/`: 1.3 MB
|
||||
|
||||
Pitch-randomize using the bank's `minPitch`/`maxPitch` (typically 0.8–1.2). Respect `maxSoundAllowed`, which caps concurrent instances per bank at 1–2 (`popOldest`). This matters in a 20-unit fight.
|
||||
|
||||
### 6.4 Optional and fallback audio
|
||||
- Voice (optional, off by default): `voice_cn/{charId}/cn_{NNN}.mp3`, about 30 lines and ~1 MB per operator.
|
||||
- Useful lines, by the standard charword ids [ASSUMED mapping, confirm with `charword_table.json`]: `cn_021`/`cn_022` 选中干员, `cn_023`/`cn_024` 部署, `cn_025`–`cn_028` 作战中.
|
||||
- Japanese voice is under `voice/`.
|
||||
- **WebAudio synthesis fallback**, used if the fetch fails or the user mutes "game audio":
|
||||
- UI click: 1.2 kHz square, 30 ms, exponential decay.
|
||||
- Coin: two sines, 1.5→2.2 kHz, 80 ms.
|
||||
- Hit: white-noise burst through a band-pass (1–3 kHz), 60 ms.
|
||||
- Deploy: low 110 Hz sine thump plus a noise click.
|
||||
- BGM fallback: silence or an ambient pad. Do not try to imitate the OST.
|
||||
- Monster Siren (official streaming, `monster-siren.hypergryph.com/api/songs`) returns JSON but **no CORS headers**, so the browser cannot use it directly. Not recommended.
|
||||
|
||||
---
|
||||
|
||||
## 7. Map tiles and battle background (h)
|
||||
|
||||
- The game data has **no 2D map texture**. Autochess maps are 19×21 tile grids rendered as a 3D Unity scene.
|
||||
- The AA2 root PNGs `assets/tile_floor.png`, `tile_road.png` and similar are 64×64 **editor debug placeholders** (green, wood planks). Do not use them.
|
||||
- yuanyan `map/` previews do not include autochess stages.
|
||||
- act2autochess level tile keys: `tile_road`, `tile_floor`, `tile_wall`, `tile_forbidden`, `tile_fence_bound`, `tile_start`, `tile_end`, `tile_telin`, `tile_telout`, **`tile_achand`** (autochess bench/hand area), `tile_mire` (m02), `tile_smog` (m03), `tile_deepsea` (m04).
|
||||
- `heightType` is LOWLAND or HIGHLAND; `buildableType` is ALL, MELEE, RANGED or NONE.
|
||||
- **Procedural tile renderer, in the Arknights look [ASSUMED palette, tune by eye]:**
|
||||
- Oblique top-down view; each tile is an inset square with a 1 px lighter top edge and a darker bottom bevel.
|
||||
- LOWLAND road `#3b4048` with subtle 45° noise. Deployable lowland gets a faint blue-grey outline `#6f8aa3` at 40% when a melee chess is dragged.
|
||||
- HIGHLAND (`tile_wall`) is a raised block: top `#6b7280`, side face `#3a3f47` 10 px tall, with a white 1 px top rim.
|
||||
- `tile_forbidden`: `#22262c` with a diagonal hatch. `tile_fence_bound`: dark plus a yellow-black edge stripe.
|
||||
- `tile_start` (enemy spawn): red `#d0453b` pulsing frame with an arrow glyph. `tile_end` (protection point): blue `#2d7fd6` with a house glyph.
|
||||
- `tile_telin`/`telout`: purple ring. `tile_mire`: murky green overlay. `tile_smog`: animated grey fog alpha. `tile_deepsea`: teal wave overlay.
|
||||
- `tile_achand`: bench slots with a dashed outline.
|
||||
- Attack-range preview: `arts/ui/[uc]battlecommon/ui_battle_new/attack_range_attack.png` and `attack_range_stand.png`, or draw orange `#ff9c33` squares at 35% alpha.
|
||||
- **Backdrop:** a dark gradient `#15171b → #262a31`, with `bg_mountains_tiled.png` (act2 entry, 112 KB) parallaxed at 20% opacity. Lobby: `entry_bkg_01.png` (0.99 MB) and `season_logo.png`.
|
||||
|
||||
---
|
||||
|
||||
## 8. Fonts (j)
|
||||
|
||||
| Use | Font | Source | Size |
|
||||
|---|---|---|---|
|
||||
| Chinese UI and body | **Noto Sans SC** 400/500/700/900 (思源黑体) | Google Fonts, `fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;700;900&display=swap` (200); npm `@fontsource/noto-sans-sc@5` | sliced unicode-range, ~50–100 KB per used slice |
|
||||
| Chinese titles (formal, serif as in-game) | Noto Serif SC 600/900 (思源宋体) | Google Fonts (200) | same |
|
||||
| Numbers, HUD, costs, timers (in-game **Bender**) | **Bender** (Jovanny Lemonad, free incl. commercial) | `https://raw.githubusercontent.com/TimWangZi/The-font-of-Arknights/master/font/Bender/BENDER.OTF` (200, 52 KB); also Light and Thin. Convert to woff2 and self-host. | 52 KB |
|
||||
| English headers (in-game **Novecento Wide**) | Novecento Sans Wide Normal | same repo, `font/Novecento-Wide-Normal-2.otf` (200, 45 KB); self-host | 45 KB |
|
||||
| Google-only fallbacks for Bender / Novecento | **Rajdhani** 600/700; **Saira Condensed** 500/700; Barlow Condensed; Teko; Oswald; Chakra Petch | Google Fonts, all 200 | — |
|
||||
|
||||
Recommended CSS stacks:
|
||||
- Numerals and English UI: `font-family: Bender, Rajdhani, 'Noto Sans SC', sans-serif`.
|
||||
- Headlines: `'Novecento Wide', 'Saira Condensed', 'Noto Sans SC'`.
|
||||
|
||||
Avoid redistributing Georgia and Times New Roman (Microsoft fonts) from that repo. The 11 MB 思源宋体 OTFs are unnecessary because Google Fonts serves them subset.
|
||||
|
||||
---
|
||||
|
||||
## 9. Build and delivery plan (recommended)
|
||||
|
||||
1. **Keep assets out of git.** Add `client/public/assets/` to `.gitignore`.
|
||||
2. Write `scripts/fetch-assets.mjs`. It reads `docs/research/07-assets.json` and downloads, with concurrency of about 16, retry ×3 and a jsDelivr mirror when raw fails:
|
||||
- `assets/char/avatar/{charId}.webp`, choosing E2 if present, else base.
|
||||
- `assets/char/portrait/{charId}.webp`.
|
||||
- `assets/skill/{iconId}.webp`.
|
||||
- `assets/enemy/icon/{enemyId}.webp`.
|
||||
- `assets/ui/…`, `assets/bond/{bondId}.png`, `assets/item/{trapId}.webp`, `assets/band/{bandId}.webp`.
|
||||
- `assets/spine/op/{charId}/{front|back}/{charId}.{skel,atlas,webp}` and `assets/spine/enemy/{enemyId}/…`.
|
||||
- `assets/audio/{bgm|sfx}/…mp3`.
|
||||
- Full art is not downloaded; fetch it lazily from jsDelivr at runtime.
|
||||
3. **Post-process:**
|
||||
- Icons and portraits → WebP q88. Spine textures → **lossless WebP**, then rewrite the atlas page line.
|
||||
- Inject `size:` into fexli atlases and `pma: true` into Ark-Models atlases.
|
||||
- Normalize every filename to lowercase ASCII.
|
||||
- Precompute `anims.json` (animation list + resolver result per model) and `sfx.json` (per unit: attack start and hit URLs, skill start, die).
|
||||
- Serve `.skel` and `.atlas` with gzip or brotli via Node `compression`.
|
||||
4. **Runtime loading:**
|
||||
- Preload UI, icons, avatars and portraits: about 6 MB.
|
||||
- Load Spine on demand when a chess enters the shop, bench or board, or when an enemy wave is announced. Cache with `PIXI.Assets` and an LRU of about 60 models.
|
||||
- Show the avatar-sprite fallback until the Spine loads.
|
||||
5. **Budgets after optimization:**
|
||||
|
||||
| Asset group | Size |
|
||||
|---|---|
|
||||
| Avatars | ~2 MB |
|
||||
| Portraits | ~4 MB |
|
||||
| Default-skill icons | ~0.8 MB |
|
||||
| Enemy icons | ~2 MB |
|
||||
| Bonds, items, bands, UI subset | ~4 MB |
|
||||
| Loading illustrations | ~2 MB |
|
||||
| Op Spine | ~36 MB |
|
||||
| Enemy Spine | ~9 MB |
|
||||
| Audio (BGM + SFX) | ~15 MB |
|
||||
| **Total on the server** | **≈ 75 MB** |
|
||||
| Per client (typical session) | ≈ 20–30 MB |
|
||||
|
||||
## 10. Licensing note
|
||||
|
||||
- All images, Spine models and audio are **© Hypergryph (上海鹰角网络); overseas publisher Yostar**.
|
||||
- Every mirror repo states this: fexli "All files … copyrighted by Hypergryph … solely for educational and research purposes", and Ark-Models "不得用于商业用途".
|
||||
- No official permissive fan-game policy was found. Hypergryph and Yostar do enforce copyright.
|
||||
- Therefore:
|
||||
- Non-commercial only; no ads, donations or paywall.
|
||||
- Show a credits screen: "Arknights © Hypergryph / Yostar. This is an unofficial fan project; all game assets belong to their owners."
|
||||
- Keep it private or small-group, and remove on request.
|
||||
- Do not redistribute bulk asset archives; fetch at deploy time.
|
||||
- Also credit the asset dumpers and tooling: yuanyan3060, fexli/ArkResourceAutoUpdateBot, isHarryh/ArkUnpacker, ArknightsAssets/ArknightsStudio, Kengxxiao/ArknightsGameData, pixi-spine (MIT) and the Spine Runtimes License.
|
||||
- Fonts: Noto (SIL OFL); Bender (free by author); Novecento Sans (free licence by Synthview).
|
||||
|
||||
## 11. Open questions and [ASSUMED] items
|
||||
|
||||
1. **Token spines:** only 1 of 20 defaults is available (§5.6). Approve the skin-variant or avatar fallback.
|
||||
2. **炎佑 summon visual** [ASSUMED]: the data has no dedicated model.
|
||||
3. **Tile palette and 3D look** [ASSUMED]: procedural. Tune against in-game screenshots (PRTS map pages or bwiki screenshots of 卫戍协议).
|
||||
4. **Spine scale** `tilePx/300` and enemy default facing [ASSUMED]: verify visually during build.
|
||||
5. **PMA** for Ark-Models enemy textures: add `pma: true`, then check visually for dark halos. The test render looked acceptable even without it.
|
||||
6. Voice line index mapping (`cn_021`–`cn_028`) [ASSUMED]: confirm against `charword_table.json` if voices get enabled.
|
||||
7. The Unity 9-slice metadata for UI panels is not in the dump, so panels are drawn in CSS. Only icons and backdrops use the real sprites.
|
||||
|
||||
---
|
||||
|
||||
## Addendum (critic)
|
||||
|
||||
Written 2026-09-27 by the completeness critic.
|
||||
|
||||
- **Spot check.** 40 URLs were sampled at random from the 4,469 unique URLs in `07-assets.json`: avatars, enemy skel, audio on `@voice`, and others. Each got a `curl -I` on 2026-09-27. **Result: 40/40 returned `200`.** The URL patterns in §0 hold.
|
||||
- **UI reference captured** for the designer. It is not to be shipped: it is official art and layout.
|
||||
- The official gameplay-intro long image, 800×13685, sliced into `scratchpad/gd/extra/critic/intro_00..09.jpg`.
|
||||
- 11 in-game screenshots (`*.jpg` in the same folder): prep with shop at R1/R2/R3, briefing, strategy draft, the three 机变 families, 联防, Final Assault, and the banned-operator dropdown.
|
||||
- They confirm these layout facts:
|
||||
- bottom shop bar: LEVEL card | operator cards | item card | funds card;
|
||||
- freeze and refresh buttons above the bar;
|
||||
- "剩余可放置角色" label;
|
||||
- 3×2 机变 grid;
|
||||
- bond strip with layer numbers under the discs;
|
||||
- `‹ 自己 ›` / `‹ 全景 ›` view switcher.
|
||||
- **Icons that are also needed:**
|
||||
- Disabled-bond badge: the person-✕ glyph on greyed bond discs.
|
||||
- "层数叠加已禁用" state of the bond strip.
|
||||
- Price-0 reward card.
|
||||
- Candidates are in the AA2 `ui/autochess/…` groups already listed in §3 i). If none match, draw them in CSS or SVG.
|
||||
@@ -0,0 +1,621 @@
|
||||
# 08 · Official waves, enemy counts, routes and preview (卫戍协议:盟约 下半)
|
||||
|
||||
Written 2026-09-28 in response to the user's test report. The user asked for enemy kinds, counts, routes and numbers to follow the official game (items 1, 2, 3, 4 and 9).
|
||||
|
||||
**This file supersedes** 05-enemies-levels.md §3.2 steps 1–7 (the generation algorithm and the `k` copies) and 00-INDEX §8 #12. It also supersedes every `[ASSUMED]` pathing statement in 05 §1 and §2.
|
||||
|
||||
## Tags
|
||||
|
||||
- **[DATA]**: official game data or official client code.
|
||||
- Game data: Kengxxiao zh_CN `activity_table`, `levels/*`, `enemy_database`.
|
||||
- Client code means the user's local Windows client. The method names come from `global-metadata.dat` (IL2CPP v29, not encrypted). The method bodies come from disassembling `GameAssembly.dll`. The IL2CPP method RVAs are listed in Appendix B.
|
||||
- **[WIKI]**: PRTS or BWIKI text.
|
||||
- **[VIDEO]**: in-game screenshots. These are the PRTS `战场一览` map images, taken at round-1 prep.
|
||||
- **[ASSUMED]**: not proven.
|
||||
|
||||
---
|
||||
|
||||
## 0. TL;DR
|
||||
|
||||
1. **Our enemy counts are 2–4× too high, and our faction mixing is wrong.**
|
||||
- Official rule [DATA, client `RandomEnemyGenerater`]: each round uses exactly **one** special-enemy entry.
|
||||
- Every placeholder spawn **action** (not every enemy) is replaced by `clamp(roundHalfEven(n·BE_template / BE_new), 1, 5)` enemies in total.
|
||||
- The placeholders of the other movement class (fly placeholders in a ground round, walk placeholders in a FLY round) are **not spawned at all**.
|
||||
- Official multi 险境 R3 has **6–10 enemies** (average 7.7). Ours averages 28 (max 68). R13 is ≈ 37 officially vs ours ≈ 81 (max 115).
|
||||
2. **Factions per match.** 3 random types. Each is given **exactly 3 of the 15 round slots**; SPECIAL gets the other 6. The slot order is shuffled, so there is one type per round [DATA].
|
||||
3. **Lanes.** Official pathing is a **4-directional** SPFA flow field (unit cost, crate tiles 1000), followed by line-of-sight smoothing [DATA]. We use 8-directional A* with √2 diagonals.
|
||||
- That is why upper-gate enemies drop into the lower lane on 战场#02 (act1 m02) and 战场#04 (act1 m04).
|
||||
- Our data also turns on four act1 m02 crates that are hidden in the 下半 level and absent in the 下半 screenshot. Those crates block the top road.
|
||||
4. **Preview.** Each spawn action is previewed at its route's start gate + 6 rows [DATA]:
|
||||
- Upper gate (12,10) → zone rows 17–18.
|
||||
- Lower gate (9,10) → zone rows 14–15.
|
||||
- Up to 50 models are shown. Elites and bosses are always shown.
|
||||
5. **Custom balance to remove:**
|
||||
- All of `data/tuning.json` `enemyHpMul` / `enemyAtkMul` / `bossHpMul`.
|
||||
- The `k`-copies logic and the kept fly placeholders.
|
||||
- The extra ×0.7 on solo bounties.
|
||||
- The custom 联防 slot grouping.
|
||||
- The details are in §6 and §7.
|
||||
|
||||
---
|
||||
|
||||
## 1. Sources and method
|
||||
|
||||
- **Game data [DATA]:**
|
||||
- `autoChessData.constData`: `min/maxReplacedEnemyCount` 1/5, `templateEnemy*`, `maxLevelCnt` 15, `specialEnemyNum` 3, `enemyTypeIdentifierToFillRandom` 1, and the BE factors 1/5/3/3.
|
||||
- `act2autochess.specialEnemyInfoDict` (67 entries) and `specialEnemyRandomTypeDict` (count 3 / weight 3 per random type; SPECIAL −1).
|
||||
- `modeDataDict[*].inactiveEnemyKey`, the round templates `level_act1autochess_01…h06` and `h07_*`/`h08_*`/`escaped_*`, the stage files `level_act{1,2}autochess_m0X`, and `enemy_database`.
|
||||
- **Client code [DATA].** Class and field names come from `global-metadata.dat`. The x64 bodies were disassembled with capstone and annotated with IL2CPP method names.
|
||||
- `RandomEnemyGenerater` (sic): `_GenerateSpecialEnemyTypesLocal`, `_GenerateRandomEnemyData`, `_DoReplaceLevelDataClient`, `_DoReplaceActionDataClient`, `_CalculateActionBattleEffectiveness`, `_CalculateEnemyCountByBattleEffectiveness`, `_GetEnemyAttrPower`, `_InitData`, `ShouldActionUpToServer`, `_GenerateRoundEnemyData`.
|
||||
- `Torappu.Battle.SPFA`: `_GenerateNextMapImpl`, `_PostprocessAndMakeNextMapSmoothly`, `_RaycastSegmentLine`, `_RaycastBresenhamLine`.
|
||||
- Also `Torappu.Battle.Tile.get_moveCost`, the `GridPosition` static constructor, `AutoChessEnemyPreviewManager`, and `AutoChessLevelEnemyManager`.
|
||||
- **Wiki [WIKI]:** PRTS `卫戍协议:盟约 下半` (§开始模拟, the enemy multiplier table), `卫戍协议/帮助`, `卫戍协议:盟约` (上半 update log), `…下半/战场一览` and `…下半/PRTS盟约记录`, and BWIKI `盟约`.
|
||||
- **Screenshots [VIDEO]:** PRTS `卫戍协议盟约 战场01…08 (ver2) 地图.png`. These are round-1 prep screenshots, and they show the round-1 enemies in the preview pen (§2.6).
|
||||
- **No community per-round enemy tables exist.** PRTS and BWIKI list only the faction pools (`战术特训敌人`).
|
||||
- **Scratch scripts** (not project files) are in `…/scratchpad/research2/waves/`:
|
||||
- `comp.py` / `official_counts.py`: the count algorithm.
|
||||
- `simofficial.py`: the distribution.
|
||||
- `akpath.py` / `akpath2.py`: the official pathing.
|
||||
- `pathtest.mjs` / `ourcounts.mjs`: our current behaviour.
|
||||
- `akdis.py`: the disassembler.
|
||||
|
||||
---
|
||||
|
||||
## 2. Official per-round enemy composition
|
||||
|
||||
### 2.1 Match setup: the type schedule [DATA, `_GenerateSpecialEnemyTypesLocal`]
|
||||
|
||||
```
|
||||
types = [t for t in autoChessData.enemyTypeDatas if t.involveRandom] // FLY TIMES ELEMENT DOT INVISIBLE REFLECTION
|
||||
shuffle(types, battleRng); types = first specialEnemyNum (3) of them // uniform, distinct
|
||||
slots = []
|
||||
for t in types: repeat specialEnemyRandomTypeDict[t].count (3) times: slots.push(t.typeIdentifier)
|
||||
while slots.length < maxLevelCnt (15): slots.push(enemyTypeIdentifierToFillRandom = 1 = SPECIAL)
|
||||
shuffle(slots, battleRng) // slots[r-1] = type of round r
|
||||
```
|
||||
|
||||
- Every match therefore has **9 rounds** of its 3 chosen types (3 each) and **6 rounds of SPECIAL**. The positions are random across R1–R15.
|
||||
- R14 (leader) and R15 (hidden core) consume slots 14 and 15.
|
||||
- The solo 标准 leader round R9 consumes slot 9.
|
||||
- The briefing shows "三种特训敌人的类型" [WIKI 帮助: "您将事先得知本次战斗即将迎战的领袖单位,三种特训敌人的类型"]. SPECIAL is the filler and is not one of the three.
|
||||
- In co-op the server sends the per-round types (`AutoChessBattleRoundEnemyInfo{enemyType, enemyKey, actionIndex, count, round}`). The local generator is used when none are sent. The whole team shares one composition per round, because the round data has no player index [DATA].
|
||||
|
||||
### 2.2 Per-round pick [DATA, `_GenerateRandomEnemyData`]
|
||||
|
||||
```
|
||||
for round r in 1..15:
|
||||
typeId = slots[r-1]; if typeId == 0: skip
|
||||
half = r <= maxLevelCnt/2 (=7) // R1–R7 first half, R8–R15 second half
|
||||
cands = [e in specialEnemyInfoDict if typeOf(e.type).typeIdentifier == typeId
|
||||
and e.isInFirstHalf == half
|
||||
and e.specialEnemyKey ∉ mode.inactiveEnemyKey]
|
||||
e = weightedPick(cands, e.randomWeight) // weights 8/10/15 as in data
|
||||
special[r] = e.specialEnemyKey
|
||||
normal[r] = e.attachedNormalEnemyKeys[randInt(len)] // always 1 element in 下半 data
|
||||
elite[r] = e.attachedEliteEnemyKeys[randInt(len)] // always 1 element
|
||||
```
|
||||
|
||||
- `inactiveEnemyKey` filters **only the special key**. Attached normal and elite keys are not filtered. For example, 疯狂的逐腐兽 can still appear as the elite of 假想敌:蚀裂 in 险境. This matches the 上半 note [WIKI]: "以上调整仅针对战术特训敌人,不影响悬赏决策出场".
|
||||
- In every entry the special, normal and elite share the same fly flag [DATA check]: FLY entries are all flyers, every other entry is all walkers.
|
||||
|
||||
### 2.3 Template action → actual spawns [DATA, `_DoReplaceLevelDataClient` / `_DoReplaceActionDataClient`]
|
||||
|
||||
The placeholder map is built from constData in `_InitData`:
|
||||
|
||||
| template key | class |
|
||||
|---|---|
|
||||
| `enemy_1422_lrsldr` | NormalWalk |
|
||||
| `enemy_1005_yokai` | NormalFly |
|
||||
| `enemy_1427_lrnazg` | EliteWalk |
|
||||
| `enemy_1042_frostd` | EliteFly |
|
||||
| `enemy_1425_lrcmra` | SpecialWalk |
|
||||
| `enemy_1040_bombd` | SpecialFly |
|
||||
|
||||
Token placeholders (`1000_gopro_2`, `1041_lazerd`) are **not** in the map. They are only used by the 联防 templates (§5).
|
||||
|
||||
For every SPAWN action of `waves[0].fragments[0].actions` (processed last to first):
|
||||
|
||||
```
|
||||
if action.key not in placeholderMap: // literal (e.g. R1 源石虫 ×2, boss escorts): keep as is
|
||||
keep
|
||||
else:
|
||||
cls, isFlySlot = placeholderMap[action.key]
|
||||
newKey = {Normal: normal[r], Elite: elite[r], Special: special[r]}[cls]
|
||||
if isFly(newKey) != isFlySlot: // walk slot but FLY round, or fly slot but ground round
|
||||
action.isValid = false // NOT spawned, NOT sent to server, NOT previewed
|
||||
else:
|
||||
originBE = action.count * P(action.key) / f(action.key) // float32
|
||||
newBE = P(newKey) / f(newKey)
|
||||
n' = clamp(RoundHalfToEven(originBE / newBE), minReplacedEnemyCount 1, maxReplacedEnemyCount 5)
|
||||
action.interval = action.count * action.interval / n' // same time window
|
||||
action.key = newKey; action.count = n'
|
||||
P(k) = maxHp*1 + atk*5 + def*3 + magicResistance*3 // enemy_database, level = randomEnemyAttributeDict[k].level (all 0)
|
||||
f(k) = randomEnemyAttributeDict[k].enemyBattleEffectivenessFactor
|
||||
```
|
||||
|
||||
Notes on the count rule:
|
||||
|
||||
- The **cap of 5 applies per action.** One template action (for example R3 "N ×10") becomes at most 5 enemies. It never becomes 10·k.
|
||||
- **Rounding** is C# `Math.Round(double)`, which is banker's rounding. The only exact .5 case in the data is 2 × 灵幛 → 隐形弩手组长: ratio 4.5 gives **4**.
|
||||
- P uses `enemy_database` values. The `level_autochess_enemy_data` overrides (灼藤 and 元核孽生者 ATK 400) are **not** used for the count. They still apply to the spawned stats.
|
||||
- Spawn timing [DATA, `AutoChessLevelEnemyManager._CalculateActionPredelay`]: the i-th unit of an action spawns at `preDelay + i·step`.
|
||||
- `step = max(window/n', 0.05·window)`, where `window = originalCount·originalInterval`. `MIN_ACTION_INTERVAL_RATIO` = 0.05.
|
||||
- For n' ≤ 20 this equals the rescaled interval.
|
||||
- `ShouldActionUpToServer` [DATA] excludes:
|
||||
- invalid actions,
|
||||
- boss enemies (`AutoChessBattleUtil.IsBossEnemy`),
|
||||
- non-SPAWN actions,
|
||||
- actions with a `randomSpawnGroupKey`.
|
||||
|
||||
**Kinds per round:** at most 3 faction kinds (normal, elite, special), plus the literal 源石虫 in R1. They are all flyers (FLY round) or all walkers (every other type).
|
||||
|
||||
### 2.4 Leader and hidden rounds [DATA]
|
||||
|
||||
- The `h07_*` / `h08_*` templates contain only **E and EF** placeholders (escorts), for example h07_01: `lrnazg` 1+1 walk and `frostd` 1+2 fly. They are replaced with slot 14 / 15's elite by the same rule.
|
||||
- Ground round: E becomes the elite and **EF is dropped**.
|
||||
- FLY round: the reverse.
|
||||
- Literal escorts (重装防御组长 ×14 and the like) and the boss itself are kept.
|
||||
- The leader's HP is not scaled [WIKI: "领袖单位于服务器的生命值加成不受上述加成影响"].
|
||||
|
||||
### 2.5 Enemy stat scaling
|
||||
|
||||
- The per-mode, per-round `atk × 1.1^kA`, `hp × 1.2^kH` table with base 0.7 / 0.8 / 1 is the **only** source [WIKI, PRTS 下半 §开始模拟, flagged "敌方属性加成情况由用户提供"].
|
||||
- `data/config.json → modes[*].enemyScale` reproduces it. I spot-checked 险境 multi R1/R2/R4/R8/R9; docs/BALANCE.md §2 reports every mode and round as matching.
|
||||
- The same table is in 01-core-data.json `_criticAddendum.enemyStatMultipliers`.
|
||||
- Base values [WIKI, mode descriptions]:
|
||||
- Solo: "所有敌人的生命值、攻击力降低至70%". 绝境 80 %; 终极 not reduced.
|
||||
- Co-op: 80 % in 标准 and 险境; 绝境 and 终极 not reduced.
|
||||
- **DEF:** the 上半 11/18 note said "敌人生命值、攻击力和防御力降至70%/80%". The 下半 text names only HP and ATK. We apply HP/ATK only, which matches 下半. Adding DEF would be optional [ASSUMED].
|
||||
- 终极: every enemy moves at ×1.15 from R3 [WIKI].
|
||||
- The scaling applies to wave, faction and bounty enemies. It does **not** apply to the leader's server HP pool [WIKI].
|
||||
- The BE count rule (§2.3) uses **unscaled** DB stats [DATA]. Scaling happens at spawn.
|
||||
|
||||
### 2.6 Evidence from official screenshots [VIDEO]
|
||||
|
||||
The PRTS map images are R1 prep screenshots, 1 280 × 720, with the preview pen at the top right (rows 14–15). They match §2.3 exactly and **contradict our k-copies rule**.
|
||||
|
||||
| image | visible R1 enemies | official prediction (entry → R1) | ours would give |
|
||||
|---|---|---|---|
|
||||
| 战场02 ver2 (act1 m02) | 源石虫 ×2, 猎狗pro ×4, **no drones** | SPECIAL 高级军用猎狗 → 源石虫 ×2 + 猎狗pro ×4 (N 2 × 6620/3060 = 4.33 → 4) | 源石虫 ×2 + 猎狗pro ×4 + 妖怪 ×2 |
|
||||
| 战场07 ver2 (act2 m03) | 源石虫 ×2, 猎狗pro ×4 | same | same as above |
|
||||
| 战场04 (act1 m04) | 源石虫 ×2, 灼热源石虫 ×5 | ELEMENT 炽焰源石虫 → 源石虫 ×2 + 灼热源石虫 ×5 (2 × 6620/1450 = 9.1 → cap 5) | 源石虫 ×2 + 灼热源石虫 ×10 + 妖怪 ×2 |
|
||||
| 战场02 (上半) / 06 ver2 | 源石虫 ×2 + 3 humanoid walkers (上半: white Sarkaz swordsmen) | e.g. SPECIAL 萨卡兹大剑组长 → 萨卡兹刀兵 ×3 (2 × 6620/4660 = 2.84 → 3); 粉碎攻坚手 / 山海众头目 → 宿主士兵 ×3 also fit | +妖怪 ×2 |
|
||||
| 战场01 | 源石虫 ×2 + drone(s), **no ground N** | a FLY round (walk N dropped, NF replaced) | ground N ×2 + flyers |
|
||||
| 战场03 / 05 ver2 / 08 | 源石虫 ×2 + 2 walkers, no drones | e.g. TIMES/DOT/INVISIBLE picks with N ×2 | +妖怪 ×2 |
|
||||
|
||||
Every screenshot shows only one movement class besides the 源石虫. This confirms that the placeholders of the other class are dropped.
|
||||
|
||||
### 2.7 Resulting counts
|
||||
|
||||
**Distribution: official vs ours**, 同盟 险境 (`mode_multi_normal`), enemies per board per round.
|
||||
|
||||
- Official: 4 000 simulated matches of §2.1–2.3.
|
||||
- Ours: `server/match/waves.js` over 200 seeds.
|
||||
|
||||
| R | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| official avg | 4.7 | 7.7 | 7.7 | 10.3 | 20.0 | 23.2 | 26.2 | 18.2 | 20.3 | 22.2 | 23.6 | 35.0 | 37.5 |
|
||||
| official min–max | 3–7 | 4–10 | 6–10 | 7–20 | 13–30 | 14–30 | 17–35 | 8–29 | 8–33 | 8–35 | 10–35 | 14–53 | 12–57 |
|
||||
| ours avg | 7.1 | 17.6 | 28.3 | 24.5 | 42.8 | 50.5 | 58.5 | 39.8 | 42.1 | 47.1 | 51.4 | 80.1 | 81.0 |
|
||||
| ours max | 14 | 39 | **68** | 48 | 93 | 113 | 134 | 54 | 60 | 65 | 69 | 107 | 115 |
|
||||
|
||||
- 绝境 and 终极 differ only by the unbanned keys: R12 ≈ 36.8, R13 ≈ 38.7 on average.
|
||||
- A FLY round happens in ≈ 10 % of rounds (3 of 15 slots in the half of the matches that draw FLY).
|
||||
|
||||
**Totals per possible round pick** [DATA, computed with §2.3 on the real templates] follow. Per-action breakdowns for all 67 entries are regenerable with `comp.py`, and §7 step 1 describes the test fixtures.
|
||||
|
||||
**First half (R1–R7).** Total enemies spawned per board when this entry is the round pick. ⛔ = special key banned in 标准/险境.
|
||||
|
||||
| type | special (key) | w | attached N / E | R1 | R2 | R3 | R4 | R5 | R6 | R7 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| SPECIAL | 萨卡兹大剑组长 (`1010_demon_2`) | 10 | 萨卡兹刀兵 / 萨卡兹大剑手 | 5 | 8 | 7 | 9 | 19 | 23 | 27 |
|
||||
| SPECIAL | 粉碎攻坚手 (`1045_hammer`) | 10 | 宿主士兵 / 步兵 | 5 | 10 | 10 | 12 | 24 | 27 | 28 |
|
||||
| SPECIAL | 拳师囚犯 (`1118_lidbox_2`) | 10 | 普通囚犯 / 老练囚犯 | 4 | 6 | 7 | 8 | 17 | 21 | 25 |
|
||||
| SPECIAL | 高级军用猎狗 (`1325_cbgpro_2`) | 10 | 猎狗pro / 军用猎狗 | 6 | 10 | 8 | 14 | 27 | 30 | 33 |
|
||||
| SPECIAL | 重犯 (`1121_lifbos`) | 10 | 普通囚犯 / 老练囚犯 | 4 | 6 | 7 | 7 | 16 | 19 | 22 |
|
||||
| SPECIAL | 弧光锋卫 (`1328_cbjedi`) | 10 | Dor-1号失败品 / 莱茵生命防卫科高级成员 | 5 | 8 | 7 | 9 | 21 | 24 | 26 |
|
||||
| FLY | 法术大师A1 (`1041_lazerd`) | 10 | “萨科塔之翼” / 妖怪MKII | 3 | 7 | 9 | 14 | 18 | 22 | 23 |
|
||||
| FLY | 护障 (`1355_mrfly`) | 10 | 妖怪 / 妖怪MKII | 4 | 9 | 9 | 14 | 19 | 23 | 23 |
|
||||
| FLY | 御4 (`1017_defdrn`) | 10 | 妖怪 / 妖怪MKII | 4 | 9 | 9 | 16 | 21 | 26 | 25 |
|
||||
| FLY | “萨科塔之眼” (`10084_hlegle`) | 10 | “萨科塔之翼” / 妖怪MKII | 3 | 7 | 9 | 11 | 15 | 19 | 21 |
|
||||
| FLY | 远眺 (`1407_hummbd`) | 10 | 妖怪 / 妖怪MKII | 4 | 9 | 9 | 15 | 20 | 24 | 23 |
|
||||
| FLY | 护障·P ⛔ (`1355_mrfly_2`) | 8 | 妖怪 / 御4 | 4 | 9 | 9 | 14 | 19 | 22 | 23 |
|
||||
| TIMES | 明鉴 (`1195_sfyin_2`) | 10 | 磨砻 / 俗心 | 4 | 6 | 6 | 7 | 16 | 20 | 24 |
|
||||
| TIMES | 深池逐火精锐战士 (`1288_duskls_2`) | 10 | 深池逐火战士 / 深池逐火战士 | 4 | 4 | 7 | 9 | 16 | 19 | 23 |
|
||||
| TIMES | 俗心 (`1197_sfshu`) | 10 | 磨砻 / 俗心 | 4 | 6 | 6 | 7 | 16 | 19 | 23 |
|
||||
| TIMES | 雅气 ⛔ (`1197_sfshu_2`) | 8 | 磨砻 / 雅气 | 4 | 6 | 6 | 6 | 14 | 17 | 21 |
|
||||
| ELEMENT | 控潮术师 (`1161_tidmag`) | 10 | 潜水员 / 码头水手 | 5 | 8 | 6 | 8 | 18 | 21 | 25 |
|
||||
| ELEMENT | 炽焰源石虫 (`1305_mhslim_2`) | 10 | 灼热源石虫 / 炽焰源石虫 | 7 | 10 | 10 | 20 | 30 | 30 | 35 |
|
||||
| DOT | 深溟巢涌者 (`1234_dsubrl`) | 10 | 单核掠食者 / 异光体掠食者 | 4 | 4 | 7 | 7 | 13 | 14 | 17 |
|
||||
| DOT | 萨卡兹枯朽战车 (`1272_nhtank`) | 10 | 萨卡兹枯朽战士 / 萨卡兹枯朽战士组长 | 4 | 6 | 8 | 8 | 17 | 19 | 21 |
|
||||
| DOT | 逐腐兽 (`1270_nhstlk`) | 10 | 萨卡兹枯朽战士 / 萨卡兹枯朽战士组长 | 4 | 6 | 8 | 9 | 18 | 21 | 24 |
|
||||
| INVISIBLE | 山海众头目 (`1299_ymkilr`) | 10 | 宿主士兵 / 隐形弩手 | 5 | 10 | 8 | 10 | 24 | 27 | 28 |
|
||||
| INVISIBLE | 节日爵士乐手 (`10034_cnvsax`) | 10 | 宿主士兵 / 隐形弩手 | 5 | 10 | 8 | 11 | 25 | 28 | 30 |
|
||||
| INVISIBLE | 扶桥老手 (`10042_prtrop_2`) | 10 | 寻险水手 / 架桥船工 | 4 | 6 | 7 | 8 | 17 | 21 | 25 |
|
||||
| REFLECTION | 深池伙友卫队 (`1174_duholy`) | 10 | 深池侦察兵 / 深池重甲卫士 | 5 | 8 | 6 | 8 | 19 | 22 | 26 |
|
||||
| REFLECTION | 深池暗影术师 (`1168_dumage`) | 10 | 深池侦察犬 / 深池方阵步兵 | 5 | 8 | 8 | 13 | 24 | 27 | 32 |
|
||||
| REFLECTION | 深池重甲卫士 (`1170_dushld`) | 10 | 深池侦察兵 / 深池方阵步兵 | 5 | 8 | 8 | 11 | 22 | 26 | 29 |
|
||||
|
||||
**Second half (R8–R13).** Same columns.
|
||||
|
||||
| type | special (key) | w | attached N / E | R8 | R9 | R10 | R11 | R12 | R13 |
|
||||
|---|---|---|---|---|---|---|---|---|---|
|
||||
| SPECIAL | 重装五十夫长 (`1006_shield_3`) | 10 | 宿主士兵 / 重装侦察兵 | 24 | 30 | 30 | 28 | 39 | 41 |
|
||||
| SPECIAL | 弧光镜卫 (`1329_cbshld`) | 10 | Dor-1号失败品 / 莱茵生命防卫科高级成员 | 26 | 29 | 31 | 33 | 51 | 50 |
|
||||
| SPECIAL | 粉碎攻坚组长 (`1045_hammer_2`) | 10 | 宿主重装士兵 / 宿主重装士兵 | 9 | 10 | 13 | 15 | 20 | 26 |
|
||||
| SPECIAL | 访问团持盾者 (`1387_winshd`) | 10 | 访问团新兵 / 访问团老兵 | 15 | 16 | 18 | 19 | 32 | 38 |
|
||||
| SPECIAL | 传奇重犯 (`1121_lifbos_2`) | 10 | 老练囚犯 / 强壮囚犯 | 14 | 16 | 18 | 18 | 30 | 35 |
|
||||
| SPECIAL | 萨卡兹悖谬暴虐兵长 (`1320_wdrrl_2`) | 10 | 萨卡兹枯朽辟路前锋 / 萨卡兹大剑手 | 18 | 22 | 23 | 24 | 33 | 37 |
|
||||
| SPECIAL | 集团军中坚盾卫 (`10124_uashld_2`) | 10 | 宿主士兵 / 宿主重装士兵 | 23 | 30 | 30 | 29 | 38 | 43 |
|
||||
| SPECIAL | 测试用动力装甲 ⛔ (`1254_lypa_2`) | 10 | Dor-1号失败品 / 莱茵生命防卫科高级成员 | 29 | 31 | 34 | 36 | 57 | 55 |
|
||||
| SPECIAL | 渎罪奇美拉 ⛔ (`1425_lrcmra_2`) | 10 | 萨卡兹枯朽辟路前锋 / 萨卡兹大剑手 | 19 | 22 | 24 | 26 | 37 | 41 |
|
||||
| SPECIAL | 弧光镜卫长 ⛔ (`1329_cbshld_2`) | 10 | Dor-α号失败品 / Dor-β号复制体 | 23 | 27 | 30 | 28 | 42 | 48 |
|
||||
| SPECIAL | 萨卡兹穿刺手 ⛔ (`1072_dlancer`) | 10 | 萨卡兹刀兵 / 萨卡兹大剑组长 | 26 | 29 | 32 | 36 | 50 | 49 |
|
||||
| FLY | 威龙 (`1005_yokai_3`) | 10 | 妖怪 / 妖怪MKII | 19 | 19 | 20 | 25 | 39 | 31 |
|
||||
| FLY | 帝国炮火先兆者 ⛔ (`1112_emppnt`) | 10 | 妖怪 / 妖怪MKII | 19 | 19 | 20 | 25 | 39 | 31 |
|
||||
| FLY | 法术大师A2 (`1041_lazerd_2`) | 10 | 妖怪MKII / 寒霜 | 12 | 12 | 12 | 15 | 24 | 22 |
|
||||
| FLY | 假想敌:黑云 (`9009_acfort`) | 10 | 妖怪MKII / 威龙 | 8 | 8 | 8 | 10 | 14 | 12 |
|
||||
| TIMES | 深池逐火护卫 (`1292_duskld`) | 10 | 深池逐火战士 / 深池逐火精锐战士 | 19 | 18 | 23 | 28 | 43 | 45 |
|
||||
| TIMES | 沉沙 ⛔ (`1207_sfji`) | 10 | 磨砻 / 俗心 | 17 | 21 | 21 | 21 | 32 | 33 |
|
||||
| TIMES | 身观 (`1199_sfjin`) | 10 | 磨砻 / 俗心 | 17 | 21 | 21 | 22 | 32 | 35 |
|
||||
| TIMES | 假想敌:再生 (`9010_acpupp`) | 10 | 俗心 / 雅气 | 11 | 10 | 14 | 17 | 25 | 31 |
|
||||
| ELEMENT | 掠海漂移体 (`2025_syufo`) | 10 | 骨海漂流体 / 骨海漂流体 | 24 | 26 | 29 | 30 | 45 | 48 |
|
||||
| ELEMENT | 领潮员 (`1161_tidmag_2`) | 10 | 潜水员 / 码头水手长 | 20 | 24 | 26 | 28 | 34 | 35 |
|
||||
| ELEMENT | 元核孽生者 (`1439_dslntf`) | 10 | 底海滑动者 / 富营养的滑动者 | 26 | 31 | 31 | 31 | 45 | 41 |
|
||||
| ELEMENT | 萨卡兹王庭军精锐术师 ⛔ (`1275_dwlock_2`) | 10 | 萨卡兹王庭军战士 / 萨卡兹王庭军精锐战士 | 16 | 18 | 20 | 18 | 32 | 35 |
|
||||
| ELEMENT | 假想敌:淤困 (`9007_acelem`) | 10 | 萨卡兹王庭军战士 / 萨卡兹王庭军精锐战士 | 15 | 18 | 19 | 17 | 30 | 32 |
|
||||
| ELEMENT | 灼藤 ⛔ (`10067_ftsjc`) | 8 | 卷心籽 / 灼藤 | 20 | 24 | 25 | 25 | 31 | 29 |
|
||||
| DOT | 富营养的巢涌者 ⛔ (`1234_dsubrl_2`) | 10 | 异光体掠食者 / 异光体掠食者 | 15 | 18 | 18 | 17 | 30 | 32 |
|
||||
| DOT | 集团军重型火炮 ⛔ (`10122_uacann_2`) | 10 | 萨卡兹枯朽战士组长 / 萨卡兹枯朽战士组长 | 20 | 20 | 23 | 27 | 42 | 42 |
|
||||
| DOT | 尖端萨卡兹枯朽战车 ⛔ (`1272_nhtank_2`) | 10 | 萨卡兹枯朽战士组长 / 疯狂的逐腐兽 | 13 | 15 | 17 | 20 | 25 | 27 |
|
||||
| DOT | 假想敌:蚀裂 (`9006_actoxi`) | 15 | 萨卡兹枯朽战士组长 / 疯狂的逐腐兽 | 15 | 15 | 19 | 23 | 31 | 34 |
|
||||
| DOT | 疯狂的逐腐兽 ⛔ (`1270_nhstlk_2`) | 8 | 萨卡兹枯朽战士 / 萨卡兹枯朽战士组长 | 24 | 25 | 28 | 29 | 47 | 49 |
|
||||
| INVISIBLE | 访问团强攻冠军 (`1389_winbab_2`) | 10 | 访问团新兵 / 隐形弩手组长 | 18 | 18 | 21 | 22 | 38 | 44 |
|
||||
| INVISIBLE | 山海众秘使 (`1299_ymkilr_2`) | 10 | 萨卡兹枯朽辟路前锋 / 隐形弩手组长 | 20 | 23 | 24 | 25 | 38 | 41 |
|
||||
| INVISIBLE | 重弩突袭者 (`1404_msnip`) | 10 | 潜伏者 / 隐形弩手组长 | 29 | 33 | 35 | 35 | 53 | 57 |
|
||||
| INVISIBLE | 假想敌:骨刺 ⛔ (`9008_acbunn`) | 10 | 业余竞演者 / 隐形弩手组长 | 20 | 23 | 25 | 24 | 38 | 39 |
|
||||
| INVISIBLE | 家族灭迹人 ⛔ (`1283_sgkill`) | 8 | 业余竞演者 / 隐形弩手组长 | 20 | 23 | 25 | 24 | 38 | 39 |
|
||||
| REFLECTION | 深池伙友卫队精英 ⛔ (`1174_duholy_2`) | 10 | 深池侦察队长 / 深池重甲卫士队长 | 18 | 20 | 22 | 24 | 34 | 39 |
|
||||
| REFLECTION | 深池重甲卫士队长 (`1170_dushld_2`) | 10 | 深池侦察队长 / 深池方阵指挥官 | 22 | 23 | 26 | 29 | 46 | 49 |
|
||||
| REFLECTION | 守墓石像 (`1172_dugago`) | 10 | 深池侦察队长 / 深池方阵指挥官 | 20 | 23 | 24 | 24 | 38 | 39 |
|
||||
| REFLECTION | 假想敌:镜膜 (`9011_acrefr`) | 10 | 深池侦察队长 / 深池重甲卫士队长 | 18 | 20 | 22 | 24 | 34 | 39 |
|
||||
| REFLECTION | 深池伙友影刃精英 ⛔ (`1175_dushdo_2`) | 8 | 深池侦察犬 / 深池伙友卫队精英 | 20 | 24 | 26 | 28 | 34 | 35 |
|
||||
|
||||
**Two concrete example matches** (同盟 险境). Per round: slot type, the special entry, the total, and the kinds and counts **per gate** (what the preview shows).
|
||||
|
||||
Example A. Types INVISIBLE / FLY / REFLECTION; slots `SPEC INVI SPEC FLY REFL REFL SPEC FLY INVI SPEC FLY SPEC REFL SPEC INVI`.
|
||||
|
||||
| R | type | entry | total | lower gate (9,10) | upper gate (12,10) |
|
||||
|---|---|---|---|---|---|
|
||||
| 1 | SPECIAL | 萨卡兹大剑组长 | 5 | 萨卡兹刀兵 ×3, 源石虫 ×2 | — |
|
||||
| 2 | INVISIBLE | 节日爵士乐手 | 10 | 宿主士兵 ×10 (2 actions × 5) | — |
|
||||
| 3 | SPECIAL | 重犯 | 7 | 普通囚犯 ×5, 老练囚犯 ×2 | — |
|
||||
| 4 | FLY | 法术大师A1 | 14 | 妖怪MKII ×5, 法术大师A1 ×4, “萨科塔之翼” ×3 | “萨科塔之翼” ×2 |
|
||||
| 5 | REFLECTION | 深池伙友卫队 | 19 | 深池侦察兵 ×8, 深池重甲卫士 ×3, 深池伙友卫队 ×1 | 深池侦察兵 ×7 |
|
||||
| 8 | FLY | 法术大师A2 | 12 | 妖怪MKII ×2, 寒霜 ×2, 法术大师A2 ×1 | 寒霜 ×3, 妖怪MKII ×2, 法术大师A2 ×2 |
|
||||
| 12 | SPECIAL | 集团军中坚盾卫 | 38 | 宿主士兵 ×21, 宿主重装士兵 ×6, 集团军中坚盾卫 ×3 | 宿主重装士兵 ×4, 宿主士兵 ×3, 集团军中坚盾卫 ×1 |
|
||||
| 13 | REFLECTION | 深池重甲卫士队长 | 49 | 深池方阵指挥官 ×15, 深池重甲卫士队长 ×14, 深池侦察队长 ×12 | 深池方阵指挥官 ×4, 深池重甲卫士队长 ×3, 深池侦察队长 ×1 |
|
||||
|
||||
Example B. Types DOT / TIMES / ELEMENT.
|
||||
|
||||
| R | type | entry | total | lower gate | upper gate |
|
||||
|---|---|---|---|---|---|
|
||||
| 1 | SPECIAL | 高级军用猎狗 | 6 | 猎狗pro ×4, 源石虫 ×2 | — |
|
||||
| 3 | TIMES | 俗心 | 6 | 磨砻 ×5, 俗心 ×1 | — |
|
||||
| 4 | SPECIAL | 拳师囚犯 | 8 | 普通囚犯 ×2, 老练囚犯 ×2, 拳师囚犯 ×2 | 普通囚犯 ×2 |
|
||||
| 7 | DOT | 逐腐兽 | 24 | 萨卡兹枯朽战士 ×8, 萨卡兹枯朽战士组长 ×5, 逐腐兽 ×5 | 萨卡兹枯朽战士 ×6 |
|
||||
| 8 | ELEMENT | 假想敌:淤困 | 15 | 萨卡兹王庭军战士 ×5, 萨卡兹王庭军精锐战士 ×2, 假想敌:淤困 ×1 | 萨卡兹王庭军精锐战士 ×4, 萨卡兹王庭军战士 ×2, 假想敌:淤困 ×1 |
|
||||
| 11 | DOT | 假想敌:蚀裂 | 23 | 萨卡兹枯朽战士组长 ×8, 假想敌:蚀裂 ×6, 疯狂的逐腐兽 ×4 | 萨卡兹枯朽战士组长 ×4, 假想敌:蚀裂 ×1 |
|
||||
| 12 | SPECIAL | 弧光镜卫 | 51 | Dor-1号失败品 ×18, 莱茵生命防卫科高级成员 ×15, 弧光镜卫 ×8 | 莱茵生命防卫科高级成员 ×5, Dor-1号失败品 ×3, 弧光镜卫 ×2 |
|
||||
|
||||
---
|
||||
|
||||
## 3. Routes and lanes
|
||||
|
||||
### 3.1 Official ground pathfinding [DATA, client `Torappu.Battle.SPFA` + `Tile` + `GridPosition`]
|
||||
|
||||
1. **Flow field per destination.** The engine computes one flow field per destination (a route's end, or a MOVE checkpoint) over the **whole map grid**.
|
||||
- `PathRequest` is `{targetPos, motionMode, allowDiagonalMove}`.
|
||||
- It uses a FIFO queue (SPFA), seeded with the destination at `dist` 0.
|
||||
2. **Neighbours.** The neighbour order is `GridPosition.GRID_FOUR_WAYS` = **UP (row+1), RIGHT (col+1), DOWN (row−1), LEFT (col−1)**. There are **no diagonal edges**.
|
||||
3. **Edge cost.** The cost is `Tile.moveCost` of the neighbour: **1**, or **1000** if the tile is "obstacle-like" (a tile holding an active 阻隔工事). FLY always costs 1.
|
||||
4. **Passability.** A neighbour is used only if it is passable for the motion. For WALK that is `passableMask` ALL (floor, road, start, end, telin, telout, mire, smog, deepsea, infection). `fence_bound`, wall and forbidden tiles are **not** walkable.
|
||||
5. **Relaxation.** Relax only on strict improvement: `if unvisited or dist[cur]+cost < dist[nb]: dist[nb] = dist[cur]+cost; parent[nb] = cur; enqueue if not queued`. With equal costs, a tile keeps the first parent that reached it. That tie-break comes from the BFS order plus the UP/RIGHT/DOWN/LEFT neighbour order.
|
||||
6. **Smoothing** (`_PostprocessAndMakeNextMapSmoothly`):
|
||||
- Visit tiles row 0→H−1, col 0→W−1, updating in place.
|
||||
- For each tile n: `b = parent[n]; while parent[b] exists and LOS(n, parent[b]): b = parent[b]; parent[n] = b`.
|
||||
- Every autochess route has `allowDiagonalMove: true`, so LOS is the **Bresenham** variant (`_RaycastBresenhamLine`). Every tile on the line must be valid and not obstacle-like (`Node.CheckObstacleLikeOrInvalid`). A diagonal step also needs both orthogonal neighbours clear.
|
||||
- With `allowDiagonalMove: false`, LOS is true only for the same row or column (`_RaycastSegmentLine`).
|
||||
7. **Movement.** An enemy moves from its current tile straight toward `parent[tile]`. The field is rebuilt when tiles change, for example when a crate dies (`ClearCache` / `GenerateNextMap`).
|
||||
8. **Crates** (`trap_1105_accrate` 阻隔工事: "改变敌人的行进路线 / 如果阻隔工事阻挡了敌人,敌人会破坏此工事" [DATA]).
|
||||
- They are passable at cost 1000, so enemies route around them when any detour is < 1000 tiles longer.
|
||||
- If a crate is the only way, the enemy walks into it, is blocked, and destroys it.
|
||||
- Moving up and back down is not special-cased. Lane choice is purely this BFS.
|
||||
|
||||
### 3.2 Expected lanes per stage (official algorithm, crates as in each level file's non-hidden predefines)
|
||||
|
||||
| stage | upper gate (12,10) → goal (9,2) | lower gate (9,10) → goal |
|
||||
|---|---|---|
|
||||
| act1 m01 #01 | **row 12** → (12,4) → col 4 → (9,4) → E. Waypoints (12,10)→(12,4)→(9,4)→(9,2) | (9,9) → col 9 up to row 12 → row 12 → col 4 → E. Merges into the upper road. |
|
||||
| act1 m02 #02 (no crates in 下半) | **row 12 all the way** → (12,3) → col 3 → (9,3) → E | (9,9) → (11,9) → **row 11** → (11,6) → col 6 → row 9 → E |
|
||||
| act1 m03 #03 | row 12 → col 6 → **row 10** → (10,3) → (9,3) → E. If 射击台 blocks (10,3)/(10,4) [ASSUMED], it goes (10,5) → (9,5) → row 9. | **row 9** straight |
|
||||
| act1 m04 #04 | (12,9) → (11,9) → **row 11** → (11,4) → (10,4) → (9,4) → E. Smoothed waypoints: (12,10) → (12,9) → (11,9) → (11,4) → (9,4) → E, so it stays on row 11 to col 4. | (9,9) → (10,9) → **row 10** → (10,4) → (9,4) → E |
|
||||
| act2 m01 #05 | one snake for both gates: col 9 down → row 9 → col 7 up → row 12 → col 5 down → row 9 → E | same snake (enters at (9,9)) |
|
||||
| act2 m02 #06 | row 12 → **col 7 (mire)** → row 9 → E. Crates on col 9 at (10,9)/(11,9). | **row 9** straight |
|
||||
| act2 m03 #07 | **row 12** → col 4 → E | (9,9) → (10,9) → row 10 → (10,6) → (9,6) → row 9 → E |
|
||||
| act2 m04 #08 | **row 12** → (12,4) → col 4 → E | row 9 → (9,6) → col 6 up (deep water) → row 11 → (11,4) → col 4 → E |
|
||||
|
||||
The raw BFS chains and smoothed waypoints are in scratch `lanes_official.txt`.
|
||||
|
||||
**Remake deviation (user playtest #2, 2026-09-29).** The user reported the 战场#01 lower-gate enemies walking up the
|
||||
col-9 floor lane, where no operator can block them. `server/sim/grid.js` keeps every official route LENGTH but breaks
|
||||
ties between equal-length routes towards the fewest non-blockable (floor / gate) tiles, and its smoothing never cuts
|
||||
across floor the grid route does not walk. Lanes that change against the table above:
|
||||
- act1 m01 #01, lower gate: (9,10) → (9,8) → **col 8 road up** → (12,8) → row 12 → col 4 → E (was col 9 floor).
|
||||
- act1 m04 #04, lower gate: (9,10) → (9,8) → (10,8) → **row 10** → (10,4) → (9,4) → E (no longer cuts across (10,9)).
|
||||
- Boss fields: the exits from (2,10) take the road on 战场#01 / #04 and the right half of 战场#05, and cross less floor on
|
||||
战场#02 / #07. Floor the terrain forces stays (gates, (12,9) beside the upper gate, the col-9 floor where walls or a
|
||||
crate block the road: #02 lower (10,9)/(11,9), #04 upper (11,9), #05 upper (11,9)/(10,9), #07 lower (10,9)).
|
||||
Full audit: test/sim/pathing-blockable.test.js.
|
||||
|
||||
### 3.3 What we do and the root cause of "upper-gate enemies walk the lower lane"
|
||||
|
||||
- **Our pathfinder.** `server/sim/grid.js` is **8-directional A\*** with diagonal cost √2 and a no-corner-cut rule. It is limited to the field rect (rows 9–12, cols 0–10). Neighbour order is W, E, S, N, then diagonals.
|
||||
- **Crates and platforms.** Crates and platforms/mounds are **impassable** (with an `ignoreObstacles` fallback) instead of cost 1000.
|
||||
|
||||
| stage | ours, upper gate | official | effect |
|
||||
|---|---|---|---|
|
||||
| act1 m02 | 12,10 → 12,9 → 12,8 → 12,7 → 12,6 → **11,6 → 10,6 → 9,6** → row 9 (lower road) | row 12 → col 3 (top road) | **Wrong lane.** Two causes: (a) `data/stages.json` marks crates `trap_1105_accrate#001–004` at (12,4), (12,5), (11,7), (11,8) as `active: true`, although the level file has them `hidden: true` and the PRTS 下半 screenshot shows none, so the top road is blocked; (b) even without crates, the 8-dir metric makes col 6 (10.41) shorter than the top road (11). |
|
||||
| act1 m04 | 12,10 → 12,9 → 11,9 → **10,8** → row 10 | row 11 (upper row of the 2-wide band) | Upper-gate enemies join the lower-gate lane at once. |
|
||||
| act1 m03 | … (10,6) → **(9,5)** → row 9 | row 10 → (10,3) (if platforms are walkable) | joins the lower lane 3 tiles early (platform rule [ASSUMED]) |
|
||||
| act1 m01 (lower gate) | (9,9) → (10,8) → col 8 up | col 9 up | small visual difference |
|
||||
| act2 m01–m04 | same lanes as official (diagonal corner cuts only) | — | OK |
|
||||
|
||||
The historical note on act1 m02 [DATA]:
|
||||
|
||||
- The **上半** PRTS image shows crates at (12,4) and (12,5).
|
||||
- The **下半** `ver2` image shows none. The current level file has all m02 crates and platforms `hidden`.
|
||||
- The terrain effects `map_m02_1/2` ("阻隔工事变为射击台" / "移除全部阻隔工事") still exist in the 下半 `effectInfoDataDict`. The 战术决策 card pools are server-side, so they may still be offered.
|
||||
- On 下半 m02, applying them can only remove crates that are already hidden, or show the hidden 射击台 via the platform aliases [ASSUMED].
|
||||
- They are no reason to start with crates.
|
||||
- **The 下半 m02 has no crates at start.**
|
||||
|
||||
### 3.4 Pathing spec to implement (replaces `Grid.findPath` for ground enemies)
|
||||
|
||||
```
|
||||
flowField(dest, {obstacleCost = 1000, allowDiagonal = true}): // cache per (dest, grid.version)
|
||||
dist = Int32Array(ROWS*COLS).fill(-1); parent = Int32Array(...).fill(-1); inQ = Uint8Array
|
||||
q = FIFO; dist[dest] = 0; q.push(dest)
|
||||
while q: cur = q.shift(); inQ[cur] = 0
|
||||
for (dr,dc) of [[+1,0],[0,+1],[-1,0],[0,-1]]: // UP, RIGHT, DOWN, LEFT — do not reorder
|
||||
nb = cur+(dr,dc); if !inMap(nb) || tile(nb).pass !== 'ALL': continue
|
||||
nd = dist[cur] + (isCrate(nb) ? obstacleCost : 1)
|
||||
if dist[nb] < 0 || nd < dist[nb]: dist[nb] = nd; parent[nb] = cur; if !inQ[nb]: q.push(nb); inQ[nb]=1
|
||||
// smoothing, row-major, in place
|
||||
for r in 0..ROWS-1: for c in 0..COLS-1: n=(r,c); if dist[n]<0 || parent[n]<0: continue
|
||||
b = parent[n]; while parent[b] >= 0 && los(n, parent[b]): b = parent[b]; parent[n] = b
|
||||
los(a,b): Bresenham from a to b; every visited tile passable && !crate; on a diagonal step also both
|
||||
orthogonal neighbours passable && !crate (allowDiagonal=false ⇒ same row or same col only)
|
||||
```
|
||||
|
||||
- A ground enemy at tile t with a leg to D moves straight toward `parent_D[t]`. It re-reads the field on entering a new tile, or when `grid.version` changes.
|
||||
- The whole 19×21 map may be used as the official does. Keeping the field rect is harmless for normal rounds, because no shorter path leaves it.
|
||||
- `remainingDistance` (targeting "closest to goal") should use `dist_D[t]` plus the leg tail. The official exposes `TryCalculatePathFindingDistance` on the same field.
|
||||
- **Performance.** One BFS over 399 tiles per destination and grid version replaces one A\* per enemy leg. It is also deterministic across clients.
|
||||
|
||||
---
|
||||
|
||||
## 4. Enemy preview (prep phase) [DATA, client `AutoChessEnemyPreviewManager`]
|
||||
|
||||
### 4.1 Which enemies use which gate
|
||||
|
||||
The gate is the start of the action's route. R1–R3 use only the lower gate. Notation: `class count @ preDelay / interval` (game seconds). E.g. `N3@7/5` = 3 enemies of the N slot, the first at 7 s, then one every 5 s. Counts are template counts before replacement (§2.3).
|
||||
|
||||
| R | tpl | lower gate (9,10) | upper gate (12,10) |
|
||||
|---|---|---|---|
|
||||
| 1 | 01 | 源石虫2@3/5 N2@12/3 NF2@12/3 | — |
|
||||
| 2 | 02 | N3@3/5 N3@15/7 NF4@3/7 NF5@15/7 | — |
|
||||
| 3 | 03 | N10@6/6 E1@18/10 NF9@6/7 EF2@10/10 | — |
|
||||
| 4 | 04 | N2@12/4 E1@13/12 S1@29/7 NF2@3/6 NF3@26/6.5 EF3@17/9 SF2@18/9 | N2@3/6 NF3@7/8 |
|
||||
| 5 | 05 | N3@7/5 N3@27/5 E2@14/7 S1@25/9 NF3@3/6 NF4@16/5 EF3@17/1 SF2@31/6 | N2@3/10 N3@22/8 NF3@5/6 NF3@22/6 |
|
||||
| 6 | 06 | N4@7/8 N3@16/8 E2@20/12 S2@28/14 NF4@2/5 NF4@20/7 NF4@27/5 EF3@17/1 SF3@29/5 | N3@2/8 N3@19/8 NF4@7/8 |
|
||||
| 7 | 07 | N4@8/5 N4@22/9 E4@5/17 S2@12/14 S1@40/14 EF3@17/11 SF1@9/12 SF1@13/12 EF2@41/11 NF2@2/10 NF8@27/4 | N3@2/8 N3@18/10 NF4@5/5 NF1@30/5 |
|
||||
| 8 | h01 | N3@2/3 N3@28/5 N2@62/5 E1@37/9 S3@42/9 NF2@3/5 NF2@25/5 EF2@17/5 SF1@10/20 | N3@11/1 E2@17/10 S1@9/12 NF2@5/7 NF2@13/5 EF3@39/5 SF3@28/12 |
|
||||
| 9 | h02 | N3@2/5 N3@42/7 N3@65/5 E2@17/10 S1@13/16 S1@40/5 NF2@3/3 EF3@28/5 | N3@3/5 N3@39/5 E1@41/10 NF1@3/1 NF2@13/5 NF3@20/5 EF2@41/5 SF1@7/7 SF3@21/12 |
|
||||
| 10 | h03 | N3@3/5 N3@25/5 N3@49/5 E3@17/10 E1@41/10 S1@57/5 NF2@7/5 EF3@28/6 | N2@3/4 N4@5/5 S3@17/13 NF2@3/4 NF3@5/5 NF2@13/5 EF2@41/5 SF1@10/10 SF3@25/10 |
|
||||
| 11 | h04 | N2@5/2 N3@22/2 N2@45/5 N2@50/5 E1@10/9 E3@54/7 S2@17/5 S4@42/5 NF3@27/2 EF3@28/2 EF2@52/2 SF2@17/2 | N2@5/5 N2@10/5 S1@6/20 NF2@3/3 NF2@5/5 NF4@9/5 EF1@20/5 SF1@7/10 SF2@21/10 |
|
||||
| 12 | h05 | N3@5/3 N2@30/3 N2@10/3 N3@35/5 N3@51/4 E2@12/10 E2@37/9 E2@53/7 S3@2/10 S3@10/10 S2@31/10 NF3@10/3 NF3@27/2 EF3@28/2 EF3@47/6 SF2@12/5 SF3@22/6 SF2@35/5 | N2@5/3 E3@10/10 S2@21/12 NF2@5/1 NF3@8/4 NF3@21/5 NF3@43/5 EF2@13/5 EF2@15/5 SF2@17/10 |
|
||||
| 13 | h06 | N3@7/3 N3@10/5 N3@39/5 N3@62/4 E3@11/9 E4@37/9 E3@55/9 S4@2/10 S4@10/7 S3@32/10 NF3@27/2 EF4@28/2 EF3@55/7 SF2@10/5 SF3@22/5 SF2@35/5 | N1@7/1 E2@3/10 S2@21/15 NF2@5/1 NF3@21/4 NF3@50/5 EF2@13/5 EF1@15/5 SF3@17/11 |
|
||||
|
||||
- FLY actions also start at a gate (their routes start at (9,10) or (12,10)), so they are previewed at that gate.
|
||||
- Only the **valid** actions of the round's movement class appear (§2.3).
|
||||
- Leader rounds use the boss field gates (2,10) and (5,10) with a row offset of 13, which lands in the same pen.
|
||||
|
||||
### 4.2 Placement algorithm
|
||||
|
||||
1. **Preview entries.** For each valid round action there is one entry `{preDelay, startPosition = routes[action.routeIndex].startPosition, enemyKey, count}`. The boss action is added in leader rounds. Entries are sorted by `preDelay` (`_CompareActionByTime`).
|
||||
2. **Thinning.** Let `total = Σ count`.
|
||||
- `showRatio = min(1, 50/total)` and `totalShowCnt = min(50, total)`. `MAX_PREVIEW_CNT` = 50.
|
||||
- Per entry, `n = max(1, round(count·showRatio))`.
|
||||
- An enemy whose handbook `enemyLevel` ≠ NORMAL (elites, bosses) always uses ratio 1.
|
||||
- **Each enemy is shown as its own model.** The preview has no count badge.
|
||||
3. **Pen and zones.**
|
||||
- The pen is `enemy_place_rect ((14,7),(18,13))` (stage `configBlackBoard`).
|
||||
- The zone anchors are the `tile_start` tiles in the rect: **(15,7)** and **(18,7)**.
|
||||
- Every other pen tile with `passableMask` ALL and without `previewNotAlloed` belongs to the Manhattan-nearest anchor. Row 16 is excluded.
|
||||
- **Lower zone** = rows 14–15 (13 tiles). **Upper zone** = rows 17–18 (13 tiles). Each list is in row-major order (low row first, col 7→13).
|
||||
4. **Zone choice.**
|
||||
- Target = `(start.row + enemy_preview_row_offset, start.col)`. The offset is 6 by default (13 in leader rounds); neither key is set in the stages, so the defaults apply.
|
||||
- The zone is the anchor with the smallest `|anchor.row − target.row| + |anchor.col − target.col|` among anchors with `anchor.row ≤ target.row`.
|
||||
- Result: lower gate (9,10) → the (15,7) zone; upper gate (12,10) → the (18,7) zone.
|
||||
5. **Tile choice.** The k-th model sent to a zone goes to `zoneTiles[clamp(round(k/totalShowCnt·len) + Random.Range(−1,0))]`. Several models may share a tile. When no zone fits, a random pen tile is used.
|
||||
6. **Camera.** In the official 3D camera the pen sits top-right, beyond the gates.
|
||||
- For our 2D board, render the pen rows 14–18 (the stage already has them).
|
||||
- Alternatively, render two gate-anchored zones next to the gates: the upper zone beside (12,10) and the lower zone beside (9,10). That is what the user remembers ("右侧上下红门后方").
|
||||
- Keep the grouping exact: one zone per gate.
|
||||
|
||||
---
|
||||
|
||||
## 5. Secondary: bounty and 联防 spawn mapping [DATA, client `AutoChessLevelEnemyManager`; partially decoded]
|
||||
|
||||
**Bounty (悬赏) and extra enemies** (`_InsertSpActionToNormal`, `_GetSpEnemyActionData`):
|
||||
|
||||
- Each added enemy is attached to the first action of the round's **original** template whose key is `templateEnemyNormal` (walker) or `templateEnemyNormalFly` (flyer). Summoned tokens use `templateEnemyToken` / `templateEnemyTokenFly` instead.
|
||||
- If no action matches, it uses action 0.
|
||||
- All units attached to that action are then spread evenly over its window: `preDelay + i·max(window/n, 0.05·window)`.
|
||||
- So a walking bounty enters at the round's first N action gate. That is the lower gate in every round, because action N#1 always starts at (9,10).
|
||||
|
||||
**联防:**
|
||||
|
||||
- Each leaked enemy maps to the escaped template's action as follows:
|
||||
- walkers → the `lrsldr` action (route 3: WALK from (9,18) via (9,10), or from (9,10) in `escaped_single`; preDelay 3, interval 8),
|
||||
- flyers → the `yokai` action (route 0),
|
||||
- tokens → `gopro_2` / `lazerd`.
|
||||
- Elite and special leakers are **not** routed through the E/S actions (the class is ignored).
|
||||
- Timing is recomputed per owner uid (`_CalculateActionPredelayConsiderUid`; constants `ACTION_INTERVAL_FOR_UID` 0.5 s, `MAX_ACTION_INTERVAL_FOR_UID` 5 s). The exact formula was not decoded [ASSUMED: 0.5 s spacing within an owner, capped at 5 s].
|
||||
- Helper order [WIKI 帮助]: most units on the field (downed included) > has an active bond (?) > highest bond layers (?) > most undowned units. The first helper takes the right-hand field. With 3 perfect players, the top 2 by the same order help.
|
||||
|
||||
---
|
||||
|
||||
## 6. Deviations from official numbers (custom balance and assumptions)
|
||||
|
||||
| # | Where (ours) | Current | Official | Source | Action |
|
||||
|---|---|---|---|---|---|
|
||||
| 1 | `server/match/waves.js` `replaceSlot` / `templateSpawns`; `data/factions.json` `generation.kFormula` | each template **enemy** → k copies (k ≤ 5), 0.5 s stagger | each template **action** → `clamp(roundHalfEven(n·BE_t/BE_new),1,5)` enemies, interval `n·iv/n'` | [DATA] | replace (§7-1) |
|
||||
| 2 | `setupMatchWaves` / `pickEntries` | 3 factions per match; **every** round: a ground entry from the chosen types + SPECIAL, **and** a FLY entry | 15-slot schedule (3 types × 3 + 6 SPECIAL, shuffled); **one** entry per round | [DATA] | replace |
|
||||
| 3 | `flyPlaceholders` 'keep' (BALANCE §2.2) | 寒霜 / 暴鸰 / 妖怪 stay in ground rounds (the #1 leak source) | the other movement class is **not spawned** (`isValid=false`) | [DATA] + [VIDEO] | drop the knob; implement the rule |
|
||||
| 4 | `pickEntries` `inactiveIn`, `pickReplacement` filters attached keys | inactive list also filters N/E replacements | only `specialEnemyKey` is filtered | [DATA], [WIKI] 上半 note | change |
|
||||
| 5 | `data/tuning.json → modes[*].enemyHpMul / enemyAtkMul` (all 8 modes, e.g. multi 险境 R13 HP ×0.55) | custom per-round multipliers from `tools/balance.mjs` | none; only the PRTS table (`config.enemyScale`) | [WIKI] | **delete** (keep `titles.comment_3`, which is unrelated) |
|
||||
| 6 | `data/tuning.json → mode_single_funny.bossHpMul 0.6` | leader pool ×0.6 in solo 标准 | none | — | **delete** |
|
||||
| 7 | `config.bossHpScale` `bloodPoint × alive/4`, solo ×0.25 [ASSUMED] | pool scales with alive players | co-op: split leaders share HP, "敌方领袖的总生命值不变" → pool = `bloodPoint` (no alive scaling found); **solo: unknown** | [WIKI] notice 5114 / PRTS 下半 | co-op: use `bloodPoint` as is; solo: keep a config value, flagged unknown |
|
||||
| 8 | `waves.js bountySpawns` `soloMul 0.7` for "perfect" bounties | bounty HP/ATK/DEF ×0.7 **on top of** the solo 0.7 base | no bounty-specific rule; the "70 %" note is the global solo base, already in `enemyScale` | [WIKI] 上半 11/18 log | remove `soloMul` |
|
||||
| 9 | `bountySpawns` timing | t = 4 s, +5 s per bounty, interval 3, `routeByMotion` | attached to the template's first N / NF action window (§5) | [DATA] | change |
|
||||
| 10 | `buildUniteWave` | grouped by slot class N/E/S/…, compressed into 40 % of the time limit | walkers → `lrsldr` action, flyers → `yokai`, tokens → T/TF; per-owner 0.5 s spacing | [DATA] (partial) | change |
|
||||
| 11 | `config.unite.helperOrder` `highestLpThenSeat` [ASSUMED] | by LP | most units on the field > active bond > layers > undowned units | [WIKI] 帮助 | change |
|
||||
| 12 | `gamedata.combatTimeLimit` ×2 (`COMBAT_TIME_SCALE`) | `maxPlayTime` read as real seconds | unit not stated. The official count rule keeps each action's window, e.g. FLY R2 still spawns its last flyer at ≈ 43 s of "45", so ×2 remains necessary. | [ASSUMED], supported by spawn schedules | keep, but re-check after the count fix |
|
||||
| 13 | `server/sim/grid.js` 8-dir A\*, √2 | see §3.3 | 4-dir SPFA flow field + LOS smoothing | [DATA] | replace (§7-3) |
|
||||
| 14 | `data/stages.json` act1 m02 crates `trap_1105_accrate#001–004` `active:true` | top road blocked | hidden in the 下半 level; absent in the 下半 screenshot | [DATA] + [VIDEO] | set `active:false` |
|
||||
| 15 | crates impassable + `ignoreObstacles` fallback | — | passable at cost 1000, block LOS; blocked enemy destroys the crate | [DATA] | change |
|
||||
| 16 | 射击台 / mounds block ground movement [ASSUMED] | — | unknown (crate and platform token data are identical; behaviour is in the prefab) | — | keep, flagged |
|
||||
| 17 | `config.enemyScale` (HP/ATK only) | — | 下半 text: HP/ATK; 上半 11/18 also named DEF | [WIKI] | keep; optional DEF |
|
||||
| 18 | `economy.income` `min(3+r, 12)` | R4+ assumed | BWIKI (hidden text, older season): "从第2回合开始每回合获得资金数+1,上限12" | [WIKI], weak | keep |
|
||||
| 19 | `previewOf` | one list per key, no gate | per-action models placed in a gate zone (§4) | [DATA] | change |
|
||||
|
||||
Everything in `docs/BALANCE.md` §4 (the tuned tables) and the `tools/balance.mjs --tuning` path becomes obsolete once #1–#6 are applied. The "competent board" model can still be used to *measure* difficulty, but no longer to tune it.
|
||||
|
||||
---
|
||||
|
||||
## 7. Changes required in our implementation (precise diffs vs current behaviour)
|
||||
|
||||
1. **`server/match/waves.js` + `data/factions.json`** (and the data generator in `tools/`):
|
||||
- **Match setup.** `setupMatchWaves` returns `{stageId, factions: [3 types], typeSlots: [15 types], bossId, hiddenBossId}`.
|
||||
- Shuffle the 6 `involveRandom` types and take 3.
|
||||
- Push each `count` (3) times, fill to `maxLevelCnt` (15) with SPECIAL, then Fisher-Yates-shuffle with the match rng.
|
||||
- Store `typeSlots` in match state. It is visible in the briefing as the 3 types, and the slot order stays hidden.
|
||||
- **Round pick.** Add `pickRoundEntry(gd, rng, typeSlots, r)`:
|
||||
- half = `r <= 7`;
|
||||
- candidates = `specialEnemyInfoDict` of that type and half, whose **special** key is not in `mode.inactiveEnemyKeys`;
|
||||
- weighted by `randomWeight`;
|
||||
- `normal = attachedNormal[randInt]`, `elite = attachedElite[randInt]`.
|
||||
- Generate the picks for all 15 rounds at match start (like the client), so the preview and the server agree.
|
||||
- **Replacement.** Replace `templateSpawns` / `replaceSlot` as follows:
|
||||
- For each template SPAWN action whose key is a template placeholder: if `isFly(newKey) !== isFlySlot`, **skip the action** (no spawn, no preview).
|
||||
- Otherwise `n' = clamp(roundHalfEven(f32(f32(n·P(t))/f(t)) / f32(P(new)/f(new))), 1, 5)`, and each unit i spawns at `time + i·max(n·iv/n', 0.05·n·iv)`.
|
||||
- `P = hp + 5·atk + 3·def + 3·res` from the `enemy_database` level-0 attributes (not the autochess overrides).
|
||||
- `roundHalfEven(x) = (x − floor(x) === 0.5) ? (floor(x) % 2 ? floor(x)+1 : floor(x)) : Math.floor(x + 0.5)`.
|
||||
- Keep literal keys and the T/TF tokens unchanged.
|
||||
- Remove `COPY_STAGGER`, the `k` fields (`kS`, `N[].k`, `E[].k`), `flyPlaceholders`, `groundRouteLike` and the `inactiveIn` filtering of attached keys.
|
||||
- **Leader rounds.** `buildBossWave` uses the pick of slot 14 (or 15, or 9 in solo 标准) with the same rule, so only E **or** EF escorts spawn.
|
||||
- **Unit tests** (fixtures from §2.6 / §2.7):
|
||||
- R1 高级军用猎狗 → {源石虫 2, 猎狗pro 4};
|
||||
- R1 炽焰源石虫 → {源石虫 2, 灼热源石虫 5};
|
||||
- R1 萨卡兹大剑组长 → {源石虫 2, 萨卡兹刀兵 3};
|
||||
- R3 FLY 护障 → {妖怪 5, 妖怪MKII 4} and no walkers;
|
||||
- an elite action "2 × 灵幛" → 隐形弩手组长 ×**4** (the tie case);
|
||||
- multi 险境 R3 total ≤ 10 for every entry.
|
||||
2. **Stat scaling and balance.**
|
||||
- Delete every `enemyHpMul`, `enemyAtkMul` and `bossHpMul` in `data/tuning.json`. Keep the `titles` block.
|
||||
- Remove the `soloMul` in `bountySpawns`.
|
||||
- `config.bossHpScale`: co-op pool = `bloodPoint[difficulty]` with no alive-player factor; solo stays a flagged config value.
|
||||
- Keep `enemyScale` (PRTS table) and the 终极 speed ×1.15 from R3.
|
||||
- Re-run `tools/balance.mjs --tuning off` only to report, not to tune.
|
||||
3. **Pathing** (`server/sim/grid.js`, `server/sim/ai.js`, `server/sim/Battle.js`):
|
||||
- Add `Grid.flowField(dest)` as in §3.4, cached per `(dest, version)`.
|
||||
- `planLeg` for WALK: follow the smoothed parents from the enemy's tile to the leg target and re-plan on version change. That is the same trigger as today.
|
||||
- Crates: `setObstacle` marks a cost-1000 obstacle-like tile, not an impassable one. The existing "blocked enemy attacks the crate" logic stays.
|
||||
- `data/stages.json`: set act1 m02 `trap_1105_accrate#001…#004` to `active:false`.
|
||||
- Keep platforms and mounds blocking [ASSUMED].
|
||||
- Add tests: the upper gate on act1 m02 reaches E through (12,3)→(9,3), and on act1 m04 it stays on row 11 down to col 4.
|
||||
4. **Preview** (`previewOf` and the client prep view):
|
||||
- Emit one entry per valid action: `{enemyKey, count, gate: route.start, preDelay, elite}`.
|
||||
- The client places models with §4.2: two zones, ≤ 50 models, elites always shown.
|
||||
- Show upper-gate enemies in the upper zone and lower-gate enemies in the lower zone.
|
||||
- The HUD count stays Σ count.
|
||||
5. **Bounty and 联防**:
|
||||
- `bountySpawns`: attach bounties to the round template's first `lrsldr` / `yokai` action (gate, preDelay, window spread).
|
||||
- `buildUniteWave`: walkers → the escaped template's `lrsldr` action route; flyers → `yokai`; tokens → `gopro_2` / `lazerd`; 0.5 s spacing per owner.
|
||||
- Change `unite.helperOrder` to the PRTS rule (§5).
|
||||
6. **Performance (user item 4).**
|
||||
- Items 1 and 3 cut enemies per board by ≈ 55–70 % (R12: 80 → 35) and replace per-enemy A\* with one BFS per destination.
|
||||
- Measure again before adding other optimisations.
|
||||
|
||||
---
|
||||
|
||||
## 8. Open questions
|
||||
|
||||
| # | Question | Default |
|
||||
|---|---|---|
|
||||
| 1 | Do 射击台 (act1 m03 (10,3)/(10,4)) and 土石结构 block ground movement? | Block [ASSUMED] |
|
||||
| 2 | Leader HP pool in solo, and in co-op with fewer than 4 alive players | co-op `bloodPoint`; solo config value (flagged) |
|
||||
| 3 | Unit of `maxPlayTime` | Real seconds (×2 game) [ASSUMED] |
|
||||
| 4 | Exact 联防 predelay formula (`_CalculateActionPredelayConsiderUid`) | 0.5 s per owner [ASSUMED] |
|
||||
| 5 | DEF reduction in the 70 % / 80 % bases | HP/ATK only (下半 text) |
|
||||
|
||||
Everything else in §2–§4 is decoded from official data or client code.
|
||||
|
||||
---
|
||||
|
||||
## Appendix A. Official client/server split for battles (relevant to user item 5) [DATA, metadata names]
|
||||
|
||||
- The protocol types show that **each client simulates its own battle locally** and reports events to the server:
|
||||
- `AutoChessBattleSceneSelfBattleKillEnemyUp {enemyInstId, attackerInstId, damageSrc}`
|
||||
- `…SelfBattleEnemyEscapeUp {enemyInstId, isToken}`
|
||||
- `…SelfBattleAddBondUp {charInstId, layerDelta, bondIndexList}`
|
||||
- `…SelfBattleFinishUp {round, escapedInstIds, escapedTokenInstIds, killedInsts, charBattleStatusList}`
|
||||
- `…SelfBattleInfoUp {round, charBattleStatusList, charBattleInfoList}`
|
||||
- 联防 uses the same pattern:
|
||||
- `…HelpBattleKillEnemyUp {enemyInstId, isToken, killedByPlayer, attackerInstId, damageSrc}`
|
||||
- `…HelpBattleEnemyEscapeUp`
|
||||
- `…HelpBattleFinishUp {round, escapedEnemies, killInfos}`
|
||||
- The server sends:
|
||||
- `AutoChessBattleSelfBattleInfo {enemyInfos: [{enemyId, actionIndex, instIdList}]}`
|
||||
- `AutoChessBattleHelpBattleInfo {escapedEnemies: [{ownerPlayerIndex, enemyId, enemyInstId, isToken}], players: [{deployment, charBattleStatusList}]}`
|
||||
- **The helper client receives the partner's deployment and end-of-battle status and replays 联防 locally.**
|
||||
- Round enemy data is generated client-side with a shared seed (`RandomEnemyGenerater`). Actions go to the server only if `ShouldActionUpToServer`.
|
||||
|
||||
## Appendix B. Client method RVAs (Windows build in the user's CrossOver bottle, metadata v29) for re-verification
|
||||
|
||||
| method | RVA |
|
||||
|---|---|
|
||||
| `RandomEnemyGenerater._DoReplaceActionDataClient` | 0x180b640f0 |
|
||||
| `_CalculateEnemyCountByBattleEffectiveness` | 0x180b63e70 |
|
||||
| `_CalculateActionBattleEffectiveness` | 0x180b63d50 |
|
||||
| `_GetEnemyAttrPower` | 0x180b65e10 |
|
||||
| `_GenerateSpecialEnemyTypesLocal` | 0x180b655c0 |
|
||||
| `_GenerateRandomEnemyData` | 0x180b64870 |
|
||||
| `_DoReplaceLevelDataClient` | 0x180b64580 |
|
||||
| `_InitData` | 0x180b663f0 |
|
||||
| `SPFA._GenerateNextMapImpl` | 0x180893720 |
|
||||
| `SPFA._PostprocessAndMakeNextMapSmoothly` | 0x1808940c0 |
|
||||
| `SPFA._RaycastSegmentLine` | 0x180894c80 |
|
||||
| `Tile.get_moveCost` | 0x18089cdc0 (obstacle-like ? 1000 : 1) |
|
||||
| `GridPosition..cctor` | 0x18210a800 (FOUR_WAYS = UP, RIGHT, DOWN, LEFT) |
|
||||
| `AutoChessEnemyPreviewManager._GeneratePreviewData` | 0x180b3cad0 |
|
||||
| `AutoChessEnemyPreviewManager._GetBetterGridToSpawn` | 0x180b3d180 |
|
||||
| `AutoChessEnemyPreviewManager._InitIfNot` | 0x180b3d710 |
|
||||
| `AutoChessEnemyPreviewManager..ctor` | 0x180b3e190 (row offsets 6 / 13) |
|
||||
| `<_SpawnPreviewEnemies>d__16.MoveNext` | 0x180b4fc40 (cap 50) |
|
||||
| `AutoChessLevelEnemyManager._CalculateActionPredelay` | 0x180b453c0 (ratio 0.05) |
|
||||
| `AutoChessLevelEnemyManager._GetSpEnemyActionData` | 0x180b466f0 |
|
||||
|
||||
`Il2CppCodeGenModule` for Assembly-CSharp is at VA 0x186e69af0 (217 790 method pointers at 0x188216460).
|
||||
@@ -0,0 +1,471 @@
|
||||
# 09 · Official prep and co-op UX: facing, enemy preview pen, spectating and the combat model, emotes
|
||||
|
||||
Written 2026-09-28. This is research only; no code was changed. It answers the user's test feedback on items 2, 5, 6 and 7, and the part of item 9 about UX ("按照官方原版来").
|
||||
|
||||
**Tags**
|
||||
- **[DATA]**: read from the official client or its game data. This covers `activity_table`, the level JSON, `display_meta_table`, the local Windows client's UI bundles and its il2cpp `global-metadata.dat` (class names, field names and constants, parsed with a v29 metadata reader).
|
||||
- **[WIKI]**: BWIKI 盟约, the official 玩法介绍 long image, and the in-game guidebook pages.
|
||||
- **[VIDEO]**: frames from bilibili gameplay videos, or screenshots.
|
||||
- **[COMM]**: community posts on NGA or Bahamut.
|
||||
- **[ASSUMED]**: our inference or proposal.
|
||||
|
||||
**Precedence:** where this file disagrees with `06-multiplayer-ux.md` or `DESIGN.md` about facing, spectating, selling or the enemy preview, **this file wins**. See §7.
|
||||
|
||||
Evidence was extracted to the scratchpad `research2/`: guide pages, video frames, sprite sheets, `emoji_table.txt` and `meta_*.txt`.
|
||||
|
||||
---
|
||||
|
||||
## 0. TL;DR
|
||||
|
||||
| # | Question | Official answer | Tag |
|
||||
|---|---|---|---|
|
||||
| 1 | Can the facing be set? | **Yes, with the standard Arknights 4-direction deploy wheel.** Drop a unit on a tile and a diamond appears. Swipe toward UP, RIGHT, DOWN or LEFT; the rotated attack range previews live. Release to confirm. Tap "✕ 点击取消" or release in the centre to cancel. Moving a deployed unit (drag it to a tile) goes through the same step. The facing is stored per chess (`ChessPositionInfo.direction`) and persists between rounds. | DATA + VIDEO + WIKI |
|
||||
| 2 | Enemy preview | The enemies of the coming round stand physically in a **preview pen** behind the gates: rect `((14,7),(18,13))`. Row 16 is kept empty. The upper-gate group stands in rows 17–18, the lower-gate group in rows 14–15. They are placed in spawn-time order, fill outward from the pen's gate column, and several may share a tile. At most **50** are shown. They idle and face left. The pen is visible at the top edge of the prep camera; the HUD button **[🔍▶▶]** pans there in 0.25 s. | DATA + VIDEO |
|
||||
| 3a | Spectating | In prep you can view teammates' boards: tap an avatar, then **前往查看**. After your own combat ends ("⌛ 作战结束,等待队友完成作战") you can do the same to watch a teammate still fighting. In the Final Assault you cannot see the other pair. There is **no** always-on ‹ › switcher during normal combat. The ‹ › pill exists only inside the shared 联防 and Final Assault fields (left half / 全景 / right half). | DATA + WIKI + VIDEO |
|
||||
| 3b | Where combat is computed | **On each client.** The client simulates its own battle and reports it to the scene server: kills, escapes, finish, bond-layer gains, operator HP/SP. The server owns economy, shop, board and phases, and sends a shared `stageSeed`, the enemy lists, the 联防 setup (leaked enemies plus helpers' deployment and HP/SP) and the boss setup. | DATA (client network classes) |
|
||||
| 4 | Emotes | Image only, no text (`ChatReq{emojiGroup, emojiId}`). The pop bubble holds only the icon. There are 6 in-match themes × 6 = **36** battle emotes. The 交流 button sits bottom-left; the panel shows 6 emotes and you swipe to change theme. Cooldown 1 s, bubble 3 s. The bubble appears beside the sender's row in the left player list. | DATA + WIKI |
|
||||
| 5 | Other | Sell with the **出售 +1** button on the tapped unit's selection diamond, not by dragging. Items: **销毁** only. Buying and upgrading take two taps (first tap shows the confirm state). The strategy draft marks a teammate's pick as **队友已选**. | DATA + WIKI |
|
||||
|
||||
---
|
||||
|
||||
## 1. Facing and direction in prep
|
||||
|
||||
### 1.1 Evidence
|
||||
|
||||
1. **Official 玩法介绍 long image, 干员 section [WIKI]** (https://img.71acg.net/sykb~bbs/pc/1763033996225879, y≈6850–7080).
|
||||
- A 3-frame strip: card on the bench → unit on a tile with an **orange wedge** at the right of its ground ring → dragging a deployed unit to a new tile.
|
||||
- The third frame shows a **white diamond** centred on the target tile and a red **"✕ 点击取消"** tag on the diamond's upper-left edge. Green highlights mark the legal tiles, and a ghost of the unit sits in the centre.
|
||||
- Caption: "拖拽干员即可将干员从整备区部署到战场区,也可以直接拖拽已经部署完毕的干员来改变他们的作战位置。"
|
||||
2. **In-game tutorial of 卫戍协议 (上半), BV1tFUAYnEfZ, 4:56–5:14 [VIDEO].**
|
||||
- Amiya says: "**干员的部署方式与其他模式没有区别**,通过拖拽将干员从手牌区部署至战场。"
|
||||
- Frames at 5:08–5:11 show the standard AK deploy wheel: a white diamond, a smaller inner diamond with 4 corner chevrons, "✕ 点击取消" at the upper-left, and the finger swiping right.
|
||||
- The right chevron lights up and the **attack range appears as orange/yellow striped tiles** in that direction. A tooltip reads **"拖回中心区域取消"**.
|
||||
- After release, the unit stands with an orange "›" wedge on its ground ring.
|
||||
- At 5:13: "已部署的干员可以直接拖拽改变部署位置。"
|
||||
3. **Client network data [DATA].**
|
||||
- `Torappu.Battle.AutoChess.ChessPositionInfo { instId, position, chessType, direction }` is what the client sends in `AutoChessBattleSceneChangePositionUp { deployCount, unitPositionInfo }` and in `AutoChessBattleSceneUseMagicUp { instId, deployCount, unitPositionInfo }` (Arts too).
|
||||
- The server echoes `ChangePositionDn { boardStatus: AutoChessBattleBoardStatus { uidIndex, positions, updatedBonds } }`.
|
||||
- The prep state `AutoChessBattlePreparationStatus.positions` holds these entries.
|
||||
- So facing is a stored, server-known, per-chess field. It persists until the unit is moved again.
|
||||
4. **Selection diamond (underframe) of the autochess character menu [DATA]**, bundle `ui/autochess/[uc]autochessbattle.ab`.
|
||||
- `act2autochess_panel_character_menu/btn_panel_root/root/group_masks/{mask_up, mask_right, mask_left, mask_down, cancel_mask, block_mask}`: the 4 direction quadrants and a cancel mask.
|
||||
- `util_btn` has sprite `icon_sell`, a `price_root/price_txt` ("+1"), a `coin_panel`, a `pc_key_holder`, and funcId `autochessSale`.
|
||||
- Code fields: `_underFramePanelBtnParamSellPos` and `_underFramePanelBtnParamDestroyPos`.
|
||||
5. **Facing matters in the rules [DATA][COMM].**
|
||||
- The act2 m01 blowers (`trap_013_blower`, dir DOWN) give operators facing **with** the airflow +30 % ATK and **against** it −30 % (`blower_s_character[equal].atk`). This only works with UP/DOWN facing.
|
||||
- 叙拉古正装: "左右两格" perpendicular to the facing. 歌利亚头盔: "前方一格".
|
||||
- 画卷 range `1-1`: its own tile plus the tile in front.
|
||||
- Garrisons that target "身前一格": 寒克 "给身前一格的干员挂上一个特质", 魔王 "使身前一格的干员特质…" [VIDEO BV1h6DjBoE3T 0:12–0:30]. 铃兰 and 赛媽 are "对着" stackers [COMM Baha 12294].
|
||||
- NGA t45645958: "最前一排可部署位不管朝向哪边都可以攻击到 [the boss]". Players pick facings, and write layouts as "空→←白".
|
||||
|
||||
### 1.2 Spec (implement exactly)
|
||||
|
||||
| Aspect | Official behaviour | Tag |
|
||||
|---|---|---|
|
||||
| Directions | 4 directions: `UP`, `RIGHT`, `DOWN`, `LEFT` (AK `Direction`). The range grid (`[dRow, dCol]`, facing RIGHT) is rotated per DATA.md: RIGHT `(dr,dc)`, UP `(dc,−dr)`, LEFT `(−dr,−dc)`, DOWN `(−dc,dr)`. Row 0 is the bottom. | DATA |
|
||||
| Placing from the bench | 1. Drag the card or bench unit; legal tiles glow green (melee/ranged rules unchanged). 2. Release on a legal tile: the board **keeps the ghost on the tile** and opens the direction diamond. The diamond is centred on the tile, about 3 tiles across its diagonal, with 4 chevrons and a red "✕ 点击取消" tag on its upper-left edge. 3. Press and drag from the centre toward a side; past the centre dead-zone (~0.5 tile) that side's chevron lights and the **rotated range tiles are shown striped orange**. While outside the centre, the tooltip "拖回中心区域取消" is shown. 4. Release: the unit is committed with that direction. Release inside the centre, or tap ✕, and the placement is cancelled (the unit goes back to where it came from). | VIDEO + WIKI |
|
||||
| Moving a deployed unit | Drag the unit to any legal tile, **including its own tile**. The same diamond opens. The original stays visible until confirmed; cancelling leaves the unit and its facing unchanged. Re-orienting in place = drag the unit onto its own tile and swipe a new direction. | WIKI + ASSUMED (own-tile case) |
|
||||
| Tap a deployed unit | Opens the selection diamond (underframe) around the unit and shows its **attack range tiles** on the board (orange). Buttons on the diamond: **撤退** (red runner icon, upper-left; unit returns to the bench) and **出售 +1** (coin badge, upper-right). The left side shows the detail card: portrait, tier, LV, ATK/DEF/RES/block/cost, an "攻击范围" mini-grid, bond icons, and tabs 特质/技能/特性/天赋/装备. You cannot rotate from this menu. | DATA + WIKI |
|
||||
| Default facing | Every player-initiated placement goes through the wheel, so there is no silent default. Server-created board units (effects such as 外勤医疗 or 预备干员, bots, and back-compat) default to **RIGHT**, toward the gates. | ASSUMED |
|
||||
| Persistence | Facing is stored with the position and survives round changes. At combat start units auto-deploy on their tiles **with their facing**, in order **top→bottom, then left→right** (盟约下). | DATA (positions) + COMM (order) |
|
||||
| Melee, ranged, medic | All use the same wheel. The range preview uses the unit's own rangeGrid (heal range for medics). Blocking and "front" logic use the facing vector. | DATA |
|
||||
| Summons (tokens) | Each summon is its own bench card ("干员及其召唤物会自动加入整备区"), placed and moved freely with the same wheel. Retreating the owner also retreats its summons. | WIKI |
|
||||
| Equipment | Dragged onto a unit (board or bench). No direction step. A third item opens the equip-replace dialog (`UseEquipUp { charChessInstId, equipChessInstId, isChangeEquip, unloadInstId }`). | DATA |
|
||||
| Arts (画卷 / 教鞭 / 神秘顾客) | Dragged onto a map tile. `UseMagicUp` carries `unitPositionInfo` including `direction`, so an Art also gets the direction step. For 画卷 (range `1-1`) the direction picks **which neighbouring tile** is "in front" and copied. | DATA + ASSUMED (wheel shown for Arts) |
|
||||
| Range preview elsewhere | The shop card and detail panel "攻击范围" show a mini-grid (facing RIGHT). On the board the rotated range appears only in the wheel and on the selected unit. | DATA + VIDEO |
|
||||
| Facing indicator | While not selected, an orange wedge "›" on the unit's ground ring points in the facing direction (prep and combat). The model is Front for RIGHT and DOWN, Front mirrored for LEFT, and Back for UP when a Back model exists. | VIDEO + DATA (ASSETS.md) |
|
||||
| Final Assault, right side | The right-hand player's board is **mirrored left↔right**: `ConvertChessPositionInfoToBossMap` [DATA]; "分到右边只是把你的场地镜像翻转了过来,本来的蓝门方向和接敌方向并不会变" [COMM NGA t45645958]. Mapping: col `c → 20−c`, RIGHT↔LEFT, UP and DOWN unchanged. FA prep takes place on your own half of the shared field (camera `right_boss_prepare_camera_param (5.93,−6.68,−2.46,1)`), with the same wheel. | DATA + COMM |
|
||||
|
||||
---
|
||||
|
||||
## 2. Enemy preview pen in prep
|
||||
|
||||
### 2.1 Evidence
|
||||
|
||||
- **Level config, identical in all 11 stages [DATA]:** `configBlackBoard` has `enemy_place_rect "((14,7),(18,13))"`, `enemy_camera_param "(0,7.86,0.9,1)"` (camera shift toward the pen), `left_prepare_camera_param "(-4.67,0.3,-2.46,1)"` and `move_time 0.25`.
|
||||
- **Pen tiles:** row 16 of the pen carries `previewNotAlloed=1`. Pen starts `S` sit at **(18,7)** and **(15,7)**.
|
||||
- **Client class `Torappu.Battle.AutoChess.AutoChessEnemyPreviewManager` [DATA]:**
|
||||
- Fields: `MAX_PREVIEW_CNT` (const, decoded **50**), `m_mapRowOffset`, `m_bossMapRowOffset`, `m_betterGridToSpawn`, `m_backUpTiles`, `m_gridSpawnStatus`, `m_previewEnemyData`, `m_spawnedEnemy`.
|
||||
- Methods: `_GeneratePreviewData`, `_GetBetterGridToSpawn`, `_SpawnPreviewEnemies`, `_CompareActionByTime`.
|
||||
- Related buff key: `autochess_enemy_preview_buff`. Config key name: `enemy_preview_row_offset`.
|
||||
- Server data behind it:
|
||||
- `AutoChessBattleRoundEnemyInfo { enemyType, enemyKey, actionIndex, count, round }`
|
||||
- `AutoChessBattleEffectEnemyInfo { effectInstId, enemyId, count }`, the per-player extras (bounties, 特训) in `PreparationStatus.effectEnemies`.
|
||||
- **Screenshot of the pen view [VIDEO]** (https://i.meee.com.tw/wdRAguq.png, round 4):
|
||||
- A 7×5 tiled pen with red wire-cube gates at its left edge (top row and 4th row).
|
||||
- The upper group stands by the top gate and the lower group by the lower gate. Row 16 is empty.
|
||||
- Enemies stand individually in formation. Several share a tile as small clusters of the same kind. They face **left** and idle. No count badges, no HP bars.
|
||||
- HUD: the left button shows **[🔍◀◀]** (mint) and the right button **[🔍]** (grey).
|
||||
- **Prep screenshots [VIDEO]** (Bahamut c32edaf…, 4995084…; BV1H3wtziEbY):
|
||||
- At the normal prep camera, the pen's front rows with their enemies are visible **at the top-right edge, behind the upper red gate**.
|
||||
- The HUD shows **[🔍]** (mint, left of the round box) and **[🔍▶▶]** (amber, right of the LP).
|
||||
- **Community tip [COMM Baha 12294]:** "前三回合怪只走下面的紅門(可以看右上角的放大鏡了解出怪路線)"; "右上角看敵方出怪(靠上面代表走上面那路,4T後才會出上路怪)".
|
||||
- **HUD bindings [DATA]:**
|
||||
- `btn_check_enemy` (funcId `autochessViewEnemy`, `OnToggleEnemyInfo`): sprites `btn_check_enemy` (🔍▶▶ amber) and `btn_check_enemy_unfold` (grey).
|
||||
- `btn_check_player` (`OnTogglePlayerInfo`): sprites `btn_check_player_normal` (🔍 mint; opens the **本局信息** dialog `autochess_hud_player_info_dialog`: mode, strategy, disabled bonds and banned operators) and `btn_check_player_back` (🔍◀◀; returns from the pen).
|
||||
- **Boss rounds:** `m_bossMapRowOffset` exists [DATA]. In the official FA prep image the boss stands on the boss field with its HP bar during prep [WIKI intro image, 最终攻势 section].
|
||||
|
||||
### 2.2 Spec
|
||||
|
||||
| Aspect | Rule | Tag |
|
||||
|---|---|---|
|
||||
| Content | Every enemy of **your** coming round: the wave-template actions after special-enemy replacement, plus your `effectEnemies` (bounties, 特训, 教鞭/神秘顾客). One figure per enemy instance, including flyers. Capped at **50** figures. | DATA (+ASSUMED that effect enemies are included) |
|
||||
| Location | Pen rect rows 14–18 × cols 7–13 on the stage grid. Row 16 is never used. Enemies whose route starts at the **upper gate (12,10)** go to rows **17–18**; **lower gate (9,10)** to rows **14–15**. This matches a +6 row offset from the board gate to the pen gate (row 18/15). | DATA + VIDEO |
|
||||
| Order and packing | Sort by spawn time (`_CompareActionByTime`: wave `preDelay + i·interval`). Fill from the tile nearest the pen gate (col 7) outward along the two rows (col 7→13). Allow several enemies per tile, offset slightly (the screenshot shows 3 on one tile). Proposal: up to 3 per tile before moving on, then `m_backUpTiles` = any free pen tile. | DATA (method names) + VIDEO + ASSUMED (3/tile) |
|
||||
| Look | Enemy spine in **Idle**, facing **left**, not moving, no HP bar, no targeting, normal colours. No count badge and no bounty marker was observed. | VIDEO + ASSUMED (no bounty marker) |
|
||||
| Visibility | The pen is part of the scene, so its front rows show at the top edge of the prep camera, behind the upper gate. **[🔍▶▶]** pans the camera to the pen (tween 0.25 s); **[🔍◀◀]** or the same button pans back. It is available only in prep (休整期; the tip says "休整期可以查看当前回合即将迎击的敌方单位"). The pen empties when combat starts. | DATA + VIDEO |
|
||||
| Intel | Tap an enemy in the pen for its detail card (name, stats, abilities), as with a tapped enemy in battle. There is no separate list panel in the official game. The briefing and S.W.E.E.P. handbook list the match's special enemies and the leader. | ASSUMED (tap) / DATA (no list UI found) |
|
||||
| Teammates | When you view a teammate's board in prep, their pen (their enemies) is shown too. | WIKI intro image |
|
||||
| Boss round | During the boss round's prep, the leader and its escorts preview on the **boss field** (`m_bossMapRowOffset`). The boss stands with its HP bar next to its spawn. | DATA + WIKI |
|
||||
|
||||
---
|
||||
|
||||
## 3. Spectating, waiting, 联防, Final Assault, and the combat model
|
||||
|
||||
### 3.1 Official UI facts
|
||||
|
||||
**Data tips [DATA]:**
|
||||
- "休整期可以查看队友的战场情况"
|
||||
- "最终攻势中,两名参与者会处于同一个战场,但无法查看另一组队友的战场情况"
|
||||
- "只有达成完美作战的队友可以进行联防"
|
||||
- "进行联防时,盟约不会继续叠加"
|
||||
|
||||
**BWIKI 盟约 [WIKI]:** "如果感到无聊,博士可以在下一个休整期开始之前,通过点击队友头像前往其场地,查看他们的作战情况。"
|
||||
|
||||
**Official intro image [WIKI]:**
|
||||
- Prep: "博士可以在休整期通过点击队友头像前往其场地,查看队友们的部署情况。"
|
||||
- Screenshot: tapping a teammate's avatar expands a mint **"前往观战/前往查看"** button under it.
|
||||
- While viewing, your own row becomes a white **"返回战场"** button, the viewed row gets an eye badge, and a bottom-centre pill shows **"👁 华法琳#"**.
|
||||
- 联防 screenshot: the pill reads **"‹ 👁 阿米娅#"**. The HUD capsule shows `0/1` plus an orange runner tag `×1` (escaped count, `tag_miss`), and "层数叠加已禁用" under the bond disc.
|
||||
|
||||
**Player list item (`player_status_item`) [DATA]:**
|
||||
- Nodes: `emoji_ref_rect`, `connect_status/{mask_dead, mask_reconnect, mask_quit}`, `icon_self` (green person), `icon_watch_other` (eye), `player_hp`, `action_status/{complete_part ✓, moving_part •••}`.
|
||||
- `normal_ob_part/btn_ob_other` "前往查看"; `disable_ob_part` (`EventOnBtnObNotAvail`); `cancel_ob_part` "返回战场".
|
||||
|
||||
**Observe panel (`AutoChessBattleObInfoPanel`) [DATA]:**
|
||||
- Nodes: `_textNickName`, `_textNickNumber`, `_obOtherPartGO` (👁 name#1234), `_obSelfPartGO` ("你自己"), `_obEmptyPartGO` ("无人在家"), `_obOverviewPartGO` (overview; design text "全屏", the shipped screenshot says **"全景"**), `_leftArrowGo`, `_rightArrowGo`.
|
||||
- A player-quit overlay reads "当前玩家已离开 / 可自行切换查看其他玩家".
|
||||
- Toasts: `AUTO_CHESS_BATTLE_ALREADY_OBSERVE` and `AUTO_CHESS_BATTLE_OBSERVE_NOT_AVAIL`.
|
||||
|
||||
**View model (`AutoChessBattlePlayerStatusGroupModel`) [DATA]:** `canObserveOther`, `canObLeft/canObRight`, `m_leftBattleObIdx/m_rightBattleObIdx`, `m_mapLayer` (`AutoChessBattleMapLayer {START, LEFT, MID, RIGHT, END}`), `isObOverview`, `FindFirstAvailObTarget`, `CheckIfCancelObValid`.
|
||||
|
||||
**Waiting and phases [DATA][VIDEO]:**
|
||||
- Bottom tips (`panel_bottom_tips`): `TIP_WAIT_FINISH` = **"⌛ 作战结束,等待队友完成作战"**, plus `TIP_READY`, `TIP_HAND_FULL` and `TIP_HAND_OVERFLOW`.
|
||||
- Bahamut screenshots after combat show only that pill, with **no** view switcher. Finished teammates show ✓ and fighting ones show •••.
|
||||
- Round result dialog: "作战结束" + "全员无伤!" (perfect), or "生命值减少" plus an LP loss.
|
||||
- HUD phase capsule: 休息一下 / 开始作战 / 联防开始.
|
||||
- `battle_waiting_dialog` reads "模拟即将继续 / 正在等待当前阶段结束……" (reconnect or late join).
|
||||
- Elimination: `self_dead_dialog` has KEEP_WATCH and QUIT_GAME options, and auto-observe via `DeadAutoObUp`/`DeadAutoObDn { obIndex, state, preparation }`.
|
||||
|
||||
**Spec**
|
||||
|
||||
| Situation | What you see and can do | Tag |
|
||||
|---|---|---|
|
||||
| Prep | Tap a teammate avatar → "前往查看" → their board, read-only, including their pen and bonds. Pill "👁 name#1234". "返回战场" or your own avatar returns. `ObserveUp{obIndex}` / `CancelObserveUp`. | DATA + WIKI |
|
||||
| Own combat running | You watch **your own** field. Observing others is **not offered** ("如果感到无聊…下一个休整期开始之前" and `canObserveOther`). Tapping shows the NOT_AVAIL toast. | ASSUMED (consistent with WIKI and DATA) |
|
||||
| Own combat finished, others still fighting | Pill "⌛ 作战结束,等待队友完成作战". Your field freezes as it ended. Avatars become tappable → "前往查看" to watch a teammate's live battle. | WIKI + VIDEO |
|
||||
| 联防 (helpers) | Banner/dialog "联防阶段" (help_battle_dialog with the orange assist robot), capsule "联防开始", kill capsule `n/m`, bond strip "层数叠加已禁用". Helpers fight on the shared escaped field (`escaped_single` for 1 helper, `escaped_multi` for 2). With 2 helpers the enemies enter at col 18 and cross the **right half** (helper 2) and then the **left half** (helper 1), in series like the Final Assault. The pill offers ‹ LEFT half / 全景 / RIGHT half ›: "你自己" on your half, "👁 name#" on the partner's. | DATA + VIDEO |
|
||||
| 联防 (non-helpers) | Same banner. The camera goes to the 联防 field as an observer, with the ‹ 👁 helper# › pill. Owners' LP drops live as enemies escape; the capsule's `tag_miss` shows the escaped count. | VIDEO + DATA |
|
||||
| Final Assault | Your pair's field only. The pill offers ‹ LEFT / 全景 / RIGHT ›. The other pair cannot be observed (NOT_AVAIL). Team LP and the shared boss HP bar are in the capsule. After 150 s the team LP drains 1/s. | DATA + VIDEO |
|
||||
| Eliminated or quit | Choose keep-watching or quit. Keep-watching auto-observes the first available field and can switch freely. A quit target shows "当前玩家已离开". | DATA |
|
||||
|
||||
### 3.2 Official combat computation model [DATA: client il2cpp class and field names]
|
||||
|
||||
The scene server is separate. `ActAutoChessSyncInfoBattleInfo { sceneId, address, token, modeId, endTime, curRound }` gives a dedicated address and token.
|
||||
|
||||
**Server → client:**
|
||||
|
||||
| Message | Contents / use |
|
||||
|---|---|
|
||||
| `AllStateSyncDn` | `{ modeId, stageId, bossId, hiddenBossId, **stageSeed**, uidIndex, bannedBonds, staticPlayers, sceneDetail }` |
|
||||
| `PreparationStatusDn` | `{ uidIndex, hp, round, store, charChess, equipChess, trapChess, positions, bonds, selfChoice, maxDeploymentCnt, effectEnemies, roundAnalytics }`: the server is authoritative for prep. |
|
||||
| `ChangePositionDn` | `{ boardStatus }`: every player's board, so every client knows every board. |
|
||||
| `StepDn` | `{ seq, duration, actions: [{ playerUidIndex, operate, paramList }] }`, where `operate` ∈ ENEMY_KILLED, ENEMY_ESCAPED, COST_BOSS_HP, SUMMONED_ENEMY_ESCAPED, ENEMY_APPEAR, SUMMONED_ENEMY_APPEAR, ENEMY_FINISHED, BOSS_STATE_CHANGED, BATTLE_STATE_CHANGED, PLAYER_STATUS_CHANGED. |
|
||||
| `HistoryDn` | `{ steps }`, for catch-up. |
|
||||
| `ChatDn`, `BroadcastDn`, `PlayerStatusDn`, `PlayerKickDn` | Emotes, ticker, player status, kicks. |
|
||||
| Per-round battle data | `SelfBattleInfo { enemyInfos: [{ enemyId, actionIndex, instIdList }] }` |
|
||||
| 联防 setup | `HelpBattleInfo { escapedEnemies: [{ ownerPlayerIndex, enemyId, enemyInstId, isToken }], players: [{ deployment, charBattleStatusList: [{ instId, hp, tech }] }] }` |
|
||||
| Boss setup | `BossRoundInfo { isHiddenBoss, bossId, hp, groupInfos: [{ group, players }] }` and `BossBattleInfo { group, bossHp, enemyCount, enemyGroup, players }` |
|
||||
|
||||
**Client → server:**
|
||||
|
||||
| Message | Contents / use |
|
||||
|---|---|
|
||||
| Prep intents | `ShopBuyChessUp{slotId,isSpecial}`, `ShopRefreshUp`, `ShopFrozeUp{isFrozen}`, `ShopUpgradeUp`, `ChangePositionUp{deployCount,unitPositionInfo}`, `UseEquipUp`, `UseMagicUp`, `DestroyChessUp{chessInstId,chessType}`, `SelfChoicePickUp`, `SpPreparationPickUp`, `PreparationReadyUp{readyType: READY/CANCEL_READY}`, `ActionUp{seq,actions}` |
|
||||
| Own combat | `SelfBattleKillEnemyUp{record{enemyInstId,attackerInstId,damageSrc}}`, `SelfBattleEnemyEscapeUp{enemyInstId,isToken}`, `SelfBattleAddBondUp{charInstId,layerDelta,bondIndexList}` (<战斗中> stacks), `SelfBattleInfoUp{round,charBattleStatusList,charBattleInfoList}`, `SelfBattleFinishUp{round,fromRejoin,escapedInstIds,escapedTokenInstIds,killedInsts,charBattleStatusList}` |
|
||||
| 联防 | `HelpBattleKillEnemyUp{enemyInstId,isToken,killedByPlayer,attackerInstId,damageSrc}`, `HelpBattleEnemyEscapeUp`, `HelpBattleFinishUp{round,fromRejoin,escapedEnemies,killInfos}` |
|
||||
| Other | `ObserveUp{obIndex}`, `ChatReq{emojiGroup,emojiId}`, `BroadcastUp{uIdx,broadcastId,strParams}` (clients announce their own damage milestones), `LoadingReadyUp{roundEnemies}`, `PauseUp`/`ResumeUp` (solo only), `QuitUp` |
|
||||
|
||||
**What this means:**
|
||||
1. **Combat is client-simulated.** The server never sends unit positions. It receives outcome events and relays them in `StepDn`, which drives the teammates' capsules and LP.
|
||||
2. Every client holds everything needed to **replay any teammate's battle deterministically**: `stageSeed`, all boards with directions, and enemy lists. Observing a teammate most likely runs a local replica sim, with `StepDn` as the authoritative counters [ASSUMED].
|
||||
3. The 联防 is set up by the server from the reported leaks and the helpers' end-of-combat HP/SP (`tech`). The helpers' clients simulate it and report `killedByPlayer`, which drives the bounty payout to whichever helper killed.
|
||||
4. The boss HP is a server-side pool. Pair clients report `COST_BOSS_HP`. Bahamut 12294 notes "網速不好/幀率過低可能會導致boss戰傷害丟失" [COMM].
|
||||
5. This also matches the general Arknights design: single-player battles have only `battleStart`/`battleFinish` endpoints in every community server emulator (LocalArknights, OpenDoctoratePy) [COMM].
|
||||
|
||||
---
|
||||
|
||||
## 4. Emotes
|
||||
|
||||
### 4.1 Official rules
|
||||
|
||||
| Item | Value | Tag |
|
||||
|---|---|---|
|
||||
| Message | `AutoChessBattleSceneChatReq { emojiGroup, emojiId }` → `ChatDn`; `AutoChessChatData { uid, emojiGroup, emojiId }`. There is no free text anywhere in 盟约. | DATA |
|
||||
| Bubble | `autochess_emoji_pop_item = bkg (emoji_bubble_bkg 108×97, a dark rounded square with a tail pointing left) + emoji_icon`. **Icon only, no text.** Anchored at `player_status_item/emoji_ref_rect`, i.e. to the right of the sender's avatar in the left player list. `AutoChessEmojiPopPanel { _popupTime, _chatItemAnim, … }`: pop animation, shown for `chatTime` = **3 s**. A new emote replaces the old one (`m_switchTween`). | DATA |
|
||||
| Button | Bottom-left **交流** (`emoji_btn` 151×55 with a robot-face icon; `AUTO_CHESS_EMOJI_BTN`). It is greyed (`emoji_btn_disable`) during the cooldown `chatCD` = **1 s** (`_DisableEmojiBtnForAWhile`). | DATA |
|
||||
| Panel | `autochess_emoji_panel`: `emoji_bkg` (313×231) with a horizontal `scroll_pager`, one page **per theme**, `dot_content` pager dots, and 6 cells (`emoji_cell_bkg` 85×85, 3×2). Swipe left/right to change theme ("在表情发送界面左右滑动来切换主题" [WIKI]). Tapping a cell sends it and closes the panel, with a click animation. The client remembers the last-used theme (`ClearLastUseEmoticonThemeId`). | DATA + WIKI |
|
||||
| Scenes | `AUTOCHESS_ROOM` = room/lobby (10 emotes, basic theme). `AUTOCHESS_BATTLE` = in match (6 per theme). Themes are enabled by `enabledEmoticonThemeIdList`; the free ones are `isBasic: true`. We unlock all. | DATA |
|
||||
|
||||
### 4.2 All emotes (`display_meta_table.emoticonData`, zh_CN) [DATA]
|
||||
|
||||
`desc` is `null` for every autochess emote, so any label is ours and is used only as a tooltip or aria-label, never displayed. The suggested labels come from BWIKI where one exists: basic_2 and slug from the BWIKI tabs, basic ones [ASSUMED].
|
||||
|
||||
**Theme `emoticon_autochess_basic`** (sortId 100000, isBasic)
|
||||
|
||||
| id | scene | sortId | picId | label (ours) |
|
||||
|---|---|---|---|---|
|
||||
| autochess_battle_happy | BATTLE | 1001 | pic_happy_battle | 开心 |
|
||||
| autochess_battle_scared | BATTLE | 1002 | pic_scared_battle | 害怕 |
|
||||
| autochess_battle_sorry | BATTLE | 1003 | pic_sorry_battle | 对不起 |
|
||||
| autochess_battle_thanks | BATTLE | 1004 | pic_thanks_battle | 谢谢 |
|
||||
| autochess_battle_thinking | BATTLE | 1005 | pic_thinking_battle | 思考 |
|
||||
| autochess_battle_nice_cooperate | BATTLE | 1006 | pic_cooperate_battle | 合作愉快 |
|
||||
| autochess_room_hello … working (10) | ROOM | 1–10 | pic_hello, pic_thanks, pic_happy, pic_question, pic_sorry_2, pic_scared, pic_thinking, pic_waiting, pic_cooperate, pic_working | room only; **sprites not present in the local client bundles** |
|
||||
|
||||
**Theme `emoticon_autochess_basic_2`** (sortId 100001, isBasic; new in 下半)
|
||||
|
||||
| id | sortId | picId | label (BWIKI) |
|
||||
|---|---|---|---|
|
||||
| autochess_battle_noproblem | 1007 | pic_noproblem_battle | 没问题! |
|
||||
| autochess_battle_respect | 1008 | pic_respect_battle | 敬礼! |
|
||||
| autochess_battle_call | 1009 | pic_call_battle | 欢呼! |
|
||||
| autochess_battle_playingcool | 1010 | pic_playingcool_battle | 酷! |
|
||||
| autochess_battle_sad | 1011 | pic_sad_battle | 伤心 |
|
||||
| autochess_battle_dying | 1012 | pic_dying_battle | 快死了 |
|
||||
|
||||
**Theme `emoticon_originium_slug`** (sortId 1001; 促融共竞#1 reward)
|
||||
|
||||
| id | sortId | picId | label (BWIKI) |
|
||||
|---|---|---|---|
|
||||
| slug_autochess_battle_nice_work | 2001 | pic_nice_work_battle | 合作愉快! |
|
||||
| slug_autochess_battle_thanks | 2002 | pic_thanks_battle | 谢谢! |
|
||||
| slug_autochess_battle_sorry | 2003 | pic_sorry_battle | 对不起! |
|
||||
| slug_autochess_battle_bye | 2004 | pic_bye_battle | 再见! |
|
||||
| slug_autochess_battle_distrust | 2005 | pic_distrust_battle | ??? |
|
||||
| slug_autochess_battle_very_soon | 2006 | pic_very_soon_battle | 很快就好! |
|
||||
|
||||
**Theme `emoticon_foolsday_doctor`** (sortId 1002; paid April Fools)
|
||||
|
||||
| id | sortId | picId |
|
||||
|---|---|---|
|
||||
| autochess_battle_fooldoctor_01 | 1020 | pic_fooldoctor_01_battle |
|
||||
| autochess_battle_fooldoctor_02 | 1021 | pic_fooldoctor_02_battle |
|
||||
| autochess_battle_fooldoctor_03 | 1022 | **pic_fooldoctor_04_battle** |
|
||||
| autochess_battle_fooldoctor_04 | 1023 | **pic_fooldoctor_05_battle** |
|
||||
| autochess_battle_fooldoctor_05 | 1024 | **pic_fooldoctor_06_battle** |
|
||||
| autochess_battle_fooldoctor_06 | 1025 | **pic_fooldoctor_08_battle** |
|
||||
|
||||
Note that ids 03–06 map to pics 04/05/06/08. Use `picId`, never the id suffix.
|
||||
|
||||
**Theme `emoticon_foolsday_amiya`** (sortId 1003): `autochess_battle_foolamiya_01…06`, sortId 1040–1045, `pic_foolamiya_01…06_battle`.
|
||||
|
||||
**Theme `emoticon_foolsday_wisdel`** (sortId 1004): `autochess_battle_foolwisdel_01…06`, sortId 1060–1065, `pic_foolwisdel_01…06_battle`.
|
||||
|
||||
**Page order:** proposed as `enabledEmoticonThemeIdList` order, i.e. basic, slug, basic_2, fooldoctor, foolamiya, foolwisdel [ASSUMED]. Alternatively sort by theme sortId.
|
||||
|
||||
### 4.3 Local client sprites (all contain **no text**) [DATA]
|
||||
|
||||
All in `StreamingAssets/AB/Windows/ui/emoticon/theme/`:
|
||||
|
||||
| Bundle | Sprites |
|
||||
|---|---|
|
||||
| `[uc]emoticon_autochess_basic.ab` | pic_happy_battle, pic_scared_battle, pic_sorry_battle, pic_thanks_battle, pic_thinking_battle, pic_cooperate_battle (120×120 each; mint octagon glyphs) |
|
||||
| `[uc]emoticon_autochess_basic_2.ab` | pic_noproblem_battle, pic_respect_battle, pic_call_battle, pic_playingcool_battle, pic_sad_battle, pic_dying_battle (120×120) |
|
||||
| `[uc]emoticon_originium_slug.ab` | pic_nice_work_battle, pic_thanks_battle, pic_sorry_battle, pic_bye_battle, pic_distrust_battle, pic_very_soon_battle (≈102–112×79–99), plus room and pick pics (pic_hello, pic_bye, pic_coming, pic_distrust, pic_exchange, pic_hurry, pic_mefirst, pic_nice_work, pic_sorry, pic_thanks, pic_ufirst, pic_very_soon) and pic_bg |
|
||||
| `[uc]emoticon_foolsday_doctor.ab` | pic_fooldoctor_{01,02,04,05,06,08}_battle (≈114×115) |
|
||||
| `[uc]emoticon_foolsday_amiya.ab` | pic_foolamiya_0{1..6}_battle (110–115×115) |
|
||||
| `[uc]emoticon_foolsday_wisdel.ab` | pic_foolwisdel_0{1..6}_battle (112×115) |
|
||||
|
||||
The autochess **room** pics (pic_hello, pic_question, pic_waiting, pic_working, pic_sorry_2, …) are **not** in any local bundle. Keep room emotes out of scope, or reuse the battle glyphs.
|
||||
|
||||
---
|
||||
|
||||
## 5. Other prep interactions we may have missed
|
||||
|
||||
| Item | Official | Tag |
|
||||
|---|---|---|
|
||||
| Sell | Tap the unit (board **or bench**) → underframe → **出售** with a "+1" coin badge (funcId `autochessSale`; PC hotkey slot `pc_key_holder`). There is no drag-to-sell. | DATA + WIKI |
|
||||
| Retreat | Drag the unit onto the bench (整备区) ("拖拽干员至整备区可以直接撤退干员"), or use the underframe 撤退 button. | DATA + WIKI |
|
||||
| Items and Arts | Cannot be sold. Tap → underframe **销毁** (`_underFramePanelBtnParamDestroyPos`, `icon_destory`) → `DestroyChessUp`. | DATA |
|
||||
| Buy | Two taps: the first tap on a shop card shows its detail and the **确认购买** state (`EventOnFirstClick`); the second buys (`EventOnConfirm`). If it can't be bought the card shows **无法购买**. | DATA |
|
||||
| Upgrade | The same two-step confirm (`EventOnFirstClick` → `EventOnUpgrade`). At level 6 it shows **已满级**; a disabled click without funds gives `EventOnUpgradeNotEnough`. | DATA |
|
||||
| Ready | 准备完成 / 取消准备 (`PreparationReadyUp` READY / CANCEL_READY), until everyone is ready. | DATA |
|
||||
| Strategy draft | A strategy picked by a teammate is marked **队友已选** (guidebook page 策略与轮选, `autochess_handbook_4`), so duplicate strategies are **not** allowed. This corrects the "Allowed" assumption in 06 §4.2. | DATA (guide image) |
|
||||
| Auto-arrange | None found. | DATA (no such UI) |
|
||||
| Deploy order at combat start | Top→bottom, then left→right (盟约下; it matters for taunt). The prep pieces vanish and redeploy with the deploy animation. | COMM + VIDEO |
|
||||
| Info | The left 🔍 opens 本局信息: mode, your strategy, disabled bonds with the banned operators. | DATA |
|
||||
|
||||
---
|
||||
|
||||
## 6. Changes required in our implementation
|
||||
|
||||
### 6.1 Facing (user item 7)
|
||||
|
||||
1. **Protocol.**
|
||||
- `g.move {uid, to:{area:'board',row,col}, dir}` with `dir ∈ 'UP'|'RIGHT'|'DOWN'|'LEFT'`; the server defaults to `'RIGHT'` when absent, for bots and old clients.
|
||||
- `g.art {itemUid,row,col,dir}`.
|
||||
- Broadcast `dir` in the board state (public and private views, snapshot `UnitInfo.dir`).
|
||||
2. **`server/match/PlayerState.js`.**
|
||||
- Store `piece.dir`, preserved across rounds.
|
||||
- In `_moveChessToBoard` and `_moveTokenToBoard`, `if (occ === piece) return OK;` must become "update `piece.dir`, recompute, OK". This is the in-place re-orient.
|
||||
- Swaps keep each piece's own dir.
|
||||
- Pieces spawned onto the board by effects get `'RIGHT'`.
|
||||
- `useArt` passes dir to the 画卷 "front" lookup.
|
||||
3. **Sim (`server/sim`).**
|
||||
- Replace scalar `facing ±1` with a direction vector `(fr, fc)` ∈ {(1,0) UP, (0,1) RIGHT, (−1,0) DOWN, (0,−1) LEFT} (row 0 = bottom). Keep `facing` as a derived helper only where a horizontal sign is needed for sprite flip.
|
||||
- `targeting.absoluteRangeKeys(grid, r, c, dir, extend)`: apply `rangeExtend` along +dCol **before** rotating. Rotation per DATA.md: RIGHT `(dr,dc)`, UP `(dc,−dr)`, LEFT `(−dr,−dc)`, DOWN `(−dc,dr)`.
|
||||
- Every "in front / behind / left-right of" helper uses the vector:
|
||||
- `bonds/core.js` `S.frontTile` and the devour order ("更靠左" = back-most along the facing)
|
||||
- `professions.js` front checks (the `(x − unit.x)·facing` tests)
|
||||
- `skills.js` trigger grids
|
||||
- `tokens.js` placement grids and Mech/device helpers
|
||||
- kits tier3 (`displace` direction, 薄绿 pull tile) and tier4 device placement
|
||||
- `content/devices.js` blower relation: `equal` if the operator dir == blower dir, `opposite` if reversed, otherwise none. Today only fx is compared, so the DOWN blowers never buff anyone.
|
||||
- Items 叙拉古正装 (perpendicular pair), 歌利亚头盔 (front tile), 画卷 `1-1`.
|
||||
4. **`server/match/finalAssault.js`.** The right-side mirror becomes col `c→20−c` with dir RIGHT↔LEFT; UP and DOWN are kept (not a flat `facing=−1`). FA prep on the right half shows the mirrored layout, and moves there go through the wheel in mirrored coordinates.
|
||||
5. **Client.**
|
||||
- `public/js/render/drag.js` + `ui/gameLogic.js`: after a legal drop on a board tile (also the same tile), enter a **direction step** instead of sending `g.move` immediately. Draw the white diamond with 4 chevrons, the red "✕ 点击取消" tag at its upper-left, and live orange-striped rotated range tiles. Show the tooltip "拖回中心区域取消" when outside the centre. Mouse or touch drag from the centre with a ~0.5-tile dead-zone; release sends `g.move{…,dir}`; release in the centre or tap ✕ cancels.
|
||||
- The same flow applies to Arts (`g.art`).
|
||||
- `render/units.js`: the orange ground wedge rotates to `dir`; model choice Back for UP (as ASSETS.md already says) and Front/mirror otherwise. Remove the "no facing step" comments.
|
||||
- **Tap a board unit:** show its range tiles and the underframe with 撤退 / 出售 +1 (see 6.5).
|
||||
6. **Docs.** `DESIGN.md` §3 "Facing: operators have no facing step" and `06-multiplayer-ux.md` §11.2 "There is no facing step in auto-chess [ASSUMED]" are **wrong**. Replace them with §1.2 of this file.
|
||||
|
||||
### 6.2 Enemy preview pen (user item 2)
|
||||
|
||||
1. **Server.** Extend the private prep state `nextEnemies` to entries `{enemyKey, gate:'upper'|'lower', t (spawn time s), fly, source:'wave'|'effect'}`, one per instance or grouped with counts. Include bounty, 特训, 教鞭 and 神秘顾客 extras. For boss rounds add `{boss:true}` entries targeting the boss field.
|
||||
2. **Renderer (`public/js/render/app.js`).** The pen rows 14–18 are already drawn as scenery (`bandFor` [6,18]).
|
||||
- Add a `PreviewPen` layer that spawns idle, left-facing enemy spines per §2.2: rect ((14,7),(18,13)), skip row 16, upper rows 17–18, lower rows 14–15, time-sorted, ≤3 per tile with jitter, cap 50.
|
||||
- No HP bars and no simulation. Clear it at combat start.
|
||||
- Enemy spines are already loaded per round, so reuse the impostor/LRU budget (≤50 extra cheap skeletons; use `impostor.js` beyond ~20 for performance).
|
||||
3. **Camera.** Make the prep preset keep the pen's front edge visible at the top (official look). Add `setCamera('pen')`, a 0.25 s pan toward rows 14–18, driven by a HUD toggle: right **[🔍▶▶]**, amber; in the pen view the left button becomes **[🔍◀◀]** and the right one greys out.
|
||||
4. **UI.** `ui/enemyDrawer.js` (our list drawer) is not official. Make the pen the primary view and keep the drawer only as the tap-an-enemy detail source, or behind the left 🔍 "本局信息" dialog. When viewing a teammate in prep, render **their** pen.
|
||||
|
||||
### 6.3 Spectating and combat flow (user item 5, UX part)
|
||||
|
||||
1. Remove the always-visible `‹ 自己 ›` switcher from normal combat (`ui/combatHud.js`).
|
||||
2. Normal combat, own battle running: team avatars are **not** watchable (toast "当前无法查看").
|
||||
3. After your own battle ends:
|
||||
- pill "⌛ 作战结束,等待队友完成作战"
|
||||
- tapping an avatar expands a "前往查看" button; while observing, your row shows "返回战场", the target row an eye badge, and the bottom pill "👁 {name}#{number}"
|
||||
4. Prep: the same avatar → 前往查看 flow (read-only board + pen).
|
||||
5. 联防 and FA fields: the ‹ › pill cycles LEFT half / 全景 / RIGHT half, with captions "你自己" / "👁 name#" / "全景". Non-helpers are auto-moved to the 联防 field as observers. In FA the other pair's field is not selectable.
|
||||
6. Eliminated players: a dialog offers 继续观战 (auto-observe the first live field, free switching) or 退出.
|
||||
7. `server/match/Match.js watch()` must enforce the same rules (prep: any teammate; combat: only if your own field finished; FA: own pair only; dead: anything).
|
||||
|
||||
### 6.4 Combat computation model (user item 5, architecture) [proposal based on §3.2]
|
||||
|
||||
Mirror the official split. This lets a low-power Windows mini-PC host the game.
|
||||
|
||||
1. **Server (authoritative, cheap).**
|
||||
- Lobby, economy, shop, pool, boards with dir, 机变, bounties, LP, phase timers, seeds.
|
||||
- Per round it sends each client `{seed, round, boards of all players, per-player enemy list (instIds), stage}`.
|
||||
- It **does not run battles**. It keeps the existing `server/sim` for bots-only rooms and for optional verification (run a player's battle at low priority after the round and compare the kill/escape set; flag the player on mismatch; don't block).
|
||||
2. **Client.** Runs `server/sim` in a Web Worker. It is already deterministic: no `Math.random`/`Date.now`; only `simdata.js` uses `node:fs` and needs a fetch-based loader.
|
||||
- Fixed tick 1/30 at 2×.
|
||||
- Report `kill{enemyInstId, attackerUid, src}`, `escape{enemyInstId}` and `bondDelta{uid, delta, bonds}` as they happen.
|
||||
- At the end report `finish{round, escapedInstIds, killedInstIds, unitStatus:[{uid,hpRatio,sp}], stats}`.
|
||||
- The server relays counters to teammates, like the official `StepDn`.
|
||||
3. **Divergence rules.**
|
||||
- The server only accepts instIds it issued.
|
||||
- An instId is counted once, first report wins.
|
||||
- A missing `finish` by `maxPlayTime + grace(10 s)` means everything not reported killed is escaped (the official timeout rule: "超出一定时间,则视为剩余敌人入侵成功").
|
||||
- Reconnect: the client resubmits with `fromRejoin`, or the server re-sims that board from the seed.
|
||||
4. **联防.**
|
||||
- The server builds `{escapedEnemies:[{ownerId, enemyKey, instId}], helpers:[{playerId, deployment(with dir), unitStatus(hp,sp)}], seed}` and sends it to **all** clients.
|
||||
- One helper (the lowest seat) is the **authoritative simulator**. Other clients, including the second helper, run a replica for display only.
|
||||
- The server accepts the authority's kill/escape/finish reports. On authority disconnect the next helper takes over, or the server sims it.
|
||||
5. **Final Assault.** Per pair field, the lower seat is authoritative and reports `bossDamage` deltas and kills. The server owns the shared boss HP (sum of both fields) and the team LP drain, and broadcasts the HP at ~5 Hz.
|
||||
6. **Observing.** The observer runs a local replica of the target field from the same inputs, fast-forwarded to the server's elapsed round time. Official-style counters come from relayed events. This needs no snapshot streaming from the server, so bandwidth ≈ 0.
|
||||
7. **Compatibility.** Keep `b.snap` streaming as a fallback for very weak clients (a server-side sim flag per room).
|
||||
|
||||
### 6.5 Prep interactions
|
||||
|
||||
1. **Sell.** Tap the unit (board or bench) → underframe with **出售 +1** (and 撤退 on board units). Remove any drag-to-sell zone.
|
||||
2. **Items and Arts.** Tap → **销毁** only.
|
||||
3. **Shop.** First tap shows the card detail and "确认购买"; the second tap buys.
|
||||
4. **Upgrade.** First tap arms "升级" confirm; the second tap upgrades.
|
||||
5. **Strategy draft.** Disallow a strategy already taken by a teammate; show "队友已选".
|
||||
|
||||
### 6.6 Emotes (user item 6)
|
||||
|
||||
1. `shared/constants.js`:
|
||||
- Replace `EMOTES/EMOTE_THEME/EMOTE_TEXT` with the 6 themes × 6 battle ids of §4.2 (`{themeId, id, sortId, picId}`).
|
||||
- Delete `EMOTE_TEXT` from display paths. Keep only an aria-label map.
|
||||
- Validate `g.emote {theme, id}` server-side, with a 1 s cooldown (already there).
|
||||
2. `public/js/ui/emotes.js`:
|
||||
- `EmoteBubble` renders **the picture only**: dark rounded square, tail toward the avatar, 3 s, pop animation, replace on a new emote.
|
||||
- `EmoteWheel`: a pager with one page per theme (3×2 grid of 6), pager dots, swipe or arrow keys, remembering the last theme (localStorage).
|
||||
- The button is disabled for 1 s after sending.
|
||||
- Fallback when art is missing: a neutral glyph, never text.
|
||||
3. `tools/local-extract/extract.py` gains 4 more bundles:
|
||||
- `ui/emoticon/theme/[uc]emoticon_originium_slug.ab` → `emoticon/slug` (only the `*_battle` sprites)
|
||||
- `[uc]emoticon_foolsday_doctor.ab` → `emoticon/fooldoctor`
|
||||
- `[uc]emoticon_foolsday_amiya.ab` → `emoticon/foolamiya`
|
||||
- `[uc]emoticon_foolsday_wisdel.ab` → `emoticon/foolwisdel`
|
||||
- Paths are keyed by `picId` (note fooldoctor 03–06 → pic 04/05/06/08).
|
||||
- Update `data/local-assets.json` and `emoteArtPath(theme, picId)`.
|
||||
4. Bot emotes (if any) use the same ids.
|
||||
|
||||
---
|
||||
|
||||
## 7. Corrections to earlier research
|
||||
|
||||
| File | Old statement | Correct |
|
||||
|---|---|---|
|
||||
| 06 §11.2 / DESIGN §3 | "There is no facing step in auto-chess" | 4-direction AK deploy wheel (§1) |
|
||||
| 06 §11.2 | "Selling [ASSUMED drag onto the funds card]" | 出售 +1 on the unit's selection diamond (§5) |
|
||||
| 06 §4.5 / §11.3 | "A bottom view switcher ‹ 自己 › cycles through teammates' live battles" | No switcher in normal combat; avatar → 前往查看 after your own combat ends; ‹ › only in 联防/FA fields (§3.1) |
|
||||
| 06 §4.5 | "All boards fight at the same time on the server" | Each client simulates its own board; the server aggregates events (§3.2) |
|
||||
| 06 §11.1 | "Enemy-preview button … a separate tiled grid" | The pen is part of the stage scene behind the gates (rows 14–18), visible at the top edge in prep; the button pans the camera (§2) |
|
||||
| 06 §9.1 | 3 free themes + 3 paid, emote wording "没问题!…" | Correct themes; bubbles are image-only; `desc` is null; the room pics are missing from the local client (§4) |
|
||||
| DESIGN §3 | "Enemy preview pen … (we show the preview in DOM instead)" | Render the preview in the pen (§6.2) |
|
||||
| 06 §4.2 | "Duplicate strategies [ASSUMED] Allowed" | Not allowed: "队友已选" (§5) |
|
||||
|
||||
---
|
||||
|
||||
## 8. Sources
|
||||
|
||||
**Local client (Windows build, CrossOver bottle).**
|
||||
- `…/AB/Windows/ui/autochess/[uc]autochessbattle.ab`: GameObjects, Text ids, sprites, onClick bindings.
|
||||
- `…/ui/emoticon/theme/*.ab`
|
||||
- `…/arts/guidebookpages/[pack]autochess.ab`: 19 in-game help pages, including 休整期 (orange facing wedge) and 策略与轮选 (队友已选).
|
||||
- `…/Arknights_Data/il2cpp_data/Metadata/global-metadata.dat` (v29): class and field names and the `MAX_PREVIEW_CNT` constant.
|
||||
|
||||
**Game data.**
|
||||
- `.cache/gamedata/excel/activity_table.json` `autoChessData` (gameTipsList, constData chatCD/chatTime, enabledEmoticonThemeIdList)
|
||||
- `levels/activities/act*autochess/level_*_m0*.json` configBlackBoard
|
||||
- `level_act1autochess_escaped_{single,multi}.json`
|
||||
- `display_meta_table.json` emoticonData (Kengxxiao zh_CN, downloaded to the scratchpad)
|
||||
|
||||
**Official.** 「卫戍协议:盟约」玩法介绍 long image: https://img.71acg.net/sykb~bbs/pc/1763033996225879
|
||||
|
||||
**Wiki.** BWIKI 盟约: https://wiki.biligame.com/arknights/盟约 (互动, 联防, 观看队友)
|
||||
|
||||
**Videos.**
|
||||
- BV1tFUAYnEfZ (新手引导实况, 4:56–5:14: deploy wheel)
|
||||
- BV1H3wtziEbY (全攻略教程, 下半 prep and pen)
|
||||
- BV1h6DjBoE3T (身前一格 garrisons)
|
||||
- BV1NbCiBHELD
|
||||
- BV11cg36qEfA
|
||||
|
||||
**Screenshots.**
|
||||
- https://i.meee.com.tw/wdRAguq.png (pen)
|
||||
- GwtDIAW (联防)
|
||||
- YRY8ar1 (FA ‹全景›)
|
||||
- Bahamut c32edaf…, 4995084…, 05db364c…, fc6673cd… (prep and "等待队友完成作战")
|
||||
|
||||
**Community.**
|
||||
- Bahamut https://forum.gamer.com.tw/C.php?bsn=33651&snA=12294 (放大镜出怪路线, boss-damage loss, deploy order)
|
||||
- Bahamut https://forum.gamer.com.tw/C.php?bsn=33651&snA=12316
|
||||
- NGA https://nga.178.com/read.php?tid=45645958 (FA mirror, 朝向)
|
||||
Reference in new issue
Block a user