feedback7: merge fb7-owner-sim — community reports via the owner: 白铁's 铁钳号 opens only the skills that act on it (圣约送葬人 spends and stacks), 伊内丝 S3 after a 突袭 jump, 引星棘刺 alchemy units as HP regen (不屈者 / 禁疗), 不可对空 effects spare flying allies (炎佑), 望's 跟子 at battle start, 香槟炸弹 unhealable / no HP loss (owner decision) and not set off by unrevealed 隐匿 or sleeping enemies

- Grok review: MERGE AFTER FIXES — the HIGH finding (skills opened on the device but spending nothing) fixed on the branch
  (69d791f9: skills.js allyTargetsOk, per-kit allyTargets flags).
- Golden union OK; broad node --test 5500 (5499 pass, 0 fail, 1 skipped); lint 0 errors.
This commit is contained in:
sganggs committed 2026-10-08 21:14:27 +08:00
commit f5595a7a31
43 files changed
+1129 -356

No files matched your search

@@ -0,0 +1,106 @@
// test/content/feedback7-allytarget-kits.test.js — a skill that 白铁's 铁钳号·原型机 (a registered ally target) opens must act on
// it (Grok's review of round 22: 蕾缪安 S3, 艾丽妮 S3, 陈 S2 and 引星棘刺 S2 opened on the device alone and were spent on
// nothing — their kits picked enemies only). The owner's rule (2026-10-08): the device draws aggro like an enemy. So:
// - these four kits now take ally targets in their selectors (the hits are cancelled by the device, its 受击回复 counts;
// 蕾缪安's locks spend her bullets);
// - a skill whose effect does not reach it — one that picks its own victims and has no kit flag `allyTargets: true` — is
// not opened by it (skills.js `allyTargetsOk`), e.g. 德克萨斯 S2 剑雨: it waits for an enemy.
// Run: node --test test/content/feedback7-allytarget-kits.test.js
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { makeBattle, chessRec, enemyRec, checkInvariants } from '../helpers/battleHarness.js';
const CRAB = 'token_10027_ironmn_pile3';
const IRON = { uid: 2, diy: { slot: 6, charId: 'char_4072_ironmn', skillIndex: 2 }, elite: true, row: 12, col: 9, dir: 'RIGHT' };
const crabAt = (col) => ({ uid: 10, kind: 'token', tokenId: CRAB, ownerUid: 2, row: 10, col, dir: 'RIGHT' });
const diy = (charId, skillIndex) => ({ uid: 1, diy: { slot: 6, charId, skillIndex }, elite: true, row: 10, col: 4, dir: 'RIGHT' });
function field(unit, extra = {}) {
const h = makeBattle({
timeLimit: 60, autoFinish: false, seed: 3, flags: { dpPerSec: 0, dpMax: 999, dpInit: 99 },
hooks: ['hit', 'skillStart', 'skillEnd', 'ammoUsed'], captureNoisy: true,
defs: { enemies: { e_d: enemyRec({ key: 'e_d', hp: 1e7, speed: 0, def: 0, atk: 0 }) } },
units: [unit, IRON, crabAt(5)], ...extra,
});
h.step();
const u = h.unit(1);
const crab = h.b.allyUnits.find((a) => a.defId === CRAB);
return { h, u, crab };
}
/** Hits of `u`'s skill on the device (cancelled by it). */
const skillHits = (h, u, crab) => h.hooksOf('hit').filter((c) => c.target === crab && (c.source === u || c.credit === u) && c.dmg?.isSkill);
test('蕾缪安 S3: on the device alone she locks it, spends her bullets on it and ends with the last one', () => {
const { h, u, crab } = field({ uid: 1, chessId: 'chess_char_6_01_a', skillIndex: 2, row: 10, col: 4, dir: 'RIGHT' });
assert.equal(u.skill.id, 'skchr_lemuen_3');
u.skill.gainSp(999, 'test');
const ammo = u.skill.ammo;
assert.ok(h.runUntil(() => u.skill.activations > 0, 5), 'opened');
assert.ok(h.runUntil(() => !u.skill.active, 15), 'ended');
assert.ok(h.hooksOf('skillEnd').some((c) => c.unit === u && c.reason === 'ammo'), 'by its bullets');
assert.ok(h.hooksOf('ammoUsed').filter((c) => c.unit === u).length >= ammo, `${ammo} bullets spent`);
assert.equal(crab.hp, crab.s.maxHp);
checkInvariants(h.b);
});
test('艾丽妮 S3 / 陈 S2: on the device alone their strikes land on it (cancelled)', () => {
for (const [charId, si, id] of [['char_4009_irene', 2, 'skchr_irene_3'], ['char_010_chen', 1, 'skchr_chen_2']]) {
const { h, u, crab } = field(diy(charId, si));
assert.equal(u.skill.id, id);
u.skill.gainSp(999, 'test');
assert.ok(h.runUntil(() => u.skill.activations > 0, 5), `${id} opened`);
h.run(4);
assert.ok(skillHits(h, u, crab).length >= 1, `${id} hit the device`);
assert.equal(crab.hp, crab.s.maxHp);
checkInvariants(h.b);
}
});
test('引星棘刺 S2: on the device alone the alchemy unit lands on it, not on the far tile ahead', () => {
const { h, u, crab } = field({ uid: 1, chessId: 'chess_char_5_15_a', skillIndex: 1, row: 10, col: 4, dir: 'RIGHT' });
assert.equal(u.skill.id, 'skchr_thorn2_2');
u.skill.gainSp(999, 'test');
assert.ok(h.runUntil(() => u.skill.activations > 0, 5), 'opened');
const z = u.mem.zones?.[0];
assert.ok(z, 'a zone');
assert.ok(Math.abs(z.x - crab.x) < 0.3 && Math.abs(z.y - crab.y) < 0.3, `thrown at the device (${z.x}, ${z.y})`);
checkInvariants(h.b);
});
test('a skill whose effect picks enemies only (德克萨斯 S2 剑雨) is not opened by the device; an enemy opens it', () => {
const { h, u } = field({ uid: 1, chessId: 'chess_char_1_08_a', skillIndex: 1, row: 10, col: 4, dir: 'RIGHT' });
assert.equal(u.skill.id, 'skchr_texas_2');
u.skill.gainSp(999, 'test');
const ch = u.skill.charges;
h.run(5);
assert.equal(u.skill.activations, 0, 'kept for an enemy');
assert.equal(u.skill.charges, ch);
h.spawn('e_d', { pos: [10, 6] });
assert.ok(h.runUntil(() => u.skill.activations > 0, 5), 'an enemy opens it');
checkInvariants(h.b);
});
test('the engine rule: the device opens a skill acting through the attacks or flagged allyTargets — not an onStart-only or a no-attack one', () => {
const id = 'test_cast_a';
const opens = (skill) => {
const h = makeBattle({
defs: { chess: { [id]: chessRec({ id, profession: 'SNIPER', rangeGrid: [[0, 0], [0, 1]], skill: { skillType: 'MANUAL', spCost: 1, initSp: 1 } }) } },
kits: { [id]: () => ({ skill: { spCost: 1, initSp: 1, trigger: 'DEFAULT', ...skill } }) },
units: [{ uid: 1, chessId: id, row: 10, col: 4, dir: 'RIGHT' }, IRON, crabAt(5)],
timeLimit: 20, autoFinish: false, seed: 2, flags: { dpPerSec: 0, dpMax: 999 },
});
h.step();
const u = h.unit(1);
u.skill.gainSp(999, 'test');
h.run(3);
checkInvariants(h.b);
return u.skill.activations > 0;
};
assert.equal(opens({ kind: 'duration', duration: 3 }), true, 'a timed skill that keeps attacking');
assert.equal(opens({ kind: 'instant', attack: { atkScale: 2 } }), true, 'a cast that is the next attack');
assert.equal(opens({ kind: 'instant', onStart() {} }), false, 'an onStart-only cast');
assert.equal(opens({ kind: 'duration', duration: 3, attack: { noAttack: true } }), false, 'a timed skill that stops attacking');
assert.equal(opens({ kind: 'instant', onStart() {}, allyTargets: true }), true, 'flagged by its kit');
assert.equal(opens({ kind: 'duration', duration: 3, allyTargets: false }), false, 'opted out by its kit');
});
@@ -0,0 +1,67 @@
// test/content/feedback7-champagne-hold.test.js — 琳琅诗怀雅 S2's 香槟炸弹 (token_10031_swire2_gdtrap) under the owner's
// decision D2 of 2026-10-08: it holds 禁疗, loses no HP (活性源石, damage, a 流失) and never leaves because of its HP; its
// 见面礼 is unchanged (the first ground enemy that touches it, then it is gone). Both kits: 琳琅诗怀雅's own bomb and the
// token kit (content/tokens.js champagne, a bomb spawned without her kit).
// Run: node --test test/content/feedback7-champagne-hold.test.js
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { makeBattle, enemyRec, checkInvariants } from '../helpers/battleHarness.js';
const TRAP = 'token_10031_swire2_gdtrap';
const SW = 'chess_char_3_04_a';
/** 琳琅诗怀雅 on (9,5) of a field whose only free x-6 tile is (9,6) — 活性源石 when `infected`; she throws one bomb there. */
function herBomb({ infected = false, units = [], enemies = [] } = {}) {
const row9 = infected ? '##ERRriRrrSrrrrrrrS##' : '##ERRrrRrrSrrrrrrrS##';
const h = makeBattle({
flat: { rows: { 9: row9, 10: '##hrrRrrrrfrrrrrrrf##', 11: '##hrrRrrrrfrrrrrrrf##' } },
defs: { enemies: { e_w: enemyRec({ key: 'e_w', hp: 1e6, speed: 1, def: 0, atk: 0 }) } },
timeLimit: 60, autoFinish: false, hooks: ['heal', 'death', 'damaged'], captureNoisy: true,
units: [{ uid: 1, chessId: SW, row: 9, col: 5 }, ...units], enemies,
});
h.step();
h.unit(1).mem.coins = 1;
assert.ok(h.runUntil(() => h.b.allyUnits.some((t) => t.alive && t.defId === TRAP), 6), 'she threw a bomb');
const bomb = h.b.allyUnits.find((t) => t.alive && t.defId === TRAP);
assert.deepEqual([bomb.tileR, bomb.tileC], [9, 6]);
return { h, bomb, sw: h.unit(1) };
}
test('香槟炸弹 (her kit): no HP loss on 活性源石, 禁疗, a lethal 流失 or hit leaves it at full HP and on the field', () => {
const { h, bomb } = herBomb({ infected: true });
assert.ok(bomb.s.flags.untargetable && bomb.s.flags.noHeal && bomb.s.flags.healFree, '不可选中 + 禁疗');
assert.ok(!bomb.s.flags.invulnerable, 'no 无敌 flag (no badge on the client)');
h.run(3.2);
assert.equal(bomb.hp, bomb.s.maxHp, '活性源石 takes nothing');
assert.equal(h.b.heal(h.unit(1), bomb, 500), 0, 'no heal reaches it');
assert.equal(h.b.injuredAlliesInKeys([9 * 21 + 6], h.unit(1)).length, 0, 'no healer picks it');
h.b.dealDamage(null, bomb, { amount: 1e6, type: 'true', tags: ['test'] });
h.b.loseHp(bomb, 1e6, { tags: ['test'] });
h.step();
assert.ok(bomb.alive && bomb.deployed, 'not gone because of its HP');
assert.equal(bomb.hp, bomb.s.maxHp);
assert.equal(h.hooksOf('death').filter((c) => c.unit === bomb).length, 0);
checkInvariants(h.b);
});
test('香槟炸弹 (her kit): its 见面礼 is unchanged — the first ground enemy touching it is hit and slowed, then the bomb is gone', () => {
const { h, bomb } = herBomb({ enemies: [{ key: 'e_w', route: 0, time: 1 }] });
assert.ok(h.runUntil(() => !bomb.alive, 30), 'set off');
const e = h.b.enemies.find((x) => x.alive);
assert.ok(e && e.hp < 1e6 && e.findBuff('sluggish'), 'hit + 停顿');
assert.ok(h.hooksOf('death').some((c) => c.unit === bomb && c.reason === 'expired'), 'used up');
checkInvariants(h.b);
});
test('香槟炸弹 (the token kit, spawned without her kit): the same 禁疗, no HP loss, no knock-out', () => {
const h = makeBattle({ timeLimit: 30, autoFinish: false, hooks: ['death'], units: [{ uid: 1, chessId: SW, row: 12, col: 3 }] });
h.step();
const bomb = h.b.spawnToken(h.unit(1), TRAP, 9, 6);
assert.ok(bomb && bomb.s.flags.noHeal && bomb.s.flags.healFree && bomb.s.flags.untargetable);
h.b.loseHp(bomb, 1e6, { tags: ['test'] });
h.b.dealDamage(null, bomb, { amount: 1e6, type: 'true', tags: ['test'] });
h.step();
assert.ok(bomb.alive && bomb.hp === bomb.s.maxHp);
assert.equal(h.b.heal(h.unit(1), bomb, 500), 0);
checkInvariants(h.b);
});
@@ -0,0 +1,56 @@
// test/content/feedback7-champagne-stealth.test.js — 琳琅诗怀雅's 香槟炸弹 does not go off on a 隐匿 enemy that is neither
// revealed nor blocked (community report: 「香槟炸到没有破隐的隐匿敌人了」). PRTS 作战机制 §隐匿: "隐匿效果使得获得该效果的单位无法被
// 任何敌方的能力索敌选中" — the bomb's pages carry no 无视隐匿 note, and the other contact traps (多萝西's 共振装置, 望's 棋子)
// select their enemies so too. A revealed (反隐) or blocked one, and every visible ground enemy, still set it off.
// Run: node --test test/content/feedback7-champagne-stealth.test.js
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { makeBattle, enemyRec, checkInvariants } from '../helpers/battleHarness.js';
const TRAP = 'token_10031_swire2_gdtrap';
const trapHits = (h, e) => h.hooksOf('damaged').filter((c) => c.target === e && c.dmg?.tags?.includes('trap'));
test('her bombs: a 隐匿 walker crosses one unharmed; a visible walker after it sets it off', () => {
const h = makeBattle({
timeLimit: 120, autoFinish: false, hooks: ['damaged', 'death'], captureNoisy: true,
defs: { enemies: { e_w: enemyRec({ key: 'e_w', hp: 1e6, speed: 1, def: 0, atk: 0 }) } },
units: [{ uid: 1, chessId: 'chess_char_3_04_a', row: 9, col: 5 }],
});
h.step();
const sw = h.unit(1);
const bombAt = (r, c) => h.b.allyUnits.find((t) => t.alive && t.defId === TRAP && t.tileR === r && t.tileC === c);
for (let i = 0; i < 15 && !bombAt(9, 7); i++) { sw.mem.coins = 3; h.run(2); }
const bomb = bombAt(9, 7);
assert.ok(bomb, 'a bomb on (9,7), on the walkers\' road before her block');
const hidden = h.spawn('e_w', { route: 0 });
h.b.addBuff(hidden, { key: 'test:stealth', persist: true, flags: { stealth: true } });
assert.ok(h.runUntil(() => hidden.x < 6.6, 20), 'it walked over (9,7)');
assert.ok(bomb.alive, 'not set off');
assert.equal(trapHits(h, hidden).length, 0);
const seen = h.spawn('e_w', { route: 0 });
assert.ok(h.runUntil(() => !bomb.alive, 20), 'a visible walker sets it off');
assert.ok(trapHits(h, seen).length > 0 && seen.findBuff('sluggish'));
checkInvariants(h.b);
});
test('a bomb (the token kit) under a standing 隐匿 enemy waits; revealed (反隐), it goes off', () => {
const h = makeBattle({
timeLimit: 30, autoFinish: false, hooks: ['damaged'], captureNoisy: true,
defs: { enemies: { e_d: enemyRec({ key: 'e_d', hp: 1e6, speed: 0, def: 0, atk: 0 }) } },
units: [{ uid: 1, chessId: 'chess_char_3_04_a', row: 12, col: 3 }], enemies: [{ key: 'e_d', pos: [9, 7] }],
});
h.step();
const e = h.b.enemies.find((x) => x.alive);
h.b.addBuff(e, { key: 'test:stealth', persist: true, flags: { stealth: true } });
const bomb = h.b.spawnToken(h.unit(1), TRAP, 9, 7);
assert.ok(bomb);
h.run(2);
assert.ok(bomb.alive && !e.blockedBy, 'a 隐匿 enemy on its tile does not set it off');
assert.equal(trapHits(h, e).length, 0);
h.b.addBuff(e, { key: 'test:reveal', persist: true, flags: { reveal: true } });
h.step(2);
assert.ok(!bomb.alive, 'revealed: it goes off');
assert.ok(trapHits(h, e).length > 0);
checkInvariants(h.b);
});
+69
View File
@@ -0,0 +1,69 @@
// test/content/feedback7-ines-raid.test.js — 伊内丝 S3 独影归途 under 突袭 (community report: 伊内丝激活突袭瞬移以后3技能被吞).
// S3 costs no SP and runs from every deployment but the first (skill_table skchr_ines_3: PASSIVE, spCost 0, "部署后…";
// her kit casts it in its deploy hook). The 突袭 jump (activity_table bondeffect_raid "保留技力立即再部署") retreats her —
// ending the running S3 — and redeploys her with the SP kept (Battle.redeploy keepSp): that snapshot held 0 charges and
// overwrote the charge reset() gives a free skill at every deployment, so the landing could not recast S3. A skill that
// costs SP still keeps its SP / charges.
// Run: node --test test/content/feedback7-ines-raid.test.js
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { makeBattle, enemyRec, checkInvariants } from '../helpers/battleHarness.js';
function field(skillIndex) {
const landings = [];
const h = makeBattle({
defs: { enemies: { e_walk: enemyRec({ key: 'e_walk', hp: 1e7, speed: 0.5, atk: 0 }) } },
timeLimit: 20, autoFinish: false, seed: 1, flags: { dpInit: 99, dpPerSec: 0, dpMax: 999 },
bonds: { raidShip: { count: 2, active: true, tier: 1, layers: 0 } },
units: [{ uid: 1, chessId: 'chess_char_4_04_a', row: 12, col: 3, dir: 'RIGHT', skillIndex }],
enemies: [{ key: 'e_walk', time: 1.2, routeIndex: 0, count: 1 }],
hooks: ['skillStart', 'skillEnd', 'death'],
setup: (b) => {
// priority 1000: after the keepSp restore, before her kit's deploy hook (which casts S3)
b.on('deploy', ({ unit }) => {
if (unit.uid !== 1 || b.time < 0.5) return;
const sk = unit.skill;
landings.push({ t: b.time, tile: [unit.tileR, unit.tileC], charges: sk.charges, sp: sk.sp, active: sk.active });
}, { priority: 1000 });
},
});
h.step();
return { h, landings, u: h.b.allyUnits.find((x) => x.uid === 1) };
}
test('伊内丝 S3 starts again on the 突袭 landing: the free charge reset() gave is not overwritten by the kept 0', () => {
const { h, landings, u } = field(2);
assert.equal(u.skill.id, 'skchr_ines_3');
h.run(4);
assert.ok(h.hooksOf('death').some((c) => c.unit === u && c.reason === 'raid'), 'she jumped');
assert.equal(landings.length, 1);
assert.notDeepEqual(landings[0].tile, [12, 3], 'landed beside the enemy');
assert.equal(landings[0].charges, 1, 'armed at the landing');
const starts = h.hooksOf('skillStart').filter((c) => c.unit === u);
assert.equal(starts.length, 2, 'the second deployment and the landing');
assert.ok(Math.abs(starts[1].t - landings[0].t) < 1e-9);
assert.equal(u.skill.active, true);
assert.ok(u.skill.timeLeft > 5, `a fresh S3 (${u.skill.timeLeft.toFixed(2)} s left)`);
assert.ok(u.findBuff('ines:s3'), 'its ATK buff');
checkInvariants(h.b);
});
test('突袭 still keeps the SP of a skill that costs SP (伊内丝 S2: a full charge, and a partial bar)', () => {
const full = field(1);
assert.equal(full.u.skill.id, 'skchr_ines_2');
full.u.skill.gainSp(999, 'test');
full.h.run(4);
assert.equal(full.landings.length, 1);
assert.equal(full.landings[0].charges, 1);
assert.equal(full.landings[0].sp, full.u.skill.spCost);
checkInvariants(full.h.b);
const part = field(1);
const initSp = part.u.skill.sp;
part.h.run(12);
assert.equal(part.landings.length, 1, 'the idle trigger');
assert.equal(part.landings[0].charges, 0);
assert.ok(part.landings[0].sp > initSp + 5, `kept ${part.landings[0].sp} (a bar that started at ${initSp})`);
checkInvariants(part.h.b);
});
@@ -0,0 +1,55 @@
// test/content/feedback7-thorn2-regen.test.js — 引星棘刺's alchemy units restore HP as 生命回复速度 (community report:
// 炼金师分支干员的炼金单元无法给不屈者等禁疗的干员提供生命恢复). S1 度算浪波 "每秒回复相当于攻击力…的生命值" and S2 解构涌潮
// "友方单位每秒恢复相当于攻击力…的生命" carry 锡人 S2's wording and blackboard key (hp_recovery_per_sec_ratio), and PRTS 锡人
// 备注 says that recovery "为增加目标的“生命回复速度”属性,不受治疗加成和禁疗影响" — an hpRegen buff, which 不屈者 (no heal
// from others) and 禁疗 units take too. Up to 0.2.1 both were heals (battle.heal), which those units refuse.
// Run: node --test test/content/feedback7-thorn2-regen.test.js
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { makeBattle, enemyRec, checkInvariants } from '../helpers/battleHarness.js';
/** 引星棘刺 (skill `skillIndex`) beside 角峰 (10,5), 折桠 — 不屈者 — (10,6) and a 禁疗 角峰 (10,7); her skill cast at once. */
function field(skillIndex) {
const h = makeBattle({
defs: { enemies: { e_dummy: enemyRec({ key: 'e_dummy', hp: 1e9, speed: 0, atk: 0 }) } },
timeLimit: 20, autoFinish: false, seed: 2, flags: { dpInit: 99, dpPerSec: 0, dpMax: 999 }, hooks: ['heal'], captureNoisy: true,
units: [
{ uid: 1, chessId: 'chess_char_5_15_a', row: 10, col: 4, dir: 'RIGHT', skillIndex },
{ uid: 2, chessId: 'chess_char_1_02_a', row: 10, col: 5 },
{ uid: 3, chessId: 'chess_char_2_17_a', row: 10, col: 6 },
{ uid: 4, chessId: 'chess_char_1_02_a', row: 10, col: 7 },
],
});
h.step();
const [thorn, plain, unyield, banned] = [1, 2, 3, 4].map((uid) => h.b.allyUnits.find((u) => u.uid === uid));
h.b.addBuff(banned, { key: 'test:healFree', status: 'healFree', flags: { noHeal: true, healFree: true } }); // 禁疗
plain.hp = plain.s.maxHp * 0.3;
unyield.hp = unyield.s.maxHp * 0.2; // S1 picks the lowest HP ratio: its 3×3 covers all three
banned.hp = banned.s.maxHp * 0.3;
const hp0 = new Map([plain, unyield, banned].map((a) => [a, a.hp]));
h.spawn('e_dummy', { pos: [10, 6] });
thorn.skill.gainSp(999, 'test');
assert.ok(thorn.skill.activate('manual'), thorn.skill.id);
h.run(3.2);
return { h, thorn, plain, unyield, banned, gained: (a) => a.hp - hp0.get(a) };
}
for (const [skillIndex, id, key] of [[0, 'skchr_thorn2_1', 'hp_recovery_per_sec_ratio'], [1, 'skchr_thorn2_2', 'hp_recovery_per_sec_ratio_chr']]) {
test(`引星棘刺 ${id}: the alchemy unit's 生命回复速度 reaches 不屈者 (折桠) and 禁疗 operators as much as the others`, () => {
const { h, thorn, plain, unyield, banned, gained } = field(skillIndex);
assert.equal(thorn.skill.id, id);
assert.equal(unyield.profile.noHeal, true, '不屈者: no heal from others');
const perSec = thorn.s.atk * thorn.def.skill.bb[key];
for (const a of [plain, unyield, banned]) {
const regen = a.buffs.find((b) => b.source === thorn && b.mods?.hpRegen > 0);
assert.ok(regen, `${a.defId}: an hpRegen buff`);
assert.ok(Math.abs(regen.mods.hpRegen - perSec) < 1e-6, `${regen.mods.hpRegen} ≈ ${perSec}`);
assert.ok(gained(a) > perSec, `${a.defId} recovered ${gained(a).toFixed(1)}`);
}
assert.ok(Math.abs(gained(unyield) - gained(plain)) < 1, 'the same for 不屈者');
assert.ok(Math.abs(gained(banned) - gained(plain)) < 1, 'the same under 禁疗');
assert.equal(h.hooksOf('heal').filter((c) => c.source === thorn).length, 0, 'no heal of hers (治疗加成 does not apply)');
checkInvariants(h.b);
});
}
@@ -0,0 +1,88 @@
// test/content/feedback7-yanyou-noair.test.js — 炎佑 is a flying ally (PRTS “炎佑” 行动方式 飞行): the enemy effects PRTS marks
// 不可对空 never reach it (community report: 炎祐好像吃到了不该吃到的地面伤害). The death blasts of 高能源石虫 / 冰爆源石虫 /
// 卷心籽 ("…无视迷彩,不可对空"), 水遁忍者's 漩涡形态 ("每秒对半径1.0范围内的所有我方单位造成…(无视迷彩,不可对空)"), “萨科塔昂首”'s
// 祈祷邀约 ("令全场我方单位(不可对空,无视迷彩)获得15s【受邀祈祷】"), 鼎沸's pulses ("攻击范围内的所有我方单位每秒受到…(不可对空)")
// and the attack of “斩胄之剑” / “破胄之锤” ("普通攻击对攻击范围内的所有我方单位造成…物理普通伤害,不可对空") took it until 0.2.1; a
// ground operator in reach still does.
// Run: node --test test/content/feedback7-yanyou-noair.test.js
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { makeBattle, checkInvariants } from '../helpers/battleHarness.js';
import { spawnYanyou } from '../../server/sim/content/tokens.js';
/** 角峰 on (10,5), the 炎佑 dragon moved onto (10,6). */
function field(seed = 4) {
const h = makeBattle({ timeLimit: 60, autoFinish: false, seed, hooks: ['damaged'], captureNoisy: true,
units: [{ uid: 1, chessId: 'chess_char_1_02_a', row: 10, col: 5 }] });
h.step();
const dragon = spawnYanyou(h.b, 'p1', { count: 1 })[0];
assert.ok(dragon && dragon.isFlying, 'a flying ally');
assert.ok(h.b.relocate(dragon, 10, 6));
return { h, dragon, op: h.unit(1) };
}
const still = (e) => { e.base.moveSpeed = 0; e.s.moveSpeed = 0; };
const tough = (e) => { e.base.maxHp = 1e9; e.s.maxHp = 1e9; e.hp = 1e9; };
/** Damage `src` dealt to `t` other than its normal attacks. */
const taken = (h, t, src) => h.hooksOf('damaged').filter((c) => c.target === t && c.source === src && !c.dmg?.isAttack).reduce((s, c) => s + c.amount, 0);
for (const [name, key, prep] of [
['高能源石虫', 'enemy_1021_bslime', null],
['冰爆源石虫', 'enemy_1067_snslime', null],
['卷心籽 (ignited)', 'enemy_10065_ftzlc', (e) => { e.mem.ab.ignited = true; }],
]) {
test(`${name}'s death blast (不可对空) spares 炎佑 and still hits a ground operator`, () => {
const { h, dragon, op } = field();
const e = h.spawn(key, { pos: [10, 6] });
still(e);
if (prep) prep(e);
h.step();
const hp0 = dragon.hp;
h.b.dealDamage(null, e, { amount: e.hp + 10, type: 'true', tags: ['test'] });
h.run(0.3);
assert.equal(e.alive, false);
assert.ok(taken(h, op, e) > 0, 'the ground operator is hit');
assert.equal(taken(h, dragon, e), 0, 'the flyer is not');
assert.equal(dragon.hp, hp0);
if (key === 'enemy_1067_snslime') {
assert.ok(op.findBuff('cold'), '寒冷 on the ground operator');
assert.equal(dragon.findBuff('cold'), null, 'no 寒冷 on the flyer');
}
checkInvariants(h.b);
});
}
test('水遁忍者\'s 漩涡形态 (不可对空) hits the ground operator beside it, never 炎佑', () => {
const { h, dragon, op } = field(6);
const e = h.spawn('enemy_10116_ymgtop', { pos: [10, 6] });
still(e);
tough(e);
assert.ok(h.runUntil(() => taken(h, op, e) > 0, 40), 'the vortex reached the operator');
h.run(3);
assert.equal(taken(h, dragon, e), 0);
checkInvariants(h.b);
});
test('“萨科塔昂首”\'s 祈祷邀约 (不可对空) slows the ground operator, not 炎佑', () => {
const { h, dragon, op } = field(7);
const e = h.spawn('enemy_10085_hllevi_2', { pos: [10, 8] });
still(e);
tough(e);
assert.ok(h.runUntil(() => !!op.findBuff('ab:roar'), 40), 'the ground operator is invited');
assert.equal(dragon.findBuff('ab:roar'), null);
checkInvariants(h.b);
});
for (const [name, key] of [['鼎沸', 'enemy_10054_cjhot'], ['“斩胄之剑”', 'enemy_9014_acstma'], ['“破胄之锤”', 'enemy_9015_acstmb']]) {
test(`${name} (不可对空) hits the ground operator beside it, never 炎佑`, () => {
const { h, dragon, op } = field(8);
const e = h.spawn(key, { pos: [10, 6] });
still(e);
tough(e);
h.run(12);
const dealt = (t) => h.hooksOf('damaged').filter((c) => c.target === t && c.source === e).reduce((s, c) => s + c.amount, 0);
assert.ok(dealt(op) > 0, 'the ground operator is hit');
assert.equal(dealt(dragon), 0, 'the flyer is not');
checkInvariants(h.b);
});
}
+5 -2
View File
@@ -1000,7 +1000,7 @@ test('凛御银灰 S3 变革已至: skill range, line attacks bird_atk_scale ×
// =================================================================================================================
// 引星棘刺
test('引星棘刺 S1 度算浪波: an alchemy unit on the lowest-HP ally: DEF +def and hp ratio × ATK/s on the 3×3 around it (+3 s 心相)', () => {
test('引星棘刺 S1 度算浪波: an alchemy unit on the lowest-HP ally: DEF +def and 生命回复速度 hp ratio × ATK/s on the 3×3 around it (+3 s 心相)', () => {
for (const id of pair('15')) {
const h = run({
defs: { chess: { t_low: ally('t_low', { stats: { def: 100 } }), t_near: ally('t_near', { stats: { def: 100 } }), t_far: ally('t_far', { stats: { def: 100 } }) }, enemies: { enemy_dummy: dummy('enemy_dummy') } },
@@ -1019,7 +1019,10 @@ test('引星棘刺 S1 度算浪波: an alchemy unit on the lowest-HP ally: DEF +
h.run(1.1);
for (const a of [low, near]) assert.equal(a.s.def, 100 + bb.def, a.defId);
assert.equal(far.s.def, 100);
approx(heals(h, u, (c) => c.target === near)[0].amount, u.s.atk * bb.hp_recovery_per_sec_ratio);
// 生命回复速度 (an hpRegen buff per unit, like 锡人 S2), not a heal of hers
for (const a of [low, near]) approx(a.buffs.find((b) => b.key === z.key)?.mods.hpRegen, u.s.atk * bb.hp_recovery_per_sec_ratio, a.defId);
assert.equal(far.buffs.some((b) => b.key === z.key), false);
assert.equal(heals(h, u, () => true).length, 0);
mute(h, u);
h.run(z.dur);
assert.ok(!u.mem.zones.includes(z), 'expired');
+2 -2
View File
@@ -711,7 +711,7 @@ test('凛御银灰 S2 auto-cast: SKILL_RANGE — an enemy inside the skill range
});
// ------------------------------------------------------------------------------------------------------------------
test('引星棘刺 S2: alchemy unit (+3 s with an op in range) — 120 % ATK arts/s, healing ×0.5 on ground enemies, heals allies; T1 ATK +10 %; T2 ASPD ±10 on long roads', () => {
test('引星棘刺 S2: alchemy unit (+3 s with an op in range) — 120 % ATK arts/s, healing ×0.5 on ground enemies, allies recover (生命回复速度); T1 ATK +10 %; T2 ASPD ±10 on long roads', () => {
const h = makeBattle({
defs: { enemies: { enemy_dummy: dummy() }, chess: { t_near: ally('t_near') } },
units: [{ chessId: 'chess_char_5_15_a', row: 10, col: 3 }, { chessId: 't_near', row: 11, col: 5 }],
@@ -734,7 +734,7 @@ test('引星棘刺 S2: alchemy unit (+3 s with an op in range) — 120 % ATK art
const ticks = tagged(h, 'alchemy', e);
assert.ok(ticks.length >= 1);
approx(ticks[0].amount, u.s.atk * bb.atk_scale, 1e-6);
assert.ok(near.hp > 5000, 'allies inside heal');
assert.ok(near.hp > 5000, 'allies inside recover');
h.run(bb.projectile_delay_time + t0.projectile_extend);
assert.equal(u.mem.zones.length, 0, 'expired');
clean(h);
+56 -19
View File
@@ -101,12 +101,23 @@ test('望 in every 自选 form: her kit, stats + module attributes, 3-3, blocks
assert.equal(validateDiyPicks({ [SLOT[6]]: { charId: WANG, skillIndex: 2, uniEquipId: X } }, { data, kitted: KITTED_CHARS }).ok, true);
});
test('铸子: a lone 棋子 never sets off; two side by side activate each other — an enemy (air too) on one sets it off and it is used up; it stays active once its partner is gone', () => {
{ // lone
const { h, st } = field({ tier: 6, elite: true, skill: 1, stones: [[9, 6]] });
test('铸子: the battle-start deployment of a placed 棋子 is its 手动部署 — one 跟子 next to it, so a lone 棋子 is live; with no free neighbour it never sets off; two side by side activate each other — an enemy (air too) on one sets it off and it is used up; it stays active once its partner is gone', () => {
{ // lone: its 跟子 上 of it (its neighbours are road, 下 is off the field) — they connect
const { h, u, st } = field({ tier: 6, elite: true, skill: 1, stones: [[9, 6]] });
assert.deepEqual(placed(h), [[10, 6]], 'the battle start drops one 跟子, 上 first among equal tiles');
assert.equal(u.mem.wang.stock, 6, 'the 棋子 takes one of her 7; the 跟子 none');
h.spawn('enemy_dummy', { pos: [9, 6] });
h.step();
assert.ok(!st[0].alive && stoneHits(h).length > 0, 'a lone 棋子 with its 跟子 sets off');
done(h);
}
{ // no free neighbour (operators on 上 / 右 / 左, 下 off the field): no 跟子, never sets off
const others = [[10, 6], [9, 7], [9, 5]].map(([row, col], i) => ({ uid: 10 + i, chessId: 'chess_char_1_01_a', row, col }));
const { h, st } = field({ tier: 6, elite: true, skill: 1, stones: [[9, 6]], others });
assert.equal(placed(h).length, 0, 'nowhere to put it');
h.spawn('enemy_dummy', { pos: [9, 6] });
h.run(3);
assert.equal(stoneHits(h).length, 0, 'a lone 棋子');
assert.equal(stoneHits(h).length, 0, 'a 棋子 with no partner');
assert.ok(st[0].alive);
done(h);
}
@@ -115,7 +126,7 @@ test('铸子: a lone 棋子 never sets off; two side by side activate each other
h.step();
const a = at(st, 9, 6), b = at(st, 9, 7);
assert.ok(a.mem.wangNode.act && b.mem.wangNode.act, 'connected ⇒ active');
assert.equal(placed(h).length, 0, 'the battle-start deployment drops no 跟子');
assert.deepEqual(placed(h), [[10, 6], [10, 7]], 'the battle start drops one 跟子 上 of each');
const fl = h.spawn('enemy_fly', { pos: [9, 7] });
h.step();
assert.ok(!b.alive && a.alive, 'the flyer set off its 棋子, which is used up');
@@ -142,11 +153,10 @@ test('铸子: a spent 棋子 comes back on its tile 2 s later for its cost (TRP-
const dp0 = h.b.players[0].dp;
assert.ok(h.runUntil(() => b.alive, 1), 'back');
approx(h.b.players[0].dp, dp0 - (mod === X ? 2 : 3), `${mod ?? 'none'}: its cost`);
// the 跟子: 上 of (10,7) is (11,7) — deployable ground; no enemy anywhere ⇒ undeployable first: (10,7)'s neighbours on
// the flat stage are all deployable road but 右 (10,8) … the order 上 > 右 > 下 > 左 among equals
const f = u.mem.wang.followers;
assert.equal(f.length, 1, 'one 跟子');
assert.deepEqual([f[0].r, f[0].c], [11, 7], '上 first among equal tiles');
// the battle start dropped one 跟子 上 of each (equal road tiles: 上 > 右 > 下 > 左); the return of (10,7) finds its 上
// (11,7) taken by its own and (10,6) by the other 棋子, so 右 (10,8)
assert.deepEqual(placed(h), [[11, 6], [11, 7], [10, 8]], `${mod ?? 'none'}: 上 at the battle start, then 右`);
assert.equal(u.mem.wang.followers.length, 3);
done(h);
}
{ // an enemy tile first; undeployable ground before deployable ground
@@ -156,23 +166,36 @@ test('铸子: a spent 棋子 comes back on its tile 2 s later for its cost (TRP-
h.step();
assert.ok(!b.alive);
h.b.kill(h.b.enemies.find((x) => x.alive), null);
// the battle start: (11,9) deploys first (a column top to bottom) — its 右 (11,10) is undeployable floor, before its
// road 上; then (10,9) takes its floor 右 (10,10)
assert.deepEqual(placed(h), [[11, 10], [10, 10]], '不可部署地块 > 可部署地面地块 (before 上)');
const fl = h.spawn('enemy_fly', { pos: [9, 9] }); // 下 of (10,9) holds an enemy (a flyer: no block on the trap rule)
assert.ok(h.runUntil(() => b.alive, 3), 'back (a flyer does not stop it)');
assert.deepEqual(placed(h), [[9, 9]], 'the enemy tile first (before the undeployable 右 (10,10))');
assert.deepEqual(placed(h)[2], [9, 9], 'the return: the enemy tile first');
h.step();
assert.ok(h.hooksOf('damaged').some((c) => c.target === fl && c.source === u && c.dmg.tags.includes('wang:stone')), 'the 跟子 sets off at once — its damage is 望\'s');
assert.equal(u.mem.wang.followers.length, 0);
assert.equal(u.mem.wang.followers.length, 2, 'the two on the floor stay; the one on the flyer is spent');
done(h);
}
{ // no enemy around: undeployable ground (10,10) before the road
{ // a return with no enemy around: undeployable ground (10,10) before the road
const { h, u, st } = field({ tier: 6, elite: true, skill: 1, stones: [[10, 9], [11, 9]], dp: 50 });
const b = at(st, 10, 9);
const e = h.spawn('enemy_dummy', { pos: [10, 9] });
h.step();
h.b.kill(e, null);
u.mem.wang.followers.length = 0; // (the battle start's 跟子 gone: the floor beside it is free again)
const n0 = placed(h).length;
assert.ok(h.runUntil(() => b.alive, 3));
assert.deepEqual(placed(h), [[10, 10]], '不可部署地块 > 可部署地面地块');
void u;
assert.deepEqual(placed(h).slice(n0), [[10, 10]], '不可部署地块 > 可部署地面地块');
done(h);
}
{ // a 跟子 on the tile of a piece still to come at the battle start goes when that piece deploys there ("跟子所在格进行部署…
// 时,该跟子会随之消失"): (10,3)'s 上 holds an operator, so its 跟子 takes 右 (10,4) — the next 棋子's tile —, which
// deploys there and drops its own 上 (11,4)
const { h, u } = field({ tier: 6, elite: true, skill: 1, stones: [[10, 3], [10, 4]], others: [{ uid: 10, chessId: 'chess_char_1_01_a', row: 11, col: 3 }] });
assert.deepEqual(placed(h), [[10, 4], [11, 4]]);
assert.deepEqual(u.mem.wang.followers.map((f) => [f.r, f.c]), [[11, 4]], 'the one on (10,4) is gone');
assert.ok(h.eventsOf('fx').some((e) => e[1] === 'disappear' && e[2] === 4 && e[3] === 10), 'it vanishes');
done(h);
}
{ // 望 away ⇒ her 棋子 leave and wait for her; her 跟子 are gone
@@ -306,13 +329,14 @@ test('S2 连星 (AUTO, SP_FULL): a triggered piece hits every enemy on its conne
const { h, u } = field({ tier, elite, skill: 1, stones: [[10, 6], [10, 7]] });
const onLine = h.spawn('enemy_fly', { pos: [10, 9] }); // 3 tiles right of (10,6)…(10,7)+2: on the horizontal line
const beyond = h.spawn('enemy_dummy', { pos: [10, 11] }); // 4 tiles past (10,7)
const off = h.spawn('enemy_dummy', { pos: [11, 7] }); // off the line (vertical never activated)
const vertical = h.spawn('enemy_dummy', { pos: [12, 7] }); // its battle-start 跟子 (11,7) is 上 of it: the vertical line is on
const off = h.spawn('enemy_dummy', { pos: [9, 4] }); // on neither line
const trig = h.spawn('enemy_runner', { pos: [10, 7] });
h.b.applyStatus(trig, 'stun', { duration: 99, force: true }); // it stays on the tile (the slow is read off its speed stat)
h.step();
const hit = stoneHits(h);
const victims = new Set(hit.map((c) => c.target));
assert.ok(victims.has(trig) && victims.has(onLine), `T${tier}: the line, air included`);
assert.ok(victims.has(trig) && victims.has(onLine) && victims.has(vertical), `T${tier}: the lines, air included`);
assert.ok(!victims.has(beyond) && !victims.has(off), `T${tier}: not beyond ± 3 / off the line`);
for (const c of hit.filter((x) => x.target === trig)) approx(c.amount, u.s.atk * sk.bb['attack@atk_scale'] * 1.24, `T${tier}: 2 stacks`, 1e-4);
const slow = trig.findBuff('wang:slow');
@@ -359,8 +383,9 @@ test('S3 天下劫 (MANUAL, ACTIVE_RANGE 4-12, 20 bullets): passive — the piec
assert.equal(u.skill.attackOverride()?.noAttack, true, `T${tier}: 停止攻击`);
assert.equal(u.mem.wang.stock, 8, `T${tier}: +8, capped`);
const fl = placed(h).map(([r, c]) => `${r},${c}`);
assert.equal(fl.length, 5, `T${tier}: (7 − 2 placed) + 8 − 8 over the cap`);
assert.deepEqual(fl.slice(0, 2).sort(), ['10,7', '9,5'], `T${tier}: the enemies' tiles first (${fl})`);
assert.deepEqual(fl.slice(0, 2), ['12,6', '12,7'], `T${tier}: the battle start's 跟子, 上 of each (${fl})`);
assert.equal(fl.length, 7, `T${tier}: then (7 − 2 placed) + 8 − 8 over the cap`);
assert.deepEqual(fl.slice(2, 4).sort(), ['10,7', '9,5'], `T${tier}: the overflow on the enemies' tiles first (${fl})`);
assert.ok(h.hooksOf('damaged').some((c) => c.target === a && c.source === u && c.dmg.tags.includes('wang:stone')), `T${tier}: they set off`);
// inside her range a 棋子 comes back onto an enemy ("可部署至敌人所在位置") — and sets off again
h.b.kill(a, null); h.b.kill(b, null);
@@ -390,6 +415,18 @@ test('S3 天下劫 (MANUAL, ACTIVE_RANGE 4-12, 20 bullets): passive — the piec
}
});
test('S3 天下劫: the overflow 跟子 take her range by the 铸子 order (S3 备注 "采用相同的位置选择优先顺序") — enemy tiles first, an enemy on undeployable floor before one on the road her target order puts first, then the floor', () => {
const { h, u } = field({ tier: 6, elite: true, skill: 2, row: 10, col: 6, stones: [[11, 4], [11, 5]], dp: 300 });
assert.deepEqual(placed(h), [[12, 4], [12, 5]], 'the battle start');
u.skill.gainSp(999);
h.spawn('enemy_dummy', { pos: [10, 10] }); // on tile_floor
h.spawn('enemy_dummy', { pos: [10, 8] }); // on the road, nearer the goal
assert.ok(h.runUntil(() => u.skill.active, 2));
const fl = placed(h).slice(2).map(([r, c]) => `${r},${c}`);
assert.deepEqual(fl, ['10,10', '10,8', '9,10', '11,10', '12,10'], `(7 − 2) + 8 − 8 = 5: the enemies' tiles by class, then the undeployable tiles (${fl})`);
done(h);
});
test('the hand: deploying her in prep brings 7 棋子 (TRP-X "可同时部署的陷阱数量提升": 8) — the match\'s data view reads the module variant\'s deploy limit', () => {
const gd = new GameData(getData({ log: { warn() {}, error() {}, info() {} } }), 'mode_multi_hard');
const data = { chess: CHESS, backups: BACKUPS };
+32 -39
View File
@@ -772,7 +772,7 @@
"bossHpLeft": null,
"rngDraws": 180,
"errors": {"count":0,"kinds":[]},
"players": {"p1":{"killed":23,"total":23,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":169484,"bossDmg":0,"heal":510,"deaths":0,"layerGains":{}}},
"players": {"p1":{"killed":23,"total":23,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":169484,"bossDmg":0,"heal":944,"deaths":0,"layerGains":{}}},
"units": [
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",3907,1,5,3,20539,0,0,16,2],
["p1",2,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",2738,1,7,4,23,0,0,22,1],
@@ -786,15 +786,15 @@
["-","~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],
["p1","~1","token","token_10030_mlyss_wtrman",null,null,606.74,0,24,0,2228,839,405,12,null],
["p1","~1","token","token_10030_mlyss_wtrman",null,null,1041,0,24,0,2228,839,839,12,null],
["p1","~2","token","token_10030_mlyss_wtrman",null,null,1041,0,33,0,2210,0,0,11,null],
["p1","~3","token","token_10030_mlyss_wtrman",null,null,1041,1,39,1,1,0,0,2,null]
],
"enemies": {"enemy_1288_duskls":[11,11,0,210,63415],"enemy_1288_duskls_2":[7,7,0,0,48419],"enemy_1292_duskld":[5,5,0,734,57650]},
"hooks": [1,38,2434,272,309,516,516,306,23,25,18,15,0,11210,207,27,23,0,1,52,0,0,0],
"hooks": [1,38,2434,272,309,516,516,291,23,25,18,15,0,11210,207,27,23,0,1,52,0,0,0],
"events": {"atk":326,"deploy":12,"die":25,"dmg":516,"engage":12,"fx":204,"skill":33,"spawn":38,"status":405},
"fx": {"aoe":2,"copy":1,"crit":4,"dp":2,"ember":23,"iceSpike":64,"palsy":2,"sleep":2,"split":3,"weightless":2,"zone":99},
"snaps": "c0a88fdf 1732f35d 1f713267 96f2eede b366d7bf 3a536525 3a46d36b 5a3b739e 236fc229"
"snaps": "c0a88fdf 1732f35d 1f713267 9299eb00 3f1d45e5 0b6d0e6b 114dd325 7bdf4a44 5474387b"
},
"bond-miraShip-low": {
"about": "奇迹 low: tier 1 layers 1; chess_char_4_01_a chess_char_2_11_a chess_char_3_18_a chess_char_3_01_a chess_char_3_17_a chess_char_3_20_a chess_char_3_21_a chess_char_4_02_a",
@@ -1319,15 +1319,15 @@
"bossHpLeft": null,
"rngDraws": 48,
"errors": {"count":0,"kinds":[]},
"players": {"p1":{"killed":66,"total":21,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":155889,"bossDmg":0,"heal":2860,"deaths":3,"layerGains":{}}},
"players": {"p1":{"killed":66,"total":21,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":155889,"bossDmg":0,"heal":2598,"deaths":3,"layerGains":{}}},
"units": [
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",3907,1,6,15,28905,0,0,35,2],
["p1",2,"op","chess_char_1_08_b",1,"uniequip_002_texas",0,0,7,4,6105,3310,62,24,3],
["p1",3,"op","chess_char_5_13_b",1,"uniequip_002_ghost2",3448.92,1,8,8,12927,6562,398,28,1],
["p1",2,"op","chess_char_1_08_b",1,"uniequip_002_texas",0,0,7,4,6105,3252,328,24,3],
["p1",3,"op","chess_char_5_13_b",1,"uniequip_002_ghost2",3448.92,1,8,8,12927,6562,1164,28,1],
["p1",4,"op","chess_char_5_14_b",1,"none",2174,1,79,4,19333,2174,0,19,6],
["p1",5,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",2738,1,77,14,21786,3845,1107,29,1],
["p1",6,"op","chess_char_5_12_b",0,"uniequip_002_dusk",1787,1,4,1,17523,0,0,15,12],
["p1",7,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1170,1,5,12,21375,0,1293,22,5],
["p1",7,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1170,1,5,12,21375,0,0,22,5],
["p1",8,"op","chess_char_5_20_b",2,"uniequip_002_aglina",1382,1,9,8,27935,0,0,27,3],
["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null],
["-","~2","device","trap_1105_accrate",null,null,100,1,2,0,0,0,0,0,null],
@@ -1338,13 +1338,13 @@
"enemy_1196_msfyin": [28,28,0,0,140],
"enemy_1197_sfshu": [5,5,0,0,31104],
"enemy_1198_msfshu": [15,15,0,0,105],
"enemy_1207_sfji": [2,2,0,14498,54743],
"enemy_1207_sfji": [2,2,0,14441,54743],
"enemy_1208_msfji": [2,2,0,0,124]
},
"hooks": [1,79,2730,216,216,542,541,519,69,69,33,31,0,9330,93,15,66,0,1,79,0,0,1],
"events": {"atk":313,"deploy":10,"die":69,"dmg":541,"engage":8,"fx":142,"heal":12,"skill":64,"spawn":77,"status":201},
"hooks": [1,79,2730,216,216,542,541,650,69,69,33,31,0,9330,93,15,66,0,1,79,0,0,1],
"events": {"atk":313,"deploy":10,"die":69,"dmg":541,"engage":8,"fx":142,"skill":64,"spawn":77,"status":201},
"fx": {"aoe":11,"crit":6,"dodge":1,"dp":3,"sp":3,"substitute":2,"summon":21,"swap":1,"weightless":3,"zone":91},
"snaps": "afb0ceff f21761d4 d7ea90d0 794e64bc 49e2ff22 cedf8fb7 032b46b6 d8e9a02c bff04f67 e4b0ff92"
"snaps": "afb0ceff f21761d4 d7ea90d0 2abcd187 f3784fec 4eb88095 6d95370c a76f46f0 5e448d63 3a5b2aa6"
},
"bond-steadShip-low": {
"about": "坚守 low: tier 1 layers 1; chess_char_1_02_a chess_char_1_10_a chess_char_4_11_a chess_char_4_04_a chess_char_4_07_a chess_char_4_09_a chess_char_4_06_a chess_char_4_10_a token_10041_cathy_catsld token_10041_cathy_catsld",
@@ -1784,48 +1784,41 @@
"round": 10,
"seed": 3858016853,
"waveId": "act1autochess_h03",
"time": 76.07,
"ticks": 2282,
"time": 83.5,
"ticks": 2505,
"reason": "cleared",
"killed": 21,
"total": 21,
"unspawned": 0,
"bossHpLeft": null,
"rngDraws": 10,
"rngDraws": 3,
"errors": {"count":0,"kinds":[]},
"players": {"p1":{"killed":21,"total":21,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":263171,"bossDmg":0,"heal":6511,"deaths":0,"layerGains":{}}},
"players": {"p1":{"killed":21,"total":21,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":261981,"bossDmg":0,"heal":3087,"deaths":0,"layerGains":{}}},
"units": [
["p1",1,"op","chess_char_4_17_b",1,"uniequip_002_hsguma",3513,1,8,0,0,0,0,0,0],
["p1",2,"op","chess_char_6_03_b",2,"uniequip_002_yu",3700,1,6,0,0,0,0,0,0],
["p1",2,"op","chess_char_6_03_b",2,"uniequip_002_yu",3700,1,6,0,0,0,972,0,1],
["p1",3,"op","chess_char_3_03_b",1,"uniequip_002_swire",1898,1,9,0,0,0,0,0,0],
["p1",4,"op","chess_char_3_04_b",1,"uniequip_002_swire2",2323,1,11,8,64447,0,0,0,0],
["p1",4,"op","chess_char_3_04_b",1,"uniequip_002_swire2",2323,1,11,8,63257,0,0,7,0],
["p1",5,"op","chess_char_1_03_b",1,"uniequip_002_leizi",1391,1,4,0,0,0,0,4,1],
["p1",6,"op","chess_char_2_04_b",1,"uniequip_002_grabds",1270,1,5,0,0,0,0,0,0],
["p1",7,"op","chess_char_5_03_b",2,"uniequip_002_blaze2",632.96,1,12,3,51359,2310,1471,8,2],
["p1",8,"op","chess_char_5_12_b",0,"uniequip_002_dusk",1787,1,7,4,68403,0,0,4,4],
["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",1610,1,10,0,0,0,5040,27,2],
["p1",7,"op","chess_char_5_03_b",2,"uniequip_002_blaze2",1469.32,1,12,3,51359,3089,2115,9,2],
["p1",8,"op","chess_char_5_12_b",0,"uniequip_002_dusk",1787,1,7,4,68403,0,0,5,5],
["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",1610,1,10,0,0,0,0,0,0],
["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null],
["-","~2","device","trap_1105_accrate",null,null,100,1,2,0,0,0,0,0,null],
["-","~3","device","trap_1105_accrate",null,null,100,1,3,0,0,0,0,0,null],
["p1","~1","token","enemy_9012_acloon",null,null,17300.16,1,13,4,49667,389,0,2,2],
["p1","~2","token","enemy_9012_acloon",null,null,13634.89,1,14,2,28865,4054,0,1,1],
["p1","~1","token","token_10031_swire2_gdtrap",null,null,1000,0,15,0,0,0,0,0,null],
["p1","~2","token","token_10031_swire2_gdtrap",null,null,930,1,18,0,0,5110,0,0,null],
["p1","~3","token","token_10031_swire2_gdtrap",null,null,1000,0,27,0,0,0,0,0,null],
["p1","~4","token","token_10031_swire2_gdtrap",null,null,1000,0,30,0,0,0,0,0,null],
["p1","~5","token","token_10031_swire2_gdtrap",null,null,1000,0,33,0,0,0,0,0,null],
["p1","~6","token","token_10031_swire2_gdtrap",null,null,1000,0,36,0,0,0,0,0,null],
["p1","~1","token","token_10015_dusk_drgn",null,null,0,0,39,0,430,1997,0,1,null],
["p1","~7","token","token_10031_swire2_gdtrap",null,null,1000,0,41,0,0,0,0,0,null],
["p1","~8","token","token_10031_swire2_gdtrap",null,null,1000,0,42,0,0,0,0,0,null],
["p1","~9","token","token_10031_swire2_gdtrap",null,null,1000,0,44,0,0,0,0,0,null],
["p1","~10","token","token_10031_swire2_gdtrap",null,null,1000,1,46,0,0,0,0,0,null]
["p1","~1","token","enemy_9012_acloon",null,null,17260.25,1,13,4,49667,429,0,2,2],
["p1","~2","token","enemy_9012_acloon",null,null,12970.87,1,14,2,28865,4718,0,1,1],
["p1","~1","token","token_10031_swire2_gdtrap",null,null,1000,1,15,0,0,0,0,0,null],
["p1","~2","token","token_10031_swire2_gdtrap",null,null,1000,0,18,0,0,0,0,0,null],
["p1","~1","token","token_10015_dusk_drgn",null,null,0,0,35,0,430,1997,0,1,null],
["p1","~3","token","token_10031_swire2_gdtrap",null,null,1000,0,39,0,0,0,0,0,null]
],
"enemies": {"enemy_1019_jshoot_2":[7,7,0,1748,47029],"enemy_1381_winman":[9,9,0,0,129890],"enemy_1389_winbab_2":[5,5,0,5215,87091]},
"hooks": [1,46,2282,121,121,188,224,960,22,30,12,9,6,5355,1,4,21,0,1,23,0,0,0],
"events": {"atk":121,"deploy":22,"die":30,"dmg":224,"engage":6,"fx":46,"heal":27,"skill":25,"spawn":46,"status":3},
"fx": {"coin":14,"downed":1,"explode":8,"revive":1,"splash":6,"summon":11,"yanyouFlame":3,"yanyouSummon":2},
"snaps": "a8dd7569 06196293 7fe10e91 ba972d4d 6d08cfcf fb599bc6 1b50192f 15529175"
"enemies": {"enemy_1019_jshoot_2":[7,7,0,3530,47029],"enemy_1381_winman":[9,9,0,0,129890],"enemy_1389_winbab_2":[5,5,0,5490,87091]},
"hooks": [1,39,2505,127,127,234,178,1651,22,24,12,12,6,5604,1,12,21,0,1,24,0,0,0],
"events": {"atk":127,"deploy":15,"die":24,"dmg":175,"engage":7,"fx":28,"skill":28,"spawn":39,"status":4},
"fx": {"coin":7,"downed":2,"explode":2,"firewall":1,"revive":1,"splash":6,"summon":4,"yanyouFlame":3,"yanyouSummon":2},
"snaps": "663ec4b2 fcbf72b6 b58a2d82 2eee0ab3 bd3eacca 24e2c6f1 97aa22e6 b2e6492a 0b5b586f"
}
}
}
+96 -98
View File
@@ -150,15 +150,15 @@
"p2": {"killed":0,"total":0,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":937710,"bossDmg":372608,"heal":6945,"deaths":2,"layerGains":{}}
},
"units": [
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",3907,1,9,0,183438,1132,0,53,3],
["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",5482.35,1,11,0,3903,11319,305,35,1],
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",3907,1,9,0,183438,1132,168,53,3],
["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",5482.35,1,11,0,3903,11319,311,35,1],
["p1",3,"op","chess_char_5_14_b",1,"none",2174,1,7,0,30509,953,294,58,17],
["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",2738,1,13,0,10026,0,0,66,1],
["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1170,1,1,0,79315,0,168,32,8],
["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1170,1,1,0,79315,0,0,32,8],
["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",2418.5,1,3,0,78933,0,0,44,4],
["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",2769.3,1,17,1,26033,0,0,43,2],
["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",1611,1,19,2,168011,1748,1748,55,18],
["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",1610,1,5,0,0,0,14119,21,3],
["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",1610,1,5,0,0,0,14114,21,3],
["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",1695,1,15,0,32280,1383,55,35,2],
["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",836.62,1,12,0,0,3919,1500,0,2],
["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",3545.85,1,51,2,253580,496,458,287,8],
@@ -174,8 +174,8 @@
["p2",22,"token","token_10041_cathy_catsld",null,null,100,1,22,0,0,0,0,0,null]
],
"enemies": {"enemy_1005_yokai_2":[6,6,0,3179,62190],"enemy_1430_lrrook":[2,2,0,0,802449],"enemy_9017_achunt":[2,0,0,30987,688440]},
"hooks": [1,50,6000,1312,1325,2789,2834,4850,11,26,131,125,21,35636,978,0,10,0,1,11,0,13,1],
"events": {"atk":1342,"deploy":40,"die":26,"dmg":2826,"engage":17,"fx":602,"heal":43,"skill":256,"spawn":32,"status":489},
"hooks": [1,50,6000,1312,1325,2789,2834,4861,11,26,131,125,21,35636,978,0,10,0,1,11,0,13,1],
"events": {"atk":1342,"deploy":40,"die":26,"dmg":2826,"engage":17,"fx":602,"heal":41,"skill":256,"spawn":32,"status":489},
"fx": {
"aoe": 38,
"appear": 2,
@@ -210,7 +210,7 @@
"weightless": 4,
"zone": 138
},
"snaps": "7917cfe4 ec53e8ac 09d8b201 823345e1 5d4f2a95 9efdd7ee 56e0addd 78c7726c 4ee3695b 20aee5b5 ba3311c0 d4d127c9 0c500cac d842272b 4cbf4a87 2525db60 e8039c1e 209c57b0 af85310c 92ca4257"
"snaps": "7917cfe4 ec53e8ac 09d8b201 823345e1 5d4f2a95 9efdd7ee 56e0addd 78c7726c 4ee3695b 20aee5b5 ba3311c0 d4d127c9 0c500cac d842272b 4cbf4a87 2525db60 3291ce13 ecb45e94 c2e5c2d0 a4ac7943"
},
"boss-boss_2-solo": {
"about": "假想敌:铳 solo pool 3000000: 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",
@@ -432,36 +432,36 @@
"rngDraws": 790,
"errors": {"count":0,"kinds":[]},
"players": {
"p1": {"killed":14,"total":14,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1232553,"bossDmg":447559,"heal":54877,"deaths":14,"layerGains":{}},
"p2": {"killed":0,"total":0,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1161150,"bossDmg":862838,"heal":6691,"deaths":14,"layerGains":{}}
"p1": {"killed":14,"total":14,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1232553,"bossDmg":447559,"heal":40856,"deaths":14,"layerGains":{}},
"p2": {"killed":0,"total":0,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1161150,"bossDmg":862838,"heal":21008,"deaths":14,"layerGains":{}}
},
"units": [
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",0,0,54,0,155980,8234,420,28,2],
["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",1373.6,1,60,2,14823,8720,1235,14,1],
["p1",3,"op","chess_char_5_14_b",1,"none",0,0,49,0,52926,18466,3193,26,12],
["p1",3,"op","chess_char_5_14_b",1,"none",0,0,49,0,52926,18466,3851,26,12],
["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",1187.98,1,52,0,28347,13246,275,19,2],
["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",911.19,1,55,2,447919,3364,21815,111,19],
["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",298.05,1,61,2,96428,10840,743,39,4],
["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",1227.14,1,19,1,132749,4452,335,209,6],
["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",911.19,1,55,2,447919,3364,765,111,19],
["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",298.05,1,61,2,96428,10974,3306,39,4],
["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",1227.14,1,19,1,132749,4452,2194,209,6],
["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",1176.62,1,57,6,174306,2559,513,45,19],
["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",0,0,50,0,0,4335,26014,44,3],
["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",1293.14,1,15,0,129076,4452,335,71,3],
["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",0,0,50,0,0,4335,26103,44,3],
["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",1293.14,1,15,0,129076,4452,2194,71,3],
["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",2307.16,1,62,0,0,7381,302,0,1],
["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",272.31,1,26,0,286831,5830,290,256,8],
["p2",13,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",1851.09,1,56,0,25219,5607,202,31,7],
["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",0,0,53,0,105158,8892,178,187,5],
["p2",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",2548.55,1,59,0,245655,5827,262,55,5],
["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",283.08,1,26,0,286831,5830,2567,256,8],
["p2",13,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",1851.09,1,56,0,25219,5698,400,31,7],
["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",0,0,53,0,105158,8945,1417,187,5],
["p2",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",2495.49,1,59,0,245655,5833,2774,55,5],
["p2",16,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",0,0,51,0,203707,3584,462,170,3],
["p2",17,"op","chess_char_4_10_b",1,"uniequip_002_aroma",1573.58,1,14,0,0,4452,515,0,0],
["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",0,0,20,0,75126,9258,2532,87,5],
["p2",17,"op","chess_char_4_10_b",1,"uniequip_002_aroma",1613.93,1,14,0,0,4452,3653,0,0],
["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",0,0,20,0,75126,9265,7033,87,5],
["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",0,0,4,1,66605,3677,1688,66,19],
["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",1224.14,1,58,0,152849,2733,262,72,13],
["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",1224.14,1,58,0,152849,2741,713,72,13],
["p2",21,"token","token_10041_cathy_catsld",null,null,100,1,21,0,0,0,0,0,null],
["p2",22,"token","token_10041_cathy_catsld",null,null,100,1,22,0,0,0,0,0,null]
],
"enemies": {"enemy_1010_demon":[4,4,0,2399,200612],"enemy_1438_dspred":[10,10,0,18789,882694],"enemy_1521_dslily":[1,0,0,106920,1310397]},
"hooks": [1,60,6000,1412,1519,3473,3619,7435,42,44,137,135,14,39147,1338,16,15,0,1,42,0,41,1],
"events": {"atk":1655,"deploy":45,"die":44,"dmg":3602,"engage":17,"fx":970,"heal":326,"skill":272,"spawn":37,"status":1032},
"enemies": {"enemy_1010_demon":[4,4,0,2399,200612],"enemy_1438_dspred":[10,10,0,18904,882694],"enemy_1521_dslily":[1,0,0,107103,1310397]},
"hooks": [1,60,6000,1412,1519,3473,3619,11042,42,44,137,135,14,39147,1338,16,15,0,1,42,0,41,1],
"events": {"atk":1655,"deploy":45,"die":44,"dmg":3602,"engage":17,"fx":970,"heal":108,"skill":272,"spawn":37,"status":1032},
"fx": {
"aoe": 35,
"appear": 5,
@@ -499,7 +499,7 @@
"weightless": 4,
"zone": 371
},
"snaps": "c2a7999d 8a4c19ba a9160fe3 7790e2d3 b4c7df2c aeea651a 14cb22cd 25ce984d 1dae4eaa 3b5bc6f4 cea353c7 a707d801 93c5ab85 abfa7f42 649abe2c 3a9580f7 d78d904b 13046d3f 101d5dee 5b6642d4"
"snaps": "c2a7999d 8a4c19ba a9160fe3 d39e3b10 d5866259 fc603481 26c069da 85780057 16e37456 679dc6cc 77114310 92b28c26 ac45852c 83b4f7a0 bb89c9c7 b1813bcb 8e3bcb45 ff125e0a 8d10ee54 5933334e"
},
"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",
@@ -710,24 +710,24 @@
"rngDraws": 570,
"errors": {"count":0,"kinds":[]},
"players": {
"p1": {"killed":4,"total":6,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":869760,"bossDmg":436648,"heal":2876,"deaths":5,"layerGains":{}},
"p2": {"killed":0,"total":0,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":1033990,"bossDmg":505471,"heal":580,"deaths":19,"layerGains":{}}
"p1": {"killed":4,"total":6,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":869760,"bossDmg":436648,"heal":2146,"deaths":5,"layerGains":{}},
"p2": {"killed":0,"total":0,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":1033990,"bossDmg":505471,"heal":1246,"deaths":19,"layerGains":{}}
},
"units": [
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",3907,1,3,1,147578,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,25423,0,0,0,10],
["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",4654.6,1,11,1,4568,0,0,6,1],
["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1170,1,7,1,303339,0,551,64,13],
["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1170,1,7,1,303339,0,0,64,13],
["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",1382,1,13,0,179149,0,0,76,6],
["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",1629,1,66,0,19506,1629,0,43,2],
["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",1611,1,67,0,135206,3222,0,46,14],
["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",1610,1,65,0,2158,3220,2325,3,1],
["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",1610,1,65,0,2158,3220,2146,3,1],
["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",1695,1,9,0,52833,0,0,38,2],
["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",2644,1,49,0,4798,9646,260,10,1],
["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",190.91,1,63,0,118842,15240,280,209,6],
["p2",13,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",2383,1,6,0,0,0,0,0,0],
["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",0,0,61,0,58463,13682,40,128,7],
["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",0,0,61,0,58463,13618,706,128,7],
["p2",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",2777.6,1,14,0,205534,0,0,117,6],
["p2",16,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",1561,1,8,0,493990,0,0,140,2],
["p2",17,"op","chess_char_4_10_b",1,"uniequip_002_aroma",1664,1,12,0,0,0,0,0,0],
@@ -743,10 +743,10 @@
"enemy_10030_vtwand": [5,5,0,0,0],
"enemy_10085_hllevi_2": [2,0,2,0,761019],
"enemy_1010_demon": [4,4,0,12402,200612],
"enemy_9032_aclionk": [1,0,0,47314,942119]
"enemy_9032_aclionk": [1,0,0,47250,942119]
},
"hooks": [1,65,6000,1074,1088,2031,2044,359,41,45,91,88,0,30474,660,8,20,2,1,29,0,2,0],
"events": {"atk":1139,"deploy":45,"die":43,"dmg":1988,"engage":15,"fx":618,"heal":11,"leak":2,"skill":179,"spawn":42,"status":942},
"hooks": [1,65,6000,1074,1088,2031,2044,431,41,45,91,88,0,30474,660,8,20,2,1,29,0,2,0],
"events": {"atk":1139,"deploy":45,"die":43,"dmg":1988,"engage":15,"fx":618,"heal":7,"leak":2,"skill":179,"spawn":42,"status":942},
"fx": {
"aoe": 30,
"appear": 4,
@@ -782,7 +782,7 @@
"weightless": 6,
"zone": 260
},
"snaps": "8ef2441b ee06d28e 0f318fc5 8e4156fd 466da928 f03b4c62 86a1deba 85583d64 215fecf5 ccd39d46 4a08d997 af901ca4 08ece609 76458391 47fbc660 009a9bbe 48624b1a 42116d05 63ab6257 f103fa00"
"snaps": "8ef2441b ee06d28e 0f318fc5 8e4156fd 466da928 e81f42d7 7687b463 1723e66d 7f419938 8e9ddd0f 9f00d62e 2aa9f2dd bca0bec4 7ba9a9bc a548f671 7a235ae3 7fc35fab 2bf5becc eb0dbe2a ee2661d9"
},
"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",
@@ -963,27 +963,27 @@
"rngDraws": 666,
"errors": {"count":0,"kinds":[]},
"players": {
"p1": {"killed":16,"total":14,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":2677042,"bossDmg":1550396,"heal":69312,"deaths":17,"layerGains":{}},
"p2": {"killed":0,"total":0,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":560253,"bossDmg":262771,"heal":9942,"deaths":25,"layerGains":{}}
"p1": {"killed":16,"total":14,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":2677042,"bossDmg":1550396,"heal":58431,"deaths":17,"layerGains":{}},
"p2": {"killed":0,"total":0,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":560253,"bossDmg":262771,"heal":20725,"deaths":25,"layerGains":{}}
},
"units": [
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",7814,1,90,1,335665,24097,655,20,3],
["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",7074,1,87,0,4861,9337,790,6,1],
["p1",3,"op","chess_char_5_14_b",1,"none",4348,1,71,2,352602,19433,5661,5,16],
["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",0,0,70,1,48055,29763,5829,84,2],
["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",0,0,74,5,875533,5355,11555,71,9],
["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",0,0,74,5,875533,5355,675,71,9],
["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",0,0,75,2,761501,15781,75,35,3],
["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",3258,1,81,0,5686,3481,223,18,2],
["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",1855.46,1,80,2,211918,4930,342,30,11],
["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",3082.61,1,72,0,0,14900,44126,38,4],
["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",0,0,84,2,81221,10225,55,13,2],
["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",0,0,76,0,0,8420,223,0,2],
["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",0,0,82,0,27913,14513,155,91,4],
["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",0,0,82,0,27913,14385,4392,91,4],
["p2",13,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",0,0,91,0,6283,14796,2285,9,3],
["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",1619,1,94,0,128154,14639,377,60,8],
["p2",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",0,0,69,1,120204,9521,430,31,3],
["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",1619,1,94,0,128154,14622,3856,60,8],
["p2",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",0,0,69,1,120204,9521,1535,31,3],
["p2",16,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",1561,1,89,0,14218,3122,0,84,2],
["p2",17,"op","chess_char_4_10_b",1,"uniequip_002_aroma",1432.92,1,86,0,76985,4157,348,76,3],
["p2",17,"op","chess_char_4_10_b",1,"uniequip_002_aroma",1432.92,1,86,0,76985,4206,2311,76,3],
["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",884.71,1,79,0,60016,5447,1868,33,3],
["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",0,0,60,0,64038,7927,3949,72,22],
["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",0,0,61,0,62441,3559,307,25,4],
@@ -991,16 +991,16 @@
["p2",22,"token","token_10041_cathy_catsld",null,null,100,1,22,0,0,0,0,0,null]
],
"enemies": {
"enemy_10027_vtsk": [6,4,1,138057,1019681],
"enemy_10027_vtsk": [6,4,1,137764,1019681],
"enemy_1005_yokai": [4,4,0,0,10699],
"enemy_1229_darmy_2": [8,8,0,6104,294231],
"enemy_9013_acstmk_2": [1,0,0,63941,1814230],
"enemy_9014_acstma": [6,5,0,5613,38754],
"enemy_9015_acstmb": [3,2,0,9688,83569],
"enemy_9014_acstma": [6,5,0,5661,38754],
"enemy_9015_acstmb": [3,2,0,9835,83569],
"enemy_9016_acstmr": [8,7,0,0,150]
},
"hooks": [1,92,6000,904,910,2960,3146,7480,72,75,107,101,6,25061,1027,17,36,1,1,61,0,5,9],
"events": {"atk":1083,"deploy":56,"die":74,"dmg":3143,"engage":18,"fx":651,"heal":136,"leak":1,"skill":208,"spawn":58,"status":990},
"hooks": [1,92,6000,904,910,2960,3146,8374,72,75,107,101,6,25061,1027,17,36,1,1,61,0,5,9],
"events": {"atk":1083,"deploy":56,"die":74,"dmg":3143,"engage":18,"fx":651,"heal":62,"leak":1,"skill":208,"spawn":58,"status":990},
"fx": {
"aoe": 42,
"appear": 7,
@@ -1044,7 +1044,7 @@
"weightless": 3,
"zone": 180
},
"snaps": "0499777c 66895c47 00cd2e8d 02a8aa95 5d3f3829 3d4bf1c3 1ecb5a32 b9d715e5 54e94d88 7c9b3f95 de81172e 15cddd71 78890306 d4586c67 72920db0 61a8a2c6 4a931d91 d389bff6 1cdd3841 f76bc0a3"
"snaps": "0499777c 2a8a8958 27548bdc 4d50b14c 2d952e29 e8bac176 f62bddd6 c54603c8 eec4acbb 0e35cf5c f32cd036 b1a89b99 601ad31e 90860daf 260abb25 982d94cf 1e000364 bf1ae288 42ae578f 90a8c025"
},
"hidden-boss_8-solo": {
"about": "假想敌:胄 solo pool 7200000: 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",
@@ -1274,34 +1274,34 @@
"killed": 10,
"total": 4,
"unspawned": 0,
"bossHpLeft": 14635261,
"rngDraws": 918,
"bossHpLeft": 14665822,
"rngDraws": 951,
"errors": {"count":0,"kinds":[]},
"players": {
"p1": {"killed":10,"total":4,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":459267,"bossDmg":234580,"heal":65462,"deaths":5,"layerGains":{}},
"p2": {"killed":0,"total":0,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":520827,"bossDmg":330160,"heal":13987,"deaths":24,"layerGains":{}}
"p1": {"killed":10,"total":4,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":436084,"bossDmg":210358,"heal":52517,"deaths":5,"layerGains":{}},
"p2": {"killed":0,"total":0,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":513452,"bossDmg":323820,"heal":16428,"deaths":23,"layerGains":{}}
},
"units": [
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",3907,1,5,1,8,0,0,4,1],
["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",5482.35,1,9,0,4,135,135,5,1],
["p1",3,"op","chess_char_5_14_b",1,"none",3804.5,1,15,1,13,4026,4026,3,5],
["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",2738,1,17,4,37557,16976,8824,162,1],
["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1989,1,66,6,268925,2436,20528,44,10],
["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",1382,1,19,0,39201,31941,907,22,2],
["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",1629,1,63,0,73883,6323,567,181,5],
["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",1611,1,3,0,14,0,0,12,5],
["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",1610,1,7,0,0,900,30294,38,3],
["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",1695,1,67,0,39662,2415,182,24,2],
["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",0,0,59,0,9,7056,313,9,1],
["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",0,0,52,0,114391,9692,1390,156,5],
["p2",13,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",0,0,64,0,6168,8119,1447,6,4],
["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",1619,1,65,1,64558,18411,1406,159,8],
["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",3907,1,5,0,2,0,0,1,1],
["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",3537,1,9,1,1,0,0,1,0],
["p1",3,"op","chess_char_5_14_b",1,"none",3804.5,1,15,0,12,5647,3375,1,5],
["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",2738,1,17,4,36333,19031,19031,167,1],
["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1989,1,66,7,241213,2449,460,44,8],
["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",0,0,19,0,39805,21995,2135,22,2],
["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",1629,1,63,1,81972,6165,1278,176,5],
["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",1611,1,3,0,18,0,0,16,8],
["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",1610,1,7,0,0,0,26079,30,3],
["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",1695,1,13,0,36729,5487,159,32,2],
["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",9.3,1,59,0,0,8208,120,0,2],
["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",0,0,52,0,111941,8843,999,153,5],
["p2",13,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",0,0,64,0,6173,8004,1332,8,6],
["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",1619,1,65,0,60967,17304,8156,157,7],
["p2",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",0,0,54,0,108553,6094,538,33,3],
["p2",16,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",0,0,12,0,107199,3077,1516,194,3],
["p2",17,"op","chess_char_4_10_b",1,"uniequip_002_aroma",0,0,56,0,9951,3760,432,10,1],
["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",0,0,51,0,19876,6152,1123,40,3],
["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",1670.06,1,58,1,32048,7063,4756,80,17],
["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",0,0,57,0,58074,4319,1067,34,8],
["p2",16,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",0,0,12,0,106719,3075,1514,195,3],
["p2",17,"op","chess_char_4_10_b",1,"uniequip_002_aroma",0,0,56,0,9951,3706,378,10,1],
["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",0,0,51,0,19032,6194,1730,39,3],
["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",1844.82,1,58,1,32044,3599,1466,72,19],
["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",0,0,57,0,58071,3447,195,32,8],
["p2",21,"token","token_10041_cathy_catsld",null,null,100,1,23,0,0,0,0,0,null],
["p2",22,"token","token_10041_cathy_catsld",null,null,100,1,24,0,0,0,0,0,null],
["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null],
@@ -1309,58 +1309,56 @@
],
"enemies": {
"enemy_1402_tgshd_2": [2,2,0,6812,173864],
"enemy_9010_acpupp": [2,2,0,8972,240778],
"enemy_9021_acduml_2": [1,0,0,1756,564739],
"enemy_9022_acdumm": [1,0,0,2732,0],
"enemy_9023_acdums": [12,10,0,113969,714]
"enemy_9010_acpupp": [2,2,0,9014,240778],
"enemy_9021_acduml_2": [1,0,0,4045,534178],
"enemy_9022_acdumm": [1,0,0,2791,0],
"enemy_9023_acdums": [12,10,0,101874,716]
},
"hooks": [1,65,6000,1089,1207,4470,5144,10933,44,45,88,86,5,25814,1152,16,18,0,1,48,0,41,0],
"events": {"atk":1225,"deploy":45,"die":45,"dmg":4708,"engage":19,"fx":1961,"heal":597,"skill":174,"spawn":42,"status":974},
"hooks": [1,64,6000,1067,1191,4282,4885,9023,42,44,92,88,0,24850,1157,16,18,0,1,45,0,38,0],
"events": {"atk":1205,"deploy":44,"die":44,"dmg":4464,"engage":18,"fx":1910,"heal":421,"skill":180,"spawn":42,"status":980},
"fx": {
"aoe": 13,
"aoe": 16,
"appear": 7,
"beam": 22,
"blink": 2,
"burst": 41,
"charge": 4,
"counter": 5,
"crit": 109,
"burst": 38,
"charge": 6,
"crit": 111,
"dilemma": 3,
"disappear": 9,
"displace": 7,
"disappear": 7,
"displace": 6,
"ember": 3,
"explode": 902,
"explode": 903,
"explosion": 8,
"expose": 181,
"frostNova": 17,
"expose": 182,
"frostNova": 19,
"garrisonGrant": 1,
"iceSpike": 159,
"iceSpike": 154,
"levitate": 6,
"overclock": 1,
"phase": 93,
"overclock": 2,
"phase": 94,
"pull": 2,
"quadShot": 3,
"revive": 1,
"ripple": 20,
"sentry": 4,
"sermon": 1,
"shadowWeave": 5,
"shield": 2,
"shield": 1,
"shieldBreak": 8,
"slippery": 1,
"sp": 6,
"sp": 4,
"splash": 2,
"stealth": 5,
"summon": 8,
"swordRain": 70,
"swordStorm": 8,
"swordRain": 68,
"swordStorm": 7,
"telegraph": 3,
"tornado": 3,
"tornadoPulse": 14,
"tornadoPulse": 13,
"weightless": 2,
"zone": 200
"zone": 160
},
"snaps": "f891236c f6672d61 695d2e11 dd4444a7 2a7dde13 b3213880 431cd2c4 6abcdf88 03c938b6 2adbab93 89502717 3fc3d404 0c63a20c 8d49e8fc f8eb3fc4 640373e1 0243b53a 3b3694f0 569f5d6c 6ebfcb06"
"snaps": "f891236c f6672d61 0a4a6ca4 afae713f d621e422 91c68a01 7ea311f1 012e8866 5abf3b77 9efa9721 3f89db8d 12ebc10f c6cfa9e0 426d996e ec4be4af 4a0889a2 7023a3a1 61c0368c 4b538cec 7d3911a5"
},
"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",
+11 -11
View File
@@ -691,7 +691,7 @@
},
{
"round": 12,
"ai_0": [1,3,13,0,0,6,8,"a701cd86",125,"kazimierzShip 1/29, kjeragShip 0/2, raidShip 1/49, skillfulShip 0/9, soloShip 1/3, steadShip 2/18, suntShip 1/0, swiftShip 1/26, visiShip 1/0",33,50,17,114],
"ai_0": [1,3,13,0,0,6,8,"a701cd86",125,"kazimierzShip 1/29, kjeragShip 0/2, raidShip 1/49, skillfulShip 0/9, soloShip 1/3, steadShip 2/18, suntShip 1/0, swiftShip 1/26, visiShip 1/0",31,50,19,114],
"ai_1": [1,2,13,0,0,6,8,"62b855c3",71,"arcaneShip 0/2, kazimierzShip 0/2, preciShip 1/63, sargonShip 0/4, siracusaShip 2/8, skillfulShip 0/6, soloShip 1/0, suntShip 1/0, swiftShip 0/23",23,50,27,114]
},
{
@@ -711,7 +711,7 @@
"title": {"id":"comment_4","name":"精英云集","picId":"comment_icon_4","text":"晋升精锐次数最多"},
"trophies": 3,
"reward": 298,
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":2942653,"gold":127,"itemsEquipped":9,"kills":228,"leaks":63,"lpLost":32,"merges":4,"perfectRounds":9,"refreshes":12},
"stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":2920409,"gold":127,"itemsEquipped":9,"kills":226,"leaks":65,"lpLost":32,"merges":4,"perfectRounds":9,"refreshes":12},
"lineup": [],
"bonds": ["kazimierzShip 0/45","kjeragShip 0/10","miraShip 0/7","raidShip 0/49","skillfulShip 0/9","soloShip 0/3","steadShip 0/18","swiftShip 0/46","yanShip 0/6"]
},
@@ -1509,7 +1509,7 @@
"combat": "client",
"boost": null,
"setup": {"stageId":"act1autochess_m01","bossId":"boss_5","hiddenBossId":"boss_10","factions":["DOT","INVISIBLE","REFLECTION"]},
"end": {"victory":true,"roundsPassed":14,"hiddenReached":false,"hiddenCleared":false,"reason":"victory","teamLp":43,"bossPoolLeft":0,"virtualMs":121400},
"end": {"victory":true,"roundsPassed":14,"hiddenReached":false,"hiddenCleared":false,"reason":"victory","teamLp":39,"bossPoolLeft":0,"virtualMs":121400},
"rng": {"setup":25,"shop":489,"waves":0,"draft":34,"bots":18039,"meta":11},
"errors": {"engine":0,"logged":0,"sim":0,"dispatcher":0},
"rounds": [
@@ -1570,12 +1570,12 @@
},
{
"round": 12,
"h_0": [1,26,12,0,0,6,8,"c8e0476d",178,"arcaneShip 1/11, kazimierzShip 1/52, miraShip 1/8, preciShip 0/8, raidShip 1/88, skillfulShip 0/3, soloShip 1/0, suntShip 1/0, swiftShip 1/19, yanShip 0/1",23,31,8,112],
"h_0": [1,26,12,0,0,6,8,"c8e0476d",181,"arcaneShip 1/14, kazimierzShip 1/52, miraShip 1/8, preciShip 0/8, raidShip 1/88, skillfulShip 0/3, soloShip 1/0, suntShip 1/0, swiftShip 1/19, yanShip 0/1",27,31,4,112],
"ai_0": [1,23,12,0,0,6,8,"55f8656e",229,"arcaneShip 0/2, deputShip 0/16, kazimierzShip 0/8, lateranoShip 1/47, preciShip 2/53, sargonShip 0/2, skillfulShip 1/24, soloShip 1/5, suntShip 1/14, swiftShip 1/86",31,31,0,112]
},
{
"round": 13,
"h_0": [1,20,12,0,0,6,8,"64fc1bc4",199,"arcaneShip 0/11, kazimierzShip 1/64, miraShip 1/12, preciShip 0/8, raidShip 1/100, skillfulShip 0/3, soloShip 1/0, suntShip 1/0, swiftShip 1/23, yanShip 0/1",28,57,29,124],
"h_0": [1,16,12,0,0,6,8,"64fc1bc4",199,"arcaneShip 0/14, kazimierzShip 1/64, miraShip 1/12, preciShip 0/8, raidShip 1/100, skillfulShip 0/3, soloShip 1/0, suntShip 1/0, swiftShip 1/23, yanShip 0/1",28,57,29,124],
"ai_0": [1,23,12,0,0,6,8,"dc15adde",265,"arcaneShip 0/2, deputShip 0/16, kazimierzShip 0/8, lateranoShip 1/53, preciShip 2/63, sargonShip 0/2, skillfulShip 1/29, soloShip 1/5, suntShip 1/14, swiftShip 1/101, visiShip 1/0",57,57,0,126]
}
],
@@ -1585,14 +1585,14 @@
"victory": true,
"roundsPassed": 14,
"eliminatedRound": null,
"lp": 20,
"lp": 16,
"bandId": "band_amedic",
"title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"},
"title": {"id":"comment_4","name":"精英云集","picId":"comment_icon_4","text":"晋升精锐次数最多"},
"trophies": 4,
"reward": 400,
"stats": {"activatedLayers":203,"bossDamage":414333,"dmgDealt":3070060,"gold":136,"itemsEquipped":21,"kills":269,"leaks":41,"lpLost":8,"merges":3,"perfectRounds":9,"refreshes":21},
"stats": {"activatedLayers":206,"bossDamage":301759,"dmgDealt":2977771,"gold":136,"itemsEquipped":21,"kills":274,"leaks":37,"lpLost":12,"merges":3,"perfectRounds":9,"refreshes":21},
"lineup": ["6_18_a@12,3","4_10_a@12,4[2_01_e_b+2_04_e_a]","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","1_19_b@10,8[2_01_e_b+4_04_e_b]"],
"bonds": ["arcaneShip 2/15","kazimierzShip 1/64","miraShip 1/12","preciShip 0/8","raidShip 1/100","siracusaShip 1/12","skillfulShip 0/3","soloShip 1/0","suntShip 1/0","swiftShip 0/23","yanShip 0/1"]
"bonds": ["arcaneShip 2/18","kazimierzShip 1/64","miraShip 1/12","preciShip 0/8","raidShip 1/100","siracusaShip 1/12","skillfulShip 0/3","soloShip 1/0","suntShip 1/0","swiftShip 0/23","yanShip 0/1"]
},
"ai_0": {
"alive": true,
@@ -1601,10 +1601,10 @@
"eliminatedRound": null,
"lp": 23,
"bandId": "band_chiave",
"title": {"id":"comment_2","name":"不朽盟约","picId":"comment_icon_2","text":"激活的盟约层数总和最高"},
"title": {"id":"comment_1","name":"卫戍之星","picId":"comment_icon_1","text":"对敌方领袖造成伤害最高(仅胜利时)"},
"trophies": 4,
"reward": 400,
"stats": {"activatedLayers":296,"bossDamage":365667,"dmgDealt":3843373,"gold":140,"itemsEquipped":17,"kills":327,"leaks":0,"lpLost":0,"merges":3,"perfectRounds":13,"refreshes":22},
"stats": {"activatedLayers":296,"bossDamage":478241,"dmgDealt":3742103,"gold":140,"itemsEquipped":17,"kills":315,"leaks":0,"lpLost":0,"merges":3,"perfectRounds":13,"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/56","preciShip 2/76","sargonShip 0/2","skillfulShip 1/34","soloShip 0/5","suntShip 1/14","swiftShip 1/113","visiShip 1/3"]
}
+107 -107
View File
@@ -859,43 +859,43 @@
"round": 12,
"seed": 2531322120,
"waveId": "act1autochess_h05",
"time": 202.67,
"ticks": 6080,
"time": 200.9,
"ticks": 6027,
"reason": "cleared",
"killed": 48,
"killed": 45,
"total": 183,
"unspawned": 0,
"bossHpLeft": null,
"rngDraws": 500,
"rngDraws": 580,
"errors": {"count":0,"kinds":[]},
"players": {
"p1": {
"killed": 48,
"killed": 45,
"total": 183,
"perfect": false,
"leaks": 135,
"leaks": 138,
"leaksUncounted": 0,
"coins": 2,
"dmg": 1669744,
"dmg": 1763932,
"bossDmg": 0,
"heal": 36171,
"deaths": 25,
"heal": 37489,
"deaths": 24,
"layerGains": {"visiShip":6}
}
},
"units": [
["p1",1,"op","chess_char_5_11_a",1,null,0,0,5,0,161,4864,2699,5,4],
["p1",2,"op","chess_char_5_19_a",2,null,3241,1,216,1,44918,9945,0,5,2],
["p1",3,"op","chess_char_5_13_a",1,null,346.6,1,10,10,240895,30649,0,91,1],
["p1",4,"op","chess_char_5_14_a",1,null,1732,1,219,0,35614,10945,787,21,6],
["p1",5,"op","chess_char_5_01_b",1,"uniequip_002_excu2",0,0,84,7,118325,9072,4444,33,2],
["p1",6,"op","chess_char_5_17_a",1,null,2250,1,218,7,101934,32298,7319,119,8],
["p1",7,"op","chess_char_5_12_a",0,null,1404,1,8,0,56731,0,0,35,25],
["p1",8,"op","chess_char_5_15_a",1,null,926,1,12,11,625635,984,6782,129,10],
["p1",9,"op","chess_char_5_20_a",2,null,0,0,14,0,27378,1167,3,9,1],
["p1",10,"op","chess_char_5_21_a",1,null,1279,1,4,9,348762,0,0,167,4],
["p1",11,"op","chess_char_5_22_a",1,null,0,0,6,3,68396,1237,0,33,7],
["p1",12,"op","chess_char_5_23_a",1,null,0,0,98,0,0,9521,13947,26,1],
["p1",1,"op","chess_char_5_11_a",1,null,0,0,5,0,161,4864,2662,5,4],
["p1",2,"op","chess_char_5_19_a",2,null,3241,1,214,0,30212,6715,233,3,2],
["p1",3,"op","chess_char_5_13_a",1,null,2723.22,1,10,7,250972,26019,2102,83,1],
["p1",4,"op","chess_char_5_14_a",1,null,1732,1,219,0,42989,9190,1097,23,7],
["p1",5,"op","chess_char_5_01_b",1,"uniequip_002_excu2",0,0,84,7,118325,9972,5344,33,2],
["p1",6,"op","chess_char_5_17_a",1,null,1632.9,1,218,7,100455,35767,10913,129,10],
["p1",7,"op","chess_char_5_12_a",0,null,1404,1,8,0,64810,0,0,35,30],
["p1",8,"op","chess_char_5_15_a",1,null,926,1,12,10,617134,984,541,138,11],
["p1",9,"op","chess_char_5_20_a",2,null,0,0,14,0,27378,1180,72,9,1],
["p1",10,"op","chess_char_5_21_a",1,null,1279,1,4,9,369260,0,0,167,4],
["p1",11,"op","chess_char_5_22_a",1,null,1237,1,154,5,141241,1237,0,86,13],
["p1",12,"op","chess_char_5_23_a",1,null,0,0,98,0,0,9097,14335,25,1],
["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null],
["-","~2","device","trap_1105_accrate",null,null,100,0,2,0,0,0,0,0,null],
["-","~3","device","trap_1105_accrate",null,null,100,1,3,0,0,0,0,0,null],
@@ -904,24 +904,24 @@
"enemies": {
"enemy_10043_sailor": [1,1,0,135,16423],
"enemy_10094_crstf": [1,1,0,0,11944],
"enemy_1017_defdrn": [1,0,1,0,7123],
"enemy_1017_defdrn": [1,0,1,0,7955],
"enemy_1069_icebrk_2": [1,0,1,0,24872],
"enemy_1161_tidmag_2": [1,0,1,14631,8043],
"enemy_1161_tidmag_2": [1,0,1,14643,9294],
"enemy_1195_sfyin_2": [1,0,1,0,9113],
"enemy_1208_msfji_2": [1,0,1,0,20],
"enemy_1249_lysdb_2": [60,20,40,28097,677560],
"enemy_1251_lysyta": [63,25,38,13934,368444],
"enemy_1254_lypa_2": [48,1,47,44927,464222],
"enemy_1272_nhtank": [1,0,1,10257,35137],
"enemy_1249_lysdb_2": [60,22,38,29052,758257],
"enemy_1251_lysyta": [63,20,43,10565,358144],
"enemy_1254_lypa_2": [48,1,47,45234,483891],
"enemy_1272_nhtank": [1,0,1,6316,34232],
"enemy_1329_cbshld": [1,0,1,0,5006],
"enemy_1430_lrrook": [1,0,1,0,24204],
"enemy_1539_reid": [1,0,1,889,15006],
"enemy_2085_skzjxd": [1,0,1,0,2629]
"enemy_1430_lrrook": [1,0,1,0,25237],
"enemy_1539_reid": [1,0,1,1266,15846],
"enemy_2085_skzjxd": [1,0,1,0,3699]
},
"hooks": [1,219,6080,770,868,5115,5110,3213,74,210,71,71,9,24174,728,87,183,135,1,88,1,8,18],
"events": {"atk":1129,"bounty":1,"deploy":33,"die":75,"dmg":5110,"engage":12,"fx":463,"heal":212,"layer":1,"leak":135,"skill":142,"spawn":199,"status":1543},
"fx": {"aoe":17,"burst":8,"charge":4,"crit":20,"dodge":18,"extraAttack":9,"garrison":1,"healAoe":4,"iceSpike":122,"shieldBreak":60,"sp":24,"substitute":6,"summon":1,"swap":6,"weightless":1,"zone":162},
"snaps": "92d6171d a14af2a9 3bf2fd11 f6ecd555 4ac6277e 2784431f 04c94017 a3665bd0 1cd29745 07218cd9 7223440e 4425b22e febfb834 893f5aa5 d58169eb bdce5a88 23c988b2 c7031869 33fd06c1 cba1596a 9878059e"
"hooks": [1,219,6027,822,922,5158,5195,5586,70,209,86,85,9,24812,773,85,183,138,1,84,1,8,16],
"events": {"atk":1158,"bounty":1,"deploy":33,"die":71,"dmg":5195,"engage":12,"fx":499,"heal":84,"layer":1,"leak":138,"skill":171,"spawn":199,"status":1620},
"fx": {"aoe":26,"burst":8,"charge":4,"crit":25,"dodge":16,"extraAttack":9,"garrison":1,"healAoe":4,"iceSpike":122,"shieldBreak":60,"sp":35,"substitute":7,"summon":1,"swap":6,"weightless":1,"zone":174},
"snaps": "92d6171d ca0b06f8 42960f3a 87684217 ab629c34 75e98f4c 18767d22 a6e5dca7 856512b9 c589dbb5 c7bd7336 4de4769f 28fe6b79 5df6dabc 5785a6ff d2b06120 ad8b8d1b 1fbc10c9 431c6e77 534d5874"
},
"roster-015": {
"about": "pass 0 band 6: 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_14_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 chess_char_5_15_b",
@@ -951,7 +951,7 @@
"coins": 12,
"dmg": 1870890,
"bossDmg": 0,
"heal": 53573,
"heal": 57774,
"deaths": 0,
"layerGains": {"indomShip":20}
}
@@ -959,20 +959,20 @@
"units": [
["p1",1,"op","chess_char_5_08_b",2,"uniequip_002_horn",2775,1,8,10,133996,9109,0,60,4],
["p1",2,"op","chess_char_5_11_b",1,"uniequip_002_demkni",4784.8,1,6,0,0,10800,13006,0,79],
["p1",3,"op","chess_char_5_05_b",2,"uniequip_002_ulpia",13035.36,1,140,40,643200,40970,22958,47,6],
["p1",3,"op","chess_char_5_05_b",2,"uniequip_002_ulpia",13035.36,1,140,40,643200,40970,28350,47,6],
["p1",4,"op","chess_char_5_06_b",2,"uniequip_002_etlchi",3672,1,11,3,37848,492,94,16,3],
["p1",5,"op","chess_char_5_13_b",1,"uniequip_002_ghost2",3069.46,1,12,0,5213,13165,0,3,1],
["p1",6,"op","chess_char_5_14_b",1,"none",2174,1,13,16,322116,5249,358,39,41],
["p1",7,"op","chess_char_5_07_b",2,"uniequip_002_surtr",2680,1,135,14,196134,24694,2556,41,2],
["p1",5,"op","chess_char_5_13_b",1,"uniequip_002_ghost2",3094.29,1,12,0,5213,13165,1872,3,1],
["p1",6,"op","chess_char_5_14_b",1,"none",2174,1,13,16,322116,5249,1099,39,41],
["p1",7,"op","chess_char_5_07_b",2,"uniequip_002_surtr",2680,1,135,14,196134,28522,9190,41,2],
["p1",8,"op","chess_char_5_02_b",2,"uniequip_002_titi",1439,1,4,0,0,0,0,0,0],
["p1",9,"op","chess_char_5_03_b",2,"uniequip_002_blaze2",1472,1,5,0,0,0,0,0,0],
["p1",10,"op","chess_char_5_10_b",2,"uniequip_002_lisa",1480,1,15,1,37856,19552,1289,44,4],
["p1",10,"op","chess_char_5_10_b",2,"uniequip_002_lisa",1480,1,15,1,37856,19552,3052,44,4],
["p1",11,"op","chess_char_5_12_b",0,"uniequip_002_dusk",714.8,1,7,3,40451,394,0,6,6],
["p1",12,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1170,1,10,20,451379,2283,12845,9,7],
["p1",12,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1170,1,10,20,451379,2283,0,9,7],
["-","~1","device","trap_1105_accrate",null,null,100,0,1,0,0,0,0,0,null],
["-","~2","device","trap_1105_accrate",null,null,100,0,2,0,0,0,0,0,null],
["-","~3","device","trap_1105_accrate",null,null,100,0,3,0,0,0,0,0,null],
["p1","~1","token","token_10015_dusk_drgn",null,null,1352.19,0,45,0,2698,1111,466,5,null],
["p1","~1","token","token_10015_dusk_drgn",null,null,1997,0,45,0,2698,1111,1111,5,null],
["p1","~1","token","token_10039_ulpia_block",null,null,3500,0,56,0,0,0,0,0,null],
["p1","~2","token","token_10039_ulpia_block",null,null,3500,0,88,0,0,0,0,0,null],
["p1","~3","token","token_10039_ulpia_block",null,null,3500,0,104,0,0,0,0,0,null],
@@ -984,12 +984,12 @@
"enemy_10097_crshd": [1,1,0,0,15552],
"enemy_1019_jshoot": [1,1,0,291,2799],
"enemy_1071_dftman": [1,1,0,0,4355],
"enemy_1161_tidmag": [1,1,0,482,9331],
"enemy_1161_tidmag": [1,1,0,492,9331],
"enemy_1162_magmot": [1,1,0,1368,18662],
"enemy_1196_msfyin": [1,1,0,0,3],
"enemy_1209_sfden": [1,1,0,0,21773],
"enemy_1209_sfden": [1,1,0,10,21773],
"enemy_1210_msfden": [1,1,0,0,54],
"enemy_1267_nhpbr_2": [36,36,0,23523,307930],
"enemy_1267_nhpbr_2": [36,36,0,23881,307930],
"enemy_1270_nhstlk_2": [27,27,0,16273,671846],
"enemy_1272_nhtank_2": [1,1,0,1200,23328],
"enemy_1329_cbshld_2": [1,1,0,1845,20218],
@@ -999,10 +999,10 @@
"enemy_5601_entlec": [3,3,0,0,6304],
"enemy_9006_actoxi": [30,30,0,10741,699840]
},
"hooks": [1,142,5425,343,343,2083,2705,4099,110,120,153,151,0,15568,4219,52,110,0,1,225,2,0,0],
"events": {"atk":402,"bounty":6,"deploy":29,"die":120,"dmg":2098,"engage":10,"fx":465,"heal":1553,"layer":2,"skill":304,"spawn":131,"status":720},
"hooks": [1,142,5425,343,343,2083,2703,6079,110,120,153,151,0,15568,4219,52,110,0,1,226,2,0,0],
"events": {"atk":402,"bounty":6,"deploy":29,"die":120,"dmg":2098,"engage":10,"fx":465,"heal":1416,"layer":2,"skill":304,"spawn":131,"status":720},
"fx": {"anchor":6,"aoe":45,"candle":3,"ember":2,"garrison":2,"healAoe":79,"overload":4,"revive":1,"sp":101,"substitute":1,"summon":3,"swap":1,"telegraph":1,"teleport":9,"zone":207},
"snaps": "22cf0582 8a0c0b85 516b60a1 c00ea058 dc8d82f9 9ea7f69d 76fe7830 9f220f9d 40bd8a20 94e08671 39d32dd9 963505f6 3e70ec19 de5a5755 6b3cf9e2 fe38d43e ecb66d06 6bd2841f"
"snaps": "22cf0582 8a0c0b85 516b60a1 5471dfff 3f42cf19 1f7ebd23 7b6ec922 2f9f0778 c85f5f0e 034501a3 ced71674 e3e1be9f bcf0f613 53d5dcfb 30457072 a8cc4974 45ab40f9 b32ec671"
},
"roster-016": {
"about": "pass 0 band 6: chess_char_5_19_b chess_char_6_03_a chess_char_6_06_a chess_char_5_17_b chess_char_5_20_b chess_char_5_21_b chess_char_5_22_b chess_char_5_23_b chess_char_6_01_a chess_char_6_02_a chess_char_6_04_a chess_char_6_05_a token_10017_skadi2_dedant",
@@ -2017,64 +2017,64 @@
"round": 12,
"seed": 3754088384,
"waveId": "act1autochess_h05",
"time": 210.5,
"ticks": 6315,
"time": 221.1,
"ticks": 6633,
"reason": "cleared",
"killed": 46,
"killed": 47,
"total": 167,
"unspawned": 0,
"bossHpLeft": null,
"rngDraws": 418,
"rngDraws": 178,
"errors": {"count":0,"kinds":[]},
"players": {
"p1": {
"killed": 46,
"killed": 47,
"total": 167,
"perfect": false,
"leaks": 121,
"leaks": 120,
"leaksUncounted": 0,
"coins": 2,
"dmg": 412266,
"dmg": 403494,
"bossDmg": 0,
"heal": 39432,
"deaths": 29,
"layerGains": {"indomShip":65}
"heal": 47666,
"deaths": 26,
"layerGains": {"indomShip":30}
}
},
"units": [
["p1",1,"op","chess_char_5_11_a",0,null,2474.56,1,200,2,22853,11105,5555,42,5],
["p1",2,"op","chess_char_5_19_a",0,null,3221.7,1,202,3,42457,18975,143,16,2],
["p1",3,"op","chess_char_5_13_a",0,null,0,0,163,10,104087,26324,70,36,1],
["p1",4,"op","chess_char_5_14_a",0,null,1732,1,201,2,8120,5409,1482,23,3],
["p1",5,"op","chess_char_5_06_b",0,"uniequip_003_etlchi",0,0,157,14,130469,13814,5951,32,8],
["p1",6,"op","chess_char_5_17_a",0,null,0,0,198,0,9636,19979,192,19,6],
["p1",7,"op","chess_char_5_12_a",1,null,0,0,3,3,14164,3044,75,13,2],
["p1",8,"op","chess_char_5_15_a",0,null,926,1,203,6,18667,926,14185,84,25],
["p1",9,"op","chess_char_5_20_a",0,null,0,0,187,0,7091,3476,152,15,1],
["p1",10,"op","chess_char_5_21_a",0,null,0,0,190,0,5581,7990,180,9,0],
["p1",11,"op","chess_char_5_22_a",0,null,1237,1,204,6,46595,1389,0,72,2],
["p1",12,"op","chess_char_5_23_a",0,null,0,0,156,0,0,5131,11429,21,8],
["p1",1,"op","chess_char_5_11_a",0,null,0,0,175,1,14689,14105,7927,29,5],
["p1",2,"op","chess_char_5_19_a",0,null,0,0,187,4,37230,11144,3583,17,2],
["p1",3,"op","chess_char_5_13_a",0,null,2313.27,1,197,9,97109,16590,1330,31,1],
["p1",4,"op","chess_char_5_14_a",0,null,719.25,1,198,2,10998,7283,2806,33,3],
["p1",5,"op","chess_char_5_06_b",0,"uniequip_003_etlchi",0,0,10,18,148358,13823,9857,39,9],
["p1",6,"op","chess_char_5_17_a",0,null,2250,1,200,0,15762,27066,1599,29,8],
["p1",7,"op","chess_char_5_12_a",1,null,0,0,3,3,11483,1787,383,10,1],
["p1",8,"op","chess_char_5_15_a",0,null,697.29,1,199,3,15771,1390,235,69,20],
["p1",9,"op","chess_char_5_20_a",0,null,0,0,180,0,7091,3427,103,15,1],
["p1",10,"op","chess_char_5_21_a",0,null,0,0,186,0,4781,7990,180,8,0],
["p1",11,"op","chess_char_5_22_a",0,null,0,0,193,7,37672,2726,252,60,2],
["p1",12,"op","chess_char_5_23_a",0,null,0,0,183,0,0,5809,18905,32,12],
["-","~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,1226.94,0,38,0,2547,787,17,8,null]
["p1","~1","token","token_10015_dusk_drgn",null,null,1715.06,0,38,0,2547,787,505,8,null]
],
"enemies": {
"enemy_1005_yokai_3": [1,0,1,4843,11508],
"enemy_1009_lurker": [72,16,56,703,105924],
"enemy_10159_mntrjn": [1,0,1,0,25020],
"enemy_1019_jshoot_2": [51,24,27,16056,139867],
"enemy_1005_yokai_3": [1,0,1,6184,8755],
"enemy_1009_lurker": [72,17,55,579,106043],
"enemy_10159_mntrjn": [1,0,1,0,25571],
"enemy_1019_jshoot_2": [51,22,29,17053,115897],
"enemy_1118_lidbox_2": [1,1,0,39,14774],
"enemy_1196_msfyin": [1,1,0,0,3],
"enemy_1252_lysytb_2": [1,0,1,206,12737],
"enemy_1364_spnaxe_2": [1,0,1,13143,13996],
"enemy_1404_msnip": [36,4,32,76406,127059],
"enemy_1516_jakill": [1,0,1,6954,7274],
"enemy_9011_acrefr": [1,0,1,0,5226]
"enemy_1252_lysytb_2": [1,0,1,307,12737],
"enemy_1364_spnaxe_2": [1,0,1,5874,7375],
"enemy_1404_msnip": [36,6,30,75984,145857],
"enemy_1516_jakill": [1,0,1,7909,6021],
"enemy_9011_acrefr": [1,0,1,0,9501]
},
"hooks": [1,204,6315,955,955,3544,3574,1860,75,197,63,63,0,22106,192,109,167,121,1,80,13,0,6],
"events": {"atk":1040,"bounty":1,"deploy":35,"die":76,"dmg":3536,"engage":12,"fx":118,"heal":363,"layer":13,"leak":121,"skill":126,"spawn":182,"status":263},
"fx": {"aoe":3,"dodge":6,"dollEnd":4,"garrison":13,"healAoe":5,"hpShare":1,"palsy":1,"reborn":2,"revive":8,"shield":35,"sp":8,"substitute":5,"summon":1,"swap":1,"zone":25},
"snaps": "0092f82c d956b3ce a0ea1881 5a64de8a 599b4202 9e1ae601 5374146f 16bd3aaf fde61ed2 91162832 b910803a ac839a60 a1563b88 f4c5c089 2603620b 128b4ac4 3c6b3ca2 b40bc0ae ad9e9e42 6f2dd105 b73c731d"
"hooks": [1,200,6633,907,907,3373,3390,8730,73,194,64,64,0,20306,167,105,167,120,1,76,6,0,10],
"events": {"atk":1015,"bounty":1,"deploy":31,"die":74,"dmg":3386,"engage":12,"fx":64,"heal":73,"layer":6,"leak":120,"skill":128,"spawn":182,"status":171},
"fx": {"aoe":3,"crit":2,"dodge":10,"dollEnd":1,"garrison":6,"healAoe":5,"hpShare":1,"palsy":1,"reborn":1,"revive":4,"sp":4,"substitute":3,"summon":1,"swap":2,"zone":20},
"snaps": "0092f82c ff2b39c2 ec300a50 280fca14 776e2fec 99dfc47a 3e6b6598 13676f11 9744c299 6f00c4e5 040ad1c7 d83a4d16 3926c670 f34f4c6b de9b6acf 4477f6ab 44c403f0 c156273c 20f49ab4 dffa19a7 3a1bdade 6cead901 e5e5f0d6"
},
"roster-034": {
"about": "pass 1 band 6: chess_char_5_08_b chess_char_5_11_b chess_char_5_19_b chess_char_5_13_b chess_char_5_14_b chess_char_5_07_b chess_char_5_17_b chess_char_5_10_b chess_char_5_12_b chess_char_5_15_b chess_char_5_20_b chess_char_5_21_b",
@@ -2088,26 +2088,26 @@
"time": 230,
"ticks": 6900,
"reason": "timeout",
"killed": 82,
"killed": 81,
"total": 104,
"unspawned": 0,
"bossHpLeft": null,
"rngDraws": 619,
"rngDraws": 639,
"errors": {"count":0,"kinds":[]},
"players": {"p1":{"killed":82,"total":104,"perfect":false,"leaks":22,"leaksUncounted":0,"coins":6,"dmg":4801724,"bossDmg":0,"heal":139288,"deaths":1,"layerGains":{}}},
"players": {"p1":{"killed":81,"total":104,"perfect":false,"leaks":23,"leaksUncounted":0,"coins":6,"dmg":4772471,"bossDmg":0,"heal":144036,"deaths":1,"layerGains":{}}},
"units": [
["p1",1,"op","chess_char_5_08_b",0,"uniequip_003_horn",2381.35,1,7,25,1560529,36004,1132,96,83],
["p1",2,"op","chess_char_5_11_b",0,"uniequip_003_demkni",4194.43,1,10,2,85198,10165,49823,194,31],
["p1",3,"op","chess_char_5_19_b",0,"none",3682,1,11,5,218886,7679,577,124,5],
["p1",4,"op","chess_char_5_13_b",0,"uniequip_003_ghost2",3448.92,1,13,4,163179,41498,641,210,5],
["p1",5,"op","chess_char_5_14_b",0,"none",3217.16,1,15,0,16840,27606,11049,217,16],
["p1",6,"op","chess_char_5_07_b",0,"uniequip_003_surtr",2680,1,8,4,292063,15460,635,104,49],
["p1",7,"op","chess_char_5_17_b",0,"uniequip_003_f12yin",2337.47,1,100,6,203715,3444,325,86,35],
["p1",8,"op","chess_char_5_10_b",0,"uniequip_003_lisa",1470,1,4,5,177131,0,0,116,6],
["p1",9,"op","chess_char_5_12_b",1,"uniequip_003_dusk",1667,1,5,22,1559480,0,0,91,5],
["p1",10,"op","chess_char_5_15_b",0,"none",1907.5,1,12,0,58039,0,75108,166,128],
["p1",11,"op","chess_char_5_20_b",0,"uniequip_003_aglina",1352,1,14,5,208929,1794,0,138,6],
["p1",12,"op","chess_char_5_21_b",0,"none",3330.35,1,6,4,257734,0,0,50,3],
["p1",1,"op","chess_char_5_08_b",0,"uniequip_003_horn",3000,1,7,16,1491888,37623,1068,96,77],
["p1",2,"op","chess_char_5_11_b",0,"uniequip_003_demkni",4064.38,1,10,1,73736,11343,63644,194,34],
["p1",3,"op","chess_char_5_19_b",0,"none",3682,1,11,5,219874,7768,7934,139,5],
["p1",4,"op","chess_char_5_13_b",0,"uniequip_003_ghost2",3448.92,1,13,4,163179,41271,41387,210,5],
["p1",5,"op","chess_char_5_14_b",0,"none",3261,1,15,0,16840,27231,26974,217,13],
["p1",6,"op","chess_char_5_07_b",0,"uniequip_003_surtr",2680,1,8,9,325026,17428,924,114,60],
["p1",7,"op","chess_char_5_17_b",0,"uniequip_003_f12yin",2728,1,100,8,227632,3038,310,107,46],
["p1",8,"op","chess_char_5_10_b",0,"uniequip_003_lisa",1470,1,4,6,170650,0,0,117,6],
["p1",9,"op","chess_char_5_12_b",1,"uniequip_003_dusk",1667,1,5,21,1526499,0,0,91,5],
["p1",10,"op","chess_char_5_15_b",0,"none",1907.5,1,12,1,58730,0,0,166,123],
["p1",11,"op","chess_char_5_20_b",0,"uniequip_003_aglina",1352,1,14,5,202363,1794,1794,138,6],
["p1",12,"op","chess_char_5_21_b",0,"none",3330.35,1,6,5,296053,0,0,58,3],
["-","~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]
@@ -2119,16 +2119,16 @@
"enemy_1165_duhond_2": [1,1,0,114,24767],
"enemy_1204_msfhu": [1,1,0,0,12],
"enemy_1288_duskls": [1,1,0,3189,30964],
"enemy_1381_winman": [27,23,4,16850,933397],
"enemy_1381_winman_2": [39,31,7,37691,1724781],
"enemy_1387_winshd": [30,22,5,75259,1942830],
"enemy_1425_lrcmra_2": [1,0,1,1682,43433],
"enemy_1381_winman": [27,24,3,16551,928870],
"enemy_1381_winman_2": [39,28,10,38254,1664969],
"enemy_1387_winshd": [30,23,4,78842,1981114],
"enemy_1425_lrcmra_2": [1,0,1,1682,40234],
"enemy_2009_csaudc": [1,0,1,0,14091]
},
"hooks": [1,120,6900,2592,2592,3942,3943,6279,83,102,372,368,0,35187,5677,97,104,18,1,84,0,0,6],
"events": {"atk":3006,"bounty":3,"deploy":13,"die":84,"dmg":3929,"engage":12,"fx":368,"heal":1084,"leak":18,"skill":740,"spawn":119,"status":797},
"fx": {"aoe":16,"crit":21,"dodge":6,"ember":1,"healAoe":31,"hpShare":5,"sp":140,"zone":148},
"snaps": "de3bd2e2 3bc7daf8 18ea893d 1ba5ff71 e9295c82 a68eee00 eca0d338 0a422d3c a30fc3a9 d6b53fa1 e4292430 9a138543 6f59d994 c998b7e9 26b9bbcd 2f9a6a6f 437b79cf acf535b3 9e8b5733 b227076b c64de105 4080fab7 3d4e320a"
"hooks": [1,120,6900,2644,2644,3994,3993,8937,82,102,383,379,0,34812,5720,95,104,19,1,83,0,0,8],
"events": {"atk":3066,"bounty":3,"deploy":13,"die":83,"dmg":3982,"engage":12,"fx":371,"heal":34,"leak":19,"skill":762,"spawn":119,"status":794},
"fx": {"aoe":13,"crit":20,"dodge":8,"ember":1,"healAoe":34,"hpShare":5,"sp":147,"zone":143},
"snaps": "de3bd2e2 66e9b470 efceaf9d 858e310e 0f4624f4 096d020b d67a49c3 252c2d4e e44385a0 49f2051f a4fa6a66 dde9cff7 bfc37778 e988e30c 033979c4 7d8f533e d2e87327 180843ba 330c5c8a c36250df a65b77ec 6da88ede b9087957"
},
"roster-035": {
"about": "pass 1 band 6: chess_char_6_03_a chess_char_6_06_a chess_char_6_07_a chess_char_5_22_b chess_char_5_23_b 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 token_10017_skadi2_dedant token_10030_mlyss_wtrman",
+117
View File
@@ -0,0 +1,117 @@
// test/sim/feedback7-allytarget-cast.test.js — a registered ally target (Battle.setAllyTarget: 白铁's 铁钳号·原型机, a
// summon of the enemy camp our attacks select — PRTS 铁钳号·原型机 备注 "该召唤物阵营为敌方") counts like an enemy for a
// non-heal skill's automatic start: the owner's rule of 2026-10-08 (community report: 圣约送葬人 hitting the device spent no
// bullet and gained no layer — her MANUAL ammo skill never opened, since every start condition counted enemies only).
// It stays out of enemiesInKeys / canTargetEnemy; a heal skill never counts it (禁疗); 白铁™多功能平台 is not one.
// Run: node --test test/sim/feedback7-allytarget-cast.test.js
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { makeBattle, chessRec, enemyRec, checkInvariants } from '../helpers/battleHarness.js';
import { COLS } from '../../server/sim/constants.js';
const CRAB = 'token_10027_ironmn_pile3';
const iron = (skillIndex) => ({ uid: 2, diy: { slot: 6, charId: 'char_4072_ironmn', skillIndex }, elite: true, row: 12, col: 9, dir: 'RIGHT' });
const IRON = iron(2); // S3: his pieces are 铁钳号·原型机 (S1: 白铁™多功能平台 极致火力)
const piece = (tokenId, col) => ({ uid: 10, kind: 'token', tokenId, ownerUid: 2, row: 10, col, dir: 'RIGHT' });
function field(units, extra = {}) {
const h = makeBattle({
timeLimit: 40, autoFinish: false, seed: 3, flags: { dpPerSec: 0, dpMax: 999 },
hooks: ['ammoUsed', 'skillStart', 'layerGain', 'attack'], captureNoisy: true, units, ...extra,
});
h.step();
return h;
}
test('圣约送葬人 S2 (MANUAL, DEFAULT, 12 bullets) opens with 铁钳号 alone in range, spends its bullets on it, and the 每消耗7发 garrisons gain layers', () => {
const h = field([{ uid: 1, chessId: 'chess_char_5_01_a', row: 10, col: 4, dir: 'RIGHT' }, IRON, piece(CRAB, 5)], {
bonds: { lateranoShip: { count: 3, active: true, tier: 1, layers: 0 }, visiShip: { count: 1, active: true, tier: 1, layers: 0 } },
});
const u = h.unit(1);
const crab = h.b.allyUnits.find((a) => a.defId === CRAB);
assert.equal(h.b.isAllyTarget(crab), true);
assert.equal(h.b.enemiesInKeys(u.rangeKeys, u, u.profile).length, 0, 'not an enemy of the selectors');
assert.equal(u.skill.id, 'skchr_excu2_2');
assert.equal(u.skill.rule, 'DEFAULT');
assert.equal(u.skill.kind, 'ammo');
u.skill.gainSp(999, 'test');
h.run(14);
assert.equal(u.skill.activations, 1, 'the skill opened on the device');
const atk = h.hooksOf('attack').filter((c) => c.attacker === u);
assert.ok(atk.length >= 10 && atk.every((c) => c.targets.every((t) => t === crab)), 'every attack hit the device');
const spent = h.hooksOf('ammoUsed').filter((c) => c.unit === u).length;
assert.ok(spent >= 7, `bullets spent on it (${spent})`);
const gains = h.hooksOf('layerGain').filter((c) => c.reason === 'garrison');
assert.ok(gains.length >= 2 && gains.every((c) => c.n > 0), '拉特兰 / 远见 garrison layers after 7 bullets');
assert.equal(crab.hp, crab.s.maxHp, 'the hits are still cancelled');
checkInvariants(h.b);
});
test('the other normal-attack ammo skills spend their bullets on 铁钳号 too (隐现 S2, 烛煌 S3, 新约能天使 S2)', () => {
for (const id of ['chess_char_1_01_a', 'chess_char_5_03_a', 'chess_char_6_13_a']) {
const h = field([{ uid: 1, chessId: id, row: 10, col: 4, dir: 'RIGHT' }, IRON, piece(CRAB, 5)]);
const u = h.unit(1);
assert.equal(u.skill.kind, 'ammo', id);
u.skill.gainSp(999, 'test');
h.run(10);
assert.equal(u.skill.activations, 1, `${id} opened`);
assert.ok(h.hooksOf('ammoUsed').filter((c) => c.unit === u).length > 0, `${id} spent bullets`);
checkInvariants(h.b);
}
});
test('白铁™多功能平台 is no ally target: never attacked, the skill stays closed', () => {
const h = field([{ uid: 1, chessId: 'chess_char_5_01_a', row: 10, col: 4, dir: 'RIGHT' }, iron(0), piece('token_10027_ironmn_pile1', 5)]);
const u = h.unit(1);
const pile = h.b.allyUnits.find((a) => a.defId === 'token_10027_ironmn_pile1');
assert.ok(pile && pile.deployed);
assert.equal(h.b.isAllyTarget(pile), false);
u.skill.gainSp(999, 'test');
h.run(8);
assert.equal(u.skill.activations, 0);
assert.equal(h.hooksOf('attack').filter((c) => c.attacker === u).length, 0);
assert.equal(h.hooksOf('ammoUsed').length, 0);
checkInvariants(h.b);
});
test('every start rule counts it (SEARCH, SKILL_RANGE, CUSTOM_RANGE, ACTIVE_RANGE, GDGLOW anywhere, a content trigger range) — never a heal skill', () => {
const id = 'test_cast_a';
const open = (rule, { grid = null, rangeGrid = [[0, 0], [0, 1]], col = 5, heal = false, area = null, enemy = false } = {}) => {
const h = makeBattle({
defs: {
chess: { [id]: chessRec({ id, profession: heal ? 'MEDIC' : 'SNIPER', rangeGrid, skill: { skillType: 'MANUAL', spCost: 1, initSp: 1 } }) },
enemies: { enemy_dummy: enemyRec({ key: 'enemy_dummy', hp: 1e9, speed: 0, mass: 0 }) },
},
kits: {
[id]: () => ({
skill: { kind: 'duration', duration: 5, spCost: 1, initSp: 1, heal, trigger: grid ? { rule, grid } : rule },
install(battle, unit) { if (area) unit.skill.addTriggerRange(() => [area]); },
}),
},
units: [{ uid: 1, chessId: id, row: 10, col: 4, dir: 'RIGHT' }, IRON, piece(CRAB, col)],
enemies: enemy ? [{ key: 'enemy_dummy', time: 0, pos: [11, 4] }] : [],
timeLimit: 20, autoFinish: false, seed: 2, flags: { dpPerSec: 0, dpMax: 999 },
});
h.step();
const u = h.unit(1);
const crab = h.b.allyUnits.find((a) => a.defId === CRAB);
crab.hp = crab.s.maxHp * 0.2; // an injured unit: still no heal patient (禁疗)
u.skill.gainSp(999, 'test');
h.run(3);
checkInvariants(h.b);
return u.skill.activations;
};
assert.equal(open('DEFAULT', { heal: true }), 0, 'a heal skill: the 禁疗 device is no patient');
assert.equal(open('SEARCH', { heal: true }), 0);
assert.equal(open('DEFAULT'), 1, 'DEFAULT: about to attack it');
assert.equal(open('SEARCH'), 1);
assert.equal(open('SKILL_RANGE', { grid: [[0, 0], [0, 1], [0, 2]], rangeGrid: [[0, 0]] }), 1, 'on the skill range only');
assert.equal(open('CUSTOM_RANGE', { grid: [[0, 0], [0, 1], [0, 2]], rangeGrid: [[0, 0]] }), 1);
assert.equal(open('ACTIVE_RANGE', { grid: [[0, 0], [0, 1], [0, 2]], rangeGrid: [[0, 0]] }), 1);
assert.equal(open('SKILL_RANGE', { grid: [[0, 0], [0, 1], [0, 2]], rangeGrid: [[0, 0]], col: 8 }), 0, 'outside the grid: no');
assert.equal(open('GDGLOW_SKILL_2', { rangeGrid: [[0, 0]], col: 9 }), 1, '全场: outside its own range too');
assert.equal(open('DEFAULT', { rangeGrid: [[0, 0]], col: 8, area: [10 * COLS + 8] }), 1, 'a content trigger range (addTriggerRange)');
assert.equal(open('DEFAULT', { rangeGrid: [[0, 0]], col: 8 }), 0, 'neither in range nor in a trigger range: no');
});