feedback5 WF: ACTIVE_RANGE also replaces the SEARCH row and covers 深巡 S2 — a skill whose running range strictly contains the own one casts with an enemy inside it (the owner's decisions of 2026-10-05)
tools/build-data.mjs resolveTrigger: a MANUAL operator skill on DEFAULT (no row, or a DEFAULT entry of the deviation
tables) or on the SEARCH row ("在初始攻击范围内存在敌人时释放技能": 解放者 / 阵法术师 / 安洁莉娜 — ACTIVE_RANGE_OVER) whose
running range strictly contains its own is ACTIVE_RANGE on that range, rawRule the official row; validateAll accepts a
DEFAULT deviation resolved to ACTIVE_RANGE (chess and stand-in tables) and ACTIVE_RANGE over SEARCH. Data rebuilt
offline, JSON-compared: only skills[].trigger rule / customRangeGrid of 薄绿 S1 (x-2), 蜜蜡 S1 (x-2), 卡涅利安 S3 (x-2),
玛恩纳 S2 (2-3), 安洁莉娜 S3 (y-4) — rawRule SEARCH — and 深巡 S2 (3-2, rawRule TAKE_DAMAGE), normal + elite (32
leaves); backups.json unchanged. Kits: 薄绿 S1 drops its DEFAULT trigger and 深巡 S2 PR #12's DEFAULT line, both read the
data now (雷蛇 S2 keeps PR #12's line). The sim needs no change (SEARCH was the DEFAULT condition on the initial range
every tick; ACTIVE_RANGE is the same on the running range). Docs: DESIGN §5.6 and the §21.20 flip row, DATA, SIM,
PLAYING, kits README, shared tier comments, skills.js header.
Tests: data (78 records / 39 skills, the five from SEARCH, the SEARCH skills that stay), feedback5-active-range (安洁莉娜
S3 on its y-4, S2 keeps SEARCH), feedback1-tank-triggers and kits_t1t2 (深巡 S2 on its 3-2, before any hit), kits_alt_t3
(薄绿 S1 on its x-2), feedback1f-fence (the idle measure uses the interval of the cooldown still running: the S2 now casts
between two attacks), docs-consistency (one PR #12 kit line left).
Golden: roster-001 / 002 (深巡), roster-016 / 044 (玛恩纳, 安洁莉娜), roster-026 / 027 (薄绿), roster-041 / 042 (卡涅利安),
bond-egirShip-low / bond-suntShip-high (深巡), boss-boss_2-pair / boss-boss_6-pair (玛恩纳, 安洁莉娜), matches solo-NORMAL-1,
coop2-NORMAL-3, coop4-FUNNY-6, coop2-NORMAL-8-serverrun — each fields one of the six skills, which now casts when an
enemy enters its running range.
This commit is contained in:
1 parent
65ac4afbd8
commit
383fe4a49e
27 files changed
+463
-383
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):
|
||||
@@ -501,11 +503,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
@@ -304,7 +304,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, 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 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
|
||||
@@ -1367,7 +1367,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
@@ -801,27 +801,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: "不受基础策略影响,在初始攻击范围内存在敌人时释放技能");
|
||||
|
||||
@@ -200,7 +200,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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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, 伺夜 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);
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -845,9 +845,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",
|
||||
|
||||
+14
-14
@@ -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":2928162,"gold":139,"itemsEquipped":12,"kills":331,"leaks":9,"lpLost":8,"merges":5,"perfectRounds":11,"refreshes":23},
|
||||
"stats": {"activatedLayers":250,"bossDamage":287418,"dmgDealt":2928925,"gold":139,"itemsEquipped":12,"kills":331,"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,44,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,44,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":1702122,"gold":140,"itemsEquipped":25,"kills":327,"leaks":0,"lpLost":0,"merges":5,"perfectRounds":13,"refreshes":21},
|
||||
"stats": {"activatedLayers":485,"bossDamage":46721,"dmgDealt":1692520,"gold":140,"itemsEquipped":25,"kills":327,"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_4","name":"精英云集","picId":"comment_icon_4","text":"晋升精锐次数最多"},
|
||||
"trophies": 3,
|
||||
"reward": 250,
|
||||
"stats": {"activatedLayers":207,"bossDamage":11652,"dmgDealt":1287691,"gold":129,"itemsEquipped":20,"kills":237,"leaks":46,"lpLost":1,"merges":6,"perfectRounds":9,"refreshes":20},
|
||||
"stats": {"activatedLayers":207,"bossDamage":12338,"dmgDealt":1288377,"gold":129,"itemsEquipped":20,"kills":237,"leaks":46,"lpLost":1,"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_3","name":"坚若磐石","picId":"comment_icon_3","text":"目标生命值损失最少"},
|
||||
"trophies": 3,
|
||||
"reward": 250,
|
||||
"stats": {"activatedLayers":260,"bossDamage":82751,"dmgDealt":1633721,"gold":127,"itemsEquipped":20,"kills":283,"leaks":0,"lpLost":0,"merges":3,"perfectRounds":13,"refreshes":16},
|
||||
"stats": {"activatedLayers":258,"bossDamage":70366,"dmgDealt":1632325,"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"]
|
||||
}
|
||||
@@ -1245,17 +1245,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,16,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,16,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": [1,6,12,0,0,6,8,"d9bd3d27",160,"arcaneShip 1/20, indomShip 1/60, kjeragShip 0/8, preciShip 0/2, siracusaShip 1/58, soloShip 1/0, steadShip 1/22, suntShip 1/0, victoriaShip 0/8, visiShip 0/8",17,46,29,109]
|
||||
"ai_1": [1,6,12,0,0,6,8,"d9bd3d27",150,"arcaneShip 1/20, indomShip 1/50, kjeragShip 0/8, preciShip 0/2, siracusaShip 1/58, soloShip 1/0, steadShip 1/22, suntShip 1/0, 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,127],
|
||||
"ai_1": [0,0,12,0,0,6,0,"811c9dc5",0,"arcaneShip 0/26, indomShip 0/60, kjeragShip 0/8, miraShip 0/4, preciShip 0/2, siracusaShip 0/84, steadShip 0/23, victoriaShip 0/8, visiShip 0/8",19,39,20,120]
|
||||
"ai_1": [0,0,12,0,0,6,0,"811c9dc5",0,"arcaneShip 0/26, indomShip 0/50, kjeragShip 0/8, miraShip 0/4, preciShip 0/2, siracusaShip 0/84, steadShip 0/23, victoriaShip 0/8, visiShip 0/8",18,39,21,120]
|
||||
}
|
||||
],
|
||||
"players": {
|
||||
@@ -1283,9 +1283,9 @@
|
||||
"title": {"id":"comment_5","name":"万事俱备","picId":"comment_icon_5","text":"装备配发数量最多"},
|
||||
"trophies": 3,
|
||||
"reward": 280,
|
||||
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":2410241,"gold":120,"itemsEquipped":16,"kills":196,"leaks":73,"lpLost":32,"merges":2,"perfectRounds":6,"refreshes":18},
|
||||
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":2378540,"gold":120,"itemsEquipped":16,"kills":198,"leaks":71,"lpLost":32,"merges":2,"perfectRounds":6,"refreshes":18},
|
||||
"lineup": [],
|
||||
"bonds": ["arcaneShip 0/26","indomShip 0/60","kjeragShip 0/8","miraShip 0/4","preciShip 0/2","siracusaShip 0/84","steadShip 0/23","victoriaShip 0/8","visiShip 0/8"]
|
||||
"bonds": ["arcaneShip 0/26","indomShip 0/50","kjeragShip 0/8","miraShip 0/4","preciShip 0/2","siracusaShip 0/84","steadShip 0/23","victoriaShip 0/8","visiShip 0/8"]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
+177
-177
@@ -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",
|
||||
@@ -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];
|
||||
@@ -3425,7 +3438,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}`);
|
||||
@@ -3433,18 +3447,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`);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3479,7 +3494,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