feedback7 R22-UNBAL: 失衡 review fixes — a pulled 静态刚体 is held for the pull's window, 弧光锋卫 bleeds 400 every 0.066 s while the state lasts, no enemy skill / blink / scripted move during it, a route APPEAR or a 逐火 重生 ends it, every push row holds its exact frames; golden: 32 move, 8 in outcomes (below)
Branch review of fb7-unbalance (MERGE AFTER FIXES): 1. A 静态刚体 pulled got the 0.1 s floor: _staticForce now knows push from pull — a push's force is instant (推与拉), so 0.1 s; a pull's lasts its window (pullUnbalance: 1 s, 0.5 s below −1) — PRTS 特殊机制 静态刚体 「在失去施力后立刻」 out, 「0.1 秒保底」. pull() checks the puller's own block before the static case. 2. 弧光锋卫 (PRTS 天赋 「处于失衡状态时,每0.066s受到400点无来源真实持续伤害」, data unbalanced_bleed): a tick bleed of 400 every 0.066 s while unbalancedNow holds; the per-tile one-shot from the position jump ([ASSUMED], UNBALANCE_SPEED) is gone. A 受力等级 0 push (0.8 s) → 12 hits = 4800 (was 2037), a 急停 pull with no movement (1 s) → 15 = 6000 (was 0), a wall-shortened slide keeps the 0.8 s row → 4800. 3. 失衡免疫 「失衡期间无法自主移动、发动攻击、使用技能」: enemies/helpers.js unbalancedNow; canCast(e, sil, battle) refuses while it runs (content skills; the boss parts' calls pass the battle), blinkForward returns null, 枯朽之种's dive / blast and the 铳 / 碎铳之簧 charges wait, 乌顶巨角卢鲁's clash waits for its end. A route APPEAR relocation clears it (a forced state switch, 失衡位移机制). Left running on purpose (docs/SIM.md): 水遁忍者's damage check (异常效果 「仍然能正常造成伤害」), passive auras and terrain / periodic effects, death / damage-taken triggers, skill cooldowns, 弧光锋卫's bleed itself. 4. husk() (逐火 余烬 重生) clears the state like reborn(). 5. The 35/30 row held 36 frames (t0 + 35/30 overshoots in floats): every check compares with 1e-9; the frames are asserted. Tests: test/sim/unbalance.test.js +6 (exact frames 6 / 12 / 24 / 27 / 32 / 35 with the walk on the next frame; static pull 1 s / 0.5 s, push 0.1 s; 弧光锋卫 4800 / 6000 / 4800; canCast / blinkForward refused, 枯朽之种 held then diving; the elk's clash after the state; APPEAR and a 逐火 重生 clear it — all six fail on the parent); enemies_bosses (失衡 kit test) and feedback1d-solvent (BUFF damage) updated to the state bleed. test/sim + test/content + test/render pass. Docs: SIM.md (push / pull row), PLAYING.md, design/engine.md (helpers, enemy AI), constants / displacement comments. Golden against the previous commit — outcome moves: roster-010 (歌蕾蒂娅 pulls 妖怪 drones, now held 1 s: killed 44→45, leaks 58→57), roster-040 (static pulls of 妖怪: killed 28→25, leaks 37→40, deaths 29→30), roster-043 / 044 (山: deaths 14→16 / 14→13), hidden-boss_9-pair (锏: boss HP 3636991→3586929), coop4-ABYSS-7 (ai_2 LP +1 from round 5), diy-115 (黑键: leaks 70→75), diy-116 (黑键: killed 2→3, leaks 121→120) — the static pulls (probe) and the 1e-9 end (a frame shorter where the float sum overshot: the 35/30 row, some pull windows); other moves (damage / snapshots only): roster-008 / 017 / 039, 9 bonds, boss-boss_4-pair / boss_6-pair / hidden-boss_10-pair, coop2-NORMAL-14-standins / coop2-NORMAL-3 / solo-ABYSS-1 / solo-HARD-1 / solo-HARD-9-boosted / solo-NORMAL-1, diy-053 / 085 / 102.
This commit is contained in:
1 parent
cdf2bd5c88
commit
1db84d799d
20 files changed
+440
-301
No files matched your search
+1
-1
@@ -80,7 +80,7 @@
|
||||
- **阻挡**看接触:干员阻挡中心距离约 0.7 格以内、与它接触的敌人(地面干员挡不住飞行和近地悬浮的敌人)。敌人卡在两名干员之间时,阻挡它的干员倒下、撤退或被晕眩后,另一名仍与它接触、还有空余阻挡数的干员会**立刻接替阻挡**;都没有空位时敌人才会走掉。被冻结或晕眩的敌人同样会被接触到的干员挡住:干员再部署到它身边就会阻挡它,隐匿的敌人也随之破隐(沉睡、浮空、恐惧的敌人仍然挡不住)。迎面走来的敌人会停在干员格子前面。**阻挡了就一定能打到**:任何干员(包括站在近战位的远程干员和召唤物)总能攻击自己阻挡的敌人,不管它在不在攻击范围内、在干员哪一侧,并且优先攻击它——只有速射手例外:攻击范围内有飞行敌人时先打飞行敌人(特性「优先攻击空中单位」,维护者 2026-10-08 的决定,GitHub #220)(医疗干员除外:咒愈师以外的医疗挡住敌人时照常治疗队友,不会攻击它;「停止攻击」类技能期间也除外;技能原文另有限制的也按原文:普罗旺斯二技能开启时不以生命值高于 80% 的敌人为目标,寒檀二技能的冰凌随机落在攻击范围内的地块上)。
|
||||
- 开战时干员按**逐列从左到右、每列从上到下**的顺序部署(最左一列最先,与阿戈尔吞噬「更靠左和靠上」的顺序相同),召唤物在所有干员之后。被阻挡的敌人先打阻挡它的干员;没被阻挡的远程敌人先打嘲讽等级高的,同级时打最后部署的(召唤物、最右一列靠下的干员和刚再部署的干员更容易挨打)。隐匿的干员只会被它阻挡的敌人攻击,没被它挡住的敌人的溅射、爆炸、范围技能、留下的伤害区域(包括假想敌:蚀裂被击倒后喷出的毒雾)以及深池伙友卫队、扎罗的减攻速光环也落不到它身上(和官方一样;写明「无视无法选择」的效果如污染秽蚀照常能打到,寒霜的减攻速光环和“墓碑”这类地图效果照常生效);**迷彩**(如忍冬三技能期间击倒敌人后、寒芒克洛丝一技能)同样只会被它阻挡的敌人攻击,也显示为半透明,但躲不开溅射、爆炸和范围伤害(同时打范围内所有单位的普通攻击——如“斩胄之剑”“破胄之锤”“灵幛”——打不到它),也不算隐匿(不触发叙拉古等「隐匿时」效果)。叙拉古的隐匿按时(32 秒 + 每层 0.4 秒)结束;忍冬的迷彩按官方持续到她下一次开技能。**蒂比起飞**期间只挡飞行敌人,地面敌人不会选她为目标(普通攻击、溅射、技能范围、燃烧区域和要选中目标的减益都落不到她身上);飞行和悬浮敌人、写明「无视无法选择」的效果(如污染秽蚀)照常能打到她;地面敌人的光环和全场效果(如“墓碑”让全场攻击力、防御力减半)、她攻击敌人时招来的反制(如重装侦察兵的暴露)照常生效,起飞前已挂上的持续伤害也照常跳。
|
||||
- **技能自动释放**按官方「技能策略」:一般的手动技能在技能就绪、即将攻击 / 治疗且初始攻击范围内有敌人(治疗技能:有受伤的队友)时释放;**带独立技能范围**的技能(如德克萨斯「剑雨」、凛御银灰「御敌的锋锐」、锏「归于宁静」,不含「攻击范围扩大」类)在**技能范围内出现敌人**时就释放,不必先攻击;**开启后攻击范围比平时大**的手动技能(如莫斯提马「序时之匙」、银灰「真银斩」、史尔特尔「黄昏」、白面鸮「脑啡肽」)在**开启后的攻击范围内出现敌人**(治疗技能:有受伤的队友)时就释放,不必等敌人走进平时的攻击范围,这是本作按玩家反馈有意与官方不同的地方;**重装干员**的手动技能在受到伤害时释放(例外:深巡、雷蛇的二技能,号角的二、三技能,灰毫的一、二技能按玩家反馈改为攻击范围内有敌人时就释放(深巡二技能按开启后更远的攻击范围判断),余的二技能「厚礼上宾」改为周围两格(技能范围)内有敌人时就释放,这是本作有意与官方不同的地方;深巡一技能仍要受到伤害);执旗手 / 战术家 / 吟游者技能就绪即释放,解放者 / 阵法术师在初始攻击范围内有敌人时释放(开启后攻击范围扩大的技能——薄绿「风语」、蜜蜡「沙暴扩散」、卡涅利安「食噬之印」、玛恩纳「未宽解的悲哀」,以及安洁莉娜「秘杖·反重力模式」——同样按开启后的攻击范围判断)。**自动触发**的技能按其本身规则:只作用于队友的(如引星棘刺「度算浪波」、浊心斯卡蒂「同葬无光之愿」、纯烬艾雅法拉「无声润物」)技力满就释放,不用等敌人或伤员;立即生效、本身不是一次攻击的技能(如度算浪波、先锋的回费技能)两次释放之间至少隔一个攻击间隔(释放本身不占用普通攻击),攻速越快放得越勤,迅捷返还的技力再多也不会每一帧都放(GitHub #298);伺夜「领袖的呼唤」「领袖的馈赠」只在场上有狼群时释放:狼群处于战术点形态时,「领袖的呼唤」也会释放并让它立刻带着 1 只狼影回到场上(狼影未满时改为加 1 只狼影,已满时把狼群的生命值回满),「领袖的馈赠」也会释放(立即获得费用,强化留给回来的狼群的下一次攻击);又如古米「备用军粮」在身边(技能范围内)有受伤的队友时就会发动,下一次攻击改为治疗该队友(不用先接敌;她的二技能「食粮烹制」是手动技能,按重装规则在受到伤害时释放);塞雷娅「急救」在她即将攻击时、身边有生命不高于一半的队友才发动,这次攻击直接改为治疗;新约能天使二技能的护盾按官方给攻击范围内**仇恨最高**的队友(嘲讽等级高的优先,同级时给最后部署的),不一定是站在最前面挨打的那个。手动技能的自动释放有 3 秒冷却:开战部署后先等 3 秒,之后同一干员两次自动释放至少间隔 3 秒(可充能的技能不会同时放完)。白铁的「铁钳号·原型机」能被我方干员攻击(不受伤害):它在攻击范围 / 技能范围内时,能作用到它的技能会像遇到敌人一样自动开启并消耗弹药(项目维护者 2026-10-08 按官方体验确认;白铁™多功能平台不会被攻击);技能效果只会挑选敌人、打不到它的技能(如德克萨斯「剑雨」)不会为它开启,留给真正的敌人。
|
||||
- **推开 / 拉拽**按官方「力度 − 重量」决定距离:例如野鬃二技能(中等力度)把重量 0 / 1 / 2 / 3 的敌人推开约 2.1 / 1.7 / 0.4 / 0.1 格,重量 4 以上推不动——轻型敌人反而推得更远。野鬃二技能沿她的朝向推开:正前方 45° 以内按上面的距离,身后、侧面或贴身的敌人只被轻推一下(约 0.4 格以内);琳琅诗怀雅三技能的金币则从她身边向外推开,落在她前方 2–4 格的范围(官方「范围2-4」)内的地面敌人和她阻挡的敌人身上。被推开、拉动的敌人会进入官方的**失衡**状态,这段时间里不走路、也不发动普通攻击:推开按力度减重量的档位持续 0.2–约 1.17 秒(中等力度推重量 1 的敌人为 0.8 秒),拉拽持续 1 秒(力度比重量低 2 档时 0.5 秒,拉到身前后也一样),推不动的空中单位(静态刚体)受力时也会停顿 0.1 秒;浮空会立刻解除失衡。画面上的滑行也用同样的时间(默认 2 倍速下现实时间减半)。攻击速度最低为 20(沼泽、寒霜等减速叠满时也不会更慢)。
|
||||
- **推开 / 拉拽**按官方「力度 − 重量」决定距离:例如野鬃二技能(中等力度)把重量 0 / 1 / 2 / 3 的敌人推开约 2.1 / 1.7 / 0.4 / 0.1 格,重量 4 以上推不动——轻型敌人反而推得更远。野鬃二技能沿她的朝向推开:正前方 45° 以内按上面的距离,身后、侧面或贴身的敌人只被轻推一下(约 0.4 格以内);琳琅诗怀雅三技能的金币则从她身边向外推开,落在她前方 2–4 格的范围(官方「范围2-4」)内的地面敌人和她阻挡的敌人身上。被推开、拉动的敌人会进入官方的**失衡**状态,这段时间里不走路、也不发动普通攻击:推开按力度减重量的档位持续 0.2–约 1.17 秒(中等力度推重量 1 的敌人为 0.8 秒),拉拽持续 1 秒(力度比重量低 2 档时 0.5 秒,拉到身前后也一样),失衡期间也不会放技能(例如弑君者的闪现)或执行脚本移动(例如枯朽之种俯冲),弧光锋卫则在失衡期间每 0.066 秒受到 400 点真实伤害;推不动的空中单位(静态刚体)被推时停顿 0.1 秒、被拉时停顿整个拉力作用时间;浮空、重生和路线上的瞬移出现都会立刻解除失衡。画面上的滑行也用同样的时间(默认 2 倍速下现实时间减半)。攻击速度最低为 20(沼泽、寒霜等减速叠满时也不会更慢)。
|
||||
- **生命回复不是治疗**(与官方一致):吟游者的特性(魔王、浊心斯卡蒂及其海嗣)、调香师的天赋、瑕光二技能、铃兰三技能、锡人和引星棘刺(一、二技能)的炼金单元给友军的「每秒恢复生命」是提高对方的**生命回复速度**,不是治疗:收割者 / 不屈者 / 武者(如隐德来希、圣约送葬人、折桠)这类「无法被友方治疗」的干员和处于禁疗的干员也能吃到,治疗量加成(如「受到的治疗效果提升」)也不会放大它;铃兰三技能开启后的第一秒没有回复。直接治疗(医疗干员的治疗、技能的「恢复…生命」)仍然对这些干员无效。
|
||||
- **元素损伤条**在单位自己的血条正下方:左边是元素图标,白条是剩余的元素值,只有真正爆发时才会耗尽;爆发后条变成元素的颜色、图标闪烁,在冷却期间慢慢回满(这段时间不会再积累元素损伤)。
|
||||
- **弹药、狼影和「我执」**也画在血条上(0.2.2):弹药类技能(如隐现的二技能,14 发)开启时,血条下方的技力条换成**分格的黄色弹药条**——一格一发,打一发少一格,补弹时回来;这类技能开启期间脚下不再有持续的金色光环。伺夜的狼群在血条下方有一排**菱形**,亮的是剩下的狼影,暗的是已用掉的空位(最多 3 个),进入战术点形态时消失。斩业星熊进入「我执」后,绿色血条停在 1 点,超出的伤害涨成血条上的**红条**,红条满了才会倒下。这些只是显示,不改变任何战斗数值。
|
||||
|
||||
+1
-1
@@ -896,7 +896,7 @@ instance) and skip `'counter'` / `'reflect'` damage. When the guard trips, the l
|
||||
| `moveRedeploy(unit, r, c, { clearSp })` | a 【移动】 (PRTS 术语释义: "不退场,以当前血量在目标位置部署", a special retreat + redeploy): `relocate`'s checks (false = refused, nothing changed), then a new deployment (`deploySeq` / `aggroSeq` / `deployedAt`) and `deploy {initial:false, move:true}` (deploy effects fire again); no `die` / `death`, timer or cost (不屈 / 阿戈尔's revive never see it); HP, buffs and a running skill are kept (owner's deviation, DESIGN §22.3); `clearSp` empties the SP before the deploy handlers run — 乌尔比安 S3's move (kits/ops/chess_char_5_05-ulpia.js) and 【返回】 (`clearSp`; also the 从不混淆的方向 fallback, content/tokens.js) |
|
||||
| `redeploy(unit, { free=true, tile, keepSp })` | immediate (re)deployment of a dead/retreated ally (full HP, `deploy {initial:false}`); `free: false` pays `base.cost` DP (refused without it); without `tile` it lands on the unit's rest tile (`restTile`: where a knocked-out operator lies, else home); `tile: [r, c]` lands on that tile once (home unchanged; refused when off-rect, occupied or a knocked-out operator's tile, no fallback); `keepSp` keeps SP/charges (保留技力), restored before `deploy` fires — but not for a skill that costs no SP, which the reset re-arms as at every deployment (伊内丝 S3 casts again on a 突袭 landing) — 突袭 raids, 阿戈尔 / 不屈 revives where the unit lies |
|
||||
| `refreshRange(unit)`, `setExtraRange(unit, keys)`, `rangeChanged(unit)` | rebuild the ranges after changing `unit.rangeGrid` (流形 copies); extra targetable tiles (absolute keys; merged into every later rebuild until set again; `null` clears; never in `baseRangeKeys`): 蕾缪安 wanted, 维娜 S3 |
|
||||
| `push(enemy, force, {from, dir, fixed, fixedAngle, inward, effect})`, `pull(enemy, force, {to, center, stop})`, `pullToFront(enemy, unit, force)`, `forceLevel(enemy, force)`, `pushDistance(enemy, force, {effect})` | the official 位移 (PRTS 游戏数据基础 §重量公式 / 推与拉; user playtest #6 item 14): 受力等级 = 力度 (微小力 −1, 小力 0, 中力 1, 较大力 2, 大力 3 …) − current 重量等级 (massLevel, 失重 counts). Push distance per level (`constants.js PUSH_TILES`, PRTS 推与拉's 弹道 column): ≤ −3 → 0, −2 → 0.12, −1 → 0.44, 0 → 1.7, 1 → 2.14, 2 → 2.96, ≥ 3 → 3.53 tiles; `effect` = a 特效 push (`PUSH_TILES_EFFECT`: −2 → 0.085, −1 → 0.374, 0 → 1.562, 1 → 1.987, 2 → 2.773, ≥ 3 → 3.331 — 见行者 S1 / S2, `PUSH_EFFECT_SKILLS`; every other pusher uses the 弹道 column [ASSUMED]); radial (away from `from`; the client's buff template `knockback[relative]`: 莫斯提马 S3, 山 S3, 琳琅诗怀雅 S3 — also PRTS 备注 "推开效果为径向推动") unless `dir` (directional; template `knockback[dir]` = Knockback {`_useSourceDirection` true, `_decreaseForceLevelWhenNotInDirection` 2}: 推击手, 野鬃 S2 "往攻击方向" (charpack char_496_wildmn: buff `wildmn_s_2[force]`) — > 45° off or < 0.25 tile ⇒ radial and level −2; `fixed` waives both (圣聆初雪 S1 朝部署方向, `KnockBackWithCharacterDirection`), `fixedAngle` only the angle (见行者 S2)); `inward` = a push towards `from` (薄绿 S2), stopping at the 急停 radius. Pull: level ≥ 0 → to `to` / the 急停 radius around `center`, −1 → 35 % of the way, −2 → 0.03, ≤ −3 → 0; `pullToFront` aims at the 拉力起点 0.5 tile ahead of the unit with the 急停 radius 0.6708 around it (never moves an enemy the unit itself blocks — nor does a pull towards an ally's centre, e.g. the 流形 S3 pulse) A 静态刚体 (data `staticBody`: every air unit of the mode except “炎佑”, plus 昆图斯 — PRTS 特殊机制 "可以进入失衡状态…但物理层面上无法产生任何速度或移动", "与单位的行动方式无关") moves 0 from every source while the skills that reach it still hit it (薄绿 S2, 锏 S3, the 钩索师 …; player report after 0.1.0). **失衡 (UNBALANCE)** (PR #392's idea, its timing re-done from the sources): the move stays instant, then the enemy is held in the 失衡 state — a state machine, not a status (PRTS 失衡位移机制; 异常效果 「失衡…不属于异常效果」: no stun, no immunity, SP untouched), `enemy.unbalanceUntil`, read by `ai.js updateEnemy`: no walking (恐惧 / 诱导 included — no fear exemption) and no normal attack started, a swing short of its frame cut, the attack clip's stand ended; checks that ignore the state (水遁忍者's damage, content abilities) go on — no global skill lock ([ASSUMED] scope: 失衡免疫's 「无法…使用技能」 is not modelled). Length, game seconds: a push — the 位移时间 of its 受力等级, PRTS 游戏数据基础 推力-位移近似对应表 (`constants.js PUSH_UNBALANCE`: −2 → 0.2, −1 → 0.4, 0 → 0.8, 1 → 0.9, 2 → 32/30, ≥ 3 → 35/30), the level push() computes (the −2 correction included), kept when the 特效 column or a wall shortens the slide ([ASSUMED] for the wall; a wall at the first step → the 0.1 s floor [ASSUMED]); a pull — its force window, 推与拉 「作用时间默认为 1 s;若本次受力等级 < −1,作用时间改为 0.5 s」 (`PULL_UNBALANCE` / `_WEAK`), to its end after the 急停 too (「目标将仍保持失衡状态至拉力作用时间结束为止」), none at ≤ −3; a 静态刚体 hit by a force > 0 — the 0.1 s 失衡硬直 floor (`UNBALANCE_MIN`, 特殊机制 静态刚体), no movement; 失衡免疫 and leaders never. 浮空 ends it (术语释义 浮空), so does a 重生. The `displace` fx carries the length (`dur`): the client's slide takes as long (render/units.js slideTo). PR #392's 0.6387·√tiles (from the page's μ = 0.5 单位假设) and its fear exemption are not taken |
|
||||
| `push(enemy, force, {from, dir, fixed, fixedAngle, inward, effect})`, `pull(enemy, force, {to, center, stop})`, `pullToFront(enemy, unit, force)`, `forceLevel(enemy, force)`, `pushDistance(enemy, force, {effect})` | the official 位移 (PRTS 游戏数据基础 §重量公式 / 推与拉; user playtest #6 item 14): 受力等级 = 力度 (微小力 −1, 小力 0, 中力 1, 较大力 2, 大力 3 …) − current 重量等级 (massLevel, 失重 counts). Push distance per level (`constants.js PUSH_TILES`, PRTS 推与拉's 弹道 column): ≤ −3 → 0, −2 → 0.12, −1 → 0.44, 0 → 1.7, 1 → 2.14, 2 → 2.96, ≥ 3 → 3.53 tiles; `effect` = a 特效 push (`PUSH_TILES_EFFECT`: −2 → 0.085, −1 → 0.374, 0 → 1.562, 1 → 1.987, 2 → 2.773, ≥ 3 → 3.331 — 见行者 S1 / S2, `PUSH_EFFECT_SKILLS`; every other pusher uses the 弹道 column [ASSUMED]); radial (away from `from`; the client's buff template `knockback[relative]`: 莫斯提马 S3, 山 S3, 琳琅诗怀雅 S3 — also PRTS 备注 "推开效果为径向推动") unless `dir` (directional; template `knockback[dir]` = Knockback {`_useSourceDirection` true, `_decreaseForceLevelWhenNotInDirection` 2}: 推击手, 野鬃 S2 "往攻击方向" (charpack char_496_wildmn: buff `wildmn_s_2[force]`) — > 45° off or < 0.25 tile ⇒ radial and level −2; `fixed` waives both (圣聆初雪 S1 朝部署方向, `KnockBackWithCharacterDirection`), `fixedAngle` only the angle (见行者 S2)); `inward` = a push towards `from` (薄绿 S2), stopping at the 急停 radius. Pull: level ≥ 0 → to `to` / the 急停 radius around `center`, −1 → 35 % of the way, −2 → 0.03, ≤ −3 → 0; `pullToFront` aims at the 拉力起点 0.5 tile ahead of the unit with the 急停 radius 0.6708 around it (never moves an enemy the unit itself blocks — nor does a pull towards an ally's centre, e.g. the 流形 S3 pulse) A 静态刚体 (data `staticBody`: every air unit of the mode except “炎佑”, plus 昆图斯 — PRTS 特殊机制 "可以进入失衡状态…但物理层面上无法产生任何速度或移动", "与单位的行动方式无关") moves 0 from every source while the skills that reach it still hit it (薄绿 S2, 锏 S3, the 钩索师 …; player report after 0.1.0). **失衡 (UNBALANCE)** (PR #392's idea, its timing re-done from the sources): the move stays instant, then the enemy is held in the 失衡 state — a state machine, not a status (PRTS 失衡位移机制; 异常效果 「失衡…不属于异常效果」: no stun, no immunity, SP untouched), `enemy.unbalanceUntil`, read by `ai.js updateEnemy`: no walking (恐惧 / 诱导 included — no fear exemption) and no normal attack started, a swing short of its frame cut, the attack clip's stand ended; and no skill (失衡免疫 「失衡期间无法自主移动、发动攻击、使用技能」): content skills wait (`enemies/helpers.js canCast(e, sil, battle)`, `unbalancedNow`), so do blinks (`blinkForward`) and scripted moves (枯朽之种's dive, the 碎铳之簧 / 铳 charges), and 乌顶巨角卢鲁's clash waits for its end. Left running on purpose: checks the state does not stop (异常效果: 水遁忍者's damage — 「仍然能正常造成伤害」), passive auras and terrain / periodic effects (no skills), death / damage-taken triggers, skill cooldowns (only the cast waits) — and 弧光锋卫's bleed, which is the state's own (天赋 「处于失衡状态时,每0.066s受到400点无来源真实持续伤害」: every 0.066 s for as long as it lasts — until 0.2.2 one hit per tile moved [ASSUMED]). Length, game seconds: a push — the 位移时间 of its 受力等级, PRTS 游戏数据基础 推力-位移近似对应表 (`constants.js PUSH_UNBALANCE`: −2 → 0.2, −1 → 0.4, 0 → 0.8, 1 → 0.9, 2 → 32/30, ≥ 3 → 35/30), the level push() computes (the −2 correction included), kept when the 特效 column or a wall shortens the slide ([ASSUMED] for the wall; a wall at the first step → the 0.1 s floor [ASSUMED]); a pull — its force window, 推与拉 「作用时间默认为 1 s;若本次受力等级 < −1,作用时间改为 0.5 s」 (`PULL_UNBALANCE` / `_WEAK`), to its end after the 急停 too (「目标将仍保持失衡状态至拉力作用时间结束为止」), none at ≤ −3; a 静态刚体 hit by a force > 0 — no movement, the state while the force acts (特殊机制 静态刚体: 「在失去施力后立刻」 out, 「0.1 秒保底」): a push 0.1 s (`UNBALANCE_MIN`; a push's force is instant), a pull its window; 失衡免疫 and leaders never. 浮空 ends it (术语释义 浮空), so do a 重生 (重生 / 逐火's 余烬) and a route APPEAR relocation — forced state switches (失衡位移机制). The end compares with 1e-9 so a float-summed 35/30 s keeps its 35 frames. The `displace` fx carries the length (`dur`): the client's slide takes as long (render/units.js slideTo). PR #392's 0.6387·√tiles (from the page's μ = 0.5 单位假设) and iLine truncated
|
||||
| `displace(enemy, {x, y}, tiles, {dur})` | the raw mover behind push / pull: along passable tiles (by `motion`: FLY in the rect, else ground-passable), no weight rule, no 失衡 state of its own (push / pull add it; `dur` only rides on its `displace` fx); nothing for 失衡免疫 (`noDisplace`: 近地悬浮 incl. 喷气人's 飞行模式, 浮空, the 胄 parts, 守墓石像's statue and flight), 静态刚体 (`def.staticBody`) and leaders (`_displaceable`); unblocks + re-paths |
|
||||
| `after(seconds, fn, {owner})`, `every(seconds, fn, {owner, immediate})` | return `{cancel()}`; fn(battle, sched) |
|
||||
| `fx(kind, params)`, `rng()` (+ `rng.int/range/chance/pick/shuffle/weighted`) | never use Math.random; for distances, angles and powers use `hypot`, `sin`, `cos`, `atan2`, `powi` from `server/sim/detmath.js`, never `Math.hypot` / `sin` / `cos` / `atan2` / `pow` / `**` (their last bits differ between browsers) |
|
||||
|
||||
@@ -113,7 +113,7 @@ Base stats (from data): `maxHp, atk, def, res` (0–100), `aspd` (100 base), `ba
|
||||
|
||||
DamageInfo: `{ amount (pre-mitigation), type: 'phys'|'arts'|'true'|'element', element?: 'burn'|'necrosis'|'neural'|'apoptosis', atkScale, defIgnoreFlat, defIgnorePct, resIgnoreFlat, resIgnorePct, mul (multiplier), canDodge, isSkill, isSplash, ignoreSelect (no selection — a 无视无法选择 ability, a direct pick, a debuff's tick: it reaches an airborne 起飞 ally, §21.22), tags[] }`.
|
||||
|
||||
Engine helpers (content must use these, never touch internals): `battle.dealDamage(source, target, dmgInfo)`, `battle.heal(source, target, amount, {overheal=false})`, `battle.applyStatus(target, key, { duration, source, value })`, `battle.addBuff(unit, buff)`, `battle.removeBuff(unit, key)`, `battle.spawnToken(ownerUnit|playerId, tokenId, row, col, opts)`, `battle.spawnEnemy(enemyKey, { routeIndex, pos, mods, tag })`, `battle.addProjectile({ from, to|target, speed, onHit, visual })`, `battle.push(e, force, { from, dir, fixed, fixedAngle, inward, effect })` / `battle.pull(e, force, { to, center, stop })` / `battle.pullToFront(e, unit, force)` / `battle.forceLevel(e, force)` / `battle.pushDistance(e, force, { effect })` (the official 力度 − 重量 tables, §20.3; a 静态刚体 — data `staticBody` — is never moved, §21.9; `battle.displace(e, dir, distance)` is the raw mover), `battle.allySelectable(a, by)` / `battle.alliesFor(by, ownerId)` (friendly selection, skipping 孤立 units, §20.3), `battle.unitsInGrid(unit, grid)`, `battle.enemiesInRadius(x, y, r)` (every enemy: enemy-side auras / heals, collisions), `battle.foesInRadius(x, y, r)` (the enemies an operator's area effect can select — no untargetable, no unblocked unrevealed 隐匿 enemy; PRTS 作战机制 §AOE伤害判定, §21.19), `battle.alliesInRadius(x, y, r, ownerId?)`, `battle.addLayers(playerId, bondId, n, reason)` (no-op when gains disabled; at most the room left under `BOND_LAYER_CAP` 999 — `shared/constants.js layerGainRoom`, §20.12; records into result), `battle.loseHp(target, amount, { source, from, sourceless })` (流失 — it skips the damage events: no 受击回复, TAKE_DAMAGE, shield or counter, `damage.js isHpLoss`; only for what the official calls 流失 — "N 真实伤害 per second" effects such as 源石溶剂 are `periodicDamage` damage, §21.12; a 物理流失 is first reduced by the target's DEF, 阿戈尔's devour, §21.19; `sourceless` = 无来源, `source` keeps the credit — leader parts pass damage on 1:1 with it, §20.10), `battle.addCoins(playerId, n)`, `battle.fx(kind, params)` (client VFX event), `battle.rng()` (never `Math.random`), `battle.getPlayer(playerId)` (bonds/band/effects view), `battle.redeploy(unit)` (on its rest tile: where a knocked-out operator lies, else its home; `battle.isReservedTile(r, c)` = a tile no automatic placement takes, `battle.downOn(r, c)` = the knocked-out operator lying there, whose tile no ally deploys or moves onto — §21.24), `battle.after(seconds, fn)` (scheduled callbacks), `battle.every(seconds, fn)`.
|
||||
Engine helpers (content must use these, never touch internals): `battle.dealDamage(source, target, dmgInfo)`, `battle.heal(source, target, amount, {overheal=false})`, `battle.applyStatus(target, key, { duration, source, value })`, `battle.addBuff(unit, buff)`, `battle.removeBuff(unit, key)`, `battle.spawnToken(ownerUnit|playerId, tokenId, row, col, opts)`, `battle.spawnEnemy(enemyKey, { routeIndex, pos, mods, tag })`, `battle.addProjectile({ from, to|target, speed, onHit, visual })`, `battle.push(e, force, { from, dir, fixed, fixedAngle, inward, effect })` / `battle.pull(e, force, { to, center, stop })` / `battle.pullToFront(e, unit, force)` / `battle.forceLevel(e, force)` / `battle.pushDistance(e, force, { effect })` (the official 力度 − 重量 tables, §20.3; a 静态刚体 — data `staticBody` — is never moved, §21.9; a push / pull then holds the enemy in its 失衡 state — no walking, normal attack or skill — for the PRTS 位移时间 / force window, 0.2.2, SIM.md §6; `battle.displace(e, dir, distance)` is the raw mover), `battle.allySelectable(a, by)` / `battle.alliesFor(by, ownerId)` (friendly selection, skipping 孤立 units, §20.3), `battle.unitsInGrid(unit, grid)`, `battle.enemiesInRadius(x, y, r)` (every enemy: enemy-side auras / heals, collisions), `battle.foesInRadius(x, y, r)` (the enemies an operator's area effect can select — no untargetable, no unblocked unrevealed 隐匿 enemy; PRTS 作战机制 §AOE伤害判定, §21.19), `battle.alliesInRadius(x, y, r, ownerId?)`, `battle.addLayers(playerId, bondId, n, reason)` (no-op when gains disabled; at most the room left under `BOND_LAYER_CAP` 999 — `shared/constants.js layerGainRoom`, §20.12; records into result), `battle.loseHp(target, amount, { source, from, sourceless })` (流失 — it skips the damage events: no 受击回复, TAKE_DAMAGE, shield or counter, `damage.js isHpLoss`; only for what the official calls 流失 — "N 真实伤害 per second" effects such as 源石溶剂 are `periodicDamage` damage, §21.12; a 物理流失 is first reduced by the target's DEF, 阿戈尔's devour, §21.19; `sourceless` = 无来源, `source` keeps the credit — leader parts pass damage on 1:1 with it, §20.10), `battle.addCoins(playerId, n)`, `battle.fx(kind, params)` (client VFX event), `battle.rng()` (never `Math.random`), `battle.getPlayer(playerId)` (bonds/band/effects view), `battle.redeploy(unit)` (on its rest tile: where a knocked-out operator lies, else its home; `battle.isReservedTile(r, c)` = a tile no automatic placement takes, `battle.downOn(r, c)` = the knocked-out operator lying there, whose tile no ally deploys or moves onto — §21.24), `battle.after(seconds, fn)` (scheduled callbacks), `battle.every(seconds, fn)`.
|
||||
|
||||
### 5.5 Combat rules (engine)
|
||||
|
||||
@@ -122,7 +122,7 @@ Engine helpers (content must use these, never touch internals): `battle.dealDama
|
||||
- **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 stunned or frozen enemy is checked too — 晕眩 / 冻结 hold no 不可阻挡 (PRTS 异常效果: the STUN / FROZEN state machines stop its moves and attacks) —, so an operator redeployed beside a held enemy blocks it where it stands and lifts its 隐匿; one held short of contact is blocked once it walks in after the status (GitHub #232; until 0.2.0 the check waited for the status to end). 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 — a 速射手's air priority (优先攻击空中单位) excepted, which comes before the enemy it blocks (the owner's decision of 2026-10-08, GitHub #220) — ("可以选择且优先选择阻挡单位", 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 not even by that one when its 索敌不受阻挡影响 (自制投石机, `profile.blockFree`: it selects as if unblocked, §25.18) —, 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); any enemy whose block ends after its strike (its blocker stunned by it, knocked out, retreated) stands for the rest of that clip too — PRTS 状态机: the enemy's COMBAT state ends with its attack — and a displacement ends a stand (0.2.0). 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).
|
||||
- **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 not even by that one when its 索敌不受阻挡影响 (自制投石机, `profile.blockFree`: it selects as if unblocked, §25.18) —, 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); any enemy whose block ends after its strike (its blocker stunned by it, knocked out, retreated) stands for the rest of that clip too — PRTS 状态机: the enemy's COMBAT state ends with its attack — and a displacement ends a stand (0.2.0) and holds the enemy in its 失衡 state (0.2.2: no walking, no attack started, no skill — PRTS 失衡位移机制). 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).
|
||||
- **Damage**: phys `max(A − max(0, D×(1−defIgnorePct) − defIgnoreFlat), 0.05·A)`; arts `max(A × (1 − R'/100), 0.05·A)` with `R' = max(0, R×(1−resIgnorePct) − resIgnoreFlat)`; true = A; 元素伤害 ('elemental') `max(A × (1 − 元素抗性/100), 0.05·A)`. Then × `dmgDealtMul` (source) × `dmgTakenMul` & type-specific taken multipliers (target) × `dmg.mul` — 元素伤害 takes 元素脆弱 (`elementalTakenMul`) alone, not `dmgTakenMul` (脆弱 = "受到的物理、法术、真实伤害提升"). Then **限伤**: on a leader (`isBoss` — the 10 bossInfoDict enemyIds and their mirrored copies; never parts, drones or escorts) in a `'boss'` / `'hidden'` battle a hit with `ceil(final) ≥ 300000` is cancelled — no HP or pool loss, no credit, no damage number, no `damaged` / kill (`shared/constants.js BOSS_HIT_LIMIT`, `damage.js leaderHitCancelled`, after every multiplier and the hit-step blocks, before HP shields; `loseHp` too — a part's 传递, but not 胄's drone link, a share of the pool that is no hit (`noHitLimit`, §25.13.4); the client's `MAX_BATTLE_DAMAGE`, §20.12). Then shields absorb; dodge checks for phys/arts. Element damage fills a gauge (1000; enemy leaders 2000) × `elemTakenMul` × max(0.05, 1 − 损伤抵抗/100), 损伤抵抗 = data `epResistance` (PRTS 元素; the 5 % floor of DMG_e, PRTS 游戏数据基础). An element fill on a target with no HP left is refused (damage.js `hasHp`: no burst on a corpse). A full gauge bursts with the side-specific official effects, as **无来源** damage (no damage-dealt multiplier or penetration of the unit that filled the gauge, which keeps the kill and the stats; §19.5) (sim/constants.js `ELEMENT`; operators: 灼燃 1200 arts + RES −20, 神经 stun 10 s then 1000 true, 凋亡 15 s of 阻回 (`noSp`: no SP gain of any kind) + 静默 with −1 SP/s and 100 arts/s, 侵蚀 DEF −100 then 800 phys; enemies: the "·我方" terms). Every burst starts a **爆发冷却** = its duration (灼燃 / 神经 / 侵蚀 10 s — enemies' 侵蚀 8 s — 凋亡 15 s) during which NO element of the unit fills or can be recovered; when it ends every gauge of the unit resets (§18.3).
|
||||
- **Leak**: an enemy reaching its goal is removed, counted as leaked for its field owner (`sourcePlayerId` for unite). LP accounting is done by the match, not the battle.
|
||||
- **Results**: `damageDealt` / a unit's `dmg` count only HP removed from the other side — a unit's own drain or 流失 and friendly damage are the target's `taken` only (§21.12).
|
||||
|
||||
+3
-1
@@ -540,7 +540,7 @@ export function updateEnemy(b, e, dt) {
|
||||
// 失衡 (UNBALANCE, battle/displacement.js _unbalance): a state machine, not a status — 浮空 ends it (PRTS 术语释义 浮空
|
||||
// 「触发浮空时清除受到的推/拉力…无法陷入失衡」); while it lasts the enemy neither walks nor starts a normal attack
|
||||
if (e.s.flags.levitate && e.unbalanceUntil > b.time) e.unbalanceUntil = -Infinity;
|
||||
const unbalanced = b.time < e.unbalanceUntil;
|
||||
const unbalanced = b.time < e.unbalanceUntil - 1e-9; // (the 1e-9: a float-summed end such as 35/30 s keeps its frame)
|
||||
const prevCd = e.atkCd;
|
||||
if (e.atkCd > 0 && !stunned && !e.hidden) e.atkCd = Math.max(0, e.atkCd - dt);
|
||||
// a stun / freeze / sleep / 浮空 / 失衡 — or leaving the field — takes the enemy out of its attack: a swing short of its
|
||||
@@ -663,6 +663,8 @@ function advanceRoute(b, e, dt, R, standing = false) {
|
||||
if (leg.t === 'appear') {
|
||||
e.x = leg.c; e.y = leg.r;
|
||||
b._setHidden(e, false);
|
||||
// a relocation is a forced state switch: it ends a 失衡 (PRTS 失衡位移机制 「被强制切换至其他状态机」)
|
||||
e.unbalanceUntil = -Infinity;
|
||||
R.legIdx++; R.pts = null;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ export class BattleDisplacement {
|
||||
* Returns the tiles moved.
|
||||
*/
|
||||
push(e, force, { from = null, dir = null, fixed = false, fixedAngle = false, inward = false, effect = false } = {}) {
|
||||
if (!this._displaceable(e)) { this._staticForce(e, force); return 0; }
|
||||
if (!this._displaceable(e)) { this._staticForce(e, force, false); return 0; }
|
||||
let level = this.forceLevel(e, force);
|
||||
const fx0 = fin(from?.x, e.x), fy0 = fin(from?.y, e.y);
|
||||
const vx = e.x - fx0, vy = e.y - fy0, d = hypot(vx, vy);
|
||||
@@ -89,9 +89,9 @@ export class BattleDisplacement {
|
||||
*/
|
||||
pull(e, force, { to, center = null, stop = PULL_STOP_RADIUS } = {}) {
|
||||
if (!to) return 0;
|
||||
if (!this._displaceable(e)) { this._staticForce(e, force); return 0; }
|
||||
// an enemy the puller itself blocks already stands in front of it (at contact) [ASSUMED: no pull, no unblocking]
|
||||
if (center && center.side === 'ally' && e.blockedBy === center) return 0;
|
||||
if (e && center && center.side === 'ally' && e.blockedBy === center) return 0;
|
||||
if (!this._displaceable(e)) { this._staticForce(e, force, true); return 0; }
|
||||
const level = this.forceLevel(e, force);
|
||||
// 失衡 for the force window, whatever the travel: the 急停 zeroes the movement, the state lasts to the window's end
|
||||
const hold = pullUnbalance(level);
|
||||
@@ -140,13 +140,16 @@ export class BattleDisplacement {
|
||||
}
|
||||
|
||||
/**
|
||||
* A push / pull of 力度 `force` on a 静态刚体 (data `staticBody`; not 失衡免疫 `noDisplace` — PRTS 特殊机制 静态刚体: unlike
|
||||
* 失衡免疫 it "可以进入失衡状态并启用物理,但物理层面上无法产生任何速度或移动", leaving it 「在失去施力后立刻」 with 「0.1 秒保底持续
|
||||
* 时间」): a force > 0 (受力等级 ≥ −2) gives the UNBALANCE_MIN state, no movement. Leaders (the boss pool) stay out.
|
||||
* A push (`pull` false) / pull of 力度 `force` on a 静态刚体 (data `staticBody`; not 失衡免疫 `noDisplace` — PRTS 特殊机制
|
||||
* 静态刚体: unlike 失衡免疫 it "可以进入失衡状态并启用物理,但物理层面上无法产生任何速度或移动", leaving it 「在失去施力后立刻」 with
|
||||
* 「0.1 秒保底持续时间」): no movement, the state as long as the force acts — a push's is instant (推与拉 「作用时间:瞬间」) so
|
||||
* the UNBALANCE_MIN floor, a pull's is its window (pullUnbalance: 1 s, 0.5 s below −1); a force > 0 (受力等级 ≥ −2) only.
|
||||
* Leaders (the boss pool) stay out.
|
||||
*/
|
||||
_staticForce(e, force) {
|
||||
_staticForce(e, force, pull = false) {
|
||||
if (!(e && e.alive && e.side === 'enemy' && !e.isBoss && !e.s.flags.noDisplace && e.def && e.def.staticBody)) return;
|
||||
if (this.forceLevel(e, force) >= -2) this._unbalance(e, UNBALANCE_MIN);
|
||||
const level = this.forceLevel(e, force);
|
||||
if (level >= -2) this._unbalance(e, pull ? Math.max(UNBALANCE_MIN, pullUnbalance(level)) : UNBALANCE_MIN);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -155,8 +158,9 @@ export class BattleDisplacement {
|
||||
* updateEnemy reads `unbalanceUntil`: the enemy neither walks (恐惧 / 诱导 included) nor starts a normal attack, a swing
|
||||
* short of its frame is cut; checks that ignore the state (水遁忍者's damage, content abilities) go on. The state machine
|
||||
* switch ends the attack clip it stood for (PRTS 状态机: the states are exclusive — UNBALANCE, then DEFAULT → MOVE). It
|
||||
* ends with its time, or at once with 浮空 (术语释义 浮空 「触发浮空时清除受到的推/拉力…无法陷入失衡」, ai.js) or a 重生.
|
||||
* No global skill lock: enemy abilities keep ticking (the 「使用技能」 part is not modelled — docs/SIM.md).
|
||||
* ends with its time, or at once with 浮空 (术语释义 浮空 「触发浮空时清除受到的推/拉力…无法陷入失衡」, ai.js), a 重生 or a route
|
||||
* APPEAR (forced state switches). No skill meanwhile either (失衡免疫 「…使用技能」): content skills, blinks and scripted moves
|
||||
* check `enemies/helpers.js unbalancedNow` (docs/SIM.md lists what deliberately keeps running).
|
||||
*/
|
||||
_unbalance(e, dur) {
|
||||
if (!(dur > 0) || !e || !e.alive) return;
|
||||
|
||||
@@ -136,7 +136,8 @@ export const PUSH_DIRECTIONAL_MIN_DIST = 0.25;
|
||||
* 27, 32, 35; the 0.1 s floor is inside them); PULL_UNBALANCE / PULL_UNBALANCE_WEAK = a pull's force window — 推与拉 §拉力
|
||||
* 「作用时间默认为 1 s;若本次受力等级 < −1,作用时间改为 0.5 s」, the state lasting to its end after the 急停 too (「目标将仍保持
|
||||
* 失衡状态至拉力作用时间结束为止」); UNBALANCE_MIN = the 失衡硬直 floor (「立刻拥有 0.1 s 的“失衡硬直”。此期间无法解除失衡状态机
|
||||
* ——哪怕已经没有被移动或者受力」) — what a 静态刚体 hit by a force gets (特殊机制 静态刚体 「失衡状态拥有 0.1 秒保底持续时间」).
|
||||
* ——哪怕已经没有被移动或者受力」) — what a 静态刚体 hit by a push gets (特殊机制 静态刚体 「失衡状态拥有 0.1 秒保底持续时间」; a pulled
|
||||
* one stays for the pull's window, its force lasting that long).
|
||||
* PR #392 by @xcdoge brought the state; its 0.6387·√tiles was derived from the page's μ = 0.5 单位假设, not printed.
|
||||
*/
|
||||
export const PUSH_UNBALANCE = Object.freeze({ '-2': 0.2, '-1': 0.4, 0: 0.8, 1: 0.9, 2: 32 / 30, 3: 35 / 30 });
|
||||
|
||||
@@ -73,7 +73,7 @@ import { compileRoute } from '../ai.js';
|
||||
import { normalizeRoute } from '../simdata.js';
|
||||
import {
|
||||
ensureInstalled, abOf, attach, T, elem, hurt, targetsNear, allTargets, byPriority, areaAllies, areaAlliesInTiles, fieldAllies,
|
||||
remainingRoute, stayRoute, stepToward, setHits, hitCount, lpLoss, blinkForward, canCast, absorbArts, nthOf,
|
||||
remainingRoute, stayRoute, stepToward, setHits, hitCount, lpLoss, blinkForward, canCast, unbalancedNow, absorbArts, nthOf,
|
||||
} from './enemies.js';
|
||||
import { hypot, powi } from '../detmath.js';
|
||||
|
||||
@@ -539,7 +539,7 @@ function kitBlade(ab, e, b, tpl) {
|
||||
if (P.state === 'dive' && e2.alive && ++P.hits >= (bb.max_hit_cnt ?? Infinity)) shotDown(b2, e2); // 仅1次
|
||||
},
|
||||
tick(b2, e2, a, dt) {
|
||||
if (P.state !== 'dive' || !canCast(e2)) return; // a stunned blade does not fly on
|
||||
if (P.state !== 'dive' || !canCast(e2, false, b2)) return; // a stunned blade does not fly on
|
||||
const t = P.target;
|
||||
if (!stepToward(e2, t.c, t.r, e2.s.moveSpeed * MOVE_SCALE * dt)) return;
|
||||
// arrival: 3×3 stun + DoT (无来源: credited to 胄, as the shell's), then the 初始模式 copy takes over
|
||||
@@ -593,7 +593,7 @@ function kitGun(ab, e, b) {
|
||||
dealt(c, b2, e2) { elem(b2, e2, c.target, 'erosion', e2.s.atk * (T(ab, '1.ep_damage_ratio') ?? 0)); }, // 攻击时附带侵蚀损伤
|
||||
tick(b2, e2, a, dt) {
|
||||
const ch = P.charge;
|
||||
if (!ch) return;
|
||||
if (!ch || unbalancedNow(b2, e2)) return; // (失衡: no scripted move meanwhile)
|
||||
const t = ch.target;
|
||||
const sp = (e2.s.moveSpeed + (T(ab, '3.move_speed') ?? 0)) * MOVE_SCALE * dt;
|
||||
const nx = e2.x, ny = e2.y;
|
||||
@@ -711,7 +711,7 @@ function kitSpring(ab, e) {
|
||||
tick(b, e2, a, dt) {
|
||||
if (!P.up && P.downAt != null && b.time - P.downAt >= regen) raise(b);
|
||||
const d = e2.mem.ab.dash;
|
||||
if (!d) return;
|
||||
if (!d || unbalancedNow(b, e2)) return; // (失衡: no scripted move meanwhile)
|
||||
// 追逐模式 lasts the whole gain (PRTS 末日布道 "令全场的“碎铳之簧”获得5秒增益…增益期间切换为追逐模式"; “碎铳之簧”
|
||||
// 追逐模式 "持续追踪令其进入该形态的场上的假想敌:铳移动" — no arrival clause, unlike the 铳's own 冲锋模式): reaching
|
||||
// the gun does not end it, the spring keeps following the gun until the 5 s are over (PR #347 by @CXUtk; until
|
||||
@@ -820,7 +820,7 @@ function pipeCore(ab, e, b, tpl, { form, prefix }) {
|
||||
tick(b2, e2, a, dt) {
|
||||
P.acc += dt;
|
||||
if (P.acc >= (e2.hpRatio < thr ? lo : hi)) { P.acc = 0; summon(b2, e2); }
|
||||
if (!canCast(e2, false)) return;
|
||||
if (!canCast(e2, false, b2)) return;
|
||||
P.atk += dt;
|
||||
if (P.atk < e2.s.interval) return;
|
||||
const t = b2.rng.pick(echoesOf(b2, form)); // 优先攻击…形态余音
|
||||
@@ -1052,7 +1052,7 @@ function kitLion(ab, e, b) {
|
||||
b2.addBuff(e2, { key: 'boss:advance', persist: true, visible: true, mods: { defPct: T(ab, 'advance.def') ?? 0, resFlat: T(ab, 'advance.magic_resistance') ?? 0 } });
|
||||
b2.fx('phase', { x: e2.x, y: e2.y, id: e2.id, kind: 'lionAdvance' });
|
||||
}
|
||||
if (!canCast(e2, false)) return;
|
||||
if (!canCast(e2, false, b2)) return;
|
||||
P.sp += dt * ENEMY_SP_PER_SEC;
|
||||
if (P.sp >= cost && decree(b2, e2)) P.sp = 0;
|
||||
// 【莫非王土】: ANIMATE_DELAY s after equipment first lies on the field, then once per 王权号令 cycle
|
||||
@@ -1100,7 +1100,7 @@ function kitDeer(ab, e) {
|
||||
b.addBuff(e2, { key: 'boss:madness', persist: true, visible: true, mods: { physTakenMul: 1 - dr, artsTakenMul: 1 - dr } }); // 物理和法术伤害降低
|
||||
b.fx('phase', { x: e2.x, y: e2.y, id: e2.id, kind: 'deerMadness' });
|
||||
}
|
||||
if (!canCast(e2, false)) return;
|
||||
if (!canCast(e2, false, b)) return;
|
||||
P.acc += dt;
|
||||
if (P.acc < e2.s.interval) return;
|
||||
const cands = fairOrder(b, e2, allTargets(b, e2), P);
|
||||
|
||||
@@ -119,7 +119,7 @@ import { LEADER_KITS } from './enemies/leaders.js';
|
||||
import { hypot } from '../detmath.js';
|
||||
|
||||
export {
|
||||
EROSION, EROSION_BURST, HUSK_REBIRTH, nthOf, abOf, attach, T, silenced, canCast, elem, hurt, alliesInTiles,
|
||||
EROSION, EROSION_BURST, HUSK_REBIRTH, nthOf, abOf, attach, T, silenced, canCast, unbalancedNow, elem, hurt, alliesInTiles,
|
||||
targetsNear, allTargets, areaAllies, areaAlliesInTiles, fieldAllies, auraAllies, targetAndArea, byPriority, zone,
|
||||
remainingRoute, stayRoute, spawnChildren, stepToward, setHits, hitCount, isHitCount, setForm, lpLoss, expose,
|
||||
expectedFinal, absorbArts,
|
||||
@@ -260,7 +260,7 @@ function onTick(b, dt) {
|
||||
}
|
||||
if (a.fire && a.cd != null) {
|
||||
a.left -= dt;
|
||||
if (a.left <= 1e-9 && canCast(e, a.sil) && (!a.cond || safe(b, e, () => a.cond(b, e, a)))) {
|
||||
if (a.left <= 1e-9 && canCast(e, a.sil, b) && (!a.cond || safe(b, e, () => a.cond(b, e, a)))) {
|
||||
a.left = Math.max(TICK, a.cd);
|
||||
a.casts = (a.casts ?? 0) + 1;
|
||||
e.skillAnimUntil = b.time + 0.5;
|
||||
|
||||
@@ -7,6 +7,7 @@ import { MOVE_SCALE, COLS, STEALTH_RESTORE } from '../../constants.js';
|
||||
import {
|
||||
HUSK_REBIRTH, BOOM_RADIUS, POLLUTION_INTERVAL, STEALTH_RESTORE_BY_KEY, DUCK_STEALTH_RESTORE, nthOf, stOf, safe, num, T, elem, hurt,
|
||||
areaAllies, areaAlliesInTiles, zone, spawnChildren, stepToward, setHits, hitCount, setForm, absorbArts, auraBuff,
|
||||
unbalancedNow,
|
||||
} from './helpers.js';
|
||||
import { hypot } from '../../detmath.js';
|
||||
|
||||
@@ -478,6 +479,7 @@ function husk({ hits, delay, stealthy = true, unblock = false, onHusk = null, ke
|
||||
if (a.state === 'husk' || !(hits > 0) || !(delay > 0)) return false; // the husk's knock-out is the real death
|
||||
a.state = 'husk';
|
||||
a.rebornUntil = b.time + HUSK_REBIRTH;
|
||||
e.unbalanceUntil = -Infinity; // a 重生 is a forced state change: it ends a 失衡 (PRTS 失衡位移机制 「例如复活」)
|
||||
a.noAtk = e.profile.noAttack;
|
||||
a.max = a.max ?? e.base.maxHp;
|
||||
rebirthCleanse(b, e);
|
||||
@@ -602,6 +604,7 @@ const skill = (s, fire, { cond = null, sil = false, cd = null, icd = null, id =
|
||||
|
||||
/** Blink past the blocker along the path (弑君者 / 卢西恩). Returns the start position. */
|
||||
export function blinkForward(b, e, dist) {
|
||||
if (unbalancedNow(b, e)) return null; // 失衡: 「无法…使用技能」 — no blink meanwhile
|
||||
const from = { x: e.x, y: e.y };
|
||||
const R = e.route;
|
||||
let left = dist;
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
import { TICK, MOVE_SCALE, PROJECTILE_SPEEDS, ALLY_COLLIDER_RADIUS } from '../../constants.js';
|
||||
import {
|
||||
num, T, hurt, targetsNear, allTargets, areaAllies, areaAlliesInTiles, fieldAllies, byPriority, spawnChildren,
|
||||
stepToward, setForm, expose,
|
||||
stepToward, setForm, expose, unbalancedNow,
|
||||
} from './helpers.js';
|
||||
import { enemyAura, allyAura, selfFear, skill, kitSelfFear } from './archetypes.js';
|
||||
import { hypot } from '../../detmath.js';
|
||||
@@ -258,6 +258,7 @@ export const FLY_KITS = Object.freeze({
|
||||
spawn(b, e) { e.profile.noAttack = true; },
|
||||
tick(b, e, a, dt) {
|
||||
if (a.t && !a.t.alive) { a.t = null; b.removeBuff(e, 'ab:dive'); }
|
||||
if (unbalancedNow(b, e)) return; // 失衡: no dive, no blast meanwhile
|
||||
if (!a.t) {
|
||||
const l = targetsNear(b, e, e.base.rangeRadius || 1).sort((p, q) => hypot(p.x - e.x, p.y - e.y) - hypot(q.x - e.x, q.y - e.y));
|
||||
if (!l.length) return;
|
||||
|
||||
@@ -132,7 +132,15 @@ export function T(ab, ...keys) { for (const k of keys) { const v = ab.t[k]; if (
|
||||
|
||||
export function silenced(e) { return !!e.s.flags.silence; }
|
||||
|
||||
export function canCast(e, sil) { return e.alive && !e.hidden && !e.s.flags.stun && !(sil && e.s.flags.silence); }
|
||||
/**
|
||||
* Is enemy `e` in its 失衡 (UNBALANCE) state now (battle/displacement.js _unbalance; the 1e-9 keeps a float-summed
|
||||
* end — 35/30 s — on its frame)? PRTS 异常效果图鉴/失衡免疫: 「失衡期间无法自主移动、发动攻击、使用技能」 — content skills
|
||||
* (canCast), blinks and scripted moves wait for its end.
|
||||
*/
|
||||
export function unbalancedNow(b, e) { return !!(b && e && b.time < e.unbalanceUntil - 1e-9); }
|
||||
|
||||
/** Can enemy `e` use a skill now: alive, on the field, not stunned, not silenced (`sil`), not in its 失衡 state (`b` given). */
|
||||
export function canCast(e, sil, b = null) { return e.alive && !e.hidden && !e.s.flags.stun && !(sil && e.s.flags.silence) && !unbalancedNow(b, e); }
|
||||
|
||||
// ---------------------------------------------------------------------------------------------------------------
|
||||
// helpers (exported for bosses.js)
|
||||
|
||||
@@ -6,7 +6,7 @@ import { aggroCmp, areaSelectable } from '../../targeting.js';
|
||||
import { periodicDamage } from '../../damage.js';
|
||||
import {
|
||||
nthOf, T, hurt, alliesInTiles, targetsNear, allTargets, areaAllies, areaAlliesInTiles, auraAllies, targetAndArea,
|
||||
byPriority, setForm, auraBuff, watchDeaths,
|
||||
byPriority, setForm, auraBuff, watchDeaths, unbalancedNow,
|
||||
} from './helpers.js';
|
||||
import {
|
||||
unblockable, maxTargets, onHitStatus, splashAttack, pathKeysAhead, noAirTargets, resist, nthAttackStatus, lowHpBuff,
|
||||
@@ -60,8 +60,6 @@ const XI_CROSS_REACH = 2;
|
||||
* Until 0.1.3: 2.5 / 2.5 / −30, the aura only during the 重生 [ASSUMED]. */
|
||||
const WOLF_RANGE = 1.25, WOLF_AWE_RADIUS = 1.5, WOLF_AWE_ASPD = -50;
|
||||
|
||||
/** 失衡 movement speed that turns 弧光锋卫's per-interval bleed into HP per tile moved [ASSUMED]. */
|
||||
const UNBALANCE_SPEED = 5;
|
||||
|
||||
/** 乌顶巨角卢鲁 【角力对决】: the operator cannot be pushed (fixed tiles) ⇒ "更多伤害" multiplier [ASSUMED]. */
|
||||
const ELK_FAIL_SCALE = 2;
|
||||
@@ -722,7 +720,7 @@ function kitElk(ab) {
|
||||
const ch = P.ch;
|
||||
if (!ch) return;
|
||||
if (e.s.flags.stun || !ch.t.alive || e.blockedBy !== ch.t) { stop(b, e); b.fx('phase', { x: e.x, y: e.y, id: e.id, kind: 'chargeBroken' }); return; }
|
||||
if (b.time + 1e-9 < ch.until) return;
|
||||
if (b.time + 1e-9 < ch.until || unbalancedNow(b, e)) return; // a 失衡 that did not move it holds the clash (no skill meanwhile)
|
||||
stop(b, e);
|
||||
b.fx('explode', { x: ch.t.x, y: ch.t.y, r: 0.5, kind: 'elkClash' });
|
||||
hurt(b, e, ch.t, e.s.atk * ((s && s.bb.atk_scale_s) ?? 1) * ELK_FAIL_SCALE, 'phys');
|
||||
@@ -773,12 +771,23 @@ export const LEADER_KITS = Object.freeze({
|
||||
enemy_2085_skzjxd: (ab) => [unblockable(), frontGuard(T(ab, 'Weakness.damage_resistance') ?? 0, faceCrowd)],
|
||||
enemy_2085_skzjxd_2: (ab) => [unblockable(), frontGuard(T(ab, 'Weakness.damage_resistance') ?? 0, faceCrowd)], // (鸭爵 strategy) same
|
||||
// 失衡 (pushed / pulled by operators)
|
||||
enemy_1328_cbjedi: (ab) => [unbalanced((b, e, a, d) => { // 弧光锋卫 · takes damage in proportion to the distance moved while unbalanced
|
||||
// PRTS 修正 "失衡移动时持续受到真实伤害", "处于失衡状态时,每0.066s受到400点无来源真实持续伤害" (伤害分类: 弧光锋卫失衡状态下的自残
|
||||
// 伤害 is BUFF damage): damage, not a 流失 (player report D1 audit)
|
||||
const v = T(ab, 'unbalanced_bleed.damage') ?? 0, iv = T(ab, 'unbalanced_bleed.interval') ?? 1;
|
||||
if (v > 0 && iv > 0) b.dealDamage(null, e, { ...periodicDamage((v * d) / (iv * UNBALANCE_SPEED)), tags: ['dot', 'periodic', 'unbalanced'] });
|
||||
})],
|
||||
enemy_1328_cbjedi: (ab) => { // 弧光锋卫 · bleeds while in its 失衡 state
|
||||
// PRTS 修正 "失衡移动时持续受到真实伤害", 天赋 "处于失衡状态时,每0.066s受到400点无来源真实持续伤害" (data unbalanced_bleed.damage /
|
||||
// .interval; 伤害分类: 弧光锋卫失衡状态下的自残伤害 is BUFF damage): damage, not a 流失 (player report D1 audit) — every `interval`
|
||||
// s for as long as the state lasts (battle/displacement.js _unbalance: a push's 位移时间, a pull's force window even
|
||||
// after the 急停 or with no movement). Until 0.2.2 one hit in proportion to the tiles moved [ASSUMED], from the position jump.
|
||||
const v = T(ab, 'unbalanced_bleed.damage') ?? 0, iv = T(ab, 'unbalanced_bleed.interval') ?? 0;
|
||||
return [{
|
||||
tick(b, e, a, dt) {
|
||||
if (!(v > 0 && iv > 0) || !unbalancedNow(b, e)) { a.bleed = 0; return; }
|
||||
a.bleed = (a.bleed ?? 0) + dt;
|
||||
while (a.bleed >= iv - 1e-9 && e.alive) {
|
||||
a.bleed -= iv;
|
||||
b.dealDamage(null, e, { ...periodicDamage(v), tags: ['dot', 'periodic', 'unbalanced'] });
|
||||
}
|
||||
},
|
||||
}];
|
||||
},
|
||||
enemy_10112_ymgds: (ab) => [unbalanced((b, e) => { // 冒失的小弟 · stunned after being unbalanced
|
||||
const st = T(ab, 'StunAfterUnbalance.stun') ?? 0;
|
||||
if (st > 0) b.applyStatus(e, 'stun', { duration: st, source: null });
|
||||
|
||||
@@ -2068,7 +2068,7 @@ test(`${nm('enemy_10098_crhro')}: 重生 once after ${tb('enemy_10098_crhro', 'r
|
||||
assert.ok(!e.alive);
|
||||
});
|
||||
|
||||
test('失衡: 弧光锋卫 bleeds per tile pushed; 冒失的小弟 is stunned; 拥霜羽兽 drops its egg (faster, unblockable)', () => {
|
||||
test('失衡: 弧光锋卫 bleeds every 0.066 s while unbalanced; 冒失的小弟 is stunned; 拥霜羽兽 drops its egg (faster, unblockable)', () => {
|
||||
const h = arena({ hooks: ['statusApplied'] });
|
||||
h.step();
|
||||
const j = put(h, 'enemy_1328_cbjedi', [10, 7]);
|
||||
@@ -2076,17 +2076,20 @@ test('失衡: 弧光锋卫 bleeds per tile pushed; 冒失的小弟 is stunned;
|
||||
const p = put(h, 'enemy_10141_xdpeng_2', [12, 7]);
|
||||
h.step(2);
|
||||
const hp0 = j.hp;
|
||||
const moved = h.b.displace(j, { x: 1, y: 0 }, 1, { force: 3 });
|
||||
// 弧光锋卫: its 失衡 state — a 受力等级 0 push holds 0.8 s (24 frames) — bleeds unbalanced_bleed.damage every .interval s
|
||||
// (PRTS "处于失衡状态时,每0.066s受到400点无来源真实持续伤害"): 12 hits; until 0.2.2 one hit per tile moved [ASSUMED]
|
||||
h.b.push(j, j.s.massLevel, { from: { x: j.x - 1, y: j.y } });
|
||||
h.b.displace(g, { x: 1, y: 0 }, 1, { force: 3 });
|
||||
h.b.displace(p, { x: 1, y: 0 }, 1, { force: 3 });
|
||||
h.step();
|
||||
approx(hp0 - j.hp, (tb('enemy_1328_cbjedi', 'unbalanced_bleed.damage') * moved) / (tb('enemy_1328_cbjedi', 'unbalanced_bleed.interval') * 5), 0.05);
|
||||
assert.equal(statuses(h, g.id, 'stun').length, 1);
|
||||
approx(statuses(h, g.id, 'stun')[0].duration, tb('enemy_10112_ymgds', 'StunAfterUnbalance.stun'));
|
||||
assert.ok(p.s.flags.unblockable);
|
||||
assert.equal(p.findBuff('ab:noEgg').mods.moveMul, 1 + tb('enemy_10141_xdpeng_2', 'speed.move_speed'));
|
||||
assert.ok(p.profile.noAttack, '拥霜羽兽 失去蛋的模式: 不进行普通攻击 (no attack, so no stand for its clip)');
|
||||
assert.equal(typeof p.profile.canTarget === 'function' && p.profile.canTarget({ isFlying: true }), false, '拥霜羽兽: 不会攻击飞行单位');
|
||||
h.run(0.8);
|
||||
approx(hp0 - j.hp, 12 * tb('enemy_1328_cbjedi', 'unbalanced_bleed.damage'), 1e-6);
|
||||
// 雪孩子: pushed into high ground (row 12 col 2 is 'h' on the flat stage) ⇒ hitWall.value
|
||||
const sn = put(h, 'enemy_10138_xdsnow', [10, 3]);
|
||||
const sn2 = put(h, 'enemy_10138_xdsnow', [11, 6]);
|
||||
|
||||
@@ -450,8 +450,8 @@ test('enemy-side BUFF damage (PRTS 伤害分类 "深水区/涨潮水蚀", "弧
|
||||
const j = h.spawn('enemy_1328_cbjedi', { pos: [10, 7], routeIndex: 0, mods: { speedMul: 0 } });
|
||||
h.step(2);
|
||||
const hp0 = j.hp;
|
||||
h.b.displace(j, { x: 1, y: 0 }, 1, { force: 3 });
|
||||
h.step();
|
||||
h.b.push(j, 3, { from: { x: j.x - 1, y: j.y } }); // its 失衡 state (the bleed runs while it lasts)
|
||||
h.run(0.2);
|
||||
const bleed = h.hooksOf('damaged').filter((c) => c.target === j);
|
||||
assert.ok(bleed.length >= 1 && hp0 > j.hp, 'bled');
|
||||
for (const c of bleed) { assert.equal(c.source, null); assert.equal(c.type, 'true'); assert.ok(!hpLoss(c), '失衡 bleed is damage'); }
|
||||
|
||||
+36
-36
@@ -93,8 +93,8 @@
|
||||
"round": 5,
|
||||
"seed": 4108057433,
|
||||
"waveId": "act1autochess_05",
|
||||
"time": 60.27,
|
||||
"ticks": 1808,
|
||||
"time": 53,
|
||||
"ticks": 1590,
|
||||
"reason": "cleared",
|
||||
"killed": 21,
|
||||
"total": 21,
|
||||
@@ -102,24 +102,24 @@
|
||||
"bossHpLeft": null,
|
||||
"rngDraws": 29,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {"p1":{"killed":21,"total":21,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":72522,"bossDmg":0,"heal":0,"deaths":0,"layerGains":{}}},
|
||||
"players": {"p1":{"killed":21,"total":21,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":68325,"bossDmg":0,"heal":0,"deaths":0,"layerGains":{}}},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_3_12_a",2,null,103.12,1,3,1,14295,2231,0,32,1],
|
||||
["p1",1,"op","chess_char_3_12_a",2,null,1134.53,1,3,3,12656,1199,0,26,1],
|
||||
["p1",2,"op","chess_char_1_06_a",1,null,1137,1,4,2,2896,0,0,13,1],
|
||||
["p1",3,"op","chess_char_1_13_a",1,null,913,1,6,3,2746,0,0,12,1],
|
||||
["p1",4,"op","chess_char_3_08_a",1,null,1594,1,8,1,6742,0,0,10,1],
|
||||
["p1",5,"op","chess_char_3_09_a",1,null,1267,1,9,1,13794,0,0,27,1],
|
||||
["p1",6,"op","chess_char_3_10_a",1,null,1650,1,10,0,7040,0,0,8,1],
|
||||
["p1",7,"op","chess_char_3_11_a",1,null,1316,1,5,12,20370,0,0,24,3],
|
||||
["p1",7,"op","chess_char_3_11_a",1,null,1316,1,5,10,17813,0,0,20,3],
|
||||
["p1",8,"op","chess_char_3_13_a",1,null,1064,1,7,1,4639,0,0,29,6],
|
||||
["-","~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]
|
||||
],
|
||||
"enemies": {"enemy_1249_lysdb_2":[5,5,0,243,27000],"enemy_1251_lysyta":[15,15,0,48,37125],"enemy_1328_cbjedi":[1,1,0,1940,9000]},
|
||||
"hooks": [1,31,1808,176,176,224,219,0,21,21,15,15,0,9752,12,11,21,0,1,21,0,0,0],
|
||||
"events": {"atk":194,"deploy":8,"die":21,"dmg":219,"engage":8,"fx":38,"skill":30,"spawn":31,"status":20},
|
||||
"enemies": {"enemy_1249_lysdb_2":[5,5,0,205,27000],"enemy_1251_lysyta":[15,15,0,24,37125],"enemy_1328_cbjedi":[1,1,0,970,9000]},
|
||||
"hooks": [1,31,1590,160,160,214,209,0,21,21,15,14,0,8522,11,11,21,0,1,21,0,0,0],
|
||||
"events": {"atk":178,"deploy":8,"die":21,"dmg":209,"engage":8,"fx":38,"skill":29,"spawn":31,"status":19},
|
||||
"fx": {"aoe":1,"displace":12,"pull":12,"shieldBreak":5,"strike":3,"taunt":1,"volley":3,"zone":1},
|
||||
"snaps": "c6b020b2 1c788562 9da6272d cd36ff9d d5b5678d 63be814b"
|
||||
"snaps": "c6b020b2 1c788562 9da6272d d0f3ec29 4ca17634 09b68c9c"
|
||||
},
|
||||
"bond-deputShip-high": {
|
||||
"about": "助力 high: tier 2 layers 999; chess_char_4_11_b chess_char_1_06_b chess_char_1_13_b chess_char_2_14_b chess_char_1_06_a chess_char_1_13_a chess_char_4_10_b chess_char_4_12_b token_10041_cathy_catsld token_10041_cathy_catsld",
|
||||
@@ -144,8 +144,8 @@
|
||||
["p1",1,"op","chess_char_4_11_b",1,"uniequip_002_cathy",2644,1,5,0,0,0,0,0,0],
|
||||
["p1",2,"op","chess_char_1_06_b",1,"uniequip_002_vendla",1402,1,7,2,41957,5880,6023,40,3],
|
||||
["p1",3,"op","chess_char_1_13_b",1,"uniequip_002_podego",815.5,1,9,0,36527,0,0,34,5],
|
||||
["p1",4,"op","chess_char_2_14_b",1,"uniequip_002_flower",1544,1,10,0,0,0,435,19,1],
|
||||
["p1",5,"op","chess_char_1_06_a",1,null,1137,1,11,2,22568,1537,1023,40,1],
|
||||
["p1",4,"op","chess_char_2_14_b",1,"uniequip_002_flower",1544,1,10,0,0,0,448,19,1],
|
||||
["p1",5,"op","chess_char_1_06_a",1,null,1137,1,11,2,22568,1537,1010,40,1],
|
||||
["p1",6,"op","chess_char_1_13_a",1,null,913,1,4,0,0,0,0,0,0],
|
||||
["p1",7,"op","chess_char_4_10_b",1,"uniequip_002_aroma",1664,1,8,1,11499,64,0,8,2],
|
||||
["p1",8,"op","chess_char_4_12_b",2,"uniequip_002_glady",2232,1,6,2,17222,31,31,9,1],
|
||||
@@ -156,10 +156,10 @@
|
||||
["-","~3","device","trap_1105_accrate",null,null,100,1,3,0,0,0,0,0,null]
|
||||
],
|
||||
"enemies": {"enemy_1005_yokai_2":[4,4,0,85,5357],"enemy_1005_yokai_3":[2,2,0,862,69120],"enemy_9009_acfort":[2,2,0,685,55296]},
|
||||
"hooks": [1,21,2964,212,212,351,351,1970,8,8,13,11,0,11247,107,0,8,0,1,7,0,0,0],
|
||||
"hooks": [1,21,2964,212,212,351,351,1963,8,8,13,11,0,11247,107,0,8,0,1,7,0,0,0],
|
||||
"events": {"atk":212,"deploy":10,"die":8,"dmg":351,"engage":5,"fx":36,"heal":82,"skill":24,"spawn":21,"status":80},
|
||||
"fx": {"beam":2,"counter":16,"pull":1,"slippery":2,"taunt":4,"tornado":1,"tornadoPulse":5,"zone":5},
|
||||
"snaps": "574ee580 09a0f1f4 bfc664da e9ec3f0c 3b21cd95 a6acc441 61c2f36b 303868a6 ffd954e0 97cea3c3"
|
||||
"snaps": "574ee580 09a0f1f4 bfc664da e9ec3f0c 3b21cd95 a6acc441 614de77c 4ac709f7 4f380796 4158a688"
|
||||
},
|
||||
"bond-egirShip-low": {
|
||||
"about": "阿戈尔 low: tier 1 layers 1; chess_char_1_04_a chess_char_3_16_a chess_char_2_07_a chess_char_3_18_a chess_char_3_05_a chess_char_3_14_a chess_char_3_17_a chess_char_3_19_a token_10028_vigil_wolf",
|
||||
@@ -524,7 +524,7 @@
|
||||
"hooks": [1,27,2080,221,221,421,421,1602,18,18,8,7,0,7504,13,16,16,0,1,18,1,0,0],
|
||||
"events": {"atk":245,"deploy":8,"die":18,"dmg":413,"engage":5,"fx":57,"heal":48,"layer":1,"skill":15,"spawn":27,"status":50},
|
||||
"fx": {"displace":14,"garrison":1,"healField":1,"liberate":3,"phase":2,"redistribute":15,"reweave":1,"sandChains":2,"shield":1,"slash":16,"truesilver":1},
|
||||
"snaps": "657d1bd5 dd4a6c63 5e39c4b6 9485b163 f601c36f 7699a7ce 5912c331"
|
||||
"snaps": "657d1bd5 dd4a6c63 ae660140 73869bd4 7e2f65ec f09d259d d3913f6a"
|
||||
},
|
||||
"bond-kazimierzShip-high": {
|
||||
"about": "卡西米尔 high: tier 2 layers 999; chess_char_2_18_b chess_char_3_12_b chess_char_5_08_b chess_char_4_19_b chess_char_1_19_b chess_char_2_12_b chess_char_3_17_b chess_char_5_10_b",
|
||||
@@ -867,7 +867,7 @@
|
||||
"hooks": [1,31,4881,472,472,793,805,0,20,21,32,30,8,10728,75,7,18,0,1,21,3,3,0],
|
||||
"events": {"atk":507,"deploy":11,"die":21,"dmg":796,"engage":9,"fx":157,"layer":3,"skill":62,"spawn":29,"status":159},
|
||||
"fx": {"aoe":9,"buff":1,"burst":3,"charge":13,"counter":8,"crit":57,"displace":28,"garrison":3,"quadShot":2,"ripple":9,"sentry":1,"sermon":1,"shadowWeave":11,"shield":1,"soul":3,"stealth":4,"substitute":1,"summon":1,"swap":1},
|
||||
"snaps": "05658c81 b2907752 ead04df4 478efd02 d1141f15 996c1ea1 2b4a83db a04411b6 a5761ef5 325d24d8 bbf423e9 8aca2f53 c0a962a9 74308e41 8047910b 5c77ad28 de91902b"
|
||||
"snaps": "05658c81 4864ae17 7f92bb0e 8f4e6718 c5c1091f 2ed43fcb e18779d5 88082474 8caa6667 3aedbf02 6fa3510b e7f2e4e1 979eef93 8ee3417b 1951310d aad88122 9f9294a9"
|
||||
},
|
||||
"bond-preciShip-low": {
|
||||
"about": "精准 low: tier 1 layers 1; chess_char_4_11_a chess_char_4_04_a chess_char_4_07_a chess_char_4_09_a chess_char_1_09_a chess_char_1_17_a chess_char_4_10_a chess_char_4_12_a token_10041_cathy_catsld token_10041_cathy_catsld",
|
||||
@@ -1224,7 +1224,7 @@
|
||||
"hooks": [1,30,1565,155,155,221,221,0,19,19,8,7,0,7825,39,3,19,0,1,19,0,0,0],
|
||||
"events": {"atk":206,"deploy":8,"die":19,"dmg":221,"engage":8,"fx":47,"skill":15,"spawn":30,"status":66},
|
||||
"fx": {"aoe":1,"displace":20,"pull":20,"sleep":2,"strike":2,"volley":2},
|
||||
"snaps": "3fec6d69 cbf41b37 0dc808f0 23d91444 2db20031 1441efbb"
|
||||
"snaps": "3fec6d69 cbf41b37 0dc808f0 382f9e64 ce63ae51 e497f05b"
|
||||
},
|
||||
"bond-skillfulShip-high": {
|
||||
"about": "灵巧 high: tier 1 layers 999; chess_char_5_08_b chess_char_5_05_b chess_char_5_07_b chess_char_1_14_b chess_char_2_04_b chess_char_5_02_b chess_char_5_03_b chess_char_5_10_b",
|
||||
@@ -1296,10 +1296,10 @@
|
||||
["-","~2","device","trap_1105_accrate",null,null,100,1,2,0,0,0,0,0,null]
|
||||
],
|
||||
"enemies": {"enemy_1116_liprr":[11,11,0,41,69696],"enemy_1116_liprr_2":[4,4,0,643,34560],"enemy_1118_lidbox_2":[2,2,0,5918,21888]},
|
||||
"hooks": [1,28,1674,167,167,291,291,0,19,19,7,5,4,7074,32,20,17,0,1,24,2,0,0],
|
||||
"hooks": [1,28,1674,167,167,291,291,0,19,19,7,5,4,7074,32,19,17,0,1,24,2,0,0],
|
||||
"events": {"atk":210,"deploy":9,"die":19,"dmg":289,"engage":8,"fx":47,"layer":2,"skill":12,"spawn":28,"status":97},
|
||||
"fx": {"aoe":1,"camouflage":1,"counter":4,"displace":19,"dp":3,"garrison":2,"liberate":2,"phase":4,"ripple":6,"sermon":1,"shield":3,"wolfShadow":1},
|
||||
"snaps": "0b626ccd 4c5c3338 6be5bea8 7eb547a7 b7dca0f5 333a3221"
|
||||
"snaps": "0b626ccd 4c5c3338 6be5bea8 7eb547a7 584fb208 f9dc0314"
|
||||
},
|
||||
"bond-soloShip-high": {
|
||||
"about": "独行 high: tier 1 layers 999; chess_char_5_19_b chess_char_1_08_b chess_char_5_13_b chess_char_5_14_b chess_char_5_17_b chess_char_5_12_b chess_char_5_15_b chess_char_5_20_b",
|
||||
@@ -1421,7 +1421,7 @@
|
||||
"hooks": [1,40,3108,217,228,341,354,47,30,30,53,50,0,13734,46,4,30,0,1,30,0,2,0],
|
||||
"events": {"atk":257,"deploy":8,"die":30,"dmg":354,"engage":3,"fx":150,"heal":47,"skill":103,"spawn":40,"status":107},
|
||||
"fx": {"aoe":8,"burst":2,"counter":6,"displace":30,"heal":32,"iceSpike":32,"ripple":15,"shadowWeave":19,"soul":2,"stealth":4},
|
||||
"snaps": "900e366c 4c623662 9b24da57 88686361 3743dd96 16bcbb0a ceae7cfe 4efae7da c9a75cab bfea9ee9 664303d4"
|
||||
"snaps": "900e366c 297e912f 3e7a566e 2b969380 1120bc1b 1cde9dd3 6d76deff d726fb6b 28affdda 6e3e3d18 b02d8661"
|
||||
},
|
||||
"bond-suntShip-low": {
|
||||
"about": "绝技 low: tier 1 layers 1; chess_char_1_02_b chess_char_4_17_a chess_char_4_18_a chess_char_4_16_a chess_char_1_01_b chess_char_4_12_a chess_char_4_13_a chess_char_4_14_a",
|
||||
@@ -1505,8 +1505,8 @@
|
||||
"round": 5,
|
||||
"seed": 2212044350,
|
||||
"waveId": "act1autochess_05",
|
||||
"time": 45.9,
|
||||
"ticks": 1377,
|
||||
"time": 43.5,
|
||||
"ticks": 1305,
|
||||
"reason": "cleared",
|
||||
"killed": 21,
|
||||
"total": 21,
|
||||
@@ -1514,22 +1514,22 @@
|
||||
"bossHpLeft": null,
|
||||
"rngDraws": 9,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {"p1":{"killed":21,"total":21,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":68408,"bossDmg":0,"heal":0,"deaths":0,"layerGains":{"miraShip":1}}},
|
||||
"players": {"p1":{"killed":21,"total":21,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":65805,"bossDmg":0,"heal":0,"deaths":0,"layerGains":{"miraShip":1}}},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_4_23_a",2,null,3075.82,1,2,0,0,0,0,0,0],
|
||||
["p1",2,"op","chess_char_4_22_a",2,null,2918.82,1,4,5,9800,0,0,15,1],
|
||||
["p1",3,"op","chess_char_1_19_a",1,null,2378.82,1,6,1,4770,0,0,13,1],
|
||||
["p1",1,"op","chess_char_4_23_a",2,null,2179,1,2,0,0,0,0,0,0],
|
||||
["p1",2,"op","chess_char_4_22_a",2,null,2022,1,4,5,6319,0,0,13,1],
|
||||
["p1",3,"op","chess_char_1_19_a",1,null,1482,1,6,1,4770,0,0,13,1],
|
||||
["p1",4,"op","chess_char_1_01_a",1,null,1123,1,7,3,14007,0,0,25,1],
|
||||
["p1",5,"op","chess_char_4_24_a",1,null,1726,1,8,3,16645,0,0,17,1],
|
||||
["p1",6,"op","chess_char_4_25_a",2,null,1379.73,1,1,0,0,0,0,0,1],
|
||||
["p1",7,"op","chess_char_4_26_a",0,null,2264.82,1,3,0,0,0,0,0,0],
|
||||
["p1",8,"op","chess_char_3_01_a",2,null,2408.76,1,5,9,23188,0,0,43,1]
|
||||
["p1",6,"op","chess_char_4_25_a",2,null,1379.73,1,1,0,0,0,0,0,0],
|
||||
["p1",7,"op","chess_char_4_26_a",0,null,1368,1,3,0,0,0,0,0,0],
|
||||
["p1",8,"op","chess_char_3_01_a",2,null,1511.94,1,5,9,24065,0,0,40,1]
|
||||
],
|
||||
"enemies": {"enemy_1249_lysdb_2":[5,5,0,0,27000],"enemy_1251_lysyta":[15,15,0,0,37125],"enemy_1328_cbjedi":[1,1,0,0,9000]},
|
||||
"hooks": [1,29,1377,113,113,267,262,1,21,21,6,3,14,5930,35,0,21,0,1,21,1,0,0],
|
||||
"events": {"atk":137,"deploy":8,"die":21,"dmg":262,"engage":5,"fx":51,"layer":1,"skill":9,"spawn":29,"status":99},
|
||||
"fx": {"buff":1,"displace":12,"garrison":1,"garrisonGrant":1,"mote":16,"reweave":1,"sandChains":1,"shieldBreak":5,"slash":5,"sp":1,"spGift":6,"truesilver":1},
|
||||
"snaps": "b42f9eae 30c763c9 93204068 0638457f 44034563"
|
||||
"hooks": [1,29,1305,108,108,267,262,1,21,21,5,3,14,5668,35,0,21,0,1,21,1,0,0],
|
||||
"events": {"atk":130,"deploy":8,"die":21,"dmg":262,"engage":5,"fx":48,"layer":1,"skill":8,"spawn":29,"status":94},
|
||||
"fx": {"buff":1,"displace":12,"garrison":1,"garrisonGrant":1,"mote":16,"sandChains":1,"shieldBreak":5,"slash":3,"sp":1,"spGift":6,"truesilver":1},
|
||||
"snaps": "b42f9eae 30c763c9 93204068 613009b0 fa377289"
|
||||
},
|
||||
"bond-swiftShip-high": {
|
||||
"about": "迅捷 high: tier 1 layers 999; chess_char_4_11_b chess_char_1_19_b chess_char_4_07_b chess_char_4_09_b chess_char_1_01_b chess_char_4_06_b chess_char_4_10_b chess_char_4_12_b token_10041_cathy_catsld token_10041_cathy_catsld",
|
||||
@@ -1671,8 +1671,8 @@
|
||||
"round": 5,
|
||||
"seed": 3923365115,
|
||||
"waveId": "act1autochess_05",
|
||||
"time": 61.03,
|
||||
"ticks": 1831,
|
||||
"time": 60.97,
|
||||
"ticks": 1829,
|
||||
"reason": "cleared",
|
||||
"killed": 16,
|
||||
"total": 17,
|
||||
@@ -1693,10 +1693,10 @@
|
||||
["p1",9,"token","token_10000_silent_healrb",null,null,1000,1,29,0,0,0,1487,20,null]
|
||||
],
|
||||
"enemies": {"enemy_1116_liprr":[11,11,0,2293,54450],"enemy_1116_liprr_2":[4,4,0,932,27000],"enemy_1118_lidbox_2":[2,1,1,5086,16330]},
|
||||
"hooks": [1,28,1831,191,191,202,202,34,18,21,15,15,0,8324,2,26,17,1,1,18,0,0,0],
|
||||
"hooks": [1,28,1829,191,191,202,202,34,18,21,15,15,0,8314,2,26,17,1,1,18,0,0,0],
|
||||
"events": {"atk":225,"deploy":11,"die":20,"dmg":202,"engage":6,"fx":55,"heal":34,"leak":1,"skill":30,"spawn":26,"status":25},
|
||||
"fx": {"aoe":1,"displace":19,"liberate":3,"phase":5,"pull":19,"strike":3,"summon":2,"volley":3},
|
||||
"snaps": "1774960c 545a8597 76b2bced 15a43322 4a542e7d 74a46ccc 4ac83a35"
|
||||
"snaps": "1774960c 545a8597 76b2bced 1a13fea9 2d1fca5c 71f3785d"
|
||||
},
|
||||
"bond-visiShip-high": {
|
||||
"about": "远见 high: tier 1 layers 999; chess_char_4_17_b chess_char_4_18_b chess_char_3_03_b chess_char_4_19_b chess_char_4_16_b chess_char_2_02_b chess_char_4_20_b chess_char_4_21_b token_10000_silent_healrb",
|
||||
|
||||
+57
-58
@@ -2171,7 +2171,7 @@
|
||||
"hooks": [1,128,6000,640,640,2628,4423,0,114,114,18,18,0,21502,828,127,114,0,1,114,0,190,0],
|
||||
"events": {"atk":779,"deploy":12,"die":114,"dmg":4091,"engage":3,"fx":692,"skill":36,"spawn":128,"status":1989},
|
||||
"fx": {"burst":190,"displace":16,"shield":471,"zone":15},
|
||||
"snaps": "00a90afe 8ab9145f 036b1fc4 25e62a9f 926a9f27 847ba8da 6f592c87 f0b39913 a8bc3409 c574d2f9 8e6e657a ee991610 3f41e73a acc324f7 c9f42c79 6afc3cf2 6d141175 e21e35cc 68fdc79e 470986f3"
|
||||
"snaps": "00a90afe 8ab9145f 036b1fc4 25e62a9f 926a9f27 847ba8da 6f592c87 f0b39913 a8bc3409 c574d2f9 8e6e657a ee991610 3f41e73a acc324f7 c9f42c79 73ef15ea 6b6b5817 1cfd8a96 a6544dac 1b108919"
|
||||
},
|
||||
"diy-054": {
|
||||
"about": "5_diy1_a=zumama/S1 5_diy2_a=zumama/S2 5_diy1_a=zumama/S3 5_diy2_b=zumama/S1 5_diy1_b=zumama/S2 5_diy2_b=zumama/S3 5_diy1_b=zumama/S1/002_zumama 5_diy2_b=zumama/S2/002_zumama 5_diy1_b=zumama/S3/002_zumama 5_diy2_b=zumama/S1/003_zumama 5_diy1_b=zumama/S2/003_zumama 5_diy2_b=zumama/S3/003_zumama",
|
||||
@@ -3649,10 +3649,10 @@
|
||||
["p1",12,"op","chess_char_6_diy2_b",2,"uniequip_003_ray",0,0,91,0,37527,3978,0,23,1]
|
||||
],
|
||||
"enemies": {"enemy_1045_hammer_2":[18,0,18,12600,41514],"enemy_1061_zomshd":[60,2,58,25580,370999]},
|
||||
"hooks": [1,102,6797,439,439,439,439,21112,22,98,35,34,0,17667,60,23,78,76,1,22,0,0,0],
|
||||
"hooks": [1,102,6797,439,439,439,439,21109,22,98,35,34,0,17665,60,23,78,76,1,22,0,0,0],
|
||||
"events": {"atk":439,"deploy":24,"die":22,"dmg":439,"engage":12,"fx":15,"leak":76,"skill":69,"spawn":90,"status":68},
|
||||
"fx": {"displace":15},
|
||||
"snaps": "302b7a03 2519ff22 acad49df ef6229e8 0ca972e6 99d14293 0b4e6cfe 29980344 1677c1ca 9af09a6e a78d20cb 0e1146f7 b474b3cf 3b82e1a2 255ddf94 3f4712aa 87f33be9 ce3fade5 dad45133 0a4b0f36 d62aae1e fd5fd458 80709e27"
|
||||
"snaps": "302b7a03 2519ff22 acad49df 476444fe 84001ee9 7f5ea75c cde3e736 2de38cc6 580e0df8 1a36023e bb44ef3b af252743 dfc80dc3 a53bbaf5 50461f15 c306df7f f4547d2b 01c2c098 0f2df4af c84d6a15 111a4ddd ed9921db cd8111f4"
|
||||
},
|
||||
"diy-086": {
|
||||
"about": "5_diy1_a=ascln/S1 5_diy2_a=ascln/S2 5_diy1_a=ascln/S3 5_diy2_b=ascln/S1 5_diy1_b=ascln/S2 5_diy2_b=ascln/S3 5_diy1_b=ascln/S1/002_ascln 5_diy2_b=ascln/S2/002_ascln 5_diy1_b=ascln/S3/002_ascln 5_diy2_b=ascln/S1/003_ascln 5_diy1_b=ascln/S2/003_ascln 5_diy2_b=ascln/S3/003_ascln",
|
||||
@@ -4369,7 +4369,7 @@
|
||||
"hooks": [1,162,6900,901,901,932,917,7223,69,154,0,38,0,0,31,73,117,85,1,69,0,0,15],
|
||||
"events": {"atk":901,"deploy":42,"die":69,"dmg":900,"engage":12,"fx":421,"leak":85,"skill":83,"spawn":132,"status":110},
|
||||
"fx": {"aoe":12,"buff":15,"displace":12,"dodge":15,"expose":352,"shield":15},
|
||||
"snaps": "22057a43 e979e325 58c21275 0e318d82 f1a489d0 480e8f9e 36a09ceb bfc0f20e 5886d7cf d7218bb5 646e4158 aecbb06c a19fe55c 3f64f495 dc1a8d69 6bccee64 70e0d18c 1dd120a2 d9751fc3 542489ba 40ebcaf2 5914d84a dc001495"
|
||||
"snaps": "22057a43 e979e325 58c21275 0e318d82 f1a489d0 480e8f9e 36a09ceb bfc0f20e 5886d7cf d7218bb5 646e4158 aecbb06c 9604abcd 6a923e78 a41d4144 d73a9759 8487c279 acdd7ab7 78e43dde f57d7a3b 11b5e047 3755c2e3 c0b6bae4"
|
||||
},
|
||||
"diy-103": {
|
||||
"about": "6_diy1_b=phatom/S1 6_diy2_b=phatom/S2 6_diy1_b=phatom/S3 6_diy2_b=phatom/S1/002_phatom 6_diy1_b=phatom/S2/002_phatom 6_diy2_b=phatom/S3/002_phatom 6_diy1_b=phatom/S1/003_phatom 6_diy2_b=phatom/S2/003_phatom 6_diy1_b=phatom/S3/003_phatom 6_diy2_b=phatom/S1/004_phatom 6_diy1_b=phatom/S2/004_phatom 6_diy2_b=phatom/S3/004_phatom",
|
||||
@@ -4931,54 +4931,54 @@
|
||||
"bossHpLeft": null,
|
||||
"rngDraws": 0,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {"p1":{"killed":156,"total":96,"perfect":false,"leaks":70,"leaksUncounted":0,"coins":0,"dmg":502125,"bossDmg":0,"heal":0,"deaths":9,"layerGains":{}}},
|
||||
"players": {"p1":{"killed":156,"total":96,"perfect":false,"leaks":75,"leaksUncounted":0,"coins":0,"dmg":503892,"bossDmg":0,"heal":0,"deaths":9,"layerGains":{}}},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_5_diy1_b",0,"uniequip_002_ebnhlz",1570,1,10,4,57606,0,0,47,5],
|
||||
["p1",2,"op","chess_char_5_diy2_b",1,"uniequip_002_ebnhlz",1570,1,11,8,31893,0,0,30,0],
|
||||
["p1",3,"op","chess_char_5_diy1_b",2,"uniequip_002_ebnhlz",1570,1,1,7,8950,0,0,24,4],
|
||||
["p1",4,"op","chess_char_5_diy2_b",0,"uniequip_003_ebnhlz",1650,1,3,21,40584,0,0,76,8],
|
||||
["p1",3,"op","chess_char_5_diy1_b",2,"uniequip_002_ebnhlz",1570,1,1,6,9039,0,0,24,4],
|
||||
["p1",4,"op","chess_char_5_diy2_b",0,"uniequip_003_ebnhlz",1650,1,3,22,40056,0,0,76,8],
|
||||
["p1",5,"op","chess_char_5_diy1_b",1,"uniequip_003_ebnhlz",1650,1,5,8,49875,0,0,62,7],
|
||||
["p1",6,"op","chess_char_5_diy2_b",2,"uniequip_003_ebnhlz",1650,1,7,9,128862,0,0,49,4],
|
||||
["p1",7,"op","chess_char_5_diy1_b",0,"uniequip_004_ebnhlz",1570,1,9,0,0,0,0,0,3],
|
||||
["p1",8,"op","chess_char_5_diy2_b",1,"uniequip_004_ebnhlz",1570,1,12,5,61651,0,0,50,14],
|
||||
["p1",9,"op","chess_char_5_diy1_b",2,"uniequip_004_ebnhlz",0,0,158,0,1442,3140,0,6,2],
|
||||
["p1",10,"op","chess_char_6_diy1_a",0,null,1359,1,264,7,10369,2718,0,32,2],
|
||||
["p1",11,"op","chess_char_6_diy2_a",1,null,53.27,1,252,4,17545,4024,0,21,0],
|
||||
["p1",12,"op","chess_char_6_diy1_a",2,null,0,0,250,2,17986,4077,0,15,1],
|
||||
["p1",9,"op","chess_char_5_diy1_b",2,"uniequip_004_ebnhlz",0,0,171,0,1442,3140,0,6,2],
|
||||
["p1",10,"op","chess_char_6_diy1_a",0,null,1359,1,270,7,12574,2718,0,28,2],
|
||||
["p1",11,"op","chess_char_6_diy2_a",1,null,53.27,1,257,4,17545,4024,0,21,0],
|
||||
["p1",12,"op","chess_char_6_diy1_a",2,null,0,0,255,2,17986,4077,0,15,1],
|
||||
["p1","~1","token","token_10024_ebnhlz_rcube",null,null,1000,0,29,0,0,0,0,0,null],
|
||||
["p1","~2","token","token_10024_ebnhlz_rcube",null,null,1000,0,30,0,13232,0,0,0,null],
|
||||
["p1","~3","token","token_10024_ebnhlz_rcube",null,null,1000,0,50,0,5752,0,0,0,null],
|
||||
["p1","~4","token","token_10024_ebnhlz_rcube",null,null,1000,0,70,0,5177,0,0,0,null],
|
||||
["p1","~5","token","token_10024_ebnhlz_rcube",null,null,1000,0,72,0,0,0,0,0,null],
|
||||
["p1","~6","token","token_10024_ebnhlz_rcube",null,null,1000,0,85,0,5177,0,0,0,null],
|
||||
["p1","~7","token","token_10024_ebnhlz_rcube",null,null,1000,0,108,0,14956,0,0,0,null],
|
||||
["p1","~8","token","token_10024_ebnhlz_rcube",null,null,1000,0,114,0,0,0,0,0,null],
|
||||
["p1","~9","token","token_10024_ebnhlz_rcube",null,null,1000,0,126,0,2876,0,0,0,null],
|
||||
["p1","~10","token","token_10024_ebnhlz_rcube",null,null,1000,0,144,0,2305,0,0,0,null],
|
||||
["p1","~11","token","token_10024_ebnhlz_rcube",null,null,1000,0,155,0,0,0,0,0,null],
|
||||
["p1","~12","token","token_10024_ebnhlz_rcube",null,null,1000,0,165,0,5177,0,0,0,null],
|
||||
["p1","~13","token","token_10024_ebnhlz_rcube",null,null,1000,0,193,0,9778,0,0,0,null],
|
||||
["p1","~14","token","token_10024_ebnhlz_rcube",null,null,1000,0,203,0,0,0,0,0,null],
|
||||
["p1","~15","token","token_10024_ebnhlz_rcube",null,null,1000,0,210,0,2876,0,0,0,null],
|
||||
["p1","~16","token","token_10024_ebnhlz_rcube",null,null,1000,0,227,0,2880,0,0,0,null],
|
||||
["p1","~17","token","token_10024_ebnhlz_rcube",null,null,1000,0,236,0,0,0,0,0,null],
|
||||
["p1","~18","token","token_10024_ebnhlz_rcube",null,null,1000,0,239,0,5177,0,0,0,null],
|
||||
["p1","~19","token","token_10024_ebnhlz_rcube",null,null,1000,0,255,0,0,0,0,0,null],
|
||||
["p1","~20","token","token_10024_ebnhlz_rcube",null,null,1000,1,265,0,0,0,0,0,null],
|
||||
["p1","~21","token","token_10024_ebnhlz_rcube",null,null,1000,1,266,0,0,0,0,0,null]
|
||||
["p1","~3","token","token_10024_ebnhlz_rcube",null,null,1000,0,53,0,5752,0,0,0,null],
|
||||
["p1","~4","token","token_10024_ebnhlz_rcube",null,null,1000,0,73,0,5177,0,0,0,null],
|
||||
["p1","~5","token","token_10024_ebnhlz_rcube",null,null,1000,0,75,0,0,0,0,0,null],
|
||||
["p1","~6","token","token_10024_ebnhlz_rcube",null,null,1000,0,90,0,5177,0,0,0,null],
|
||||
["p1","~7","token","token_10024_ebnhlz_rcube",null,null,1000,0,113,0,14956,0,0,0,null],
|
||||
["p1","~8","token","token_10024_ebnhlz_rcube",null,null,1000,0,119,0,0,0,0,0,null],
|
||||
["p1","~9","token","token_10024_ebnhlz_rcube",null,null,1000,0,131,0,2876,0,0,0,null],
|
||||
["p1","~10","token","token_10024_ebnhlz_rcube",null,null,1000,0,149,0,2305,0,0,0,null],
|
||||
["p1","~11","token","token_10024_ebnhlz_rcube",null,null,1000,0,160,0,0,0,0,0,null],
|
||||
["p1","~12","token","token_10024_ebnhlz_rcube",null,null,1000,0,169,0,5177,0,0,0,null],
|
||||
["p1","~13","token","token_10024_ebnhlz_rcube",null,null,1000,0,198,0,9778,0,0,0,null],
|
||||
["p1","~14","token","token_10024_ebnhlz_rcube",null,null,1000,0,208,0,0,0,0,0,null],
|
||||
["p1","~15","token","token_10024_ebnhlz_rcube",null,null,1000,0,215,0,2876,0,0,0,null],
|
||||
["p1","~16","token","token_10024_ebnhlz_rcube",null,null,1000,0,232,0,2880,0,0,0,null],
|
||||
["p1","~17","token","token_10024_ebnhlz_rcube",null,null,1000,0,241,0,0,0,0,0,null],
|
||||
["p1","~18","token","token_10024_ebnhlz_rcube",null,null,1000,0,244,0,5177,0,0,0,null],
|
||||
["p1","~19","token","token_10024_ebnhlz_rcube",null,null,1000,0,260,0,0,0,0,0,null],
|
||||
["p1","~20","token","token_10024_ebnhlz_rcube",null,null,1000,1,269,0,0,0,0,0,null],
|
||||
["p1","~21","token","token_10024_ebnhlz_rcube",null,null,1000,1,271,0,0,0,0,0,null]
|
||||
],
|
||||
"enemies": {
|
||||
"enemy_1195_sfyin": [45,23,22,8411,157028],
|
||||
"enemy_1196_msfyin": [46,39,7,0,219],
|
||||
"enemy_1197_sfshu": [39,24,15,5548,191163],
|
||||
"enemy_1198_msfshu": [72,58,14,0,455],
|
||||
"enemy_1195_sfyin": [45,24,21,8532,158214],
|
||||
"enemy_1196_msfyin": [48,38,10,0,206],
|
||||
"enemy_1197_sfshu": [39,25,14,5427,191874],
|
||||
"enemy_1198_msfshu": [75,57,18,0,467],
|
||||
"enemy_1199_sfjin": [12,12,0,0,186325],
|
||||
"enemy_1200_msfjin": [12,0,12,0,463]
|
||||
"enemy_1200_msfjin": [12,0,12,0,462]
|
||||
},
|
||||
"hooks": [1,266,6045,462,462,2436,2558,0,165,254,50,48,0,29626,0,23,226,70,1,165,0,0,0],
|
||||
"events": {"atk":462,"deploy":40,"die":184,"dmg":2558,"engage":11,"fx":189,"leak":70,"skill":98,"spawn":259},
|
||||
"fx": {"aoe":13,"displace":17,"pull":17,"summon":80,"volley":62},
|
||||
"snaps": "25481013 aa3440f3 4685e7a3 b08da51f 9f758a7e 37f43c16 c79ffc87 98cbe2a3 ba2b8f1a 1407a331 0e301670 3e7c7b8f d9043c7d fd78a0d2 ce3af6b8 cd061667 724823f0 6505b73d 0a991be8 88f7aaf0 6d682149"
|
||||
"hooks": [1,271,6045,458,458,2438,2560,0,165,259,50,48,0,29723,0,25,231,75,1,165,0,0,0],
|
||||
"events": {"atk":458,"deploy":40,"die":184,"dmg":2560,"engage":11,"fx":191,"leak":75,"skill":98,"spawn":264},
|
||||
"fx": {"aoe":13,"displace":17,"pull":17,"summon":82,"volley":62},
|
||||
"snaps": "25481013 7d0ae0b0 5e7274eb eb59dbd9 80733c26 48610a2e 56dbac9d 7538534b 89a3194b 3aecb43b 411a2af4 4000a3f1 fadeb322 c770c858 88b7d077 166a9639 e1072711 ed68f0ac f92763f7 6ba5cdb8 8889fcde"
|
||||
},
|
||||
"diy-116": {
|
||||
"about": "6_diy1_b=ebnhlz/S1 6_diy2_b=ebnhlz/S2 6_diy1_b=ebnhlz/S3 6_diy2_b=ebnhlz/S1/002_ebnhlz 6_diy1_b=ebnhlz/S2/002_ebnhlz 6_diy2_b=ebnhlz/S3/002_ebnhlz 6_diy1_b=ebnhlz/S1/003_ebnhlz 6_diy2_b=ebnhlz/S2/003_ebnhlz 6_diy1_b=ebnhlz/S3/003_ebnhlz 6_diy2_b=ebnhlz/S1/004_ebnhlz 6_diy1_b=ebnhlz/S2/004_ebnhlz 6_diy2_b=ebnhlz/S3/004_ebnhlz",
|
||||
@@ -4992,38 +4992,37 @@
|
||||
"time": 217.6,
|
||||
"ticks": 6528,
|
||||
"reason": "cleared",
|
||||
"killed": 2,
|
||||
"killed": 3,
|
||||
"total": 123,
|
||||
"unspawned": 0,
|
||||
"bossHpLeft": null,
|
||||
"rngDraws": 8,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {"p1":{"killed":2,"total":123,"perfect":false,"leaks":121,"leaksUncounted":0,"coins":0,"dmg":288443,"bossDmg":0,"heal":0,"deaths":21,"layerGains":{}}},
|
||||
"players": {"p1":{"killed":3,"total":123,"perfect":false,"leaks":120,"leaksUncounted":0,"coins":0,"dmg":294141,"bossDmg":0,"heal":0,"deaths":21,"layerGains":{}}},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_6_diy1_b",0,"none",0,0,113,1,21882,3140,0,27,2],
|
||||
["p1",2,"op","chess_char_6_diy2_b",1,"none",0,0,90,0,27538,3140,0,18,4],
|
||||
["p1",3,"op","chess_char_6_diy1_b",2,"none",0,0,130,0,21860,3140,0,9,1],
|
||||
["p1",4,"op","chess_char_6_diy2_b",0,"uniequip_002_ebnhlz",0,0,141,0,16756,3140,0,16,1],
|
||||
["p1",5,"op","chess_char_6_diy1_b",1,"uniequip_002_ebnhlz",0,0,150,0,18745,4710,0,11,1],
|
||||
["p1",6,"op","chess_char_6_diy2_b",2,"uniequip_002_ebnhlz",0,0,77,0,12168,3140,0,7,0],
|
||||
["p1",7,"op","chess_char_6_diy1_b",0,"uniequip_003_ebnhlz",0,0,73,0,21305,3490,0,5,0],
|
||||
["p1",1,"op","chess_char_6_diy1_b",0,"none",0,0,91,1,34465,3140,0,27,2],
|
||||
["p1",2,"op","chess_char_6_diy2_b",1,"none",0,0,113,0,18932,3140,0,10,2],
|
||||
["p1",3,"op","chess_char_6_diy1_b",2,"none",0,0,129,0,21860,3140,0,9,1],
|
||||
["p1",4,"op","chess_char_6_diy2_b",0,"uniequip_002_ebnhlz",0,0,140,0,15159,3140,0,14,1],
|
||||
["p1",5,"op","chess_char_6_diy1_b",1,"uniequip_002_ebnhlz",0,0,149,0,18745,4710,0,11,1],
|
||||
["p1",6,"op","chess_char_6_diy2_b",2,"uniequip_002_ebnhlz",0,0,78,0,12168,3140,0,7,0],
|
||||
["p1",7,"op","chess_char_6_diy1_b",0,"uniequip_003_ebnhlz",0,0,74,0,21305,3490,0,5,0],
|
||||
["p1",8,"op","chess_char_6_diy2_b",1,"uniequip_003_ebnhlz",0,0,7,0,13689,1745,0,5,0],
|
||||
["p1",9,"op","chess_char_6_diy1_b",2,"uniequip_003_ebnhlz",0,0,9,0,26215,1745,0,8,1],
|
||||
["p1",10,"op","chess_char_6_diy2_b",0,"uniequip_004_ebnhlz",0,0,75,0,11814,3140,0,5,0],
|
||||
["p1",11,"op","chess_char_6_diy1_b",1,"uniequip_004_ebnhlz",0,0,4,0,29683,1570,0,5,1],
|
||||
["p1",12,"op","chess_char_6_diy2_b",2,"uniequip_004_ebnhlz",0,0,6,0,29794,1570,0,8,1],
|
||||
["p1",10,"op","chess_char_6_diy2_b",0,"uniequip_004_ebnhlz",0,0,76,0,11814,3140,0,5,0],
|
||||
["p1",11,"op","chess_char_6_diy1_b",1,"uniequip_004_ebnhlz",0,0,4,0,29832,1570,0,6,2],
|
||||
["p1",12,"op","chess_char_6_diy2_b",2,"uniequip_004_ebnhlz",0,0,6,0,29126,1570,0,8,1],
|
||||
["p1","~1","token","token_10024_ebnhlz_rcube",null,null,1000,0,26,0,1907,0,0,0,null],
|
||||
["p1","~2","token","token_10024_ebnhlz_rcube",null,null,1000,0,27,0,18005,0,0,0,null],
|
||||
["p1","~3","token","token_10024_ebnhlz_rcube",null,null,1000,0,28,0,5052,0,0,0,null],
|
||||
["p1","~4","token","token_10024_ebnhlz_rcube",null,null,1000,0,37,1,5491,0,0,0,null],
|
||||
["p1","~5","token","token_10024_ebnhlz_rcube",null,null,1000,0,98,0,2724,0,0,0,null],
|
||||
["p1","~6","token","token_10024_ebnhlz_rcube",null,null,1000,0,121,0,3814,0,0,0,null]
|
||||
["p1","~5","token","token_10024_ebnhlz_rcube",null,null,1000,0,38,1,10376,0,0,0,null]
|
||||
],
|
||||
"enemies": {"enemy_1006_shield_3":[21,0,21,8025,130381],"enemy_1043_zomsbr":[66,1,65,15266,80405],"enemy_1402_tgshd_2":[36,1,35,10379,77656]},
|
||||
"hooks": [1,150,6528,190,190,340,360,12512,23,150,12,12,0,9354,0,24,123,121,1,23,0,1,0],
|
||||
"events": {"atk":190,"deploy":27,"die":29,"dmg":360,"engage":12,"fx":105,"leak":121,"skill":24,"spawn":141,"status":42},
|
||||
"fx": {"aoe":6,"burst":1,"displace":8,"expose":63,"pull":8,"summon":6,"volley":13},
|
||||
"snaps": "691ad5fa 646da9eb a1f8ea41 fe731b91 6da71566 f4f8e4ee 3c0f0da0 fc5fe596 caf68706 1d5933fe 129d0ab4 332dad2e 4bff2df6 9bc1ad09 2c797af1 d1372b1b e9c44ce5 c57571d6 05a6f455 7a1ed9e8 d1f17800 e205c30f"
|
||||
"enemies": {"enemy_1006_shield_3":[21,0,21,8523,127871],"enemy_1043_zomsbr":[66,2,64,14767,76925],"enemy_1402_tgshd_2":[36,1,35,10379,89345]},
|
||||
"hooks": [1,149,6528,178,178,332,359,10940,24,149,11,11,0,9065,0,25,123,120,1,24,0,1,0],
|
||||
"events": {"atk":178,"deploy":26,"die":29,"dmg":359,"engage":12,"fx":113,"leak":120,"skill":22,"spawn":140,"status":46},
|
||||
"fx": {"aoe":5,"burst":1,"displace":9,"expose":70,"pull":9,"summon":5,"volley":14},
|
||||
"snaps": "691ad5fa 8c0879a7 60069559 f61219f3 a319b595 ee8eba93 e8c33ea0 4a4f2bad 4a11e85e 89d61e0c d2af6b10 542a1a2d e8c10270 780a5b63 5cc92cd4 47f29927 02d2e3ae ad654e95 51427d74 29086ff4 cf4f4fc4 4aab434f"
|
||||
},
|
||||
"diy-117": {
|
||||
"about": "5_diy1_a=mgllan/S1 5_diy2_a=mgllan/S2 5_diy1_a=mgllan/S3 5_diy2_b=mgllan/S1 5_diy1_b=mgllan/S2 5_diy2_b=mgllan/S3 5_diy1_b=mgllan/S1/002_mgllan 5_diy2_b=mgllan/S2/002_mgllan 5_diy1_b=mgllan/S3/002_mgllan 5_diy2_b=mgllan/S1/003_mgllan 5_diy1_b=mgllan/S2/003_mgllan 5_diy2_b=mgllan/S3/003_mgllan",
|
||||
|
||||
+38
-38
@@ -435,15 +435,15 @@
|
||||
"rngDraws": 586,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {
|
||||
"p1": {"killed":12,"total":14,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":1051588,"bossDmg":348531,"heal":24590,"deaths":18,"layerGains":{}},
|
||||
"p2": {"killed":0,"total":0,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":1024342,"bossDmg":675841,"heal":11551,"deaths":18,"layerGains":{}}
|
||||
"p1": {"killed":12,"total":14,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":1051583,"bossDmg":348531,"heal":24590,"deaths":18,"layerGains":{}},
|
||||
"p2": {"killed":0,"total":0,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":1024346,"bossDmg":675841,"heal":11551,"deaths":18,"layerGains":{}}
|
||||
},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",1529.8,1,60,3,127646,6704,420,23,1],
|
||||
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",1529.8,1,60,3,127644,6704,420,23,1],
|
||||
["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",3313.03,1,59,1,18993,8260,1117,13,2],
|
||||
["p1",3,"op","chess_char_5_14_b",1,"none",0,0,49,0,54350,11582,2258,18,11],
|
||||
["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",0,0,57,0,16983,9470,33,10,1],
|
||||
["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",0,0,58,2,402657,4059,549,98,15],
|
||||
["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",0,0,58,2,402655,4059,549,98,15],
|
||||
["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",0,0,55,1,85045,10014,2086,30,4],
|
||||
["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",0,0,19,0,117239,4097,2126,150,4],
|
||||
["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",1058.29,1,62,4,118723,2559,395,35,12],
|
||||
@@ -456,7 +456,7 @@
|
||||
["p2",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",2322.43,1,63,1,270484,5747,2514,55,5],
|
||||
["p2",16,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",0,0,53,0,148207,3584,462,128,2],
|
||||
["p2",17,"op","chess_char_4_10_b",1,"uniequip_002_aroma",0,0,14,0,0,3934,1521,0,0],
|
||||
["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",0,0,20,0,63317,5817,3585,73,4],
|
||||
["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",0,0,20,0,63322,5817,3585,73,4],
|
||||
["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",1501.32,1,64,0,62705,2825,348,61,18],
|
||||
["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",1105.8,1,65,0,162943,2741,594,71,13],
|
||||
["p2",21,"token","token_10041_cathy_catsld",null,null,100,1,21,0,0,0,0,0,null],
|
||||
@@ -502,7 +502,7 @@
|
||||
"weightless": 4,
|
||||
"zone": 296
|
||||
},
|
||||
"snaps": "98983314 a631783a ccc2dc9a bfd1a9d0 9c652c81 40f8d98e 08d313bf e5981c81 697be22d b0240d7c 1d954142 c60f8007 a74df9a8 9f265f02 2eea5c29 3ceddda5 818cf4b3 d569afac 20be7df9 ac07bc57"
|
||||
"snaps": "ed484d33 33f3d6da 7870ff24 543fba69 70391f85 d04365ca 03abfe93 22b9a98d 175f4779 bef63720 45719c56 008d21fb f4323e9c 87f82a06 a6f06b4d 059aa061 d70a0dbf ab69ce90 7b447a0d 0f2d7bfb"
|
||||
},
|
||||
"boss-boss_4-solo": {
|
||||
"about": "盐风主教昆图斯 solo pool 4200000: chess_char_4_17_b chess_char_4_18_b chess_char_4_23_b chess_char_4_19_b chess_char_4_22_b chess_char_4_20_b chess_char_4_21_b chess_char_4_24_b chess_char_4_25_b chess_char_4_26_b",
|
||||
@@ -720,9 +720,9 @@
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",3907,1,3,0,141185,0,0,30,2],
|
||||
["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",3537,1,1,0,0,0,0,0,0],
|
||||
["p1",3,"op","chess_char_5_14_b",1,"none",2174,1,5,1,34607,0,0,0,13],
|
||||
["p1",3,"op","chess_char_5_14_b",1,"none",2174,1,5,1,35215,0,0,0,13],
|
||||
["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",4654.6,1,11,1,25069,1974,1974,15,1],
|
||||
["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1170,1,7,2,341600,0,0,82,15],
|
||||
["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1170,1,7,2,340992,0,0,82,15],
|
||||
["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",1382,1,13,0,197578,0,0,73,6],
|
||||
["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",0,0,15,0,28546,1629,0,52,2],
|
||||
["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",0,0,51,0,161857,3453,231,51,17],
|
||||
@@ -749,10 +749,10 @@
|
||||
"enemy_1010_demon": [4,4,0,14161,200612],
|
||||
"enemy_9032_aclionk": [1,0,0,41978,1094757]
|
||||
},
|
||||
"hooks": [1,63,6000,1187,1211,2290,2305,620,39,41,111,106,0,34547,890,9,19,0,1,27,0,3,0],
|
||||
"events": {"atk":1274,"deploy":44,"die":41,"dmg":2220,"engage":15,"fx":723,"heal":7,"skill":217,"spawn":41,"status":1221},
|
||||
"hooks": [1,63,6000,1187,1211,2289,2304,620,39,41,111,106,0,34547,890,9,19,0,1,27,0,3,0],
|
||||
"events": {"atk":1274,"deploy":44,"die":41,"dmg":2219,"engage":15,"fx":723,"heal":7,"skill":217,"spawn":41,"status":1221},
|
||||
"fx": {"aoe":38,"appear":6,"blink":2,"burst":3,"crit":109,"dilemma":6,"disappear":6,"displace":21,"equip":15,"explosion":7,"frostNova":15,"garrisonGrant":1,"iceSpike":44,"overclock":1,"pull":4,"quadShot":3,"revive":2,"ripple":25,"sentry":4,"shadowWeave":6,"shield":1,"soul":3,"sp":15,"stealth":6,"swordRain":44,"swordStorm":8,"telegraph":20,"tornado":5,"tornadoPulse":20,"vest":8,"weightless":6,"zone":269},
|
||||
"snaps": "8ef2441b 1f0b7d9b 358031de d7fac848 6bc45581 c14c05ea 9d45ac22 41b0826b f08fb48f f40bdbfc 557a25e0 2ffc6990 e3eab3cd 4805839b 41854b5c efd95f41 8e8c177f 7bd3b7ee 5f3edf58 060ad10f"
|
||||
"snaps": "8ef2441b 1f0b7d9b 358031de 8a0737dd 27c06d84 de465885 9fcdeb44 e64e7283 1d9ca8dc 20a1c85b 97a58b2f 7e7bb35b 2ad9878a 7dc14844 c16a38c3 a7024372 85516100 60b95b21 2b2dc4a3 176abd14"
|
||||
},
|
||||
"boss-boss_6-solo": {
|
||||
"about": "阿利斯泰尔,帝国余晖 solo pool 3980000: chess_char_4_17_b chess_char_4_18_b chess_char_4_23_b chess_char_4_19_b chess_char_4_22_b chess_char_4_20_b chess_char_4_21_b chess_char_4_24_b chess_char_4_25_b chess_char_4_26_b",
|
||||
@@ -1081,18 +1081,18 @@
|
||||
"killed": 8,
|
||||
"total": 8,
|
||||
"unspawned": 0,
|
||||
"bossHpLeft": 3636991,
|
||||
"rngDraws": 1645,
|
||||
"bossHpLeft": 3586929,
|
||||
"rngDraws": 1615,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {
|
||||
"p1": {"killed":8,"total":8,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1813003,"bossDmg":790560,"heal":15516,"deaths":4,"layerGains":{}},
|
||||
"p2": {"killed":0,"total":0,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":3233639,"bossDmg":1129525,"heal":130347,"deaths":10,"layerGains":{}}
|
||||
"p1": {"killed":8,"total":8,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1675683,"bossDmg":739063,"heal":15516,"deaths":4,"layerGains":{}},
|
||||
"p2": {"killed":0,"total":0,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":3543901,"bossDmg":1230964,"heal":126078,"deaths":10,"layerGains":{}}
|
||||
},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_6_03_b",2,"uniequip_002_yu",2601.77,1,66,0,0,11336,7438,0,2],
|
||||
["p1",2,"op","chess_char_6_06_b",2,"uniequip_002_pepe",2939,1,11,0,25365,227,0,37,1],
|
||||
["p1",3,"op","chess_char_6_07_b",2,"uniequip_002_siege2",2535.79,1,17,0,53146,4017,0,51,2],
|
||||
["p1",4,"op","chess_char_6_01_b",2,"uniequip_002_lemuen",204.28,1,7,1,1363387,2333,0,58,8],
|
||||
["p1",4,"op","chess_char_6_01_b",2,"uniequip_002_lemuen",1217.02,1,7,1,1226067,1320,0,58,8],
|
||||
["p1",5,"op","chess_char_6_02_b",2,"uniequip_002_sbell2",1933,1,9,0,33316,9693,0,46,2],
|
||||
["p1",6,"op","chess_char_6_04_b",2,"uniequip_002_skadi2",954.58,1,55,0,35830,12093,529,0,4],
|
||||
["p1",7,"op","chess_char_6_05_b",2,"uniequip_002_pasngr",2451.4,1,13,1,69554,0,0,0,11],
|
||||
@@ -1101,16 +1101,16 @@
|
||||
["p1",10,"op","chess_char_6_11_b",2,"uniequip_002_mlyss",1893,1,60,0,50598,9393,349,84,3],
|
||||
["p1",11,"token","token_10017_skadi2_dedant",null,null,138,0,28,0,0,0,0,0,null],
|
||||
["p1",12,"token","token_10030_mlyss_wtrman",null,null,0,0,24,0,0,1640,318,4,1],
|
||||
["p2",13,"op","chess_char_6_15_b",2,"uniequip_002_qiubai",2057.07,1,67,4,707045,24024,0,312,3],
|
||||
["p2",13,"op","chess_char_6_15_b",2,"uniequip_002_qiubai",0,0,67,4,730915,26081,0,317,3],
|
||||
["p2",14,"op","chess_char_6_19_b",2,"uniequip_002_blkkgt",0,0,59,0,231858,17841,0,41,4],
|
||||
["p2",15,"op","chess_char_5_01_b",1,"uniequip_002_excu2",0,0,65,0,4091,6660,1695,24,2],
|
||||
["p2",16,"op","chess_char_6_17_b",2,"uniequip_002_nearl2",0,0,58,1,483793,26213,0,71,3],
|
||||
["p2",17,"op","chess_char_6_12_b",1,"uniequip_002_rosmon",173.1,1,8,0,687440,10444,0,73,3],
|
||||
["p2",18,"op","chess_char_6_13_b",1,"uniequip_002_angel2",0,0,14,0,742766,9295,4040,242,5],
|
||||
["p2",19,"op","chess_char_6_14_b",2,"uniequip_002_lumen",1662.91,1,20,0,0,1375,14267,80,1],
|
||||
["p2",20,"op","chess_char_6_16_b",2,"uniequip_002_halo2",0,0,10,0,95777,1439,0,122,3],
|
||||
["p2",21,"op","chess_char_6_18_b",2,"uniequip_002_whitw2",1680.1,1,41,0,217704,24241,0,59,4],
|
||||
["p2",22,"op","chess_char_6_20_b",2,"uniequip_002_agoat2",1662.1,1,25,0,0,14000,110345,83,2],
|
||||
["p2",15,"op","chess_char_5_01_b",1,"uniequip_002_excu2",0,0,65,0,16117,7380,2415,28,2],
|
||||
["p2",16,"op","chess_char_6_17_b",2,"uniequip_002_nearl2",0,0,58,1,602101,26213,0,80,3],
|
||||
["p2",17,"op","chess_char_6_12_b",1,"uniequip_002_rosmon",1332.47,1,8,0,674466,3109,0,73,3],
|
||||
["p2",18,"op","chess_char_6_13_b",1,"uniequip_002_angel2",1727.29,1,14,0,924004,6580,2751,263,5],
|
||||
["p2",19,"op","chess_char_6_14_b",2,"uniequip_002_lumen",0,0,20,0,0,3038,8952,78,1],
|
||||
["p2",20,"op","chess_char_6_16_b",2,"uniequip_002_halo2",1439,1,10,0,96068,0,0,126,3],
|
||||
["p2",21,"op","chess_char_6_18_b",2,"uniequip_002_whitw2",1203.55,1,41,0,205207,26966,0,59,4],
|
||||
["p2",22,"op","chess_char_6_20_b",2,"uniequip_002_agoat2",1588.6,1,25,0,0,14000,111960,83,2],
|
||||
["-","~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],
|
||||
@@ -1127,33 +1127,33 @@
|
||||
["p1","~4","token","token_10030_mlyss_wtrman",null,null,1322,1,61,0,0,155,92,0,1],
|
||||
["p1","~2","token","token_10017_skadi2_dedant",null,null,100,0,62,0,0,0,0,0,null],
|
||||
["p1","~2","token","token_10040_siege2_vlion",null,null,4000,0,63,0,0,0,0,0,null],
|
||||
["p2","~3","token","token_10019_nearl2_sword",null,null,0,0,64,0,33414,6564,0,16,null],
|
||||
["p2","~3","token","token_10019_nearl2_sword",null,null,1351.68,0,64,0,33413,5212,0,12,null],
|
||||
["p1","~3","token","token_10017_skadi2_dedant",null,null,100,1,68,0,0,0,0,0,null]
|
||||
],
|
||||
"enemies": {
|
||||
"enemy_1267_nhpbr_2": [6,6,0,1500,141894],
|
||||
"enemy_9007_acelem": [2,2,0,18532,309587],
|
||||
"enemy_9017_achunt_2": [2,0,0,58104,1963009],
|
||||
"enemy_9018_actrpa": [1,0,0,51655,811529],
|
||||
"enemy_9019_actrpb": [1,0,0,30033,718108],
|
||||
"enemy_9020_actrpc": [1,0,0,24632,1185793]
|
||||
"enemy_9017_achunt_2": [2,0,0,58672,2013071],
|
||||
"enemy_9018_actrpa": [1,0,0,40802,832791],
|
||||
"enemy_9019_actrpb": [1,0,0,32263,746620],
|
||||
"enemy_9020_actrpc": [1,0,0,25887,1259125]
|
||||
},
|
||||
"hooks": [1,66,6000,1727,1727,7189,13487,2668,28,39,95,89,277,48035,2985,15,13,0,1,29,0,16,0],
|
||||
"events": {"atk":2084,"deploy":47,"die":39,"dmg":12976,"engage":22,"fx":2157,"heal":966,"skill":184,"spawn":53,"status":821},
|
||||
"hooks": [1,66,6000,1768,1768,7069,13203,2682,27,39,95,90,292,48490,2998,15,13,0,1,28,0,12,0],
|
||||
"events": {"atk":2132,"deploy":47,"die":39,"dmg":12703,"engage":22,"fx":2158,"heal":961,"skill":185,"spawn":53,"status":790},
|
||||
"fx": {
|
||||
"airstrike": 84,
|
||||
"beam": 26,
|
||||
"airstrike": 85,
|
||||
"beam": 31,
|
||||
"blessing": 1,
|
||||
"blink": 5,
|
||||
"bombard": 72,
|
||||
"bombardShell": 72,
|
||||
"burst": 16,
|
||||
"burst": 12,
|
||||
"camouflage": 1,
|
||||
"copy": 3,
|
||||
"dash": 24,
|
||||
"displace": 14,
|
||||
"dp": 3,
|
||||
"drone": 320,
|
||||
"drone": 319,
|
||||
"droneLock": 14,
|
||||
"drones": 4,
|
||||
"extraAttack": 5,
|
||||
@@ -1181,7 +1181,7 @@
|
||||
"wanted": 6,
|
||||
"zone": 6
|
||||
},
|
||||
"snaps": "2a921421 57801ce9 e8f35705 fba04fd7 d2a6440c a3b24855 a2d10035 e394b69f 7de21c75 bd6caaad ea4accdc 41ef5240 67c52051 5cd402c4 583f7ecc 859a9f1c 2c2aa8dd d206cf4c 4b695b81 674f683a"
|
||||
"snaps": "2a921421 57801ce9 e8f35705 fba04fd7 d2a6440c a3b24855 a2d10035 e394b69f 7de21c75 bd6caaad ea4accdc 41ef5240 67c52051 5cd402c4 583f7ecc 859a9f1c a9cf2775 721d01e9 c30e073b 203814c0"
|
||||
},
|
||||
"hidden-boss_9-solo": {
|
||||
"about": "假想敌:铳 solo pool 2800000: chess_char_5_08_b chess_char_5_11_b chess_char_5_05_b chess_char_5_06_b chess_char_5_13_b chess_char_5_07_b chess_char_5_02_b chess_char_5_03_b chess_char_5_10_b chess_char_5_12_b",
|
||||
@@ -1327,7 +1327,7 @@
|
||||
"weightless": 2,
|
||||
"zone": 160
|
||||
},
|
||||
"snaps": "f891236c f6672d61 f9ae299a bd864733 a34ff855 ee6e490a 8d637482 2808cda1 b8ebc810 72052abe c42b6edb 8a1ce86d f52b121e 6ec9eb74 6a1199ed 05aa4e08 5d012397 6fee9656 361ddec2 24e36087"
|
||||
"snaps": "f891236c f6672d61 f9ae299a 38137066 7529d68c 7ccc83e3 76a143d3 bd5434d4 792d5035 9a6514ef 4a121dc2 3e3ba3e8 f714ce47 869d9185 409dfa84 85fb9505 93086aba 52a21bef dd22d89f b852066e"
|
||||
},
|
||||
"hidden-boss_10-solo": {
|
||||
"about": "假想敌:管 solo pool 7600000: chess_char_4_17_b chess_char_4_18_b chess_char_4_23_b chess_char_4_19_b chess_char_4_22_b chess_char_4_20_b chess_char_4_21_b chess_char_4_24_b chess_char_4_25_b chess_char_4_26_b",
|
||||
|
||||
+22
-22
@@ -152,7 +152,7 @@
|
||||
"title": {"id":"comment_2","name":"不朽盟约","picId":"comment_icon_2","text":"激活的盟约层数总和最高"},
|
||||
"trophies": 0,
|
||||
"reward": 320,
|
||||
"stats": {"activatedLayers":270,"bossDamage":321387,"dmgDealt":2293260,"gold":131,"itemsEquipped":23,"kills":384,"leaks":10,"lpLost":10,"merges":5,"perfectRounds":12,"refreshes":15},
|
||||
"stats": {"activatedLayers":270,"bossDamage":321387,"dmgDealt":2290482,"gold":131,"itemsEquipped":23,"kills":384,"leaks":10,"lpLost":10,"merges":5,"perfectRounds":12,"refreshes":15},
|
||||
"lineup": ["3_20_b@12,5[3_06_e_a+4_08_e_a]","2_14_a@12,7","5_20_b@11,5[6_09_e_a+5_02_e_b]","5_10_a@11,8[4_07_e_a+3_08_e_b]","6_11_a@10,3[4_12_e_a+5_02_e_b]","3_18_a@10,8[2_04_e_b+4_05_e_b]","1_08_a@9,4[1_01_e_a+1_02_e_a]","6_19_a@9,5[4_04_e_a+4_10_e_a]"],
|
||||
"bonds": ["arcaneShip 0/2","deputShip 1/14","emptyShip 1/10","kazimierzShip 0/16","kjeragShip 1/24","maniShip 1/2","miraShip 1/13","preciShip 0/12","sargonShip 0/8","siracusaShip 1/139","soloShip 1/22","steadShip 0/6","suntShip 1/8","swiftShip 1/38"]
|
||||
}
|
||||
@@ -296,7 +296,7 @@
|
||||
"title": {"id":"comment_2","name":"不朽盟约","picId":"comment_icon_2","text":"激活的盟约层数总和最高"},
|
||||
"trophies": 0,
|
||||
"reward": 340,
|
||||
"stats": {"activatedLayers":274,"bossDamage":771866,"dmgDealt":2483763,"gold":140,"itemsEquipped":16,"kills":395,"leaks":25,"lpLost":17,"merges":3,"perfectRounds":10,"refreshes":15},
|
||||
"stats": {"activatedLayers":274,"bossDamage":771866,"dmgDealt":2481000,"gold":140,"itemsEquipped":16,"kills":395,"leaks":25,"lpLost":17,"merges":3,"perfectRounds":10,"refreshes":15},
|
||||
"lineup": ["6_12_a@12,5[5_01_e_a+5_02_e_a]","5_10_a@12,7[4_07_e_a+4_08_e_a]","4_14_a@11,8","3_11_a@10,3","5_14_a@9,4[3_08_e_a+3_11_e_a]","1_08_a@9,5[1_01_e_a+4_05_e_a]","6_02_a@9,6","4_10_a@9,8[5_02_e_b+4_10_e_b]"],
|
||||
"bonds": ["arcaneShip 1/30","deputShip 0/14","emptyShip 1/10","kazimierzShip 0/16","kjeragShip 1/56","preciShip 2/55","sargonShip 0/8","siracusaShip 1/75","soloShip 1/15","steadShip 0/21","swiftShip 1/33","visiShip 1/0"]
|
||||
}
|
||||
@@ -436,7 +436,7 @@
|
||||
"title": {"id":"comment_4","name":"精英云集","picId":"comment_icon_4","text":"晋升精锐次数最多"},
|
||||
"trophies": 0,
|
||||
"reward": 255,
|
||||
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":1678545,"gold":111,"itemsEquipped":13,"kills":235,"leaks":49,"lpLost":35,"merges":2,"perfectRounds":8,"refreshes":6},
|
||||
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":1673916,"gold":111,"itemsEquipped":13,"kills":235,"leaks":49,"lpLost":35,"merges":2,"perfectRounds":8,"refreshes":6},
|
||||
"lineup": [],
|
||||
"bonds": ["arcaneShip 0/18","deputShip 0/14","emptyShip 0/10","kazimierzShip 0/8","kjeragShip 0/27","preciShip 0/23","sargonShip 0/8","siracusaShip 0/69","soloShip 0/15","steadShip 0/17","swiftShip 0/8"]
|
||||
}
|
||||
@@ -600,7 +600,7 @@
|
||||
"title": {"id":"comment_2","name":"不朽盟约","picId":"comment_icon_2","text":"激活的盟约层数总和最高"},
|
||||
"trophies": 4,
|
||||
"reward": 400,
|
||||
"stats": {"activatedLayers":250,"bossDamage":479924,"dmgDealt":3139636,"gold":139,"itemsEquipped":12,"kills":333,"leaks":7,"lpLost":7,"merges":5,"perfectRounds":12,"refreshes":23},
|
||||
"stats": {"activatedLayers":250,"bossDamage":509077,"dmgDealt":3168469,"gold":139,"itemsEquipped":12,"kills":334,"leaks":7,"lpLost":7,"merges":5,"perfectRounds":12,"refreshes":23},
|
||||
"lineup": ["3_19_b@11,7[2_04_e_b]","5_12_a@11,8","4_10_a@10,5[1_02_e_b+2_01_e_a]","6_06_a@9,4","1_08_b@9,5","6_16_a@9,7","5_20_a@9,8[3_05_e_a+3_02_e_b]","3_13_b@9,9"],
|
||||
"bonds": ["arcaneShip 2/86","miraShip 1/12","preciShip 0/10","sargonShip 0/10","siracusaShip 1/110","skillfulShip 1/36","soloShip 1/6","suntShip 1/0","swiftShip 0/32"]
|
||||
},
|
||||
@@ -614,7 +614,7 @@
|
||||
"title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"},
|
||||
"trophies": 4,
|
||||
"reward": 400,
|
||||
"stats": {"activatedLayers":199,"bossDamage":937576,"dmgDealt":3727447,"gold":137,"itemsEquipped":18,"kills":321,"leaks":8,"lpLost":7,"merges":5,"perfectRounds":11,"refreshes":13},
|
||||
"stats": {"activatedLayers":199,"bossDamage":908423,"dmgDealt":3696698,"gold":137,"itemsEquipped":18,"kills":321,"leaks":8,"lpLost":7,"merges":5,"perfectRounds":11,"refreshes":13},
|
||||
"lineup": ["4_20_a@12,8[3_06_e_a]","1_17_b@11,7[3_08_e_a]","4_02_b@11,8[3_02_e_a+4_03_e_b]","4_01_b@10,7[4_04_e_a+1_02_e_a]","6_17_a@10,8[4_06_e_a+4_08_e_a]","6_19_a@9,4[1_05_e_a+1_01_e_a]","4_14_a@9,8","5_07_a@9,9"],
|
||||
"bonds": ["arcaneShip 2/34","kazimierzShip 1/38","kjeragShip 0/8","lateranoShip 0/8","preciShip 2/55","raidShip 1/0","sargonShip 0/10","suntShip 1/0","swiftShip 1/72"]
|
||||
}
|
||||
@@ -1051,7 +1051,7 @@
|
||||
},
|
||||
{
|
||||
"round": 2,
|
||||
"ai_0": [1,45,5,0,0,1,4,"e8a46594",4,"kazimierzShip 0/4, swiftShip 1/4",8,8,0,9],
|
||||
"ai_0": [1,45,5,0,0,1,4,"62de86cd",4,"kazimierzShip 0/4, swiftShip 1/4",8,8,0,9],
|
||||
"ai_1": [1,26,5,0,0,1,4,"a2ec5116",5,"kazimierzShip 0/5, sargonShip 0/2, soloShip 1/0, swiftShip 1/5",8,8,0,9],
|
||||
"ai_2": [1,28,5,0,0,1,3,"70d74d61",0,"deputShip 0/4, kjeragShip 0/2, soloShip 1/0, victoriaShip 0/6",7,8,1,9],
|
||||
"ai_3": [1,26,5,0,0,1,4,"9e98d014",0,"sargonShip 0/2, soloShip 1/0",8,8,0,9]
|
||||
@@ -1074,63 +1074,63 @@
|
||||
"round": 5,
|
||||
"ai_0": [1,35,9,0,0,3,8,"62c03eb5",8,"arcaneShip 0/8, kazimierzShip 0/4, preciShip 0/8, swiftShip 1/8",4,17,13,32],
|
||||
"ai_1": [1,16,9,0,0,3,8,"f7768b7d",8,"arcaneShip 1/2, kazimierzShip 0/5, kjeragShip 0/2, preciShip 0/2, sargonShip 0/4, soloShip 1/0, steadShip 0/2, swiftShip 1/6",5,17,12,30],
|
||||
"ai_2": [1,20,11,0,0,3,8,"246c804d",22,"deputShip 1/10, kazimierzShip 0/2, kjeragShip 0/12, siracusaShip 0/4, soloShip 1/8, steadShip 0/4, swiftShip 1/4, victoriaShip 0/12, yanShip 0/2",9,17,8,32],
|
||||
"ai_2": [1,21,11,0,0,3,8,"d90f1f12",24,"deputShip 1/10, kazimierzShip 0/2, kjeragShip 0/10, siracusaShip 0/4, skillfulShip 0/2, soloShip 1/8, steadShip 0/4, swiftShip 1/6, victoriaShip 0/10, yanShip 0/2",10,17,7,32],
|
||||
"ai_3": [1,16,8,0,0,3,8,"080ecfab",3,"arcaneShip 0/2, preciShip 0/2, sargonShip 0/2, siracusaShip 1/0, soloShip 1/3",3,17,14,31]
|
||||
},
|
||||
{
|
||||
"round": 6,
|
||||
"ai_0": [1,35,9,0,0,3,8,"844b219a",33,"arcaneShip 0/8, kazimierzShip 0/4, kjeragShip 0/5, preciShip 2/20, suntShip 1/0, swiftShip 1/13",14,14,0,41],
|
||||
"ai_1": [1,16,9,0,0,3,8,"6faf7f5a",34,"arcaneShip 0/2, deputShip 1/2, kazimierzShip 1/13, kjeragShip 0/2, preciShip 0/2, sargonShip 0/4, siracusaShip 0/6, soloShip 1/2, steadShip 0/2, swiftShip 1/17",13,14,1,40],
|
||||
"ai_2": [1,20,9,0,0,3,8,"b0c01f2d",53,"deputShip 1/13, egirShip 0/2, kazimierzShip 0/4, kjeragShip 0/12, raidShip 0/2, siracusaShip 0/4, soloShip 1/12, steadShip 2/18, swiftShip 1/10, victoriaShip 0/12, yanShip 0/2",14,14,0,41],
|
||||
"ai_2": [1,21,9,0,0,3,8,"b0c01f2d",55,"deputShip 1/12, egirShip 0/2, kazimierzShip 0/4, kjeragShip 0/10, raidShip 0/2, siracusaShip 0/4, skillfulShip 0/2, soloShip 1/12, steadShip 2/18, swiftShip 1/13, victoriaShip 0/10, yanShip 0/2",14,14,0,41],
|
||||
"ai_3": [1,16,9,0,0,3,8,"06355ccd",24,"arcaneShip 0/2, deputShip 1/2, preciShip 0/2, sargonShip 1/9, siracusaShip 1/8, soloShip 1/5",6,14,8,41]
|
||||
},
|
||||
{
|
||||
"round": 7,
|
||||
"ai_0": [1,25,10,0,0,4,8,"8510e7b4",45,"arcaneShip 0/8, kazimierzShip 0/4, kjeragShip 0/5, preciShip 2/27, suntShip 1/0, swiftShip 1/18",7,21,14,51],
|
||||
"ai_1": [1,6,10,0,0,4,8,"017dac16",57,"arcaneShip 1/4, deputShip 1/4, kazimierzShip 1/27, kjeragShip 0/2, preciShip 0/2, sargonShip 0/4, siracusaShip 0/6, soloShip 0/2, steadShip 0/2, swiftShip 1/22",4,21,17,49],
|
||||
"ai_2": [1,20,10,0,0,4,8,"0c6b8294",80,"deputShip 1/15, egirShip 0/4, kazimierzShip 0/4, kjeragShip 0/14, raidShip 0/4, siracusaShip 0/4, skillfulShip 0/2, soloShip 1/14, steadShip 2/35, swiftShip 1/16, victoriaShip 0/12, yanShip 0/2",21,21,0,52],
|
||||
"ai_2": [1,21,10,0,0,4,8,"0c6b8294",82,"deputShip 1/14, egirShip 0/4, kazimierzShip 0/4, kjeragShip 0/12, raidShip 0/4, siracusaShip 0/4, skillfulShip 0/4, soloShip 1/14, steadShip 2/35, swiftShip 1/19, victoriaShip 0/10, yanShip 0/2",21,21,0,52],
|
||||
"ai_3": [1,6,10,0,0,4,8,"1968962a",25,"arcaneShip 0/2, deputShip 1/4, preciShip 0/2, sargonShip 0/9, siracusaShip 1/12, skillfulShip 1/2, soloShip 1/7",2,21,19,52]
|
||||
},
|
||||
{
|
||||
"round": 8,
|
||||
"ai_0": [1,21,11,0,0,4,8,"8a1b740d",78,"arcaneShip 1/10, deputShip 1/2, kazimierzShip 0/7, kjeragShip 0/5, preciShip 2/36, suntShip 1/2, swiftShip 1/28",5,9,4,61],
|
||||
"ai_1": [0,0,11,0,0,4,0,"811c9dc5",0,"arcaneShip 0/4, deputShip 0/8, emptyShip 0/4, kazimierzShip 0/38, kjeragShip 0/2, preciShip 0/2, sargonShip 0/8, siracusaShip 0/6, soloShip 0/6, steadShip 0/2, swiftShip 0/22",2,9,7,60],
|
||||
"ai_2": [1,14,11,0,0,4,8,"4075ce4e",91,"arcaneShip 2/9, deputShip 1/19, egirShip 0/6, kazimierzShip 0/4, kjeragShip 0/14, lateranoShip 0/2, raidShip 0/4, siracusaShip 0/4, skillfulShip 0/2, soloShip 1/18, steadShip 1/45, swiftShip 0/18, victoriaShip 0/12, yanShip 0/2",3,9,6,63],
|
||||
"ai_2": [1,15,11,0,0,4,8,"4075ce4e",90,"arcaneShip 2/9, deputShip 1/18, egirShip 0/6, kazimierzShip 0/4, kjeragShip 0/12, lateranoShip 0/2, raidShip 0/4, siracusaShip 0/4, skillfulShip 0/4, soloShip 1/18, steadShip 1/45, swiftShip 0/21, victoriaShip 0/10, yanShip 0/2",3,9,6,63],
|
||||
"ai_3": [0,0,11,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, deputShip 0/6, preciShip 0/2, sargonShip 0/9, siracusaShip 0/26, skillfulShip 0/4, soloShip 0/9, swiftShip 0/6",0,9,9,63]
|
||||
},
|
||||
{
|
||||
"round": 9,
|
||||
"ai_0": [1,21,12,0,1,4,8,"82251d49",167,"arcaneShip 2/16, deputShip 0/2, indomShip 1/12, kazimierzShip 1/37, kjeragShip 0/5, preciShip 2/67, suntShip 1/2, swiftShip 1/33",8,19,11,73],
|
||||
"ai_1": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/4, deputShip 0/8, emptyShip 0/4, kazimierzShip 0/38, kjeragShip 0/2, preciShip 0/2, sargonShip 0/8, siracusaShip 0/6, soloShip 0/6, steadShip 0/2, swiftShip 0/22",null,null,null,60],
|
||||
"ai_2": [1,14,12,0,1,4,8,"33626d88",141,"arcaneShip 2/18, deputShip 1/23, egirShip 0/8, kazimierzShip 0/4, kjeragShip 0/14, lateranoShip 0/4, raidShip 0/4, siracusaShip 0/4, skillfulShip 1/4, soloShip 1/22, steadShip 1/56, swiftShip 0/18, victoriaShip 1/18, yanShip 0/2",19,19,0,76],
|
||||
"ai_2": [1,15,12,0,1,4,8,"33626d88",141,"arcaneShip 2/18, deputShip 1/22, egirShip 0/8, kazimierzShip 0/4, kjeragShip 0/12, lateranoShip 0/4, raidShip 0/4, siracusaShip 0/4, skillfulShip 1/6, soloShip 1/22, steadShip 1/57, swiftShip 0/21, victoriaShip 1/16, yanShip 0/2",19,19,0,76],
|
||||
"ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, deputShip 0/6, preciShip 0/2, sargonShip 0/9, siracusaShip 0/26, skillfulShip 0/4, soloShip 0/9, swiftShip 0/6",null,null,null,63]
|
||||
},
|
||||
{
|
||||
"round": 10,
|
||||
"ai_0": [1,21,13,0,2,5,8,"a8c1652a",219,"arcaneShip 2/16, deputShip 0/2, indomShip 1/24, kazimierzShip 1/55, kjeragShip 0/5, preciShip 2/84, suntShip 1/2, swiftShip 1/38",15,25,10,86],
|
||||
"ai_1": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/4, deputShip 0/8, emptyShip 0/4, kazimierzShip 0/38, kjeragShip 0/2, preciShip 0/2, sargonShip 0/8, siracusaShip 0/6, soloShip 0/6, steadShip 0/2, swiftShip 0/22",null,null,null,60],
|
||||
"ai_2": [1,14,13,0,2,5,8,"b6041c07",180,"arcaneShip 2/27, deputShip 1/27, egirShip 0/10, kazimierzShip 0/4, kjeragShip 0/14, lateranoShip 0/4, raidShip 0/4, siracusaShip 0/4, skillfulShip 1/8, soloShip 1/24, steadShip 1/66, swiftShip 0/18, victoriaShip 1/28, yanShip 0/2",25,25,0,88],
|
||||
"ai_2": [1,15,13,0,2,5,8,"b6041c07",181,"arcaneShip 2/27, deputShip 1/26, egirShip 0/10, kazimierzShip 0/4, kjeragShip 0/12, lateranoShip 0/4, raidShip 0/4, siracusaShip 0/4, skillfulShip 1/10, soloShip 1/24, steadShip 1/68, swiftShip 0/21, victoriaShip 1/26, yanShip 0/2",25,25,0,88],
|
||||
"ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, deputShip 0/6, preciShip 0/2, sargonShip 0/9, siracusaShip 0/26, skillfulShip 0/4, soloShip 0/9, swiftShip 0/6",null,null,null,63]
|
||||
},
|
||||
{
|
||||
"round": 11,
|
||||
"ai_0": [1,11,14,0,3,5,8,"7de6a28e",283,"arcaneShip 2/22, deputShip 0/2, indomShip 0/24, kazimierzShip 1/86, kjeragShip 0/16, preciShip 2/102, suntShip 1/2, swiftShip 1/71",10,25,15,101],
|
||||
"ai_1": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/4, deputShip 0/8, emptyShip 0/4, kazimierzShip 0/38, kjeragShip 0/2, preciShip 0/2, sargonShip 0/8, siracusaShip 0/6, soloShip 0/6, steadShip 0/2, swiftShip 0/22",null,null,null,60],
|
||||
"ai_2": [1,8,14,0,1,5,8,"e9b19bda",236,"arcaneShip 1/37, deputShip 2/33, egirShip 0/10, kazimierzShip 0/4, kjeragShip 0/14, lateranoShip 0/4, raidShip 0/4, siracusaShip 0/4, skillfulShip 1/14, soloShip 1/30, steadShip 1/80, suntShip 1/4, swiftShip 0/18, victoriaShip 1/38, yanShip 0/4",19,25,6,102],
|
||||
"ai_2": [1,9,14,0,1,5,8,"e9b19bda",237,"arcaneShip 1/37, deputShip 2/32, egirShip 0/10, kazimierzShip 0/4, kjeragShip 0/12, lateranoShip 0/4, raidShip 0/4, siracusaShip 0/4, skillfulShip 1/16, soloShip 1/30, steadShip 1/82, suntShip 1/4, swiftShip 0/21, victoriaShip 1/36, yanShip 0/4",19,25,6,102],
|
||||
"ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, deputShip 0/6, preciShip 0/2, sargonShip 0/9, siracusaShip 0/26, skillfulShip 0/4, soloShip 0/9, swiftShip 0/6",null,null,null,63]
|
||||
},
|
||||
{
|
||||
"round": 12,
|
||||
"ai_0": [1,1,15,0,0,6,8,"2ed340cf",329,"arcaneShip 2/22, deputShip 0/2, indomShip 0/24, kazimierzShip 1/104, kjeragShip 0/16, preciShip 2/115, suntShip 1/2, swiftShip 1/86",8,47,39,115],
|
||||
"ai_1": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/4, deputShip 0/8, emptyShip 0/4, kazimierzShip 0/38, kjeragShip 0/2, preciShip 0/2, sargonShip 0/8, siracusaShip 0/6, soloShip 0/6, steadShip 0/2, swiftShip 0/22",null,null,null,60],
|
||||
"ai_2": [0,0,13,0,0,5,0,"811c9dc5",0,"arcaneShip 0/55, deputShip 0/37, egirShip 0/10, kazimierzShip 0/4, kjeragShip 0/14, lateranoShip 0/4, raidShip 0/4, siracusaShip 0/6, skillfulShip 0/24, soloShip 0/34, steadShip 0/96, suntShip 0/6, swiftShip 0/18, victoriaShip 0/44, yanShip 0/6",24,47,23,114],
|
||||
"ai_2": [0,0,13,0,0,5,0,"811c9dc5",0,"arcaneShip 0/55, deputShip 0/36, egirShip 0/10, kazimierzShip 0/4, kjeragShip 0/12, lateranoShip 0/4, raidShip 0/4, siracusaShip 0/6, skillfulShip 0/26, soloShip 0/34, steadShip 0/98, suntShip 0/6, swiftShip 0/21, victoriaShip 0/42, yanShip 0/6",20,47,27,114],
|
||||
"ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, deputShip 0/6, preciShip 0/2, sargonShip 0/9, siracusaShip 0/26, skillfulShip 0/4, soloShip 0/9, swiftShip 0/6",null,null,null,63]
|
||||
},
|
||||
{
|
||||
"round": 13,
|
||||
"ai_0": [0,0,12,0,0,6,0,"811c9dc5",0,"arcaneShip 0/32, deputShip 0/2, indomShip 0/24, kazimierzShip 0/119, kjeragShip 0/19, preciShip 0/129, suntShip 0/2, swiftShip 0/107",10,39,29,126],
|
||||
"ai_1": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/4, deputShip 0/8, emptyShip 0/4, kazimierzShip 0/38, kjeragShip 0/2, preciShip 0/2, sargonShip 0/8, siracusaShip 0/6, soloShip 0/6, steadShip 0/2, swiftShip 0/22",null,null,null,60],
|
||||
"ai_2": [0,0,0,0,0,5,0,"811c9dc5",0,"arcaneShip 0/55, deputShip 0/37, egirShip 0/10, kazimierzShip 0/4, kjeragShip 0/14, lateranoShip 0/4, raidShip 0/4, siracusaShip 0/6, skillfulShip 0/24, soloShip 0/34, steadShip 0/96, suntShip 0/6, swiftShip 0/18, victoriaShip 0/44, yanShip 0/6",null,null,null,114],
|
||||
"ai_2": [0,0,0,0,0,5,0,"811c9dc5",0,"arcaneShip 0/55, deputShip 0/36, egirShip 0/10, kazimierzShip 0/4, kjeragShip 0/12, lateranoShip 0/4, raidShip 0/4, siracusaShip 0/6, skillfulShip 0/26, soloShip 0/34, steadShip 0/98, suntShip 0/6, swiftShip 0/21, victoriaShip 0/42, yanShip 0/6",null,null,null,114],
|
||||
"ai_3": [0,0,0,0,0,4,0,"811c9dc5",0,"arcaneShip 0/2, deputShip 0/6, preciShip 0/2, sargonShip 0/9, siracusaShip 0/26, skillfulShip 0/4, soloShip 0/9, swiftShip 0/6",null,null,null,63]
|
||||
}
|
||||
],
|
||||
@@ -1145,7 +1145,7 @@
|
||||
"title": {"id":"comment_4","name":"精英云集","picId":"comment_icon_4","text":"晋升精锐次数最多"},
|
||||
"trophies": 3,
|
||||
"reward": 298,
|
||||
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":3520258,"gold":126,"itemsEquipped":13,"kills":113,"leaks":135,"lpLost":54,"merges":3,"perfectRounds":5,"refreshes":15},
|
||||
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":3517086,"gold":126,"itemsEquipped":13,"kills":113,"leaks":135,"lpLost":54,"merges":3,"perfectRounds":5,"refreshes":15},
|
||||
"lineup": [],
|
||||
"bonds": ["arcaneShip 0/32","deputShip 0/2","indomShip 0/24","kazimierzShip 0/119","kjeragShip 0/19","preciShip 0/129","suntShip 0/2","swiftShip 0/107"]
|
||||
},
|
||||
@@ -1159,7 +1159,7 @@
|
||||
"title": null,
|
||||
"trophies": 1,
|
||||
"reward": 149,
|
||||
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":828223,"gold":60,"itemsEquipped":3,"kills":61,"leaks":37,"lpLost":27,"merges":1,"perfectRounds":4,"refreshes":3},
|
||||
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":822166,"gold":60,"itemsEquipped":3,"kills":61,"leaks":37,"lpLost":27,"merges":1,"perfectRounds":4,"refreshes":3},
|
||||
"lineup": [],
|
||||
"bonds": ["arcaneShip 0/4","deputShip 0/8","emptyShip 0/4","kazimierzShip 0/38","kjeragShip 0/2","preciShip 0/2","sargonShip 0/8","siracusaShip 0/6","soloShip 0/6","steadShip 0/2","swiftShip 0/22"]
|
||||
},
|
||||
@@ -1173,9 +1173,9 @@
|
||||
"title": {"id":"comment_6","name":"挥金如土","picId":"comment_icon_6","text":"消耗资金最多"},
|
||||
"trophies": 2,
|
||||
"reward": 255,
|
||||
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":4946661,"gold":114,"itemsEquipped":8,"kills":200,"leaks":47,"lpLost":30,"merges":3,"perfectRounds":6,"refreshes":20},
|
||||
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":4886604,"gold":114,"itemsEquipped":8,"kills":196,"leaks":50,"lpLost":29,"merges":3,"perfectRounds":6,"refreshes":20},
|
||||
"lineup": [],
|
||||
"bonds": ["arcaneShip 0/55","deputShip 0/37","egirShip 0/10","kazimierzShip 0/4","kjeragShip 0/14","lateranoShip 0/4","raidShip 0/4","siracusaShip 0/6","skillfulShip 0/24","soloShip 0/34","steadShip 0/96","suntShip 0/6","swiftShip 0/18","victoriaShip 0/44","yanShip 0/6"]
|
||||
"bonds": ["arcaneShip 0/55","deputShip 0/36","egirShip 0/10","kazimierzShip 0/4","kjeragShip 0/12","lateranoShip 0/4","raidShip 0/4","siracusaShip 0/6","skillfulShip 0/26","soloShip 0/34","steadShip 0/98","suntShip 0/6","swiftShip 0/21","victoriaShip 0/42","yanShip 0/6"]
|
||||
},
|
||||
"ai_3": {
|
||||
"alive": false,
|
||||
@@ -1382,7 +1382,7 @@
|
||||
"title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"},
|
||||
"trophies": 0,
|
||||
"reward": 425,
|
||||
"stats": {"activatedLayers":2281,"bossDamage":4580000,"dmgDealt":6374918,"gold":175,"itemsEquipped":25,"kills":377,"leaks":0,"lpLost":0,"merges":5,"perfectRounds":13,"refreshes":34},
|
||||
"stats": {"activatedLayers":2281,"bossDamage":4580000,"dmgDealt":6374752,"gold":175,"itemsEquipped":25,"kills":377,"leaks":0,"lpLost":0,"merges":5,"perfectRounds":13,"refreshes":34},
|
||||
"lineup": ["4_02_b@12,7[3_08_e_a+1_02_e_b]","6_01_a@12,8[3_03_e_a+3_02_e_a]","6_16_a@11,5","3_18_a@11,8[4_11_e_a+4_05_e_b]","4_10_a@10,4[1_05_e_b]","6_05_a@10,5","4_01_b@10,6[4_06_e_a+4_05_e_a]","1_08_b@9,9[4_10_e_a]"],
|
||||
"bonds": ["arcaneShip 2/389","deputShip 0/300","egirShip 0/300","emptyShip 0/300","indomShip 0/308","investShip 0/300","kazimierzShip 0/308","kjeragShip 0/300","lateranoShip 1/322","maniShip 0/300","miraShip 0/300","preciShip 1/302","raidShip 0/300","sargonShip 0/300","siracusaShip 1/345","skillfulShip 0/335","soloShip 1/307","steadShip 0/300","suntShip 1/300","swiftShip 1/316","victoriaShip 0/300","visiShip 0/300","yanShip 0/300"]
|
||||
}
|
||||
@@ -1590,7 +1590,7 @@
|
||||
"title": {"id":"comment_4","name":"精英云集","picId":"comment_icon_4","text":"晋升精锐次数最多"},
|
||||
"trophies": 4,
|
||||
"reward": 400,
|
||||
"stats": {"activatedLayers":201,"bossDamage":239344,"dmgDealt":2835179,"gold":134,"itemsEquipped":22,"kills":267,"leaks":45,"lpLost":14,"merges":3,"perfectRounds":10,"refreshes":21},
|
||||
"stats": {"activatedLayers":201,"bossDamage":240142,"dmgDealt":2837269,"gold":134,"itemsEquipped":22,"kills":267,"leaks":45,"lpLost":14,"merges":3,"perfectRounds":10,"refreshes":21},
|
||||
"lineup": ["6_18_a@12,3[2_01_e_b]","4_10_a@12,4","1_17_b@11,3[4_03_e_a+1_01_e_a]","5_20_a@11,8[6_05_e_a+3_06_e_a]","3_17_b@10,3","3_12_a@10,4[1_02_e_a+3_11_e_a]","5_07_a@10,7[4_02_e_b+4_11_e_a]","1_19_b@10,8[2_01_e_b+4_04_e_b]"],
|
||||
"bonds": ["arcaneShip 2/21","kazimierzShip 1/60","miraShip 1/12","preciShip 0/8","raidShip 1/96","siracusaShip 1/12","skillfulShip 0/3","soloShip 1/0","suntShip 1/0","swiftShip 0/23","yanShip 0/1"]
|
||||
},
|
||||
@@ -1604,7 +1604,7 @@
|
||||
"title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"},
|
||||
"trophies": 4,
|
||||
"reward": 400,
|
||||
"stats": {"activatedLayers":314,"bossDamage":540656,"dmgDealt":3686133,"gold":140,"itemsEquipped":17,"kills":311,"leaks":3,"lpLost":3,"merges":3,"perfectRounds":12,"refreshes":22},
|
||||
"stats": {"activatedLayers":314,"bossDamage":539858,"dmgDealt":3683624,"gold":140,"itemsEquipped":17,"kills":311,"leaks":3,"lpLost":3,"merges":3,"perfectRounds":12,"refreshes":22},
|
||||
"lineup": ["3_21_a@12,3[4_08_e_a+6_02_e_a]","4_25_a@12,4","2_01_a@12,5[3_01_e_a]","6_12_a@11,3[1_05_e_a+3_11_e_a]","4_14_b@11,4[1_05_e_b+4_07_e_a]","1_01_b@10,3[3_08_e_a]","5_01_a@10,4[4_05_e_a]","2_13_a@9,4[4_02_e_b]"],
|
||||
"bonds": ["arcaneShip 0/2","deputShip 0/16","emptyShip 1/0","kazimierzShip 0/8","lateranoShip 1/62","preciShip 2/85","sargonShip 0/2","skillfulShip 1/34","soloShip 0/5","suntShip 1/14","swiftShip 1/116","visiShip 1/3"]
|
||||
}
|
||||
|
||||
+107
-105
@@ -530,7 +530,7 @@
|
||||
"hooks": [1,137,5100,539,539,1072,1167,387,62,130,21,23,0,8443,79,46,88,37,1,68,12,12,0],
|
||||
"events": {"atk":636,"bounty":4,"deploy":49,"die":93,"dmg":1087,"engage":12,"fx":233,"heal":386,"layer":12,"leak":37,"skill":47,"spawn":128,"status":128},
|
||||
"fx": {"aoe":20,"blink":3,"buff":1,"burst":12,"coin":29,"displace":33,"explode":34,"garrison":8,"layer":4,"pull":33,"revive":6,"shield":1,"shieldBreak":1,"strike":9,"summon":29,"telegraph":1,"volley":9},
|
||||
"snaps": "17903402 6c8167ba 07381013 82bb886b 608b7ec4 49a9f161 e85b61cf 67fd6d17 22a61f87 b284b6f6 4e0b242d df66d3a4 158e2cfb 11543d94 9a2ac26f d2946799 f4dc978a"
|
||||
"snaps": "17903402 6c8167ba 07381013 82bb886b 608b7ec4 49a9f161 e85b61cf 67fd6d17 2e8295ec 7b44cd2f fe281674 1329f3f1 89e58c86 949f3155 0fac869a 91bdd7cc 305f7a07"
|
||||
},
|
||||
"roster-009": {
|
||||
"about": "pass 0 band 4: chess_char_3_16_b chess_char_4_01_a chess_char_3_18_b chess_char_4_04_a chess_char_3_13_b chess_char_3_14_b chess_char_3_17_b chess_char_3_19_b chess_char_3_20_b chess_char_3_21_b chess_char_4_02_a chess_char_4_06_a token_10028_vigil_wolf",
|
||||
@@ -605,27 +605,27 @@
|
||||
"time": 170,
|
||||
"ticks": 5100,
|
||||
"reason": "timeout",
|
||||
"killed": 44,
|
||||
"killed": 45,
|
||||
"total": 69,
|
||||
"unspawned": 0,
|
||||
"bossHpLeft": null,
|
||||
"rngDraws": 94,
|
||||
"rngDraws": 103,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {
|
||||
"p1": {"killed":44,"total":69,"perfect":false,"leaks":58,"leaksUncounted":0,"coins":4,"dmg":438561,"bossDmg":0,"heal":3295,"deaths":23,"layerGains":{"preciShip":12}}
|
||||
"p1": {"killed":45,"total":69,"perfect":false,"leaks":57,"leaksUncounted":0,"coins":4,"dmg":449532,"bossDmg":0,"heal":3358,"deaths":23,"layerGains":{"preciShip":12}}
|
||||
},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_4_17_a",1,null,0,0,5,0,7251,2849,0,14,0],
|
||||
["p1",1,"op","chess_char_4_17_a",1,null,0,0,5,0,4451,2849,0,9,0],
|
||||
["p1",2,"op","chess_char_4_18_a",1,null,0,0,6,0,3167,4489,1622,4,4],
|
||||
["p1",3,"op","chess_char_4_11_a",1,null,2144,1,133,0,1453,2934,0,3,1],
|
||||
["p1",4,"op","chess_char_4_19_a",2,null,0,0,90,1,12530,3120,0,27,1],
|
||||
["p1",5,"op","chess_char_4_07_a",1,null,1738,1,134,0,1793,3476,0,2,1],
|
||||
["p1",6,"op","chess_char_4_16_a",2,null,0,0,126,3,97746,7475,1245,36,6],
|
||||
["p1",6,"op","chess_char_4_16_a",2,null,0,0,126,6,110802,7475,1245,36,8],
|
||||
["p1",7,"op","chess_char_4_09_a",1,null,0,0,120,0,30872,2672,0,19,1],
|
||||
["p1",8,"op","chess_char_4_10_a",1,null,0,0,107,1,31925,4894,0,18,1],
|
||||
["p1",9,"op","chess_char_4_12_a",2,null,0,0,100,2,25457,3936,428,18,1],
|
||||
["p1",10,"op","chess_char_4_13_a",1,null,0,0,96,1,30391,3174,0,50,4],
|
||||
["p1",11,"op","chess_char_4_14_a",1,null,0,0,88,16,161487,2552,0,27,3],
|
||||
["p1",8,"op","chess_char_4_10_a",1,null,0,0,107,0,35046,4379,0,18,1],
|
||||
["p1",9,"op","chess_char_4_12_a",2,null,0,0,104,2,29828,3999,491,22,1],
|
||||
["p1",10,"op","chess_char_4_13_a",1,null,0,0,96,1,30170,3174,0,50,4],
|
||||
["p1",11,"op","chess_char_4_14_a",1,null,0,0,88,15,154931,2552,0,26,2],
|
||||
["p1",12,"op","chess_char_4_20_a",2,null,0,0,4,4,34490,1217,0,13,1],
|
||||
["p1",13,"token","token_10041_cathy_catsld",null,null,100,1,17,0,0,0,0,0,null],
|
||||
["p1",14,"token","token_10041_cathy_catsld",null,null,100,1,16,0,0,0,0,0,null],
|
||||
@@ -635,26 +635,26 @@
|
||||
],
|
||||
"enemies": {
|
||||
"enemy_10034_cnvsax": [1,1,0,344,42998],
|
||||
"enemy_1005_yokai": [24,17,7,0,63503],
|
||||
"enemy_1005_yokai_2": [27,8,14,4609,74481],
|
||||
"enemy_1005_yokai_3": [6,0,5,17480,104731],
|
||||
"enemy_1005_yokai": [24,17,7,0,62851],
|
||||
"enemy_1005_yokai_2": [27,8,14,5642,74644],
|
||||
"enemy_1005_yokai_3": [6,0,5,17677,107239],
|
||||
"enemy_10083_hlbird": [1,1,0,0,6450],
|
||||
"enemy_10144_xdelk_2": [1,0,1,2927,45336],
|
||||
"enemy_1050_lslime": [1,0,1,9539,20439],
|
||||
"enemy_10144_xdelk_2": [1,0,1,2071,43624],
|
||||
"enemy_1050_lslime": [1,0,1,9318,18436],
|
||||
"enemy_1158_divman": [1,1,0,461,14189],
|
||||
"enemy_1174_duholy_2": [1,0,1,1152,6043],
|
||||
"enemy_1174_duholy_2": [1,0,1,2697,5206],
|
||||
"enemy_1204_msfhu_2": [1,0,1,0,10],
|
||||
"enemy_1267_nhpbr_2": [1,0,1,160,8090],
|
||||
"enemy_1269_nhfly": [33,16,17,5535,27200],
|
||||
"enemy_1321_wdarft": [1,0,1,0,3974],
|
||||
"enemy_1269_nhfly": [33,17,16,3903,39468],
|
||||
"enemy_1321_wdarft": [1,0,1,0,5210],
|
||||
"enemy_1422_lrsldr_2": [1,0,1,0,21116],
|
||||
"enemy_1516_jakill": [1,0,1,582,0],
|
||||
"enemy_1516_jakill": [1,0,1,62,0],
|
||||
"enemy_2034_sythef_2": [1,0,1,0,0]
|
||||
},
|
||||
"hooks": [1,132,5100,442,442,1125,1088,303,68,119,24,25,0,7928,385,11,102,52,1,201,3,0,23],
|
||||
"events": {"atk":540,"bounty":2,"deploy":27,"die":67,"dmg":996,"engage":12,"fx":194,"heal":7,"layer":3,"leak":52,"skill":50,"spawn":119,"status":345},
|
||||
"fx": {"block":14,"catShield":2,"charge":1,"dilemma":1,"dodge":23,"explode":18,"explosion":3,"featherArrow":1,"flame":1,"frostNova":4,"garrison":3,"garrisonGrant":1,"overclock":1,"phase":1,"pull":1,"riposte":2,"rockslide":4,"shieldBreak":5,"slippery":1,"summon":11,"swordRain":46,"swordStorm":6,"telegraph":2,"thorns":29,"tornado":1,"tornadoPulse":5,"undying":7},
|
||||
"snaps": "06e15d5c 9c6e5b81 9f5d725d b13396df 98ecac6a f6ce7a0e 93fdfd13 934d9971 f00721d3 0f063f43 efae5003 e36862a5 bf3bd5e8 864b2548 d1bf8652 213491b2 c2b8be45"
|
||||
"hooks": [1,132,5100,458,458,1145,1095,348,71,119,25,26,0,8132,378,12,102,51,1,196,3,0,37],
|
||||
"events": {"atk":559,"bounty":2,"deploy":27,"die":68,"dmg":1003,"engage":12,"fx":198,"heal":7,"layer":3,"leak":51,"skill":52,"spawn":119,"status":336},
|
||||
"fx": {"block":13,"catShield":2,"charge":1,"dilemma":1,"dodge":37,"explode":18,"explosion":2,"featherArrow":1,"flame":1,"frostNova":4,"garrison":3,"garrisonGrant":1,"overclock":1,"phase":1,"pull":1,"riposte":2,"rockslide":4,"shieldBreak":5,"slippery":1,"summon":11,"swordRain":46,"swordStorm":8,"telegraph":2,"thorns":19,"tornado":1,"tornadoPulse":5,"undying":7},
|
||||
"snaps": "06e15d5c 9c6e5b81 da751fea a5ae2428 97a80096 c8fcdf97 64d0ee62 5c3cc2a5 2e2b9eaf 4fcef599 8d82eaa1 d0de5be5 8a6ea87e e5bfe3ac acd36acf 85f7790f 5c273449"
|
||||
},
|
||||
"roster-011": {
|
||||
"about": "pass 0 band 5: chess_char_4_23_a chess_char_4_01_b chess_char_4_22_a chess_char_4_04_b chess_char_4_07_b chess_char_4_09_b chess_char_4_21_a chess_char_4_24_a chess_char_4_25_a chess_char_4_26_a chess_char_4_02_b chess_char_4_06_b",
|
||||
@@ -1135,7 +1135,7 @@
|
||||
"hooks": [1,193,5965,895,895,1366,1742,349,184,186,46,43,123,35603,1303,179,174,0,1,193,3,3,0],
|
||||
"events": {"atk":910,"bounty":6,"deploy":19,"die":186,"dmg":1518,"engage":11,"fx":201,"heal":138,"layer":3,"skill":89,"spawn":188,"status":918},
|
||||
"fx": {"airstrike":33,"beam":6,"burst":3,"cleanse":3,"displace":1,"dp":3,"drone":50,"droneLock":21,"drones":1,"emergency":7,"explode":16,"finale":4,"garrison":3,"link":2,"scorchBurst":18,"slash":17,"steal":3,"summon":3,"sunBurst":2,"talent":3,"undying":2},
|
||||
"snaps": "43b03df4 4fcc619d 2be2121d b478fa2a 1c29c601 96aa34d3 0e886eac f600ec73 907ca853 552e1671 341eafc8 6e0f6a0b 372bf3a0 624a0dcc 83ca1bb1 b6c00e03 87871968 eb329c28 18669ab5 6b1c8ca3"
|
||||
"snaps": "43b03df4 4fcc619d 2be2121d b478fa2a 1c29c601 56106e78 be7b61ff 0ff4cff4 1bc98534 6e3313a6 46072d77 8a0c9240 af96efcf 63669eb7 35b980b6 b956f2fc 3ccb4cbf a09042c3 afc8db16 2cd17534"
|
||||
},
|
||||
"roster-018": {
|
||||
"about": "pass 0 band 7: chess_char_6_03_b chess_char_6_06_b chess_char_6_07_b chess_char_6_20_a chess_char_6_01_b chess_char_6_02_b chess_char_6_04_b chess_char_6_05_b chess_char_6_08_b chess_char_6_09_b chess_char_6_11_b chess_char_6_12_b token_10017_skadi2_dedant token_10030_mlyss_wtrman",
|
||||
@@ -2437,7 +2437,7 @@
|
||||
"hooks": [1,74,5100,1391,1391,1946,1946,3277,48,55,67,64,0,15874,103,86,53,0,1,48,6,0,0],
|
||||
"events": {"atk":1391,"bounty":3,"deploy":21,"die":55,"dmg":1946,"engage":12,"fx":145,"heal":8,"layer":6,"skill":131,"spawn":66,"status":167},
|
||||
"fx": {"aoe":31,"blink":4,"bondMilestone":1,"buff":6,"coin":50,"displace":8,"dp":20,"garrison":6,"shield":1,"volley":17,"wolfShadow":1},
|
||||
"snaps": "b7d44319 4fc048ae 28ee4e6e c9c603c2 55d0890f 7dc46b6f 45f82890 a80e21f1 4798eff8 d051d766 d7744b9f 8f75050e 6b39ddea 434592eb 4c2804c6 615628a3 81d412fe"
|
||||
"snaps": "b7d44319 4fc048ae 28ee4e6e c9c603c2 55d0890f 7dc46b6f 45f82890 a80e21f1 4798eff8 d051d766 d7744b9f 583b475f e78e6fcb 39dde0c2 615dd87b ff263872 66d1ef0f"
|
||||
},
|
||||
"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",
|
||||
@@ -2451,47 +2451,48 @@
|
||||
"time": 170,
|
||||
"ticks": 5100,
|
||||
"reason": "timeout",
|
||||
"killed": 28,
|
||||
"killed": 25,
|
||||
"total": 65,
|
||||
"unspawned": 0,
|
||||
"bossHpLeft": null,
|
||||
"rngDraws": 314,
|
||||
"rngDraws": 303,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {"p1":{"killed":28,"total":65,"perfect":false,"leaks":37,"leaksUncounted":0,"coins":4,"dmg":561208,"bossDmg":0,"heal":460,"deaths":29,"layerGains":{}}},
|
||||
"players": {"p1":{"killed":25,"total":65,"perfect":false,"leaks":40,"leaksUncounted":0,"coins":4,"dmg":452607,"bossDmg":0,"heal":259,"deaths":30,"layerGains":{}}},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_4_01_a",1,null,0,0,3,0,2677,2638,0,54,1],
|
||||
["p1",2,"op","chess_char_4_17_a",2,null,2438.68,1,104,1,17340,3259,0,29,1],
|
||||
["p1",3,"op","chess_char_4_18_a",2,null,0,0,8,0,15871,2867,0,14,1],
|
||||
["p1",4,"op","chess_char_4_04_a",2,null,395.34,1,103,8,65906,8405,0,48,5],
|
||||
["p1",5,"op","chess_char_4_07_a",2,null,0,0,84,0,2834,8690,0,12,1],
|
||||
["p1",6,"op","chess_char_4_16_a",1,null,641.81,1,102,0,62045,8080,0,23,7],
|
||||
["p1",7,"op","chess_char_4_09_a",2,null,969.81,1,92,1,19207,1702,0,20,1],
|
||||
["p1",8,"op","chess_char_3_19_b",1,"none",0,0,100,3,42286,3296,0,73,1],
|
||||
["p1",9,"op","chess_char_3_21_b",1,"uniequip_004_archet",0,0,93,4,165665,3180,0,71,8],
|
||||
["p1",10,"op","chess_char_4_02_a",1,null,0,0,88,5,60853,2856,0,20,1],
|
||||
["p1",11,"op","chess_char_4_12_a",1,null,0,0,89,3,41495,3968,460,36,1],
|
||||
["p1",12,"op","chess_char_4_13_a",2,null,0,0,77,3,65028,3174,0,64,1],
|
||||
["p1",13,"token","token_10028_vigil_wolf",null,null,567.5,0,101,0,0,3219,0,0,null],
|
||||
["p1",1,"op","chess_char_4_01_a",1,null,0,0,3,0,3597,2638,0,41,1],
|
||||
["p1",2,"op","chess_char_4_17_a",2,null,0,0,6,0,16600,2849,0,27,1],
|
||||
["p1",3,"op","chess_char_4_18_a",2,null,0,0,8,1,10381,2867,0,13,1],
|
||||
["p1",4,"op","chess_char_4_04_a",2,null,0,0,103,7,43034,8800,0,30,5],
|
||||
["p1",5,"op","chess_char_4_07_a",2,null,0,0,86,0,4731,8690,0,14,1],
|
||||
["p1",6,"op","chess_char_4_16_a",1,null,641.81,1,102,2,68490,8080,0,23,8],
|
||||
["p1",7,"op","chess_char_4_09_a",2,null,115.72,1,90,1,13963,2556,0,18,0],
|
||||
["p1",8,"op","chess_char_3_19_b",1,"none",0,0,100,1,26556,3296,0,29,2],
|
||||
["p1",9,"op","chess_char_3_21_b",1,"uniequip_004_archet",0,0,97,4,116075,3180,0,51,5],
|
||||
["p1",10,"op","chess_char_4_02_a",1,null,0,0,89,3,45957,2856,0,15,1],
|
||||
["p1",11,"op","chess_char_4_12_a",1,null,0,0,92,3,38081,3767,259,32,1],
|
||||
["p1",12,"op","chess_char_4_13_a",2,null,0,0,79,3,65141,3174,0,65,1],
|
||||
["p1",13,"token","token_10028_vigil_wolf",null,null,1026,0,5,0,0,0,0,0,null],
|
||||
["-","~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]
|
||||
["-","~2","device","trap_1105_accrate",null,null,100,1,2,0,0,0,0,0,null],
|
||||
["p1","~1","token","token_10028_vigil_wolf",null,null,37.28,0,101,0,0,989,0,0,null]
|
||||
],
|
||||
"enemies": {
|
||||
"enemy_1005_yokai": [24,14,10,0,58116],
|
||||
"enemy_1005_yokai_2": [27,10,13,11839,120127],
|
||||
"enemy_1005_yokai_3": [6,1,4,20879,232521],
|
||||
"enemy_1005_yokai": [24,9,15,0,48657],
|
||||
"enemy_1005_yokai_2": [27,13,10,10359,100199],
|
||||
"enemy_1005_yokai_3": [6,0,5,21416,160854],
|
||||
"enemy_10065_ftzlc": [1,1,0,0,16339],
|
||||
"enemy_10162_mnctpt": [1,0,1,6673,47734],
|
||||
"enemy_10162_mnctpt": [1,0,1,5618,44935],
|
||||
"enemy_1119_vofsd": [1,1,0,0,47298],
|
||||
"enemy_1196_msfyin_2": [1,1,0,0,7],
|
||||
"enemy_1254_lypa_2": [1,0,1,10588,31313],
|
||||
"enemy_1367_dseed": [1,0,1,0,2182],
|
||||
"enemy_1517_xi": [1,0,1,4956,5540],
|
||||
"enemy_9016_acstmr": [1,0,1,0,31]
|
||||
"enemy_1254_lypa_2": [1,0,1,10192,28315],
|
||||
"enemy_1367_dseed": [1,0,1,0,3083],
|
||||
"enemy_1517_xi": [1,0,1,6157,2919],
|
||||
"enemy_9016_acstmr": [1,0,1,0,0]
|
||||
},
|
||||
"hooks": [1,103,5100,734,734,1094,1100,320,58,92,29,28,19,10332,251,15,65,32,1,66,0,1,23],
|
||||
"events": {"atk":818,"bounty":2,"deploy":36,"die":60,"dmg":1093,"engage":12,"fx":111,"leak":32,"skill":57,"spawn":80,"status":271},
|
||||
"fx": {"beam":5,"block":3,"buff":2,"burst":1,"coldWind":1,"dodge":23,"dp":1,"explode":1,"iceSpike":1,"overclock":1,"overload":1,"revive":3,"ripple":1,"rockfall":1,"sentry":6,"shadowWeave":21,"shield":7,"shieldBreak":6,"stone":1,"summon":1,"swordStorm":7,"telegraph":3,"volley":8,"wake":1,"wolfShadow":1,"wolfShadowLost":3,"zone":1},
|
||||
"snaps": "1a929dbc 10d3e1a1 32c57a4c 453c40de 39991d46 d1badb60 93a80ae5 3f5fd356 9790cf11 f7a44c04 7d48a2d9 fcd195ec 791a30be ab595962 df33ce42 438bb413 ba2b787d"
|
||||
"hooks": [1,102,5100,586,586,889,896,185,56,93,27,27,29,10161,251,14,65,35,1,62,0,1,19],
|
||||
"events": {"atk":662,"bounty":2,"deploy":35,"die":58,"dmg":889,"engage":12,"fx":97,"leak":35,"skill":54,"spawn":81,"status":249},
|
||||
"fx": {"beam":5,"block":1,"buff":3,"burst":1,"coldWind":1,"dodge":19,"dp":2,"iceSpike":1,"overclock":1,"overload":1,"revive":3,"rockfall":1,"sentry":7,"shadowWeave":18,"shield":6,"shieldBreak":7,"stone":1,"summon":1,"swordStorm":8,"telegraph":2,"volley":5,"wake":1,"wolfShadow":1,"zone":1},
|
||||
"snaps": "1a929dbc 2a9d573b 1b8c4491 5b536db8 1136543b 22d35a84 76be0b3b 74b136ec 69dfdcfb e6164a7b 4296c4cc 91389b96 58585ad3 4166f7a4 c2076c45 15da2aea 88de94d6"
|
||||
},
|
||||
"roster-041": {
|
||||
"about": "pass 2 band 5: chess_char_4_23_a chess_char_4_01_b chess_char_4_19_a chess_char_4_22_a chess_char_4_04_b chess_char_4_07_b chess_char_4_09_b chess_char_4_20_a chess_char_4_24_a chess_char_4_25_a chess_char_4_02_b chess_char_4_12_b",
|
||||
@@ -2620,51 +2621,51 @@
|
||||
"round": 10,
|
||||
"seed": 955578768,
|
||||
"waveId": "act1autochess_h03",
|
||||
"time": 172.3,
|
||||
"ticks": 5169,
|
||||
"time": 168.4,
|
||||
"ticks": 5052,
|
||||
"reason": "cleared",
|
||||
"killed": 55,
|
||||
"total": 64,
|
||||
"unspawned": 0,
|
||||
"bossHpLeft": null,
|
||||
"rngDraws": 246,
|
||||
"rngDraws": 207,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {
|
||||
"p1": {"killed":55,"total":64,"perfect":false,"leaks":9,"leaksUncounted":0,"coins":4,"dmg":924251,"bossDmg":0,"heal":24122,"deaths":14,"layerGains":{"indomShip":45}}
|
||||
"p1": {"killed":55,"total":64,"perfect":false,"leaks":9,"leaksUncounted":0,"coins":4,"dmg":932398,"bossDmg":0,"heal":27434,"deaths":16,"layerGains":{"indomShip":50}}
|
||||
},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_5_08_a",1,null,0,0,4,6,95289,4902,1100,28,2],
|
||||
["p1",2,"op","chess_char_5_11_a",2,null,3618.8,1,90,0,8448,14018,1991,17,2],
|
||||
["p1",3,"op","chess_char_5_05_a",1,null,6209.3,1,65,4,73753,34284,10490,30,0],
|
||||
["p1",4,"op","chess_char_5_06_a",1,null,2863,1,75,5,96401,9833,4076,12,3],
|
||||
["p1",5,"op","chess_char_5_13_a",2,null,1546.02,1,37,9,101933,14783,0,38,1],
|
||||
["p1",1,"op","chess_char_5_08_a",1,null,0,0,82,6,104822,15494,4398,37,2],
|
||||
["p1",2,"op","chess_char_5_11_a",2,null,3618.8,1,93,0,8448,13778,1627,17,2],
|
||||
["p1",3,"op","chess_char_5_05_a",1,null,6129.73,1,64,4,73753,34484,10890,30,0],
|
||||
["p1",4,"op","chess_char_5_06_a",1,null,3088,1,74,5,94809,9508,4053,9,2],
|
||||
["p1",5,"op","chess_char_5_13_a",2,null,1268.06,1,37,4,110521,16317,0,31,1],
|
||||
["p1",6,"op","chess_char_5_14_a",2,null,1732,1,7,5,43541,7604,3392,63,1],
|
||||
["p1",7,"op","chess_char_5_07_a",1,null,2216,1,83,0,2357,3215,0,3,0],
|
||||
["p1",8,"op","chess_char_5_17_a",2,null,0,0,64,3,132702,9300,0,80,2],
|
||||
["p1",9,"op","chess_char_5_03_a",1,null,1206,1,6,6,131191,6253,3073,39,3],
|
||||
["p1",10,"op","chess_char_5_10_a",1,null,1162.34,1,66,3,27494,3656,0,52,1],
|
||||
["p1",11,"op","chess_char_5_12_a",2,null,698.68,1,68,4,90952,11059,0,36,1],
|
||||
["p1",12,"op","chess_char_5_15_a",2,null,926,1,58,10,120189,4993,0,83,2],
|
||||
["p1",7,"op","chess_char_5_07_a",1,null,2216,1,85,0,2357,3215,0,3,0],
|
||||
["p1",8,"op","chess_char_5_17_a",2,null,210.49,1,92,3,74277,8890,0,71,2],
|
||||
["p1",9,"op","chess_char_5_03_a",1,null,1206,1,6,8,132449,7458,3073,47,3],
|
||||
["p1",10,"op","chess_char_5_10_a",1,null,1184,1,65,3,27601,3784,0,53,1],
|
||||
["p1",11,"op","chess_char_5_12_a",2,null,694,1,67,7,93376,9964,0,35,1],
|
||||
["p1",12,"op","chess_char_5_15_a",2,null,926,1,58,10,166444,4638,0,80,2],
|
||||
["-","~1","device","trap_1105_accrate",null,null,100,0,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]
|
||||
],
|
||||
"enemies": {
|
||||
"enemy_10084_hlegle": [1,0,1,12642,5751],
|
||||
"enemy_10084_hlegle": [1,0,1,14081,5751],
|
||||
"enemy_1041_lazerd": [1,0,1,3650,3309],
|
||||
"enemy_1161_tidmag_2": [1,1,0,5338,13271],
|
||||
"enemy_1202_msfzhi_2": [1,1,0,0,7],
|
||||
"enemy_1267_nhpbr_2": [33,32,1,31192,294340],
|
||||
"enemy_1270_nhstlk_2": [12,12,0,33455,318505],
|
||||
"enemy_1267_nhpbr_2": [33,32,1,30642,294340],
|
||||
"enemy_1270_nhstlk_2": [12,12,0,34072,318505],
|
||||
"enemy_1275_dwlock_2": [1,1,0,5427,23224],
|
||||
"enemy_1422_lrsldr": [1,1,0,0,7797],
|
||||
"enemy_2004_balloon": [1,0,1,164,19473],
|
||||
"enemy_9006_actoxi": [12,7,5,15843,238573]
|
||||
"enemy_9006_actoxi": [12,7,5,25545,246720]
|
||||
},
|
||||
"hooks": [1,92,5169,715,715,2291,2389,4393,69,80,18,14,18,29847,766,70,64,9,1,95,9,7,2],
|
||||
"events": {"atk":816,"bounty":2,"deploy":25,"die":71,"dmg":2370,"engage":12,"fx":159,"heal":1157,"layer":9,"leak":9,"skill":32,"spawn":79,"status":457},
|
||||
"fx": {"aoe":6,"beam":1,"bloodBattle":1,"burst":7,"crit":23,"displace":35,"dodge":2,"dollEnd":1,"downed":2,"ember":1,"explode":1,"garrison":9,"meltdown":4,"overload":2,"reborn":1,"revive":7,"steal":2,"substitute":5,"swap":3,"telegraph":2,"zone":44},
|
||||
"snaps": "1683cbba c8489b09 157c0969 ce05ea97 58c14c23 9cb16f9e 18492dac 031d7b31 46a621ac f5de529b cee8a24f b70e4e74 39a90c54 b7a8e753 72f0deab a2ac15f9 ac8909ef f6c5d065"
|
||||
"hooks": [1,95,5052,738,738,2359,2458,4403,71,82,17,13,18,29900,758,69,64,9,1,100,10,7,2],
|
||||
"events": {"atk":830,"bounty":2,"deploy":28,"die":73,"dmg":2441,"engage":12,"fx":139,"heal":1172,"layer":10,"leak":9,"skill":30,"spawn":79,"status":459},
|
||||
"fx": {"aoe":4,"beam":1,"bloodBattle":4,"burst":7,"crit":17,"displace":14,"dodge":2,"dollEnd":1,"downed":2,"ember":1,"explode":1,"garrison":10,"meltdown":4,"overload":2,"reborn":1,"revive":9,"sp":2,"steal":2,"substitute":5,"swap":4,"telegraph":2,"zone":44},
|
||||
"snaps": "1683cbba c8489b09 157c0969 ce05ea97 58c14c23 9cb16f9e 18492dac 031d7b31 4b904e63 b211e3ee d11a8312 4281b6e2 e1ad888b 9a0fd348 01eabd74 f00f9646 2f7f3756"
|
||||
},
|
||||
"roster-044": {
|
||||
"about": "pass 2 band 6: chess_char_5_19_a chess_char_5_11_b chess_char_5_19_b chess_char_5_13_b chess_char_5_14_b chess_char_5_17_b chess_char_5_20_a chess_char_5_22_a chess_char_5_12_b chess_char_5_15_b chess_char_5_20_b chess_char_5_22_b",
|
||||
@@ -2675,29 +2676,29 @@
|
||||
"round": 12,
|
||||
"seed": 2595819878,
|
||||
"waveId": "act1autochess_h05",
|
||||
"time": 221,
|
||||
"ticks": 6630,
|
||||
"time": 209.8,
|
||||
"ticks": 6294,
|
||||
"reason": "cleared",
|
||||
"killed": 103,
|
||||
"total": 119,
|
||||
"unspawned": 0,
|
||||
"bossHpLeft": null,
|
||||
"rngDraws": 113,
|
||||
"rngDraws": 105,
|
||||
"errors": {"count":0,"kinds":[]},
|
||||
"players": {"p1":{"killed":103,"total":119,"perfect":false,"leaks":16,"leaksUncounted":0,"coins":8,"dmg":3407531,"bossDmg":0,"heal":38331,"deaths":14,"layerGains":{}}},
|
||||
"players": {"p1":{"killed":103,"total":119,"perfect":false,"leaks":16,"leaksUncounted":0,"coins":8,"dmg":3382286,"bossDmg":0,"heal":36169,"deaths":13,"layerGains":{}}},
|
||||
"units": [
|
||||
["p1",1,"op","chess_char_5_19_a",1,null,302.39,1,134,2,39813,13079,977,48,4],
|
||||
["p1",2,"op","chess_char_5_11_b",2,"none",3380.99,1,145,1,6275,17755,26578,36,3],
|
||||
["p1",3,"op","chess_char_5_19_b",1,"uniequip_002_mlynar",3907,1,106,2,91122,8834,1078,31,3],
|
||||
["p1",4,"op","chess_char_5_13_b",2,"uniequip_004_ghost2",3498.12,1,9,3,116180,10709,88,21,1],
|
||||
["p1",5,"op","chess_char_5_14_b",2,"none",0,0,142,16,280983,15962,4857,103,4],
|
||||
["p1",6,"op","chess_char_5_17_b",2,"none",2578,1,167,3,205432,15613,897,58,5],
|
||||
["p1",7,"op","chess_char_5_20_a",1,null,1108,1,3,1,39942,1688,424,345,5],
|
||||
["p1",8,"op","chess_char_5_22_a",2,null,1237,1,4,7,158291,5774,1373,152,3],
|
||||
["p1",9,"op","chess_char_5_12_b",2,"uniequip_004_dusk",1667,1,13,8,458856,0,0,64,2],
|
||||
["p1",10,"op","chess_char_5_15_b",2,"uniequip_002_thorn2",1170,1,14,40,1523335,0,0,172,6],
|
||||
["p1",11,"op","chess_char_5_20_b",1,"uniequip_004_aglina",1292,1,5,6,115270,1688,424,426,5],
|
||||
["p1",12,"op","chess_char_5_22_b",2,"none",1511,1,11,13,357628,1913,469,184,4],
|
||||
["p1",1,"op","chess_char_5_19_a",1,null,3241,1,134,2,38464,9807,644,33,3],
|
||||
["p1",2,"op","chess_char_5_11_b",2,"none",1715.67,1,144,1,6962,19050,25064,42,3],
|
||||
["p1",3,"op","chess_char_5_19_b",1,"uniequip_002_mlynar",3907,1,106,3,97491,7314,782,34,3],
|
||||
["p1",4,"op","chess_char_5_13_b",2,"uniequip_004_ghost2",3498.12,1,9,2,111036,10794,88,20,1],
|
||||
["p1",5,"op","chess_char_5_14_b",2,"none",0,0,145,19,310614,16042,4910,104,4],
|
||||
["p1",6,"op","chess_char_5_17_b",2,"none",2578,1,165,0,163596,12668,530,52,5],
|
||||
["p1",7,"op","chess_char_5_20_a",1,null,1108,1,3,1,41169,1688,424,345,5],
|
||||
["p1",8,"op","chess_char_5_22_a",2,null,1237,1,4,8,160464,5774,1320,144,3],
|
||||
["p1",9,"op","chess_char_5_12_b",2,"uniequip_004_dusk",1667,1,13,5,456416,0,0,64,2],
|
||||
["p1",10,"op","chess_char_5_15_b",2,"uniequip_002_thorn2",1170,1,14,46,1541083,0,0,176,7],
|
||||
["p1",11,"op","chess_char_5_20_b",1,"uniequip_004_aglina",1292,1,5,4,97544,1688,424,408,5],
|
||||
["p1",12,"op","chess_char_5_22_b",2,"none",1511,1,11,10,342635,1913,469,165,4],
|
||||
["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null],
|
||||
["-","~2","device","trap_1105_accrate",null,null,100,1,2,0,0,0,0,0,null],
|
||||
["p1","~1","token","token_10015_dusk_drgn",null,null,0,0,31,0,637,2060,63,3,null],
|
||||
@@ -2712,33 +2713,34 @@
|
||||
["p1","~10","token","token_10015_dusk_drgn",null,null,0,0,126,0,239,1997,0,1,null],
|
||||
["p1","~11","token","token_10015_dusk_drgn",null,null,0,0,129,0,876,2124,127,4,null],
|
||||
["p1","~12","token","token_10015_dusk_drgn",null,null,0,0,136,0,597,2064,67,3,null],
|
||||
["p1","~13","token","token_10015_dusk_drgn",null,null,0,0,144,0,199,2000,3,1,null],
|
||||
["p1","~13","token","token_10015_dusk_drgn",null,null,0,0,143,0,199,2000,3,1,null],
|
||||
["p1","~14","token","token_10015_dusk_drgn",null,null,0,0,147,0,279,2002,5,1,null],
|
||||
["p1","~15","token","token_10015_dusk_drgn",null,null,0,0,149,0,249,2000,3,1,null],
|
||||
["p1","~16","token","token_10015_dusk_drgn",null,null,0,0,152,0,1214,2145,148,5,null],
|
||||
["p1","~16","token","token_10015_dusk_drgn",null,null,0,0,152,0,1214,2149,152,5,null],
|
||||
["p1","~17","token","token_10015_dusk_drgn",null,null,0,0,156,0,199,1997,0,1,null],
|
||||
["p1","~18","token","token_10015_dusk_drgn",null,null,0,0,158,0,557,1997,0,2,null],
|
||||
["p1","~19","token","token_10015_dusk_drgn",null,null,0,0,162,0,597,2052,55,3,null],
|
||||
["p1","~20","token","token_10015_dusk_drgn",null,null,0,0,165,0,796,2100,103,4,null],
|
||||
["p1","~21","token","token_10015_dusk_drgn",null,null,1423.84,0,166,0,398,601,28,2,null]
|
||||
["p1","~20","token","token_10015_dusk_drgn",null,null,0,0,164,0,597,2099,102,3,null],
|
||||
["p1","~21","token","token_10015_dusk_drgn",null,null,0,0,166,0,597,2064,67,3,null],
|
||||
["p1","~22","token","token_10015_dusk_drgn",null,null,1703.84,1,167,1,407,601,308,2,null]
|
||||
],
|
||||
"enemies": {
|
||||
"enemy_10042_prtrop_2": [1,1,0,0,23888],
|
||||
"enemy_1010_demon": [42,39,3,25517,920815],
|
||||
"enemy_1010_demon": [42,40,2,26194,919925],
|
||||
"enemy_10122_uacann_2": [1,1,0,20029,29860],
|
||||
"enemy_1072_dlancer": [1,1,0,0,17916],
|
||||
"enemy_1172_dugago_2": [1,0,1,1027,10552],
|
||||
"enemy_1229_darmy": [1,1,0,0,12541],
|
||||
"enemy_1325_cbgpro": [1,1,0,0,11347],
|
||||
"enemy_1422_lrsldr_2": [45,43,2,8292,728181],
|
||||
"enemy_1425_lrcmra_2": [24,15,9,78862,1542786],
|
||||
"enemy_1422_lrsldr_2": [45,43,2,8473,727546],
|
||||
"enemy_1425_lrcmra_2": [24,14,10,73792,1513761],
|
||||
"enemy_1502_crowns": [1,1,0,0,17916],
|
||||
"enemy_2085_skzjxd": [1,0,1,0,127789]
|
||||
"enemy_2085_skzjxd": [1,0,1,0,133945]
|
||||
},
|
||||
"hooks": [1,167,6630,1856,1856,4937,4941,6598,137,154,45,43,0,27109,3367,143,119,16,1,140,0,0,0],
|
||||
"events": {"atk":2300,"bounty":4,"deploy":46,"die":138,"dmg":4941,"engage":33,"fx":155,"heal":170,"leak":16,"skill":88,"spawn":154,"status":788},
|
||||
"fx": {"crit":28,"displace":48,"explode":5,"sp":11,"substitute":3,"summon":21,"swap":3,"teleport":13,"zone":23},
|
||||
"snaps": "390205c8 83144cc8 bbf1f4aa 5e26fd44 e650b42d bc99a847 154d5aaf 9284ad8e 7094d37f 9be2c896 4dcdb9de 30207c7b 4294ea35 fc2622c7 5269b707 ec3b358a 8cc1ea8c 12f29b80 3a82d9d8 25f0ac02 5854dabc 9205e4b4 ef9f876b"
|
||||
"hooks": [1,167,6294,1799,1799,4900,4903,6258,137,153,45,41,0,26482,3465,136,119,16,1,140,0,0,1],
|
||||
"events": {"atk":2267,"bounty":4,"deploy":46,"die":137,"dmg":4903,"engage":34,"fx":146,"heal":162,"leak":16,"skill":86,"spawn":155,"status":792},
|
||||
"fx": {"crit":21,"displace":41,"dodge":1,"explode":5,"sp":11,"substitute":3,"summon":22,"swap":3,"teleport":13,"zone":26},
|
||||
"snaps": "390205c8 efedeb6e 01ec6235 41fc6dfd dd7a4e34 58fb3f1e 92e37212 9c82afa3 807c7a9e 10727fe7 ea332c0e 1c2bbce7 0e564e2d 9e0d35bd d775e5b0 427fcd59 0475d0ab db9dc9d0 c31b2c1a ad5953ec d6e8d00f"
|
||||
},
|
||||
"roster-045": {
|
||||
"about": "pass 2 band 6: chess_char_6_03_a chess_char_6_06_a chess_char_6_07_a chess_char_6_01_a chess_char_6_02_a chess_char_6_04_a chess_char_6_05_a chess_char_6_08_a chess_char_6_09_a chess_char_6_11_a chess_char_6_12_a chess_char_6_13_a token_10017_skadi2_dedant",
|
||||
|
||||
@@ -9,6 +9,10 @@ import { test } from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import { makeBattle, enemyRec, chessRec, checkInvariants } from '../helpers/battleHarness.js';
|
||||
import { PUSH_UNBALANCE, PULL_UNBALANCE, PULL_UNBALANCE_WEAK, UNBALANCE_MIN, PUSH_TILES, TICK } from '../../server/sim/constants.js';
|
||||
import { hasGeneratedData } from '../../server/sim/simdata.js';
|
||||
import * as enemiesMod from '../../server/sim/content/enemies.js';
|
||||
import { canCast } from '../../server/sim/content/enemies/helpers.js';
|
||||
import { blinkForward } from '../../server/sim/content/enemies/archetypes.js';
|
||||
|
||||
const near = (a, b, eps = 1e-9) => Math.abs(a - b) <= eps;
|
||||
const WALL = chessRec({ id: 't_wall', profession: 'TANK', stats: { atk: 0, maxHp: 1e7, blockCnt: 0 }, rangeGrid: [[0, 0]], skill: null });
|
||||
@@ -149,3 +153,106 @@ test('the displace fx carries the state\'s game seconds for the client\'s slide'
|
||||
const fx = (h.b.drainEvents() || []).find((t) => t[0] === 'fx' && t[1] === 'displace');
|
||||
assert.ok(fx && near(fx[4].dur, PUSH_UNBALANCE[1]), JSON.stringify(fx));
|
||||
});
|
||||
|
||||
// ---------------------------------------------------------------------------------------------------------------
|
||||
// the branch review (fb7-unbalance): exact frames, a 静态刚体 pulled, 弧光锋卫's bleed, skills and scripted moves, the
|
||||
// forced state switches
|
||||
|
||||
test('every push row holds its exact frames at 30 fps (6, 12, 24, 27, 32, 35) — the enemy walks on the next frame', () => {
|
||||
for (const [force, frames] of [[-1, 6], [0, 12], [1, 24], [2, 27], [3, 32], [4, 35]]) {
|
||||
const { h, e } = field();
|
||||
h.b.push(e, force, { from: { x: e.x + 1, y: e.y } });
|
||||
const x = e.x, y = e.y;
|
||||
let k = 0;
|
||||
while (k < 60) { h.step(); k++; if (!near(e.x, x) || !near(e.y, y)) break; }
|
||||
assert.equal(k, frames + 1, `力度 ${force} (受力等级 ${force - 1}): held ${k - 1} frames, want ${frames}`);
|
||||
}
|
||||
});
|
||||
|
||||
test('a 静态刚体 pulled is held for the pull\'s force window (1 s; 0.5 s below 受力等级 −1), a pushed one 0.1 s — never moved', () => {
|
||||
for (const [kind, force, want] of [['pull', 1, PULL_UNBALANCE], ['pull', -1, PULL_UNBALANCE_WEAK], ['push', 3, UNBALANCE_MIN]]) {
|
||||
const s = field({ enemy: { motion: 'FLY' } });
|
||||
s.e.def = { ...s.e.def, staticBody: true };
|
||||
const x0 = s.e.x, t0 = s.h.b.time;
|
||||
if (kind === 'pull') s.h.b.pull(s.e, force, { to: { x: 3, y: 10 } });
|
||||
else s.h.b.push(s.e, force, { from: { x: s.e.x - 1, y: s.e.y } });
|
||||
assert.equal(s.e.x, x0, `${kind}: not moved`);
|
||||
assert.ok(near(s.e.unbalanceUntil - t0, want), `${kind} 力度 ${force}: ${s.e.unbalanceUntil - t0} s, want ${want}`);
|
||||
}
|
||||
});
|
||||
|
||||
const REAL = { skip: !hasGeneratedData() };
|
||||
/** A pinned real enemy (data/enemies.json) on the open stage, with its content kit. */
|
||||
function real(key, o = {}) {
|
||||
const h = makeBattle({ content: 'generic', extraContent: [enemiesMod], seed: 7, autoFinish: false, timeLimit: 60, captureNoisy: true,
|
||||
hooks: ['damaged'], defs: { chess: { t_wall: { ...WALL, stats: { ...WALL.stats, blockCnt: 3 } } } }, ...o });
|
||||
h.step();
|
||||
const e = h.spawn(key, { pos: o.pos ?? [10, 7], routeIndex: 0, mods: { speedMul: o.move ? 1 : 0 } });
|
||||
h.step();
|
||||
return { h, e };
|
||||
}
|
||||
|
||||
test('弧光锋卫 bleeds 400 true damage every 0.066 s for as long as the state lasts (PRTS 天赋) — a push, a 急停 pull, a wall-shortened slide', REAL, () => {
|
||||
const bleed = (act) => {
|
||||
const { h, e } = real('enemy_1328_cbjedi');
|
||||
const hp0 = e.hp;
|
||||
act(h, e);
|
||||
h.run(2);
|
||||
const hits = h.hooksOf('damaged').filter((c) => c.target === e && c.dmg.tags?.includes('unbalanced'));
|
||||
return { lost: hp0 - e.hp, hits: hits.length };
|
||||
};
|
||||
// weight 1: 力度 1 → 受力等级 0, 0.8 s → 12 × 400; a 急停 pull (no movement) 1 s → 15 × 400; the wall keeps the 0.8 s row
|
||||
assert.deepEqual(bleed((h, e) => h.b.push(e, 1, { from: { x: e.x + 1, y: e.y } })), { lost: 4800, hits: 12 });
|
||||
assert.deepEqual(bleed((h, e) => h.b.pull(e, 2, { to: { x: e.x - 0.3, y: e.y }, center: { x: e.x - 0.3, y: e.y } })), { lost: 6000, hits: 15 });
|
||||
assert.deepEqual(bleed((h, e) => { e.x = 9.6; h.b.push(e, 1, { from: { x: e.x - 1, y: e.y } }); }), { lost: 4800, hits: 12 });
|
||||
});
|
||||
|
||||
test('no skill, blink or scripted move while it lasts (失衡免疫 「失衡期间无法自主移动、发动攻击、使用技能」)', REAL, () => {
|
||||
// the skill gate and the blink
|
||||
const { h, e } = field();
|
||||
h.b.pull(e, 1, { to: { x: e.x - 0.3, y: e.y }, center: { x: e.x - 0.3, y: e.y } }); // 1 s, no movement
|
||||
assert.equal(canCast(e, false, h.b), false, 'canCast');
|
||||
const x0 = e.x;
|
||||
assert.equal(blinkForward(h.b, e, 1.5), null, 'blinkForward');
|
||||
assert.equal(e.x, x0);
|
||||
h.run(1.05);
|
||||
assert.equal(canCast(e, false, h.b), true, 'after the state');
|
||||
// 枯朽之种 (a 静态刚体 flyer: a pull's window, no movement): no dive, no blast meanwhile
|
||||
const s = real('enemy_1269_nhfly', { units: [{ chessId: 't_wall', row: 10, col: 6 }], pos: [10, 7] });
|
||||
const t0 = s.h.b.time;
|
||||
s.h.b.pull(s.e, 3, { to: { x: 3, y: 10 } });
|
||||
assert.ok(near(s.e.unbalanceUntil - t0, PULL_UNBALANCE));
|
||||
const sx = s.e.x, sy = s.e.y;
|
||||
s.h.run(0.9);
|
||||
assert.ok(s.e.alive && near(s.e.x, sx) && near(s.e.y, sy), 'still where it was, not exploded');
|
||||
assert.ok(s.h.runUntil(() => !s.e.alive, 5), 'then it dives and blows up');
|
||||
});
|
||||
|
||||
test('乌顶巨角卢鲁: a 失衡 that does not move it holds its clash until the state ends', REAL, () => {
|
||||
const { h, e } = real('enemy_10144_xdelk_2', { units: [{ chessId: 't_wall', row: 10, col: 6 }], move: true });
|
||||
assert.ok(h.runUntil(() => h.eventsOf('fx').some((x) => x[1] === 'telegraph' && x[4]?.kind === 'elkCharge'), 10), 'the charge starts');
|
||||
const start = h.b.time, dur = 8;
|
||||
h.run(dur - 0.5);
|
||||
h.b.pull(e, 5, { to: { x: e.x + 0.2, y: e.y }, center: { x: e.x + 0.2, y: e.y } }); // 急停 at once: 1 s, no movement
|
||||
const until = e.unbalanceUntil;
|
||||
assert.ok(until > start + dur, 'the state outlasts the charge timer');
|
||||
const clash = () => h.eventsOf('fx').some((x) => x[1] === 'explode' && x[4]?.kind === 'elkClash');
|
||||
assert.ok(h.runUntil(clash, 3), 'it clashes');
|
||||
assert.ok(h.b.time >= until - 1e-9, `not before the state ends (${h.b.time.toFixed(3)} vs ${until.toFixed(3)})`);
|
||||
});
|
||||
|
||||
test('a route APPEAR (a forced relocation) and a 逐火 重生 end the state', REAL, () => {
|
||||
const { h, e } = field({ mass: 0 });
|
||||
h.b.push(e, 3, { from: { x: e.x - 1, y: e.y } });
|
||||
assert.ok(e.unbalanceUntil > h.b.time);
|
||||
e.route.legs.splice(e.route.legIdx, 0, { t: 'appear', r: 10, c: 3 });
|
||||
h.step();
|
||||
assert.equal(e.x, 3, 'relocated');
|
||||
assert.ok(!(e.unbalanceUntil > h.b.time), 'APPEAR ended it');
|
||||
const w = real('enemy_1288_duskls');
|
||||
w.h.b.push(w.e, 4, { from: { x: w.e.x + 1, y: w.e.y } });
|
||||
assert.ok(w.e.unbalanceUntil > w.h.b.time);
|
||||
w.h.b.dealDamage(null, w.e, { amount: 1e9, type: 'true' });
|
||||
assert.ok(w.e.alive, 'it fell into its 余烬 (重生)');
|
||||
assert.ok(!(w.e.unbalanceUntil > w.h.b.time), 'the 重生 ended it');
|
||||
});
|
||||
Reference in new issue
Block a user