feedback7 R22-RENDER: an enemy standing out its attack recovery is drawn standing — the snapshot carries stand / standCut and the interpolator holds the position until the recovery ends (PR #381 by @ZiyueW1116, supersedes #307 / #314); golden: unchanged
Since 0.2.0 the sim stands an unblocked enemy for the rest of its attack clip (ai.js attackStand → atkStandUntil), but render/interp.js lerped x/y over the whole snapshot gap, so the view slid through a recovery the sim held (repro: a real 隐形弩手, snapshots 4.9 / 5.0, stand until 4.934 — sampled at 4.917 it slid at vx −0.2). The snapshot now carries, only when non-empty, `stand: [[id, until]]` (atkStandUntil of enemies alive, deployed, visible, neither feared nor stunned) and `standCut: [[id, at]]` (the latest time each listed enemy's recovery was cut or ignored: a displacement, fear, a stun, hiding, leaving — Battle._cutAttackStand, display metadata the battle never reads). sample() holds the older position until `until` and interpolates the rest (HP / SP keep the whole interval), stays linear when the newer snapshot records a cut inside the interval, and extrapolates nothing for a newest snapshot that shows a stand, a death, a stun or a block. Teleports and redeploys still snap first; old snapshots without the fields interpolate as before. Substantially @ZiyueW1116's code (PR #381), authored as theirs. Changed on review: the docs (SIM §9, design/network.md) and code comments in English like the rest of them; the snapshot builds its listed-id set only when an enemy has a cut to report. Golden: unchanged — the digest canon hashes neither field and the sim's timing does not move (all 283 scenarios match). Tests: test/render/attack-recovery-interp.test.js (new, 25: metadata validation, hold-then-slide, cuts, legacy snapshots, extrapolation guards, real 隐形弩手 / Weedy push-kill / stun / freeze / sleep / levitate / block / fear battles) 25/25; render/interp 16/16; sim battle, perf, robustness, downelem 69/69.
This commit is contained in:
1 parent
ffa538c39d
commit
8a64edc9e9
10 files changed
+541
-20
No files matched your search
@@ -535,6 +535,7 @@ export function updateEnemy(b, e, dt) {
|
||||
if (!e.alive) return;
|
||||
// hidden (teleporting) enemies only advance wait legs
|
||||
const stunned = e.s.flags.stun;
|
||||
if (stunned || e.hidden || e.s.flags.fear) b._cutAttackStand(e);
|
||||
const prevCd = e.atkCd;
|
||||
if (e.atkCd > 0 && !stunned && !e.hidden) e.atkCd = Math.max(0, e.atkCd - dt);
|
||||
// a stun / freeze / sleep / 浮空 — or leaving the field — takes the enemy out of its attack: a swing short of its damage
|
||||
@@ -644,6 +645,7 @@ function advanceRoute(b, e, dt, R, standing = false) {
|
||||
continue;
|
||||
}
|
||||
if (leg.t === 'disappear') {
|
||||
b._cutAttackStand(e);
|
||||
b._setHidden(e, true);
|
||||
e.atkStandUntil = -Infinity; standing = false; // off the field: its attack clip is over
|
||||
R.legIdx++; R.pts = null;
|
||||
|
||||
Reference in new issue
Block a user