feedback5: merge feedback4 (7ee815e) — W4D ported: a sleeping enemy cannot be blocked and takes no block slot (_checkBlock in server/sim/battle/blocking.js, the applyStatus release in battle/status.js, the plain-buff release re-applied to ai.js updateEnemy's cannot-act branch after WE1's swing cut, 瑕光's comment in kits/ops/chess_char_3_12-blemsh.js, buffs.js; 酒神's 迷狂牢笼 skips a sleeper too); golden: roster-003 / 005 / 013 / 032 / 038 / 039 / 042, bond-maniShip-high, solo-FUNNY-1, coop4-FUNNY-6, coop4-ABYSS-7, coop2-NORMAL-8-serverrun, coop2-NORMAL-70-diy, diy-131 / 132 moved
New on feedback4 since the last merge: W4D (bbe59b9, merged as7ee815e) and the 0.1.4 version commit (30e7ace). feedback5 keeps its own package.json / package-lock.json / APP_VERSION / README / DEPLOY version lines (0.2.0 sets its own version later) and takes feedback4's CHANGELOG 0.1.4 entry, with W4D's line in it. - Port (PRTS 异常效果 SLEEPING 沉睡 = 无法行动+无敌+不可阻挡; GitHub #140; the owner's decision of 2026-10-06): `_checkBlock` refuses `flags.sleep` (battle/blocking.js) and `applyStatus` releases an enemy that falls asleep (battle/status.js). Battle.js stays feedback5's façade, and tier3.js stays deleted (the 瑕光 comment is in her kits/ops file). ai.js: WE1 (89f730d) cuts a swing before enemyAttack on a stun / freeze / sleep. The cannot-act branch is still there, and a plain-buff `flags.sleep` still makes the enemy `stun` (units.js), so the plain-buff release stays in that branch, after the cut, with its comment rewritten for the new order. - New on feedback5: 酒神's 迷狂牢笼 (kits/ops/op-phatm2.js cageBlock, O22) duplicated the old three-flag 不可阻挡 check. It now skips a sleeper too. No golden scenario spawns a 牢笼 over a sleeper: the corpus is identical with that line reverted. 予愿安洁莉娜's S3 helper is unchanged, since canTargetEnemy already drops sleepers. - Readers that follow without code: blockedTargets (blocked-first targeting, the DEFAULT trigger, hitAllBlocked), the 要塞 branch of acquireTargets (u.blocking), “庞贝”'s clock (blockedBy), the snapshot's UF.BLOCKED and the client's block marker (render/units.js). 死芒 S2 折朽 (自选) lets go a linked enemy that her 悲叹的仆役 held. - Docs: DESIGN §24.9, its §24 intro entry, the §5.5 Blocking sentence (on feedback5's 阻挡半径倍率 text) and §22.8's "(since §24.9)", all as on feedback4; SIM.md as on feedback4 (the plain-buff sentence merged with feedback5's noNewBlock / undying text). - Golden: a probe (counting successful sleeps on a blocked enemy, plain-buff sleeps and 牢笼 spawns over sleepers) ran over all 283 scenarios. Every scenario that moved sleeps blocked enemies; the counts are in brackets: roster-003 (小满 S2 [5]: same fight, blocked 27 → 29, snapshot hashes); roster-005 (elite 小满 S2 [3]: the 140 s timeout with 83 kills and 1 leak, where it used to clear at 135.43 s with 84); roster-013 (缇缇 S3 [11]: same kills, blocked 22 → 33); roster-032 (缇缇 S1 [10]: 71 kills instead of 68, 8 leaks instead of 11, 4 knock-outs instead of 8, 萨尔贡 layers 41 → 35); roster-038 (elite 缇缇 S2 [1]: ends at 197.40 s instead of 197.27 s); roster-039 (瑕光 S2 normal + elite [31 + 12]: same kills and counted leaks, the 窃贼 gets away, blocked 53 → 87); roster-042 (缇缇 S2 [3]: ends at 168.77 s instead of 166.93 s); bond-maniShip-high (小满 [1]: blocked 29 → 30, snapshot hashes); solo-FUNNY-1 (ai_0's 缇缇 [3]: only ai_0's damage dealt); coop4-FUNNY-6 (ai_0's 缇缇 [15 + 56]: from round 9 ai_0's 精准 / 萨尔贡 layers and boss damage move, ai_1 loses no LP from round 11, team LP 124 → 130); coop4-ABYSS-7 (ai_2's 小满 [18]: ai_2 one kill fewer, ai_0 one more LP lost in round 9); coop2-NORMAL-8-serverrun (ai_1's 缇缇 [83]: only ai_1's damage dealt; WE1 had already turned this match into a loss); coop2-NORMAL-70-diy (the 自选 seat h_0's 缇缇 [171], ai_0's 缇缇 [74] and 小满 [19 + 21]: h_0's layers move from round 4, then its AI 托管 buys differently (boards from round 7); ai_0 246 kills instead of 233, same end); diy-131 (死芒 S2 at tiers 5 and 6 [1 + 1]: snapshot hashes only); diy-132 (elite 死芒 S2 [2]: ends at 199.50 s instead of 198.13 s, same kills). One scenario sleeps a blocked enemy and did not move: coop2-HARD-4 [1]. ai_1's 小满 lets go the enemy it holds; another enemy takes the slot; the sleeper wakes with no room and is blocked further on by 2_16_a. The match digest has no snapshot hashes, and its kills, leaks, damage and funds are identical. fields and standins did not move. Most outcomes differ from feedback4's list because feedback5's baselines differ (WE1's damage frame, etc.). - Tests: test/sim/feedback4-sleep-unblock.test.js (from feedback4) passes 5/5 on the split layout. Every case fails with the three sim hunks reverted, and case 3 (plain buff) fails with only the ai.js release reverted. Targeted sim tests pass 184/184 (blocking, block targets, enemy swing, feedback2-enemy-attack-stand, combat / statuses, robustness, stun SP, professions, healers, fidelity …). Content tests plus kits_layout and docs-consistency pass 658/658 (kits t1t2 / t3 / t5 and alt t2 / t3 / t5 for 小满 / 瑕光 / 缇缇, 酒神, 死芒, garrisons, bosses, items). Stealth / liftoff / enemies pass 36/36. npm run golden: all 283 match. GOLDEN_FULL=1 test/golden.test.js passes 9/9 (no stored engine error). lint 0 errors, check:imports and typecheck clean.
This commit is contained in:
commit
ac6454d171
14 files changed
+558
-261
No files matched your search
@@ -1,5 +1,59 @@
|
||||
# 更新记录
|
||||
|
||||
## 0.1.4 — 2026-10-06
|
||||
|
||||
0.1.3 之后的小版本:合并了多位贡献者的 PR,修正了高台和阿戈尔的规则,并修正了文档和测试。下一个版本(0.2.0)会做一次便于维护的重构、多语言支持,以及补位和自选编队。
|
||||
|
||||
### 规则(按官方)
|
||||
|
||||
- 高台按官方特性:特性里写着「可以放置于远程位」的干员(歌蕾蒂娅、崖心、见行者等),普通和精锐、任意模组都可以放上高台(此前只有精锐歌蕾蒂娅携带淡金坠饰可以;GitHub #153,PR #69 提出,感谢 @sunstricken)。
|
||||
- 五人阿戈尔的复活名额给最先被击倒的 3 名阿戈尔:没被吞噬的阿戈尔不占名额,同一名干员被多名阿戈尔吞噬只算一次,斯卡蒂等干员自己的模组复活不占名额(GitHub #105、#140)。
|
||||
- 联防里阿戈尔也会吞噬身前的队友干员(站着或等待再部署),攻击和阻挡加成与单独作战一致(GitHub #140)。
|
||||
- 阿戈尔吞噬获得的基础攻击力改为最终加算,不再被技能攻击力百分比放大(基础攻击力 1000、技能 +100%、吞噬 2000 时为 4000,而不是 6000)(GitHub #165、PR #176 第 2 点,感谢 @SpiritedAwayCN)。
|
||||
- 开场吞噬中先倒下的阿戈尔,它付出的标记仍照常结算,击杀记在付与者名下;只取消被击倒目标身上尚未触发的标记(GitHub #165、PR #176 第 3 点,感谢 @SpiritedAwayCN)。
|
||||
- 缇缇二技能每次让周围敌人陷入沉睡都算一次进入沉睡,特质很快叠到每场上限(24 层,精锐 48 层);攻击范围外的沉睡不计入(GitHub #162)。
|
||||
- 沉睡的敌人不可阻挡、不占阻挡数:被阻挡的敌人陷入沉睡时立即脱离阻挡,阻挡位让给下一个敌人;醒来时只有阻挡数未满才会被重新阻挡,否则继续前进(如瑕光二技能;GitHub #140,感谢 @Hucxious 的实测)。
|
||||
|
||||
### 战斗
|
||||
|
||||
- 引星棘刺一技能「度算浪波」是自动触发技能,技力满了就向友军投掷炼金单元,不再等到有敌人才放(GitHub #124)。
|
||||
- 咒愈师的特性对她造成的每一次伤害都会治疗,包括技能伤害;收割者、武者的技能打中敌人也会回复自己(PR #115,感谢 @shanzhaikabi)。
|
||||
- 部署后限时生效的技能(宴二技能、斯卡蒂二技能、野鬃一技能、砾、伊内丝三技能、缄默德克萨斯、耀骑士临光二技能)走正常的技能流程:部署时消耗一次、显示持续时间条、到时结束,依赖技能状态的装备和盟约效果能看到它结束(PR #109,感谢 @Sukvii)。
|
||||
- 耀骑士临光二技能结束撤退后被「不屈」立即再部署时,第二次技能不再丢失「骑士戒律」;伊内丝被「不屈」立即再部署时能正常收回影哨(发布前审查发现)。
|
||||
- 灵巧:被击倒的灵巧干员仍为相邻队友提供一次光环,主动撤退、商人退场和联防强制离场不再提供;调和、协防干员、独行、绝技只在界面隐藏层数,内部仍正常累计(PR #66,感谢 @sunstricken)。
|
||||
|
||||
### 联机与大厅
|
||||
|
||||
- 「观战」和「加入」按钮发出的是输入框里的密钥,不再把点击事件当成密钥;0.1.3 的观战按钮每次都会失败(PR #119,感谢 @salt-fishes)。
|
||||
- 最近同盟的密钥按钮改为只填入密钥,不再直接加入。
|
||||
- 复制邀请链接时附带邀请文字:「{玩家名}邀请你加入卫戍协议:盟约【难度】」(PR #103,感谢 @LongQianChen)。
|
||||
|
||||
### 界面与表现
|
||||
|
||||
- 休整期选中干员后,按 Q 撤退、按 X 出售(PR #114,感谢 @SpiritedAwayCN)。
|
||||
- 盟约详情里随层数增长的概率(不屈、迅捷、奇迹)最高显示 100%,和实际效果一致(GitHub #108)。
|
||||
- 查看队友时能看到装备、整备区手牌、策略和效果(PR #129,感谢 @2321Robin);手牌里有道具的队友,棋盘干员不再消失(PR #150,感谢 @2321Robin)。
|
||||
- 盟约栏可以收起,手机上更容易操作棋盘(PR #149,感谢 @CELLOPOI;GitHub #142)。
|
||||
- 点一下特殊地块(活性源石、沼泽、深水区、排气格栅、红门 / 蓝门、传送门)会弹出它的说明和这张地图的具体数值;活性源石在 2D 和 3D 棋盘上改为同一套材质(PR #185,感谢 @Convey123;GitHub #184)。
|
||||
- 标题 / 登录画面加了设置入口,打开的是局内同一个设置窗口(PR #183,感谢 @zasx77771)。
|
||||
- 只有一条技能动画、没有起手动作的瞬发技能(如德克萨斯二技能「剑雨」)会正常播放技能动画;部署时生效的被动技能也会播放(PR #160,感谢 @xcdoge)。
|
||||
|
||||
### 音乐
|
||||
|
||||
- 联防阶段播放官方逃脱关卡自己的曲目(PR #110,感谢 @Convey123)。
|
||||
- 开战曲目按回合固定:1–7 回合「无畏者」,8–13 回合「骑士之日」,和官方关卡资料一致(PR #72,感谢 @Convey123)。
|
||||
- 作战中按官方语音槽位播放干员语音(部署、技能、结算等),一次一条,新台词会接管(PR #73,感谢 @Convey123)。
|
||||
- 敌人走进蓝门时播放原版关卡的警报声,一波连续漏怪只响一次(PR #134,感谢 @Convey123)。
|
||||
|
||||
### 其他
|
||||
|
||||
- 3D 棋盘的 12 张本地贴图改用 WebP,每位玩家第一次进入对局少下载约 4.7 MB,远程联机加载更快(PR #186,感谢 @Cloudnyco)。
|
||||
- 下载素材时可以手动启用国内镜像(`node tools/setup.mjs --asset-source=mirror`,或环境变量 `SP_ASSET_SOURCE=mirror`),默认不启用;镜像失败会回到原始源,连续失败 3 次后本次不再使用镜像(PR #24,感谢 @NekoTC)。
|
||||
- 灼热 / 炽焰源石虫继续使用染色别名,补充了原因说明和测试(PR #74,感谢 @Convey123)。
|
||||
- 联机集成测试不再偶发失败(PR #146,感谢 @CELLOPOI;GitHub #144)。
|
||||
- 0.1.3 更新记录的个别措辞更正;设计文档里遗留的章节编号改正。
|
||||
- 浏览器端到端测试会确认「还有剩余资金」的提示后再准备(PR #127 的表情测试同样可以用下载的素材运行,感谢 @Convey123)。
|
||||
|
||||
## 0.1.3 — 2026-10-04
|
||||
|
||||
修复 0.1.2 发布后玩家和 GitHub 上反馈的问题。每一条先复现,属实的才修,修完经过独立复核再合并。规则对照官方数据和 PRTS 核对;查不到出处的标了推断,详见 [docs/DESIGN.md](docs/DESIGN.md) §23。有意和官方不同的几条写在下面。
|
||||
|
||||
+64
-3
@@ -292,7 +292,7 @@ Engine helpers (content must use these, never touch internals): `battle.dealDama
|
||||
|
||||
- **Initial deployment** at t=0, free: operators by column — the left column first, top to bottom within a column (right-side boss player: from its own left, the highest field column) — then the summons (PRTS 卫戍协议/帮助 "按从上到下>从左到右的顺序部署。优先部署干员,随后为召唤物", read as a scan: down each column, the columns left to right — the order PRTS gives the 阿戈尔 devour, "更靠左和靠上"; row-major until 0.1.3, §23.23; `aggroSeq` ranks every start-of-battle summon after all operators) — a skill's placed summon (赫默 医疗探机, 巫恋 诅咒娃娃) included, once and free ("所有手动部署的召唤物,无视所属干员的持有状态…作战开始时立即部署一次"; afterwards it re-appears on its tile each time the owner's skill gives one, §20.1); on a shared field (联防, boss) the players' i-th operators deploy together [ASSUMED]. Deploy effects fire (`deploy` with `initial: true`). Then operators carried into 联防 knocked out (`carryState.down`) are forced out (`FORCED_EXIT`, HP 0, §19.3). Then `battleStart`, after which the forced-out operators' timers are re-read (redeploy-time effects that start with the battle, e.g. 机变 征召, cover them too).
|
||||
- **DP**: per player, start 10, +1/s, cap 99; used only for auto-redeploy (dead op: after `respawnTime`, if the tile it lies on is free and DP ≥ cost ⇒ redeploy there with full HP, SP = initSp). A knocked-out operator (and, since 0.1.2, one forced out by its own effects, §22.15) stays **down** on the tile it fell on — its own home when it fell on another board piece's home (that piece on the field or not) and its home is free — until it redeploys there, and no ally deploys or moves onto that tile meanwhile (PRTS 卫戍协议/帮助 §作战阶段 单位部署; `Battle.downOn` / `restTile` / `_layBody`, §21.24; b.snap `down`, §18.3: counting / waiting for DP / its tile taken, a safeguard) — also one that entered 联防 knocked out (`FORCED_EXIT`, its full redeploy timer — confirmed by the user — with the battle-start redeploy effects, §19.3); summons, devices and enemies leave at once.
|
||||
- **Blocking** (contact radius, PRTS 游戏数据基础 §阻挡半径 / 作战机制 "中点判定…案例:阻挡"; `constants.js BLOCK_RADIUS`, `Battle._checkBlock`, §19.2): an operator with free capacity blocks an unblocked, blockable enemy whose position lies within its block radius of its centre — ground 0.7071 (squared 0.49999037), 0.8944 × the blocker's 阻挡半径倍率 for blockFly units vs flyers (起飞; mod `blockRadiusScale` = 倍率 − 1 — PRTS 游戏数据基础 "飞行阻挡半径 = 0.8944 × 阻挡半径倍率", 凯尔希·思衡托 +0.23), devices 0.4472 (阻隔工事 / 障碍物); air units (FLY, 近地悬浮, 浮空) only by blockFly units. A ground enemy is never blocked by a unit standing on a tile ground units cannot pass (围墙 / 围栏: PRTS 地形机制 "部署在其中的单位,若当前阻挡类型为'地面阻挡'则无法阻挡敌人" — an enemy pushed or pulled against the fence walks on; air blocking there stays [ASSUMED], §21.23) nor by an airborne (起飞) unit, which blocks flyers only (§21.22). The nearest such operator wins (ties: scan order [ASSUMED]). It is re-checked every tick, moving or not, so another operator in contact with room takes the enemy over when its blocker dies, is withdrawn or is stunned, and an operator whose capacity frees up grabs an overlapping enemy; one that finds no room walks on. A head-on enemy stops at contact (≈ 0.71 tile), outside the blocker's tile. Enemy uses `blockCnt` capacity (default 1). Blocked enemies stop moving and attack their blocker if melee (or anyone in range if ranged, blocker first). **Every blocker** — melee units (重装要塞 / 领主 / 哨戒铁卫 included), summons and a ranged operator on a melee tile alike — whose attack hits enemies may always target the enemies it blocks, in range or not, whatever its facing, and targets them first ("可以选择且优先选择阻挡单位", PRTS 选择器; the user's rule after playtest #6, "阻挡了就一定要能打到": officially the collision pushes a blocked enemy to its blocker's front; `Battle.blockedTargets`, `targeting.js sortEnemyTargets`; §20.3 — it replaces the playtest #5 QA's melee-only restriction of §19.2). A healer (dmgType `heal`, or a skill attack turned into a heal) selects injured allies only and keeps healing while it blocks (PRTS 卫戍协议/帮助 "对于医疗干员(咒愈师分支除外),攻击目标为需要治疗的单位"; §21.17); 咒愈师 follow the blocker rule. The huge leaders are 自缚 + unblockable (§7).
|
||||
- **Blocking** (contact radius, PRTS 游戏数据基础 §阻挡半径 / 作战机制 "中点判定…案例:阻挡"; `constants.js BLOCK_RADIUS`, `Battle._checkBlock`, §19.2): an operator with free capacity blocks an unblocked, blockable enemy whose position lies within its block radius of its centre — ground 0.7071 (squared 0.49999037), 0.8944 × the blocker's 阻挡半径倍率 for blockFly units vs flyers (起飞; mod `blockRadiusScale` = 倍率 − 1 — PRTS 游戏数据基础 "飞行阻挡半径 = 0.8944 × 阻挡半径倍率", 凯尔希·思衡托 +0.23), devices 0.4472 (阻隔工事 / 障碍物); air units (FLY, 近地悬浮, 浮空) only by blockFly units. A ground enemy is never blocked by a unit standing on a tile ground units cannot pass (围墙 / 围栏: PRTS 地形机制 "部署在其中的单位,若当前阻挡类型为'地面阻挡'则无法阻挡敌人" — an enemy pushed or pulled against the fence walks on; air blocking there stays [ASSUMED], §21.23) nor by an airborne (起飞) unit, which blocks flyers only (§21.22). An enemy holding 不可阻挡 (PRTS 异常效果 BLOCK_FREE 「无法阻挡/被阻挡,自动解除阻挡」) — `unblockable` (恐惧, 诱导, enemy abilities), 浮空, and 沉睡 (SLEEPING = 无法行动+无敌+不可阻挡) — is never blocked and is released at once: a sleeping enemy frees its blocker's slot, stays where it is and, once awake, is blocked again only by a blocker with room (§24.9). The nearest such operator wins (ties: scan order [ASSUMED]). It is re-checked every tick, moving or not, so another operator in contact with room takes the enemy over when its blocker dies, is withdrawn or is stunned, and an operator whose capacity frees up grabs an overlapping enemy; one that finds no room walks on. A head-on enemy stops at contact (≈ 0.71 tile), outside the blocker's tile. Enemy uses `blockCnt` capacity (default 1). Blocked enemies stop moving and attack their blocker if melee (or anyone in range if ranged, blocker first). **Every blocker** — melee units (重装要塞 / 领主 / 哨戒铁卫 included), summons and a ranged operator on a melee tile alike — whose attack hits enemies may always target the enemies it blocks, in range or not, whatever its facing, and targets them first ("可以选择且优先选择阻挡单位", PRTS 选择器; the user's rule after playtest #6, "阻挡了就一定要能打到": officially the collision pushes a blocked enemy to its blocker's front; `Battle.blockedTargets`, `targeting.js sortEnemyTargets`; §20.3 — it replaces the playtest #5 QA's melee-only restriction of §19.2). A healer (dmgType `heal`, or a skill attack turned into a heal) selects injured allies only and keeps healing while it blocks (PRTS 卫戍协议/帮助 "对于医疗干员(咒愈师分支除外),攻击目标为需要治疗的单位"; §21.17); 咒愈师 follow the blocker rule. The huge leaders are 自缚 + unblockable (§7).
|
||||
- **Operator attacks**: every `interval` s if a valid target exists; targets = up to `maxTargets` (default 1) from `unitsInGrid(rangeGrid)` (a `rangeAoe` profile — 阵法术师, 轰击术师 — takes every selectable enemy in range, §21.18; 「同时攻击阻挡的所有敌人」 — 强攻手 / 重剑手 / 推击手 and the skills worded so, `hitAllBlocked` — up to the block count, never fewer than 1, since 0.2.0: PRTS 分支特性信息 "普通攻击最大目标数等于阻挡数(不会低于1)"), priority: (1) the enemies it blocks (every blocker, in range or not, §20.3), (2) profession/trait priorities (e.g. fly-first snipers, `trait` text parsed by build-data into `targetPriority`), (3) enemy with the **least remaining path distance** to its goal, ties → earliest spawned. Melee (no ranged trait) and ground-only attacks cannot hit air units (`Unit.isFlying`: FLY, or a 近地悬浮 / 浮空 enemy — PRTS "算作空中单位", §19.1). Stealthed enemies can't be targeted unless blocked or revealed — or within 3 s of a block's end (§22.8). Ranged ops fire projectiles (speed ~12 tiles/s, instant for melee/arts-beam classes as data indicates); damage applies on impact; a 锁定攻击范围 AoE (`rangeAoe`) strikes every selectable enemy on its range at once with instant hits (§21.18).
|
||||
- **Healers** (`dmgType heal`): target the ally in range with the lowest HP% below 100%, never a 禁疗 / 孤立 unit (tokens.json `abnormal`, `noHeal`; §20.3; 史尔特尔 during 余烬, §22.7), and never the enemies they block — also while blocking (§21.17); do nothing otherwise (SP still regenerates).
|
||||
- **Enemy AI**: follow the route (checkpoints; WALK paths recomputed on the grid when devices change); when blocked stop & fight (`dmgType 'none'` enemies never attack unless content arms them through `e.profile` — 转译基底's armed forms, §21.4); ranged enemies (`rangeRadius > 0`) attack ops whose 0.25 collider touches their radius (centre distance ≤ `rangeRadius` + 0.25, §3, §20.4): the enemy's own target rule filters the candidates first (`profile.canTarget`: 只攻击地面单位 …), then priority blocker → special priority → highest taunt → **latest deployed** (`aggroSeq`) — PRTS 索敌 "阻挡→特殊优先级→仇恨值→最早出现"; a stealthed ally is attacked only by the enemy it blocks (§19.1), and an enemy's area effects — splash, blasts, area skills, zones, jumps — and buff auras skip it unless it blocks that enemy, while 迷彩 does not protect from splash and the other area effects (`targeting.js areaSelectable` / `auraSelectable`, §22.12); an airborne (起飞) ally is never a ground enemy's selection — picks, area damage, zones and statuses skip it, while 无视无法选择 abilities, direct picks, debuff ticks and flying units still reach it (§21.22); unblocked, they stand for each attack's clip (enemies.json `attackAnim`: its wind-up before the strike and the rest of the clip after it, shortened when the attacks come quicker than the clip; `ATTACK_PAUSE = 0.35 s` after the strike when no clip is known; a 「不停止移动」 attacker never stops; §22.14). Every enemy attack strikes at its clip's damage frame after its swing starts — the first one of a contact too —, and a stun / freeze / sleep / 浮空, hiding, 缴械, 恐惧 or 战栗 (blocked) before that frame cuts the swing: no strike, the next swing starts from its wind-up (0.2.0, `ai.js attackWindup`; PRTS 状态机 / 异常效果 STUNNED; no clip known: no wind-up). FLY enemies ignore ground obstacles (only blockFly units block them) and follow their checkpoint route. A feared enemy runs between random 恐惧可达地块 away from the source (PRTS 诱发移动; `fear.js`); 恐惧 outranks 诱导; the 恐惧 / 诱导 walks re-plan from where the enemy stands after a push or an obstacle change, and the route re-plans when they end (§20.4).
|
||||
@@ -1616,7 +1616,7 @@ Withdrawn in 0.1.3 (§23.35): only elite 歌蕾蒂娅 carrying HOK-Y may use a
|
||||
- **Seen**: §21.4 left "隐匿 returns at once after a block (PRTS: 3 s)" [ASSUMED]; v0.1.1 hid an enemy again one tick after its block ended (a 潜伏者 whose blocker falls: untargetable 0.03 s later). Players reported (via the owner) that the 深池逐火 "stealth monster revives forever and can't be killed": a warrior knocked out while blocked releases its block through the 重生's 无法阻挡, its blocker takes the next warrior at once, and when the 重生 ends the ember is not blocked again — 隐匿, out of reach of ranged operators and operator splash — walks on and stands up with full HP 10 s later.
|
||||
- **Official** (checked on PRTS 2026-10-03): 作战机制 §隐匿 "对于绝大部分可隐匿的敌人而言,在被我方单位阻挡后会解除隐匿,不被阻挡的3秒后重新进入隐匿。这是敌方单位的隐匿所拥有的特殊机制,我方干员并不会因为阻挡而解除隐匿" and "少部分的隐匿表现上与我方干员相同…可能不具有这样的特殊机制"; §隐匿与Buff的关系 "在被阻挡时开关会被关掉从而失去隐匿,阻挡状态解除后3s开关重新被开启而恢复隐匿"; 异常效果 隐匿 "与'阻挡时解除'没有直接关系,该机制通常由其他效果实现". The enemy pages' 天赋 "隐匿(解除阻挡N秒后恢复)" (PRTS text search): 0 s on 21 enemies — here 业余竞演者, 节日爵士乐手, 假想敌:骨刺, 流泪小子 (both), 访问团强攻冠军, and the veil of 清明 / 堂皇 ("获得隐匿(解除阻挡0秒后恢复)"); 1 s on 家族灭迹人 / 家族暗影灭迹人; no page names another time. Every other stealthy enemy here has a plain 隐匿: 潜伏者, 隐形弩手 (+组长), 隐形术师, 山海众头目 / 秘使, 重弩突袭者, 架桥船工 / 扶桥老手, 深池伙友影刃精英, 潜水员 (in water), 锏's second form and the 深池逐火 embers (PRTS 深池逐火战士 / 精锐战士 / 护卫 "获得隐匿、缴械"). 山海众头目 / 秘使 天赋 "该隐匿每次生效后自身获得强击标记(不可叠加)", 技能 破隐一击 "仅持有强击标记且被阻挡时可触发…技能开始时消耗强击标记".
|
||||
- **Cause**: `targeting.js canTargetEnemy`, `snapshot.js flagsOf` and `Battle.foesInRadius` read `blockedBy` live, so the 隐匿 came back with the block's end.
|
||||
- **Now**: every block release — `Battle._unblock`, `releaseBlocked`, `ai.js enforceBlockCapacity` (a blocker's death, retreat or stun, a block-count drop, a push, 无法阻挡 / 浮空 / 恐惧, a teleport) — calls `Battle._stealthSwitch(e)`: each 隐匿 source buff the enemy holds gets a `stealthOff:<source key>` buff for its restore time, `constants.js STEALTH_RESTORE` (3 s) or the source's `data.stealthRestore` (`content/enemies.js STEALTH_RESTORE_BY_KEY`: the 0 s / 1 s enemies above; the veil 0 s). `targeting.js enemyStealthed(e)` — 隐匿 flag, not revealed (反隐), not blocked, and some source not switched off — is the one test for ally targeting (`canTargetEnemy`), operator area damage (`foesInRadius`), the b.snap stealth bit (drawn solid meanwhile), 节日爵士乐手 (attacks only without its 隐匿), 假想敌:骨刺 (3 targets only in 隐匿) and 山海众头目 (the mark comes at the spawn and whenever its 隐匿 turns on again, the next blocked attack spends it: a new block inside the 3 s gives no second ×2 hit — until 0.1.2 every block did). A new block inside the window lifts the 隐匿 again and its end restarts the window; a 反隐 that ends outside a window hides it at once, as before; a veiled 潜伏者 hides as soon as its block ends (the veil) and, if the veil runs out inside its own 3 s, is revealed until they end. Our operators' 隐匿 / 迷彩 are untouched (allies get no switch).
|
||||
- **Now**: every block release — `Battle._unblock`, `releaseBlocked`, `ai.js enforceBlockCapacity` (a blocker's death, retreat or stun, a block-count drop, a push, 无法阻挡 / 浮空 / 恐惧 / 沉睡 (since §24.9), a teleport) — calls `Battle._stealthSwitch(e)`: each 隐匿 source buff the enemy holds gets a `stealthOff:<source key>` buff for its restore time, `constants.js STEALTH_RESTORE` (3 s) or the source's `data.stealthRestore` (`content/enemies.js STEALTH_RESTORE_BY_KEY`: the 0 s / 1 s enemies above; the veil 0 s). `targeting.js enemyStealthed(e)` — 隐匿 flag, not revealed (反隐), not blocked, and some source not switched off — is the one test for ally targeting (`canTargetEnemy`), operator area damage (`foesInRadius`), the b.snap stealth bit (drawn solid meanwhile), 节日爵士乐手 (attacks only without its 隐匿), 假想敌:骨刺 (3 targets only in 隐匿) and 山海众头目 (the mark comes at the spawn and whenever its 隐匿 turns on again, the next blocked attack spends it: a new block inside the 3 s gives no second ×2 hit — until 0.1.2 every block did). A new block inside the window lifts the 隐匿 again and its end restarts the window; a 反隐 that ends outside a window hides it at once, as before; a veiled 潜伏者 hides as soon as its block ends (the veil) and, if the veil runs out inside its own 3 s, is revealed until they end. Our operators' 隐匿 / 迷彩 are untouched (allies get no switch).
|
||||
- **The 深池逐火 embers** (all three, `husk()` with `stealthy`): the knock-out releases the warrior's block at once (`_unblock` right after the 重生's 无法阻挡, as `applyStatus` does for a status) once the ember's 隐匿 is on, so the ember is revealed until 3 s after the knock-out — the 1 s 重生 stays 无敌 and untargetable, then about 2 s in which ranged operators and operator splash can hit it even though its blocker took the next warrior. An ember knocked out while not blocked is 隐匿 as soon as its 重生 ends (the switch only follows a block).
|
||||
- **Measured** (before = the v0.1.1 sim, after = this change; the flat stage with its row-9 lane, and real rounds on 战场#01 built like the match — an official wave with the TIMES pick, full content): the integrator's seven lineups (艾丝黛尔 / 角峰 / 隐现 / 幽灵鲨 against 1–4 战士 or 护卫): identical — 艾丝黛尔 alone against four 战士 2 s apart stays 0 / 4 because only one warrior is ever knocked out, and no lineup there knocks out a 护卫. 28 runs of a blocker + 2–3 ranged / splash operators against 4–6 战士 / 精锐战士 0.5–3 s apart: 81 → 84 of 126 killed, stand-ups 12 → 7 (23 runs unchanged, 4 one more kill, 1 one fewer — its blocker fell in the changed fight). Real rounds (R3 / R5 精锐战士 pick, R9 / R11 护卫 pick, three lineups up to the tier-4 four of §21.4's test): unchanged (R3 7 / 7, R5 5 / 16, R9 0 / 18, R11 0 / 28 for the tier-4 lineup; 0–1 for the weak ones). Why so little: in real rounds most knock-outs happen while the warrior is NOT blocked — ranged operators finish it on the way after it passed a full blocker (R5, tier-4 lineup: 10 of its 18 knock-outs, and 10 of the 13 embers that stood up again) — so its ember is 隐匿 at once, which is official; an ember freed by its own knock-out gets about 2 s after the 重生 and still needs 5 separate hits (火灰 10). What beats embers, officially: a free block slot where they walk (a second blocker behind the first), 反隐 (银灰 鹰眼视觉, 伊内丝 影哨, the SPT-X modules, 信仰搅拌机's module), or many fast hits.
|
||||
- [ASSUMED]: at the knock-out the 重生's cleanse comes first, then the ember's 隐匿 with the block-end switch, which outlasts the 重生 (PRTS documents neither the order nor whether the switch survives a 重生); 深池伙友影刃精英 and 锏's second form (PRTS writes their 隐匿 as the plain 异常效果 with no restore note) follow the general 3 s, not the "表现上与我方干员相同" kind; one switch per 隐匿 source — with several sources the enemy hides as soon as any is back on; a push or a teleport (DISAPPEAR) ends a block like any other release; a warrior released by its blocker less than 3 s before its knock-out leaves an ember that is 隐匿 straight after its 重生 (the window is opened by the knock-out's own release only — 4 of 55 knock-outs in the measured rounds, no outcome changed when prototyped).
|
||||
@@ -2172,7 +2172,7 @@ Decisions of the owner, 2026-10-04: a 联防 devour counts members who enter alr
|
||||
|
||||
## 24. Community reports after 0.1.3
|
||||
|
||||
Reports after the 0.1.3 release. Each was checked against the official data and PRTS; anything with no source is marked [ASSUMED]. Where each is handled: a skill clip with no Begin and no own Idle plays once (德克萨斯 S2 剑雨) → §24.1; 高台 for every melee chess whose trait reads 「可以放置于远程位」 (GitHub #153, PR #69) → §24.2; the 5-阿戈尔 revives go to the first 3 members knocked out (GitHub #105, #140) → §24.3; 联防 阿戈尔 devours the operator in front whoever owns it (GitHub #140) → §24.4; a special terrain tile explains itself on a tap (GitHub #184, PR #185) → §24.5; 活性源石 was two different materials on the two boards (GitHub #184, PR #185) → §24.6; 阿戈尔's devoured base ATK is a 最终加算 and a fallen marker's marks still resolve (GitHub #165, PR #176) → §24.7; 缇缇 S2's sleep pulses count for her trait (GitHub #162) → §24.8. Merged pull requests keep their own notes where they changed the rules: deploy-timed skills as duration skills (PR #109, §5 skill contract), the teammate's hand / temp / equipment in prep scouting (PR #129), 灵巧's knocked-out aura and the hidden-layer bonds (PR #66, research 02).
|
||||
Reports after the 0.1.3 release. Each was checked against the official data and PRTS; anything with no source is marked [ASSUMED]. Where each is handled: a skill clip with no Begin and no own Idle plays once (德克萨斯 S2 剑雨) → §24.1; 高台 for every melee chess whose trait reads 「可以放置于远程位」 (GitHub #153, PR #69) → §24.2; the 5-阿戈尔 revives go to the first 3 members knocked out (GitHub #105, #140) → §24.3; 联防 阿戈尔 devours the operator in front whoever owns it (GitHub #140) → §24.4; a special terrain tile explains itself on a tap (GitHub #184, PR #185) → §24.5; 活性源石 was two different materials on the two boards (GitHub #184, PR #185) → §24.6; 阿戈尔's devoured base ATK is a 最终加算 and a fallen marker's marks still resolve (GitHub #165, PR #176) → §24.7; 缇缇 S2's sleep pulses count for her trait (GitHub #162) → §24.8; a sleeping enemy cannot be blocked and takes no block slot (GitHub #140) → §24.9. Merged pull requests keep their own notes where they changed the rules: deploy-timed skills as duration skills (PR #109, §5 skill contract), the teammate's hand / temp / equipment in prep scouting (PR #129), 灵巧's knocked-out aura and the hidden-layer bonds (PR #66, research 02).
|
||||
|
||||
### 24.1 A skill clip with no Begin and no own Idle plays once — 德克萨斯 S2 剑雨 (player report) — `render/spine.js SpineActor.setSkill / update` (`SKILL_CLIP_MIN`, `skillClipOnce`, `skillEndPending`)
|
||||
|
||||
@@ -2440,3 +2440,64 @@ Reports after the 0.1.3 release. Each was checked against the official data and
|
||||
elite, S2 cast: an enemy at her back sleeps through 8 s of pulses and adds nothing beyond the ward's two operators; an
|
||||
enemy in range beside both wards — one entry per pulse — takes the trait to 24 / 48 within 6.5 s; fails on 0.1.3's
|
||||
code). The 125 test (a stun refresh is not an entry) and `kits_alt_t5`'s S2 test pass unchanged.
|
||||
|
||||
### 24.9 A sleeping enemy cannot be blocked: 沉睡 frees the block slot (GitHub #140; the owner's decision of 2026-10-06) — `sim/Battle.js _checkBlock / applyStatus`, `sim/ai.js updateEnemy`, `sim/buffs.js` (`sleep`), `kits/tier3.js` (瑕光 S2)
|
||||
|
||||
- **Seen**: GitHub #140 — a player tested 瑕光's S2 in the official mode (the 爱国者 stage): she put 4 enemies to sleep,
|
||||
the hounds that came next were still blocked, and after the skill no more were — 「被沉睡的敌人是不占用阻挡数的」. In the
|
||||
remake an enemy that fell asleep while blocked stayed blocked and kept its blocker's slot, so 瑕光 S2's sleepers filled
|
||||
her 3 block for the whole skill and the next enemies walked past her (the owner's first reply on #140 had kept that
|
||||
reading).
|
||||
- **Official**: PRTS 异常效果 — the 异常组合 SLEEPING 沉睡 = 「无法行动+无敌+不可阻挡」, and the 异常效果 BLOCK_FREE 不可阻挡 =
|
||||
「无法阻挡/被阻挡,自动解除阻挡」. 小睡 (DOZE) and 闭锁 (SHELTERING, 泥岩 S3) hold 不可阻挡 too — on operators, outside this
|
||||
change.
|
||||
- **Decision**: the owner's decision of 2026-10-06, as PRTS and the report say: a sleeping enemy cannot be blocked and
|
||||
takes no block slot.
|
||||
- **Cause**: 沉睡 was in neither block check. `Battle._checkBlock` refused `unblockable` / `levitate` / `fear` only, the
|
||||
release in `Battle.applyStatus` fired for those three flags, and `ai.js updateEnemy` returns early for an enemy that
|
||||
cannot act (a sleeper is `stun` too: `units.js`) before its own release check. The sleep template's `noBlock` only
|
||||
stops a sleeping operator from blocking.
|
||||
- **Now**: 沉睡 is one of the 不可阻挡 states. `applyStatus(enemy, 'sleep')` releases the enemy at once (`_unblock`: the
|
||||
blocker's slot frees for the next enemy; a 隐匿 enemy's block-end window starts, §22.8); `_checkBlock` never blocks a
|
||||
sleeper; a sleep added as a plain buff (`flags.sleep`) is let go on the enemy's next update (the cannot-act branch of
|
||||
`updateEnemy`). The sleeper stays where it fell asleep — overlapping its former blocker and whatever that blocker takes
|
||||
next — and when it wakes it is checked like any unblocked enemy: blocked again where it stands by a blocker in contact
|
||||
with a free slot (usually the same one), else it walks on through the full blocker. 瑕光 S2 (the ground enemies on her
|
||||
tile and the enemies she blocks): the sleepers free her 3 slots, she blocks the next 3 during the skill, and when S2
|
||||
ends the sleepers wake beside her and, her slots full, walk on — the report. A stun, a freeze or a refused sleep (23
|
||||
enemies are 沉睡免疫) keeps the block as before; sleeping operators are unchanged (they already released what they block).
|
||||
- **Other readers of the block** (checked): `Battle.blockedTargets` — blocked-first targeting, the DEFAULT trigger, the
|
||||
强攻手 / 重剑手 / 推击手 attack on every blocked enemy — no longer lists a sleeper. Only `hitSleep` attackers could target
|
||||
one, and of those only 瑕光 blocks: her 仁慈 (sleepers in her range first, ×atk_scale) reads her range, so a sleeper she
|
||||
let go in front of her is still her first target and one behind her is out of reach. A 要塞 that blocked nothing but a
|
||||
sleeper stalled (its melee branch found no target); it now fires its ranged splash. The "while blocking" effects
|
||||
(`unit.blocking`) do not count a sleeper; “庞贝”'s self-blast clock restarts when a sleep ends its block (as a 浮空
|
||||
already did); the snapshot's blocked bit (`UF.BLOCKED`, the client's block marker) follows. 荒芜拉普兰德 S1's 「非移动敌人」
|
||||
reads the sleep itself.
|
||||
- [ASSUMED]: a woken sleeper is re-blocked in the enemy update order (an enemy that reaches the blocker earlier in the
|
||||
same tick takes the slot first; PRTS gives no order) and where it stands, never pulled back to the blocker's front;
|
||||
“庞贝”'s clock restarts although its talent lists 沉睡 among the pauses — the 不可阻挡 ends the block, and
|
||||
「解除阻挡时重置计时」.
|
||||
- Golden: every moved scenario fields one of the three kits that sleep enemies (小满 S2, 瑕光 S2, 缇缇) and sleeps enemies
|
||||
that were blocked (counted with a probe): `roster-003` (小满 S2, 6 such sleeps: 82 kills instead of 83, 3 leaks instead
|
||||
of 2 at the 110 s timeout); `roster-005` (elite 小满 S2, 3: cleared at 136.73 s with 83 kills and 1 leak instead of the
|
||||
140 s timeout with 82 and 2); `roster-013` (缇缇 S3, 13: the same fight — only the `blocked` count, 23 → 34 with the
|
||||
woken sleepers held again, and the snapshot hashes, the blocked bit, move); `roster-032` (缇缇 S1, 4: 7 knock-outs
|
||||
instead of 5, 缇缇 among them, and 24 萨尔贡 layers instead of 34; same kills and leaks); `roster-038` (elite 缇缇 S2, 2:
|
||||
ends at 197.43 s instead of 197.27 s, 4 knock-outs instead of 3); `roster-039` (瑕光 S2, normal and elite, 32 + 22: the
|
||||
enemies they hold and put to sleep walk on when they wake with both blocks full — 41 of 52 killed instead of 47, 11
|
||||
leaks instead of 5 at the 170 s timeout); `roster-042` (缇缇 S2, 4: ends at 161.17 s instead of §24.8's 166.97 s);
|
||||
`bond-maniShip-high` (小满 S2 among the members, 1: only the `blocked` count, 29 → 30, and the snapshot hashes);
|
||||
`coop4-FUNNY-6` (ai_0's 缇缇: from round 9 her trait's 萨尔贡 / 精准 layers and ai_0 / ai_2's boss damage move);
|
||||
`coop4-ABYSS-7` (ai_2's 小满: rounds 11–12, one more kill and one fewer leak in round 11, four more kills in round 12);
|
||||
`coop2-NORMAL-8-serverrun` (ai_1's 缇缇: from round 10 its battles move — one more leak in round 10 — and the team is
|
||||
eliminated in round 13 instead of winning after round 14). `fields` did not move.
|
||||
- Tests: `test/sim/feedback4-sleep-unblock.test.js` (new; every case fails without this change) — a block-1 operator
|
||||
holding A: A falls asleep → released at once, the slot frees and B is blocked, A stays put; A wakes while B holds the
|
||||
slot → not blocked, it walks on; B knocked out while A sleeps → A stays unblocked beside the free operator and is
|
||||
blocked again the moment it wakes, never having moved; a plain-buff sleep is let go on the next update, a stun or a
|
||||
refused sleep keeps the block; `blockedTargets` drops the sleeper and takes B; the real 瑕光 S2 — her 3 blocked enemies
|
||||
sleep and are let go, she blocks the next 3 during S2, and when it ends the sleepers wake with no room and walk on.
|
||||
`playtest5_blocking` (its 瑕光 S2 test included), `combat`, `engine-requests`, `kits_t1t2` / `kits_alt_t2` (小满),
|
||||
`kits_t3` / `kits_alt_t3` (瑕光), `kits_t5` / `kits_alt_t5` / `garrisons_battle` (缇缇) and the other sleep and block
|
||||
suites pass unchanged.
|
||||
+9
-5
@@ -230,8 +230,11 @@ ground enemy (PRTS 围墙 / 围栏 地形机制 "部署在其中的单位,若
|
||||
unit; it walks on from there (found while checking community report F4 after 0.1.0, 深巡 on a fenced tile: 薄绿 S2 held
|
||||
the enemies she dragged against the fence; test/sim/feedback1f-fence.test.js). Air blocking (blockFly against flyers)
|
||||
stays [ASSUMED: PRTS restricts the rule to 地面阻挡], and a unit on a fenced tile still attacks whatever stands on its
|
||||
range tiles. It is checked every tick for every unblocked enemy, moving or
|
||||
not: an enemy that overlaps an operator when its blocker dies / is withdrawn / is stunned, or when the operator's
|
||||
range tiles. Never blocked: an enemy holding 不可阻挡 (PRTS 异常效果 BLOCK_FREE 「无法阻挡/被阻挡,自动解除阻挡」) —
|
||||
the `unblockable` flag (恐惧, 诱导 and many enemy abilities carry it), 浮空, and 沉睡 (SLEEPING = 无法行动+无敌+不可阻挡: an
|
||||
enemy falling asleep is released at once, its slot freeing for the next enemy, and stays where it is; once awake it is
|
||||
blocked again only by a blocker with room, else it walks on — DESIGN §24.9). It is checked every tick for every
|
||||
unblocked enemy, moving or not: an enemy that overlaps an operator when its blocker dies / is withdrawn / is stunned, or when the operator's
|
||||
blocked enemy dies, is taken over at once; an enemy that finds no room walks on (pass-through). Several blockers in
|
||||
contact → the nearest [ASSUMED]. A head-on enemy therefore stops at contact, ~0.71 tile from the blocker's centre, on the
|
||||
tile in front of it (PRTS 作战机制: a blocked enemy's collider does not enter the blocker's tile; the official few
|
||||
@@ -436,7 +439,7 @@ Guarantees content can rely on (pinned by `test/sim/robustness.test.js`):
|
||||
- **Runaway content.** At most `MAX_ALIVE_ENEMIES` (600) living enemies per field (`spawnEnemy` returns **null** beyond —
|
||||
content must handle it); a SpawnSpec `count` is capped the same way and `time: Infinity` spawns are never scheduled.
|
||||
- **Movement.** Route legs outside the rect are clamped onto it (h07_01's extra fly route runs along row 6, outside the
|
||||
boss rect: without the clamp the flyer hovered at the border forever). An enemy that gains `unblockable`/`levitate`
|
||||
boss rect: without the clamp the flyer hovered at the border forever). An enemy that gains `unblockable`/`levitate`/`sleep`
|
||||
through a plain buff is released by its blocker on its next update.
|
||||
- **Listener hygiene.** When a unit is removed for good (enemy killed/leaked, token expired or dead, device destroyed,
|
||||
permanent retreat) its hooks and periodic `every` timers registered with `{ owner: unit }` are dropped at the end of
|
||||
@@ -591,7 +594,7 @@ of coverage per 3 s), kept because the current wording no longer says so (feedba
|
||||
| `stun` | cannot act / move; **a stunned operator blocks nothing** (its blocked enemies are released: taken over by another operator in contact with room, else they walk on — §1.2 Blocking) | – |
|
||||
| `freeze` | stun; **enemies** also RES −15 | – |
|
||||
| `cold` | ASPD −30; a 2nd cold while cold ⇒ `freeze` for max(remaining cold, the incoming cold after 抵抗) — PRTS 术语释义 寒冷 「持续时间取双方之中最高」 (`COLD_FREEZE_DURATION` 3 s only when neither side has a duration; unless frozen-immune). [ASSUMED] the one catalogue cold uses that 友方 sentence for an enemy-applied cold too | – |
|
||||
| `sleep` | 无敌且无法行动: inactive, untargetable, **takes no damage** (unless the attacker profile has `hitSleep` or the damage `ignoreSleep`), blocks nothing | – |
|
||||
| `sleep` | 无敌且无法行动: inactive, untargetable, **takes no damage** (unless the attacker profile has `hitSleep` or the damage `ignoreSleep`), blocks nothing; PRTS 异常效果 SLEEPING = 无法行动+无敌+**不可阻挡**: an enemy asleep **cannot be blocked and takes no block slot** — its blocker lets go at once (the slot frees for the next enemy), it stays where it is, and when it wakes it is blocked again only by a blocker with room, else it walks on (DESIGN §24.9) | – |
|
||||
| `slow` | moveMul 1 − value (*strongest*) | default 0.5 |
|
||||
| `sluggish` (停顿) | moveMul 0.2 | – |
|
||||
| `bind` (束缚) | cannot move | – |
|
||||
@@ -614,7 +617,8 @@ of coverage per 3 s), kept because the current wording no longer says so (feedba
|
||||
| `defDown` / `resDown` | defMul 1 − value / RES −value (*strongest*) | 0.3 / 20 |
|
||||
|
||||
Unknown keys become a flag buff `{ [key]: true }`. Flags `noBlock` (blocks nothing) and `tremble` exist for custom buffs;
|
||||
a custom buff with `flags.sleep` also blocks nothing and is untargetable/invulnerable like the status. `noNewBlock` = the
|
||||
a custom buff with `flags.sleep` also blocks nothing, is untargetable/invulnerable and, on an enemy, cannot be blocked
|
||||
(its blocker lets go on the enemy's next update: `ai.js updateEnemy`) like the status. `noNewBlock` = the
|
||||
unit takes no new enemy by contact (`Battle._blockerFor`) and keeps the blocks it holds — content hands it its blockees
|
||||
(酒神's 迷狂牢笼, kits/ops/op-phatm2.js: PRTS "只在生成/刷新时判定阻挡新的敌人"); `undying` = a content 不死 window (淬羽赫默 S3,
|
||||
kits/ops/op-slent2.js — its own `fatal` hook holds it), which items/battle.js `holdsUndying` reports like 坚固维式重锤's.
|
||||
|
||||
+12
-3
@@ -11,7 +11,9 @@
|
||||
// path always follows `motion` — a hovering (近地悬浮) enemy is an air unit for targeting and blocking (Unit.isFlying)
|
||||
// but walks the ground. An unblocked enemy touching an ally with free block capacity — within its block radius (0.7071
|
||||
// ground, 0.8944 air, devices 0.4472; Battle._checkBlock) — is blocked, moving or not, so an enemy overlapping an
|
||||
// operator is taken over once its blocker is gone. Blocked enemies fight their blocker (ranged ones may pick anyone in
|
||||
// operator is taken over once its blocker is gone; never one holding 不可阻挡 (恐惧, 诱导, 浮空, 沉睡): an enemy falling
|
||||
// asleep is let go by its blocker, whose slot frees, and stays where it is until it wakes (DESIGN §24.9). Blocked
|
||||
// enemies fight their blocker (ranged ones may pick anyone in
|
||||
// range, blocker first); every blocker whose attack hits enemies — a ranged operator on a melee tile included — may
|
||||
// always target the enemies it blocks, in range or not, whatever its facing, and targets them first (acquireTargets,
|
||||
// Battle.blockedTargets; user playtest #6: "阻挡了就一定要能打到"); a heal attack keeps selecting injured allies while
|
||||
@@ -533,8 +535,15 @@ export function updateEnemy(b, e, dt) {
|
||||
// true: an unblocked ranged enemy in the wind-up of its next attack with a target in range (it stands)
|
||||
const winding = !e.hidden && !stunned && enemyAttack(b, e, prevCd);
|
||||
if (!e.alive) return;
|
||||
// a stun / freeze / sleep cuts the attack clip short: no stand left once it ends [ASSUMED]
|
||||
if (stunned && !e.hidden) { e.atkStandUntil = -Infinity; return; }
|
||||
// a stun / freeze / sleep cuts the attack clip short: no stand left once it ends [ASSUMED]. 沉睡 also holds 不可阻挡
|
||||
// (PRTS 异常效果 SLEEPING = 无法行动+无敌+不可阻挡): a sleeper's blocker lets go — its swing was cut above; Battle.applyStatus
|
||||
// (battle/status.js) releases it at once, this catches a sleep added as a plain buff (`flags.sleep` makes it `stun` too,
|
||||
// units.js) — and it stays where it is until it wakes (DESIGN §24.9)
|
||||
if (stunned && !e.hidden) {
|
||||
e.atkStandUntil = -Infinity;
|
||||
if (e.blockedBy && e.s.flags.sleep) b._unblock(e);
|
||||
return;
|
||||
}
|
||||
if (e.blockedBy) {
|
||||
const bl = e.blockedBy;
|
||||
// (unblockable/levitate/fear may also arrive through a plain addBuff, which does not unblock by itself; a
|
||||
|
||||
@@ -17,11 +17,14 @@ export class BattleBlocking {
|
||||
* ties → the first in row-then-column scan order. The air radius grows with the blocker's 阻挡半径倍率 (PRTS 游戏数据基础
|
||||
* "飞行阻挡半径 = 0.8944 × 阻挡半径倍率"; mod `blockRadiusScale` = 倍率 − 1: 凯尔希·思衡托's 遗尘守望 / S1, +0.23); ground
|
||||
* blocking ignores it (PRTS 数值范围 "对地面阻挡的单位不生效"). Below 1.5 tiles the 3×3 scan still finds every blocker.
|
||||
* Never blocked: an enemy holding 不可阻挡 (PRTS 异常效果 BLOCK_FREE 「无法阻挡/被阻挡,自动解除阻挡」) — the flag itself
|
||||
* (恐惧 / 诱导 carry it), 浮空, and 沉睡 (SLEEPING = 无法行动+无敌+不可阻挡: a sleeper takes no block slot, DESIGN §24.9);
|
||||
* once it wakes it is blocked again only by a blocker with room.
|
||||
*/
|
||||
_checkBlock(e) {
|
||||
if (e.blockedBy || e.hidden || !e.alive) return !!e.blockedBy;
|
||||
const f = e.s.flags;
|
||||
if (f.unblockable || f.levitate || f.fear) return false;
|
||||
if (f.unblockable || f.levitate || f.fear || f.sleep) return false;
|
||||
const r0 = Math.round(e.y), c0 = Math.round(e.x);
|
||||
const w = e.blockWeight ?? 1;
|
||||
let u = null, bd = Infinity;
|
||||
|
||||
@@ -143,7 +143,8 @@ export class BattleStatus {
|
||||
* (7级~专精二)…的虚弱(仅影响叠加优先级,不影响实际效果)"; other statuses refresh to the longer duration. 诱导 (`attract`) walks the enemy to `point`
|
||||
* ([r, c] or {x, y}; default the source's tile — a new application moves the point); 恐惧 (`fear`) stamps where it
|
||||
* was applied and from where (fear.js stampFear: the fan of 恐惧可达地块 its movement uses). A stunned/sleeping operator
|
||||
* releases the enemies it blocks; a feared/levitated/unblockable/attracted enemy is released by its blocker.
|
||||
* releases the enemies it blocks; a feared/levitated/unblockable/attracted/sleeping enemy is released by its blocker
|
||||
* (沉睡 = 无法行动+无敌+不可阻挡, PRTS 异常效果: the slot frees for the next enemy, the sleeper stays put — DESIGN §24.9).
|
||||
* `statusApplied` reports the final duration and `entered` (the target did not carry the status before) — or, with
|
||||
* `reenter`, entered anyway: a pulse whose own short status the caller re-applies as a fresh one each time (缇缇 S2's
|
||||
* sleep ward, DESIGN §24.8); the buff itself is refreshed as usual.
|
||||
@@ -213,7 +214,7 @@ export class BattleStatus {
|
||||
if (key === 'fear' && b && target.side === 'enemy') stampFear(this, target, b, source);
|
||||
}
|
||||
const f = tpl.flags;
|
||||
if (f && target.side === 'enemy' && (f.levitate || f.unblockable || f.fear)) this._unblock(target);
|
||||
if (f && target.side === 'enemy' && (f.levitate || f.unblockable || f.fear || f.sleep)) this._unblock(target);
|
||||
if (f && target.side === 'ally' && f.noBlock) this.releaseBlocked(target);
|
||||
if (this._hooks.statusApplied) this.emit('statusApplied', { source, target, status: key, duration, value, entered });
|
||||
return true;
|
||||
|
||||
+3
-1
@@ -62,7 +62,9 @@ export const STATUS = Object.freeze({
|
||||
// 寒冷: ASPD −30. A second cold while this one remains applies 冻结 for max(remaining, incoming)
|
||||
// (Battle.applyStatus; PRTS 术语释义 寒冷 「持续时间取双方之中最高」).
|
||||
cold: { flags: { cold: true }, mods: { aspd: COLD_ASPD } },
|
||||
// 沉睡: 无敌且无法行动 (untargetable, takes no damage — except from `hitSleep` attackers — and blocks nothing)
|
||||
// 沉睡: 无敌且无法行动 (untargetable, takes no damage — except from `hitSleep` attackers — and blocks nothing); PRTS 异常效果
|
||||
// SLEEPING = 无法行动+无敌+不可阻挡: an enemy asleep is not blocked either — its blocker lets go and the slot frees, it
|
||||
// stays put until it wakes (the `sleep` flag: Battle._checkBlock / applyStatus, ai.js updateEnemy; DESIGN §24.9)
|
||||
sleep: { flags: { sleep: true, noBlock: true }, immune: 'sleep' },
|
||||
// value = fraction of speed removed (0.8 ⇒ moveMul 0.2). Default 0.5.
|
||||
slow: { mods: (v) => ({ moveMul: 1 - clamp01(v ?? 0.5) }), valued: 0.5 },
|
||||
|
||||
@@ -87,7 +87,9 @@ export default {
|
||||
const dur = skill.timeLeft > 0 ? skill.timeLeft : Math.max(0.1, num(s.duration, 10));
|
||||
let n = 0;
|
||||
// PRTS 备注: "技能生效对象实际为“自身这格内的所有地面敌人及自身阻挡的敌人”,即使阻挡的是飞行敌人" — a blocked
|
||||
// enemy stands at the block radius, outside her tile (Battle._checkBlock)
|
||||
// enemy stands at the block radius, outside her tile (Battle._checkBlock). Asleep they are no longer blocked
|
||||
// (沉睡 = 不可阻挡, DESIGN §24.9; GitHub #140): her slots free for the next enemies, and a sleeper that wakes
|
||||
// is held again only while she has room
|
||||
for (const e of battle.enemies) {
|
||||
if (!e.alive || e.hidden) continue;
|
||||
if (e.blockedBy !== unit && (e.isFlying || !bodyOnTile(e, unit.tileR, unit.tileC))) continue;
|
||||
|
||||
@@ -56,8 +56,9 @@
|
||||
// phatm2_s_3[token_cooldown].interval (30) s more; her leaving withdraws them.
|
||||
// 迷狂牢笼 (kit below): 孤立 + 禁疗, no attack, 迷彩 (only the enemies it blocks target it), every damage it takes from
|
||||
// one of them is 1, any other damage (无来源 too) none — 3 HP: three hits; at its spawn / refresh it blocks every unblocked
|
||||
// enemy on its tile, ground or air, whatever its capacity, back to full HP, block count = their weight; it takes no other
|
||||
// enemy by contact (flag `noNewBlock`); with nobody blocked it leaves at once.
|
||||
// enemy on its tile, ground or air, whatever its capacity — none holding 不可阻挡 (恐惧, 诱导, 浮空, 沉睡: DESIGN §24.9) —,
|
||||
// back to full HP, block count = their weight; it takes no other enemy by contact (flag `noNewBlock`); with nobody blocked
|
||||
// it leaves at once.
|
||||
// Statuses: 束缚 (S1), 停顿 + 诱导 (本能的召唤); 神经损伤 bursts (engine: 3 麻痹 + 6000 元素伤害).
|
||||
|
||||
import { num, up, traitBb, talentBb, skillRec, once } from '../shared/tier1.js';
|
||||
@@ -195,13 +196,17 @@ function cageKit() {
|
||||
};
|
||||
}
|
||||
|
||||
/** A 牢笼 blocks every unblocked enemy on its tile (spawn / refresh): full HP again, block count = their weight. */
|
||||
/**
|
||||
* A 牢笼 blocks every unblocked enemy on its tile (spawn / refresh): full HP again, block count = their weight. Never one
|
||||
* holding 不可阻挡 — as Battle._checkBlock: the flag (恐惧 / 诱导 carry it), 浮空, 沉睡 (SLEEPING = 无法行动+无敌+不可阻挡, DESIGN
|
||||
* §24.9: a sleeper on its tile stays free and is not counted).
|
||||
*/
|
||||
function cageBlock(battle, cage) {
|
||||
let added = 0;
|
||||
for (const e of battle.enemies) {
|
||||
if (!e.alive || e.hidden || e.blockedBy || Math.round(e.y) !== cage.tileR || Math.round(e.x) !== cage.tileC) continue;
|
||||
const f = e.s.flags;
|
||||
if (f.unblockable || f.levitate || f.fear) continue;
|
||||
if (f.unblockable || f.levitate || f.fear || f.sleep) continue;
|
||||
e.blockedBy = cage;
|
||||
cage.blocking.push(e);
|
||||
e.moving = false;
|
||||
|
||||
@@ -795,10 +795,10 @@
|
||||
["p1","~3","token","token_10030_mlyss_wtrman",null,null,1041,1,39,0,203,0,0,3,null]
|
||||
],
|
||||
"enemies": {"enemy_1288_duskls":[11,11,0,210,63415],"enemy_1288_duskls_2":[7,7,0,0,48419],"enemy_1292_duskld":[5,5,0,1224,57650]},
|
||||
"hooks": [1,38,2463,282,321,531,531,506,23,25,19,15,0,11343,240,29,23,0,1,53,0,0,0],
|
||||
"hooks": [1,38,2463,282,321,531,531,506,23,25,19,15,0,11343,240,30,23,0,1,53,0,0,0],
|
||||
"events": {"atk":345,"deploy":12,"die":25,"dmg":531,"engage":12,"fx":192,"skill":34,"spawn":38,"status":429},
|
||||
"fx": {"aoe":2,"copy":1,"crit":4,"dp":2,"ember":23,"iceSpike":64,"palsy":2,"sleep":3,"split":3,"weightless":2,"zone":86},
|
||||
"snaps": "d611730f 72f36081 20e513c9 9b1492ea 30a7bcff a2282bf5 a4da67f3 a9100f8f 355ac0d2"
|
||||
"snaps": "d611730f 72f36081 20e513c9 9b1492ea 30a7bcff a2282bf5 ab6d9c8c 510e3001 1eb34354"
|
||||
},
|
||||
"bond-miraShip-low": {
|
||||
"about": "奇迹 low: tier 1 layers 1; chess_char_4_01_a chess_char_2_11_a chess_char_3_18_a chess_char_3_01_a chess_char_3_17_a chess_char_3_20_a chess_char_3_21_a chess_char_4_02_a",
|
||||
|
||||
+49
-51
@@ -5693,7 +5693,7 @@
|
||||
"hooks": [1,181,5641,1140,1140,1749,1921,274,136,158,79,78,0,53126,39,91,135,0,1,136,0,12,0],
|
||||
"events": {"atk":1140,"deploy":43,"die":158,"dmg":1921,"engage":25,"fx":503,"heal":78,"skill":157,"spawn":180,"status":109},
|
||||
"fx": {"aoe":148,"burst":12,"grow":274,"phase":17,"sleep":22,"summon":30},
|
||||
"snaps": "a2b6d681 a161dbba c8c77c2a e1ca6bcb 8a95ec41 de00e2b2 05566395 20db1c00 410a04db 8a3729a8 6098ba0c 704b60ae f781b8ab 17e5d22a cfb7925a b00e17a6 0d7b4086 15ca0ae7 2fd1162d"
|
||||
"snaps": "a2b6d681 a161dbba c8c77c2a e1ca6bcb 8a95ec41 de00e2b2 05566395 20db1c00 1a3f3737 feef3ad4 e4e5afe0 32f2a66a 4844c1a7 1adafe3e be28c9ee f51e131a 8ec3e3ca 39395053 208fb6d1"
|
||||
},
|
||||
"diy-132": {
|
||||
"about": "6_diy1_b=necras/S1 6_diy2_b=necras/S2 6_diy1_b=necras/S3 6_diy2_b=necras/S1/002_necras 6_diy1_b=necras/S2/002_necras 6_diy2_b=necras/S3/002_necras 5_diy1_a=kalts2/S1 5_diy2_a=kalts2/S2 5_diy1_a=kalts2/S3 5_diy2_b=kalts2/S1 5_diy1_b=kalts2/S2 5_diy2_b=kalts2/S3",
|
||||
@@ -5704,74 +5704,72 @@
|
||||
"round": 13,
|
||||
"seed": 326579774,
|
||||
"waveId": "act1autochess_h06",
|
||||
"time": 198.13,
|
||||
"ticks": 5944,
|
||||
"time": 199.5,
|
||||
"ticks": 5985,
|
||||
"reason": "cleared",
|
||||
"killed": 123,
|
||||
"total": 123,
|
||||
"unspawned": 0,
|
||||
"bossHpLeft": null,
|
||||
"rngDraws": 27,
|
||||
"rngDraws": 30,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {"p1":{"killed":123,"total":123,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1102059,"bossDmg":0,"heal":61381,"deaths":0,"layerGains":{}}},
|
||||
"players": {"p1":{"killed":123,"total":123,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1102819,"bossDmg":0,"heal":56852,"deaths":0,"layerGains":{}}},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_6_diy1_b",0,"none",1762,1,3,2,8973,0,0,13,2],
|
||||
["p1",2,"op","chess_char_6_diy2_b",1,"none",1762,1,4,1,53157,0,0,4,3],
|
||||
["p1",3,"op","chess_char_6_diy1_b",2,"none",1762,1,11,4,43088,0,0,49,5],
|
||||
["p1",4,"op","chess_char_6_diy2_b",0,"uniequip_002_necras",1962,1,13,9,60369,2143,22,52,6],
|
||||
["p1",5,"op","chess_char_6_diy1_b",1,"uniequip_002_necras",1962,1,5,4,33420,0,0,10,4],
|
||||
["p1",6,"op","chess_char_6_diy2_b",2,"uniequip_002_necras",1962,1,8,43,267110,0,0,108,9],
|
||||
["p1",1,"op","chess_char_6_diy1_b",0,"none",1762,1,3,0,1486,0,0,4,2],
|
||||
["p1",2,"op","chess_char_6_diy2_b",1,"none",1762,1,4,1,35265,0,0,3,2],
|
||||
["p1",3,"op","chess_char_6_diy1_b",2,"none",1762,1,11,4,37867,0,0,46,5],
|
||||
["p1",4,"op","chess_char_6_diy2_b",0,"uniequip_002_necras",1962,1,13,8,56850,2143,22,48,6],
|
||||
["p1",5,"op","chess_char_6_diy1_b",1,"uniequip_002_necras",1962,1,5,2,3502,0,0,0,2],
|
||||
["p1",6,"op","chess_char_6_diy2_b",2,"uniequip_002_necras",1962,1,8,39,303779,0,0,112,8],
|
||||
["p1",7,"op","chess_char_5_diy1_a",0,null,1741.25,1,12,0,0,0,939,4,1],
|
||||
["p1",8,"op","chess_char_5_diy2_a",1,null,1741.25,1,14,7,77755,0,473,12,1],
|
||||
["p1",8,"op","chess_char_5_diy2_a",1,null,1741.25,1,14,7,85738,0,473,12,1],
|
||||
["p1",9,"op","chess_char_5_diy1_a",2,null,1741.25,1,9,0,0,0,0,0,0],
|
||||
["p1",10,"op","chess_char_5_diy2_b",0,"none",1928.75,1,6,0,0,0,0,0,0],
|
||||
["p1",11,"op","chess_char_5_diy1_b",1,"none",1928.75,1,7,7,52418,0,0,10,1],
|
||||
["p1",11,"op","chess_char_5_diy1_b",1,"none",1928.75,1,7,3,32429,0,0,8,1],
|
||||
["p1",12,"op","chess_char_5_diy2_b",2,"none",1928.75,1,10,0,0,0,709,3,0],
|
||||
["-","~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_10043_necras_skeltn",null,null,1814.64,0,24,1,4296,4225,2924,10,null],
|
||||
["p1","~2","token","token_10043_necras_skeltn",null,null,0,0,29,0,462,1744,0,2,null],
|
||||
["p1","~3","token","token_10043_necras_skeltn",null,null,0,0,32,0,231,1744,0,1,null],
|
||||
["p1","~4","token","token_10043_necras_skeltn",null,null,3488,1,35,0,555,0,0,2,null],
|
||||
["p1","~5","token","token_10043_necras_skeltn",null,null,0,0,36,1,11636,5232,0,6,1],
|
||||
["p1","~2","token","token_10043_necras_skeltn",null,null,0,0,29,0,231,1744,0,1,null],
|
||||
["p1","~3","token","token_10043_necras_skeltn",null,null,1744,0,32,0,0,0,0,0,null],
|
||||
["p1","~4","token","token_10043_necras_skeltn",null,null,3488,1,35,0,0,0,0,0,null],
|
||||
["p1","~5","token","token_10043_necras_skeltn",null,null,0,0,36,1,3826,5232,0,5,0],
|
||||
["p1","~6","token","token_10043_necras_skeltn",null,null,3488,1,37,0,0,0,0,0,null],
|
||||
["p1","~7","token","token_10043_necras_skeltn",null,null,3488,1,38,0,0,0,0,0,null],
|
||||
["p1","~8","token","token_10043_necras_skeltn",null,null,0,0,39,0,3665,8985,5497,8,0],
|
||||
["p1","~9","token","token_10043_necras_skeltn",null,null,3488,1,45,0,2404,3777,4709,5,null],
|
||||
["p1","~10","token","token_10043_necras_skeltn",null,null,3488,0,46,0,647,0,0,2,0],
|
||||
["p1","~8","token","token_10043_necras_skeltn",null,null,0,0,39,0,1630,3488,0,4,0],
|
||||
["p1","~9","token","token_10043_necras_skeltn",null,null,3488,0,42,0,1988,837,837,4,0],
|
||||
["p1","~10","token","token_10043_necras_skeltn",null,null,2651.32,0,44,0,3560,5879,5042,7,0],
|
||||
["p1","~11","token","token_10043_necras_skeltn",null,null,3431.01,0,47,0,2821,2567,2510,5,null],
|
||||
["p1","~12","token","token_10043_necras_skeltn",null,null,811.72,0,50,0,786,932,0,3,0],
|
||||
["p1","~13","token","token_10043_necras_skeltn",null,null,13603.2,1,52,39,435375,23977,26686,40,7],
|
||||
["p1","~14","token","token_10043_necras_skeltn",null,null,3431.01,0,53,1,5149,1301,1740,13,0],
|
||||
["p1","~15","token","token_10043_necras_skeltn",null,null,0,0,55,0,231,1744,0,1,0],
|
||||
["p1","~16","token","token_10043_necras_skeltn",null,null,3488,0,56,1,2329,75,75,7,0],
|
||||
["p1","~17","token","token_10043_necras_skeltn",null,null,0,0,67,0,2035,3488,0,4,0],
|
||||
["p1","~18","token","token_10043_necras_skeltn",null,null,3384.16,0,71,1,4596,690,586,10,null],
|
||||
["p1","~19","token","token_10043_necras_skeltn",null,null,3488,0,76,0,0,0,0,0,0],
|
||||
["p1","~20","token","token_10043_necras_skeltn",null,null,3412.65,0,91,0,1838,462,387,5,0],
|
||||
["p1","~21","token","token_10043_necras_skeltn",null,null,3431.01,0,95,0,1283,2902,2845,3,null],
|
||||
["p1","~22","token","token_10043_necras_skeltn",null,null,0,0,96,0,694,3641,277,2,0],
|
||||
["p1","~23","token","token_10043_necras_skeltn",null,null,3488,0,98,0,462,114,114,1,0],
|
||||
["p1","~24","token","token_10043_necras_skeltn",null,null,3402.51,1,101,0,1803,85,0,5,null],
|
||||
["p1","~25","token","token_10043_necras_skeltn",null,null,3488,0,109,0,231,124,248,1,0],
|
||||
["p1","~26","token","token_10043_necras_skeltn",null,null,3488,0,110,0,0,114,114,0,0],
|
||||
["p1","~27","token","token_10043_necras_skeltn",null,null,3384.16,0,121,1,4596,690,586,10,null],
|
||||
["p1","~28","token","token_10043_necras_skeltn",null,null,3488,0,131,0,231,28,28,1,0],
|
||||
["p1","~29","token","token_10043_necras_skeltn",null,null,0,0,132,0,2035,3516,28,4,0],
|
||||
["p1","~30","token","token_10043_necras_skeltn",null,null,3488,1,145,0,3225,4518,4518,6,null],
|
||||
["p1","~31","token","token_10043_necras_skeltn",null,null,3459.5,0,150,0,647,334,553,2,0],
|
||||
["p1","~32","token","token_10043_necras_skeltn",null,null,1744,0,152,0,231,0,0,1,0],
|
||||
["p1","~33","token","token_10043_necras_skeltn",null,null,3384.16,0,153,0,6335,3714,3610,13,0],
|
||||
["p1","~34","token","token_10043_necras_skeltn",null,null,3488,0,155,0,0,0,0,0,0],
|
||||
["p1","~35","token","token_10043_necras_skeltn",null,null,3488,0,163,1,4477,1201,1201,11,0],
|
||||
["p1","~36","token","token_10043_necras_skeltn",null,null,3488,0,166,0,0,0,0,0,0],
|
||||
["p1","~37","token","token_10043_necras_skeltn",null,null,3488,1,174,0,462,0,0,1,0]
|
||||
["p1","~12","token","token_10043_necras_skeltn",null,null,13603.2,1,50,54,484229,22551,23493,43,7],
|
||||
["p1","~13","token","token_10043_necras_skeltn",null,null,2565.83,0,52,1,6327,6902,5980,14,0],
|
||||
["p1","~14","token","token_10043_necras_skeltn",null,null,3488,0,54,0,2266,0,0,4,0],
|
||||
["p1","~15","token","token_10043_necras_skeltn",null,null,0,0,66,0,1988,3488,0,4,0],
|
||||
["p1","~16","token","token_10043_necras_skeltn",null,null,3402.51,0,67,0,832,199,114,2,0],
|
||||
["p1","~17","token","token_10043_necras_skeltn",null,null,3384.16,0,70,1,4596,690,586,10,null],
|
||||
["p1","~18","token","token_10043_necras_skeltn",null,null,3488,0,82,0,0,0,0,0,0],
|
||||
["p1","~19","token","token_10043_necras_skeltn",null,null,3431.01,0,93,0,1283,2902,2845,3,null],
|
||||
["p1","~20","token","token_10043_necras_skeltn",null,null,0,0,95,0,1526,3516,28,3,0],
|
||||
["p1","~21","token","token_10043_necras_skeltn",null,null,3488,0,98,0,0,0,0,0,0],
|
||||
["p1","~22","token","token_10043_necras_skeltn",null,null,3488,0,101,0,0,57,57,0,0],
|
||||
["p1","~23","token","token_10043_necras_skeltn",null,null,3459.5,0,109,0,347,210,305,1,0],
|
||||
["p1","~24","token","token_10043_necras_skeltn",null,null,3488,0,112,0,0,0,0,0,0],
|
||||
["p1","~25","token","token_10043_necras_skeltn",null,null,3384.16,0,119,1,4596,690,586,10,null],
|
||||
["p1","~26","token","token_10043_necras_skeltn",null,null,0,0,132,0,4138,4341,853,10,0],
|
||||
["p1","~27","token","token_10043_necras_skeltn",null,null,3488,0,135,0,0,0,0,0,0],
|
||||
["p1","~28","token","token_10043_necras_skeltn",null,null,3488,1,143,0,1283,2845,2845,3,null],
|
||||
["p1","~29","token","token_10043_necras_skeltn",null,null,1744,0,150,0,231,0,0,1,0],
|
||||
["p1","~30","token","token_10043_necras_skeltn",null,null,3488,0,151,0,8300,4581,4581,16,0],
|
||||
["p1","~31","token","token_10043_necras_skeltn",null,null,3488,0,152,0,1526,0,0,4,0],
|
||||
["p1","~32","token","token_10043_necras_skeltn",null,null,1744,1,154,0,0,0,0,0,null],
|
||||
["p1","~33","token","token_10043_necras_skeltn",null,null,1744,1,155,0,0,0,0,0,null],
|
||||
["p1","~34","token","token_10043_necras_skeltn",null,null,3431.01,1,167,0,4081,808,1123,9,0],
|
||||
["p1","~35","token","token_10043_necras_skeltn",null,null,3488,1,169,0,0,0,0,0,0]
|
||||
],
|
||||
"enemies": {"enemy_1019_jshoot_2":[57,57,0,8639,255302],"enemy_1299_ymkilr_2":[27,27,0,72081,492687],"enemy_1422_lrsldr_2":[39,39,0,3348,355830]},
|
||||
"hooks": [1,174,5944,840,840,1293,1293,213,131,152,40,39,20,29951,48,127,123,0,1,131,0,0,0],
|
||||
"events": {"atk":840,"deploy":49,"die":152,"dmg":1292,"engage":39,"fx":369,"heal":80,"skill":79,"spawn":174,"status":44},
|
||||
"fx": {"aoe":126,"grow":150,"healAoe":20,"shield":23,"sleep":7,"summon":37,"takeoff":6},
|
||||
"snaps": "84c34497 3ba00c17 23904482 05a48a6a 5c8edcc9 e3901661 b182f761 9164cbb2 af7418a9 f60eb6cc 35935c64 86c45aae 689f94d2 fc485851 4d80d363 25842ab6 4b72339c d025887f d04447e8 8fd2db5a"
|
||||
"enemies": {"enemy_1019_jshoot_2":[57,57,0,7920,255302],"enemy_1299_ymkilr_2":[27,27,0,69593,492687],"enemy_1422_lrsldr_2":[39,39,0,2382,355830]},
|
||||
"hooks": [1,172,5985,781,781,1168,1168,189,129,149,35,34,18,26850,44,130,123,0,1,129,0,0,0],
|
||||
"events": {"atk":781,"deploy":47,"die":149,"dmg":1167,"engage":30,"fx":343,"heal":78,"skill":69,"spawn":172,"status":31},
|
||||
"fx": {"aoe":123,"grow":134,"healAoe":18,"shield":23,"sleep":4,"summon":35,"takeoff":6},
|
||||
"snaps": "84c34497 8a3fd98c 7ef5badd e49f0e0f 5636bc92 044d1776 80c0d96c 76a2965c 4721a4ad 499bee66 525bcd3a 2d11913f 0e842ba4 12c8f78e b5520f0d c2a44cb7 27962480 c897b4ed 5da90a45 53e377fa"
|
||||
},
|
||||
"diy-133": {
|
||||
"about": "6_diy1_a=kalts2/S1 6_diy2_a=kalts2/S2 6_diy1_a=kalts2/S3 6_diy2_b=kalts2/S1 6_diy1_b=kalts2/S2 6_diy2_b=kalts2/S3 5_diy1_a=monstr/S1 5_diy2_a=monstr/S2 5_diy1_a=monstr/S3 5_diy2_b=monstr/S1 5_diy1_b=monstr/S2 5_diy2_b=monstr/S3",
|
||||
|
||||
+45
-45
@@ -40,7 +40,7 @@
|
||||
"title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"},
|
||||
"trophies": 0,
|
||||
"reward": 113,
|
||||
"stats": {"activatedLayers":78,"bossDamage":50000,"dmgDealt":546766,"gold":72,"itemsEquipped":10,"kills":160,"leaks":0,"lpLost":0,"merges":2,"perfectRounds":8,"refreshes":14},
|
||||
"stats": {"activatedLayers":78,"bossDamage":50000,"dmgDealt":545829,"gold":72,"itemsEquipped":10,"kills":160,"leaks":0,"lpLost":0,"merges":2,"perfectRounds":8,"refreshes":14},
|
||||
"lineup": ["4_14_a@12,7","2_08_a@12,8[4_05_e_a+2_04_e_b]","2_14_a@11,8","3_10_a@10,3","2_17_a@10,4[1_01_e_b+4_02_e_a]","4_01_b@10,7","1_12_b@10,8[3_05_e_a+5_02_e_a]","5_02_a@9,8[4_08_e_a]"],
|
||||
"bonds": ["deputShip 0/16","emptyShip 1/0","indomShip 0/7","preciShip 1/7","sargonShip 1/28","steadShip 2/38","swiftShip 1/5"]
|
||||
}
|
||||
@@ -869,7 +869,7 @@
|
||||
"combat": "client",
|
||||
"boost": null,
|
||||
"setup": {"stageId":"act1autochess_m01","bossId":"boss_3","hiddenBossId":null,"factions":["TIMES","ELEMENT","REFLECTION"]},
|
||||
"end": {"victory":true,"roundsPassed":14,"hiddenReached":false,"hiddenCleared":false,"reason":"victory","teamLp":124,"bossPoolLeft":0,"virtualMs":133000},
|
||||
"end": {"victory":true,"roundsPassed":14,"hiddenReached":false,"hiddenCleared":false,"reason":"victory","teamLp":130,"bossPoolLeft":0,"virtualMs":133000},
|
||||
"rng": {"setup":16,"shop":893,"waves":0,"draft":25,"bots":35892,"meta":29},
|
||||
"errors": {"engine":0,"logged":0,"sim":0,"dispatcher":0},
|
||||
"rounds": [
|
||||
@@ -931,36 +931,36 @@
|
||||
},
|
||||
{
|
||||
"round": 9,
|
||||
"ai_0": [1,26,12,0,0,4,8,"fc454676",169,"deputShip 1/47, kjeragShip 0/2, preciShip 2/40, sargonShip 1/44, steadShip 1/38",30,30,0,74],
|
||||
"ai_0": [1,26,12,0,0,4,8,"fc454676",166,"deputShip 1/47, kjeragShip 0/2, preciShip 2/39, sargonShip 1/42, steadShip 1/38",30,30,0,74],
|
||||
"ai_1": [1,45,12,0,0,4,8,"e1506142",83,"deputShip 2/48, emptyShip 1/4, preciShip 0/4, sargonShip 0/2, siracusaShip 1/31, steadShip 0/4",28,30,2,70],
|
||||
"ai_2": [1,28,12,0,0,4,8,"6965081a",70,"sargonShip 0/8, siracusaShip 1/58, swiftShip 1/12, visiShip 1/0, yanShip 0/1",30,30,0,72],
|
||||
"ai_3": [1,31,13,0,0,4,8,"5f784848",153,"deputShip 1/16, emptyShip 1/12, kjeragShip 1/30, preciShip 1/72, siracusaShip 0/3, swiftShip 1/23, yanShip 0/1",30,30,0,76]
|
||||
},
|
||||
{
|
||||
"round": 10,
|
||||
"ai_0": [1,26,12,0,0,5,8,"2b6a123a",243,"deputShip 1/53, kjeragShip 0/2, preciShip 2/72, sargonShip 1/70, steadShip 1/48",29,29,0,86],
|
||||
"ai_0": [1,26,12,0,0,5,8,"2b6a123a",256,"deputShip 1/53, kjeragShip 0/2, preciShip 2/79, sargonShip 1/76, steadShip 1/48",29,29,0,86],
|
||||
"ai_1": [1,45,12,0,0,5,8,"5bcc6998",105,"deputShip 2/58, emptyShip 1/8, preciShip 0/4, sargonShip 0/2, siracusaShip 1/39, steadShip 0/4",29,29,0,82],
|
||||
"ai_2": [1,28,12,0,0,5,8,"fe139ef2",72,"sargonShip 0/8, siracusaShip 2/60, swiftShip 1/12, visiShip 1/0, yanShip 0/1",29,29,0,83],
|
||||
"ai_3": [1,31,12,0,0,5,8,"9ce217c6",163,"deputShip 1/18, emptyShip 0/12, kjeragShip 2/34, preciShip 1/81, siracusaShip 0/3, swiftShip 1/30, yanShip 0/1",29,29,0,88]
|
||||
},
|
||||
{
|
||||
"round": 11,
|
||||
"ai_0": [1,26,12,0,0,5,8,"5c1d4d08",279,"deputShip 1/55, kjeragShip 0/2, preciShip 1/82, sargonShip 1/84, steadShip 1/58",28,28,0,99],
|
||||
"ai_1": [1,39,12,0,0,5,8,"6ceb3315",133,"deputShip 2/68, emptyShip 1/15, preciShip 0/4, sargonShip 0/2, siracusaShip 1/50, steadShip 0/4",10,28,18,94],
|
||||
"ai_0": [1,26,12,0,0,5,8,"5c1d4d08",288,"deputShip 1/55, kjeragShip 0/2, preciShip 1/87, sargonShip 1/88, steadShip 1/58",28,28,0,99],
|
||||
"ai_1": [1,45,12,0,0,5,8,"6ceb3315",133,"deputShip 2/68, emptyShip 1/15, preciShip 0/4, sargonShip 0/2, siracusaShip 1/50, steadShip 0/4",10,28,18,94],
|
||||
"ai_2": [1,28,12,0,0,5,8,"8321f307",124,"emptyShip 1/0, sargonShip 0/8, siracusaShip 2/100, swiftShip 1/24, yanShip 0/1",28,28,0,95],
|
||||
"ai_3": [1,31,12,0,0,5,7,"5e2bfa81",195,"deputShip 0/18, emptyShip 0/12, kjeragShip 2/68, preciShip 1/92, siracusaShip 0/3, swiftShip 1/35, visiShip 1/0, yanShip 0/1",28,28,0,98]
|
||||
},
|
||||
{
|
||||
"round": 12,
|
||||
"ai_0": [1,26,12,0,0,6,8,"934bb983",397,"deputShip 1/57, emptyShip 1/2, kjeragShip 0/2, preciShip 1/132, sargonShip 1/138, steadShip 1/68",46,46,0,111],
|
||||
"ai_1": [1,39,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_0": [1,26,12,0,0,6,8,"934bb983",406,"deputShip 1/57, emptyShip 1/2, kjeragShip 0/2, preciShip 1/137, sargonShip 1/142, steadShip 1/68",46,46,0,111],
|
||||
"ai_1": [1,45,12,0,0,6,8,"d4b1958d",155,"deputShip 2/78, emptyShip 1/19, preciShip 0/4, sargonShip 0/2, siracusaShip 1/58, steadShip 0/4",20,46,26,104],
|
||||
"ai_2": [1,28,12,0,0,6,8,"696f5ca3",164,"emptyShip 1/0, sargonShip 0/8, siracusaShip 2/140, swiftShip 1/24, yanShip 0/1",46,46,0,106],
|
||||
"ai_3": [1,31,12,0,0,6,8,"2e3cd509",247,"deputShip 0/18, emptyShip 0/12, kjeragShip 2/108, 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",451,"deputShip 1/59, emptyShip 1/4, kjeragShip 0/7, preciShip 2/150, sargonShip 1/160, steadShip 1/78",32,32,0,126],
|
||||
"ai_1": [1,39,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_0": [1,26,12,0,0,6,8,"2df19066",460,"deputShip 1/59, emptyShip 1/4, kjeragShip 0/7, preciShip 2/155, sargonShip 1/164, steadShip 1/78",32,32,0,126],
|
||||
"ai_1": [1,45,12,0,2,6,8,"9346fb5a",177,"deputShip 1/86, emptyShip 1/21, preciShip 1/6, sargonShip 0/2, siracusaShip 1/64, steadShip 0/4",32,32,0,115],
|
||||
"ai_2": [1,28,12,0,0,6,8,"0236b2a3",238,"emptyShip 1/0, sargonShip 0/8, siracusaShip 2/214, swiftShip 1/24, yanShip 0/1",32,32,0,117],
|
||||
"ai_3": [1,31,12,0,0,6,7,"ceba29b5",265,"deputShip 0/18, emptyShip 0/12, kjeragShip 1/116, preciShip 2/104, siracusaShip 0/3, swiftShip 1/45, yanShip 0/1",32,32,0,124]
|
||||
}
|
||||
@@ -976,21 +976,21 @@
|
||||
"title": {"id":"comment_2","name":"不朽盟约","picId":"comment_icon_2","text":"激活的盟约层数总和最高"},
|
||||
"trophies": 3,
|
||||
"reward": 250,
|
||||
"stats": {"activatedLayers":473,"bossDamage":45466,"dmgDealt":1686683,"gold":140,"itemsEquipped":25,"kills":323,"leaks":0,"lpLost":0,"merges":5,"perfectRounds":13,"refreshes":21},
|
||||
"stats": {"activatedLayers":482,"bossDamage":46468,"dmgDealt":1661472,"gold":140,"itemsEquipped":25,"kills":311,"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/152","sargonShip 1/166","steadShip 1/88"]
|
||||
"bonds": ["deputShip 1/61","emptyShip 1/6","kjeragShip 0/7","preciShip 2/157","sargonShip 1/170","steadShip 1/88"]
|
||||
},
|
||||
"ai_1": {
|
||||
"alive": true,
|
||||
"victory": true,
|
||||
"roundsPassed": 14,
|
||||
"eliminatedRound": null,
|
||||
"lp": 39,
|
||||
"lp": 45,
|
||||
"bandId": "band_sarkazb",
|
||||
"title": {"id":"comment_4","name":"精英云集","picId":"comment_icon_4","text":"晋升精锐次数最多"},
|
||||
"title": {"id":"comment_3","name":"坚若磐石","picId":"comment_icon_3","text":"目标生命值损失最少"},
|
||||
"trophies": 3,
|
||||
"reward": 250,
|
||||
"stats": {"activatedLayers":207,"bossDamage":11698,"dmgDealt":1301544,"gold":129,"itemsEquipped":20,"kills":238,"leaks":46,"lpLost":6,"merges":6,"perfectRounds":10,"refreshes":20},
|
||||
"stats": {"activatedLayers":207,"bossDamage":11698,"dmgDealt":1301544,"gold":129,"itemsEquipped":20,"kills":238,"leaks":46,"lpLost":0,"merges":6,"perfectRounds":10,"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"]
|
||||
},
|
||||
@@ -1001,10 +1001,10 @@
|
||||
"eliminatedRound": null,
|
||||
"lp": 28,
|
||||
"bandId": "band_mlyss",
|
||||
"title": {"id":"comment_3","name":"坚若磐石","picId":"comment_icon_3","text":"目标生命值损失最少"},
|
||||
"title": {"id":"comment_5","name":"万事俱备","picId":"comment_icon_5","text":"装备配发数量最多"},
|
||||
"trophies": 3,
|
||||
"reward": 250,
|
||||
"stats": {"activatedLayers":260,"bossDamage":82959,"dmgDealt":1713206,"gold":127,"itemsEquipped":20,"kills":283,"leaks":0,"lpLost":0,"merges":3,"perfectRounds":13,"refreshes":16},
|
||||
"stats": {"activatedLayers":260,"bossDamage":81958,"dmgDealt":1639551,"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"]
|
||||
},
|
||||
@@ -1018,7 +1018,7 @@
|
||||
"title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"},
|
||||
"trophies": 3,
|
||||
"reward": 250,
|
||||
"stats": {"activatedLayers":311,"bossDamage":144877,"dmgDealt":1731577,"gold":138,"itemsEquipped":36,"kills":282,"leaks":1,"lpLost":0,"merges":3,"perfectRounds":12,"refreshes":23},
|
||||
"stats": {"activatedLayers":311,"bossDamage":144877,"dmgDealt":1819100,"gold":138,"itemsEquipped":36,"kills":300,"leaks":1,"lpLost":0,"merges":3,"perfectRounds":12,"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/120","preciShip 2/117","siracusaShip 0/3","swiftShip 1/54","yanShip 0/1"]
|
||||
}
|
||||
@@ -1096,21 +1096,21 @@
|
||||
},
|
||||
{
|
||||
"round": 9,
|
||||
"ai_0": [1,18,12,0,1,4,8,"a359f7ee",129,"arcaneShip 1/8, indomShip 1/2, kazimierzShip 1/38, kjeragShip 0/5, preciShip 2/47, suntShip 1/0, swiftShip 1/34",9,19,10,76],
|
||||
"ai_0": [1,17,12,0,1,4,8,"a359f7ee",129,"arcaneShip 1/8, indomShip 1/2, kazimierzShip 1/38, kjeragShip 0/5, preciShip 2/47, suntShip 1/0, swiftShip 1/34",9,19,10,76],
|
||||
"ai_1": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kazimierzShip 0/29, kjeragShip 0/7, preciShip 0/2, sargonShip 0/8, siracusaShip 0/12, skillfulShip 0/5, steadShip 0/2, swiftShip 0/19",null,null,null,62],
|
||||
"ai_2": [1,10,12,0,1,4,8,"8df12b45",145,"deputShip 0/22, egirShip 0/6, kazimierzShip 0/2, kjeragShip 0/12, preciShip 0/4, raidShip 0/6, siracusaShip 0/2, skillfulShip 1/8, soloShip 1/14, steadShip 1/48, suntShip 1/0, swiftShip 1/50, victoriaShip 1/25, yanShip 0/13",19,19,0,76],
|
||||
"ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/13, deputShip 0/8, miraShip 0/10, preciShip 0/4, sargonShip 0/2, siracusaShip 0/32, skillfulShip 0/4, soloShip 0/12",null,null,null,68]
|
||||
},
|
||||
{
|
||||
"round": 10,
|
||||
"ai_0": [1,13,13,0,0,5,8,"1c690635",153,"arcaneShip 1/8, indomShip 1/4, kazimierzShip 1/46, kjeragShip 0/5, preciShip 2/56, suntShip 1/0, swiftShip 1/39",17,25,8,88],
|
||||
"ai_0": [1,12,13,0,0,5,8,"1c690635",153,"arcaneShip 1/8, indomShip 1/4, kazimierzShip 1/46, kjeragShip 0/5, preciShip 2/56, suntShip 1/0, swiftShip 1/39",17,25,8,88],
|
||||
"ai_1": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kazimierzShip 0/29, kjeragShip 0/7, preciShip 0/2, sargonShip 0/8, siracusaShip 0/12, skillfulShip 0/5, steadShip 0/2, swiftShip 0/19",null,null,null,62],
|
||||
"ai_2": [1,10,13,0,0,5,8,"0e4a12ab",175,"deputShip 0/24, egirShip 0/6, kazimierzShip 0/2, kjeragShip 0/12, lateranoShip 0/2, preciShip 0/4, raidShip 0/6, siracusaShip 0/2, skillfulShip 1/12, soloShip 1/14, steadShip 1/54, suntShip 1/0, swiftShip 1/64, victoriaShip 1/31, yanShip 0/15",25,25,0,89],
|
||||
"ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/13, deputShip 0/8, miraShip 0/10, preciShip 0/4, sargonShip 0/2, siracusaShip 0/32, skillfulShip 0/4, soloShip 0/12",null,null,null,68]
|
||||
},
|
||||
{
|
||||
"round": 11,
|
||||
"ai_0": [1,3,12,0,1,5,8,"1d31e5b7",213,"arcaneShip 1/8, indomShip 0/4, kazimierzShip 1/68, kjeragShip 0/5, preciShip 2/74, raidShip 1/12, suntShip 1/0, swiftShip 1/51",12,25,13,100],
|
||||
"ai_0": [1,2,12,0,1,5,8,"1d31e5b7",213,"arcaneShip 1/8, indomShip 0/4, kazimierzShip 1/68, kjeragShip 0/5, preciShip 2/74, raidShip 1/12, suntShip 1/0, swiftShip 1/51",12,25,13,100],
|
||||
"ai_1": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, kazimierzShip 0/29, kjeragShip 0/7, preciShip 0/2, sargonShip 0/8, siracusaShip 0/12, skillfulShip 0/5, steadShip 0/2, swiftShip 0/19",null,null,null,62],
|
||||
"ai_2": [0,0,12,0,0,5,0,"811c9dc5",0,"deputShip 0/24, egirShip 0/6, kazimierzShip 0/2, kjeragShip 0/14, lateranoShip 0/2, preciShip 0/6, raidShip 0/6, siracusaShip 0/2, skillfulShip 0/16, soloShip 0/14, steadShip 0/56, swiftShip 0/78, victoriaShip 0/35, yanShip 0/35",6,25,19,100],
|
||||
"ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/13, deputShip 0/8, miraShip 0/10, preciShip 0/4, sargonShip 0/2, siracusaShip 0/32, skillfulShip 0/4, soloShip 0/12",null,null,null,68]
|
||||
@@ -1134,7 +1134,7 @@
|
||||
"title": {"id":"comment_4","name":"精英云集","picId":"comment_icon_4","text":"晋升精锐次数最多"},
|
||||
"trophies": 2,
|
||||
"reward": 255,
|
||||
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":3052677,"gold":114,"itemsEquipped":8,"kills":110,"leaks":99,"lpLost":52,"merges":5,"perfectRounds":5,"refreshes":9},
|
||||
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":3052677,"gold":114,"itemsEquipped":8,"kills":110,"leaks":99,"lpLost":53,"merges":5,"perfectRounds":5,"refreshes":9},
|
||||
"lineup": [],
|
||||
"bonds": ["arcaneShip 0/8","indomShip 0/4","kazimierzShip 0/88","kjeragShip 0/5","preciShip 0/87","raidShip 0/24","swiftShip 0/56"]
|
||||
},
|
||||
@@ -1162,7 +1162,7 @@
|
||||
"title": {"id":"comment_5","name":"万事俱备","picId":"comment_icon_5","text":"装备配发数量最多"},
|
||||
"trophies": 2,
|
||||
"reward": 213,
|
||||
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":3000171,"gold":100,"itemsEquipped":10,"kills":148,"leaks":37,"lpLost":28,"merges":3,"perfectRounds":6,"refreshes":9},
|
||||
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":2969116,"gold":100,"itemsEquipped":10,"kills":147,"leaks":37,"lpLost":28,"merges":3,"perfectRounds":6,"refreshes":9},
|
||||
"lineup": [],
|
||||
"bonds": ["deputShip 0/24","egirShip 0/6","kazimierzShip 0/2","kjeragShip 0/14","lateranoShip 0/2","preciShip 0/6","raidShip 0/6","siracusaShip 0/2","skillfulShip 0/16","soloShip 0/14","steadShip 0/56","swiftShip 0/78","victoriaShip 0/35","yanShip 0/35"]
|
||||
},
|
||||
@@ -1287,7 +1287,7 @@
|
||||
"title": {"id":"comment_2","name":"不朽盟约","picId":"comment_icon_2","text":"激活的盟约层数总和最高"},
|
||||
"trophies": 3,
|
||||
"reward": 320,
|
||||
"stats": {"activatedLayers":229,"bossDamage":209249,"dmgDealt":3889730,"gold":143,"itemsEquipped":22,"kills":284,"leaks":9,"lpLost":9,"merges":4,"perfectRounds":12,"refreshes":16},
|
||||
"stats": {"activatedLayers":229,"bossDamage":209249,"dmgDealt":3885078,"gold":143,"itemsEquipped":22,"kills":284,"leaks":9,"lpLost":9,"merges":4,"perfectRounds":12,"refreshes":16},
|
||||
"lineup": ["5_15_a@11,3[3_01_e_b+1_01_e_a]","1_17_b@11,6","6_11_a@11,7","6_19_a@11,8[4_04_e_a+4_10_e_a]","6_01_a@10,3[1_02_e_b+5_07_e_a]","4_10_a@10,7[3_08_e_a+3_01_e_b]","1_08_b@10,8[4_03_e_a+6_09_e_a]","4_02_a@9,9[3_11_e_a+1_05_e_a]"],
|
||||
"bonds": ["arcaneShip 2/37","indomShip 0/8","kazimierzShip 0/16","kjeragShip 0/24","lateranoShip 1/0","maniShip 1/0","miraShip 0/16","preciShip 1/111","siracusaShip 1/45","soloShip 1/0","steadShip 0/8","suntShip 1/0","swiftShip 1/36","victoriaShip 0/8","visiShip 0/8"]
|
||||
}
|
||||
@@ -1628,7 +1628,7 @@
|
||||
"boost": null,
|
||||
"setup": {"stageId":"act1autochess_m03","bossId":"boss_7","hiddenBossId":"boss_10","factions":["ELEMENT","INVISIBLE","REFLECTION"]},
|
||||
"end": {"victory":true,"roundsPassed":14,"hiddenReached":false,"hiddenCleared":false,"reason":"victory","teamLp":55,"bossPoolLeft":0,"virtualMs":122900},
|
||||
"rng": {"setup":25,"shop":517,"waves":0,"draft":34,"bots":16504,"meta":19},
|
||||
"rng": {"setup":25,"shop":515,"waves":0,"draft":34,"bots":16491,"meta":18},
|
||||
"errors": {"engine":0,"logged":0,"sim":0,"dispatcher":0},
|
||||
"rounds": [
|
||||
{"round":1,"h_0":[1,27,4,0,0,5,1,"3e4697a0",0,"",5,5,0,3],"ai_0":[1,28,4,0,0,1,2,"a1734bc6",0,"sargonShip 0/2, soloShip 1/0",5,5,0,4]},
|
||||
@@ -1636,53 +1636,53 @@
|
||||
{"round":3,"h_0":[1,27,6,0,0,5,4,"43d0e2bf",0,"",7,7,0,13],"ai_0":[1,28,6,0,0,1,7,"0d31196a",0,"sargonShip 0/2, soloShip 1/0, yanShip 0/1",7,7,0,15]},
|
||||
{
|
||||
"round": 4,
|
||||
"h_0": [1,27,7,0,0,5,6,"2d3d3501",12,"preciShip 1/3, sargonShip 1/9",20,20,0,20],
|
||||
"h_0": [1,27,7,0,0,5,6,"2d3d3501",10,"preciShip 1/2, sargonShip 1/8",20,20,0,20],
|
||||
"ai_0": [1,28,7,0,0,2,8,"bf509782",0,"sargonShip 0/2, soloShip 1/0, yanShip 0/2",20,20,0,22]
|
||||
},
|
||||
{
|
||||
"round": 5,
|
||||
"h_0": [1,27,8,0,0,5,8,"1a62176b",32,"indomShip 1/0, preciShip 0/3, sargonShip 1/30, steadShip 1/1, victoriaShip 1/1",27,27,0,28],
|
||||
"h_0": [1,27,8,0,0,5,8,"1a62176b",31,"indomShip 1/0, preciShip 0/2, sargonShip 1/29, steadShip 1/1, victoriaShip 1/1",27,27,0,28],
|
||||
"ai_0": [1,28,8,0,1,2,8,"e0bfc937",0,"sargonShip 0/2, skillfulShip 1/0, soloShip 1/0, suntShip 1/0, yanShip 0/6",27,27,0,29]
|
||||
},
|
||||
{
|
||||
"round": 6,
|
||||
"h_0": [1,27,9,0,1,5,8,"7e9969de",69,"arcaneShip 0/2, indomShip 1/2, preciShip 1/15, sargonShip 1/40, steadShip 1/6, victoriaShip 1/4, visiShip 1/2",22,22,0,38],
|
||||
"h_0": [1,27,9,0,1,5,8,"7e9969de",79,"arcaneShip 0/2, indomShip 1/6, preciShip 1/14, sargonShip 1/39, steadShip 1/6, victoriaShip 1/8, visiShip 1/6",22,22,0,38],
|
||||
"ai_0": [1,28,10,0,1,3,8,"7f20e163",0,"sargonShip 0/4, skillfulShip 1/0, soloShip 1/0, suntShip 1/0, yanShip 0/6",23,24,1,39]
|
||||
},
|
||||
{
|
||||
"round": 7,
|
||||
"h_0": [1,27,11,0,1,5,8,"f502b39b",102,"arcaneShip 0/2, indomShip 1/2, preciShip 1/27, sargonShip 1/57, steadShip 1/11, victoriaShip 1/5, visiShip 0/2",26,26,0,50],
|
||||
"h_0": [1,27,11,0,1,5,8,"5702ef65",125,"arcaneShip 0/2, indomShip 1/6, preciShip 1/39, sargonShip 1/60, steadShip 1/11, victoriaShip 1/9, visiShip 0/6",26,26,0,50],
|
||||
"ai_0": [1,28,11,0,1,4,8,"7f20e163",0,"sargonShip 0/4, skillfulShip 1/0, soloShip 1/0, suntShip 1/0, yanShip 0/6",28,28,0,49]
|
||||
},
|
||||
{
|
||||
"round": 8,
|
||||
"h_0": [1,27,12,0,0,5,8,"b6d1cc82",200,"arcaneShip 0/2, indomShip 1/14, preciShip 2/62, sargonShip 1/92, soloShip 1/0, steadShip 2/32, victoriaShip 0/17, visiShip 0/2",18,18,0,63],
|
||||
"h_0": [1,27,12,0,0,5,8,"b6d1cc82",215,"arcaneShip 0/2, indomShip 1/18, preciShip 2/72, sargonShip 1/93, soloShip 1/0, steadShip 2/32, victoriaShip 0/21, visiShip 0/6",18,18,0,63],
|
||||
"ai_0": [1,28,12,0,1,4,8,"854ef8a8",16,"miraShip 1/0, sargonShip 0/4, skillfulShip 1/3, soloShip 1/0, steadShip 1/0, suntShip 1/0, yanShip 1/13",17,18,1,61]
|
||||
},
|
||||
{
|
||||
"round": 9,
|
||||
"h_0": [1,27,12,0,2,5,8,"6405e223",268,"arcaneShip 0/2, indomShip 1/14, preciShip 2/88, sargonShip 1/123, steadShip 1/37, victoriaShip 0/17, visiShip 1/6",23,23,0,77],
|
||||
"ai_0": [1,28,13,0,2,4,8,"1875f830",30,"sargonShip 0/4, siracusaShip 1/8, skillfulShip 1/3, soloShip 1/0, suntShip 1/0, yanShip 1/19",15,23,8,74]
|
||||
"h_0": [1,27,12,0,4,5,8,"6405e223",287,"arcaneShip 0/2, indomShip 1/18, preciShip 2/98, sargonShip 1/124, steadShip 1/37, victoriaShip 0/21, visiShip 1/10",23,23,0,77],
|
||||
"ai_0": [1,28,13,0,2,4,8,"561a6f1b",30,"sargonShip 0/4, siracusaShip 1/8, skillfulShip 1/3, soloShip 1/0, suntShip 1/0, yanShip 1/19",16,23,7,74]
|
||||
},
|
||||
{
|
||||
"round": 10,
|
||||
"h_0": [1,27,16,0,0,5,8,"c899fa07",315,"arcaneShip 0/2, indomShip 1/14, preciShip 2/105, sargonShip 1/132, soloShip 1/0, steadShip 2/46, suntShip 1/0, victoriaShip 0/17, visiShip 1/18",31,31,0,91],
|
||||
"h_0": [1,27,16,0,2,5,8,"c899fa07",334,"arcaneShip 0/2, indomShip 1/18, preciShip 2/115, sargonShip 1/133, soloShip 1/0, steadShip 2/46, suntShip 1/0, victoriaShip 0/21, visiShip 1/22",31,31,0,91],
|
||||
"ai_0": [1,28,14,0,0,5,8,"0d283e5f",35,"sargonShip 0/4, siracusaShip 1/8, skillfulShip 1/6, soloShip 1/0, suntShip 2/0, yanShip 1/21",31,31,0,87]
|
||||
},
|
||||
{
|
||||
"round": 11,
|
||||
"h_0": [1,27,14,0,2,6,8,"a5cfb056",366,"arcaneShip 0/2, indomShip 1/14, preciShip 2/124, sargonShip 1/138, steadShip 1/51, suntShip 1/0, swiftShip 1/5, victoriaShip 0/17, visiShip 1/34",19,19,0,106],
|
||||
"h_0": [1,27,16,0,0,6,8,"a5cfb056",385,"arcaneShip 0/2, indomShip 1/18, preciShip 2/134, sargonShip 1/139, steadShip 1/51, suntShip 1/0, swiftShip 1/5, victoriaShip 0/21, visiShip 1/38",19,19,0,106],
|
||||
"ai_0": [1,28,12,0,0,5,8,"fe5ac1a4",53,"sargonShip 0/4, siracusaShip 1/12, skillfulShip 1/12, soloShip 1/0, suntShip 2/0, visiShip 1/0, yanShip 1/29",19,19,0,99]
|
||||
},
|
||||
{
|
||||
"round": 12,
|
||||
"h_0": [1,27,16,0,2,6,8,"750c100e",376,"arcaneShip 0/2, emptyShip 1/0, indomShip 0/14, preciShip 2/151, sargonShip 1/175, steadShip 0/51, suntShip 1/0, swiftShip 0/5, victoriaShip 0/17, visiShip 1/50",33,33,0,125],
|
||||
"ai_0": [1,28,12,0,0,6,8,"d3c53bfd",63,"sargonShip 0/8, siracusaShip 1/12, skillfulShip 1/18, soloShip 1/0, suntShip 2/0, visiShip 1/0, yanShip 1/33",19,33,14,112]
|
||||
"h_0": [1,27,14,2,2,6,8,"477e3f61",482,"arcaneShip 0/2, indomShip 1/30, preciShip 2/165, sargonShip 1/157, steadShip 1/54, suntShip 1/0, swiftShip 1/10, victoriaShip 0/21, visiShip 1/66",33,33,0,124],
|
||||
"ai_0": [1,28,12,0,0,6,8,"d3c53bfd",63,"sargonShip 0/8, siracusaShip 1/12, skillfulShip 1/18, soloShip 1/0, suntShip 2/0, yanShip 1/33",15,33,18,112]
|
||||
},
|
||||
{
|
||||
"round": 13,
|
||||
"h_0": [1,27,14,2,2,6,8,"d90306b7",491,"arcaneShip 0/2, indomShip 0/14, maniShip 1/0, preciShip 2/175, sargonShip 1/209, steadShip 0/51, suntShip 1/0, swiftShip 0/5, victoriaShip 1/29, visiShip 1/78",50,50,0,138],
|
||||
"ai_0": [1,28,12,0,0,6,8,"947636ac",85,"miraShip 1/0, sargonShip 0/8, siracusaShip 1/24, skillfulShip 1/24, soloShip 1/0, suntShip 2/0, visiShip 1/0, yanShip 1/37",14,50,36,126]
|
||||
"h_0": [1,27,18,0,2,6,8,"648327be",474,"arcaneShip 0/2, indomShip 0/30, preciShip 2/190, sargonShip 1/187, steadShip 0/54, suntShip 1/0, swiftShip 1/15, victoriaShip 0/21, visiShip 1/82",50,50,0,143],
|
||||
"ai_0": [1,28,12,0,0,6,8,"f0c52b92",100,"miraShip 1/0, preciShip 1/24, sargonShip 1/32, siracusaShip 1/20, skillfulShip 1/24, soloShip 1/0, suntShip 1/0, yanShip 0/33",30,50,20,123]
|
||||
}
|
||||
],
|
||||
"players": {
|
||||
@@ -1696,9 +1696,9 @@
|
||||
"title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"},
|
||||
"trophies": 4,
|
||||
"reward": 400,
|
||||
"stats": {"activatedLayers":507,"bossDamage":608027,"dmgDealt":5093239,"gold":160,"itemsEquipped":25,"kills":360,"leaks":0,"lpLost":0,"merges":4,"perfectRounds":13,"refreshes":31},
|
||||
"lineup": ["6_05_a@12,8[2_01_e_a+4_08_e_a]","5_02_a@11,6[6_01_e_a+5_07_e_a]","6_08_a@11,7[5_01_e_b+3_09_e_a]","4_20_b@11,8[6_07_e_a+1_05_e_a]","6_11_a@10,6[4_04_e_a]","5_21_b@10,8[3_04_e_a+6_09_e_a]","4_07_b@9,8[3_07_e_a+1_01_e_a]","4_23_b@9,9[4_04_e_b+4_11_e_a]"],
|
||||
"bonds": ["arcaneShip 0/2","indomShip 0/14","maniShip 1/0","preciShip 2/175","sargonShip 1/209","steadShip 0/51","suntShip 1/0","swiftShip 0/5","victoriaShip 1/29","visiShip 1/94"]
|
||||
"stats": {"activatedLayers":513,"bossDamage":591866,"dmgDealt":4855342,"gold":160,"itemsEquipped":22,"kills":346,"leaks":0,"lpLost":0,"merges":5,"perfectRounds":13,"refreshes":31},
|
||||
"lineup": ["6_05_a@12,8[4_08_e_a+2_01_e_b]","5_02_a@11,6[6_01_e_a]","6_05_a@11,7[3_04_e_a+3_03_e_a]","4_20_b@11,8","4_14_b@10,6[3_11_e_a+5_01_e_b]","5_21_b@10,8[1_01_e_a+6_03_e_a]","4_07_b@9,8[4_04_e_b+4_11_e_b]","4_23_b@9,9[4_06_e_a]"],
|
||||
"bonds": ["arcaneShip 0/2","indomShip 0/30","preciShip 2/203","sargonShip 1/187","steadShip 0/54","suntShip 2/0","swiftShip 1/25","victoriaShip 0/21","visiShip 1/98"]
|
||||
},
|
||||
"ai_0": {
|
||||
"alive": true,
|
||||
@@ -1710,9 +1710,9 @@
|
||||
"title": {"id":"comment_3","name":"坚若磐石","picId":"comment_icon_3","text":"目标生命值损失最少"},
|
||||
"trophies": 4,
|
||||
"reward": 400,
|
||||
"stats": {"activatedLayers":105,"bossDamage":179473,"dmgDealt":2453352,"gold":136,"itemsEquipped":21,"kills":233,"leaks":60,"lpLost":0,"merges":6,"perfectRounds":8,"refreshes":12},
|
||||
"lineup": ["2_04_b@12,8[1_05_e_a+1_02_e_b]","5_02_a@11,7","6_05_a@11,8","5_20_a@10,5[6_02_e_a+6_09_e_a]","6_11_a@10,6","3_03_b@10,8[3_11_e_b+2_04_e_a]","1_08_b@9,8[4_06_e_a+4_11_e_a]","3_02_b@9,9[4_02_e_a]"],
|
||||
"bonds": ["maniShip 1/0","miraShip 1/0","preciShip 1/0","sargonShip 1/8","siracusaShip 1/28","skillfulShip 1/30","soloShip 1/0","suntShip 1/0","visiShip 1/0","yanShip 1/39"]
|
||||
"stats": {"activatedLayers":108,"bossDamage":195634,"dmgDealt":2640559,"gold":134,"itemsEquipped":19,"kills":246,"leaks":47,"lpLost":0,"merges":6,"perfectRounds":8,"refreshes":12},
|
||||
"lineup": ["5_20_a@12,8","5_10_a@11,7","6_05_a@11,8[5_03_e_a+1_01_e_a]","3_13_a@10,5","5_02_a@10,6[3_07_e_a+4_03_e_a]","3_03_b@10,8[3_11_e_b+2_04_e_a]","2_04_b@9,8","1_08_b@9,9[1_02_e_a+4_06_e_a]"],
|
||||
"bonds": ["preciShip 1/24","sargonShip 1/32","siracusaShip 1/28","skillfulShip 1/24","soloShip 1/0","suntShip 1/0","yanShip 0/33"]
|
||||
}
|
||||
},
|
||||
"diy": {
|
||||
@@ -1735,7 +1735,7 @@
|
||||
[9,"",""],
|
||||
[10,"",""],
|
||||
[11,"",""],
|
||||
[12,"","6_diy1_a→char_609_acguad"],
|
||||
[12,"",""],
|
||||
[13,"",""]
|
||||
],
|
||||
"stock": {"chess_char_5_diy1_a":8,"chess_char_5_diy2_a":8,"chess_char_6_diy1_a":5,"chess_char_6_diy2_a":5}
|
||||
|
||||
+143
-143
@@ -181,10 +181,10 @@
|
||||
"enemy_2008_flking": [1,0,0,11413,353],
|
||||
"enemy_9016_acstmr": [1,1,0,0,8]
|
||||
},
|
||||
"hooks": [1,105,3300,569,569,689,804,222,86,90,24,23,0,16353,226,27,85,0,1,94,1,0,0],
|
||||
"hooks": [1,105,3300,569,569,689,804,222,86,90,24,23,0,16353,226,29,85,0,1,94,1,0,0],
|
||||
"events": {"atk":670,"bounty":6,"deploy":17,"die":90,"dmg":774,"engage":9,"fx":108,"heal":192,"layer":1,"skill":47,"spawn":101,"status":223},
|
||||
"fx": {"aoe":1,"blink":1,"displace":8,"ember":1,"explode":10,"garrison":1,"heal":5,"pulse":42,"reveal":1,"revive":1,"sleep":8,"summon":25,"undying":1,"zone":3},
|
||||
"snaps": "c29e3835 28b841b8 3ea22a73 67a6b520 35d0349a 97ef8a6d 6afa4175 f647e598 5cfb2459 68ea6091 95b05ba5"
|
||||
"snaps": "c29e3835 28b841b8 3ea22a73 67a6b520 35d0349a 97ef8a6d 86c3dbf5 9d20d292 f19b1a3f 70f1741b 20c76bb6"
|
||||
},
|
||||
"roster-004": {
|
||||
"about": "pass 0 band 2: chess_char_2_08_a chess_char_2_17_a chess_char_2_18_a chess_char_2_07_a chess_char_2_09_a chess_char_2_11_a chess_char_2_13_a chess_char_2_16_a chess_char_2_12_a chess_char_2_06_a chess_char_2_10_a chess_char_2_14_a",
|
||||
@@ -254,51 +254,51 @@
|
||||
"round": 6,
|
||||
"seed": 4076349243,
|
||||
"waveId": "act1autochess_06",
|
||||
"time": 135.43,
|
||||
"ticks": 4063,
|
||||
"reason": "cleared",
|
||||
"killed": 84,
|
||||
"time": 140,
|
||||
"ticks": 4200,
|
||||
"reason": "timeout",
|
||||
"killed": 83,
|
||||
"total": 84,
|
||||
"unspawned": 0,
|
||||
"bossHpLeft": null,
|
||||
"rngDraws": 333,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {"p1":{"killed":84,"total":84,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":12,"dmg":308197,"bossDmg":0,"heal":36826,"deaths":0,"layerGains":{}}},
|
||||
"players": {"p1":{"killed":83,"total":84,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":10,"dmg":306697,"bossDmg":0,"heal":36881,"deaths":0,"layerGains":{}}},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_2_07_b",1,"uniequip_002_ghost",2664.2,1,2,0,0,1707,1318,0,0],
|
||||
["p1",2,"op","chess_char_2_08_b",1,"uniequip_002_bubble",3373,1,4,0,49,1818,0,0,1],
|
||||
["p1",3,"op","chess_char_2_09_b",1,"uniequip_002_humus",2133,1,6,31,86159,0,0,56,2],
|
||||
["p1",4,"op","chess_char_2_11_b",1,"uniequip_002_kazema",2214,1,8,11,87383,15748,0,89,3],
|
||||
["p1",5,"op","chess_char_2_12_b",1,"uniequip_002_gravel",1452,1,10,2,7115,8923,0,124,1],
|
||||
["p1",3,"op","chess_char_2_09_b",1,"uniequip_002_humus",2133,1,6,28,84020,0,0,59,2],
|
||||
["p1",4,"op","chess_char_2_11_b",1,"uniequip_002_kazema",2214,1,8,12,91244,15780,0,92,3],
|
||||
["p1",5,"op","chess_char_2_12_b",1,"uniequip_002_gravel",1452,1,10,2,7180,8945,0,129,1],
|
||||
["p1",6,"op","chess_char_2_19_a",1,null,1021.2,1,11,1,14957,1523,407,26,3],
|
||||
["p1",7,"op","chess_char_2_01_b",1,"uniequip_002_excu",2146,1,12,20,36079,4183,0,22,1],
|
||||
["p1",8,"op","chess_char_2_02_b",1,"uniequip_002_silent",1614,1,1,0,0,0,9551,28,5],
|
||||
["p1",9,"op","chess_char_2_04_b",1,"uniequip_002_grabds",1270,1,3,7,38738,2115,0,51,3],
|
||||
["p1",10,"op","chess_char_2_05_b",1,"uniequip_002_harold",1971.2,1,5,0,0,0,11743,39,2],
|
||||
["p1",11,"op","chess_char_2_06_b",0,"uniequip_002_papyrs",1639,1,7,0,0,0,11657,25,11],
|
||||
["p1",12,"op","chess_char_2_10_b",1,"uniequip_002_rockr",1406,1,9,6,37719,810,0,107,2],
|
||||
["p1",13,"token","token_10000_silent_healrb",null,null,1000,1,103,0,0,0,2150,21,null]
|
||||
["p1",8,"op","chess_char_2_02_b",1,"uniequip_002_silent",1614,1,1,0,0,0,9257,28,5],
|
||||
["p1",9,"op","chess_char_2_04_b",1,"uniequip_002_grabds",1270,1,3,10,38233,2115,0,53,3],
|
||||
["p1",10,"op","chess_char_2_05_b",1,"uniequip_002_harold",1971.2,1,5,0,0,0,11159,39,2],
|
||||
["p1",11,"op","chess_char_2_06_b",0,"uniequip_002_papyrs",1639,1,7,0,0,0,12883,28,13],
|
||||
["p1",12,"op","chess_char_2_10_b",1,"uniequip_002_rockr",1406,1,9,5,34936,810,0,113,2],
|
||||
["p1",13,"token","token_10000_silent_healrb",null,null,1000,0,103,0,0,0,1858,18,null]
|
||||
],
|
||||
"enemies": {
|
||||
"enemy_10027_vtsk": [1,1,0,10058,24000],
|
||||
"enemy_10027_vtsk": [1,0,0,10080,23138],
|
||||
"enemy_1006_shield_2": [1,1,0,0,8000],
|
||||
"enemy_10122_uacann_2": [1,1,0,3476,8000],
|
||||
"enemy_1042_frostd": [1,1,0,0,5200],
|
||||
"enemy_1119_vofsd": [1,1,0,125,8800],
|
||||
"enemy_1170_dushld": [1,1,0,221,5600],
|
||||
"enemy_1202_msfzhi": [1,1,0,0,3],
|
||||
"enemy_1249_lysdb_2": [15,15,0,310,72000],
|
||||
"enemy_1249_lysdb_2": [15,15,0,372,72000],
|
||||
"enemy_1251_lysyta": [52,52,0,50,114400],
|
||||
"enemy_1299_ymkilr_2": [1,1,0,1178,8800],
|
||||
"enemy_1328_cbjedi": [6,6,0,8244,48000],
|
||||
"enemy_1328_cbjedi": [6,6,0,8860,48000],
|
||||
"enemy_1402_tgshd_2": [1,1,0,200,10400],
|
||||
"enemy_1509_mousek": [1,1,0,7192,17600],
|
||||
"enemy_2010_csdcr": [1,1,0,2452,9600]
|
||||
"enemy_1509_mousek": [1,1,0,7102,17600],
|
||||
"enemy_2010_csdcr": [1,1,0,1896,9600]
|
||||
},
|
||||
"hooks": [1,102,4063,682,682,1618,1612,1098,84,89,34,33,0,26938,145,50,84,0,1,84,0,0,0],
|
||||
"events": {"atk":896,"bounty":6,"deploy":18,"die":89,"dmg":1572,"engage":7,"fx":65,"heal":123,"skill":67,"spawn":97,"status":430},
|
||||
"fx": {"counter":2,"explode":3,"expose":9,"overload":2,"phase":1,"shield":8,"shieldBreak":16,"sleep":7,"summon":5,"telegraph":6,"zone":6},
|
||||
"snaps": "de0d6fce aa9dbd18 e5f78211 369608f9 eaf0206b 8ca00225 56597ada 3c3af39f 867867b0 406379b7 654df676 66745bf5 fdd72e8b 1ff822b8"
|
||||
"hooks": [1,102,4200,702,702,1650,1643,1107,83,89,36,35,0,28577,142,53,84,0,1,83,0,0,0],
|
||||
"events": {"atk":917,"bounty":5,"deploy":18,"die":89,"dmg":1602,"engage":7,"fx":66,"heal":122,"skill":71,"spawn":97,"status":441},
|
||||
"fx": {"counter":2,"explode":3,"expose":9,"overload":2,"phase":1,"shield":9,"shieldBreak":16,"sleep":7,"summon":5,"telegraph":6,"zone":6},
|
||||
"snaps": "de0d6fce aa9dbd18 e5f78211 369608f9 eaf0206b 8ca00225 879ade74 10585017 e8565d0c e354c612 a50e5370 07ad00b4 54071507 c18f3d28"
|
||||
},
|
||||
"roster-006": {
|
||||
"about": "pass 0 band 3: chess_char_2_17_b chess_char_2_18_b chess_char_3_06_a chess_char_2_13_b chess_char_2_16_b chess_char_3_02_a chess_char_3_03_a chess_char_3_04_a chess_char_3_05_a chess_char_2_14_b chess_char_2_19_b chess_char_3_01_a",
|
||||
@@ -800,31 +800,31 @@
|
||||
"leaks": 6,
|
||||
"leaksUncounted": 0,
|
||||
"coins": 10,
|
||||
"dmg": 1113020,
|
||||
"dmg": 1112939,
|
||||
"bossDmg": 0,
|
||||
"heal": 78988,
|
||||
"heal": 79062,
|
||||
"deaths": 2,
|
||||
"layerGains": {"sargonShip":66}
|
||||
}
|
||||
},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_4_23_b",2,"uniequip_002_gvial2",2264.03,1,126,0,27871,3722,364,38,2],
|
||||
["p1",2,"op","chess_char_5_08_a",2,null,3536.8,1,1,18,75539,3482,7462,65,2],
|
||||
["p1",1,"op","chess_char_4_23_b",2,"uniequip_002_gvial2",2264.03,1,126,0,27791,3722,364,38,2],
|
||||
["p1",2,"op","chess_char_5_08_a",2,null,3536.8,1,1,18,75539,3482,7690,65,2],
|
||||
["p1",3,"op","chess_char_5_01_a",1,null,3303.8,1,4,0,0,0,0,0,0],
|
||||
["p1",4,"op","chess_char_5_05_a",2,null,11446.55,1,7,9,62782,0,13681,2,3],
|
||||
["p1",5,"op","chess_char_5_06_a",2,null,5571.8,1,10,22,415831,11394,11327,152,3],
|
||||
["p1",6,"op","chess_char_5_07_a",2,null,6444.09,1,117,12,86288,65485,22066,50,2],
|
||||
["p1",7,"op","chess_char_4_24_b",1,"uniequip_002_billro",3514.8,1,5,19,164479,158,3014,79,4],
|
||||
["p1",8,"op","chess_char_4_25_b",2,"uniequip_002_cetsyr",1671,1,8,0,0,676,2045,0,3],
|
||||
["p1",9,"op","chess_char_4_26_b",0,"uniequip_002_bldsk",2858.8,1,6,0,0,0,7264,19,3],
|
||||
["p1",10,"op","chess_char_5_02_a",2,null,2544.8,1,9,16,239051,2076,3950,138,3],
|
||||
["p1",4,"op","chess_char_5_05_a",2,null,11446.55,1,7,9,62782,0,13980,2,3],
|
||||
["p1",5,"op","chess_char_5_06_a",2,null,5571.8,1,10,22,415831,10074,9942,152,3],
|
||||
["p1",6,"op","chess_char_5_07_a",2,null,6444.09,1,117,12,86288,66716,22066,50,2],
|
||||
["p1",7,"op","chess_char_4_24_b",1,"uniequip_002_billro",3514.8,1,5,19,164479,158,3183,79,4],
|
||||
["p1",8,"op","chess_char_4_25_b",2,"uniequip_002_cetsyr",1671,1,8,0,0,676,2153,0,3],
|
||||
["p1",9,"op","chess_char_4_26_b",0,"uniequip_002_bldsk",2858.8,1,6,0,0,0,7506,19,3],
|
||||
["p1",10,"op","chess_char_5_02_a",2,null,2544.8,1,9,16,239051,2076,4114,138,3],
|
||||
["p1",11,"op","chess_char_5_03_a",2,null,1809,1,102,3,41178,4749,2940,42,1],
|
||||
["p1",12,"op","chess_char_5_10_a",2,null,3882.4,1,2,0,0,0,4875,0,2]
|
||||
["p1",12,"op","chess_char_5_10_a",2,null,3882.4,1,2,0,0,0,5125,0,2]
|
||||
],
|
||||
"enemies": {
|
||||
"enemy_10042_prtrop_2": [1,1,0,331,13271],
|
||||
"enemy_10087_hlchgr": [1,1,0,0,9953],
|
||||
"enemy_10124_uashld_2": [6,4,1,10428,212334],
|
||||
"enemy_10124_uashld_2": [6,4,1,10340,212334],
|
||||
"enemy_10162_mnctpt": [1,1,0,3619,26542],
|
||||
"enemy_1043_zomsbr": [69,69,0,2152,306970],
|
||||
"enemy_1061_zomshd": [15,13,2,620,293845],
|
||||
@@ -836,14 +836,14 @@
|
||||
"enemy_1270_nhstlk_2": [1,1,0,0,26542],
|
||||
"enemy_1328_cbjedi": [1,1,0,656,16589],
|
||||
"enemy_1427_lrnazg": [1,1,0,3780,24883],
|
||||
"enemy_1535_wlfmster": [1,0,1,1629,43344],
|
||||
"enemy_1535_wlfmster": [1,0,1,1629,43264],
|
||||
"enemy_2052_smgia": [1,0,1,0,36973],
|
||||
"enemy_5601_entlec": [7,7,0,0,83081]
|
||||
},
|
||||
"hooks": [1,126,5700,654,654,1962,2937,26462,107,113,28,26,15,28495,1642,22,111,5,1,154,29,2,0],
|
||||
"events": {"atk":1139,"bounty":5,"deploy":15,"die":108,"dmg":2297,"engage":8,"fx":309,"heal":94,"layer":29,"leak":5,"skill":54,"spawn":123,"status":763},
|
||||
"hooks": [1,126,5700,654,654,1962,2937,26108,107,113,28,26,15,28495,1642,33,111,5,1,154,29,2,0],
|
||||
"events": {"atk":1139,"bounty":5,"deploy":15,"die":108,"dmg":2297,"engage":8,"fx":309,"heal":87,"layer":29,"leak":5,"skill":54,"spawn":123,"status":763},
|
||||
"fx": {"anchor":3,"aoe":2,"bandage":3,"beam":3,"burst":2,"candle":7,"downed":2,"ember":1,"explode":1,"garrison":29,"garrisonGrant":1,"jungleSoul":2,"mote":96,"overload":2,"redistribute":43,"revive":1,"reweave":3,"sandChains":3,"sandChainsCharged":1,"spGift":48,"splash":15,"summon":1,"wake":40},
|
||||
"snaps": "6caae538 d86c299d 35ebf7d5 9dfedf9d e3dd03e6 6f802420 38192b2d 9f95409c 579a9ca2 a0215ea7 5b226058 fe234c21 e7cf701b f71351b1 870fd558 f2d029ac cdf09d56 c3b2d649 29939ab4"
|
||||
"snaps": "6caae538 d86c299d 35ebf7d5 1d30d8d2 0e35ef11 08334ff3 4ae8b75a 5e8748ab a42b102f 9edfde7f 05ffc49d cf32b79b 05779ec4 5cb849dd b1708790 ccc4f798 181003e4 3c345da7 faa448a6"
|
||||
},
|
||||
"roster-014": {
|
||||
"about": "pass 0 band 6: chess_char_5_11_a chess_char_5_19_a chess_char_5_13_a chess_char_5_14_a chess_char_5_01_b chess_char_5_17_a chess_char_5_12_a chess_char_5_15_a chess_char_5_20_a chess_char_5_21_a chess_char_5_22_a chess_char_5_23_a",
|
||||
@@ -1961,40 +1961,40 @@
|
||||
"time": 190,
|
||||
"ticks": 5700,
|
||||
"reason": "timeout",
|
||||
"killed": 68,
|
||||
"killed": 71,
|
||||
"total": 79,
|
||||
"unspawned": 0,
|
||||
"bossHpLeft": null,
|
||||
"rngDraws": 72,
|
||||
"rngDraws": 121,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {
|
||||
"p1": {
|
||||
"killed": 68,
|
||||
"killed": 71,
|
||||
"total": 79,
|
||||
"perfect": false,
|
||||
"leaks": 11,
|
||||
"leaks": 8,
|
||||
"leaksUncounted": 1,
|
||||
"coins": 6,
|
||||
"dmg": 984212,
|
||||
"dmg": 1027656,
|
||||
"bossDmg": 0,
|
||||
"heal": 146613,
|
||||
"deaths": 8,
|
||||
"layerGains": {"sargonShip":41}
|
||||
"heal": 145609,
|
||||
"deaths": 4,
|
||||
"layerGains": {"sargonShip":35}
|
||||
}
|
||||
},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_4_23_b",0,"uniequip_003_gvial2",0,0,95,4,60781,14201,8569,35,2],
|
||||
["p1",2,"op","chess_char_5_08_a",0,null,0,0,77,4,75768,4400,2199,20,7],
|
||||
["p1",3,"op","chess_char_5_01_a",0,null,1967,1,80,0,4,1967,0,4,0],
|
||||
["p1",4,"op","chess_char_5_05_a",0,null,5777,1,13,24,278843,54727,41843,52,25],
|
||||
["p1",5,"op","chess_char_5_06_a",0,null,566.76,1,15,25,377517,60787,57560,128,36],
|
||||
["p1",6,"op","chess_char_5_07_a",0,null,2216,1,86,0,5463,2215,0,8,2],
|
||||
["p1",7,"op","chess_char_4_24_b",0,"uniequip_003_billro",1978,1,7,3,93054,0,0,29,4],
|
||||
["p1",8,"op","chess_char_4_25_b",0,"none",2982,1,92,0,0,4161,1179,0,0],
|
||||
["p1",9,"op","chess_char_4_26_b",1,"none",1482,1,12,0,0,16638,31786,57,4],
|
||||
["p1",10,"op","chess_char_5_02_a",0,null,1208,1,99,2,25365,6903,3477,76,1],
|
||||
["p1",11,"op","chess_char_5_03_a",0,null,648.2,1,4,4,48851,558,0,70,6],
|
||||
["p1",12,"op","chess_char_5_10_a",0,null,1184,1,102,2,18565,1184,0,39,2],
|
||||
["p1",1,"op","chess_char_4_23_b",0,"uniequip_003_gvial2",2816,1,97,5,50638,8310,5494,33,1],
|
||||
["p1",2,"op","chess_char_5_08_a",0,null,0,0,77,4,61707,4400,2199,20,7],
|
||||
["p1",3,"op","chess_char_5_01_a",0,null,1967,1,11,3,40820,671,671,41,2],
|
||||
["p1",4,"op","chess_char_5_05_a",0,null,5777,1,13,13,188889,39660,31159,40,19],
|
||||
["p1",5,"op","chess_char_5_06_a",0,null,1625.21,1,15,32,432555,69278,67214,132,44],
|
||||
["p1",6,"op","chess_char_5_07_a",0,null,660.99,1,9,0,0,1555,0,0,0],
|
||||
["p1",7,"op","chess_char_4_24_b",0,"uniequip_003_billro",1978,1,7,2,126363,0,0,37,4],
|
||||
["p1",8,"op","chess_char_4_25_b",0,"none",2982,1,89,0,0,4098,1116,0,1],
|
||||
["p1",9,"op","chess_char_4_26_b",1,"none",1482,1,12,0,0,15821,29938,53,4],
|
||||
["p1",10,"op","chess_char_5_02_a",0,null,1208,1,14,7,55591,13178,7819,136,3],
|
||||
["p1",11,"op","chess_char_5_03_a",0,null,1206,1,4,2,44899,0,0,60,6],
|
||||
["p1",12,"op","chess_char_5_10_a",0,null,1184,1,8,3,26193,0,0,55,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],
|
||||
["-","~3","device","trap_1105_accrate",null,null,100,1,3,0,0,0,0,0,null]
|
||||
@@ -2002,19 +2002,19 @@
|
||||
"enemies": {
|
||||
"enemy_10029_vtshld": [1,0,0,0,0],
|
||||
"enemy_1009_lurker": [1,1,0,76,5474],
|
||||
"enemy_1019_jshoot_2": [21,21,0,24164,141088],
|
||||
"enemy_1050_lslime": [1,1,0,52215,99533],
|
||||
"enemy_1019_jshoot_2": [21,21,0,23529,141088],
|
||||
"enemy_1050_lslime": [1,1,0,58115,99533],
|
||||
"enemy_1168_dumage_2": [1,1,0,2963,16174],
|
||||
"enemy_1208_msfji": [1,1,0,0,25],
|
||||
"enemy_1299_ymkilr_2": [10,6,4,52194,179913],
|
||||
"enemy_1422_lrsldr_2": [42,36,6,13631,524249],
|
||||
"enemy_1433_dsbasi_2": [1,1,0,4058,14183],
|
||||
"enemy_2025_syufo": [1,0,1,5822,3573]
|
||||
"enemy_1299_ymkilr_2": [10,6,4,43488,184255],
|
||||
"enemy_1422_lrsldr_2": [42,39,3,11182,562076],
|
||||
"enemy_1433_dsbasi_2": [1,1,0,671,14183],
|
||||
"enemy_2025_syufo": [1,0,1,6212,4848]
|
||||
},
|
||||
"hooks": [1,102,5700,809,809,3178,3414,4722,76,88,89,89,0,26496,289,81,80,11,1,84,6,2,0],
|
||||
"events": {"atk":1267,"bounty":3,"deploy":19,"die":77,"dmg":3414,"engage":10,"fx":204,"heal":1104,"layer":6,"leak":11,"skill":178,"spawn":95,"status":327},
|
||||
"fx": {"anchor":25,"aoe":6,"bloodBattle":6,"burst":2,"camouflage":2,"displace":29,"ember":1,"explode":8,"extraAttack":1,"garrison":6,"garrisonGrant":1,"mote":55,"reborn":1,"shell":4,"spGift":54,"zone":3},
|
||||
"snaps": "ea103c33 03bc9911 37aa2e44 4b5b588d 99a8bde9 8fe32941 43831139 91c700be 62c892b9 970f072b b7ee9ec6 fa62779b c368d245 7e60c600 bf8e8d8d e467212d 6643bb3b e97ea31f 406ec381"
|
||||
"hooks": [1,98,5700,870,870,3373,3607,4979,75,83,94,93,18,27316,354,87,80,8,1,81,15,3,0],
|
||||
"events": {"atk":1371,"bounty":3,"deploy":15,"die":75,"dmg":3607,"engage":9,"fx":216,"heal":1194,"layer":15,"leak":8,"skill":187,"spawn":95,"status":401},
|
||||
"fx": {"anchor":19,"aoe":6,"bloodBattle":6,"burst":3,"camouflage":2,"displace":25,"explode":8,"extraAttack":9,"garrison":15,"garrisonGrant":1,"mote":58,"reborn":1,"shell":4,"spGift":56,"zone":3},
|
||||
"snaps": "ea103c33 03bc9911 37aa2e44 1a4f6096 f8d75423 a6b54c88 81d90b63 aab3718e 74920053 18bacd4b 58a78df2 2c1977ee 0c703d35 80c7e35e e80d3f8f 7924cc0c 2b18ca27 2ddbbaf0 77b86f05"
|
||||
},
|
||||
"roster-033": {
|
||||
"about": "pass 1 band 6: chess_char_5_11_a chess_char_5_19_a chess_char_5_13_a chess_char_5_14_a chess_char_5_06_b chess_char_5_17_a chess_char_5_12_a chess_char_5_15_a chess_char_5_20_a chess_char_5_21_a chess_char_5_22_a chess_char_5_23_a",
|
||||
@@ -2335,48 +2335,48 @@
|
||||
"round": 13,
|
||||
"seed": 3127854496,
|
||||
"waveId": "act1autochess_h06",
|
||||
"time": 197.27,
|
||||
"ticks": 5918,
|
||||
"time": 197.4,
|
||||
"ticks": 5922,
|
||||
"reason": "cleared",
|
||||
"killed": 157,
|
||||
"total": 157,
|
||||
"unspawned": 0,
|
||||
"bossHpLeft": null,
|
||||
"rngDraws": 56,
|
||||
"rngDraws": 51,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {
|
||||
"p1": {"killed":157,"total":157,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":8,"dmg":3453092,"bossDmg":0,"heal":92439,"deaths":3,"layerGains":{"raidShip":22}}
|
||||
"p1": {"killed":157,"total":157,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":8,"dmg":3449932,"bossDmg":0,"heal":95736,"deaths":3,"layerGains":{"raidShip":22}}
|
||||
},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_5_08_b",1,"none",2775,1,2,23,392318,0,0,64,4],
|
||||
["p1",2,"op","chess_char_6_19_b",0,"uniequip_003_blkkgt",4754.9,1,4,0,2044,0,0,1,0],
|
||||
["p1",3,"op","chess_char_5_01_b",2,"none",2314,1,6,14,301009,0,0,38,1],
|
||||
["p1",4,"op","chess_char_5_05_b",1,"uniequip_002_ulpia",6191.59,1,7,19,356830,32499,6893,37,1],
|
||||
["p1",5,"op","chess_char_5_06_b",1,"none",3189.65,1,156,62,1412976,20823,17124,71,6],
|
||||
["p1",6,"op","chess_char_6_17_b",0,"uniequip_003_nearl2",0,0,100,3,71113,7512,0,42,1],
|
||||
["p1",7,"op","chess_char_5_07_b",1,"none",2840.8,1,12,10,211279,45028,0,153,6],
|
||||
["p1",8,"op","chess_char_6_18_b",0,"none",1463.86,1,9,7,124888,0,0,150,1],
|
||||
["p1",9,"op","chess_char_6_20_b",0,"uniequip_003_agoat2",1453.26,1,10,0,0,0,45028,55,1],
|
||||
["p1",10,"op","chess_char_5_02_b",1,"uniequip_002_titi",1439,1,1,13,483273,0,23219,23,3],
|
||||
["p1",11,"op","chess_char_5_03_b",1,"none",1472,1,3,4,45595,662,177,17,2],
|
||||
["p1",12,"op","chess_char_5_10_b",1,"none",1380,1,5,2,51766,0,0,56,1]
|
||||
["p1",1,"op","chess_char_5_08_b",1,"none",2775,1,2,26,416786,0,0,65,5],
|
||||
["p1",2,"op","chess_char_6_19_b",0,"uniequip_003_blkkgt",4754.9,1,4,0,0,0,0,0,0],
|
||||
["p1",3,"op","chess_char_5_01_b",2,"none",2314,1,6,13,265002,0,0,33,1],
|
||||
["p1",4,"op","chess_char_5_05_b",1,"uniequip_002_ulpia",2127.48,1,7,28,356630,32731,7757,36,1],
|
||||
["p1",5,"op","chess_char_5_06_b",1,"none",3747,1,140,52,1382121,21918,18668,71,6],
|
||||
["p1",6,"op","chess_char_6_17_b",0,"uniequip_003_nearl2",0,0,100,3,85590,7687,0,45,1],
|
||||
["p1",7,"op","chess_char_5_07_b",1,"none",2840.8,1,12,7,221757,50875,0,154,6],
|
||||
["p1",8,"op","chess_char_6_18_b",0,"none",1463.86,1,9,7,126605,0,0,150,1],
|
||||
["p1",9,"op","chess_char_6_20_b",0,"uniequip_003_agoat2",1453.26,1,10,0,0,0,50875,54,1],
|
||||
["p1",10,"op","chess_char_5_02_b",1,"uniequip_002_titi",1439,1,1,12,442404,0,18141,20,3],
|
||||
["p1",11,"op","chess_char_5_03_b",1,"none",1251.2,1,3,5,101242,810,294,14,2],
|
||||
["p1",12,"op","chess_char_5_10_b",1,"none",1380,1,5,2,51796,0,0,55,1]
|
||||
],
|
||||
"enemies": {
|
||||
"enemy_1006_shield_3": [1,1,0,5533,143327],
|
||||
"enemy_1021_bslime": [1,1,0,1716,8815],
|
||||
"enemy_1148_dssbr_2": [1,1,0,0,12899],
|
||||
"enemy_1198_msfshu_2": [1,1,0,0,4],
|
||||
"enemy_1249_lysdb_2": [60,60,0,25552,1289945],
|
||||
"enemy_1251_lysyta": [51,51,0,6723,502541],
|
||||
"enemy_1249_lysdb_2": [60,60,0,28945,1289945],
|
||||
"enemy_1251_lysyta": [51,51,0,3238,502541],
|
||||
"enemy_1270_nhstlk": [1,1,0,1018,42998],
|
||||
"enemy_1329_cbshld": [39,39,0,61254,1397423],
|
||||
"enemy_1329_cbshld": [39,39,0,68695,1397441],
|
||||
"enemy_1389_winbab_2": [1,1,0,4067,25082],
|
||||
"enemy_2001_duckmi": [1,1,0,0,64497]
|
||||
},
|
||||
"hooks": [1,171,5918,858,858,4428,4423,535,160,160,27,22,57,16612,2274,91,157,0,1,163,2,1,0],
|
||||
"events": {"atk":1424,"bounty":4,"deploy":14,"die":160,"dmg":4423,"engage":11,"fx":108,"heal":454,"layer":2,"skill":49,"spawn":169,"status":437},
|
||||
"fx": {"aoe":13,"burst":1,"explode":1,"extraAttack":10,"garrison":2,"garrisonGrant":4,"meltdown":1,"overload":4,"reborn":1,"shieldBreak":60,"sleepGuard":3,"sunBurst":3,"talent":3,"undying":2},
|
||||
"snaps": "5650a99f 269331d4 9108a09e a68bca8d 97f03337 03487d3c a4b8088c bf73be1b 2bd36eb5 a70b8c79 fe565597 704ab424 3778eca1 fe82284b dfe184d0 513850f9 9a4443a2 82655400 9e092a8e ccbd2cfe"
|
||||
"hooks": [1,171,5922,836,836,4519,4527,512,160,160,28,22,58,16610,2248,95,157,0,1,163,2,4,0],
|
||||
"events": {"atk":1380,"bounty":4,"deploy":14,"die":160,"dmg":4527,"engage":10,"fx":113,"heal":427,"layer":2,"skill":50,"spawn":169,"status":448},
|
||||
"fx": {"aoe":13,"burst":4,"explode":1,"extraAttack":8,"garrison":2,"garrisonGrant":4,"meltdown":4,"overload":4,"reborn":2,"shieldBreak":60,"sleepGuard":3,"sunBurst":3,"talent":3,"undying":2},
|
||||
"snaps": "5650a99f 269331d4 9108a09e 6a9357fc a38e8da6 02d03ce3 ce95f7e8 cf5d478d 01fa1ecf 1c59643b cb8a5a62 e508db59 e4fdc71c d2cf46aa 597ccaaf 3edc51d2 f86ea91c ab1c645c b667b772 8a7c6bb1"
|
||||
},
|
||||
"roster-039": {
|
||||
"about": "pass 2 band 4: chess_char_3_12_a chess_char_3_12_b chess_char_3_18_a chess_char_3_18_b chess_char_3_04_a chess_char_3_05_a chess_char_3_04_b chess_char_3_05_b chess_char_3_01_a chess_char_3_19_a chess_char_3_21_a chess_char_3_01_b token_10028_vigil_wolf",
|
||||
@@ -2394,7 +2394,7 @@
|
||||
"total": 52,
|
||||
"unspawned": 0,
|
||||
"bossHpLeft": null,
|
||||
"rngDraws": 22,
|
||||
"rngDraws": 32,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {
|
||||
"p1": {
|
||||
@@ -2404,45 +2404,45 @@
|
||||
"leaks": 7,
|
||||
"leaksUncounted": 1,
|
||||
"coins": 6,
|
||||
"dmg": 441453,
|
||||
"dmg": 434965,
|
||||
"bossDmg": 0,
|
||||
"heal": 10574,
|
||||
"heal": 15164,
|
||||
"deaths": 1,
|
||||
"layerGains": {"miraShip":2,"raidShip":25}
|
||||
"layerGains": {"miraShip":1,"raidShip":29}
|
||||
}
|
||||
},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_3_12_a",1,null,4434.6,1,29,8,59863,1455,1459,222,9],
|
||||
["p1",2,"op","chess_char_3_12_b",1,"none",5578.4,1,31,6,62602,517,517,156,8],
|
||||
["p1",3,"op","chess_char_3_18_a",1,null,1481,1,10,2,6580,0,0,0,8],
|
||||
["p1",4,"op","chess_char_3_18_b",1,"none",1845,1,60,3,69809,4771,2926,133,9],
|
||||
["p1",5,"op","chess_char_3_04_a",2,null,1864,1,71,5,26952,34,34,63,2],
|
||||
["p1",6,"op","chess_char_3_05_a",1,null,5876,1,11,2,27881,4869,4869,80,1],
|
||||
["p1",7,"op","chess_char_3_04_b",2,"uniequip_004_swire2",2588.3,1,72,5,36112,233,221,48,3],
|
||||
["p1",8,"op","chess_char_3_05_b",1,"none",6750.7,1,34,1,34364,536,536,32,2],
|
||||
["p1",9,"op","chess_char_3_01_a",1,null,1471.8,1,1,2,9201,0,0,59,2],
|
||||
["p1",10,"op","chess_char_3_19_a",1,null,1021.4,1,4,2,33533,418,0,106,4],
|
||||
["p1",11,"op","chess_char_3_21_a",1,null,61.2,1,7,8,61420,1303,0,191,19],
|
||||
["p1",12,"op","chess_char_3_01_b",1,"none",1872,1,2,1,11398,0,0,59,3],
|
||||
["p1",13,"token","token_10028_vigil_wolf",null,null,880,1,5,0,1737,13,13,7,null]
|
||||
["p1",1,"op","chess_char_3_12_a",1,null,4527.96,1,29,7,50048,3502,3505,222,9],
|
||||
["p1",2,"op","chess_char_3_12_b",1,"none",5695.84,1,31,8,63112,491,491,143,7],
|
||||
["p1",3,"op","chess_char_3_18_a",1,null,1481,1,10,0,8013,0,0,0,7],
|
||||
["p1",4,"op","chess_char_3_18_b",1,"none",1754.05,1,60,4,70622,4758,2822,133,9],
|
||||
["p1",5,"op","chess_char_3_04_a",2,null,1864,1,9,3,29736,301,301,101,3],
|
||||
["p1",6,"op","chess_char_3_05_a",1,null,5876,1,11,3,19653,5258,5258,83,1],
|
||||
["p1",7,"op","chess_char_3_04_b",2,"uniequip_004_swire2",2588.3,0,73,6,49730,267,267,56,4],
|
||||
["p1",8,"op","chess_char_3_05_b",1,"none",6892.82,1,63,5,40156,1383,1383,27,3],
|
||||
["p1",9,"op","chess_char_3_01_a",1,null,1471.8,1,1,0,4904,0,0,62,2],
|
||||
["p1",10,"op","chess_char_3_19_a",1,null,1439,1,4,1,32850,0,0,106,5],
|
||||
["p1",11,"op","chess_char_3_21_a",1,null,1364,1,7,5,52209,0,0,181,18],
|
||||
["p1",12,"op","chess_char_3_01_b",1,"none",1770.9,1,2,3,13239,101,0,63,3],
|
||||
["p1",13,"token","token_10028_vigil_wolf",null,null,880,1,5,0,693,1137,1137,13,null]
|
||||
],
|
||||
"enemies": {
|
||||
"enemy_10030_vtwand": [1,0,0,0,0],
|
||||
"enemy_1010_demon": [1,1,0,1293,8100],
|
||||
"enemy_1061_zomshd": [1,1,0,907,24834],
|
||||
"enemy_1061_zomshd": [1,1,0,707,18421],
|
||||
"enemy_1169_duphlx": [1,1,0,13,4320],
|
||||
"enemy_1208_msfji_2": [1,1,0,0,30],
|
||||
"enemy_1302_ymtro_2": [1,1,0,0,32400],
|
||||
"enemy_1381_winman": [21,19,0,1102,129577],
|
||||
"enemy_1381_winman_2": [12,12,0,1900,101088],
|
||||
"enemy_1387_winshd": [12,7,0,8908,118207],
|
||||
"enemy_1438_dspred": [1,1,0,0,14256],
|
||||
"enemy_2034_sythef": [1,1,0,25,8640]
|
||||
"enemy_1381_winman": [21,21,0,1017,131544],
|
||||
"enemy_1381_winman_2": [12,12,0,938,101088],
|
||||
"enemy_1387_winshd": [12,6,0,9514,116335],
|
||||
"enemy_1438_dspred": [1,1,0,3564,14256],
|
||||
"enemy_2034_sythef": [1,0,1,152,8471]
|
||||
},
|
||||
"hooks": [1,74,5100,1390,1390,1922,1922,3820,46,53,70,68,0,16518,108,53,53,0,1,49,7,0,0],
|
||||
"events": {"atk":1390,"bounty":3,"deploy":21,"die":53,"dmg":1921,"engage":12,"fx":141,"heal":9,"layer":7,"skill":138,"spawn":66,"status":163},
|
||||
"fx": {"aoe":34,"blink":3,"bondMilestone":1,"buff":6,"camouflage":2,"coin":36,"displace":9,"dp":21,"garrison":7,"shield":1,"shieldBreak":1,"volley":19,"wolfShadow":1},
|
||||
"snaps": "da819bdf 95927d21 5b06ca67 7b8facef 6d346fd4 7e8daf59 933400e6 4e06e69e cda4bc82 8132a960 8e996740 b131bfe4 6c23eaad 92f0719d 441a1540 e267090f 0302ebd3"
|
||||
"hooks": [1,74,5100,1454,1454,2021,2021,3575,46,55,71,68,0,16779,105,87,53,1,1,49,8,0,0],
|
||||
"events": {"atk":1454,"bounty":3,"deploy":21,"die":54,"dmg":2021,"engage":12,"fx":151,"heal":12,"layer":8,"leak":1,"skill":139,"spawn":66,"status":170},
|
||||
"fx": {"aoe":32,"blink":4,"bondMilestone":1,"buff":7,"coin":52,"displace":6,"dp":21,"garrison":8,"shield":1,"volley":18,"wolfShadow":1},
|
||||
"snaps": "da819bdf 95927d21 5b06ca67 afd4ce9e 2d6b9a43 04b5b8da 04aaf5fc 1b6d6031 5dbd582a fe8106c0 7b64bcf4 b0019b47 8c436e5a 6e96890c 675aa741 e88f2bd8 0e28b0f2"
|
||||
},
|
||||
"roster-040": {
|
||||
"about": "pass 2 band 4: chess_char_4_01_a chess_char_4_17_a chess_char_4_18_a chess_char_4_04_a chess_char_4_07_a chess_char_4_16_a chess_char_4_09_a chess_char_3_19_b chess_char_3_21_b chess_char_4_02_a chess_char_4_12_a chess_char_4_13_a token_10028_vigil_wolf",
|
||||
@@ -2560,14 +2560,14 @@
|
||||
"round": 10,
|
||||
"seed": 3609857679,
|
||||
"waveId": "act1autochess_h03",
|
||||
"time": 166.93,
|
||||
"ticks": 5008,
|
||||
"time": 168.77,
|
||||
"ticks": 5063,
|
||||
"reason": "cleared",
|
||||
"killed": 59,
|
||||
"total": 59,
|
||||
"unspawned": 0,
|
||||
"bossHpLeft": null,
|
||||
"rngDraws": 56,
|
||||
"rngDraws": 71,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {
|
||||
"p1": {
|
||||
@@ -2579,7 +2579,7 @@
|
||||
"coins": 8,
|
||||
"dmg": 707444,
|
||||
"bossDmg": 0,
|
||||
"heal": 26772,
|
||||
"heal": 25770,
|
||||
"deaths": 6,
|
||||
"layerGains": {"preciShip":80,"sargonShip":90}
|
||||
}
|
||||
@@ -2587,16 +2587,16 @@
|
||||
"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,0,0,0,0,0],
|
||||
["p1",3,"op","chess_char_4_23_b",1,"uniequip_004_gvial2",3667.3,1,7,4,47638,0,0,27,1],
|
||||
["p1",4,"op","chess_char_4_19_b",1,"none",2075.9,1,10,2,19858,3947,0,15,5],
|
||||
["p1",5,"op","chess_char_4_22_b",1,"uniequip_002_svrash",3339.7,1,11,3,47706,11847,10062,50,1],
|
||||
["p1",6,"op","chess_char_5_01_a",2,null,1670.3,1,75,1,30509,11189,2631,40,0],
|
||||
["p1",7,"op","chess_char_4_16_b",1,"none",0,0,69,4,100013,5768,0,103,4],
|
||||
["p1",8,"op","chess_char_4_13_b",2,"uniequip_004_gnosis",2553.2,1,8,5,34665,0,0,47,3],
|
||||
["p1",9,"op","chess_char_4_20_b",1,"none",1844.7,1,9,21,181502,585,0,81,3],
|
||||
["p1",10,"op","chess_char_4_24_b",2,"none",2571.4,1,12,11,148270,8212,2074,35,4],
|
||||
["p1",3,"op","chess_char_4_23_b",1,"uniequip_004_gvial2",3667.3,1,7,5,47464,0,0,27,1],
|
||||
["p1",4,"op","chess_char_4_19_b",1,"none",2480.9,1,10,0,14037,3497,0,15,3],
|
||||
["p1",5,"op","chess_char_4_22_b",1,"uniequip_002_svrash",3339.7,1,11,2,31438,7676,6053,35,1],
|
||||
["p1",6,"op","chess_char_5_01_a",2,null,1449.42,1,62,6,66359,12108,5886,69,1],
|
||||
["p1",7,"op","chess_char_4_16_b",1,"none",0,0,73,5,113136,7804,113,104,6],
|
||||
["p1",8,"op","chess_char_4_13_b",2,"uniequip_004_gnosis",2553.2,1,8,6,33004,0,0,44,3],
|
||||
["p1",9,"op","chess_char_4_20_b",1,"none",1844.7,1,9,23,165646,585,0,76,3],
|
||||
["p1",10,"op","chess_char_4_24_b",2,"none",2571.4,1,12,6,140507,8058,960,35,4],
|
||||
["p1",11,"op","chess_char_4_25_b",1,"uniequip_002_cetsyr",2172.3,1,4,0,8037,0,0,0,3],
|
||||
["p1",12,"op","chess_char_5_02_a",1,null,1570.4,1,6,8,89245,0,12006,36,4],
|
||||
["p1",12,"op","chess_char_5_02_a",1,null,1570.4,1,6,6,87816,0,12759,34,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]
|
||||
],
|
||||
@@ -2606,17 +2606,17 @@
|
||||
"enemy_1112_emppnt_2": [1,1,0,0,18432],
|
||||
"enemy_1183_mlasrt": [1,1,0,694,7488],
|
||||
"enemy_1249_lysdb_2": [1,1,0,0,6912],
|
||||
"enemy_1267_nhpbr_2": [33,33,0,9527,209088],
|
||||
"enemy_1270_nhstlk_2": [12,12,0,11034,221184],
|
||||
"enemy_1272_nhtank_2": [6,6,0,10315,103680],
|
||||
"enemy_1267_nhpbr_2": [33,33,0,9253,209088],
|
||||
"enemy_1270_nhstlk_2": [12,12,0,9003,221184],
|
||||
"enemy_1272_nhtank_2": [6,6,0,10892,103680],
|
||||
"enemy_1329_cbshld_2": [1,1,0,1519,14976],
|
||||
"enemy_1512_mcmstr": [1,1,0,2748,92160],
|
||||
"enemy_1512_mcmstr": [1,1,0,2655,92160],
|
||||
"enemy_9008_acbunn": [1,1,0,1362,13824]
|
||||
},
|
||||
"hooks": [1,78,5008,540,540,1294,1310,2442,66,65,28,26,0,17271,1905,37,59,0,1,73,50,1,7],
|
||||
"events": {"atk":655,"bounty":4,"deploy":17,"die":65,"dmg":1155,"engage":9,"fx":187,"heal":119,"layer":50,"skill":54,"spawn":73,"status":275},
|
||||
"fx": {"aoe":5,"bombard":5,"bombardShell":5,"burst":1,"coldWind":3,"devour":4,"displace":6,"dodge":7,"explode":24,"extraAttack":7,"garrison":26,"garrisonGrant":1,"iceSpike":3,"link":3,"mote":27,"overload":1,"revive":1,"reweave":3,"riposte":4,"shieldBreak":1,"sleepGuard":4,"snow":1,"swordStorm":4,"telegraph":2,"zone":39},
|
||||
"snaps": "67d55f36 e622c3d8 e36adfeb 763fcfa5 375a7e2b 106a0fbd fac8ecf2 84d70a8d e973465a cb51a1f3 a5172b3f ef2320a9 899900bf 653ce960 53e7161d ed0e5822 3466ee0e"
|
||||
"hooks": [1,78,5063,542,542,1250,1266,1564,67,65,28,26,13,15442,1900,41,59,0,1,71,50,1,7],
|
||||
"events": {"atk":664,"bounty":4,"deploy":17,"die":65,"dmg":1122,"engage":9,"fx":199,"heal":158,"layer":50,"skill":54,"spawn":73,"status":259},
|
||||
"fx": {"aoe":3,"bombard":5,"bombardShell":5,"burst":1,"coldWind":3,"devour":4,"displace":6,"dodge":7,"explode":24,"extraAttack":16,"garrison":26,"garrisonGrant":1,"iceSpike":3,"link":3,"mote":29,"overload":1,"revive":1,"reweave":3,"riposte":4,"shieldBreak":1,"sleepGuard":3,"snow":1,"swordStorm":6,"telegraph":2,"zone":41},
|
||||
"snaps": "67d55f36 e622c3d8 e36adfeb 763fcfa5 375a7e2b b69b100f df1bc154 b58eb927 02d8eb73 91b09dc3 c7f53fed 82a339b6 4cc733b6 535d696f 8d432b83 e7e50110 cc72c539"
|
||||
},
|
||||
"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",
|
||||
|
||||
@@ -0,0 +1,158 @@
|
||||
// GitHub #140 (a player who tested the official mode; the owner's decision of 2026-10-06): 瑕光's S2 put 4 enemies to
|
||||
// sleep and she could still block the next one; once the skill ended they could no longer be blocked. PRTS 异常效果:
|
||||
// SLEEPING 沉睡 = 「无法行动+无敌+不可阻挡」, and BLOCK_FREE 不可阻挡 = 「无法阻挡/被阻挡,自动解除阻挡」. So a sleeping enemy
|
||||
// is let go by its blocker (the slot frees for the next enemy), is never blocked while asleep, stays where it is (it
|
||||
// cannot move), and when it wakes it is blocked again only by a blocker with a free slot — else it walks on, like any
|
||||
// unblocked enemy (DESIGN §24.9). Sleeping operators already released what they block (unchanged).
|
||||
//
|
||||
// Flat stage: enemies walk row 9 from the gate (9,10) to the goal (9,2), i.e. towards smaller columns (0.5 tile/s).
|
||||
|
||||
import { test } from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import { makeBattle, chessRec, enemyRec, checkInvariants } from '../helpers/battleHarness.js';
|
||||
import { getDefaultSource } from '../../server/sim/simdata.js';
|
||||
|
||||
const OP = 'test_sleep_blocker';
|
||||
const foe = (key, o = {}) => enemyRec({ key, hp: 1e7, speed: 1, ...o });
|
||||
/** A block-1 operator at (9,6) that never attacks; enemies A and B (B immune to sleep where a test needs it). */
|
||||
function lane(enemies, enemyDefs = {}) {
|
||||
return makeBattle({
|
||||
defs: {
|
||||
chess: { [OP]: chessRec({ id: OP, stats: { atk: 0, blockCnt: 1, maxHp: 1e6, respawnTime: 999 }, skill: null }) },
|
||||
enemies: { enemy_a: foe('enemy_a'), enemy_b: foe('enemy_b'), ...enemyDefs },
|
||||
},
|
||||
units: [{ chessId: OP, row: 9, col: 6 }], enemies, timeLimit: 120, content: 'none',
|
||||
});
|
||||
}
|
||||
const kill = (h, e) => h.b.loseHp(e, 1e12);
|
||||
|
||||
test('沉睡 frees the block slot: the sleeper is let go at once and stays put, the next enemy is blocked; awake with no room it walks on', () => {
|
||||
const h = lane([{ key: 'enemy_a', time: 0 }, { key: 'enemy_b', time: 1 }]);
|
||||
const u = h.unit(OP);
|
||||
const A = () => h.enemy('enemy_a'), B = () => h.enemy('enemy_b');
|
||||
assert.ok(h.runUntil(() => A()?.blockedBy === u, 30), 'A is blocked');
|
||||
const ax = A().x, ay = A().y;
|
||||
assert.ok(h.b.applyStatus(A(), 'sleep', { duration: 6, source: u }), 'A falls asleep');
|
||||
assert.equal(A().blockedBy, null, 'released at once (不可阻挡)');
|
||||
assert.deepEqual(u.blocking, [], 'the slot is free');
|
||||
assert.ok(h.runUntil(() => B()?.blockedBy === u, 10), 'B is blocked in the freed slot');
|
||||
assert.ok(A().s.flags.sleep, 'A still asleep');
|
||||
assert.equal(A().blockedBy, null, 'the sleeper is not blocked and takes no slot');
|
||||
assert.deepEqual(u.blocking, [B()]);
|
||||
assert.ok(A().x === ax && A().y === ay, 'the sleeper stays where it fell asleep');
|
||||
checkInvariants(h.b);
|
||||
// A wakes while B holds the only slot: it is not blocked and walks on past the operator
|
||||
assert.ok(h.runUntil(() => !A().s.flags.sleep, 10), 'A wakes');
|
||||
h.step();
|
||||
assert.equal(A().blockedBy, null, 'no room: A is not blocked');
|
||||
assert.equal(B().blockedBy, u, 'B keeps the slot');
|
||||
h.run(2);
|
||||
assert.ok(A().x < ax - 0.5, `A walked on (x ${A().x.toFixed(2)} from ${ax.toFixed(2)})`);
|
||||
assert.equal(A().blockedBy, null);
|
||||
assert.equal(B().blockedBy, u);
|
||||
checkInvariants(h.b);
|
||||
});
|
||||
|
||||
test('沉睡: never blocked while asleep, even beside a blocker with room — blocked again where it stands once it wakes', () => {
|
||||
const h = lane([{ key: 'enemy_a', time: 0 }, { key: 'enemy_b', time: 1 }]);
|
||||
const u = h.unit(OP);
|
||||
const A = () => h.enemy('enemy_a'), B = () => h.enemy('enemy_b');
|
||||
assert.ok(h.runUntil(() => A()?.blockedBy === u, 30));
|
||||
const ax = A().x;
|
||||
assert.ok(h.b.applyStatus(A(), 'sleep', { duration: 5, source: u }));
|
||||
assert.ok(h.runUntil(() => B()?.blockedBy === u, 10), 'B takes the slot');
|
||||
kill(h, B());
|
||||
h.step(2);
|
||||
assert.ok(!B().alive && u.blocking.length === 0, 'the slot is free again');
|
||||
h.run(1);
|
||||
assert.ok(A().s.flags.sleep, 'A still asleep');
|
||||
assert.equal(A().blockedBy, null, 'a sleeper is not blocked although the operator has room');
|
||||
assert.equal(u.blocking.length, 0);
|
||||
assert.ok(h.runUntil(() => !A().s.flags.sleep, 10), 'A wakes');
|
||||
h.step();
|
||||
assert.equal(A().blockedBy, u, 'blocked again the moment it wakes (a free slot, still in contact)');
|
||||
assert.equal(A().x, ax, 'it never moved');
|
||||
h.run(2);
|
||||
assert.equal(A().blockedBy, u);
|
||||
assert.equal(A().x, ax);
|
||||
checkInvariants(h.b);
|
||||
});
|
||||
|
||||
test('沉睡 through a plain buff (flags.sleep) is let go on the enemy\'s next update; 晕眩 / a refused sleep keep the block', () => {
|
||||
// a custom sleep buff: no applyStatus release — ai.js updateEnemy lets it go on its next update
|
||||
const h = lane([{ key: 'enemy_a', time: 0 }]);
|
||||
const u = h.unit(OP);
|
||||
const A = () => h.enemy('enemy_a');
|
||||
assert.ok(h.runUntil(() => A()?.blockedBy === u, 30));
|
||||
h.b.addBuff(A(), { key: 'test:sleep', duration: 2, flags: { sleep: true } });
|
||||
h.step();
|
||||
assert.equal(A().blockedBy, null, 'released');
|
||||
assert.deepEqual(u.blocking, []);
|
||||
h.run(2.2);
|
||||
assert.ok(!A().s.flags.sleep && A().blockedBy === u, 'awake beside a free blocker: blocked again');
|
||||
checkInvariants(h.b);
|
||||
// 晕眩 is not 不可阻挡: a stunned enemy stays blocked; a sleep-immune enemy refuses the sleep and stays blocked
|
||||
const h2 = lane([{ key: 'enemy_a', time: 0 }, { key: 'enemy_x', time: 8 }], { enemy_x: foe('enemy_x', { immunities: { sleepImmune: true } }) });
|
||||
const u2 = h2.unit(OP);
|
||||
const A2 = () => h2.enemy('enemy_a'), X = () => h2.enemy('enemy_x');
|
||||
assert.ok(h2.runUntil(() => A2()?.blockedBy === u2, 30));
|
||||
assert.ok(h2.b.applyStatus(A2(), 'stun', { duration: 2 }));
|
||||
h2.step(3);
|
||||
assert.equal(A2().blockedBy, u2, 'stunned: still blocked');
|
||||
kill(h2, A2());
|
||||
assert.ok(h2.runUntil(() => X()?.blockedBy === u2, 30));
|
||||
assert.equal(h2.b.applyStatus(X(), 'sleep', { duration: 3 }), false, 'immune');
|
||||
h2.step(3);
|
||||
assert.equal(X().blockedBy, u2, 'no sleep, still blocked');
|
||||
checkInvariants(h2.b);
|
||||
});
|
||||
|
||||
test('沉睡: the blocker\'s blocked-target list (Battle.blockedTargets — blocked-first targeting, the DEFAULT trigger, hitAllBlocked) drops the sleeper and takes the next enemy', () => {
|
||||
const h = lane([{ key: 'enemy_a', time: 0 }, { key: 'enemy_b', time: 1 }]);
|
||||
const u = h.unit(OP);
|
||||
const A = () => h.enemy('enemy_a'), B = () => h.enemy('enemy_b');
|
||||
assert.ok(h.runUntil(() => A()?.blockedBy === u, 30));
|
||||
h.b.applyStatus(A(), 'sleep', { duration: 6 });
|
||||
assert.deepEqual(h.b.blockedTargets(u, u.profile), [], 'no blocked target while A sleeps and B is not there yet');
|
||||
assert.ok(h.runUntil(() => B()?.blockedBy === u, 10));
|
||||
assert.deepEqual(h.b.blockedTargets(u, u.profile), [B()], 'B is the blocked target');
|
||||
});
|
||||
|
||||
test('#140: 瑕光 S2 puts the 3 enemies she blocks to sleep and still blocks the next 3; when S2 ends the sleepers wake with no room and walk on', () => {
|
||||
const ds = getDefaultSource();
|
||||
const id = 'chess_char_3_12_a';
|
||||
const rec = ds.rawChess(id);
|
||||
assert.equal(rec.stats.blockCnt, 3, 'block 3');
|
||||
const skillIndex = rec.skills.find((s) => s.skillId === 'skchr_blemsh_2').index;
|
||||
const h = makeBattle({
|
||||
// (a MANUAL 重装 skill: cast by a blocked enemy's hit — TAKE_DAMAGE)
|
||||
defs: { enemies: { enemy_x: foe('enemy_x', { atk: 100, bat: 1 }), enemy_y: foe('enemy_y', { atk: 100, bat: 1 }) } }, timeLimit: 90,
|
||||
units: [{ chessId: id, row: 9, col: 8, skillIndex }],
|
||||
enemies: [{ key: 'enemy_x', time: 0, count: 3, interval: 0.5 }, { key: 'enemy_y', time: 6, count: 3, interval: 0.5 }],
|
||||
});
|
||||
const u = h.unit(id);
|
||||
const xs = () => h.b.enemies.filter((e) => e.defId === 'enemy_x');
|
||||
const ys = () => h.b.enemies.filter((e) => e.defId === 'enemy_y');
|
||||
assert.ok(h.runUntil(() => xs().length === 3 && xs().every((e) => e.blockedBy === u), 30), 'she blocks the first three');
|
||||
u.skill.gainSp(u.skill.spCost * u.skill.maxCharges + 1, 'test');
|
||||
assert.ok(h.runUntil(() => u.skill.active, 5), 'S2 cast');
|
||||
h.step();
|
||||
const pos = new Map(xs().map((e) => [e, e.x]));
|
||||
assert.ok(xs().every((e) => e.s.flags.sleep && !e.blockedBy), 'the three sleep and are let go');
|
||||
assert.equal(u.blocking.length, 0, 'all three slots free');
|
||||
// the next three walk in during S2 and are blocked
|
||||
assert.ok(h.runUntil(() => ys().length === 3 && ys().every((e) => e.blockedBy === u), 12), 'she blocks the next three during S2');
|
||||
assert.ok(u.skill.active, 'S2 still running');
|
||||
assert.ok(xs().every((e) => e.s.flags.sleep && !e.blockedBy && e.x === pos.get(e)), 'the sleepers stay put, unblocked');
|
||||
checkInvariants(h.b);
|
||||
// S2 ends: the sleepers wake beside her, her three slots full — not blocked, they walk on (the reporter's "技能结束后
|
||||
// 则无法被阻挡")
|
||||
assert.ok(h.runUntil(() => !u.skill.active, 12), 'S2 ends');
|
||||
h.step();
|
||||
assert.ok(xs().every((e) => !e.s.flags.sleep), 'awake');
|
||||
assert.ok(xs().every((e) => !e.blockedBy), 'no room: none of them is blocked');
|
||||
assert.deepEqual(new Set(u.blocking), new Set(ys()), 'she keeps the three she holds');
|
||||
h.run(3);
|
||||
for (const e of xs()) assert.ok(e.x < pos.get(e) - 1, `walked on (x ${e.x.toFixed(2)})`);
|
||||
checkInvariants(h.b);
|
||||
});
|
||||
Reference in new issue
Block a user