Playtest #4 fixes: tile picking, knocked-down state, element gauges, draft timer, live stats, shop items, drones, 赫默, 炎佑, UI flash
- #1 picking by the tile under the pointer (prep, battle, pen, equipment drops); the dragged model stays under the pointer (mouse and touch); pixel probe removed; phone ghost-click on the underframe fixed - #2 two-tap confirm on 机变 cards (like the shop) - #3 a 同盟 room with one human is untimed like 独立模拟 (no countdown outside battles) - #4 strategy draft: one synced countdown, 30 s per human turn, timeout takes the highlighted band - #5 special 维式重锤 (4) and 突变细胞 no longer sold; item card shows where they come from - #6 operator skill-mode sounds no longer play on normal attacks (纯烬艾雅法拉 and 55 others) - #7 detail card shows live battle stats and the prep-time battle-start stats (g.unitStats) - #8 official element gauges on units; burst cooldown (阻回) per PRTS - #9 knocked-down operators stay on their tile with a redeploy countdown ring - #10 drone behaviour per PRTS (暴鸰, 先兆者 shells, 黑云, 萨科塔之眼) - #11 赫默's drone only from her skill; placeable summons limited to talent tokens - #12 炎佑 stays where it is with no enemies; 祛恶之焰 as a continuous channel - #13 the occasional giant bond icon (loading texture scaled ×46) fixed - docs (DESIGN §18), recordings, data and tests updated (2467 unit tests, all browser suites green)
This commit is contained in:
1 parent
0aba602ecf
commit
d4f868cd19
107 files changed
+4510
-1653
No files matched your search
@@ -185,6 +185,22 @@ function battleViewState(c) {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait for a prep matching `pred`; a 机变 draft on the way is picked with its two taps (user playtest #4 item 2) —
|
||||
* a single human's 机变 is untimed (Match.soloUntimed, item 3): nothing picks it for them any more.
|
||||
*/
|
||||
async function untilPrep(c, pred, what, timeout = 90000) {
|
||||
const t0 = Date.now();
|
||||
for (;;) {
|
||||
const left = Math.max(2000, timeout - (Date.now() - t0));
|
||||
const s = await c.waitFor((x) => (x.phase === 'PREP' && pred(x)) || (x.phase === 'SP_DRAFT' && x.sp?.turn === x.me), what, left);
|
||||
if (s.phase === 'PREP') return s;
|
||||
await c.click('.spcard.is-pickable', null, { optional: true, timeout: 4000 });
|
||||
await c.click('.spcard.is-armed', null, { optional: true, timeout: 4000 });
|
||||
await c.waitFor((x) => x.phase !== 'SP_DRAFT' || x.sp?.turn !== x.me, '机变 picked', 15000);
|
||||
}
|
||||
}
|
||||
|
||||
function assertNoPen(v, tag) {
|
||||
assert.deepEqual(v.orphans, [], `${tag}: no stale unit sprite of another field`);
|
||||
assert.equal(v.penVisible, 0, `${tag}: no pen figure`);
|
||||
@@ -216,7 +232,7 @@ describe('user playtest #2 item 6 — 前往查看 → 返回战场 in combat (r
|
||||
}
|
||||
let observed = false;
|
||||
for (let tries = 0; tries < 3 && !observed; tries++) {
|
||||
const s0 = await c.waitFor((s) => s.phase === 'PREP' && !s.ready, 'prep', 90000);
|
||||
const s0 = await untilPrep(c, (s) => !s.ready, 'prep');
|
||||
await sleep(1500);
|
||||
// the own field fights with everything the deploy cap allows: it clears its wave long before the idle AI's
|
||||
// enemies have walked their whole path
|
||||
@@ -268,7 +284,7 @@ describe('user playtest #2 item 6 — 前往查看 → 返回战场 in combat (r
|
||||
}
|
||||
assert.ok(observed, `observed a teammate's battle and came back (${c.log.join(' | ')})`);
|
||||
// and the next prep: the board without the pen, the pen only with 🔍▶▶
|
||||
const s1 = await c.waitFor((s) => s.phase === 'PREP', 'next prep', 90000);
|
||||
const s1 = await untilPrep(c, () => true, 'next prep');
|
||||
await sleep(1500);
|
||||
assertNoPen(await battleViewState(c), `R${s1.round} prep after observing`);
|
||||
assert.deepEqual(problemsOf([c]), []);
|
||||
@@ -344,6 +360,9 @@ describe('user playtest #2 item 10 — boss-round prep on the boss field (real s
|
||||
await host.click('.room-bar__right button', '开始模拟', { timeout: 20000 });
|
||||
for (const c of [host, guest]) await c.waitFor((s) => s.phase === 'INFO_CHECK', 'briefing', 30000);
|
||||
for (const c of [host, guest]) await c.click('.brief__foot .btn--primary', '准备就绪');
|
||||
// the draft first (a client still in the briefing would count as done without picking: its turn then runs out —
|
||||
// Match.BAND_TURN_SECONDS, 30 s each since user playtest #4 item 4)
|
||||
for (const c of [host, guest]) await c.waitFor((s) => s.phase !== 'INFO_CHECK', 'band draft', 40000);
|
||||
// band draft: whoever's turn it is picks a free strategy
|
||||
const picked = new Set();
|
||||
const t0 = Date.now();
|
||||
|
||||
Reference in new issue
Block a user