feedback5: merge W5F — ACTIVE_RANGE also replaces SEARCH rows and covers 深巡 S2, 纯烬艾雅法拉 S1 at full SP, 伺夜 S1 only with his pack on the field
Golden regenerated on the merged code (only test/golden/matches.json conflicted): against feedback5 it moves exactly W5F's scenarios (roster-001/002/016/026/027/028/038/041/042/044, bond-egirShip-low, bond-suntShip-high, boss-boss_2-pair, boss-boss_6-pair, solo-NORMAL-1, coop2-NORMAL-3, coop4-FUNNY-6, coop2-NORMAL-8-serverrun); against fb5-bugs3 exactly W5E's (unite-1/2 and the 8 match scenarios of the 联防 map and the full-hand rule). data/ equals an offline build of the merged tools/build-data.mjs.
This commit is contained in:
commit
17d9960fb4
30 files changed
+552
-407
No files matched your search
+1
-1
@@ -1 +1 @@
|
||||
{"chess_char_1_01_a":{"chessId":"chess_char_1_01_a","baseId":"chess_char_1_01_a","goldenId":"chess_char_1_01_b","isGolden":false,"tier":1,"identifier":0,"isHidden":false,"isDiy":false,"visible":true,"chessType":"PRESET","backup":{"charId":"char_498_inside","tmplId":null,"skillIndex":1,"uniEquipId":"uniequip_002_inside","potRank":0},"shopSortId":1,"charId":"char_498_inside","name":"隐现","appellation":"Insider","rarity":5,"profession":"SNIPER","subProfessionId":"fastshot","subProfessionName":"速射手","position":"RANGED","nationId":"laterano","bonds":["lateranoShip","swiftShip"],"garrisonIds":["garrison_16_a"],"price":2,"sellPrice":1,"upgradeNum":3,"upgradeChessId":"chess_char_1_01_b","status":{"phase":1,"level":55,"skillLevel":4,"equipLevel":0},"stats":{"maxHp":1123,"atk":399,"def":140,"res":0,"cost":15,"blockCnt":1,"bat":1,"aspd":100,"respawnTime":80,"spRecovery":1,"hpRecoveryPerSec":0,"moveSpeed":1,"tauntLevel":0,"massLevel":0,"deployLimit":1,"deckStack":0},"immunities":{"stun":false,"silence":false,"sleep":false,"frozen":false,"levitate":false},"rangeId":"3-3","rangeGrid":[[1,0],[1,1],[1,2],[1,3],[0,0],[0,1],[0,2],[0,3],[-1,0],[-1,1],[-1,2],[-1,3]],"dmgType":"phys","attackKind":"ranged","projectile":"arrow","canHitFly":true,"targetPriority":"fly","trait":{"desc":"优先攻击空中单位","descRaw":"优先攻击空中单位","bb":{},"bbStr":{},"rangeGrid":null},"skill":{"skillId":"skchr_inside_2","iconId":"skchr_inside_2","name":"“解决麻烦”","level":4,"desc":"攻击力+80%,攻击间隔略微缩短,优先攻击使用远程武器的敌人并且不容易成为敌人的攻击目标\n攻击装有14发弹药,打完后结束(可随时停止技能)","descRaw":"攻击力<@ba.vup>+80%</>,攻击间隔<@ba.vup>略微缩短</>,优先攻击使用远程武器的敌人并且不容易成为敌人的攻击目标\n<@ba.rem>攻击装有14发弹药,打完后结束(可随时停止技能)</>","skillType":"MANUAL","durationType":"AMMO","duration":0,"spType":"INCREASE_WITH_TIME","spCost":24,"initSp":8,"maxChargeTime":1,"increment":1,"bb":{"atk":0.8,"base_attack_time":-0.3,"attack@trigger_time":14},"bbStr":{},"rangeId":null,"rangeGrid":null,"prefabId":"skchr_inside_2","trigger":{"rule":"DEFAULT","rawRule":"DEFAULT","customRangeGrid":null},"index":1,"overrideTokenKey":null},"talents":[{"index":0,"name":"火力支援","desc":"在场停留20秒后,自身弹药类技能弹药上限+2","descRaw":"在场停留20秒后,自身弹药类技能弹药上限+2","bb":{"self_ammo":2,"duration":20},"bbStr":{},"rangeGrid":null,"tokenKey":null,"hidden":false,"fromModule":false}],"tokens":[],"module":{"id":"uniequip_002_inside","name":"“最初的惊喜”","type":"MAR-X","level":0,"active":false},"assets":{"avatar":"char_498_inside","portrait":"char_498_inside_1","spine":"char_498_inside","skillIcon":"skchr_inside_2","subProfIcon":"sub_fastshot_icon"},"skills":[{"skillId":"skchr_inside_1","iconId":"skchr_inside_1","name":"“不惹麻烦”","level":4,"desc":"每次攻击造成相当于攻击力185%的物理伤害\n攻击装有4发弹药,打完后结束(可随时停止技能)","descRaw":"每次攻击造成相当于攻击力<@ba.vup>185%</>的物理伤害\n<@ba.rem>攻击装有4发弹药,打完后结束(可随时停止技能)</>","skillType":"AUTO","durationType":"AMMO","duration":0,"spType":"INCREASE_WHEN_ATTACK","spCost":14,"initSp":0,"maxChargeTime":1,"increment":1,"bb":{"attack@atk_scale":1.85,"attack@trigger_time":4},"bbStr":{},"rangeId":null,"rangeGrid":null,"prefabId":"skchr_inside_1","trigger":{"rule":"DEFAULT","rawRule":"DEFAULT","customRangeGrid":null},"index":0,"overrideTokenKey":null,"isDefault":false},{"skillId":"skchr_inside_2","iconId":"skchr_inside_2","name":"“解决麻烦”","level":4,"desc":"攻击力+80%,攻击间隔略微缩短,优先攻击使用远程武器的敌人并且不容易成为敌人的攻击目标\n攻击装有14发弹药,打完后结束(可随时停止技能)","descRaw":"攻击力<@ba.vup>+80%</>,攻击间隔<@ba.vup>略微缩短</>,优先攻击使用远程武器的敌人并且不容易成为敌人的攻击目标\n<@ba.rem>攻击装有14发弹药,打完后结束(可随时停止技能)</>","skillType":"MANUAL","durationType":"AMMO","duration":0,"spType":"INCREASE_WITH_TIME","spCost":24,"initSp":8,"maxChargeTime":1,"increment":1,"bb":{"atk":0.8,"base_attack_time":-0.3,"attack@trigger_time":14},"bbStr":{},"rangeId":null,"rangeGrid":null,"prefabId":"skchr_inside_2","trigger":{"rule":"DEFAULT","rawRule":"DEFAULT","customRangeGrid":null},"index":1,"overrideTokenKey":null,"isDefault":true}]},"chess_char_1_01_b":{"chessId":"chess_char_1_01_b","baseId":"chess_char_1_01_a","goldenId":"chess_char_1_01_b","isGolden":true,"tier":1,"identifier":133,"isHidden":false,"isDiy":false,"visible":true,"chessType":"PRESET","backup":{"charId":"char_498_inside","tmplId":null,"skillIndex":1,"uniEquipId":"uniequip_002_inside","potRank":0},"shopSortId":1,"charId":"char_498Line truncated
|
||||
{"chess_char_1_01_a":{"chessId":"chess_char_1_01_a","baseId":"chess_char_1_01_a","goldenId":"chess_char_1_01_b","isGolden":false,"tier":1,"identifier":0,"isHidden":false,"isDiy":false,"visible":true,"chessType":"PRESET","backup":{"charId":"char_498_inside","tmplId":null,"skillIndex":1,"uniEquipId":"uniequip_002_inside","potRank":0},"shopSortId":1,"charId":"char_498_inside","name":"隐现","appellation":"Insider","rarity":5,"profession":"SNIPER","subProfessionId":"fastshot","subProfessionName":"速射手","position":"RANGED","nationId":"laterano","bonds":["lateranoShip","swiftShip"],"garrisonIds":["garrison_16_a"],"price":2,"sellPrice":1,"upgradeNum":3,"upgradeChessId":"chess_char_1_01_b","status":{"phase":1,"level":55,"skillLevel":4,"equipLevel":0},"stats":{"maxHp":1123,"atk":399,"def":140,"res":0,"cost":15,"blockCnt":1,"bat":1,"aspd":100,"respawnTime":80,"spRecovery":1,"hpRecoveryPerSec":0,"moveSpeed":1,"tauntLevel":0,"massLevel":0,"deployLimit":1,"deckStack":0},"immunities":{"stun":false,"silence":false,"sleep":false,"frozen":false,"levitate":false},"rangeId":"3-3","rangeGrid":[[1,0],[1,1],[1,2],[1,3],[0,0],[0,1],[0,2],[0,3],[-1,0],[-1,1],[-1,2],[-1,3]],"dmgType":"phys","attackKind":"ranged","projectile":"arrow","canHitFly":true,"targetPriority":"fly","trait":{"desc":"优先攻击空中单位","descRaw":"优先攻击空中单位","bb":{},"bbStr":{},"rangeGrid":null},"skill":{"skillId":"skchr_inside_2","iconId":"skchr_inside_2","name":"“解决麻烦”","level":4,"desc":"攻击力+80%,攻击间隔略微缩短,优先攻击使用远程武器的敌人并且不容易成为敌人的攻击目标\n攻击装有14发弹药,打完后结束(可随时停止技能)","descRaw":"攻击力<@ba.vup>+80%</>,攻击间隔<@ba.vup>略微缩短</>,优先攻击使用远程武器的敌人并且不容易成为敌人的攻击目标\n<@ba.rem>攻击装有14发弹药,打完后结束(可随时停止技能)</>","skillType":"MANUAL","durationType":"AMMO","duration":0,"spType":"INCREASE_WITH_TIME","spCost":24,"initSp":8,"maxChargeTime":1,"increment":1,"bb":{"atk":0.8,"base_attack_time":-0.3,"attack@trigger_time":14},"bbStr":{},"rangeId":null,"rangeGrid":null,"prefabId":"skchr_inside_2","trigger":{"rule":"DEFAULT","rawRule":"DEFAULT","customRangeGrid":null},"index":1,"overrideTokenKey":null},"talents":[{"index":0,"name":"火力支援","desc":"在场停留20秒后,自身弹药类技能弹药上限+2","descRaw":"在场停留20秒后,自身弹药类技能弹药上限+2","bb":{"self_ammo":2,"duration":20},"bbStr":{},"rangeGrid":null,"tokenKey":null,"hidden":false,"fromModule":false}],"tokens":[],"module":{"id":"uniequip_002_inside","name":"“最初的惊喜”","type":"MAR-X","level":0,"active":false},"assets":{"avatar":"char_498_inside","portrait":"char_498_inside_1","spine":"char_498_inside","skillIcon":"skchr_inside_2","subProfIcon":"sub_fastshot_icon"},"skills":[{"skillId":"skchr_inside_1","iconId":"skchr_inside_1","name":"“不惹麻烦”","level":4,"desc":"每次攻击造成相当于攻击力185%的物理伤害\n攻击装有4发弹药,打完后结束(可随时停止技能)","descRaw":"每次攻击造成相当于攻击力<@ba.vup>185%</>的物理伤害\n<@ba.rem>攻击装有4发弹药,打完后结束(可随时停止技能)</>","skillType":"AUTO","durationType":"AMMO","duration":0,"spType":"INCREASE_WHEN_ATTACK","spCost":14,"initSp":0,"maxChargeTime":1,"increment":1,"bb":{"attack@atk_scale":1.85,"attack@trigger_time":4},"bbStr":{},"rangeId":null,"rangeGrid":null,"prefabId":"skchr_inside_1","trigger":{"rule":"DEFAULT","rawRule":"DEFAULT","customRangeGrid":null},"index":0,"overrideTokenKey":null,"isDefault":false},{"skillId":"skchr_inside_2","iconId":"skchr_inside_2","name":"“解决麻烦”","level":4,"desc":"攻击力+80%,攻击间隔略微缩短,优先攻击使用远程武器的敌人并且不容易成为敌人的攻击目标\n攻击装有14发弹药,打完后结束(可随时停止技能)","descRaw":"攻击力<@ba.vup>+80%</>,攻击间隔<@ba.vup>略微缩短</>,优先攻击使用远程武器的敌人并且不容易成为敌人的攻击目标\n<@ba.rem>攻击装有14发弹药,打完后结束(可随时停止技能)</>","skillType":"MANUAL","durationType":"AMMO","duration":0,"spType":"INCREASE_WITH_TIME","spCost":24,"initSp":8,"maxChargeTime":1,"increment":1,"bb":{"atk":0.8,"base_attack_time":-0.3,"attack@trigger_time":14},"bbStr":{},"rangeId":null,"rangeGrid":null,"prefabId":"skchr_inside_2","trigger":{"rule":"DEFAULT","rawRule":"DEFAULT","customRangeGrid":null},"index":1,"overrideTokenKey":null,"isDefault":true}]},"chess_char_1_01_b":{"chessId":"chess_char_1_01_b","baseId":"chess_char_1_01_a","goldenId":"chess_char_1_01_b","isGolden":true,"tier":1,"identifier":133,"isHidden":false,"isDiy":false,"visible":true,"chessType":"PRESET","backup":{"charId":"char_498_inside","tmplId":null,"skillIndex":1,"uniEquipId":"uniequip_002_inside","potRank":0},"shopSortId":1,"charId":"char_498Line truncated
|
||||
+9
-6
@@ -190,7 +190,7 @@ Top level: `{ season, seasonName, modes, economy, lpCapPerRound, bossOvertimeAft
|
||||
| `bb`, `bbStr` | `{"atk":1,"base_attack_time":-0.3,"attack@trigger_time":14}` | kit input (DESIGN §5.6) |
|
||||
| `rangeId`, `rangeGrid` | `null` | skill range override |
|
||||
| `prefabId`, `overrideTokenKey` | | |
|
||||
| `trigger` | `{"rule":"DEFAULT","rawRule":"DEFAULT","customRangeGrid":null}` | auto-cast rule (the official 技能策略, PRTS 卫戍协议/帮助 §作战阶段 技能操作; §2.2). `rule` ∈ `DEFAULT` (basic strategy), `SKILL_RANGE` (a MANUAL skill with a 技能范围 of its own: `customRangeGrid` = its `rangeGrid`, `rawRule` `DEFAULT` — no official row), `ACTIVE_RANGE` (the owner's deliberate deviation of 2026-10-05: a MANUAL skill left on the basic strategy whose attack range while it runs strictly contains the operator's own range: `customRangeGrid` = that running range, `rawRule` `DEFAULT`), `TAKE_DAMAGE` (every MANUAL 重装 skill but seven: 深巡 / 雷蛇 S2, 号角 S2 / S3 and 灰毫 S1 / S2 are `DEFAULT` with `rawRule` `TAKE_DAMAGE` — a deliberate deviation, `tools/build-data.mjs TRIGGER_DEVIATIONS`, DESIGN §21.29 — and 余 S2 is `SKILL_RANGE` with `rawRule` `TAKE_DAMAGE` and `customRangeGrid` its x-1, DESIGN §22.10), `SP_FULL` (official `ALWAYS`: 执旗手 / 战术家 / 吟游者 MANUAL skills), `CUSTOM_RANGE` (official `CUSTOM_RANGE_SEARCH_ENEMY`, uses `customRangeGrid`), `SEARCH` (解放者 / 阵法术师 MANUAL skills, 安洁莉娜 S2/S3), `MLYSS_WTRMAN` (缪尔赛思), `GDGLOW_SKILL_2` (荒芜拉普兰德, 纯烬艾雅法拉 S3: "全场存在可选目标时释放技能"). |
|
||||
| `trigger` | `{"rule":"DEFAULT","rawRule":"DEFAULT","customRangeGrid":null}` | auto-cast rule (the official 技能策略, PRTS 卫戍协议/帮助 §作战阶段 技能操作; §2.2). `rule` ∈ `DEFAULT` (basic strategy), `SKILL_RANGE` (a MANUAL skill with a 技能范围 of its own: `customRangeGrid` = its `rangeGrid`, `rawRule` `DEFAULT` — no official row), `ACTIVE_RANGE` (the owner's deliberate deviation of 2026-10-05: a MANUAL skill on the basic strategy — 深巡 S2's deviation included — or on the `SEARCH` row whose attack range while it runs strictly contains the operator's own range: `customRangeGrid` = that running range, `rawRule` the official row, `DEFAULT` / `SEARCH` / 深巡's `TAKE_DAMAGE`), `TAKE_DAMAGE` (every MANUAL 重装 skill but seven: 深巡 / 雷蛇 S2, 号角 S2 / S3 and 灰毫 S1 / S2 are `DEFAULT` with `rawRule` `TAKE_DAMAGE` — a deliberate deviation, `tools/build-data.mjs TRIGGER_DEVIATIONS`, DESIGN §21.29; 深巡 S2 then `ACTIVE_RANGE` on its 3-2 — and 余 S2 is `SKILL_RANGE` with `rawRule` `TAKE_DAMAGE` and `customRangeGrid` its x-1, DESIGN §22.10), `SP_FULL` (official `ALWAYS`: 执旗手 / 战术家 / 吟游者 MANUAL skills), `CUSTOM_RANGE` (official `CUSTOM_RANGE_SEARCH_ENEMY`, uses `customRangeGrid`), `SEARCH` (解放者 / 阵法术师 MANUAL skills, 安洁莉娜 S2/S3 — but those whose running range is larger, `ACTIVE_RANGE`: 薄绿 S1, 蜜蜡 S1, 卡涅利安 S3, 玛恩纳 S2, 安洁莉娜 S3), `MLYSS_WTRMAN` (缪尔赛思), `GDGLOW_SKILL_2` (荒芜拉普兰德, 纯烬艾雅法拉 S3: "全场存在可选目标时释放技能"). |
|
||||
|
||||
### 2.1 Combat classification heuristic (`dmgType` / `attackKind` / `projectile` / `canHitFly`)
|
||||
- `dmgType`: MEDIC (except `incantationmedic`) and `bard` → `heal`; trait text containing 法术伤害 or profession CASTER → `arts`; else `phys`.
|
||||
@@ -213,10 +213,12 @@ everything needed to resolve a unit for `(chessId, skillIndex, moduleId)` (`simd
|
||||
MANUAL operator skill whose `rangeId` is a 技能范围 — its description is not an attack-range change ("攻击范围扩大 /
|
||||
改变 / 缩小 / 缩短", "攻击距离+N / 加长 / 缩短") — is `SKILL_RANGE` with `customRangeGrid` = its `rangeGrid`; summons keep
|
||||
DEFAULT. `customRangeGrid` of `CUSTOM_RANGE` from `skillRangeDict[skillId]`. Last, the owner's rule of 2026-10-05 (a
|
||||
deliberate deviation): a MANUAL operator skill still on DEFAULT (no row, no `TRIGGER_DEVIATIONS` entry) whose attack
|
||||
deliberate deviation): a MANUAL operator skill on DEFAULT (no row, or a DEFAULT entry of `TRIGGER_DEVIATIONS` /
|
||||
`STANDIN_TRIGGER_DEVIATIONS` — 深巡 S2) or on the `SEARCH` row (the owner's decision of 2026-10-05 too) whose attack
|
||||
range while it runs — its `rangeId` grid when the text is an attack-range change, else the operator's range grown by
|
||||
`ability_range_forward_extend`; never "被动效果:攻击范围扩大" (引星棘刺 S3) — strictly contains the record's own
|
||||
`rangeGrid` is `ACTIVE_RANGE` with `customRangeGrid` = that running range (`activeAttackGrid`; stand-in forms alike). (Research 03 Addendum C1 read the rows'
|
||||
`rangeGrid` is `ACTIVE_RANGE` with `customRangeGrid` = that running range (`activeAttackGrid`, `ACTIVE_RANGE_OVER`;
|
||||
stand-in forms alike). (Research 03 Addendum C1 read the rows'
|
||||
`skillIndex 0` as "skill 1 only" after BWIKI's transcription; superseded by user playtest #6.)
|
||||
- `modules[]` (golden, `equipLevel > 0`): every **ADVANCED** `uniequip` of the character (the INITIAL `uniequip_001_*`
|
||||
is "no module" = choice `'none'`), in official order, at the chess `equipLevel` (1, T6: 3):
|
||||
@@ -508,11 +510,12 @@ Glyph legend (`rows`):
|
||||
5. **Every non-DIY chess (258 records: 129 normal + 129 golden) has a resolvable default skill, stats and range** — no
|
||||
skill anomalies.
|
||||
6. **Skill triggers** (§2.2): the class rows cover every MANUAL skill of the class (all 重装 MANUAL skills are
|
||||
`TAKE_DAMAGE` but the six of the deliberate deviation, DESIGN §21.29, which are `DEFAULT` with `rawRule` `TAKE_DAMAGE`, and 余 S2, `SKILL_RANGE` on its x-1 (DESIGN §22.10); 薄绿 / 卡涅利安 / 蜜蜡 / 玛恩纳 S2 `SEARCH`; 伺夜 / 魔王 / 浊心斯卡蒂 S3 `SP_FULL`) and no AUTO skill (古米 /
|
||||
`TAKE_DAMAGE` but the six of the deliberate deviation, DESIGN §21.29, which are `DEFAULT` with `rawRule` `TAKE_DAMAGE` (深巡 S2 then `ACTIVE_RANGE`), and 余 S2, `SKILL_RANGE` on its x-1 (DESIGN §22.10); 薄绿 / 卡涅利安 / 蜜蜡 S2 and 玛恩纳 S1 `SEARCH`; 伺夜 / 魔王 / 浊心斯卡蒂 S3 `SP_FULL`) and no AUTO skill (古米 /
|
||||
雷蛇 / 瑕光 / 塞雷娅 / 号角 / 信仰搅拌机 S1, 伺夜 S1/S2, 魔王 S1); 13 MANUAL skills (26 normal + elite records) with
|
||||
their own 技能范围 are `SKILL_RANGE` (德克萨斯 S2, 凛御银灰 S2, 锏 S2/S3, 异客 S3, 忍冬 S2, 焰尾 S2 …); 余 S2 joins them by the §22.10 deviation, 14 skills / 28 records in the data; 33 MANUAL skills (66 records) whose
|
||||
their own 技能范围 are `SKILL_RANGE` (德克萨斯 S2, 凛御银灰 S2, 锏 S2/S3, 异客 S3, 忍冬 S2, 焰尾 S2 …); 余 S2 joins them by the §22.10 deviation, 14 skills / 28 records in the data; 39 MANUAL skills (78 records) whose
|
||||
running attack range strictly contains the operator's own are `ACTIVE_RANGE` (the owner's rule of 2026-10-05; 莫斯提马 S3,
|
||||
银灰 S3, 史尔特尔 S2 / S3 …), plus 预备干员 Touch S2 / S3 and Raidian S3 in `backups.json`.
|
||||
银灰 S3, 史尔特尔 S2 / S3 …; from the `SEARCH` row 薄绿 S1, 蜜蜡 S1, 卡涅利安 S3, 玛恩纳 S2, 安洁莉娜 S3, and 深巡 S2 over
|
||||
its deviation), plus 预备干员 Touch S2 / S3 and Raidian S3 in `backups.json`.
|
||||
7. **Trait candidate `rangeId`** (送葬人, 松果 1-3; 风丸, 归溟幽灵鲨 x-4) is the trait-effect area, exposed as
|
||||
`trait.rangeGrid`, not the attack range.
|
||||
8. **Passive skills** use numeric `spType 8` in skill_table → normalized to `ON_DEPLOY`.
|
||||
|
||||
+2
-2
@@ -305,7 +305,7 @@ Engine helpers (content must use these, never touch internals): `battle.dealDama
|
||||
|
||||
SP: `spType` `INCREASE_WITH_TIME` (+`spRecovery`/s), `INCREASE_WHEN_ATTACK` (+1 per attack), `INCREASE_WHEN_TAKEN_DAMAGE` (+1 per hit taken); starts at `initSp`; no SP gain while a duration skill is active. `maxChargeTime > 1` ⇒ charges.
|
||||
|
||||
Auto-trigger rules (`skillTrigger.rule` in data — the official 技能策略, PRTS 卫戍协议/帮助 §作战阶段 技能操作; §20.2): `DEFAULT` (SP ready AND about to attack/heal AND an enemy/injured ally inside the **initial** range, or an enemy the unit blocks; with `trigger.allies` + `hpAtMost` an ally of the skill grid at or below that HP ratio — 塞雷娅 S1 急救, whose cast replaces that attack and is withdrawn with its charge if the ally recovers first), `SKILL_RANGE` (a MANUAL skill with a 技能范围 of its own, not an attack-range change: any living enemy, stealthed ones included, on the skill range, checked every tick — "仅在技能范围内存在敌人(无视其不可选中)时释放技能"; 13 skills / 26 records by the official rule, 14 / 28 in the data with 余 S2's deviation, §22.10), `ACTIVE_RANGE` (the owner's deliberate deviation of 2026-10-05, 0.2.0: a MANUAL skill left on the basic strategy whose attack range while it runs strictly contains the operator's own range — its rangeId grid, or the own range grown by `ability_range_forward_extend` — checks the DEFAULT condition on that running range every tick, no attack needed; `customRangeGrid` = the running range, `rawRule` the official DEFAULT; 33 skills / 66 records; 烛煌 S2 / S3, whose ranges do not contain her 3-1, keep DEFAULT), `TAKE_DAMAGE` (on taking damage — any damage, 无来源 included, never a 流失; every MANUAL 重装 skill, §21.12 — but the six of the deliberate deviation, §21.29: 深巡 / 雷蛇 S2, 号角 S2 / S3 and 灰毫 S1 / S2 are `DEFAULT`, `rawRule` keeping the official TAKE_DAMAGE; and 余 S2, `SKILL_RANGE` on its x-1 (§22.10)), `SP_FULL` (immediately — 执旗手 / 战术家 / 吟游者 MANUAL skills, and AUTO DP skills such as 伺夜 S1, 焰尾 S1, 凛御银灰 S1), `CUSTOM_RANGE` (enemy inside the custom grid), `SEARCH` (an enemy inside the initial range, checked every tick — no attack needed; 解放者 / 阵法术师 MANUAL skills), `GDGLOW_SKILL_2` (a valid target anywhere on the field: 荒芜拉普兰德, 纯烬艾雅法拉 S3), special ids. The class rows cover **every MANUAL skill** of the class and never an AUTO skill (AUTO skills keep their own rule — an inference: PRTS names whole classes; the data's `skillIndex 0` / `-1` sentinel argues the other way, §20.2). **Operation cooldown**: the engine auto-casts a MANUAL skill no sooner than `AUTO_OP_COOLDOWN` (3 s) after its previous cast and after the unit's battle-start deployment ("自动操作具有3s冷却,在完成一次操作或作战开始时部署的单位将进入冷却"; `Battle._deploy` initial, `battle.flags.startOpCooldown`); kits with an automatic cast of their own check `skill.opCooling`; a pending "next attack" never takes a second charge. PASSIVE skills are always on.
|
||||
Auto-trigger rules (`skillTrigger.rule` in data — the official 技能策略, PRTS 卫戍协议/帮助 §作战阶段 技能操作; §20.2): `DEFAULT` (SP ready AND about to attack/heal AND an enemy/injured ally inside the **initial** range, or an enemy the unit blocks; with `trigger.allies` + `hpAtMost` an ally of the skill grid at or below that HP ratio — 塞雷娅 S1 急救, whose cast replaces that attack and is withdrawn with its charge if the ally recovers first), `SKILL_RANGE` (a MANUAL skill with a 技能范围 of its own, not an attack-range change: any living enemy, stealthed ones included, on the skill range, checked every tick — "仅在技能范围内存在敌人(无视其不可选中)时释放技能"; 13 skills / 26 records by the official rule, 14 / 28 in the data with 余 S2's deviation, §22.10), `ACTIVE_RANGE` (the owner's deliberate deviation of 2026-10-05, 0.2.0: a MANUAL skill on the basic strategy — or, by the owner's further decisions of the same day, on the `SEARCH` row, and 深巡 S2 on top of its §21.29 DEFAULT — whose attack range while it runs strictly contains the operator's own range — its rangeId grid, or the own range grown by `ability_range_forward_extend` — checks the DEFAULT condition on that running range every tick, no attack needed; `customRangeGrid` = the running range, `rawRule` the official row (DEFAULT, SEARCH, 深巡's TAKE_DAMAGE); 39 skills / 78 records, of them 薄绿 S1, 蜜蜡 S1, 卡涅利安 S3, 玛恩纳 S2 and 安洁莉娜 S3 from SEARCH; 烛煌 S2 / S3, whose ranges do not contain her 3-1, keep DEFAULT), `TAKE_DAMAGE` (on taking damage — any damage, 无来源 included, never a 流失; every MANUAL 重装 skill, §21.12 — but the six of the deliberate deviation, §21.29: 深巡 / 雷蛇 S2, 号角 S2 / S3 and 灰毫 S1 / S2 are `DEFAULT`, `rawRule` keeping the official TAKE_DAMAGE — 深巡 S2 then `ACTIVE_RANGE` on its 3-2; and 余 S2, `SKILL_RANGE` on its x-1 (§22.10)), `SP_FULL` (immediately — 执旗手 / 战术家 / 吟游者 MANUAL skills, AUTO DP skills such as 焰尾 S1, 凛御银灰 S1 (伺夜 S1 / S2 too, but only while his pack is on the field — PRTS 备注 「仅场上存在狼群时可触发技能」, the kit's own cast; the owner's decision of 2026-10-05 for S1), and, by their kits, AUTO skills whose effects act on allies only: 引星棘刺 S1, 浊心斯卡蒂 S2, 纯烬艾雅法拉 S1 — the owner's decision of 2026-10-05 for the last), `CUSTOM_RANGE` (enemy inside the custom grid), `SEARCH` (an enemy inside the initial range, checked every tick — no attack needed; 解放者 / 阵法术师 MANUAL skills and 安洁莉娜 S2, those without a larger running range), `GDGLOW_SKILL_2` (a valid target anywhere on the field: 荒芜拉普兰德, 纯烬艾雅法拉 S3), special ids. The class rows cover **every MANUAL skill** of the class and never an AUTO skill (AUTO skills keep their own rule — an inference: PRTS names whole classes; the data's `skillIndex 0` / `-1` sentinel argues the other way, §20.2). **Operation cooldown**: the engine auto-casts a MANUAL skill no sooner than `AUTO_OP_COOLDOWN` (3 s) after its previous cast and after the unit's battle-start deployment ("自动操作具有3s冷却,在完成一次操作或作战开始时部署的单位将进入冷却"; `Battle._deploy` initial, `battle.flags.startOpCooldown`); kits with an automatic cast of their own check `skill.opCooling`; a pending "next attack" never takes a second charge. PASSIVE skills are always on.
|
||||
|
||||
**SkillSpec** (authored per chess in `sim/content/kits/tierN.js`; values come from the chess's skill blackboard at its level — normal Lv4, elite Lv7 — so a spec is a *function of the blackboard*):
|
||||
```js
|
||||
@@ -1368,7 +1368,7 @@ Settled by the user:
|
||||
| Bounty drafts (§21.2) | the official structure of each round from the user's 66 screenshots of 22 matches (R3 fixed sets, R9 boss groups, R11 seen 7-card lists; no multi-round card in a draft) | add a newly seen set / group / list to `tools/build-data.mjs BOUNTY_INITIAL_SETS / BOUNTY_BOSS_GROUPS / BOUNTY_HUNTER_GROUPS` and rebuild |
|
||||
| 机密商店 / 战术决策 repeats (§21.2) | the same card can be offered twice, as officially (the user, 2026-10-03: "机密商店按官方改成可以重复吧", "战术决策也按官方改成可以重复吧"); R11 机密商店 = two VI, ≥ 1 V, ≥ 1 盟约之币 | `choices.json shopDraft` / `tacticDraft` removed (choices.js falls back to the previous draws, still with replacement) |
|
||||
| 坚固维式重锤's scope (§21.21) | one 不死 lock per DEPLOYMENT: the carrier's own redeploy (after a knock-out, a 突袭 retreat + redeploy) re-arms it and ends a window still running (the user, 2026-10-03: "每次部署一次"; the text says only 首次); the lock belongs to the deployment, so a borrowed hammer (萨尔贡 × 娜仁图亚) follows the same rule | `content/items/battle.js deploymentOf` returning one key for the whole battle (one lock per battle) |
|
||||
| Six 重装 skills' trigger (§21.29) | 深巡 S2, 雷蛇 S2, 号角 S2 / S3 and 灰毫 S1 / S2 cast with an enemy in range (the basic strategy, DEFAULT) instead of the official 下半 TANK row's TAKE_DAMAGE — a deliberate, documented deviation (the owner, 2026-10-03: "反馈的人太多了"; GitHub issue #4, PR #12); every other MANUAL 重装 skill, 深巡 S1 included, waits for a hit (余 S2 excepted since 2026-10-04: the owner extended the deviation to 余 S2, which casts with an enemy on its x-1 — `SKILL_RANGE`, §22.10) | remove the entry from `tools/build-data.mjs TRIGGER_DEVIATIONS` (for 深巡 / 雷蛇 also PR #12's `trigger: 'DEFAULT'` kit line) and rebuild; for 余 S2 remove its `TRIGGER_DEVIATIONS` entry (`chess_char_6_03_a`) and rebuild |
|
||||
| Six 重装 skills' trigger (§21.29) | 深巡 S2, 雷蛇 S2, 号角 S2 / S3 and 灰毫 S1 / S2 cast with an enemy in range (the basic strategy, DEFAULT) instead of the official 下半 TANK row's TAKE_DAMAGE — a deliberate, documented deviation (the owner, 2026-10-03: "反馈的人太多了"; GitHub issue #4, PR #12); every other MANUAL 重装 skill, 深巡 S1 included, waits for a hit (余 S2 excepted since 2026-10-04: the owner extended the deviation to 余 S2, which casts with an enemy on its x-1 — `SKILL_RANGE`, §22.10) | remove the entry from `tools/build-data.mjs TRIGGER_DEVIATIONS` (for 雷蛇 also PR #12's `trigger: 'DEFAULT'` kit line; 深巡 S2 reads its data's `ACTIVE_RANGE` since 0.2.0) and rebuild; for 余 S2 remove its `TRIGGER_DEVIATIONS` entry (`chess_char_6_03_a`) and rebuild |
|
||||
| Multi-round bounties (§20.6, unchanged) | last two battles — now only 教鞭's card | `server/match/choices.js MULTI_ROUND_BOUNTY_BATTLES = null` |
|
||||
| §20.9's decisions | unchanged (start-deploy summons, 凯瑟琳's hand card, every blocker hits, the collider reach, the elite to the board, the fixed leader pool, the watched bond strip) | as §20.9 |
|
||||
|
||||
|
||||
+1
-1
@@ -71,7 +71,7 @@
|
||||
- 作战中:海嗣、狼群、流形、支援装置开战时就在摆放的位置部署;医疗探机、诅咒娃娃开战时也在摆放的位置免费部署一次(持续 10 / 15 秒,和官方一样不需要先开技能),之后所属干员每次发动技能时再次在原位出现;所属干员被击倒、再部署回场时,技能给的那一个如果还没出现,会立刻出现。巫恋退场时诅咒娃娃随之撤退,赫默退场时已出现的医疗探机不受影响。医疗探机、诅咒娃娃、支援装置、海嗣没有摆放就不会出现;狼群、流形(战术家的援军)没有摆放时会在战术点出现。
|
||||
- **阻挡**看接触:干员阻挡中心距离约 0.7 格以内、与它接触的敌人(地面干员挡不住飞行和近地悬浮的敌人)。敌人卡在两名干员之间时,阻挡它的干员倒下、撤退或被晕眩后,另一名仍与它接触、还有空余阻挡数的干员会**立刻接替阻挡**;都没有空位时敌人才会走掉。迎面走来的敌人会停在干员格子前面。**阻挡了就一定能打到**:任何干员(包括站在近战位的远程干员和召唤物)总能攻击自己阻挡的敌人,不管它在不在攻击范围内、在干员哪一侧,并且优先攻击它(医疗干员除外:咒愈师以外的医疗挡住敌人时照常治疗队友,不会攻击它;「停止攻击」类技能期间也除外;技能原文另有限制的也按原文:普罗旺斯二技能开启时不以生命值高于 80% 的敌人为目标,寒檀二技能的冰凌随机落在攻击范围内的地块上)。
|
||||
- 开战时干员按**逐列从左到右、每列从上到下**的顺序部署(最左一列最先,与阿戈尔吞噬「更靠左和靠上」的顺序相同),召唤物在所有干员之后。被阻挡的敌人先打阻挡它的干员;没被阻挡的远程敌人先打嘲讽等级高的,同级时打最后部署的(召唤物、最右一列靠下的干员和刚再部署的干员更容易挨打)。隐匿的干员只会被它阻挡的敌人攻击,没被它挡住的敌人的溅射、爆炸、范围技能、留下的伤害区域(包括假想敌:蚀裂被击倒后喷出的毒雾)以及深池伙友卫队、扎罗的减攻速光环也落不到它身上(和官方一样;写明「无视无法选择」的效果如污染秽蚀照常能打到,寒霜的减攻速光环和“墓碑”这类地图效果照常生效);**迷彩**(如忍冬三技能期间击倒敌人后、寒芒克洛丝一技能)同样只会被它阻挡的敌人攻击,也显示为半透明,但躲不开溅射、爆炸和范围伤害(同时打范围内所有单位的普通攻击——如“斩胄之剑”“破胄之锤”“灵幛”——打不到它),也不算隐匿(不触发叙拉古等「隐匿时」效果)。叙拉古的隐匿按时(32 秒 + 每层 0.4 秒)结束;忍冬的迷彩按官方持续到她下一次开技能。**蒂比起飞**期间只挡飞行敌人,地面敌人不会选她为目标(普通攻击、溅射、技能范围、燃烧区域和要选中目标的减益都落不到她身上);飞行和悬浮敌人、写明「无视无法选择」的效果(如污染秽蚀)照常能打到她;地面敌人的光环和全场效果(如“墓碑”让全场攻击力、防御力减半)、她攻击敌人时招来的反制(如重装侦察兵的暴露)照常生效,起飞前已挂上的持续伤害也照常跳。
|
||||
- **技能自动释放**按官方「技能策略」:一般的手动技能在技能就绪、即将攻击 / 治疗且初始攻击范围内有敌人(治疗技能:有受伤的队友)时释放;**带独立技能范围**的技能(如德克萨斯「剑雨」、凛御银灰「御敌的锋锐」、锏「归于宁静」,不含「攻击范围扩大」类)在**技能范围内出现敌人**时就释放,不必先攻击;**开启后攻击范围比平时大**的手动技能(如莫斯提马「序时之匙」、银灰「真银斩」、史尔特尔「黄昏」、白面鸮「脑啡肽」)在**开启后的攻击范围内出现敌人**(治疗技能:有受伤的队友)时就释放,不必等敌人走进平时的攻击范围,这是本作按玩家反馈有意与官方不同的地方;**重装干员**的手动技能在受到伤害时释放(例外:深巡、雷蛇的二技能,号角的二、三技能,灰毫的一、二技能按玩家反馈改为攻击范围内有敌人时就释放,余的二技能「厚礼上宾」改为周围两格(技能范围)内有敌人时就释放,这是本作有意与官方不同的地方;深巡一技能仍要受到伤害);执旗手 / 战术家 / 吟游者技能就绪即释放,解放者 / 阵法术师在初始攻击范围内有敌人时释放。**自动触发**的技能按其本身规则,例如古米「备用军粮」在身边(技能范围内)有受伤的队友时就会发动,下一次攻击改为治疗该队友(不用先接敌;她的二技能「食粮烹制」是手动技能,按重装规则在受到伤害时释放);塞雷娅「急救」在她即将攻击时、身边有生命不高于一半的队友才发动,这次攻击直接改为治疗;新约能天使二技能的护盾按官方给攻击范围内**仇恨最高**的队友(嘲讽等级高的优先,同级时给最后部署的),不一定是站在最前面挨打的那个。手动技能的自动释放有 3 秒冷却:开战部署后先等 3 秒,之后同一干员两次自动释放至少间隔 3 秒(可充能的技能不会同时放完)。
|
||||
- **技能自动释放**按官方「技能策略」:一般的手动技能在技能就绪、即将攻击 / 治疗且初始攻击范围内有敌人(治疗技能:有受伤的队友)时释放;**带独立技能范围**的技能(如德克萨斯「剑雨」、凛御银灰「御敌的锋锐」、锏「归于宁静」,不含「攻击范围扩大」类)在**技能范围内出现敌人**时就释放,不必先攻击;**开启后攻击范围比平时大**的手动技能(如莫斯提马「序时之匙」、银灰「真银斩」、史尔特尔「黄昏」、白面鸮「脑啡肽」)在**开启后的攻击范围内出现敌人**(治疗技能:有受伤的队友)时就释放,不必等敌人走进平时的攻击范围,这是本作按玩家反馈有意与官方不同的地方;**重装干员**的手动技能在受到伤害时释放(例外:深巡、雷蛇的二技能,号角的二、三技能,灰毫的一、二技能按玩家反馈改为攻击范围内有敌人时就释放(深巡二技能按开启后更远的攻击范围判断),余的二技能「厚礼上宾」改为周围两格(技能范围)内有敌人时就释放,这是本作有意与官方不同的地方;深巡一技能仍要受到伤害);执旗手 / 战术家 / 吟游者技能就绪即释放,解放者 / 阵法术师在初始攻击范围内有敌人时释放(开启后攻击范围扩大的技能——薄绿「风语」、蜜蜡「沙暴扩散」、卡涅利安「食噬之印」、玛恩纳「未宽解的悲哀」,以及安洁莉娜「秘杖·反重力模式」——同样按开启后的攻击范围判断)。**自动触发**的技能按其本身规则:只作用于队友的(如引星棘刺「度算浪波」、浊心斯卡蒂「同葬无光之愿」、纯烬艾雅法拉「无声润物」)技力满就释放,不用等敌人或伤员;伺夜「领袖的呼唤」「领袖的馈赠」只在场上有狼群时释放(狼群被击倒后要等它重新出现);又如古米「备用军粮」在身边(技能范围内)有受伤的队友时就会发动,下一次攻击改为治疗该队友(不用先接敌;她的二技能「食粮烹制」是手动技能,按重装规则在受到伤害时释放);塞雷娅「急救」在她即将攻击时、身边有生命不高于一半的队友才发动,这次攻击直接改为治疗;新约能天使二技能的护盾按官方给攻击范围内**仇恨最高**的队友(嘲讽等级高的优先,同级时给最后部署的),不一定是站在最前面挨打的那个。手动技能的自动释放有 3 秒冷却:开战部署后先等 3 秒,之后同一干员两次自动释放至少间隔 3 秒(可充能的技能不会同时放完)。
|
||||
- **推开 / 拉拽**按官方「力度 − 重量」决定距离:例如野鬃二技能(中等力度)把重量 0 / 1 / 2 / 3 的敌人推开约 2.1 / 1.7 / 0.4 / 0.1 格,重量 4 以上推不动——轻型敌人反而推得更远。野鬃二技能沿她的朝向推开:正前方 45° 以内按上面的距离,身后、侧面或贴身的敌人只被轻推一下(约 0.4 格以内);琳琅诗怀雅三技能的金币则从她身边向外推开,落在她前方 2–4 格的范围(官方「范围2-4」)内的地面敌人和她阻挡的敌人身上。攻击速度最低为 20(沼泽、寒霜等减速叠满时也不会更慢)。
|
||||
- **元素损伤条**在单位自己的血条正下方:左边是元素图标,白条是剩余的元素值,只有真正爆发时才会耗尽;爆发后条变成元素的颜色、图标闪烁,在冷却期间慢慢回满(这段时间不会再积累元素损伤)。
|
||||
- **敌人**:远程敌人的射程按官方从干员的碰撞体积(半径 0.25 格)算起,比数据上的攻击范围半径远 0.25 格——例如萨卡兹枯朽战车(射程 2.2)能打到中心 2.45 格以内、站在低地的干员。没被阻挡的远程敌人每次攻击都会站定、播完攻击动作,两次攻击之间才继续前进。它的第一下攻击就是「秽蚀轰击」(在目标处留下半径 1.7、持续 10 秒的污染区:低地每秒 50、高台 25 点真实伤害,同名不叠加),被阻挡时普通攻击伤害翻倍。“萨科塔之翼”等血量第一次低于一半时会在原地小范围乱飞 5 秒(官方叫「恐惧」);叙拉古、妮芙等干员造成的恐惧会让敌人朝远离干员的方向逃跑。隐匿的敌人只有被阻挡(或被揭示)时才能被选为攻击目标,溅射、技能的圆形范围伤害也打不到没被挡住的隐匿敌人(和官方一样);阻挡解除后 3 秒内它仍然可以被选中(官方页面注明 0 秒或 1 秒的敌人按页面),之后才重新隐匿:深池逐火战士每次被击倒后先重生 1 秒,然后变成继续往前走的隐匿「余烬」(需要 5 次伤害击倒,护卫的「火灰」10 次),一般要用干员挡住它才能选中(挡住时它不再半透明;被阻挡时被击倒的,重生结束后约 2 秒内也能用远程或范围伤害补刀),10 秒内没打掉就满血站起来;敌人重生时身上的减速、恐惧等状态会被清空、技能冷却从头开始,被恐惧的逐火战士变成余烬后也能被挡住;转译基底·α 原始形态受到的伤害全部无效,受到第 4 次物理伤害、第 4 次法术伤害或被阻挡时花 2 秒变成寻仇者、特战术师或幽灵,之后才能被击倒。
|
||||
|
||||
+12
-11
@@ -803,27 +803,28 @@ or guard with a per-unit flag while dealing it. When the guard trips, the logged
|
||||
- Triggers (`skill.trigger.rule` in data — the official 技能策略, PRTS 卫戍协议/帮助 §作战阶段 技能操作, resolved by
|
||||
`tools/build-data.mjs resolveTrigger`: charId rows by skill index; the class rows (重装 / 执旗手 / 战术家 / 吟游者 / 解放者 /
|
||||
阵法术师) for **every MANUAL skill** of the class; SKILL_RANGE for a MANUAL skill with a 技能范围 of its own; ACTIVE_RANGE
|
||||
for a MANUAL skill on the basic strategy whose running attack range strictly contains the own range; AUTO skills
|
||||
take no row — they keep their own rule, DEFAULT or a kit override): `DEFAULT` — the basic strategy: ready **and** about
|
||||
to attack/heal **and** an enemy (heal skills: an injured ally) inside the **initial** range (`unit.baseRangeKeys`: its
|
||||
own grid + its permanent rangeExtend — "攻击范围扩大" modules/talents as persist never-expiring `rangeExtend` buffs; no
|
||||
skill range, no temporary extend, no extra keys) or blocked by the melee unit — or, checked **every tick**, an enemy
|
||||
(flyers included) inside a content trigger range (`unit.skill.addTriggerRange(fn)`, `fn(battle, unit)` → list of ally
|
||||
units (their current range) or tile-key arrays; returns an unregister fn; not for heal skills: 海嗣 "攻击范围视为自身攻击
|
||||
范围的延伸", 流形); `SKILL_RANGE` — "不通过普通攻击/治疗触发技能,仅在技能范围内存在敌人(无视其不可选中)时释放技能": any
|
||||
for a MANUAL skill on the basic strategy or the SEARCH row whose running attack range strictly contains the own range;
|
||||
AUTO skills take no row — they keep their own rule, DEFAULT or a kit override): `DEFAULT` — the basic strategy: ready
|
||||
**and** about to attack/heal **and** an enemy (heal skills: an injured ally) inside the **initial** range
|
||||
(`unit.baseRangeKeys`: its own grid + its permanent rangeExtend — "攻击范围扩大" modules/talents as persist never-expiring
|
||||
`rangeExtend` buffs; no skill range, no temporary extend, no extra keys) or blocked by the melee unit — or, checked
|
||||
**every tick**, an enemy (flyers included) inside a content trigger range (`unit.skill.addTriggerRange(fn)`,
|
||||
`fn(battle, unit)` → list of ally units (their current range) or tile-key arrays; returns an unregister fn; not for
|
||||
heal skills: 海嗣 "攻击范围视为自身攻击范围的延伸", 流形); `SKILL_RANGE` — "不通过普通攻击/治疗触发技能,仅在技能范围内存在敌人(无视其不可选中)时释放技能": any
|
||||
living enemy (stealthed, untargetable, flying included) on `trigger.customRangeGrid` (= the skill's rangeGrid), every
|
||||
tick, no attack needed; a kit may set `trigger.allies` (+ `hpAtMost`, default 1) for an injured, healable ally of the
|
||||
grid at or below that HP ratio instead (the AUTO heal skill 古米 S1: PRTS 备注 "此技能在存在生命值不满的可治疗角色时可
|
||||
触发…直至古米完成一次普通攻击的治疗" — her heal mode waits for its heal); `ACTIVE_RANGE` — the owner's rule of 2026-10-05
|
||||
(a deliberate deviation): a MANUAL skill on the basic strategy whose attack range while it runs strictly contains the
|
||||
(a deliberate deviation): a MANUAL skill on the basic strategy (深巡 S2's DEFAULT deviation included) or on the SEARCH
|
||||
row (薄绿 S1, 蜜蜡 S1, 卡涅利安 S3, 玛恩纳 S2, 安洁莉娜 S3) whose attack range while it runs strictly contains the
|
||||
unit's own range checks the DEFAULT condition — a targetable enemy (or one it blocks), a heal skill an injured ally —
|
||||
on `trigger.customRangeGrid` (= that running range, grown by the unit's permanent rangeExtend unless the skill's
|
||||
`targeting.noRangeExtend`), every tick, no attack needed; `DEFAULT` with `trigger.allies` (+ `hpAtMost`,
|
||||
`grid`) = the basic rule **and** such an ally on the grid: the cast replaces the attack about to be made (塞雷娅 S1 "触发
|
||||
时会替换当次攻击", ≤ half HP); a cast whose ally condition fails before that attack is withdrawn, its charge returned;
|
||||
`TAKE_DAMAGE` — ready and just hit (重装: "不受技能范围影响,受到伤害时释放技能"; in the data every MANUAL 重装 skill but
|
||||
the six of DESIGN §21.29 — 深巡 / 雷蛇 S2, 号角 S2 / S3, 灰毫 S1 / S2 — which are `DEFAULT`, a deliberate deviation, and 余
|
||||
S2 厚礼上宾, `SKILL_RANGE` on its own x-1 since DESIGN §22.10);
|
||||
the six of DESIGN §21.29 — 深巡 / 雷蛇 S2, 号角 S2 / S3, 灰毫 S1 / S2 — which are `DEFAULT`, a deliberate deviation (深巡
|
||||
S2 then `ACTIVE_RANGE` on its 3-2), and 余 S2 厚礼上宾, `SKILL_RANGE` on its own x-1 since DESIGN §22.10);
|
||||
`SP_FULL` (`ALWAYS`) — immediately;
|
||||
`CUSTOM_RANGE` — an enemy inside `trigger.customRangeGrid` (rotated by the unit direction like every grid); `SEARCH` — an
|
||||
enemy inside the INITIAL range, checked every tick (no attack needed: "不受基础策略影响,在初始攻击范围内存在敌人时释放技能");
|
||||
|
||||
@@ -203,7 +203,8 @@ Each item is a mistake this project already made once. Tick every one for every
|
||||
`skills[].trigger`); check it, and change the data rule rather than hand-coding a trigger in the kit. The owner's
|
||||
rules (0.2.0): a skill whose attack range is larger than the normal one casts as soon as an enemy is inside the
|
||||
SKILL range (a deliberate deviation from the official 技能策略, like the 重装 exception: data `ACTIVE_RANGE` for a
|
||||
MANUAL skill on the basic strategy whose running range strictly contains the operator's own,
|
||||
MANUAL skill on the basic strategy — 深巡 S2's DEFAULT deviation included — or on the SEARCH row (薄绿 S1, 玛恩纳 S2,
|
||||
安洁莉娜 S3 …) whose running range strictly contains the operator's own,
|
||||
`test/sim/feedback5-active-range.test.js`; 烛煌 S3 in `feedback1e-skillrange.test.js` keeps DEFAULT — its 4-11 does
|
||||
not contain her 3-1); an AUTO skill that acts on
|
||||
allies or itself fires at full SP (引星棘刺 S1, `kits_alt_t5.test.js` "… fires as soon as its SP is full, no enemy
|
||||
|
||||
@@ -7,11 +7,13 @@ export default {
|
||||
// ---------------------------------------------------------------------------------------------------------------
|
||||
// 1_04 深巡 行动能力剥夺: longer line range (skill grid), ATK +atk, ASPD +attack_speed, fin darts pierce
|
||||
// attack@max_target enemies on the line and cause attack@sluggish s of 停顿.
|
||||
// 技能策略 → DEFAULT (PR #12; DESIGN §21.29): the official 下半 class row hands every MANUAL 重装 skill TAKE_DAMAGE,
|
||||
// which makes a 2-2 ranged 哨戒铁卫 wait until something hits her — in practice until she blocks (GitHub issue #4). By
|
||||
// the owner's deliberate deviation from that row (2026-10-03, community feedback) this offensive ranged skill takes
|
||||
// the basic strategy (SP ready + about to attack + an enemy inside the initial range); her data says DEFAULT too
|
||||
// (rawRule keeps the official TAKE_DAMAGE). Only the rule changes: spCost / initSp / spType still come from data.
|
||||
// 技能策略 (DESIGN §21.29, PR #12): the official 下半 class row hands every MANUAL 重装 skill TAKE_DAMAGE, which makes a
|
||||
// 2-2 ranged 哨戒铁卫 wait until something hits her — in practice until she blocks (GitHub issue #4). By the owner's
|
||||
// deliberate deviation from that row (2026-10-03, community feedback) this offensive ranged skill takes the basic
|
||||
// strategy (tools/build-data.mjs TRIGGER_DEVIATIONS: DEFAULT, rawRule keeps the official TAKE_DAMAGE), and since 0.2.0
|
||||
// the owner's ACTIVE_RANGE rule on top of it (2026-10-05): its running range 3-2 strictly contains her 2-2, so it casts
|
||||
// as soon as an enemy is inside the 3-2 — the data rule (rule ACTIVE_RANGE, customRangeGrid the 3-2), which this spec
|
||||
// reads (PR #12's DEFAULT line is gone: it would have kept the 2-2).
|
||||
// 细胞活性抑制剂: attacks inflict `damage` arts per `interval` s for `duration` s (damage_seamonster vs 【海怪】).
|
||||
// Elite module (SPT-X): stealth of enemies inside the range is cancelled.
|
||||
// Alternate S1 侵袭破坏应对 (重装 ⇒ TAKE_DAMAGE trigger from data): ATK +atk, DEF +def.
|
||||
@@ -20,7 +22,6 @@ export default {
|
||||
const s1 = skillBbOf(chess, 'skchr_udflow_1');
|
||||
return {
|
||||
skill: {
|
||||
trigger: 'DEFAULT',
|
||||
kind: 'duration', mods: { atkPct: num(bb.atk), aspd: num(bb.attack_speed) },
|
||||
targeting: { rangeGrid: def?.skill?.rangeGrid ?? null, maxTargets: num(bb['attack@max_target'], 1) },
|
||||
attack: { onHitStatus: { key: 'sluggish', duration: num(bb['attack@sluggish'], 1) } },
|
||||
|
||||
@@ -8,11 +8,13 @@ export default {
|
||||
// pushes each one towards her, end-of-skill burst on
|
||||
// every enemy in range; 地质学者: DEF aura (skill off) / less likely targeted (skill on);
|
||||
// 精锐 module PLX-X: keeps part of the guard (DEF/RES) while the skill runs
|
||||
// S1 风语: wider range (skill grid), attacks every enemy on it at attack@atk_scale. Auto-cast: the data
|
||||
// rule SEARCH is the 阵法术师 row (PRTS 卫戍协议/帮助 "不受基础策略影响,在初始攻击范围内存在敌人时释放技能"; it
|
||||
// covers every MANUAL skill of the class — user playtest #6) = an enemy inside her INITIAL range — the engine's
|
||||
// DEFAULT rule, checked every tick for a unit that does not attack while its skill is off — not any enemy on the
|
||||
// field: she would burn the skill on enemies that just spawned.
|
||||
// S1 风语: wider range (skill grid), attacks every enemy on it at attack@atk_scale. Auto-cast: the official
|
||||
// rule is the 阵法术师 row SEARCH (PRTS 卫戍协议/帮助 "不受基础策略影响,在初始攻击范围内存在敌人时释放技能"; it covers
|
||||
// every MANUAL skill of the class — user playtest #6) = an enemy inside her INITIAL range, never any enemy on the
|
||||
// field (she would burn the skill on enemies that just spawned). Since 0.2.0 the owner's ACTIVE_RANGE rule
|
||||
// (2026-10-05) widens it: the S1 x-2 strictly contains her x-1, so the data rule is ACTIVE_RANGE on the x-2 (rawRule
|
||||
// SEARCH) — an enemy she can target inside the x-2, every tick — which this spec reads. S2 keeps SEARCH (no range
|
||||
// change).
|
||||
chess_char_3_08_a: (bb, chess, def) => {
|
||||
const d = defOf(chess, def);
|
||||
const t0 = talentBb(d, 0);
|
||||
@@ -38,7 +40,6 @@ export default {
|
||||
const grid = copyGrid(s.rangeGrid);
|
||||
return {
|
||||
kind: 'duration',
|
||||
trigger: { rule: 'DEFAULT' },
|
||||
attack: { atkScale: num(s.bb['attack@atk_scale'], num(s.bb.atk_scale, 1)) },
|
||||
...(grid ? { targeting: { rangeGrid: grid } } : {}),
|
||||
onStart: guardOn,
|
||||
|
||||
@@ -11,8 +11,9 @@ export default {
|
||||
// wolf = +1 block and one more bite, a wolf is lost instead of the pack dying); 狼群天性: DEF ignore vs pack-blocked
|
||||
// enemies; S3 领袖的尊严: DP over time, 三连击, bonus arts vs pack-blocked enemies; 精锐 module: pack takes less
|
||||
// damage from the enemies it blocks (token module talent). A 狼群 piece placed in the prep phase is the pack.
|
||||
// S1 领袖的呼唤 (ALWAYS): +cost DP and one more “狼影” (≤ the talent's maximum); S2 领袖的馈赠: +cost DP, the pack
|
||||
// recovers hp_ratio of its max HP and its next attack hits ×atk_scale — a kill by that attack gives +cost DP.
|
||||
// S1 领袖的呼唤 (自动触发, only while the pack is on the field): +cost DP and one more “狼影” (≤ the talent's
|
||||
// maximum); S2 领袖的馈赠: +cost DP, the pack recovers hp_ratio of its max HP and its next attack hits ×atk_scale —
|
||||
// a kill by that attack gives +cost DP.
|
||||
// 精锐 module TAC-Y: trait ×165 % (profession layer) and "援军阻挡的敌人更容易受到我方的攻击": the pack's token module
|
||||
// talent taunt_level (+1) goes to the enemies it blocks — the enemy-side 嘲讽等级 our operators target first
|
||||
// (targeting.js; research 05: "更容易受到我方的攻击" = enemy taunt.taunt_level), never to the pack itself.
|
||||
@@ -114,6 +115,14 @@ export default {
|
||||
return true;
|
||||
};
|
||||
const dpGain = (battle, unit, n) => { if (n > 0) { battle.addDp(unit.ownerId, n); fx(battle, 'dp', unit, { n }); } };
|
||||
// S1: the cast — ready and the pack on the field (PRTS 备注 「仅场上存在狼群时可触发技能」)
|
||||
const installCall = (battle, unit) => {
|
||||
battle.on('tick', () => {
|
||||
const sk = unit.skill;
|
||||
if (!alive(unit) || !sk || !sk.ready || sk.active || !unit.canAct || unit.s.flags.silence || !wolfOf(unit)) return;
|
||||
sk.activate('SP_FULL');
|
||||
}, { owner: unit });
|
||||
};
|
||||
// S2: the pack's empowered next attack (armed by the cast; ×scale on its hits; a kill pays once)
|
||||
const installGift = (battle, unit) => {
|
||||
battle.on('tick', () => { // the cast: ready, the pack on the field, no unused gift on it (PRTS 备注)
|
||||
@@ -195,11 +204,15 @@ export default {
|
||||
},
|
||||
},
|
||||
skills: altSkills(chess, d, bb, {
|
||||
// (自动触发: an AUTO skill takes no 技能策略 — the 战术家 row is for MANUAL skills — and this DP skill fires as soon
|
||||
// as it is ready, as before)
|
||||
// (自动触发: an AUTO skill takes no 技能策略 — the 战术家 row is for MANUAL skills. PRTS 备注 「仅场上存在狼群时可触发技能」
|
||||
// (the owner's decision of 2026-10-05): the kit casts it as soon as it is ready while the pack stands
|
||||
// (installCall); without a pack it waits at full SP — until 0.2.0 it fired at SP_FULL and paid its DP with no pack.
|
||||
// The 备注 also counts the pack's 战术点形态 (after its last 狼影 is lost) as on the field — the cast brings it back
|
||||
// at once with one 狼影 — and at the 狼影 cap resets the pack's HP; the kit has neither: a knocked-out pack comes
|
||||
// back after its respawn time and S1 waits for it, and at the cap it only pays its DP [ASSUMED])
|
||||
skchr_vigil_1: (s) => ({
|
||||
kind: 'instant',
|
||||
trigger: 'SP_FULL',
|
||||
trigger: 'NEVER',
|
||||
onStart({ battle, unit }) {
|
||||
dpGain(battle, unit, num(s.bb.cost, 0));
|
||||
const w = wolfOf(unit);
|
||||
@@ -223,7 +236,10 @@ export default {
|
||||
},
|
||||
}),
|
||||
}),
|
||||
install(battle, unit) { if (sel === 'skchr_vigil_2') installGift(battle, unit); },
|
||||
install(battle, unit) {
|
||||
if (sel === 'skchr_vigil_1') installCall(battle, unit);
|
||||
if (sel === 'skchr_vigil_2') installGift(battle, unit);
|
||||
},
|
||||
talents: [
|
||||
{ install() { /* 狼群领袖: the pack itself (trait.install / wolfKit) */ } },
|
||||
{ install(battle, unit) {
|
||||
|
||||
@@ -17,7 +17,8 @@ export default withDefaults({
|
||||
// S1 沙暴守卫 (SEARCH: ATK/DEF up; charged — cast with every charge stored — "特性效果在技能期间继续生效", PRTS 备注
|
||||
// "应用蓄力时:应用技能未开启时的特性": the skill-off trait stays in force, the DEF/RES guard AND 不攻击 — she makes
|
||||
// no attack until the skill ends, a pure guard);
|
||||
// S3 食噬之印 (wider range, ATK +0 % → +140 %/+200 % in 1 s steps over 20 s — PRTS 备注; charged: each attack adds a
|
||||
// S3 食噬之印 (wider range — data rule ACTIVE_RANGE on its x-2, the owner's rule of 2026-10-05 over the 阵法术师
|
||||
// SEARCH row —, ATK +0 % → +140 %/+200 % in 1 s steps over 20 s — PRTS 备注; charged: each attack adds a
|
||||
// stack of the mark BEFORE its damage — PRTS 备注 "于攻击造成伤害前生效,多层效果之间加算叠加" — +20 % damage from
|
||||
// her per stack, ≤ 5, so ×1.2 on the first hit and ×2.0 from the 5th, until the skill ends; one mark per enemy:
|
||||
// another 卡涅利安 only adds stacks to it, the bonus is the setter's — PRTS 备注 popup). Talent 生命之餐 heals on
|
||||
|
||||
@@ -21,7 +21,8 @@ export default {
|
||||
// enemies around). T2 无动于衷: taunt +1, Kazimierz ops reflect 15 % of his ATK as true damage when attacked.
|
||||
// S1 未声张的怒火 (duration, SEARCH): attacks attack@atk_scale × ATK, DEF +. S2 未宽解的悲哀 (duration): skill range,
|
||||
// BAT +0.3 s, attacks attack@atk_scale × ATK twice; a kill of his own attacks during the skill keeps the trait ramp
|
||||
// when it ends. S1 / S2 have no 对空 note: ground only, like his trait.
|
||||
// when it ends. S1 / S2 have no 对空 note: ground only, like his trait. S2's data rule is ACTIVE_RANGE on its 2-3 (the
|
||||
// owner's rule of 2026-10-05 over the 解放者 SEARCH row: an enemy he can target inside the 2-3 casts it).
|
||||
chess_char_5_19_a: (bb, chess, def) => {
|
||||
const t0 = talent(chess, 0), t1 = talent(chess, 1);
|
||||
const sid = selectedId(chess, def);
|
||||
|
||||
@@ -17,7 +17,8 @@ function enemySpUp(battle, unit, key, sp) {
|
||||
|
||||
export default {
|
||||
// ---------------------------------------------------------------------------------------------------------------
|
||||
// 安洁莉娜 — slower (no normal attack while the skill is off). S3 秘杖·反重力模式 (14/18 s, SEARCH): every enemy on the
|
||||
// 安洁莉娜 — slower (no normal attack while the skill is off). S3 秘杖·反重力模式 (14/18 s; her SEARCH row widened to
|
||||
// ACTIVE_RANGE on its y-4 by the owner's rule of 2026-10-05: an enemy inside the y-4 casts it): every enemy on the
|
||||
// field is weightless, skill range, ATK +, 4/5 targets. T1 加速力场: all allies ASPD +7. T2 兼职工作: while the skill is
|
||||
// off, all allies regenerate 20 HP/s. Module (elite): longer sluggish (trait bb, profession tunables).
|
||||
// S1 秘杖·速充模式 (duration, attack SP): ATK +; she attacks normally with S1 ("技能未开启时无法普通攻击" is only in the
|
||||
|
||||
@@ -14,10 +14,13 @@ function agoat2(bb, chess, def) {
|
||||
const elemLoad = (a) => (a.elem ? a.elem.burn + a.elem.neural + a.elem.necrosis + a.elem.apoptosis + a.elem.erosion : 0);
|
||||
const skills = {
|
||||
// S1 无声润物 (toggle, heal): ATK +atk, one extra heal target, every ally of her range recovers ep_heal_ratio × ATK
|
||||
// 元素损伤 per second
|
||||
// 元素损伤 per second. 自动触发 with effects on allies only (nothing to target): on as soon as its SP is full (SP_FULL,
|
||||
// the owner's decision of 2026-10-05, like 浊心斯卡蒂 S2 / 引星棘刺 S1); until 0.2.0 the data's DEFAULT heal rule kept
|
||||
// it off until an ally of her range was injured, so its 元素损伤 recovery never ran on a field without HP damage
|
||||
skchr_agoat2_1: {
|
||||
kind: 'toggle',
|
||||
heal: true,
|
||||
trigger: 'SP_FULL',
|
||||
mods: { atkPct: num(bb.atk) },
|
||||
targeting: { maxTargets: 2 },
|
||||
onStart({ unit }) { unit.mem.agoatAcc = 0; },
|
||||
|
||||
@@ -17,10 +17,10 @@
|
||||
// false) is honoured. Per-skill triggers come from data (the official 技能策略: every MANUAL 重装 skill ⇒ TAKE_DAMAGE —
|
||||
// but the six of the owner's deliberate deviation, DESIGN §21.29 / tools/build-data.mjs TRIGGER_DEVIATIONS, which are
|
||||
// DEFAULT —, a MANUAL skill with its own 技能范围 ⇒ SKILL_RANGE, a MANUAL skill on the basic strategy whose running attack
|
||||
// range strictly contains the own one ⇒ ACTIVE_RANGE (the owner's rule, 2026-10-05), AUTO skills keep their own rule);
|
||||
// the few spec rules are documented at the skill (冲锋号令 AUTO ⇒ SP_FULL, 花香疗法 heal-type DEFAULT; the two 哨戒铁卫
|
||||
// S2s 深巡 行动能力剥夺 and 雷蛇 反击电弧 state the DEFAULT their data carries since that deviation — GitHub issue #4,
|
||||
// PR #12).
|
||||
// range strictly contains the own one ⇒ ACTIVE_RANGE (the owner's rule, 2026-10-05 — 深巡 S2 too, on top of its
|
||||
// deviation), AUTO skills keep their own rule); the few spec rules are documented at the skill (冲锋号令 AUTO ⇒ SP_FULL,
|
||||
// 花香疗法 heal-type DEFAULT; the 哨戒铁卫 S2 雷蛇 反击电弧 states the DEFAULT its data carries since that deviation —
|
||||
// GitHub issue #4, PR #12; 深巡 行动能力剥夺 dropped its PR #12 line in 0.2.0 and reads its data's ACTIVE_RANGE).
|
||||
// Tests: test/content/kits_alt_t1.test.js.
|
||||
//
|
||||
// fx kinds emitted (battle.fx(kind, {x, y, …})): aoe {radius, id, skill} · zone {radius, dur, id, skill} ·
|
||||
|
||||
@@ -24,10 +24,9 @@
|
||||
// parts that belong to one skill only (琳琅诗怀雅 bombs, 菲莱 counters, 雪猎 special bullets…) check the selected skill id.
|
||||
// Triggers come from the data record of each skill (skills[i].trigger: tools/build-data.mjs resolveTrigger — the official
|
||||
// 技能策略 incl. SKILL_RANGE for a MANUAL skill's own 技能范围 and the class rows for every MANUAL skill; ACTIVE_RANGE, the
|
||||
// owner's rule of 2026-10-05, for a MANUAL basic-strategy skill whose running range strictly contains the own one), except
|
||||
// 薄绿 S1 (the 阵法术师 row SEARCH = "在初始攻击范围内存在敌人时" ⇒ the engine's DEFAULT for a phalanx, checked every
|
||||
// tick) and the kits' own automatic casts (雪猎 special bullets). Non-default modules: 能天使 MAR-Y (ASPD vs ground), 琳琅诗怀雅 MER-Y (ATK per payment),
|
||||
// 斯卡蒂 DRE-X (× vs blocked), 瑕光 GUA-X (heal × under 50 %), 伺夜 TAC-Y (×165 % trait, pack-blocked enemies taunt +1),
|
||||
// owner's rule of 2026-10-05, for a MANUAL basic-strategy or SEARCH-row skill whose running range strictly contains the
|
||||
// own one — 薄绿 S1 on its x-2), except the kits' own automatic casts (雪猎 special bullets, 伺夜 S1 / S2's pack check).
|
||||
// Non-default modules: 能天使 MAR-Y (ASPD vs ground), 琳琅诗怀雅 MER-Y (ATK per payment), 斯卡蒂 DRE-X (× vs blocked), 瑕光 GUA-X (heal × under 50 %), 伺夜 TAC-Y (×165 % trait, pack-blocked enemies taunt +1),
|
||||
// 空弦 MAR-X (fly ×, profession layer). No in-battle effect here: 忍冬 SOL-Y "首次部署时部署费用-4" (the initial
|
||||
// deployment is free) and the 集成战略-only ISW-A modules of 琳琅诗怀雅 / 空弦 (their stats and trait cost still apply).
|
||||
|
||||
|
||||
@@ -27,7 +27,8 @@
|
||||
// the heal replaces that attack). Every other
|
||||
// kit keeps the data rule (tools/build-data.mjs resolveTrigger, the official 技能策略: DEFAULT = about to attack + an
|
||||
// enemy in the INITIAL range; SKILL_RANGE for a MANUAL skill's own 技能范围; ACTIVE_RANGE for a MANUAL skill on the basic
|
||||
// strategy whose running attack range strictly contains the own one (the owner's rule, 2026-10-05); the class rows —
|
||||
// strategy or the SEARCH row (玛恩纳 S2, 安洁莉娜 S3) whose running attack range strictly contains the own one (the
|
||||
// owner's rule, 2026-10-05); the class rows —
|
||||
// 重装 TAKE_DAMAGE … — for
|
||||
// every MANUAL skill; AUTO skills never take a class row).
|
||||
// - fx kinds emitted (battle.fx(kind, {x, y, id, …})): 'aoe' {r, skill}, 'healAoe' {r}, 'summon' {token}, 'anchor'
|
||||
|
||||
@@ -14,10 +14,11 @@
|
||||
// too), checked every tick, no attack needed. Kit option `trigger.allies` (+ `hpAtMost`, default 1): a healable,
|
||||
// injured ally of the grid whose HP ratio is at most that instead (an AUTO heal skill's own rule — 古米 S1 waits in
|
||||
// its heal mode until it has healed);
|
||||
// ACTIVE_RANGE — the owner's rule (2026-10-05, a deliberate deviation): a MANUAL skill on the basic strategy whose attack
|
||||
// range while it runs strictly contains the unit's own range checks the DEFAULT condition on that larger range
|
||||
// (trigger grid = the running range, grown by the unit's permanent rangeExtend unless the skill ignores 攻击距离), every
|
||||
// tick, no attack needed — an enemy the unit can target there (or one it blocks), a heal skill an injured ally;
|
||||
// ACTIVE_RANGE — the owner's rule (2026-10-05, a deliberate deviation): a MANUAL skill on the basic strategy (深巡 S2's
|
||||
// DEFAULT deviation included) or on the SEARCH row (薄绿 S1, 玛恩纳 S2, 安洁莉娜 S3 …) whose attack range while it runs
|
||||
// strictly contains the unit's own range checks the DEFAULT condition on that larger range (trigger grid = the running
|
||||
// range, grown by the unit's permanent rangeExtend unless the skill ignores 攻击距离), every tick, no attack needed —
|
||||
// an enemy the unit can target there (or one it blocks), a heal skill an injured ally;
|
||||
// TAKE_DAMAGE (ready + just took a hit: 重装 "不受技能范围影响,受到伤害时释放技能"), SP_FULL/ALWAYS (as soon as ready),
|
||||
// CUSTOM_RANGE (enemy inside the custom trigger grid), SEARCH (an enemy inside the INITIAL range, checked every tick
|
||||
// without waiting for an attack: "不受基础策略影响,在初始攻击范围内存在敌人时释放技能" — not any enemy on the field,
|
||||
|
||||
@@ -432,20 +432,22 @@ test('3_06 菲莱 S1 灵河护佑 (TAKE_DAMAGE): HP +, clears her element gauges
|
||||
}
|
||||
});
|
||||
|
||||
test('3_08 薄绿 S1 风语 (阵法术师 技能1: "初始攻击范围内出现敌人后自动释放"): wider range, attacks at attack@atk_scale; guard/taunt rules kept', () => {
|
||||
test('3_08 薄绿 S1 风语 (阵法术师 row SEARCH "在初始攻击范围内存在敌人时", widened to its running x-2 by the owner\'s ACTIVE_RANGE rule of 2026-10-05): wider range, attacks at attack@atk_scale; guard/taunt rules kept', () => {
|
||||
for (const id of BOTH('chess_char_3_08_a')) {
|
||||
const b = SB(id, 'skchr_mint_1'), t0 = TB(id, 0);
|
||||
assert.equal(LD(id, 'skchr_mint_1').skill.trigger?.rule, 'SEARCH', 'data: the phalanx S1 row');
|
||||
const h = makeBattle({ defs: { enemies: { enemy_d: dummy('enemy_d'), enemy_in: dummy('enemy_in') } }, timeLimit: 60, hooks: ['damaged'], captureNoisy: true,
|
||||
units: [U(id, 'skchr_mint_1', 10, 4)], enemies: [{ key: 'enemy_d', pos: [11, 6] }] }); // [1,2]: x-2 only
|
||||
const sk = LD(id, 'skchr_mint_1').skill;
|
||||
assert.equal(sk.trigger?.rule, 'ACTIVE_RANGE', 'data: the phalanx row (rawRule SEARCH) on the x-2 she attacks with');
|
||||
assert.deepEqual(sk.trigger.grid, sk.rangeGrid, 'trigger grid = the S1 x-2');
|
||||
const h = makeBattle({ defs: { enemies: { enemy_d: dummy('enemy_d'), enemy_far: dummy('enemy_far') } }, timeLimit: 60, hooks: ['damaged'], captureNoisy: true,
|
||||
units: [U(id, 'skchr_mint_1', 10, 4)], enemies: [{ key: 'enemy_far', pos: [10, 7] }] }); // [0,3]: outside the x-2 too
|
||||
const u = h.unit(id);
|
||||
h.run(1);
|
||||
assert.equal(atkHits(h, u).length, 0, 'phalanx: no attack while the skill is off');
|
||||
fill(u);
|
||||
h.run(2);
|
||||
assert.equal(u.skill.activations, 0, 'an enemy outside her INITIAL range does not open it (not a whole-field search)');
|
||||
h.spawn('enemy_in', { pos: [10, 6] }); // [0,2]: initial range
|
||||
assert.ok(h.runUntil(() => u.skill.active, 1), 'an enemy inside her initial range opens it at once (she never attacks before)');
|
||||
assert.equal(u.skill.activations, 0, 'an enemy outside the x-2 does not open it (not a whole-field search)');
|
||||
h.spawn('enemy_d', { pos: [11, 6] }); // [1,2]: the x-2 only, outside her initial x-1
|
||||
assert.ok(h.runUntil(() => u.skill.active, 1), 'an enemy inside the S1 x-2 opens it at once (she never attacks before)');
|
||||
assert.ok(u.findBuff('talent:mint_taunt'));
|
||||
approx(u.s.taunt, (u.base.tauntLevel ?? 0) + t0.taunt_level);
|
||||
h.run(3);
|
||||
@@ -747,12 +749,12 @@ test('3_18 忍冬 S1 小施惩戒: next attack + extra arts and +DP; S2 坠刃
|
||||
}
|
||||
});
|
||||
|
||||
test('3_19 伺夜 S1 领袖的呼唤 (ALWAYS): +DP and one more “狼影” (≤ max)', () => {
|
||||
test('3_19 伺夜 S1 领袖的呼唤 (自动触发, the pack on the field): +DP and one more “狼影” (≤ max)', () => {
|
||||
for (const id of BOTH('chess_char_3_19_a')) {
|
||||
const b = SB(id, 'skchr_vigil_1');
|
||||
const h = makeBattle({ defs: { chess: noGarrison(id) }, timeLimit: 60, flags: { dpPerSec: 0 }, units: [U(id, 'skchr_vigil_1', 10, 3)] });
|
||||
const u = h.unit(id), p = h.b.getPlayer('p1');
|
||||
assert.equal(u.skill.rule, 'SP_FULL');
|
||||
assert.equal(u.skill.rule, 'NEVER', 'the kit casts it (the pack check)');
|
||||
h.step();
|
||||
const w = u.trait.reinforcement;
|
||||
assert.equal(w.mem.wolves, 2);
|
||||
@@ -784,6 +786,32 @@ test('3_19 伺夜 S1 领袖的呼唤 (ALWAYS): +DP and one more “狼影” (
|
||||
done(g);
|
||||
});
|
||||
|
||||
test('3_19 伺夜 S1 领袖的呼唤: PRTS 备注 「仅场上存在狼群时可触发技能」 — no pack, no cast (the SP waits full, no DP); cast once the pack stands again', () => {
|
||||
for (const id of BOTH('chess_char_3_19_a')) {
|
||||
const b = SB(id, 'skchr_vigil_1');
|
||||
const h = makeBattle({ defs: { chess: noGarrison(id) }, timeLimit: 60, flags: { dpPerSec: 0 }, units: [U(id, 'skchr_vigil_1', 10, 3)] });
|
||||
const u = h.unit(id), p = h.b.getPlayer('p1');
|
||||
h.run(1);
|
||||
const w = u.trait.reinforcement;
|
||||
assert.ok(w && w.alive, 'the pack stands');
|
||||
for (let i = 0; i < 10 && w.alive; i++) h.b.dealDamage(null, w, { amount: 1e9, type: 'true' }); // a wolf is lost per KO
|
||||
assert.ok(!u.trait.reinforcement?.alive, 'no pack on the field');
|
||||
const dp0 = p.dp;
|
||||
fill(u);
|
||||
h.run(2);
|
||||
assert.equal(u.skill.activations, 0, 'no pack, no cast');
|
||||
assert.ok(u.skill.ready, 'the SP waits full');
|
||||
approx(p.dp, dp0, 1e-9, 'no DP without the pack');
|
||||
// the knocked-out pack comes back after its respawn time: cast at once — +DP and one more 狼影
|
||||
assert.ok(h.runUntil(() => u.skill.activations === 1, 15), 'cast once the pack stands again');
|
||||
const w2 = u.trait.reinforcement;
|
||||
assert.ok(w2 && w2.alive, 'the pack is back');
|
||||
approx(p.dp, dp0 + b.cost, 1e-9, '+cost DP');
|
||||
assert.equal(w2.mem.wolves, 3, 'one more 狼影 on the returned pack');
|
||||
done(h);
|
||||
}
|
||||
});
|
||||
|
||||
test('3_19 伺夜 S2 领袖的馈赠: +DP, the pack recovers HP, its next attack ×atk_scale, a kill by it pays +DP', () => {
|
||||
for (const id of BOTH('chess_char_3_19_a')) {
|
||||
const b = SB(id, 'skchr_vigil_2');
|
||||
|
||||
@@ -1165,6 +1165,26 @@ test('6_20 纯烬艾雅法拉 S1 无声润物: toggle heal; ATK +, 2 heal target
|
||||
}
|
||||
});
|
||||
|
||||
test('6_20 纯烬艾雅法拉 S1 无声润物 (自动触发, effects on her allies only): on as soon as its SP is full — nobody injured, no enemy (the owner\'s decision of 2026-10-05)', () => {
|
||||
for (const id of both('chess_char_6_20')) {
|
||||
const sid = 'skchr_agoat2_1', bb = bbOf(id, sid);
|
||||
const h = run({
|
||||
defs: { chess: { a1: plain('a1', { stats: { maxHp: 1e5 } }) } },
|
||||
units: [U(id, sid, 10, 3, { carryState: READY }), { chessId: 'a1', row: 10, col: 5 }],
|
||||
});
|
||||
const u = h.unit(id), a1 = h.unit('a1');
|
||||
usesSkill(u, sid);
|
||||
assert.equal(u.skill.rule, 'SP_FULL');
|
||||
assert.ok(h.runUntil(() => u.skill.active, 2), 'on with every ally at full HP and no enemy (the data DEFAULT heal rule waited for an injured ally)');
|
||||
assert.equal(a1.hp, a1.s.maxHp);
|
||||
h.b.addBuff(u, { key: 'test:disarm', flags: { disarm: true } }); // (no heals: only the skill's 元素损伤 recovery)
|
||||
a1.elem.burn = 800;
|
||||
h.run(1.05);
|
||||
approx(800 - a1.elem.burn, u.s.atk * bb['agoat2_s_1[aura].ep_heal_ratio'], 'its 元素损伤 recovery runs at full HP', 1e-3);
|
||||
done(h);
|
||||
}
|
||||
});
|
||||
|
||||
test('6_20 纯烬艾雅法拉 S2 云霭荫佑: one heal on every ally of her range, then a barrier absorbing atk_scale × ATK of 元素损伤 for `duration` s', () => {
|
||||
for (const id of both('chess_char_6_20')) {
|
||||
const sid = 'skchr_agoat2_2', bb = bbOf(id, sid);
|
||||
|
||||
@@ -132,12 +132,12 @@ test('1_04 深巡: fin darts pierce attack@max_target enemies on the line + 1 s
|
||||
});
|
||||
const u = h.unit(id);
|
||||
h.step();
|
||||
// 技能策略 (issue #4; the deliberate deviation of DESIGN §21.29): an enemy inside her initial 2-2 range is enough — the
|
||||
// basic strategy casts it, no hit required
|
||||
assert.equal(u.skill.rule, 'DEFAULT', '行动能力剥夺 is an offensive ranged skill, not a 重装 TAKE_DAMAGE one');
|
||||
// 技能策略 (issue #4; the deliberate deviation of DESIGN §21.29, and since 0.2.0 the owner's ACTIVE_RANGE on top): an
|
||||
// enemy inside the 3-2 she attacks with is enough — no hit required
|
||||
assert.equal(u.skill.rule, 'ACTIVE_RANGE', '行动能力剥夺 is an offensive ranged skill, not a 重装 TAKE_DAMAGE one');
|
||||
h.run(3.5);
|
||||
assert.ok(u.skill.active);
|
||||
assert.equal(h.hooksOf('skillStart').find((c) => c.unit === u).reason, 'DEFAULT', 'cast by the basic strategy');
|
||||
assert.equal(h.hooksOf('skillStart').find((c) => c.unit === u).reason, 'ACTIVE_RANGE', 'cast on its running range');
|
||||
approx(u.s.atk, u.base.atk * (1 + bb.atk));
|
||||
const firstAtk = h.hooksOf('attack').find((c) => c.attacker === u && c.isSkill);
|
||||
assert.equal(firstAtk.targets.length, bb['attack@max_target'], 'hits every enemy of the line');
|
||||
@@ -150,16 +150,20 @@ test('1_04 深巡: fin darts pierce attack@max_target enemies on the line + 1 s
|
||||
done(h);
|
||||
});
|
||||
|
||||
test('1_04 深巡 / 1_20 雷蛇 S2 技能策略: both 哨戒铁卫 S2s cast with an enemy in range, no hit needed (issue #4)', () => {
|
||||
test('1_04 深巡 / 1_20 雷蛇 S2 技能策略: both 哨戒铁卫 S2s cast with an enemy in range, no hit needed (issue #4); 深巡 on her 3-2', () => {
|
||||
// both S2s are offensive (深巡: range up + ATK/ASPD + piercing darts; 雷蛇: ATK +125 % + arts on 3 + stun); the official
|
||||
// 下半 重装 row (TAKE_DAMAGE for every MANUAL 重装 skill) made both wait for a hit, and the owner's deliberate deviation
|
||||
// from it (DESIGN §21.29, after community feedback) gives them the basic strategy — the data and the kit say DEFAULT.
|
||||
// from it (DESIGN §21.29, after community feedback) gives them the basic strategy — 雷蛇's data and kit say DEFAULT;
|
||||
// 深巡's 3-2 strictly contains her 2-2, so since 0.2.0 the owner's ACTIVE_RANGE rule casts it on the 3-2 (2026-10-05).
|
||||
for (const id of ['chess_char_1_04_a', 'chess_char_1_04_b', 'chess_char_1_20_a', 'chess_char_1_20_b']) {
|
||||
const h = run({ units: [{ chessId: id, row: 9, col: 4, carryState: READY }], enemies: [{ key: 'e', pos: [9, 6] }] });
|
||||
const udflow = id.startsWith('chess_char_1_04');
|
||||
// (9,7) = [0,3]: on 深巡's 3-2, not on her 2-2
|
||||
const h = run({ units: [{ chessId: id, row: 9, col: 4, carryState: READY }], enemies: [{ key: 'e', pos: [9, udflow ? 7 : 6] }] });
|
||||
const u = h.unit(id);
|
||||
assert.equal(u.skill.rule, 'DEFAULT', `${id}: an offensive skill, not the 重装 TAKE_DAMAGE row`);
|
||||
const rule = udflow ? 'ACTIVE_RANGE' : 'DEFAULT';
|
||||
assert.equal(u.skill.rule, rule, `${id}: an offensive skill, not the 重装 TAKE_DAMAGE row`);
|
||||
assert.ok(h.runUntil(() => u.skill.activations >= 1, 5), `${id}: casts while an enemy is in range and untouched`);
|
||||
assert.equal(h.hooksOf('skillStart').find((c) => c.unit === u).reason, 'DEFAULT', `${id}: cast by the basic strategy`);
|
||||
assert.equal(h.hooksOf('skillStart').find((c) => c.unit === u).reason, rule, `${id}: cast by ${rule}`);
|
||||
done(h);
|
||||
}
|
||||
});
|
||||
|
||||
+20
-10
@@ -460,9 +460,11 @@ test('chess: skills[] = every skill unlocked at the status, at the chess skill l
|
||||
// Triggers per skill (PRTS 卫戍协议/帮助 技能策略; tools/build-data.mjs resolveTrigger): the class rows cover every MANUAL
|
||||
// skill of the class and no AUTO one; a MANUAL skill with a 技能范围 of its own (not an attack-range change) is SKILL_RANGE.
|
||||
const rules = (id) => chess[id].skills.map((s) => s.trigger.rule);
|
||||
const raws = (id) => chess[id].skills.map((s) => s.trigger.rawRule);
|
||||
assert.deepEqual(rules('chess_char_1_02_a'), ['TAKE_DAMAGE', 'TAKE_DAMAGE']); // 角峰 (重装, both MANUAL)
|
||||
assert.deepEqual(rules('chess_char_1_10_b'), ['DEFAULT', 'TAKE_DAMAGE']); // 古米 (S1 自动触发)
|
||||
assert.deepEqual(rules('chess_char_3_08_a'), ['SEARCH', 'SEARCH']); // 薄绿 (阵法术师: the default S2 too)
|
||||
assert.deepEqual(rules('chess_char_3_08_a'), ['ACTIVE_RANGE', 'SEARCH']); // 薄绿 (阵法术师: the default S2 too; S1's x-2: the owner's rule)
|
||||
assert.deepEqual(raws('chess_char_3_08_a'), ['SEARCH', 'SEARCH']);
|
||||
assert.deepEqual(rules('chess_char_3_19_a'), ['DEFAULT', 'DEFAULT', 'SP_FULL']); // 伺夜 (战术家: S1/S2 are AUTO)
|
||||
assert.deepEqual(rules('chess_char_6_11_b'), ['MLYSS_WTRMAN', 'MLYSS_WTRMAN', 'MLYSS_WTRMAN']); // 缪尔赛思 (charId row −1)
|
||||
assert.deepEqual(rules('chess_char_1_08_a'), ['DEFAULT', 'SKILL_RANGE']); // 德克萨斯 S2 剑雨: 对周围所有敌人
|
||||
@@ -471,9 +473,8 @@ test('chess: skills[] = every skill unlocked at the status, at the chess skill l
|
||||
assert.deepEqual(rules('chess_char_3_18_a'), ['DEFAULT', 'SKILL_RANGE', 'ACTIVE_RANGE']); // 忍冬: S2 对周围…, S3 攻击距离+1
|
||||
// the deliberate deviation from the 重装 row (DESIGN §21.29, the owner's decision; tools/build-data.mjs
|
||||
// TRIGGER_DEVIATIONS, per chess): six skills cast with an enemy in range, rawRule keeps the official TAKE_DAMAGE
|
||||
const raws = (id) => chess[id].skills.map((s) => s.trigger.rawRule);
|
||||
for (const id of ['chess_char_1_04_a', 'chess_char_1_04_b']) { // 深巡: S1 keeps the row, S2 deviates
|
||||
assert.deepEqual(rules(id), ['TAKE_DAMAGE', 'DEFAULT']);
|
||||
assert.deepEqual(rules(id), ['TAKE_DAMAGE', 'ACTIVE_RANGE']); // (S2: and the owner's ACTIVE_RANGE on top)
|
||||
assert.deepEqual(raws(id), ['TAKE_DAMAGE', 'TAKE_DAMAGE']);
|
||||
}
|
||||
for (const id of ['chess_char_1_20_a', 'chess_char_1_20_b']) { // 雷蛇: S1 AUTO, S2 deviates
|
||||
@@ -495,24 +496,33 @@ test('chess: skills[] = every skill unlocked at the status, at the chess skill l
|
||||
assert.deepEqual(raws(id), ['TAKE_DAMAGE', 'TAKE_DAMAGE', 'CUSTOM_RANGE_SEARCH_ENEMY']);
|
||||
assert.deepEqual(chess[id].skills[1].trigger.customRangeGrid, chess[id].skills[1].rangeGrid);
|
||||
}
|
||||
// the owner's rule of 2026-10-05 (a deliberate deviation): a MANUAL skill on the basic strategy whose running attack
|
||||
// range strictly contains the operator's own range is ACTIVE_RANGE on that range (rawRule keeps the official DEFAULT)
|
||||
// the owner's rule of 2026-10-05 (a deliberate deviation): a MANUAL skill on the basic strategy (DEFAULT by no row or by
|
||||
// a deviation: 深巡 S2) or on the SEARCH row whose running attack range strictly contains the operator's own range is
|
||||
// ACTIVE_RANGE on that range (rawRule keeps the official row)
|
||||
const tiles = (g) => new Set((g || []).map(([r, c]) => `${r},${c}`));
|
||||
const wider = (a, b) => { const A = tiles(a), B = tiles(b); return A.size > B.size && [...B].every((k) => A.has(k)); };
|
||||
const active = Object.values(chess).flatMap((c) => (c.skills || []).filter((s) => s.trigger.rule === 'ACTIVE_RANGE').map((s) => [c, s]));
|
||||
for (const [c, s] of active) {
|
||||
assert.equal(s.skillType, 'MANUAL', `${c.chessId} ${s.skillId}`);
|
||||
assert.equal(s.trigger.rawRule, 'DEFAULT', `${c.chessId} ${s.skillId}: only the basic strategy`);
|
||||
const dev = c.baseId === 'chess_char_1_04_a' && s.skillId === 'skchr_udflow_2';
|
||||
assert.equal(s.trigger.rawRule, dev ? 'TAKE_DAMAGE' : s.trigger.rawRule === 'SEARCH' ? 'SEARCH' : 'DEFAULT', `${c.chessId} ${s.skillId}: only the basic strategy / SEARCH`);
|
||||
assert.ok(wider(s.trigger.customRangeGrid, c.rangeGrid), `${c.chessId} ${s.skillId}: its running range strictly contains ${c.rangeId}`);
|
||||
if (s.rangeGrid) assert.deepEqual(s.trigger.customRangeGrid, s.rangeGrid, `${c.chessId} ${s.skillId}: the skill's own grid`);
|
||||
}
|
||||
assert.equal(active.length, 66, '33 skills, normal + elite');
|
||||
assert.equal(new Set(active.map(([c, s]) => `${c.baseId} ${s.skillId}`)).size, 33);
|
||||
assert.equal(active.length, 78, '39 skills, normal + elite');
|
||||
assert.equal(new Set(active.map(([c, s]) => `${c.baseId} ${s.skillId}`)).size, 39);
|
||||
// from the SEARCH row (解放者 / 阵法术师 / 安洁莉娜) and 深巡 S2's deviation: the owner's decisions of 2026-10-05
|
||||
const fromSearch = active.filter(([, s]) => s.trigger.rawRule === 'SEARCH').map(([c, s]) => `${c.baseId} ${s.skillId}`);
|
||||
assert.deepEqual([...new Set(fromSearch)].sort(), ['chess_char_3_08_a skchr_mint_1', 'chess_char_4_05_a skchr_beewax_1', 'chess_char_4_24_a skchr_billro_3', 'chess_char_5_19_a skchr_mlynar_2', 'chess_char_5_20_a skchr_aglina_3']);
|
||||
assert.equal(fromSearch.length, 10);
|
||||
// the SEARCH skills whose range does not grow keep the row (薄绿 / 蜜蜡 S2, 卡涅利安 S1 / S2, 玛恩纳 S1, 安洁莉娜 S2, 圣聆初雪 S1)
|
||||
const search = Object.values(chess).flatMap((c) => (c.skills || []).filter((s) => s.trigger.rule === 'SEARCH').map((s) => `${c.baseId} ${s.skillId}`));
|
||||
assert.deepEqual([...new Set(search)].sort(), ['chess_char_3_08_a skchr_mint_2', 'chess_char_4_05_a skchr_beewax_2', 'chess_char_4_24_a skchr_billro_1', 'chess_char_4_24_a skchr_billro_2', 'chess_char_5_19_a skchr_mlynar_1', 'chess_char_5_20_a skchr_aglina_2', 'chess_char_6_02_a skchr_sbell2_1']);
|
||||
const grown = (id, sid) => chess[id].skills.find((s) => s.skillId === sid).trigger;
|
||||
assert.deepEqual(grown('chess_char_5_07_a', 'skchr_surtr_3').customRangeGrid.length, chess.chess_char_5_07_a.rangeGrid.length + 2, '史尔特尔 S3 攻击距离+2: 1-1 grown by 2');
|
||||
assert.equal(grown('chess_char_5_03_a', 'skchr_blaze2_3').rule, 'DEFAULT', '烛煌 S3: 4-11 does not contain her 3-1');
|
||||
assert.equal(grown('chess_char_1_04_a', 'skchr_udflow_2').rule, 'DEFAULT', '深巡 S2: the §21.29 deviation stays');
|
||||
assert.equal(grown('chess_char_3_08_a', 'skchr_mint_1').rule, 'SEARCH', '薄绿 S1: its official 阵法术师 row');
|
||||
assert.deepEqual(grown('chess_char_1_04_a', 'skchr_udflow_2'), { rule: 'ACTIVE_RANGE', rawRule: 'TAKE_DAMAGE', customRangeGrid: [[0, 0], [0, 1], [0, 2], [0, 3]] }, '深巡 S2: its 3-2 over her 2-2, on top of the §21.29 deviation');
|
||||
assert.equal(grown('chess_char_3_08_a', 'skchr_mint_1').rawRule, 'SEARCH', '薄绿 S1: its official 阵法术师 row stays the rawRule');
|
||||
assert.equal(grown('chess_char_5_15_a', 'skchr_thorn2_3').rule, 'DEFAULT', '引星棘刺 S3: 被动效果:攻击范围扩大 is her own range');
|
||||
const deviated = Object.values(chess).flatMap((c) => (c.skills || []).filter((s) => s.trigger.rawRule === 'TAKE_DAMAGE' && s.trigger.rule !== 'TAKE_DAMAGE').map((s) => `${c.baseId} ${s.skillId}`));
|
||||
assert.equal(deviated.length, 14, 'exactly the six skills of §21.29 and 余 S2, normal + elite');
|
||||
|
||||
@@ -846,9 +846,10 @@ test('the deliberate trigger deviation (DESIGN §21.29): six 重装 skills DEFAU
|
||||
assert.match(r03, /上半 \(act1autochess, 2025-11\) shipped no TANK row/);
|
||||
assert.match(r03, /下半 \(act2autochess, 2026-03-14\) added `TANK \| \| \| 0 \| TAKE_DAMAGE` for every skill index/);
|
||||
assert.match(r03, /\*\*Deliberate deviation\*\* \(the owner, 2026-10-03/);
|
||||
// PR #12's kit lines stay; their comments give this reason, not the community summary
|
||||
// PR #12's kit line stays (雷蛇 S2; 深巡 S2 dropped its own in 0.2.0 and reads its data's ACTIVE_RANGE, the owner's
|
||||
// decision of 2026-10-05); the comments give this reason, not the community summary
|
||||
const t1 = tierSources(1).map(doc).join('\n');
|
||||
assert.equal((t1.match(/trigger: 'DEFAULT',/g) || []).length, 2, "PR #12's two kit lines");
|
||||
assert.equal((t1.match(/trigger: 'DEFAULT',/g) || []).length, 1, "PR #12's kit line left (雷蛇 S2)");
|
||||
assert.ok(!/offensive skills activate when an enemy is in their skill range/.test(t1));
|
||||
assert.ok(!/documented for skillIndex 0/.test(t1));
|
||||
assert.match(DATA_MD, /a deliberate deviation, `tools\/build-data\.mjs TRIGGER_DEVIATIONS`, DESIGN §21\.29/);
|
||||
|
||||
+27
-27
@@ -170,8 +170,8 @@
|
||||
"round": 5,
|
||||
"seed": 2738879831,
|
||||
"waveId": "act1autochess_05",
|
||||
"time": 95.67,
|
||||
"ticks": 2870,
|
||||
"time": 96.43,
|
||||
"ticks": 2893,
|
||||
"reason": "cleared",
|
||||
"killed": 22,
|
||||
"total": 22,
|
||||
@@ -195,21 +195,21 @@
|
||||
}
|
||||
},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_1_04_a",1,null,388.94,1,2,3,7627,3376,0,54,2],
|
||||
["p1",1,"op","chess_char_1_04_a",1,null,176.79,1,2,3,6620,3588,0,57,2],
|
||||
["p1",2,"op","chess_char_3_16_a",1,null,2794.48,1,1,0,0,0,0,0,0],
|
||||
["p1",3,"op","chess_char_2_07_a",1,null,3447.65,1,3,0,0,0,0,0,0],
|
||||
["p1",4,"op","chess_char_3_18_a",2,null,1904.57,1,33,0,0,1851,0,0,0],
|
||||
["p1",5,"op","chess_char_3_05_a",2,null,4545.21,1,9,6,19145,476,0,22,1],
|
||||
["p1",6,"op","chess_char_3_14_a",1,null,1608.79,1,4,1,9276,0,0,42,2],
|
||||
["p1",6,"op","chess_char_3_14_a",1,null,1608.79,1,4,2,9954,0,0,42,2],
|
||||
["p1",7,"op","chess_char_3_17_a",1,null,2647.47,1,8,4,30549,0,0,48,3],
|
||||
["p1",8,"op","chess_char_3_19_a",2,null,1850.55,1,5,6,17048,0,0,76,2],
|
||||
["p1",8,"op","chess_char_3_19_a",2,null,1850.55,1,5,5,17378,0,0,77,2],
|
||||
["p1",9,"token","token_10028_vigil_wolf",null,null,807.94,1,6,2,7362,944,0,29,null]
|
||||
],
|
||||
"enemies": {"enemy_1166_dusbr":[15,15,0,761,51840],"enemy_1169_duphlx":[5,5,0,659,23040],"enemy_1170_dushld":[2,2,0,3376,16128]},
|
||||
"hooks": [1,32,2870,344,344,593,594,0,23,23,10,7,0,10052,41,13,22,0,1,24,7,0,0],
|
||||
"events": {"atk":395,"deploy":10,"die":23,"dmg":594,"fx":11,"layer":7,"skill":17,"spawn":31,"status":46},
|
||||
"enemies": {"enemy_1166_dusbr":[15,15,0,774,51840],"enemy_1169_duphlx":[5,5,0,659,23040],"enemy_1170_dushld":[2,2,0,3575,16128]},
|
||||
"hooks": [1,32,2893,350,350,602,603,0,23,23,10,7,0,10075,41,15,22,0,1,24,7,0,0],
|
||||
"events": {"atk":404,"deploy":10,"die":23,"dmg":603,"fx":11,"layer":7,"skill":17,"spawn":31,"status":46},
|
||||
"fx": {"devour":1,"dp":1,"garrison":3,"volley":3,"wolfShadow":2,"wolfShadowLost":1},
|
||||
"snaps": "d0724fb0 dc731840 afc7b763 32af0154 58ec6e8c ad015606 93516fa3 8d4b0184 6309839b fcfc5b4e"
|
||||
"snaps": "d0724fb0 dc731840 afc7b763 306d88e1 16e7c1f4 157932c4 1b271b3a 007b9084 be400fd1 2fa15d8c"
|
||||
},
|
||||
"bond-egirShip-high": {
|
||||
"about": "阿戈尔 high: tier 2 layers 999; chess_char_1_04_b chess_char_2_07_b chess_char_3_05_b chess_char_4_16_b chess_char_4_09_b chess_char_3_09_b chess_char_4_13_b chess_char_4_14_b",
|
||||
@@ -1486,31 +1486,31 @@
|
||||
"round": 10,
|
||||
"seed": 2806272209,
|
||||
"waveId": "act1autochess_h03",
|
||||
"time": 138.2,
|
||||
"ticks": 4146,
|
||||
"time": 142.4,
|
||||
"ticks": 4272,
|
||||
"reason": "cleared",
|
||||
"killed": 8,
|
||||
"killed": 10,
|
||||
"total": 24,
|
||||
"unspawned": 0,
|
||||
"bossHpLeft": null,
|
||||
"rngDraws": 6,
|
||||
"rngDraws": 4,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {"p1":{"killed":8,"total":24,"perfect":false,"leaks":16,"leaksUncounted":0,"coins":0,"dmg":208861,"bossDmg":0,"heal":3101,"deaths":6,"layerGains":{}}},
|
||||
"players": {"p1":{"killed":10,"total":24,"perfect":false,"leaks":14,"leaksUncounted":0,"coins":0,"dmg":230499,"bossDmg":0,"heal":14273,"deaths":5,"layerGains":{}}},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_1_02_b",1,"uniequip_002_yak",0,0,2,1,4706,5937,0,86,2],
|
||||
["p1",2,"op","chess_char_1_04_b",1,"uniequip_002_udflow",1446.16,1,1,3,34635,1458,0,95,3],
|
||||
["p1",3,"op","chess_char_4_19_a",2,null,0,0,34,1,4497,3120,0,41,3],
|
||||
["p1",4,"op","chess_char_1_01_b",1,"uniequip_002_inside",721.44,1,4,2,51103,1772,0,133,5],
|
||||
["p1",5,"op","chess_char_1_03_b",1,"uniequip_002_leizi",1391,1,7,0,64850,709,0,33,1],
|
||||
["p1",6,"op","chess_char_1_06_b",1,"uniequip_002_vendla",0,0,5,1,12858,1651,497,49,3],
|
||||
["p1",7,"op","chess_char_4_20_a",2,null,1217,1,8,0,36212,0,0,34,2],
|
||||
["p1",8,"op","chess_char_4_21_a",1,null,1271,1,35,0,0,3614,2604,10,0]
|
||||
["p1",1,"op","chess_char_1_02_b",1,"uniequip_002_yak",0,0,2,2,7736,5867,0,86,2],
|
||||
["p1",2,"op","chess_char_1_04_b",1,"uniequip_002_udflow",2638.94,1,1,1,32919,265,0,98,3],
|
||||
["p1",3,"op","chess_char_4_19_a",2,null,1560,1,35,0,6306,1560,0,54,3],
|
||||
["p1",4,"op","chess_char_1_01_b",1,"uniequip_002_inside",1421,1,4,2,55297,4429,0,129,5],
|
||||
["p1",5,"op","chess_char_1_03_b",1,"uniequip_002_leizi",1391,1,36,4,75959,2224,0,31,1],
|
||||
["p1",6,"op","chess_char_1_06_b",1,"uniequip_002_vendla",817.63,1,5,1,21214,1417,4907,77,4],
|
||||
["p1",7,"op","chess_char_4_20_a",2,null,1217,1,34,0,31066,1590,0,25,2],
|
||||
["p1",8,"op","chess_char_4_21_a",1,null,1271,1,33,0,0,9077,9366,36,1]
|
||||
],
|
||||
"enemies": {"enemy_1166_dusbr_2":[14,8,6,3587,114489],"enemy_1169_duphlx_2":[7,0,7,3841,27585],"enemy_1172_dugago":[3,0,3,10832,66787]},
|
||||
"hooks": [1,35,4146,667,667,877,877,37,14,30,19,19,82,14466,301,11,24,16,1,16,0,0,0],
|
||||
"events": {"atk":762,"deploy":11,"die":14,"dmg":877,"fx":13,"heal":14,"leak":16,"skill":38,"spawn":32,"status":246},
|
||||
"fx": {"featherArrow":2,"flame":3,"garrisonGrant":1,"revive":2,"stone":2,"taunt":3},
|
||||
"snaps": "e8a58cae e45c0ada 1d0104f3 5a4162ce f459b0c6 6078554c 0da631c2 89a53382 35812639 be18c73e 09fd2d12 0c74c047 b302eee8 1b6c5142"
|
||||
"enemies": {"enemy_1166_dusbr_2":[14,9,5,5122,116437],"enemy_1169_duphlx_2":[7,1,6,2102,34836],"enemy_1172_dugago":[3,0,3,19205,79225]},
|
||||
"hooks": [1,36,4272,698,698,863,863,99,15,29,21,21,82,15296,266,12,24,14,1,17,0,0,0],
|
||||
"events": {"atk":780,"deploy":12,"die":15,"dmg":863,"fx":19,"heal":70,"leak":14,"skill":42,"spawn":32,"status":237},
|
||||
"fx": {"counter":4,"featherArrow":2,"flame":3,"garrisonGrant":1,"healField":1,"revive":2,"stone":2,"taunt":4},
|
||||
"snaps": "e8a58cae cc93867c 83fa20df eba0ed1f 84da0944 45cc2dac 1c29b227 c757f725 c4a012a1 1581a672 c133e524 2d0211d9 3aa23054 943283cd dfda39c6"
|
||||
},
|
||||
"bond-swiftShip-low": {
|
||||
"about": "迅捷 low: tier 1 layers 1; chess_char_4_23_a chess_char_4_22_a chess_char_1_19_a chess_char_1_01_a chess_char_4_24_a chess_char_4_25_a chess_char_4_26_a chess_char_3_01_a",
|
||||
|
||||
+59
-59
@@ -140,42 +140,42 @@
|
||||
"killed": 7,
|
||||
"total": 8,
|
||||
"unspawned": 0,
|
||||
"bossHpLeft": 2352238,
|
||||
"rngDraws": 393,
|
||||
"bossHpLeft": 2379255,
|
||||
"rngDraws": 268,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {
|
||||
"p1": {"killed":7,"total":8,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":614764,"bossDmg":322645,"heal":16813,"deaths":2,"layerGains":{}},
|
||||
"p2": {"killed":0,"total":0,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":779819,"bossDmg":320424,"heal":4006,"deaths":1,"layerGains":{}}
|
||||
"p1": {"killed":7,"total":8,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":631056,"bossDmg":337792,"heal":24928,"deaths":2,"layerGains":{}},
|
||||
"p2": {"killed":0,"total":0,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":798175,"bossDmg":278950,"heal":4050,"deaths":2,"layerGains":{}}
|
||||
},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",3907,1,9,1,223973,1132,7,78,3],
|
||||
["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",5482.35,1,11,0,13226,12539,405,57,1],
|
||||
["p1",3,"op","chess_char_5_14_b",1,"none",1994,1,7,0,29890,1028,189,53,17],
|
||||
["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",2738,1,13,0,11616,0,0,80,1],
|
||||
["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1170,1,1,0,103809,0,1188,46,10],
|
||||
["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",2418.5,1,3,0,59999,0,0,33,3],
|
||||
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",3907,1,9,2,212647,1042,0,73,3],
|
||||
["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",3537,1,11,0,23242,22277,304,68,1],
|
||||
["p1",3,"op","chess_char_5_14_b",1,"none",1994,1,7,0,31391,1118,208,23,19],
|
||||
["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",2738,1,13,0,2373,0,0,25,1],
|
||||
["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1170,1,1,0,117324,0,6555,73,10],
|
||||
["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",2418.5,1,3,0,85327,0,0,53,5],
|
||||
["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",2769.3,1,43,1,12823,3019,249,8,1],
|
||||
["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",1611,1,40,0,115995,1611,0,39,13],
|
||||
["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",1610,1,5,0,0,0,14731,20,3],
|
||||
["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",1695,1,15,1,43434,1739,44,35,2],
|
||||
["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",2644,1,46,0,0,3776,211,0,1],
|
||||
["p2",12,"op","chess_char_4_12_b",2,"uniequip_002_glady",2232,1,12,0,31192,0,0,40,3],
|
||||
["p2",13,"op","chess_char_4_04_b",1,"uniequip_002_ines",3545.85,1,48,1,264375,0,0,267,8],
|
||||
["p2",14,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",2312.97,1,14,0,2338,1249,1179,13,6],
|
||||
["p2",15,"op","chess_char_4_16_b",2,"uniequip_002_texas2",2671.35,1,47,1,80716,4127,957,159,0],
|
||||
["p2",16,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",1821.24,1,16,0,80697,1270,313,68,5],
|
||||
["p2",17,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",1561,1,2,0,1460,0,0,14,1],
|
||||
["p2",18,"op","chess_char_4_10_b",1,"uniequip_002_aroma",1664,1,4,1,67986,0,0,52,3],
|
||||
["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",1989,1,18,0,115269,1346,1346,176,47],
|
||||
["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",1626,1,20,1,135786,0,0,66,15],
|
||||
["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",1611,1,40,1,104764,1611,0,32,14],
|
||||
["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",1610,1,5,0,0,0,17612,24,3],
|
||||
["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",1695,1,15,1,41166,1393,0,31,1],
|
||||
["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",2644,1,47,0,0,3917,271,0,1],
|
||||
["p2",12,"op","chess_char_4_12_b",2,"uniequip_002_glady",2232,1,12,0,45169,0,0,48,4],
|
||||
["p2",13,"op","chess_char_4_04_b",1,"uniequip_002_ines",3545.85,1,48,1,277519,0,0,252,8],
|
||||
["p2",14,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",0,0,14,0,3050,2644,261,19,8],
|
||||
["p2",15,"op","chess_char_4_16_b",2,"uniequip_002_texas2",1968.91,1,46,0,75188,4650,1035,112,0],
|
||||
["p2",16,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",732.88,1,16,0,71495,3011,967,61,4],
|
||||
["p2",17,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",1561,1,2,0,2025,0,0,19,1],
|
||||
["p2",18,"op","chess_char_4_10_b",1,"uniequip_002_aroma",1664,1,4,0,65424,0,0,51,3],
|
||||
["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",337.13,1,18,0,111023,3169,1517,158,46],
|
||||
["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",1626,1,20,1,147282,0,0,72,16],
|
||||
["p2",21,"token","token_10041_cathy_catsld",null,null,100,1,21,0,0,0,0,0,null],
|
||||
["p2",22,"token","token_10041_cathy_catsld",null,null,100,1,22,0,0,0,0,0,null]
|
||||
],
|
||||
"enemies": {"enemy_1005_yokai_2":[6,6,0,4018,62190],"enemy_1430_lrrook":[2,1,1,0,689479],"enemy_9017_achunt":[2,0,0,28816,647762]},
|
||||
"hooks": [1,46,6000,1337,1341,2564,2590,3357,11,22,143,144,21,40126,1555,0,10,1,1,12,0,8,3],
|
||||
"events": {"atk":1390,"deploy":36,"die":21,"dmg":2585,"fx":517,"heal":50,"leak":1,"skill":281,"spawn":32,"status":512},
|
||||
"fx": {"aoe":37,"appear":2,"blink":11,"burst":8,"catShield":1,"charge":6,"counter":21,"crit":20,"dilemma":5,"disappear":2,"dodge":3,"explosion":15,"frostNova":47,"iceSpike":8,"overclock":1,"pull":3,"ripple":14,"sentry":5,"sermon":1,"shadowWeave":9,"shield":6,"slippery":3,"soul":3,"sp":8,"stealth":8,"swordRain":69,"swordStorm":8,"tornado":3,"tornadoPulse":15,"weightless":3,"zone":172},
|
||||
"snaps": "b55c9e85 fe86ba61 48caeaf1 91da132f f7ba5dfd 81890176 95334359 78212b6d 406f0742 73dc65d8 4582b0ed 758f70ea 8a649bb9 91e46959 5126c4ed 5b7a02fa a1479ed8 549ce91d f3f60666 d22dc72f"
|
||||
"enemies": {"enemy_1005_yokai_2":[6,6,0,3587,62190],"enemy_1430_lrrook":[2,1,1,0,750444],"enemy_9017_achunt":[2,0,0,44263,620745]},
|
||||
"hooks": [1,46,6000,1265,1269,2515,2548,3419,11,23,149,151,30,42577,1536,0,10,1,1,13,0,11,0],
|
||||
"events": {"atk":1317,"deploy":36,"die":22,"dmg":2544,"fx":533,"heal":99,"leak":1,"skill":294,"spawn":32,"status":569},
|
||||
"fx": {"aoe":39,"appear":2,"blink":11,"burst":11,"catShield":1,"charge":8,"counter":30,"crit":12,"dilemma":4,"disappear":2,"explosion":16,"frostNova":46,"iceSpike":8,"overclock":1,"pull":4,"ripple":10,"sentry":5,"sermon":1,"shadowWeave":10,"shield":7,"slippery":3,"soul":3,"sp":9,"stealth":8,"swordRain":69,"swordStorm":7,"tornado":4,"tornadoPulse":20,"weightless":5,"zone":177},
|
||||
"snaps": "b55c9e85 fe86ba61 48caeaf1 91da132f 722d326f 4ebe7b96 1105a7d0 233e44ce e5c88030 b9851788 b8b73d8a 3b6f1037 12238bcc 1bfe8f8d 8d1d508a 02540010 7e869520 bd76e3b9 384765a3 f4d942d7"
|
||||
},
|
||||
"boss-boss_2-solo": {
|
||||
"about": "假想敌:铳 solo pool 750000: chess_char_4_17_b chess_char_4_18_b chess_char_4_23_b chess_char_4_19_b chess_char_4_22_b chess_char_4_20_b chess_char_4_21_b chess_char_4_24_b chess_char_4_25_b chess_char_4_26_b",
|
||||
@@ -623,49 +623,49 @@
|
||||
"killed": 4,
|
||||
"total": 6,
|
||||
"unspawned": 0,
|
||||
"bossHpLeft": 2649470,
|
||||
"rngDraws": 130,
|
||||
"bossHpLeft": 2898360,
|
||||
"rngDraws": 95,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {
|
||||
"p1": {"killed":4,"total":6,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":946686,"bossDmg":499800,"heal":2113,"deaths":5,"layerGains":{}},
|
||||
"p2": {"killed":0,"total":0,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1044656,"bossDmg":830730,"heal":2928,"deaths":12,"layerGains":{}}
|
||||
"p1": {"killed":4,"total":6,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":823348,"bossDmg":423786,"heal":5342,"deaths":8,"layerGains":{}},
|
||||
"p2": {"killed":0,"total":0,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":804143,"bossDmg":657855,"heal":737,"deaths":14,"layerGains":{}}
|
||||
},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",3907,1,3,0,123311,0,0,33,2],
|
||||
["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",3537,1,1,0,0,0,0,0,0],
|
||||
["p1",3,"op","chess_char_5_14_b",1,"none",1994,1,5,0,50633,0,0,0,15],
|
||||
["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",4654.6,1,11,1,22568,987,987,15,1],
|
||||
["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1170,1,7,2,348908,0,1126,61,12],
|
||||
["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",1382,1,13,1,169005,0,0,37,3],
|
||||
["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",0,0,15,0,34896,1629,0,49,2],
|
||||
["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",0,0,41,0,146295,3222,0,47,15],
|
||||
["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",0,0,42,0,2417,3220,0,0,0],
|
||||
["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",1695,1,9,0,48653,0,0,37,2],
|
||||
["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",2644,1,39,0,0,12099,91,0,1],
|
||||
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",3907,1,3,2,151189,0,0,40,2],
|
||||
["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",5482.35,1,1,0,6146,106,106,9,1],
|
||||
["p1",3,"op","chess_char_5_14_b",1,"none",1994,1,45,0,25173,2703,269,7,6],
|
||||
["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",4654.6,1,43,0,20208,6348,1693,10,1],
|
||||
["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1170,1,7,2,249545,0,2374,57,9],
|
||||
["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",1382,1,13,0,189428,0,0,75,6],
|
||||
["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",0,0,40,0,7000,3258,0,18,1],
|
||||
["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",0,0,41,0,129521,3222,0,43,12],
|
||||
["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",0,0,42,0,0,3220,899,1,1],
|
||||
["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",1695,1,9,0,45137,0,0,34,2],
|
||||
["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",2644,1,39,0,0,12227,333,0,1],
|
||||
["p2",12,"op","chess_char_4_12_b",2,"uniequip_002_glady",2232,1,2,0,0,0,0,0,0],
|
||||
["p2",13,"op","chess_char_4_04_b",1,"uniequip_002_ines",3438.4,1,51,0,141582,6216,1381,198,7],
|
||||
["p2",13,"op","chess_char_4_04_b",1,"uniequip_002_ines",3438.4,1,58,0,129555,8518,244,158,7],
|
||||
["p2",14,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",2383,1,10,0,0,0,0,0,0],
|
||||
["p2",15,"op","chess_char_4_16_b",2,"uniequip_002_texas2",0,0,50,0,62760,10474,201,131,0],
|
||||
["p2",16,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",0,0,18,0,223350,4032,1255,105,6],
|
||||
["p2",15,"op","chess_char_4_16_b",2,"uniequip_002_texas2",0,0,56,0,53592,10522,160,153,0],
|
||||
["p2",16,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",0,0,52,0,166628,5555,0,68,4],
|
||||
["p2",17,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",1561,1,8,0,0,0,0,0,0],
|
||||
["p2",18,"op","chess_char_4_10_b",1,"uniequip_002_aroma",1664,1,12,0,358813,0,0,100,4],
|
||||
["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",0,0,16,0,192733,1989,0,169,45],
|
||||
["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",0,0,48,0,65418,4878,0,23,4],
|
||||
["p2",18,"op","chess_char_4_10_b",1,"uniequip_002_aroma",1664,1,12,0,263402,0,0,92,4],
|
||||
["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",0,0,53,0,122328,3978,0,108,28],
|
||||
["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",0,0,54,0,68638,4878,0,24,4],
|
||||
["p2",21,"token","token_10041_cathy_catsld",null,null,100,1,22,0,0,0,0,0,null],
|
||||
["p2",22,"token","token_10041_cathy_catsld",null,null,100,1,21,0,0,0,0,0,null]
|
||||
],
|
||||
"enemies": {
|
||||
"enemy_10028_vtswd": [2,2,0,0,0],
|
||||
"enemy_10029_vtshld": [4,4,0,0,0],
|
||||
"enemy_10030_vtwand": [3,3,0,0,0],
|
||||
"enemy_10085_hllevi_2": [2,0,1,0,460200],
|
||||
"enemy_1010_demon": [4,4,0,13086,200612],
|
||||
"enemy_9032_aclionk": [1,0,0,35661,1330530]
|
||||
"enemy_10028_vtswd": [3,3,0,0,0],
|
||||
"enemy_10029_vtshld": [5,5,0,0,0],
|
||||
"enemy_10030_vtwand": [2,2,0,0,0],
|
||||
"enemy_10085_hllevi_2": [2,0,2,0,345238],
|
||||
"enemy_1010_demon": [4,4,0,21384,200612],
|
||||
"enemy_9032_aclionk": [1,0,0,43151,1081640]
|
||||
},
|
||||
"hooks": [1,50,6000,990,1012,1726,1818,2327,30,33,119,122,0,33807,1848,4,16,1,1,23,0,10,1],
|
||||
"events": {"atk":1123,"deploy":34,"die":32,"dmg":1780,"fx":533,"heal":8,"leak":1,"skill":235,"spawn":38,"status":939},
|
||||
"fx": {"aoe":36,"appear":4,"blink":2,"burst":10,"dilemma":6,"disappear":4,"displace":12,"dodge":1,"equip":12,"explosion":4,"frostNova":45,"garrisonGrant":1,"iceSpike":41,"overclock":1,"revive":2,"ripple":18,"sentry":2,"shadowWeave":2,"shield":1,"slippery":4,"soul":2,"sp":16,"stealth":7,"sword":2,"swordRain":41,"swordStorm":6,"telegraph":16,"vest":4,"weightless":3,"zone":228},
|
||||
"snaps": "4d7c2a7f 5bcea10b 84c2bed7 213fec8b e85d6851 dd80061e 891ce40c 69d89ef8 55362d2a b75065e4 5377e6ac 874beeb6 31187eea 36afddb7 304ad287 107732a5 3cd87e2e 79f172d1 3cce9284 aa1bb1af"
|
||||
"hooks": [1,56,6000,919,925,1452,1533,953,36,40,89,90,1,28694,1172,8,17,2,1,30,0,7,0],
|
||||
"events": {"atk":1018,"deploy":39,"die":38,"dmg":1504,"fx":406,"heal":18,"leak":2,"skill":174,"spawn":39,"status":745},
|
||||
"fx": {"aoe":21,"appear":4,"blink":2,"burst":7,"counter":1,"crit":3,"dilemma":4,"disappear":4,"displace":15,"equip":12,"explosion":4,"frostNova":28,"garrisonGrant":1,"iceSpike":18,"overclock":1,"revive":2,"ripple":17,"sentry":3,"sermon":1,"shadowWeave":4,"shield":2,"slippery":4,"soul":2,"sp":8,"stealth":7,"sword":2,"swordRain":27,"swordStorm":5,"telegraph":15,"vest":5,"weightless":6,"zone":171},
|
||||
"snaps": "4d7c2a7f c0c07807 ce5212b4 a9feb336 5a4c0408 8e579416 5e0ff5ee ea4f151c 2008b892 ff8c9128 a62287dc a67f5a01 2b890862 371bd4a9 23e17b23 fcfbef0b 5fd18035 ced47252 70e1d975 20720ea4"
|
||||
},
|
||||
"boss-boss_6-solo": {
|
||||
"about": "阿利斯泰尔,帝国余晖 solo pool 995000: chess_char_4_17_b chess_char_4_18_b chess_char_4_23_b chess_char_4_19_b chess_char_4_22_b chess_char_4_20_b chess_char_4_21_b chess_char_4_24_b chess_char_4_25_b chess_char_4_26_b",
|
||||
|
||||
+15
-15
@@ -152,7 +152,7 @@
|
||||
"title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"},
|
||||
"trophies": 0,
|
||||
"reward": 400,
|
||||
"stats": {"activatedLayers":290,"bossDamage":97500,"dmgDealt":1710191,"gold":131,"itemsEquipped":23,"kills":361,"leaks":21,"lpLost":16,"merges":5,"perfectRounds":11,"refreshes":15},
|
||||
"stats": {"activatedLayers":290,"bossDamage":97500,"dmgDealt":1700976,"gold":131,"itemsEquipped":23,"kills":361,"leaks":21,"lpLost":16,"merges":5,"perfectRounds":11,"refreshes":15},
|
||||
"lineup": ["2_14_a@12,5","5_10_a@12,7[4_07_e_a+3_08_e_b]","5_20_b@11,5[6_09_e_a+5_02_e_b]","3_20_b@11,8[3_06_e_a+4_08_e_a]","6_11_a@10,3[4_12_e_a+5_02_e_b]","3_18_a@10,8[2_04_e_b+4_05_e_b]","6_19_a@9,4[4_04_e_a+4_10_e_a]","1_08_a@9,5[1_01_e_a+1_02_e_a]"],
|
||||
"bonds": ["arcaneShip 0/2","deputShip 1/14","emptyShip 1/10","kazimierzShip 0/16","kjeragShip 1/24","maniShip 1/2","miraShip 1/15","preciShip 0/12","sargonShip 0/8","siracusaShip 1/151","soloShip 1/22","steadShip 0/6","suntShip 1/8","swiftShip 1/44"]
|
||||
}
|
||||
@@ -592,7 +592,7 @@
|
||||
"title": {"id":"comment_2","name":"不朽盟约","picId":"comment_icon_2","text":"激活的盟约层数总和最高"},
|
||||
"trophies": 4,
|
||||
"reward": 400,
|
||||
"stats": {"activatedLayers":250,"bossDamage":287418,"dmgDealt":3020132,"gold":139,"itemsEquipped":12,"kills":334,"leaks":9,"lpLost":8,"merges":5,"perfectRounds":11,"refreshes":23},
|
||||
"stats": {"activatedLayers":250,"bossDamage":287418,"dmgDealt":3020895,"gold":139,"itemsEquipped":12,"kills":334,"leaks":9,"lpLost":8,"merges":5,"perfectRounds":11,"refreshes":23},
|
||||
"lineup": ["3_19_b@11,7[2_04_e_b]","5_12_a@11,8","4_10_a@10,5[1_02_e_b+2_01_e_a]","6_06_a@9,4","1_08_b@9,5","6_16_a@9,7","5_20_a@9,8[3_05_e_a+3_02_e_b]","3_13_b@9,9"],
|
||||
"bonds": ["arcaneShip 2/86","miraShip 1/12","preciShip 0/10","sargonShip 0/10","siracusaShip 1/110","skillfulShip 1/36","soloShip 1/6","suntShip 1/0","swiftShip 0/32"]
|
||||
},
|
||||
@@ -950,14 +950,14 @@
|
||||
"round": 12,
|
||||
"ai_0": [1,26,12,0,0,6,8,"934bb983",409,"deputShip 1/57, emptyShip 1/2, kjeragShip 0/2, preciShip 1/138, sargonShip 1/144, steadShip 1/68",46,46,0,111],
|
||||
"ai_1": [1,45,12,0,0,6,8,"d4b1958d",155,"deputShip 2/78, emptyShip 1/19, preciShip 0/4, sargonShip 0/2, siracusaShip 1/58, steadShip 0/4",20,46,26,104],
|
||||
"ai_2": [1,28,12,0,0,6,8,"696f5ca3",172,"emptyShip 1/0, sargonShip 0/8, siracusaShip 2/148, swiftShip 1/24, yanShip 0/1",46,46,0,106],
|
||||
"ai_2": [1,28,12,0,0,6,8,"696f5ca3",168,"emptyShip 1/0, sargonShip 0/8, siracusaShip 2/144, swiftShip 1/24, yanShip 0/1",46,46,0,106],
|
||||
"ai_3": [1,31,12,0,0,6,8,"2e3cd509",245,"deputShip 0/18, emptyShip 0/12, kjeragShip 2/106, preciShip 2/99, siracusaShip 0/3, swiftShip 1/40, visiShip 1/0, yanShip 0/1",46,46,0,110]
|
||||
},
|
||||
{
|
||||
"round": 13,
|
||||
"ai_0": [1,26,12,0,0,6,8,"2df19066",463,"deputShip 1/59, emptyShip 1/4, kjeragShip 0/7, preciShip 2/156, sargonShip 1/166, steadShip 1/78",32,32,0,126],
|
||||
"ai_1": [1,45,12,0,2,6,8,"9346fb5a",177,"deputShip 1/86, emptyShip 1/21, preciShip 1/6, sargonShip 0/2, siracusaShip 1/64, steadShip 0/4",32,32,0,115],
|
||||
"ai_2": [1,28,12,0,0,6,8,"0236b2a3",238,"emptyShip 1/0, sargonShip 0/8, siracusaShip 2/214, swiftShip 1/24, yanShip 0/1",32,32,0,117],
|
||||
"ai_2": [1,28,12,0,0,6,8,"0236b2a3",236,"emptyShip 1/0, sargonShip 0/8, siracusaShip 2/212, swiftShip 1/24, yanShip 0/1",32,32,0,117],
|
||||
"ai_3": [1,31,12,0,0,6,7,"ceba29b5",263,"deputShip 0/18, emptyShip 0/12, kjeragShip 1/114, preciShip 2/104, siracusaShip 0/3, swiftShip 1/45, yanShip 0/1",32,32,0,124]
|
||||
}
|
||||
],
|
||||
@@ -972,7 +972,7 @@
|
||||
"title": {"id":"comment_2","name":"不朽盟约","picId":"comment_icon_2","text":"激活的盟约层数总和最高"},
|
||||
"trophies": 3,
|
||||
"reward": 250,
|
||||
"stats": {"activatedLayers":485,"bossDamage":46721,"dmgDealt":1699612,"gold":140,"itemsEquipped":25,"kills":328,"leaks":0,"lpLost":0,"merges":5,"perfectRounds":13,"refreshes":21},
|
||||
"stats": {"activatedLayers":485,"bossDamage":46721,"dmgDealt":1695990,"gold":140,"itemsEquipped":25,"kills":328,"leaks":0,"lpLost":0,"merges":5,"perfectRounds":13,"refreshes":21},
|
||||
"lineup": ["6_08_a@11,6[3_03_e_a+3_02_e_a]","6_12_a@11,7[4_08_e_a+6_07_e_b]","2_14_b@10,3","2_17_b@10,4[4_02_e_b+5_01_e_a]","2_08_a@9,3[4_04_e_a+1_01_e_b]","6_06_a@9,4[3_08_e_a+3_01_e_b]","1_06_b@9,8","5_02_b@9,9[5_02_e_a+3_06_e_b]"],
|
||||
"bonds": ["deputShip 1/61","emptyShip 1/6","kjeragShip 0/7","preciShip 2/158","sargonShip 1/172","steadShip 1/88"]
|
||||
},
|
||||
@@ -986,7 +986,7 @@
|
||||
"title": {"id":"comment_3","name":"坚若磐石","picId":"comment_icon_3","text":"目标生命值损失最少"},
|
||||
"trophies": 3,
|
||||
"reward": 250,
|
||||
"stats": {"activatedLayers":207,"bossDamage":11652,"dmgDealt":1287691,"gold":129,"itemsEquipped":20,"kills":237,"leaks":46,"lpLost":0,"merges":6,"perfectRounds":9,"refreshes":20},
|
||||
"stats": {"activatedLayers":207,"bossDamage":12338,"dmgDealt":1288377,"gold":129,"itemsEquipped":20,"kills":237,"leaks":46,"lpLost":0,"merges":6,"perfectRounds":9,"refreshes":20},
|
||||
"lineup": ["2_14_b@12,3","5_10_a@11,6[4_03_e_b+1_02_e_a]","6_01_a@11,7[3_05_e_a]","5_10_a@11,8[5_09_e_a+4_08_e_b]","6_14_a@10,3","4_16_a@10,8[4_11_e_a+4_04_e_b]","6_05_a@9,8[1_05_e_a+5_03_e_a]","2_16_a@9,9[5_02_e_a+4_05_e_b]"],
|
||||
"bonds": ["deputShip 1/96","emptyShip 1/23","preciShip 1/14","sargonShip 0/2","siracusaShip 1/74","steadShip 0/4"]
|
||||
},
|
||||
@@ -1000,9 +1000,9 @@
|
||||
"title": {"id":"comment_5","name":"万事俱备","picId":"comment_icon_5","text":"装备配发数量最多"},
|
||||
"trophies": 3,
|
||||
"reward": 250,
|
||||
"stats": {"activatedLayers":260,"bossDamage":82751,"dmgDealt":1656521,"gold":127,"itemsEquipped":20,"kills":283,"leaks":0,"lpLost":0,"merges":3,"perfectRounds":13,"refreshes":16},
|
||||
"stats": {"activatedLayers":258,"bossDamage":70366,"dmgDealt":1649146,"gold":127,"itemsEquipped":20,"kills":283,"leaks":0,"lpLost":0,"merges":3,"perfectRounds":13,"refreshes":16},
|
||||
"lineup": ["4_25_a@12,3","1_07_b@11,7[1_01_e_a+1_05_e_a]","5_20_a@11,8[3_02_e_a+2_01_e_b]","6_18_a@10,3[2_01_e_b+4_03_e_b]","4_10_a@10,7[4_03_e_b]","3_18_b@9,4[3_07_e_b+3_11_e_a]","6_05_a@9,8","2_16_b@9,9[5_01_e_a+4_02_e_a]"],
|
||||
"bonds": ["sargonShip 0/8","siracusaShip 2/236","swiftShip 1/24","yanShip 0/1"]
|
||||
"bonds": ["sargonShip 0/8","siracusaShip 2/234","swiftShip 1/24","yanShip 0/1"]
|
||||
},
|
||||
"ai_3": {
|
||||
"alive": true,
|
||||
@@ -1014,7 +1014,7 @@
|
||||
"title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"},
|
||||
"trophies": 3,
|
||||
"reward": 250,
|
||||
"stats": {"activatedLayers":309,"bossDamage":143876,"dmgDealt":1729660,"gold":138,"itemsEquipped":36,"kills":284,"leaks":0,"lpLost":0,"merges":3,"perfectRounds":13,"refreshes":23},
|
||||
"stats": {"activatedLayers":309,"bossDamage":155575,"dmgDealt":1741361,"gold":138,"itemsEquipped":36,"kills":284,"leaks":0,"lpLost":0,"merges":3,"perfectRounds":13,"refreshes":23},
|
||||
"lineup": ["3_20_b@12,8[5_02_e_b+6_03_e_a]","6_14_a@11,3","4_13_b@11,6[5_02_e_b+4_07_e_a]","6_01_a@11,7[3_11_e_a+3_04_e_a]","4_14_a@11,8[4_03_e_a+1_02_e_a]","4_22_a@10,8[4_04_e_b+4_02_e_a]","3_11_b@9,8[4_09_e_a+3_07_e_a]","5_14_a@9,9[4_06_e_b+2_01_e_b]"],
|
||||
"bonds": ["deputShip 1/20","emptyShip 0/12","kjeragShip 1/118","preciShip 2/117","siracusaShip 0/3","swiftShip 1/54","yanShip 0/1"]
|
||||
}
|
||||
@@ -1238,17 +1238,17 @@
|
||||
{
|
||||
"round": 11,
|
||||
"ai_0": [1,17,12,0,0,5,8,"f0ff6294",86,"arcaneShip 1/22, emptyShip 1/0, indomShip 0/8, kjeragShip 0/7, preciShip 1/7, siracusaShip 2/46, soloShip 1/11, steadShip 0/2, suntShip 1/0, swiftShip 0/6, victoriaShip 0/8, visiShip 0/8",23,23,0,104],
|
||||
"ai_1": [1,8,12,0,0,5,8,"f020d91c",137,"arcaneShip 1/20, indomShip 1/40, kjeragShip 0/8, preciShip 0/2, siracusaShip 1/58, soloShip 1/0, steadShip 1/19, suntShip 1/0, victoriaShip 0/8, visiShip 0/8",17,23,6,97]
|
||||
"ai_1": [1,8,12,0,0,5,8,"f020d91c",127,"arcaneShip 1/20, indomShip 1/30, kjeragShip 0/8, preciShip 0/2, siracusaShip 1/58, soloShip 1/0, steadShip 1/19, suntShip 1/0, victoriaShip 0/8, visiShip 0/8",17,23,6,97]
|
||||
},
|
||||
{
|
||||
"round": 12,
|
||||
"ai_0": [1,7,12,0,0,6,8,"09ffe6d0",86,"arcaneShip 1/22, emptyShip 1/0, indomShip 0/8, kjeragShip 0/7, preciShip 2/7, siracusaShip 1/46, soloShip 1/11, steadShip 0/2, suntShip 1/0, swiftShip 0/6, victoriaShip 0/8, visiShip 0/8",35,47,12,116],
|
||||
"ai_1": [0,0,12,0,0,6,0,"811c9dc5",0,"arcaneShip 0/20, indomShip 0/60, kjeragShip 0/8, preciShip 0/2, siracusaShip 0/58, steadShip 0/22, victoriaShip 0/8, visiShip 0/8",17,46,29,109]
|
||||
"ai_1": [0,0,12,0,0,6,0,"811c9dc5",0,"arcaneShip 0/20, indomShip 0/50, kjeragShip 0/8, preciShip 0/2, siracusaShip 0/58, steadShip 0/22, victoriaShip 0/8, visiShip 0/8",20,46,26,109]
|
||||
},
|
||||
{
|
||||
"round": 13,
|
||||
"ai_0": [0,0,12,0,0,6,0,"811c9dc5",0,"arcaneShip 0/36, indomShip 0/8, kjeragShip 0/7, miraShip 0/3, preciShip 0/9, siracusaShip 0/58, soloShip 0/11, steadShip 0/2, swiftShip 0/6, victoriaShip 0/8, visiShip 0/8, yanShip 0/6",21,39,18,128],
|
||||
"ai_1": [0,0,0,0,0,6,0,"811c9dc5",0,"arcaneShip 0/20, indomShip 0/60, kjeragShip 0/8, preciShip 0/2, siracusaShip 0/58, steadShip 0/22, victoriaShip 0/8, visiShip 0/8",null,null,null,109]
|
||||
"ai_1": [0,0,0,0,0,6,0,"811c9dc5",0,"arcaneShip 0/20, indomShip 0/50, kjeragShip 0/8, preciShip 0/2, siracusaShip 0/58, steadShip 0/22, victoriaShip 0/8, visiShip 0/8",null,null,null,109]
|
||||
}
|
||||
],
|
||||
"players": {
|
||||
@@ -1262,7 +1262,7 @@
|
||||
"title": {"id":"comment_4","name":"精英云集","picId":"comment_icon_4","text":"晋升精锐次数最多"},
|
||||
"trophies": 3,
|
||||
"reward": 280,
|
||||
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":2825652,"gold":128,"itemsEquipped":14,"kills":230,"leaks":49,"lpLost":33,"merges":3,"perfectRounds":8,"refreshes":18},
|
||||
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":2828648,"gold":128,"itemsEquipped":14,"kills":230,"leaks":49,"lpLost":33,"merges":3,"perfectRounds":8,"refreshes":18},
|
||||
"lineup": [],
|
||||
"bonds": ["arcaneShip 0/36","indomShip 0/8","kjeragShip 0/7","miraShip 0/3","preciShip 0/9","siracusaShip 0/58","soloShip 0/11","steadShip 0/2","swiftShip 0/6","victoriaShip 0/8","visiShip 0/8","yanShip 0/6"]
|
||||
},
|
||||
@@ -1276,9 +1276,9 @@
|
||||
"title": {"id":"comment_5","name":"万事俱备","picId":"comment_icon_5","text":"装备配发数量最多"},
|
||||
"trophies": 2,
|
||||
"reward": 240,
|
||||
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":1887768,"gold":109,"itemsEquipped":16,"kills":176,"leaks":53,"lpLost":30,"merges":2,"perfectRounds":6,"refreshes":14},
|
||||
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":1891141,"gold":109,"itemsEquipped":16,"kills":179,"leaks":50,"lpLost":30,"merges":2,"perfectRounds":6,"refreshes":14},
|
||||
"lineup": [],
|
||||
"bonds": ["arcaneShip 0/20","indomShip 0/60","kjeragShip 0/8","preciShip 0/2","siracusaShip 0/58","steadShip 0/22","victoriaShip 0/8","visiShip 0/8"]
|
||||
"bonds": ["arcaneShip 0/20","indomShip 0/50","kjeragShip 0/8","preciShip 0/2","siracusaShip 0/58","steadShip 0/22","victoriaShip 0/8","visiShip 0/8"]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
+191
-191
@@ -29,14 +29,14 @@
|
||||
"players": {"p1":{"killed":25,"total":31,"perfect":false,"leaks":6,"leaksUncounted":0,"coins":8,"dmg":180266,"bossDmg":0,"heal":9892,"deaths":9,"layerGains":{}}},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_1_02_a",1,null,2563.03,1,7,1,3761,1862,0,17,1],
|
||||
["p1",2,"op","chess_char_1_04_a",1,null,0,0,9,1,4766,3559,0,26,1],
|
||||
["p1",2,"op","chess_char_1_04_a",1,null,0,0,9,1,5169,3559,0,25,1],
|
||||
["p1",3,"op","chess_char_1_10_a",0,null,0,0,48,0,2450,3808,2132,22,12],
|
||||
["p1",4,"op","chess_char_1_08_a",1,null,0,0,12,3,11908,8558,0,18,1],
|
||||
["p1",5,"op","chess_char_1_12_a",1,null,0,0,15,1,17149,3705,810,21,1],
|
||||
["p1",6,"op","chess_char_1_01_a",1,null,1403.75,1,4,2,17043,0,0,42,2],
|
||||
["p1",7,"op","chess_char_1_03_a",1,null,964.63,1,5,1,13257,898,0,5,1],
|
||||
["p1",8,"op","chess_char_1_06_a",1,null,0,0,11,2,12245,2600,3519,29,1],
|
||||
["p1",9,"op","chess_char_1_07_a",0,null,1510.15,1,50,3,12526,2068,0,21,0],
|
||||
["p1",9,"op","chess_char_1_07_a",0,null,1510.15,1,50,3,12124,2068,0,21,0],
|
||||
["p1",10,"op","chess_char_1_09_a",1,null,2122.5,1,6,0,31045,5400,0,27,1],
|
||||
["p1",11,"op","chess_char_1_13_a",1,null,0,0,49,1,9409,3359,0,19,1],
|
||||
["p1",12,"op","chess_char_1_14_a",1,null,1431.25,1,8,10,44707,2311,0,17,1],
|
||||
@@ -61,10 +61,10 @@
|
||||
"enemy_2004_balloon": [1,0,0,128,6591],
|
||||
"enemy_9010_acpupp": [1,0,0,0,959]
|
||||
},
|
||||
"hooks": [1,50,2700,404,404,632,636,325,34,34,25,21,19,14421,65,36,31,0,1,35,0,0,0],
|
||||
"events": {"atk":426,"bounty":4,"deploy":16,"die":34,"dmg":636,"fx":65,"heal":319,"skill":45,"spawn":47,"status":126},
|
||||
"hooks": [1,50,2700,403,403,633,637,325,34,34,25,21,19,14445,66,36,31,0,1,35,0,0,0],
|
||||
"events": {"atk":425,"bounty":4,"deploy":16,"die":34,"dmg":637,"fx":65,"heal":319,"skill":45,"spawn":47,"status":127},
|
||||
"fx": {"aoe":1,"bombard":9,"bombardShell":10,"counter":6,"crit":18,"dp":1,"ember":1,"explode":3,"heal":11,"liberate":1,"summon":1,"taunt":1,"telegraph":1,"zone":1},
|
||||
"snaps": "15544384 8f8ab114 83735bc4 1672a1a1 e9e7ffdb 9b9d0193 15df767d 792390ec 43783e3b"
|
||||
"snaps": "15544384 737544d2 e8326082 a526432e a0c50d61 50ebdcd8 bc51feb9 9efd18d0 e4933e87"
|
||||
},
|
||||
"roster-002": {
|
||||
"about": "pass 0 band 2: chess_char_1_02_b chess_char_1_20_a chess_char_1_04_b chess_char_1_08_b chess_char_1_18_a chess_char_1_19_a chess_char_1_17_a chess_char_1_01_b chess_char_1_03_b chess_char_1_06_b chess_char_1_07_b chess_char_1_09_b",
|
||||
@@ -82,22 +82,22 @@
|
||||
"total": 44,
|
||||
"unspawned": 0,
|
||||
"bossHpLeft": null,
|
||||
"rngDraws": 77,
|
||||
"rngDraws": 80,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {"p1":{"killed":29,"total":44,"perfect":false,"leaks":15,"leaksUncounted":0,"coins":8,"dmg":217461,"bossDmg":0,"heal":2127,"deaths":16,"layerGains":{}}},
|
||||
"players": {"p1":{"killed":29,"total":44,"perfect":false,"leaks":15,"leaksUncounted":0,"coins":8,"dmg":217619,"bossDmg":0,"heal":1877,"deaths":16,"layerGains":{}}},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_1_02_b",1,"uniequip_002_yak",0,0,3,1,7970,4643,0,20,1],
|
||||
["p1",2,"op","chess_char_1_20_a",1,null,2857.4,1,1,0,0,0,0,0,0],
|
||||
["p1",3,"op","chess_char_1_04_b",1,"uniequip_002_udflow",3541.94,1,4,2,11017,233,0,12,1],
|
||||
["p1",4,"op","chess_char_1_08_b",1,"uniequip_002_texas",0,0,7,1,6914,3473,0,2,2],
|
||||
["p1",5,"op","chess_char_1_18_a",1,null,0,0,60,2,4846,7028,450,9,0],
|
||||
["p1",3,"op","chess_char_1_04_b",1,"uniequip_002_udflow",3541.94,1,4,3,6102,233,0,9,1],
|
||||
["p1",4,"op","chess_char_1_08_b",1,"uniequip_002_texas",0,0,7,0,10101,3473,0,5,2],
|
||||
["p1",5,"op","chess_char_1_18_a",1,null,0,0,60,1,2095,6778,200,4,0],
|
||||
["p1",6,"op","chess_char_1_19_a",1,null,0,0,57,0,6210,3853,0,9,1],
|
||||
["p1",7,"op","chess_char_1_17_a",1,null,0,0,5,0,0,1481,0,0,0],
|
||||
["p1",8,"op","chess_char_1_01_b",1,"uniequip_002_inside",0,0,62,2,44001,3695,0,46,2],
|
||||
["p1",9,"op","chess_char_1_03_b",1,"uniequip_002_leizi",0,0,6,6,29303,1808,0,16,1],
|
||||
["p1",10,"op","chess_char_1_06_b",1,"uniequip_002_vendla",0,0,61,4,22628,5321,1677,25,2],
|
||||
["p1",11,"op","chess_char_1_07_b",0,"uniequip_002_prove",0,0,58,4,34348,5955,0,25,0],
|
||||
["p1",12,"op","chess_char_1_09_b",1,"uniequip_002_caper",0,0,2,7,50224,2880,0,40,1]
|
||||
["p1",12,"op","chess_char_1_09_b",1,"uniequip_002_caper",0,0,2,8,54862,2880,0,42,1]
|
||||
],
|
||||
"enemies": {
|
||||
"enemy_1000_gopro_2": [1,1,0,0,2938],
|
||||
@@ -105,23 +105,23 @@
|
||||
"enemy_10112_ymgds": [1,1,0,0,8640],
|
||||
"enemy_1019_jshoot": [9,3,5,14425,12328],
|
||||
"enemy_1040_bombd": [1,1,0,0,6912],
|
||||
"enemy_1043_zomsbr": [18,16,2,590,82324],
|
||||
"enemy_1043_zomsbr": [18,16,2,389,81941],
|
||||
"enemy_1116_liprr": [1,1,0,0,9504],
|
||||
"enemy_1168_dumage_2": [1,1,0,2685,11232],
|
||||
"enemy_1199_sfjin": [1,1,0,0,11232],
|
||||
"enemy_1200_msfjin": [1,0,1,0,14],
|
||||
"enemy_1234_dsubrl": [1,1,0,2081,17280],
|
||||
"enemy_1234_dsubrl": [1,1,0,2049,17280],
|
||||
"enemy_1288_duskls_2": [1,0,1,0,10873],
|
||||
"enemy_1299_ymkilr": [3,1,2,4574,14688],
|
||||
"enemy_1381_winman_2": [1,1,0,0,13478],
|
||||
"enemy_1501_demonk": [1,0,0,7637,5549],
|
||||
"enemy_2005_axetro": [1,0,0,5090,1565],
|
||||
"enemy_9011_acrefr": [1,0,0,0,2338]
|
||||
"enemy_1501_demonk": [1,0,0,7620,6090],
|
||||
"enemy_2005_axetro": [1,0,0,5090,2107],
|
||||
"enemy_9011_acrefr": [1,0,0,0,1796]
|
||||
},
|
||||
"hooks": [1,62,3300,346,346,392,404,3399,45,56,11,16,31,7389,39,11,44,11,1,46,0,0,0],
|
||||
"events": {"atk":364,"bounty":4,"deploy":18,"die":45,"dmg":404,"fx":47,"heal":16,"leak":11,"skill":22,"spawn":56,"status":73},
|
||||
"fx": {"aoe":4,"crit":20,"displace":9,"dp":2,"ember":1,"pulse":7,"revive":1,"summon":1,"taunt":2},
|
||||
"snaps": "8776586b 475e50d7 071c9999 3f2ee9c1 208fe368 329d3182 c7a2efc2 2eeffe50 dacdc0a6 c5292015 fe2e0910"
|
||||
"hooks": [1,62,3300,341,341,383,395,3119,45,56,11,16,31,7390,31,10,44,11,1,46,0,0,0],
|
||||
"events": {"atk":359,"bounty":4,"deploy":18,"die":45,"dmg":395,"fx":48,"heal":11,"leak":11,"skill":22,"spawn":56,"status":70},
|
||||
"fx": {"aoe":4,"crit":21,"displace":9,"dp":2,"ember":1,"pulse":7,"revive":1,"summon":1,"taunt":2},
|
||||
"snaps": "8776586b 475e50d7 071c9999 3f2ee9c1 ce8ea3d6 8deb7035 325c7285 cb230d4d 41ede204 5a0ac937 0e02c7e0"
|
||||
},
|
||||
"roster-003": {
|
||||
"about": "pass 0 band 2: chess_char_1_10_b chess_char_1_12_b chess_char_1_20_b chess_char_1_18_b chess_char_1_19_b chess_char_1_13_b chess_char_1_14_b chess_char_1_17_b chess_char_2_01_a chess_char_2_02_a chess_char_2_04_a chess_char_2_05_a token_10000_silent_healrb",
|
||||
@@ -1029,40 +1029,40 @@
|
||||
"time": 230,
|
||||
"ticks": 6900,
|
||||
"reason": "timeout",
|
||||
"killed": 72,
|
||||
"killed": 71,
|
||||
"total": 126,
|
||||
"unspawned": 0,
|
||||
"bossHpLeft": null,
|
||||
"rngDraws": 500,
|
||||
"rngDraws": 498,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {
|
||||
"p1": {
|
||||
"killed": 72,
|
||||
"killed": 71,
|
||||
"total": 126,
|
||||
"perfect": false,
|
||||
"leaks": 54,
|
||||
"leaks": 55,
|
||||
"leaksUncounted": 0,
|
||||
"coins": 6,
|
||||
"dmg": 3354350,
|
||||
"dmg": 3361010,
|
||||
"bossDmg": 0,
|
||||
"heal": 69117,
|
||||
"heal": 65977,
|
||||
"deaths": 11,
|
||||
"layerGains": {"preciShip":2}
|
||||
}
|
||||
},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",3907,1,154,12,318292,8290,476,78,4],
|
||||
["p1",2,"op","chess_char_6_03_a",2,null,3649.5,1,149,2,113360,16953,4124,55,2],
|
||||
["p1",3,"op","chess_char_6_06_a",2,null,2223,1,153,6,300871,9855,461,70,3],
|
||||
["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",2738,1,131,3,170159,28198,6835,216,3],
|
||||
["p1",5,"op","chess_char_5_20_b",2,"uniequip_002_aglina",1382,1,10,0,108825,1182,705,38,4],
|
||||
["p1",6,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",1629,1,84,0,229814,2332,285,113,3],
|
||||
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",3907,1,154,12,307773,8183,369,78,4],
|
||||
["p1",2,"op","chess_char_6_03_a",2,null,3649.5,1,149,2,101623,13991,3710,50,2],
|
||||
["p1",3,"op","chess_char_6_06_a",2,null,2223,1,153,6,301133,9855,461,70,3],
|
||||
["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",2738,1,131,2,169426,28198,6759,214,3],
|
||||
["p1",5,"op","chess_char_5_20_b",2,"uniequip_002_aglina",1382,1,10,0,113165,1182,705,41,5],
|
||||
["p1",6,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",1629,1,84,0,231177,2332,285,114,3],
|
||||
["p1",7,"op","chess_char_5_22_b",1,"uniequip_002_nymph",1611,1,1,1,31212,1242,1242,13,5],
|
||||
["p1",8,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",1610,1,3,0,0,3654,49533,73,4],
|
||||
["p1",9,"op","chess_char_6_01_a",2,null,1158,1,111,21,389549,4548,175,70,3],
|
||||
["p1",10,"op","chess_char_6_02_a",2,null,1687,1,7,24,1320770,6394,220,71,3],
|
||||
["p1",11,"op","chess_char_6_04_a",2,null,1202,1,94,2,113596,10510,4682,0,3],
|
||||
["p1",12,"op","chess_char_6_05_a",2,null,1215,1,58,0,257904,2559,379,70,4],
|
||||
["p1",8,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",1610,1,3,0,0,3654,46989,69,4],
|
||||
["p1",9,"op","chess_char_6_01_a",2,null,1158,1,111,20,399102,4548,175,70,3],
|
||||
["p1",10,"op","chess_char_6_02_a",2,null,1687,1,7,25,1334116,6394,220,71,3],
|
||||
["p1",11,"op","chess_char_6_04_a",2,null,1202,1,94,2,114260,10510,4682,0,3],
|
||||
["p1",12,"op","chess_char_6_05_a",2,null,1215,1,58,0,258022,2559,379,70,4],
|
||||
["p1",13,"token","token_10017_skadi2_dedant",null,null,100,0,13,0,0,0,0,0,null],
|
||||
["p1","~1","token","token_10017_skadi2_dedant",null,null,100,0,60,0,0,0,0,0,null],
|
||||
["p1","~2","token","token_10017_skadi2_dedant",null,null,100,0,103,0,0,0,0,0,null],
|
||||
@@ -1072,10 +1072,10 @@
|
||||
"enemies": {
|
||||
"enemy_10045_parrot": [1,0,1,0,44502],
|
||||
"enemy_10098_crhro": [1,1,0,8003,185752],
|
||||
"enemy_10124_uashld_2": [12,0,11,30231,650685],
|
||||
"enemy_10124_uashld_2": [12,0,11,30125,652842],
|
||||
"enemy_1019_jshoot_2": [1,1,0,1514,16718],
|
||||
"enemy_1043_zomsbr": [72,48,24,1022,905496],
|
||||
"enemy_1061_zomshd": [30,16,14,14794,1383126],
|
||||
"enemy_1043_zomsbr": [72,47,25,1006,906047],
|
||||
"enemy_1061_zomshd": [30,16,14,11849,1388159],
|
||||
"enemy_1072_dlancer": [1,1,0,2738,37150],
|
||||
"enemy_1165_duhond": [1,1,0,0,17337],
|
||||
"enemy_1196_msfyin_2": [1,1,0,0,3],
|
||||
@@ -1086,10 +1086,10 @@
|
||||
"enemy_2001_duckmi_2": [1,0,1,0,4539],
|
||||
"enemy_9006_actoxi": [1,0,1,0,2981]
|
||||
},
|
||||
"hooks": [1,154,6900,901,970,7374,7596,77742,83,140,41,36,17,35956,986,38,126,53,1,97,1,11,3],
|
||||
"events": {"atk":2084,"bounty":3,"deploy":28,"die":87,"dmg":7537,"fx":511,"heal":234,"layer":1,"leak":53,"skill":77,"spawn":143,"status":2244},
|
||||
"fx": {"aoe":9,"blessing":1,"bombard":17,"bombardShell":17,"burst":11,"crit":42,"dodge":3,"explode":40,"firewall":2,"garrison":1,"iceSpike":90,"lightning":116,"lock":17,"lure":3,"revive":1,"snow":80,"soul":1,"sp":2,"storm":4,"talent":2,"telegraph":8,"tide":3,"wanted":37,"weightless":4},
|
||||
"snaps": "ee17d257 2b5b60a7 bca4c44c a7aa2306 7f8469fb b466b374 2d189b42 c93b0983 53948389 334fd760 ba885b5c cafbf724 2e204610 95530b0b 9453d785 20cbd957 bc0f2a28 1125cf4b 5d7a7151 7d866008 629c6d52 ceb4961f aa0422ad"
|
||||
"hooks": [1,154,6900,884,953,7381,7592,77582,82,140,42,37,17,36466,990,37,126,54,1,95,1,10,3],
|
||||
"events": {"atk":2068,"bounty":3,"deploy":28,"die":86,"dmg":7533,"fx":512,"heal":225,"layer":1,"leak":54,"skill":79,"spawn":143,"status":2296},
|
||||
"fx": {"aoe":9,"blessing":1,"bombard":17,"bombardShell":17,"burst":10,"crit":42,"dodge":3,"explode":40,"firewall":2,"garrison":1,"iceSpike":90,"lightning":116,"lock":17,"lure":3,"revive":1,"snow":81,"soul":1,"sp":2,"storm":4,"talent":2,"telegraph":8,"tide":3,"wanted":37,"weightless":5},
|
||||
"snaps": "ee17d257 2b5b60a7 bca4c44c a7aa2306 7f8469fb b466b374 2d189b42 c93b0983 53948389 334fd760 ba885b5c cafbf724 2e204610 95530b0b 9453d785 7b4651cb 20697bb9 4ad6a768 86798eb2 779f0409 09912c24 ac014067 7729604f"
|
||||
},
|
||||
"roster-017": {
|
||||
"about": "pass 0 band 6: chess_char_6_15_a chess_char_6_19_a chess_char_6_07_a chess_char_6_17_a chess_char_6_08_a chess_char_6_09_a chess_char_6_11_a chess_char_6_12_a chess_char_6_13_a chess_char_6_14_a chess_char_6_16_a chess_char_6_18_a",
|
||||
@@ -1653,24 +1653,24 @@
|
||||
"time": 140,
|
||||
"ticks": 4200,
|
||||
"reason": "timeout",
|
||||
"killed": 18,
|
||||
"killed": 15,
|
||||
"total": 73,
|
||||
"unspawned": 0,
|
||||
"bossHpLeft": null,
|
||||
"rngDraws": 157,
|
||||
"rngDraws": 159,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {"p1":{"killed":18,"total":73,"perfect":false,"leaks":55,"leaksUncounted":0,"coins":6,"dmg":178948,"bossDmg":0,"heal":1327,"deaths":18,"layerGains":{}}},
|
||||
"players": {"p1":{"killed":15,"total":73,"perfect":false,"leaks":58,"leaksUncounted":0,"coins":6,"dmg":164277,"bossDmg":0,"heal":1769,"deaths":18,"layerGains":{}}},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_3_12_a",0,null,0,0,97,1,6989,5110,1327,15,3],
|
||||
["p1",2,"op","chess_char_3_16_a",0,null,0,0,6,1,2689,2173,0,10,1],
|
||||
["p1",3,"op","chess_char_3_18_a",0,null,0,0,94,1,6557,2962,0,4,3],
|
||||
["p1",4,"op","chess_char_3_08_a",0,null,0,0,4,4,42472,1594,0,8,1],
|
||||
["p1",5,"op","chess_char_3_09_a",0,null,1267,1,99,2,13749,1267,0,21,3],
|
||||
["p1",1,"op","chess_char_3_12_a",0,null,0,0,97,2,7760,5552,1769,19,4],
|
||||
["p1",2,"op","chess_char_3_16_a",0,null,0,0,6,0,2668,2173,0,10,1],
|
||||
["p1",3,"op","chess_char_3_18_a",0,null,0,0,94,1,4659,2962,0,4,3],
|
||||
["p1",4,"op","chess_char_3_08_a",0,null,0,0,4,3,28698,1594,0,8,1],
|
||||
["p1",5,"op","chess_char_3_09_a",0,null,1267,1,99,1,13514,1267,0,21,3],
|
||||
["p1",6,"op","chess_char_3_10_a",0,null,0,0,86,1,24232,3300,0,15,3],
|
||||
["p1",7,"op","chess_char_3_11_a",0,null,0,0,7,1,10753,1316,0,7,1],
|
||||
["p1",8,"op","chess_char_3_13_a",0,null,0,0,10,0,4775,4277,0,25,1],
|
||||
["p1",7,"op","chess_char_3_11_a",0,null,0,0,7,1,11464,1316,0,7,1],
|
||||
["p1",8,"op","chess_char_3_13_a",0,null,0,0,10,0,4551,4277,0,25,1],
|
||||
["p1",9,"op","chess_char_3_14_a",0,null,0,0,75,0,5911,2502,0,7,0],
|
||||
["p1",10,"op","chess_char_3_17_a",0,null,284.9,1,93,3,37818,4207,0,51,10],
|
||||
["p1",10,"op","chess_char_3_17_a",0,null,611.75,1,93,3,37818,3880,0,51,10],
|
||||
["p1",11,"op","chess_char_3_19_a",0,null,0,0,79,1,15924,2878,0,29,0],
|
||||
["p1",12,"op","chess_char_3_20_a",0,null,0,0,96,0,2200,2684,0,15,0],
|
||||
["p1",13,"token","token_10028_vigil_wolf",null,null,51.51,0,15,1,3733,828,0,6,null],
|
||||
@@ -1680,23 +1680,23 @@
|
||||
["p1","~1","token","token_10028_vigil_wolf",null,null,0,0,80,0,1145,1579,0,4,null]
|
||||
],
|
||||
"enemies": {
|
||||
"enemy_10042_prtrop": [12,0,12,5980,21672],
|
||||
"enemy_10042_prtrop_2": [12,0,10,4710,15756],
|
||||
"enemy_10043_sailor": [39,11,28,18128,163415],
|
||||
"enemy_10042_prtrop": [12,0,12,7318,22803],
|
||||
"enemy_10042_prtrop_2": [12,0,10,4433,15756],
|
||||
"enemy_10043_sailor": [39,8,31,18093,152461],
|
||||
"enemy_1005_yokai_2": [1,1,0,68,2678],
|
||||
"enemy_10156_mncrer": [1,1,0,329,6912],
|
||||
"enemy_1116_liprr_2": [1,1,0,1326,15356],
|
||||
"enemy_1195_sfyin_2": [1,1,0,441,5357],
|
||||
"enemy_1116_liprr_2": [1,1,0,393,12960],
|
||||
"enemy_1195_sfyin_2": [1,1,0,294,5357],
|
||||
"enemy_1196_msfyin_2": [2,2,0,0,6],
|
||||
"enemy_1251_lysyta_2": [1,1,0,623,7925],
|
||||
"enemy_1355_mrfly_2": [1,0,1,0,5568],
|
||||
"enemy_1251_lysyta_2": [1,1,0,792,7731],
|
||||
"enemy_1355_mrfly_2": [1,0,1,0,4464],
|
||||
"enemy_1513_dekght_2": [1,0,1,3473,1470],
|
||||
"enemy_9010_acpupp": [1,0,1,0,1540]
|
||||
},
|
||||
"hooks": [1,98,4200,342,342,1398,1472,9,37,91,26,26,0,8063,24,39,73,53,1,42,0,0,0],
|
||||
"events": {"atk":418,"bounty":3,"deploy":22,"die":38,"dmg":1471,"fx":19,"heal":9,"leak":53,"skill":52,"spawn":90,"status":54},
|
||||
"fx": {"dp":3,"explode":3,"liberate":1,"palsy":1,"revive":4,"shield":1,"sp":1,"strike":1,"summon":2,"telegraph":2},
|
||||
"snaps": "b8ad25ab 03f51213 d7dcd813 5906dc4f 89b1c824 3e67ab1e f003cf8b dc2caccb 6a54c87b 77160756 042f6532 9bdc15a6 3da4b3fe 5314774a"
|
||||
"hooks": [1,98,4200,350,350,1399,1458,9,34,91,27,27,0,8299,26,36,73,56,1,38,0,0,0],
|
||||
"events": {"atk":410,"bounty":3,"deploy":22,"die":35,"dmg":1457,"fx":19,"heal":9,"leak":56,"skill":54,"spawn":90,"status":52},
|
||||
"fx": {"dp":3,"explode":3,"palsy":1,"revive":4,"shield":1,"sp":2,"strike":1,"summon":2,"telegraph":2},
|
||||
"snaps": "b8ad25ab 03f51213 f84a4bf7 9a29353d 19f6d9a9 5330fd8a f6dda9d3 43873b05 57a77a2a 94494c3a ade46bcb e1b4f57e 436600a0 c60c5a58"
|
||||
},
|
||||
"roster-027": {
|
||||
"about": "pass 1 band 4: chess_char_3_06_b chess_char_3_12_b chess_char_3_02_b chess_char_3_03_b chess_char_3_04_b chess_char_3_05_b chess_char_3_21_a chess_char_3_01_b chess_char_3_08_b chess_char_3_09_b chess_char_3_10_b chess_char_3_11_b",
|
||||
@@ -1717,39 +1717,39 @@
|
||||
"rngDraws": 136,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {
|
||||
"p1": {"killed":27,"total":53,"perfect":false,"leaks":26,"leaksUncounted":0,"coins":4,"dmg":321187,"bossDmg":0,"heal":17637,"deaths":10,"layerGains":{"raidShip":18}}
|
||||
"p1": {"killed":27,"total":53,"perfect":false,"leaks":26,"leaksUncounted":0,"coins":4,"dmg":369449,"bossDmg":0,"heal":17637,"deaths":9,"layerGains":{"raidShip":18}}
|
||||
},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_3_06_b",0,"none",0,0,2,0,1546,6162,0,9,1],
|
||||
["p1",2,"op","chess_char_3_12_b",0,"uniequip_003_blemsh",0,0,14,5,32514,17789,13628,53,23],
|
||||
["p1",3,"op","chess_char_3_02_b",0,"none",0,0,6,0,15263,2291,0,38,12],
|
||||
["p1",4,"op","chess_char_3_03_b",0,"none",0,0,8,0,3645,1778,0,35,1],
|
||||
["p1",3,"op","chess_char_3_02_b",0,"none",0,0,6,0,14882,2291,0,37,12],
|
||||
["p1",4,"op","chess_char_3_03_b",0,"none",0,0,8,0,3677,1778,0,34,1],
|
||||
["p1",5,"op","chess_char_3_04_b",0,"uniequip_003_swire2",0,0,59,4,48389,6778,4009,66,0],
|
||||
["p1",6,"op","chess_char_3_05_b",0,"uniequip_003_skadi",0,0,12,2,26200,12108,0,25,1],
|
||||
["p1",7,"op","chess_char_3_21_a",0,null,759.08,1,10,0,8795,605,0,35,14],
|
||||
["p1",8,"op","chess_char_3_01_b",0,"uniequip_003_angel",211.23,1,11,1,38052,1505,0,75,32],
|
||||
["p1",9,"op","chess_char_3_08_b",0,"none",0,0,1,4,33840,3248,0,10,2],
|
||||
["p1",10,"op","chess_char_3_09_b",0,"none",0,0,3,2,11671,1534,0,14,4],
|
||||
["p1",11,"op","chess_char_3_10_b",0,"none",0,0,5,2,49060,2120,0,23,7],
|
||||
["p1",12,"op","chess_char_3_11_b",0,"none",0,0,7,6,52214,1610,0,19,10]
|
||||
["p1",9,"op","chess_char_3_08_b",0,"none",523.13,1,1,3,80456,2725,0,23,4],
|
||||
["p1",10,"op","chess_char_3_09_b",0,"none",0,0,3,3,11118,1534,0,14,4],
|
||||
["p1",11,"op","chess_char_3_10_b",0,"none",0,0,5,2,50229,2120,0,23,7],
|
||||
["p1",12,"op","chess_char_3_11_b",0,"none",0,0,7,6,53591,1610,0,19,10]
|
||||
],
|
||||
"enemies": {
|
||||
"enemy_1000_gopro_2": [1,1,0,11,1836],
|
||||
"enemy_10087_hlchgr": [1,1,0,105,6480],
|
||||
"enemy_1042_frostd": [1,1,0,0,7020],
|
||||
"enemy_1165_duhond": [1,1,0,76,3024],
|
||||
"enemy_1203_sfhu_2": [1,0,1,7943,2437],
|
||||
"enemy_1267_nhpbr_2": [24,14,8,11740,97532],
|
||||
"enemy_1270_nhstlk_2": [9,4,5,10826,94005],
|
||||
"enemy_1283_sgkill_2": [1,0,1,10291,7305],
|
||||
"enemy_1425_lrcmra": [1,0,1,1414,13093],
|
||||
"enemy_2008_flking": [1,0,1,8107,3573],
|
||||
"enemy_9006_actoxi": [12,5,5,5143,115747]
|
||||
"enemy_1203_sfhu_2": [1,0,1,7943,2116],
|
||||
"enemy_1267_nhpbr_2": [24,14,8,11693,116615],
|
||||
"enemy_1270_nhstlk_2": [9,4,5,10813,102658],
|
||||
"enemy_1283_sgkill_2": [1,0,1,10377,7305],
|
||||
"enemy_1425_lrcmra": [1,0,1,1414,11658],
|
||||
"enemy_2008_flking": [1,0,1,7628,3574],
|
||||
"enemy_9006_actoxi": [12,5,5,5143,137719]
|
||||
},
|
||||
"hooks": [1,67,5100,531,531,1890,1890,30,37,61,107,109,0,6763,40,30,53,22,1,39,3,0,0],
|
||||
"events": {"atk":703,"bounty":2,"deploy":14,"die":39,"dmg":1818,"fx":107,"heal":30,"layer":3,"leak":22,"skill":214,"spawn":65,"status":187},
|
||||
"hooks": [1,67,5100,542,542,1917,1917,30,36,60,109,110,0,7620,40,31,53,22,1,38,3,0,0],
|
||||
"events": {"atk":737,"bounty":2,"deploy":14,"die":38,"dmg":1846,"fx":107,"heal":30,"layer":3,"leak":22,"skill":217,"spawn":65,"status":185},
|
||||
"fx": {"blink":1,"buff":1,"coin":18,"explode":26,"garrison":3,"revive":2,"shield":19,"shieldBreak":1,"strike":10,"volley":7,"zone":19},
|
||||
"snaps": "757da7ba 23c3e301 44393780 f617c160 eeedb2b3 6f6317df 3ad26b55 5bd556aa 9c8c490d 4f3f479d 5a8c9a94 a5d5a70b d2bb0c6d 6cd3e449 f56e1feb c875393e 9def5afe"
|
||||
"snaps": "757da7ba 23c3e301 44393780 5d33fca3 778ce26f 3e05a037 632c144a 3ebbae7b 6b441959 3eb8ce65 aea6bfc5 ac090656 6255d971 7ca2ea90 891023ba 61b88830 61ed7aee"
|
||||
},
|
||||
"roster-028": {
|
||||
"about": "pass 1 band 4: chess_char_3_16_b chess_char_4_01_a chess_char_3_18_b chess_char_4_04_a chess_char_3_13_b chess_char_3_14_b chess_char_3_17_b chess_char_3_19_b chess_char_3_20_b chess_char_3_21_b chess_char_4_02_a chess_char_4_06_a token_10028_vigil_wolf",
|
||||
@@ -1769,39 +1769,39 @@
|
||||
"bossHpLeft": null,
|
||||
"rngDraws": 84,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {"p1":{"killed":3,"total":62,"perfect":false,"leaks":59,"leaksUncounted":0,"coins":0,"dmg":153737,"bossDmg":0,"heal":105,"deaths":26,"layerGains":{}}},
|
||||
"players": {"p1":{"killed":3,"total":62,"perfect":false,"leaks":59,"leaksUncounted":0,"coins":0,"dmg":157324,"bossDmg":0,"heal":105,"deaths":25,"layerGains":{}}},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_3_16_b",0,"none",0,0,4,0,70,4069,0,7,1],
|
||||
["p1",2,"op","chess_char_4_01_a",0,null,0,0,7,0,0,3614,0,0,0],
|
||||
["p1",3,"op","chess_char_3_18_b",0,"uniequip_003_vulpis",0,0,10,0,0,2743,105,0,0],
|
||||
["p1",4,"op","chess_char_4_04_a",0,null,0,0,90,0,13678,21701,0,34,4],
|
||||
["p1",4,"op","chess_char_4_04_a",0,null,799.54,1,90,0,15633,20901,0,35,5],
|
||||
["p1",5,"op","chess_char_3_13_b",0,"none",0,0,1,0,15809,1802,0,35,1],
|
||||
["p1",6,"op","chess_char_3_14_b",0,"none",0,0,87,1,23224,4151,0,27,1],
|
||||
["p1",7,"op","chess_char_3_17_b",0,"none",0,0,81,1,31808,7884,0,21,7],
|
||||
["p1",8,"op","chess_char_3_19_b",0,"uniequip_003_vigil",0,0,2,1,24320,2429,0,34,4],
|
||||
["p1",6,"op","chess_char_3_14_b",0,"none",0,0,83,1,25147,4151,0,29,1],
|
||||
["p1",7,"op","chess_char_3_17_b",0,"none",0,0,89,1,31808,7884,0,21,7],
|
||||
["p1",8,"op","chess_char_3_19_b",0,"uniequip_003_vigil",0,0,2,1,24320,2429,0,34,3],
|
||||
["p1",9,"op","chess_char_3_20_b",0,"none",0,0,9,0,4159,1897,0,11,1],
|
||||
["p1",10,"op","chess_char_3_21_b",0,"uniequip_003_archet",0,0,60,0,17805,4603,0,22,8],
|
||||
["p1",11,"op","chess_char_4_02_a",0,null,0,0,65,0,9310,5869,0,7,0],
|
||||
["p1",12,"op","chess_char_4_06_a",0,null,0,0,73,0,8278,3414,0,17,1],
|
||||
["p1",12,"op","chess_char_4_06_a",0,null,0,0,74,0,7987,3414,0,17,1],
|
||||
["p1",13,"token","token_10028_vigil_wolf",null,null,0,0,3,0,5276,3473,0,12,null]
|
||||
],
|
||||
"enemies": {
|
||||
"enemy_10044_wintun": [1,0,1,6689,14921],
|
||||
"enemy_10127_rkmbst_2": [1,0,1,1878,0],
|
||||
"enemy_1019_jshoot_2": [18,0,18,7782,16859],
|
||||
"enemy_1019_jshoot_2": [18,0,18,8026,19151],
|
||||
"enemy_1092_mdgint": [1,0,1,0,374],
|
||||
"enemy_1174_duholy_2": [1,0,1,1445,892],
|
||||
"enemy_1234_dsubrl": [1,0,1,4496,214],
|
||||
"enemy_1328_cbjedi": [1,0,1,0,267],
|
||||
"enemy_1381_winman": [21,3,18,7653,104478],
|
||||
"enemy_1389_winbab_2": [15,0,12,35466,15020],
|
||||
"enemy_1381_winman": [21,3,18,7318,106180],
|
||||
"enemy_1389_winbab_2": [15,0,12,34758,14615],
|
||||
"enemy_1509_mousek": [1,0,1,1686,0],
|
||||
"enemy_9006_actoxi": [1,0,1,554,712]
|
||||
},
|
||||
"hooks": [1,89,5100,399,399,503,519,30,30,86,28,28,0,4426,16,26,62,56,1,33,0,0,18],
|
||||
"events": {"atk":424,"deploy":27,"die":30,"dmg":495,"fx":84,"leak":56,"skill":56,"spawn":75,"status":77},
|
||||
"fx": {"camouflage":1,"crit":6,"dodge":18,"dp":4,"phase":1,"pulse":17,"sentry":9,"shadowWeave":9,"shield":4,"shieldBreak":2,"summon":2,"telegraph":1,"volley":6,"wolfShadowLost":3,"zone":1},
|
||||
"snaps": "7c092213 c094fdd0 61afa7ba 7ab796f5 0793fdee 51faaed8 4a46eeb8 4da2e9b0 57cbf8ad d370e410 155d413f 6fdd87fd 956855f7 70823bab 31442bc2 8416fed2 6ac1b28d"
|
||||
"hooks": [1,89,5100,404,404,513,529,30,29,85,28,28,0,4321,18,29,62,56,1,32,0,0,18],
|
||||
"events": {"atk":431,"deploy":27,"die":29,"dmg":505,"fx":84,"leak":56,"skill":56,"spawn":75,"status":83},
|
||||
"fx": {"camouflage":1,"crit":6,"dodge":18,"dp":3,"phase":1,"pulse":17,"sentry":8,"shadowWeave":11,"shield":4,"shieldBreak":2,"summon":2,"telegraph":1,"volley":6,"wolfShadowLost":3,"zone":1},
|
||||
"snaps": "7c092213 c094fdd0 61afa7ba 7ab796f5 181fca6b 71abad47 8bc283c6 0928fca3 2eb15bdf 35788dd1 8be98855 61cc5888 771b79b1 2212bef6 d09f87b0 fc2cc2ef d14c6547"
|
||||
},
|
||||
"roster-029": {
|
||||
"about": "pass 1 band 4: chess_char_4_17_a chess_char_4_18_a chess_char_4_11_a chess_char_4_12_a chess_char_4_19_a chess_char_4_07_a chess_char_4_16_a chess_char_4_09_a chess_char_4_10_a chess_char_4_13_a chess_char_4_14_a chess_char_4_20_a token_10041_cathy_catsld token_10041_cathy_catsld",
|
||||
@@ -2392,7 +2392,7 @@
|
||||
"hooks": [1,171,5928,875,875,4471,4472,570,160,160,28,22,57,16607,2339,99,157,0,1,162,2,0,0],
|
||||
"events": {"atk":1462,"bounty":4,"deploy":14,"die":160,"dmg":4472,"fx":109,"heal":476,"layer":2,"skill":50,"spawn":169,"status":484},
|
||||
"fx": {"aoe":13,"explode":1,"extraAttack":12,"garrison":2,"garrisonGrant":4,"overload":4,"reborn":2,"shieldBreak":60,"sleepGuard":3,"sunBurst":3,"talent":3,"undying":2},
|
||||
"snaps": "5650a99f 06b14bc4 3c7f90df cf359f4e 480510fd 8e81f273 ec14a81a 0825a60e e99490fb 7ad74476 4390230d b7c4e053 520f67e8 c3129ede 1c0767c5 ece8a0cf 9c740ad6 7ce51ab8 b1470a6b c5a3183e"
|
||||
"snaps": "5650a99f 06b14bc4 3c7f90df cf359f4e 7f409ef5 957fdbbb 569273e2 cb682916 c0778723 26f39f3e 59c6cbf5 1587263b 4a25f8a0 ccfcceb6 e38b8fdd 7df9d9d7 fefbca2e 276eab30 e0bc20b3 d59aebb6"
|
||||
},
|
||||
"roster-039": {
|
||||
"about": "pass 2 band 4: chess_char_3_12_a chess_char_3_12_b chess_char_3_18_a chess_char_3_18_b chess_char_3_04_a chess_char_3_05_a chess_char_3_04_b chess_char_3_05_b chess_char_3_01_a chess_char_3_19_a chess_char_3_21_a chess_char_3_01_b token_10028_vigil_wolf",
|
||||
@@ -2526,46 +2526,46 @@
|
||||
"time": 190,
|
||||
"ticks": 5700,
|
||||
"reason": "timeout",
|
||||
"killed": 45,
|
||||
"killed": 40,
|
||||
"total": 47,
|
||||
"unspawned": 0,
|
||||
"bossHpLeft": null,
|
||||
"rngDraws": 71,
|
||||
"rngDraws": 81,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {
|
||||
"p1": {"killed":45,"total":47,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":8,"dmg":541358,"bossDmg":0,"heal":28681,"deaths":8,"layerGains":{"visiShip":4}}
|
||||
"p1": {"killed":40,"total":47,"perfect":false,"leaks":7,"leaksUncounted":0,"coins":8,"dmg":505596,"bossDmg":0,"heal":35330,"deaths":6,"layerGains":{"visiShip":8}}
|
||||
},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_4_23_a",1,null,0,0,63,0,20498,4358,0,46,1],
|
||||
["p1",2,"op","chess_char_4_01_b",1,"none",0,0,9,0,9683,4991,0,103,2],
|
||||
["p1",3,"op","chess_char_4_19_a",1,null,0,0,65,0,793,5211,0,25,2],
|
||||
["p1",4,"op","chess_char_4_22_a",1,null,2022,1,7,0,2026,3449,665,60,1],
|
||||
["p1",5,"op","chess_char_4_12_b",1,"none",4562.3,1,11,1,25388,19969,14035,79,5],
|
||||
["p1",6,"op","chess_char_4_04_b",2,"uniequip_002_ines",2149,1,14,17,161270,3942,0,151,0],
|
||||
["p1",7,"op","chess_char_4_07_b",2,"none",0,0,52,1,31114,4466,0,47,2],
|
||||
["p1",8,"op","chess_char_4_09_b",2,"uniequip_004_mizuki",1756,1,1,1,11414,790,0,4,2],
|
||||
["p1",9,"op","chess_char_4_20_a",1,null,1217,1,2,2,33467,0,0,78,3],
|
||||
["p1",10,"op","chess_char_4_24_a",2,null,1726,1,3,15,193080,0,0,40,4],
|
||||
["p1",11,"op","chess_char_4_25_a",1,null,1221,1,4,5,27266,0,867,0,3],
|
||||
["p1",12,"op","chess_char_4_02_b",1,"none",2966.25,1,5,3,25359,0,0,9,2],
|
||||
["p1","~1","token","char_613_acmedc",null,null,1314,1,13,0,0,0,13114,38,2]
|
||||
["p1",1,"op","chess_char_4_23_a",1,null,0,0,59,0,14296,4358,0,37,1],
|
||||
["p1",2,"op","chess_char_4_01_b",1,"none",2261.07,1,9,1,12965,2729,0,125,2],
|
||||
["p1",3,"op","chess_char_4_19_a",1,null,847.88,1,65,0,1103,4894,0,25,2],
|
||||
["p1",4,"op","chess_char_4_22_a",1,null,2022,1,7,0,2567,2035,1080,66,1],
|
||||
["p1",5,"op","chess_char_4_12_b",1,"none",4562.3,1,11,1,35031,22559,14453,82,5],
|
||||
["p1",6,"op","chess_char_4_04_b",2,"uniequip_002_ines",2149,1,14,7,116578,7728,0,130,0],
|
||||
["p1",7,"op","chess_char_4_07_b",2,"none",0,0,52,2,32885,4466,0,49,2],
|
||||
["p1",8,"op","chess_char_4_09_b",2,"uniequip_004_mizuki",1756,1,1,1,12149,527,0,5,1],
|
||||
["p1",9,"op","chess_char_4_20_a",1,null,1217,1,2,3,31008,0,0,78,3],
|
||||
["p1",10,"op","chess_char_4_24_a",2,null,1726,1,3,17,187142,0,0,41,4],
|
||||
["p1",11,"op","chess_char_4_25_a",1,null,1221,1,4,5,29495,0,2741,0,3],
|
||||
["p1",12,"op","chess_char_4_02_b",1,"none",2966.25,1,5,3,30378,1420,0,11,2],
|
||||
["p1","~1","token","char_613_acmedc",null,null,1314,1,13,0,0,0,17056,42,2]
|
||||
],
|
||||
"enemies": {
|
||||
"enemy_1001_bigbo": [1,1,0,2989,17600],
|
||||
"enemy_1001_bigbo": [1,1,0,2149,17600],
|
||||
"enemy_10097_crshd": [1,1,0,0,8000],
|
||||
"enemy_1045_hammer": [1,1,0,532,8000],
|
||||
"enemy_1045_hammer_2": [6,5,0,18084,80871],
|
||||
"enemy_1061_zomshd": [33,32,0,18697,398075],
|
||||
"enemy_1045_hammer": [1,1,0,307,8000],
|
||||
"enemy_1045_hammer_2": [6,5,0,18440,80250],
|
||||
"enemy_1061_zomshd": [33,27,1,25211,362935],
|
||||
"enemy_1166_dusbr": [1,1,0,0,2400],
|
||||
"enemy_1204_msfhu_2": [1,1,0,0,6],
|
||||
"enemy_1288_duskls_2": [1,1,0,162,4805],
|
||||
"enemy_1427_lrnazg": [1,1,0,1121,12000],
|
||||
"enemy_2010_csdcr": [1,1,0,4800,9600]
|
||||
"enemy_2010_csdcr": [1,1,0,2800,9600]
|
||||
},
|
||||
"hooks": [1,65,5700,1041,1041,1305,1328,24816,53,54,29,24,51,27317,95,66,47,0,1,56,1,0,4],
|
||||
"events": {"atk":1225,"bounty":4,"deploy":18,"die":54,"dmg":1300,"fx":182,"heal":80,"layer":1,"skill":52,"spawn":60,"status":312},
|
||||
"fx": {"aoe":2,"beam":1,"buff":2,"devour":4,"displace":9,"dodge":4,"ember":1,"garrison":1,"garrisonGrant":1,"link":3,"mote":95,"overload":3,"reweave":3,"riposte":1,"ripple":2,"sentry":2,"shadowWeave":36,"shield":3,"snow":1,"summon":1,"wake":5,"zone":2},
|
||||
"snaps": "87882f34 f1ef51b0 5ea73197 12103e8c 818a5853 956bc926 be6e41f1 a6a97d2e cc564966 60951dea 6abcabef 03a15c0a 423ff378 86ed9d2c 418af211 a4b6d673 219708b9 f4db72c1 4a7f5c48"
|
||||
"hooks": [1,65,5700,1112,1112,1391,1406,25126,46,48,28,23,74,26265,88,62,47,1,1,47,2,0,5],
|
||||
"events": {"atk":1301,"bounty":4,"deploy":18,"die":47,"dmg":1362,"fx":173,"heal":138,"layer":2,"leak":1,"skill":50,"spawn":60,"status":296},
|
||||
"fx": {"aoe":2,"beam":1,"buff":2,"devour":4,"displace":9,"dodge":5,"ember":1,"garrison":2,"garrisonGrant":1,"link":3,"mote":98,"overload":3,"reweave":3,"riposte":1,"ripple":1,"sentry":2,"shadowWeave":25,"shield":1,"snow":1,"summon":1,"wake":5,"zone":2},
|
||||
"snaps": "87882f34 f1ef51b0 5ea73197 12103e8c 818a5853 3e0a8b9b d26d3b6f d825f5c7 4ebd0c03 1c2642fe 57081f03 a2c42970 e8c109bb 4c501122 d3565c79 48a49749 f630ef04 87c6d1fa 5ce6a9f2"
|
||||
},
|
||||
"roster-042": {
|
||||
"about": "pass 2 band 5: chess_char_4_17_b chess_char_4_18_b chess_char_4_23_b chess_char_4_19_b chess_char_4_22_b chess_char_5_01_a chess_char_4_16_b chess_char_4_13_b chess_char_4_20_b chess_char_4_24_b chess_char_4_25_b chess_char_5_02_a",
|
||||
@@ -2576,14 +2576,14 @@
|
||||
"round": 10,
|
||||
"seed": 3609857679,
|
||||
"waveId": "act1autochess_h03",
|
||||
"time": 187.37,
|
||||
"ticks": 5621,
|
||||
"time": 161.57,
|
||||
"ticks": 4847,
|
||||
"reason": "cleared",
|
||||
"killed": 59,
|
||||
"total": 59,
|
||||
"unspawned": 0,
|
||||
"bossHpLeft": null,
|
||||
"rngDraws": 76,
|
||||
"rngDraws": 64,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {
|
||||
"p1": {
|
||||
@@ -2593,26 +2593,26 @@
|
||||
"leaks": 0,
|
||||
"leaksUncounted": 0,
|
||||
"coins": 8,
|
||||
"dmg": 704717,
|
||||
"dmg": 704844,
|
||||
"bossDmg": 0,
|
||||
"heal": 28297,
|
||||
"deaths": 6,
|
||||
"heal": 28019,
|
||||
"deaths": 3,
|
||||
"layerGains": {"preciShip":80,"sargonShip":108}
|
||||
}
|
||||
},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_4_17_b",2,"none",4566.9,1,3,0,0,0,0,0,0],
|
||||
["p1",2,"op","chess_char_4_18_b",2,"none",6783,1,5,0,7312,0,0,3,1],
|
||||
["p1",3,"op","chess_char_4_23_b",1,"uniequip_004_gvial2",3667.3,1,7,1,23562,289,0,15,2],
|
||||
["p1",4,"op","chess_char_4_19_b",1,"none",2525.9,1,10,1,16758,1484,0,12,6],
|
||||
["p1",5,"op","chess_char_4_22_b",1,"uniequip_002_svrash",3311.96,1,11,5,47290,11132,7203,57,1],
|
||||
["p1",6,"op","chess_char_5_01_a",2,null,0,0,77,3,54310,12701,5030,73,2],
|
||||
["p1",7,"op","chess_char_4_16_b",1,"none",1922.7,1,78,7,96260,7396,1628,113,0],
|
||||
["p1",8,"op","chess_char_4_13_b",2,"uniequip_004_gnosis",2553.2,1,8,5,31973,0,0,42,3],
|
||||
["p1",9,"op","chess_char_4_20_b",1,"none",1844.7,1,9,24,149465,1023,0,72,3],
|
||||
["p1",10,"op","chess_char_4_24_b",2,"none",2571.4,1,12,4,142472,7106,1265,37,4],
|
||||
["p1",11,"op","chess_char_4_25_b",1,"uniequip_002_cetsyr",2172.3,1,4,0,19289,0,922,0,3],
|
||||
["p1",12,"op","chess_char_5_02_a",1,null,1570.4,1,6,8,116026,633,12249,30,5],
|
||||
["p1",1,"op","chess_char_4_17_b",2,"none",4566.9,1,3,1,1288,0,0,2,0],
|
||||
["p1",2,"op","chess_char_4_18_b",2,"none",6783,1,5,0,7191,0,0,3,1],
|
||||
["p1",3,"op","chess_char_4_23_b",1,"uniequip_004_gvial2",3667.3,1,7,1,7785,649,0,3,2],
|
||||
["p1",4,"op","chess_char_4_19_b",1,"none",2525.9,1,10,1,8997,1531,0,0,4],
|
||||
["p1",5,"op","chess_char_4_22_b",1,"uniequip_002_svrash",3339.7,1,11,3,40105,9401,4764,46,1],
|
||||
["p1",6,"op","chess_char_5_01_a",2,null,1722.46,1,40,4,78323,9642,6250,66,1],
|
||||
["p1",7,"op","chess_char_4_16_b",1,"none",507.1,1,71,7,97453,7002,1741,95,0],
|
||||
["p1",8,"op","chess_char_4_13_b",2,"uniequip_004_gnosis",2553.2,1,8,4,31086,0,0,39,3],
|
||||
["p1",9,"op","chess_char_4_20_b",1,"none",1844.7,1,9,21,131494,1023,0,64,3],
|
||||
["p1",10,"op","chess_char_4_24_b",2,"none",2571.4,1,12,10,154430,6521,646,37,3],
|
||||
["p1",11,"op","chess_char_4_25_b",1,"uniequip_002_cetsyr",2172.3,1,4,0,19289,0,1552,0,3],
|
||||
["p1",12,"op","chess_char_5_02_a",1,null,1570.4,1,6,7,127404,903,13066,30,3],
|
||||
["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null],
|
||||
["-","~2","device","trap_1105_accrate",null,null,100,1,2,0,0,0,0,0,null]
|
||||
],
|
||||
@@ -2620,19 +2620,19 @@
|
||||
"enemy_10054_cjhot": [1,1,0,675,17280],
|
||||
"enemy_10141_xdpeng_2": [1,1,0,19,11520],
|
||||
"enemy_1112_emppnt_2": [1,1,0,0,18432],
|
||||
"enemy_1183_mlasrt": [1,1,0,694,7488],
|
||||
"enemy_1183_mlasrt": [1,1,0,573,7488],
|
||||
"enemy_1249_lysdb_2": [1,1,0,0,6912],
|
||||
"enemy_1267_nhpbr_2": [33,33,0,8379,209088],
|
||||
"enemy_1270_nhstlk_2": [12,12,0,9679,221184],
|
||||
"enemy_1272_nhtank_2": [6,6,0,10640,103680],
|
||||
"enemy_1329_cbshld_2": [1,1,0,1316,14976],
|
||||
"enemy_1267_nhpbr_2": [33,33,0,9577,209088],
|
||||
"enemy_1270_nhstlk_2": [12,12,0,6539,221184],
|
||||
"enemy_1272_nhtank_2": [6,6,0,7102,103680],
|
||||
"enemy_1329_cbshld_2": [1,1,0,1824,14976],
|
||||
"enemy_1512_mcmstr": [1,1,0,5044,92160],
|
||||
"enemy_9008_acbunn": [1,1,0,1373,13824]
|
||||
},
|
||||
"hooks": [1,78,5621,580,580,1348,1362,1848,68,65,30,30,5,20173,2244,41,59,0,1,75,51,1,9],
|
||||
"events": {"atk":686,"bounty":4,"deploy":17,"die":65,"dmg":1189,"fx":216,"heal":176,"layer":51,"skill":57,"spawn":73,"status":332},
|
||||
"fx": {"aoe":6,"bombard":5,"bombardShell":5,"burst":1,"coldWind":3,"devour":4,"displace":2,"dodge":9,"explode":26,"extraAttack":12,"garrison":27,"garrisonGrant":1,"iceSpike":3,"link":3,"mote":42,"overload":2,"revive":1,"reweave":3,"riposte":1,"rockfall":1,"shieldBreak":2,"sleepGuard":5,"snow":1,"stone":1,"swordStorm":7,"telegraph":2,"zone":41},
|
||||
"snaps": "df8e82b1 398be261 233cef48 1f5fb384 311354a9 c24bdec8 8377744e e3afac11 b689d92f e700afba d0b5af43 a951cda4 9910148c 426ede53 62f8e3cf 1e009531 a403986e 8914590b 5f99002b"
|
||||
"hooks": [1,76,4847,498,498,1282,1296,1302,65,62,24,23,16,17319,1994,40,59,0,1,70,51,1,7],
|
||||
"events": {"atk":626,"bounty":4,"deploy":15,"die":62,"dmg":1130,"fx":198,"heal":190,"layer":51,"skill":45,"spawn":73,"status":282},
|
||||
"fx": {"aoe":4,"bombard":5,"bombardShell":5,"burst":1,"coldWind":3,"devour":3,"dodge":7,"explode":26,"extraAttack":15,"garrison":27,"garrisonGrant":1,"iceSpike":3,"link":3,"mote":34,"overload":2,"revive":1,"reweave":3,"rockfall":1,"shieldBreak":2,"sleepGuard":3,"snow":1,"stone":1,"swordStorm":6,"telegraph":2,"zone":39},
|
||||
"snaps": "df8e82b1 ae59b91a b9e69aee 54684398 674617d0 34b43454 c92732bf 0e99eaf5 8765e347 0fd635f1 8c0e28af 894e7e4c 5c1b51a6 06c6f096 9f044d2f cdcf9624 280f77ba"
|
||||
},
|
||||
"roster-043": {
|
||||
"about": "pass 2 band 5: chess_char_5_08_a chess_char_5_11_a chess_char_5_05_a chess_char_5_06_a chess_char_5_13_a chess_char_5_14_a chess_char_5_07_a chess_char_5_17_a chess_char_5_03_a chess_char_5_10_a chess_char_5_12_a chess_char_5_15_a",
|
||||
@@ -2706,61 +2706,61 @@
|
||||
"total": 119,
|
||||
"unspawned": 0,
|
||||
"bossHpLeft": null,
|
||||
"rngDraws": 109,
|
||||
"rngDraws": 118,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {"p1":{"killed":95,"total":119,"perfect":false,"leaks":24,"leaksUncounted":0,"coins":8,"dmg":3011163,"bossDmg":0,"heal":31467,"deaths":20,"layerGains":{}}},
|
||||
"players": {"p1":{"killed":95,"total":119,"perfect":false,"leaks":24,"leaksUncounted":0,"coins":8,"dmg":3018146,"bossDmg":0,"heal":35937,"deaths":18,"layerGains":{}}},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_5_19_a",1,null,3241,1,169,2,24149,13260,622,14,3],
|
||||
["p1",2,"op","chess_char_5_11_b",2,"none",0,0,167,2,15973,25963,24095,35,4],
|
||||
["p1",3,"op","chess_char_5_19_b",1,"uniequip_002_mlynar",0,0,140,4,88930,12652,244,31,4],
|
||||
["p1",4,"op","chess_char_5_13_b",2,"uniequip_004_ghost2",3412.8,1,9,4,154074,22473,455,28,2],
|
||||
["p1",5,"op","chess_char_5_14_b",2,"none",1994,1,170,13,239458,15503,2873,68,5],
|
||||
["p1",6,"op","chess_char_5_17_b",2,"none",2578,1,168,1,176662,12727,801,56,4],
|
||||
["p1",7,"op","chess_char_5_20_a",1,null,1108,1,3,1,48492,1688,354,422,6],
|
||||
["p1",8,"op","chess_char_5_22_a",2,null,1237,1,80,13,116200,5280,409,119,3],
|
||||
["p1",9,"op","chess_char_5_12_b",2,"uniequip_004_dusk",1667,1,13,3,338982,0,0,61,2],
|
||||
["p1",10,"op","chess_char_5_15_b",2,"uniequip_002_thorn2",1170,1,14,40,1339578,0,0,166,5],
|
||||
["p1",11,"op","chess_char_5_20_b",1,"uniequip_004_aglina",1292,1,5,3,105170,1688,354,485,5],
|
||||
["p1",12,"op","chess_char_5_22_b",2,"none",1511,1,11,8,352359,1913,384,170,4],
|
||||
["p1",1,"op","chess_char_5_19_a",1,null,3241,1,170,6,41920,10068,671,40,4],
|
||||
["p1",2,"op","chess_char_5_11_b",2,"none",2158.57,1,166,2,8769,26194,28550,47,4],
|
||||
["p1",3,"op","chess_char_5_19_b",1,"uniequip_002_mlynar",3907,1,169,5,79077,11906,185,30,3],
|
||||
["p1",4,"op","chess_char_5_13_b",2,"uniequip_004_ghost2",3412.8,1,9,9,173197,20999,313,26,2],
|
||||
["p1",5,"op","chess_char_5_14_b",2,"none",1994,1,168,14,252711,17613,3099,77,5],
|
||||
["p1",6,"op","chess_char_5_17_b",2,"none",2578,1,167,0,219089,14055,747,63,4],
|
||||
["p1",7,"op","chess_char_5_20_a",1,null,1108,1,3,2,42682,1688,354,363,5],
|
||||
["p1",8,"op","chess_char_5_22_a",2,null,1237,1,81,3,114426,5280,409,116,3],
|
||||
["p1",9,"op","chess_char_5_12_b",2,"uniequip_004_dusk",1667,1,13,2,320533,0,0,60,2],
|
||||
["p1",10,"op","chess_char_5_15_b",2,"uniequip_002_thorn2",1170,1,14,32,1282681,0,0,166,6],
|
||||
["p1",11,"op","chess_char_5_20_b",1,"uniequip_004_aglina",1292,1,5,5,142575,1688,354,535,6],
|
||||
["p1",12,"op","chess_char_5_22_b",2,"none",1511,1,11,11,327938,1913,384,160,3],
|
||||
["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null],
|
||||
["-","~2","device","trap_1105_accrate",null,null,100,1,2,0,0,0,0,0,null],
|
||||
["p1","~1","token","token_10015_dusk_drgn",null,null,0,0,32,0,478,2040,43,2,null],
|
||||
["p1","~2","token","token_10015_dusk_drgn",null,null,0,0,34,0,1106,2108,111,4,null],
|
||||
["p1","~3","token","token_10015_dusk_drgn",null,null,0,0,42,0,398,2049,52,2,null],
|
||||
["p1","~4","token","token_10015_dusk_drgn",null,null,0,0,44,0,796,2073,76,4,null],
|
||||
["p1","~5","token","token_10015_dusk_drgn",null,null,0,0,52,0,995,2129,132,5,null],
|
||||
["p1","~6","token","token_10015_dusk_drgn",null,null,0,0,58,0,398,1997,0,2,null],
|
||||
["p1","~7","token","token_10015_dusk_drgn",null,null,0,0,62,0,398,1997,0,2,null],
|
||||
["p1","~8","token","token_10015_dusk_drgn",null,null,0,0,65,0,597,1997,0,3,null],
|
||||
["p1","~9","token","token_10015_dusk_drgn",null,null,0,0,69,0,438,1997,0,2,null],
|
||||
["p1","~10","token","token_10015_dusk_drgn",null,null,0,0,75,0,1473,2182,185,6,null],
|
||||
["p1","~11","token","token_10015_dusk_drgn",null,null,0,0,141,0,398,2020,23,2,null],
|
||||
["p1","~12","token","token_10015_dusk_drgn",null,null,0,0,146,0,199,1997,0,1,null],
|
||||
["p1","~13","token","token_10015_dusk_drgn",null,null,0,0,149,0,398,2052,55,2,null],
|
||||
["p1","~14","token","token_10015_dusk_drgn",null,null,0,0,152,0,876,2072,75,4,null],
|
||||
["p1","~15","token","token_10015_dusk_drgn",null,null,0,0,155,0,199,2004,7,1,null],
|
||||
["p1","~16","token","token_10015_dusk_drgn",null,null,0,0,158,0,398,2032,35,2,null],
|
||||
["p1","~17","token","token_10015_dusk_drgn",null,null,0,0,160,0,597,2080,83,3,null],
|
||||
["p1","~18","token","token_10015_dusk_drgn",null,null,0,0,163,1,556,1997,0,3,null],
|
||||
["p1","~19","token","token_10015_dusk_drgn",null,null,0,0,165,0,438,1997,0,2,null]
|
||||
["p1","~3","token","token_10015_dusk_drgn",null,null,0,0,42,0,465,2049,52,2,null],
|
||||
["p1","~4","token","token_10015_dusk_drgn",null,null,0,0,44,0,1087,2073,76,4,null],
|
||||
["p1","~5","token","token_10015_dusk_drgn",null,null,0,0,52,0,1192,2096,99,4,null],
|
||||
["p1","~6","token","token_10015_dusk_drgn",null,null,0,0,57,0,884,1997,0,3,null],
|
||||
["p1","~7","token","token_10015_dusk_drgn",null,null,0,0,60,1,309,1997,0,2,null],
|
||||
["p1","~8","token","token_10015_dusk_drgn",null,null,0,0,63,0,199,1997,0,1,null],
|
||||
["p1","~9","token","token_10015_dusk_drgn",null,null,0,0,66,0,597,1997,0,3,null],
|
||||
["p1","~10","token","token_10015_dusk_drgn",null,null,0,0,70,0,398,1997,0,2,null],
|
||||
["p1","~11","token","token_10015_dusk_drgn",null,null,0,0,76,0,398,2053,56,2,null],
|
||||
["p1","~12","token","token_10015_dusk_drgn",null,null,0,0,85,0,1672,2201,204,7,null],
|
||||
["p1","~13","token","token_10015_dusk_drgn",null,null,0,0,142,0,548,2040,43,2,null],
|
||||
["p1","~14","token","token_10015_dusk_drgn",null,null,0,0,148,0,568,1997,0,2,null],
|
||||
["p1","~15","token","token_10015_dusk_drgn",null,null,0,0,151,1,487,1997,0,2,null],
|
||||
["p1","~16","token","token_10015_dusk_drgn",null,null,0,0,154,0,488,1997,0,2,null],
|
||||
["p1","~17","token","token_10015_dusk_drgn",null,null,0,0,158,0,438,2024,27,2,null],
|
||||
["p1","~18","token","token_10015_dusk_drgn",null,null,0,0,162,0,597,2082,85,3,null],
|
||||
["p1","~19","token","token_10015_dusk_drgn",null,null,0,0,164,0,637,2072,75,3,null]
|
||||
],
|
||||
"enemies": {
|
||||
"enemy_10042_prtrop_2": [1,1,0,1722,23888],
|
||||
"enemy_1010_demon": [42,38,4,35898,908980],
|
||||
"enemy_1010_demon": [42,39,3,34740,915010],
|
||||
"enemy_10122_uacann_2": [1,1,0,20128,29860],
|
||||
"enemy_1072_dlancer": [1,1,0,0,17916],
|
||||
"enemy_1172_dugago_2": [1,0,1,0,3181],
|
||||
"enemy_1172_dugago_2": [1,0,1,0,26334],
|
||||
"enemy_1229_darmy": [1,1,0,0,12541],
|
||||
"enemy_1325_cbgpro": [1,1,0,26,11347],
|
||||
"enemy_1422_lrsldr_2": [45,42,3,9910,721419],
|
||||
"enemy_1425_lrcmra_2": [24,9,14,81546,1218916],
|
||||
"enemy_1502_crowns": [1,1,0,345,17916],
|
||||
"enemy_2085_skzjxd": [1,0,1,0,80709]
|
||||
"enemy_1325_cbgpro": [1,1,0,0,11347],
|
||||
"enemy_1422_lrsldr_2": [45,44,1,7640,733059],
|
||||
"enemy_1425_lrcmra_2": [24,6,16,84209,1218986],
|
||||
"enemy_1502_crowns": [1,1,0,105,17916],
|
||||
"enemy_2085_skzjxd": [1,0,1,0,46993]
|
||||
},
|
||||
"hooks": [1,170,6900,1907,1907,4938,4946,5521,134,157,47,46,0,25479,2706,128,119,23,1,139,0,0,2],
|
||||
"events": {"atk":2326,"bounty":4,"deploy":49,"die":134,"dmg":4946,"fx":145,"heal":159,"leak":23,"skill":93,"spawn":152,"status":854},
|
||||
"fx": {"blink":1,"crit":22,"displace":48,"dodge":2,"explode":5,"sp":10,"substitute":5,"summon":19,"swap":5,"teleport":8,"zone":20},
|
||||
"snaps": "a39ea9a8 bfa57bde ec3fe789 c7d4ea14 9988c3e2 046a17f4 b4ddd38e 83f0c4f7 9f6c2929 0a8327df 47a2dd8d 53a15cd2 b2be7dcf 2354387f c0cfd00e b918b3d8 a922234d 3092e45a f843a4b4 cb2e92b1 caa33c46 e3465aed 912f73d5"
|
||||
"hooks": [1,170,6900,1918,1918,4902,4909,5719,132,154,47,45,0,25779,2989,124,119,22,1,137,0,0,0],
|
||||
"events": {"atk":2318,"bounty":4,"deploy":49,"die":132,"dmg":4909,"fx":157,"heal":184,"leak":22,"skill":92,"spawn":152,"status":994},
|
||||
"fx": {"blink":1,"crit":32,"displace":50,"explode":5,"sp":11,"substitute":5,"summon":19,"swap":4,"teleport":7,"zone":23},
|
||||
"snaps": "a39ea9a8 bfa57bde 89563252 8ba66818 998a211d 76b14513 de620c53 552a0e22 d75b8428 6c8176a4 0236875a e53ed4ed 7b8341a1 b6f98849 903b578d 1eafabb5 6a3bec05 50df365f f9cc0152 80b49859 38eb3ad9 89da21b3 f47d6380"
|
||||
},
|
||||
"roster-045": {
|
||||
"about": "pass 2 band 6: chess_char_6_03_a chess_char_6_06_a chess_char_6_07_a chess_char_6_01_a chess_char_6_02_a chess_char_6_04_a chess_char_6_05_a chess_char_6_08_a chess_char_6_09_a chess_char_6_11_a chess_char_6_12_a chess_char_6_13_a token_10017_skadi2_dedant",
|
||||
|
||||
@@ -7,6 +7,9 @@
|
||||
// One more since 2026-10-04 (the owner's decision after GitHub issue #32 item 1, DESIGN §22.10): 余 S2 厚礼上宾 casts with an
|
||||
// enemy on its own 技能范围 x-1 — SKILL_RANGE, customRangeGrid its range (his attack range is his own tile, so the basic
|
||||
// strategy could not see an enemy he can pull); `rawRule` keeps TAKE_DAMAGE.
|
||||
// And since 0.2.0 (the owner's decision of 2026-10-05): 深巡 S2's running range 3-2 strictly contains her 2-2, so the
|
||||
// owner's ACTIVE_RANGE rule applies on top of her DEFAULT deviation — she casts with an enemy in the 3-2 (rule
|
||||
// ACTIVE_RANGE, customRangeGrid the 3-2, rawRule still TAKE_DAMAGE; test/sim/feedback5-active-range.test.js).
|
||||
//
|
||||
// The battle check is real: the chess records of data/chess.json with their kits, the stage 战场#01(下半)
|
||||
// (act2autochess_m01), a real enemy (萨卡兹枯朽前锋, melee, 0.8 tiles/s) walking the lane from the gate (9,10) to the
|
||||
@@ -32,6 +35,8 @@ const DEVIATED = [
|
||||
['chess_char_2_18_a', 'skcom_atk_up[3]'], // 灰毫 S1 攻击力强化·γ型
|
||||
['chess_char_2_18_a', 'skchr_ashlok_2'], // 灰毫 S2 专注轰击
|
||||
];
|
||||
/** The deviated skill whose running range strictly contains the own one: ACTIVE_RANGE on top (0.2.0). */
|
||||
const ACTIVE = new Set(['skchr_udflow_2']);
|
||||
/** 余 S2 厚礼上宾: SKILL_RANGE on its own x-1 (DESIGN §22.10). */
|
||||
const SKILL_RANGE_DEVIATED = [['chess_char_6_03_a', 'skchr_yu_2']];
|
||||
const both = (normalId) => [normalId, CHESS[normalId].goldenId];
|
||||
@@ -70,16 +75,17 @@ function firstCast(chessId, skillId, { spawnAt = 0, seconds = 40 } = {}) {
|
||||
return out;
|
||||
}
|
||||
|
||||
test('data: the six deviated 重装 skills are DEFAULT and 余 S2 is SKILL_RANGE on its x-1, on the normal and the elite record, rawRule the official TAKE_DAMAGE', () => {
|
||||
test('data: the six deviated 重装 skills are DEFAULT (深巡 S2: ACTIVE_RANGE on its 3-2) and 余 S2 is SKILL_RANGE on its x-1, on the normal and the elite record, rawRule the official TAKE_DAMAGE', () => {
|
||||
let n = 0;
|
||||
for (const [normalId, skillId] of DEVIATED) {
|
||||
for (const id of both(normalId)) {
|
||||
const s = CHESS[id].skills.find((x) => x.skillId === skillId);
|
||||
assert.ok(s, `${id} ${skillId}`);
|
||||
assert.equal(CHESS[id].profession, 'TANK');
|
||||
assert.deepEqual(s.trigger, { rule: 'DEFAULT', rawRule: 'TAKE_DAMAGE', customRangeGrid: null }, `${id} ${skillId}`);
|
||||
const want = ACTIVE.has(skillId) ? { rule: 'ACTIVE_RANGE', rawRule: 'TAKE_DAMAGE', customRangeGrid: s.rangeGrid } : { rule: 'DEFAULT', rawRule: 'TAKE_DAMAGE', customRangeGrid: null };
|
||||
assert.deepEqual(s.trigger, want, `${id} ${skillId}`);
|
||||
// the sim's loadout def carries the data rule
|
||||
assert.equal(ds.getChess(id, { skillIndex: s.index }).skill.trigger.rule, 'DEFAULT', `${id} ${skillId} loadout def`);
|
||||
assert.equal(ds.getChess(id, { skillIndex: s.index }).skill.trigger.rule, want.rule, `${id} ${skillId} loadout def`);
|
||||
n++;
|
||||
}
|
||||
}
|
||||
@@ -110,7 +116,7 @@ test('data: the six deviated 重装 skills are DEFAULT and 余 S2 is SKILL_RANGE
|
||||
for (const c of others) assert.deepEqual(c.skills.find((s) => s.skillId === 'skcom_atk_up[3]').trigger, { rule: 'DEFAULT', rawRule: 'DEFAULT', customRangeGrid: null }, c.chessId);
|
||||
});
|
||||
|
||||
test('PR #12\'s kit lines agree with the data: 深巡 / 雷蛇 S2 specs say DEFAULT, the other deviated skills read the data', async () => {
|
||||
test('PR #12\'s kit line agrees with the data: 雷蛇 S2\'s spec says DEFAULT, the other deviated skills (深巡 S2 since 0.2.0) read the data', async () => {
|
||||
const { KITS } = await import('../../server/sim/content/index.js');
|
||||
for (const [normalId, skillId] of [...DEVIATED, ...SKILL_RANGE_DEVIATED]) {
|
||||
for (const id of both(normalId)) {
|
||||
@@ -121,21 +127,24 @@ test('PR #12\'s kit lines agree with the data: 深巡 / 雷蛇 S2 specs say DEFA
|
||||
const spec = s.isDefault ? kit?.skill : kit?.skills?.[skillId];
|
||||
const specRule = typeof spec?.trigger === 'string' ? spec.trigger : spec?.trigger?.rule;
|
||||
assert.ok(specRule == null || specRule === s.trigger.rule, `${id} ${skillId}: kit ${specRule} vs data ${s.trigger.rule}`);
|
||||
if (skillId === 'skchr_udflow_2' || skillId === 'skchr_liskam_2') assert.equal(specRule, 'DEFAULT', `${id} ${skillId}: PR #12's trigger line`);
|
||||
if (skillId === 'skchr_liskam_2') assert.equal(specRule, 'DEFAULT', `${id} ${skillId}: PR #12's trigger line`);
|
||||
if (skillId === 'skchr_udflow_2') assert.equal(specRule, undefined, `${id} ${skillId}: reads the data's ACTIVE_RANGE (PR #12's line would keep the 2-2)`);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
test('real battle: each deviated skill casts with an enemy in range before anything hits the operator (normal + elite)', () => {
|
||||
test('real battle: each deviated skill casts with an enemy in range before anything hits the operator (normal + elite; 深巡 S2 in its 3-2)', () => {
|
||||
for (const [normalId, skillId] of DEVIATED) {
|
||||
for (const id of both(normalId)) {
|
||||
const r = firstCast(id, skillId, { spawnAt: 3 });
|
||||
const where = `${id} ${skillId}: ${JSON.stringify(r)}`;
|
||||
assert.equal(r.rule, 'DEFAULT', where);
|
||||
const rule = ACTIVE.has(skillId) ? 'ACTIVE_RANGE' : 'DEFAULT';
|
||||
assert.equal(r.rule, rule, where);
|
||||
assert.ok(r.cast != null, `never cast — ${where}`);
|
||||
assert.ok(r.cast >= 3, `no cast before an enemy is on the field — ${where}`);
|
||||
assert.equal(r.reason, 'DEFAULT', where);
|
||||
assert.ok(r.enemyInRange, `an enemy on its initial range at the cast — ${where}`);
|
||||
assert.equal(r.reason, rule, where);
|
||||
if (ACTIVE.has(skillId)) assert.ok(r.enemyInSkillRange && !r.enemyInRange, `an enemy on the 3-2, not yet on the 2-2, at the cast — ${where}`);
|
||||
else assert.ok(r.enemyInRange, `an enemy on its initial range at the cast — ${where}`);
|
||||
assert.ok(r.hurt == null || r.hurt > r.cast, `cast before the first hit — ${where}`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,14 +40,16 @@ const laneDirs = (st, r, c) => DIRS.filter((d) => [[0, 1], [0, 2]].some(([dr, dc
|
||||
/**
|
||||
* One battle: the operator alone on (r, c) facing `dir` against a real round template. Returns its attacks, the ticks a
|
||||
* targetable enemy stood on its range tiles, the longest wait for an attack while one did and it could act (seconds
|
||||
* beyond its attack interval) and the ticks it blocked anything.
|
||||
* beyond its attack interval — the longer of the interval when the wait began and now: her S2 casts on its 3-2 between
|
||||
* two attacks since 0.2.0, the owner's ACTIVE_RANGE rule, and its ASPD shortens the interval while the cooldown the
|
||||
* last attack set still runs) and the ticks it blocked anything.
|
||||
*/
|
||||
function watch(stageId, chessId, r, c, dir, { template = 'act1autochess_02', seconds = 45 } = {}) {
|
||||
const h = makeBattle({ stageId, waveTemplate: template, units: [{ chessId, row: r, col: c, dir }], seed: 5 });
|
||||
h.step(1);
|
||||
const u = h.unit(chessId);
|
||||
assert.ok(u && u.deployed && u.tileR === r && u.tileC === c, `${stageId} (${r},${c}) deployed`);
|
||||
let attacks = 0, inRange = 0, blocked = 0, waitFrom = null, worst = 0;
|
||||
let attacks = 0, inRange = 0, blocked = 0, waitFrom = null, waitIv = 0, worst = 0;
|
||||
h.b.on('attack', (ctx) => { if (ctx.attacker === u) { attacks++; waitFrom = null; } });
|
||||
for (let i = 0; i < seconds * 30 && !h.b.finished; i++) {
|
||||
h.step(1);
|
||||
@@ -58,8 +60,8 @@ function watch(stageId, chessId, r, c, dir, { template = 'act1autochess_02', sec
|
||||
const target = h.b.enemies.some((e) => e.alive && e.deployed && canTargetEnemy(u, e, prof) && bodyInKeys(e, set));
|
||||
if (!target) { waitFrom = null; continue; }
|
||||
inRange++;
|
||||
if (waitFrom == null) waitFrom = h.b.time;
|
||||
worst = Math.max(worst, h.b.time - waitFrom - u.s.interval);
|
||||
if (waitFrom == null) { waitFrom = h.b.time; waitIv = u.s.interval; }
|
||||
worst = Math.max(worst, h.b.time - waitFrom - Math.max(waitIv, u.s.interval));
|
||||
}
|
||||
return { attacks, inRange, blocked, worst };
|
||||
}
|
||||
|
||||
@@ -3,6 +3,9 @@
|
||||
// as soon as an enemy (a heal skill: an injured ally) is inside that larger range — trigger ACTIVE_RANGE, resolved by
|
||||
// tools/build-data.mjs resolveTrigger (customRangeGrid = the running range) and checked every tick by server/sim/skills.js.
|
||||
// Community report: 「有的干员开技能后的攻击范围比平时攻击范围大,但是怪走到平时的攻击范围内才会开技能」.
|
||||
// The owner's further decisions of the same day: the rule also replaces the SEARCH row ("在初始攻击范围内存在敌人时释放技能":
|
||||
// 薄绿 S1, 蜜蜡 S1, 卡涅利安 S3, 玛恩纳 S2, 安洁莉娜 S3) and covers 深巡 S2 on top of its §21.29 DEFAULT (its 3-2 over her
|
||||
// 2-2: test/sim/feedback1-tank-triggers.test.js).
|
||||
|
||||
import { test } from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
@@ -91,3 +94,26 @@ test('real data: 莫斯提马 S3 序时之匙 (3-15 over her 3-6) casts on its r
|
||||
assert.equal(casts(h, u)[0].reason, 'ACTIVE_RANGE');
|
||||
done(h);
|
||||
});
|
||||
|
||||
test('real data: the SEARCH row widened — 安洁莉娜 S3 秘杖·反重力模式 (y-4 over her y-2) casts on an enemy of the y-4 only, no attack needed; her S2 (no range change) keeps SEARCH on the y-2', () => {
|
||||
const AGL = 'chess_char_5_20_a';
|
||||
const idx = (sid) => ds.getChess(AGL).raw.skills.find((s) => s.skillId === sid).index;
|
||||
const s3 = ds.getChess(AGL, { skillIndex: idx('skchr_aglina_3') }).skill, s2 = ds.getChess(AGL, { skillIndex: idx('skchr_aglina_2') }).skill;
|
||||
assert.equal(s3.trigger.rule, 'ACTIVE_RANGE');
|
||||
assert.deepEqual(s3.trigger.grid, s3.rangeGrid, 'the trigger grid is the y-4 she attacks with');
|
||||
assert.equal(s2.trigger.rule, 'SEARCH');
|
||||
// (10,6) = [0,3]: on the y-4, not on her y-2
|
||||
for (const [sid, want] of [['skchr_aglina_3', 1], ['skchr_aglina_2', 0]]) {
|
||||
const h = makeBattle({
|
||||
defs: { enemies: { e: dummy('e') } }, units: [{ chessId: AGL, row: 10, col: 3, dir: 'RIGHT', skillIndex: idx(sid) }],
|
||||
enemies: [{ key: 'e', pos: [10, 6] }], hooks: ['skillStart'], autoFinish: false, timeLimit: 30,
|
||||
});
|
||||
const u = h.unit(AGL);
|
||||
h.step();
|
||||
u.skill.gainSp(1000);
|
||||
h.run(4);
|
||||
assert.equal(casts(h, u).length, want, `${sid}: ${want ? 'cast on the y-4' : 'the enemy is outside the initial y-2'}`);
|
||||
if (want) assert.equal(casts(h, u)[0].reason, 'ACTIVE_RANGE');
|
||||
done(h);
|
||||
}
|
||||
});
|
||||
+30
-15
@@ -452,6 +452,9 @@ const ATTACK_RANGE_CHANGE = /攻击(?:范围|距离)(?:与溅射范围)?(?:扩
|
||||
* from a ranged hit with nobody to pull). His attack range is his own tile (0-1), so the basic strategy would not see an
|
||||
* enemy he could pull: his S2 takes SKILL_RANGE on its own 技能范围 (x-1) — the official strategy of a MANUAL skill with a
|
||||
* 技能范围 when no class row applies, "仅在技能范围内存在敌人(无视其不可选中)时释放技能" — `customRangeGrid` = that range.
|
||||
* A DEFAULT entry is the basic strategy, so the owner's ACTIVE_RANGE rule applies on top of it (resolveTrigger; the
|
||||
* owner's decision of 2026-10-05): 深巡 S2, whose running range 3-2 strictly contains her 2-2, casts with an enemy in the
|
||||
* 3-2 (`rule` ACTIVE_RANGE, `rawRule` still TAKE_DAMAGE).
|
||||
*/
|
||||
const TRIGGER_DEVIATIONS = Object.freeze({
|
||||
chess_char_1_04_a: { skchr_udflow_2: 'DEFAULT' }, // 深巡 S2 行动能力剥夺
|
||||
@@ -494,6 +497,14 @@ function strictlyContains(a, b) {
|
||||
return sa.size > sb.size && [...sb].every((k) => sa.has(k));
|
||||
}
|
||||
|
||||
/**
|
||||
* The rules the owner's ACTIVE_RANGE replaces (resolveTrigger), both of which wait for an enemy in the INITIAL range:
|
||||
* DEFAULT, the basic strategy (no row, or a DEFAULT deviation of the tables — 深巡 S2, the owner's decision of
|
||||
* 2026-10-05), and SEARCH, the 解放者 / 阵法术师 / 安洁莉娜 S2·S3 row "不受基础策略影响,在初始攻击范围内存在敌人时释放技能"
|
||||
* (the owner's decision of 2026-10-05 too).
|
||||
*/
|
||||
const ACTIVE_RANGE_OVER = new Set(['DEFAULT', 'SEARCH']);
|
||||
|
||||
/**
|
||||
* Resolve the auto-cast rule of a skill record (PRTS 卫戍协议/帮助 §作战阶段 技能操作 — the official skill strategies;
|
||||
* DESIGN §5.6):
|
||||
@@ -511,11 +522,13 @@ function strictlyContains(a, b) {
|
||||
* unit and skill): `rule` from the table, `rawRule` the official row (a SKILL_RANGE deviation takes the skill's own
|
||||
* range as `customRangeGrid`);
|
||||
* - and the owner's rule of 2026-10-05, a deliberate deviation like §21.29 (community report 「有的干员开技能后的攻击范围比
|
||||
* 平时攻击范围大,但是怪走到平时的攻击范围内才会开技能」): an operator's MANUAL skill left on the basic strategy (DEFAULT,
|
||||
* no deviation of the table) whose attack range while it runs (activeAttackGrid) strictly contains the operator's own
|
||||
* range casts as soon as an enemy — a heal skill: an injured ally — is inside that larger range: ACTIVE_RANGE,
|
||||
* `customRangeGrid` = the running range, `rawRule` the official row. Other rows keep their rule (TAKE_DAMAGE waits for a
|
||||
* hit, SEARCH reads the initial range by its official row, CUSTOM_RANGE / SP_FULL / … have their own).
|
||||
* 平时攻击范围大,但是怪走到平时的攻击范围内才会开技能」): an operator's MANUAL skill on the basic strategy (DEFAULT — by
|
||||
* no row, or by a DEFAULT deviation of the tables: 深巡 S2's 3-2 over her 2-2) or on the SEARCH row (解放者 / 阵法术师 /
|
||||
* 安洁莉娜: 薄绿 S1, 蜜蜡 S1, 卡涅利安 S3, 玛恩纳 S2, 安洁莉娜 S3) — ACTIVE_RANGE_OVER, both by the owner's decisions
|
||||
* of 2026-10-05 — whose attack range while it runs (activeAttackGrid) strictly contains the operator's own range casts as
|
||||
* soon as an enemy — a heal skill: an injured ally — is inside that larger range: ACTIVE_RANGE, `customRangeGrid` = the
|
||||
* running range, `rawRule` the official row. Other rows keep their rule (TAKE_DAMAGE waits for a hit, CUSTOM_RANGE /
|
||||
* SKILL_RANGE / SP_FULL / … have their own range or none).
|
||||
* @param {object} skill record from buildSkill (skillId, skillType, desc, rangeGrid, bb)
|
||||
* @param {{operator?: boolean, chessId?: string, unitCharId?: string, baseGrid?: number[][]|null}} opts operator = a
|
||||
* chess (the 技能范围 strategy is written for 干员; summons keep DEFAULT); chessId = the chess's NORMAL id
|
||||
@@ -540,12 +553,12 @@ function resolveTrigger(ctx, char, charId, skillIdx, skill, { operator = false,
|
||||
if (!skill.rangeGrid) warn(`trigger deviation ${chessId} ${skill.skillId}: SKILL_RANGE without a 技能范围`);
|
||||
return { rule: deviation, rawRule, customRangeGrid: skill.rangeGrid ? skill.rangeGrid.map((p) => p.slice()) : null };
|
||||
}
|
||||
if (deviation) return { rule: deviation, rawRule, customRangeGrid: null };
|
||||
const rule = TRIGGER_RENAME[rawRule] || rawRule;
|
||||
if (rule === 'DEFAULT' && operator && manual && baseGrid?.length) {
|
||||
const rule = deviation || TRIGGER_RENAME[rawRule] || rawRule;
|
||||
if (ACTIVE_RANGE_OVER.has(rule) && operator && manual && baseGrid?.length) {
|
||||
const active = activeAttackGrid(skill, baseGrid);
|
||||
if (active && strictlyContains(active, baseGrid)) return { rule: 'ACTIVE_RANGE', rawRule, customRangeGrid: active };
|
||||
}
|
||||
if (deviation) return { rule: deviation, rawRule, customRangeGrid: null };
|
||||
let customRangeGrid = null;
|
||||
if (rawRule === 'CUSTOM_RANGE_SEARCH_ENEMY') {
|
||||
const rid = ctx.ac.skillRangeDict?.[skill.skillId];
|
||||
@@ -3437,7 +3450,8 @@ function validateAll(f) {
|
||||
if (c.placement !== undefined) err(`chess ${c.chessId}: placement is not a data field`);
|
||||
}
|
||||
// the deliberate trigger deviations (DESIGN §21.29, §22.10) still override an official TAKE_DAMAGE row, on the normal
|
||||
// chess and its elite alike
|
||||
// chess and its elite alike (a DEFAULT one may resolve to the owner's ACTIVE_RANGE on top: 深巡 S2)
|
||||
const deviationHolds = (rule, trig) => trig.rawRule === 'TAKE_DAMAGE' && (trig.rule === rule || (ACTIVE_RANGE_OVER.has(rule) && trig.rule === 'ACTIVE_RANGE'));
|
||||
for (const [baseId, skillsOf] of Object.entries(TRIGGER_DEVIATIONS)) {
|
||||
const recs = Object.values(chess).filter((c) => c.baseId === baseId);
|
||||
if (recs.length !== 2) err(`trigger deviation ${baseId}: expected the normal and the elite record, got ${recs.length}`);
|
||||
@@ -3445,18 +3459,19 @@ function validateAll(f) {
|
||||
for (const c of recs) {
|
||||
const s = (c.skills || []).find((x) => x.skillId === skillId);
|
||||
if (!s) err(`trigger deviation ${c.chessId}: no skill ${skillId}`);
|
||||
else if (s.trigger.rawRule !== 'TAKE_DAMAGE' || s.trigger.rule !== rule) err(`trigger deviation ${c.chessId} ${skillId}: ${s.trigger.rawRule} → ${s.trigger.rule}, expected TAKE_DAMAGE → ${rule}`);
|
||||
else if (!deviationHolds(rule, s.trigger)) err(`trigger deviation ${c.chessId} ${skillId}: ${s.trigger.rawRule} → ${s.trigger.rule}, expected TAKE_DAMAGE → ${rule}`);
|
||||
else if (rule === 'SKILL_RANGE' && (!s.rangeGrid?.length || JSON.stringify(s.trigger.customRangeGrid) !== JSON.stringify(s.rangeGrid))) err(`trigger deviation ${c.chessId} ${skillId}: SKILL_RANGE needs the skill's own range as customRangeGrid`);
|
||||
}
|
||||
}
|
||||
}
|
||||
// the owner's ACTIVE_RANGE rule (2026-10-05): a MANUAL skill of the basic strategy whose running range strictly contains
|
||||
// the record's own range, and no other
|
||||
// the owner's ACTIVE_RANGE rule (2026-10-05): a MANUAL skill of the basic strategy (DEFAULT by its row or a deviation)
|
||||
// or of the SEARCH row whose running range strictly contains the record's own range, and no other
|
||||
for (const c of Object.values(chess)) {
|
||||
for (const s of c.skills || []) {
|
||||
if (s.trigger?.rule !== 'ACTIVE_RANGE') continue;
|
||||
if (s.skillType !== 'MANUAL' || s.trigger.rawRule !== 'DEFAULT' || !c.rangeGrid?.length || !strictlyContains(s.trigger.customRangeGrid || [], c.rangeGrid)) {
|
||||
err(`chess ${c.chessId} ${s.skillId}: ACTIVE_RANGE needs a MANUAL basic-strategy skill whose customRangeGrid strictly contains the record's range`);
|
||||
const over = TRIGGER_DEVIATIONS[c.baseId]?.[s.skillId] || s.trigger.rawRule;
|
||||
if (s.skillType !== 'MANUAL' || !ACTIVE_RANGE_OVER.has(over) || !c.rangeGrid?.length || !strictlyContains(s.trigger.customRangeGrid || [], c.rangeGrid)) {
|
||||
err(`chess ${c.chessId} ${s.skillId}: ACTIVE_RANGE needs a MANUAL basic-strategy or SEARCH skill whose customRangeGrid strictly contains the record's range`);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3491,7 +3506,7 @@ function validateAll(f) {
|
||||
for (const f of forms) {
|
||||
const s = f.skills.find((x) => x.skillId === skillId);
|
||||
if (!s) err(`stand-in trigger deviation ${charId}@${statusKey(f.status)}: no skill ${skillId}`);
|
||||
else if (s.trigger.rawRule !== 'TAKE_DAMAGE' || s.trigger.rule !== rule) err(`stand-in trigger deviation ${charId}@${statusKey(f.status)} ${skillId}: ${s.trigger.rawRule} → ${s.trigger.rule}, expected TAKE_DAMAGE → ${rule}`);
|
||||
else if (!deviationHolds(rule, s.trigger)) err(`stand-in trigger deviation ${charId}@${statusKey(f.status)} ${skillId}: ${s.trigger.rawRule} → ${s.trigger.rule}, expected TAKE_DAMAGE → ${rule}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user