feedback5: merge WE1 — fidelity (sim rules): 秘术师 store at the attack check (深靛; 维伊 / 黑键 plug into it), enemy attacks land at their damage frame so a short stun / freeze / sleep / 浮空 / 缴械 / 恐惧 before it cancels the swing, 武者 heal per damage instance through 禁疗, 庇护 the strongest only, PHY-X 不高于 50 %, 链愈师 jumps in the 3×3, a summon readied at its owner's redeploy, Misery's duration skills, 伺夜 S2 in 战术点形态, centurions hit up to block-count targets; merge fixes: 黑键's kit keeps the up() import WE2's S2 cast needs (WE1 dropped it with its tick store — the first regeneration had stored 9288 swallowed errors in diy-114), the 自选 refusal names 集成战略 / 生息演算, tools/golden.mjs prints a missing value, test/golden.test.js fails on any stored engine error; golden: vs WE1 only the W4B / WE2 scenarios differ (roster-042, bond-egirShip-high, coop2-ABYSS-10-boosted, coop2-NORMAL-70-diy, diy-045 / 078 / 114 / 115 / 116)
This commit is contained in:
commit
e2bb090f44
60 files changed
+6888
-6103
No files matched your search
@@ -12,8 +12,8 @@
|
||||
// - Trait (秘术师) "攻击造成法术伤害,在找不到攻击目标时可以将攻击能量储存起来之后一齐发射(最多3个)" (bb times; MSC-X 4):
|
||||
// ranged arts bolts, hits air units (分支特性信息 "可对空"), blocks 1, ground enemies target him. The store (分支特性信息:
|
||||
// "能量储存与攻击占用相同的攻击间隔:…若无有效目标且能量储存数未满,则改为储存一份攻击能量(属于攻击行为)"): when his attack is
|
||||
// ready and he has no valid target he stores one energy and his attack interval starts again — this kit's own store,
|
||||
// as 维伊's (op-veen.js; the engine's mystic profile stores one interval after the attack is ready). His next attack
|
||||
// ready and he has no valid target he stores one energy and his attack interval starts again — the shared 秘术师
|
||||
// profile (professions.js installMystic) with this kit's `storeEnergy` (his elite energy, S3), as 维伊's. His next attack
|
||||
// releases them at its target ("一齐发射"), each hitting for ATK × the attack's scale × the energy scale (talent 1) as
|
||||
// an arts 普通伤害 attack hit ("由储存能量形成的弹道造成攻击力100%的法术普通伤害"); they land with the main bolt (one
|
||||
// volley to one target [ASSUMED], as 维伊's), the later ones only on a target still alive. [ASSUMED] a redeployment holds
|
||||
@@ -65,7 +65,6 @@
|
||||
|
||||
import { num, talentBb, moduleBb, traitBb, skillRec, batMod, up, toggleBuff } from '../shared/tier1.js';
|
||||
import { canTargetEnemy, sortEnemyTargets } from '../../../targeting.js';
|
||||
import { acquireTargets, effectiveProfile } from '../../../ai.js';
|
||||
import { hasHp } from '../../../damage.js';
|
||||
import { COLS } from '../../../constants.js';
|
||||
|
||||
@@ -215,21 +214,19 @@ export default {
|
||||
trait: {
|
||||
hitsFn: () => 1, // the engine's main hit only: the stored energies are this kit's (land)
|
||||
onEachHit(battle, unit, victim, hc) { if (hc.kind === 'main' && victim && victim.side === 'enemy') land(battle, unit, victim, hc); },
|
||||
// the store (the shared profile calls it at his attack check with no valid target — professions.js installMystic:
|
||||
// an attack action, the interval restarts): the trait's energies first, then the elite one; during S3 elite ones
|
||||
// only (false = a full store: he idles)
|
||||
storeEnergy(battle, unit) {
|
||||
const v = stateOf(unit);
|
||||
if (skillOn(unit, S3)) { if (v.n + v.e >= N + E) return false; v.e++; }
|
||||
else if (v.n < N) v.n++;
|
||||
else if (v.e < E) v.e++;
|
||||
else return false;
|
||||
return true;
|
||||
},
|
||||
install(battle, unit) {
|
||||
battle.on('deploy', (ctx) => { if (ctx.unit === unit && !ctx.move) unit.trait.ebn = null; }, { owner: unit });
|
||||
// the store: his attack ready and no valid target ⇒ one energy, an attack action (the interval restarts); the
|
||||
// attack loop ran first this tick (a valid target was attacked instead)
|
||||
battle.on('tick', () => {
|
||||
if (!up(unit) || !unit.canAct || unit.s.flags.disarm || unit.atkCd > 0) return;
|
||||
const prof = effectiveProfile(unit);
|
||||
if (prof.noAttack || acquireTargets(battle, unit, prof).length) return;
|
||||
const v = stateOf(unit);
|
||||
if (skillOn(unit, S3)) { if (v.n + v.e >= N + E) return; v.e++; }
|
||||
else if (v.n < N) v.n++;
|
||||
else if (v.e < E) v.e++;
|
||||
else return;
|
||||
unit.atkCd = unit.s.interval;
|
||||
}, { owner: unit });
|
||||
battle.on('death', (ctx) => { if (ctx.unit && ctx.unit.side === 'enemy') stateOf(unit).q.delete(ctx.unit.id); }, { owner: unit });
|
||||
},
|
||||
},
|
||||
|
||||
Reference in new issue
Block a user