feedback1 WE: 鸭爵 strategy enemies follow the official rules
- 圆仔 is unblockable (PRTS 天赋 "无法攻击/被阻挡"); it was blocked like any
ground enemy because its kit only had the front guard.
- 鸭爵 runs at move speed x(1 + run.attack@move_speed) once hurt: +300 % for
the strategy version, +400 % for the original (PRTS); it was x3 / x4.
- The swap also applies in the Final Assault and the Hidden Core (PRTS
下半/PRTS盟约记录 鸭爵 备注 "在最终回合和隐秘核心回合中仍然生效"): any
ground wave enemy but the leader, its parts, bounties and uncounted units
can be swapped (the leader rounds' escorts are elites); each player of a
boss field gets its own 0-2.
- The four swapped-in enemies cost 1 LP at the protection point
("但进入保护目标点将减少1点目标生命值"): build-data sets their lpr to 1
instead of the database's roguelike 0 (Final Assault LP, detail card).
This commit is contained in:
1 parent
7f134737ce
commit
f1e7f7da1a
10 files changed
+262
-19
No files matched your search
@@ -1088,14 +1088,18 @@ for (const key of ['enemy_1501_demonk', 'enemy_10018_sgrobh']) {
|
||||
}
|
||||
|
||||
for (const key of ['enemy_2001_duckmi', 'enemy_2001_duckmi_2']) {
|
||||
test(`${nm(key)}: unblockable; runs ×${tb(key, 'run.attack@move_speed')} once hit`, () => {
|
||||
// PRTS 鸭爵 "移动速度+400%" (run 4); the 鸭爵 strategy's version "受伤后移动速度+300%" (run 3): ×(1 + run)
|
||||
test(`${nm(key)}: unblockable, no attack; runs ×${1 + tb(key, 'run.attack@move_speed')} once hit`, () => {
|
||||
const h = arena();
|
||||
h.step();
|
||||
const e = put(h, key, [10, 7], { move: true });
|
||||
const v = e.s.moveSpeed;
|
||||
assert.ok(e.s.flags.unblockable);
|
||||
assert.ok(e.profile.noAttack);
|
||||
h.b.dealDamage(null, e, { amount: 1, type: 'true' });
|
||||
approx(e.s.moveSpeed, v * tb(key, 'run.attack@move_speed'));
|
||||
approx(e.s.moveSpeed, v * (1 + tb(key, 'run.attack@move_speed')));
|
||||
h.b.dealDamage(null, e, { amount: 1, type: 'true' });
|
||||
approx(e.s.moveSpeed, v * (1 + tb(key, 'run.attack@move_speed')), 1e-6, 'once');
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1622,6 +1626,20 @@ test(`${nm('enemy_10097_crshd')} / ${nm('enemy_2085_skzjxd')}: physical / arts d
|
||||
approx(h.b.dealDamage(back, y, { amount: 1000, type: 'true' }), 1000, 1e-6, 'true damage is never reduced');
|
||||
});
|
||||
|
||||
for (const key of ['enemy_2085_skzjxd', 'enemy_2085_skzjxd_2']) {
|
||||
test(`${nm(key)}: 无法攻击/被阻挡 (PRTS 天赋) — walks through a blocker, never attacks`, () => {
|
||||
const h = arena({ units: [{ chessId: 't_wall', row: 10, col: 5 }], hooks: ['blocked'] });
|
||||
h.step();
|
||||
const e = put(h, key, [10, 7], { move: true, route: { motion: 'WALK', start: [10, 7], end: [10, 2], checkpoints: [] } });
|
||||
assert.ok(e.s.flags.unblockable);
|
||||
assert.ok(e.profile.noAttack);
|
||||
h.runUntil(() => e.x < 4, 60);
|
||||
assert.ok(e.x < 4, `passed the wall (x ${e.x})`);
|
||||
assert.equal(h.hooksOf('blocked').length, 0);
|
||||
assert.equal(e.stats.attacks, 0);
|
||||
});
|
||||
}
|
||||
|
||||
test(`${nm('enemy_10098_crhro')}: 重生 once after ${tb('enemy_10098_crhro', 'reborn.duration')} s at full HP`, () => {
|
||||
const h = arena();
|
||||
h.step();
|
||||
|
||||
Reference in new issue
Block a user