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
+11
-1
@@ -74,7 +74,12 @@ async function checkHud(c, where) {
|
||||
if (r.count != null) assert.equal(r.boardChess, r.count, `${tag}: deployCount = chess on board`);
|
||||
if (r.round > 0 && r.round <= r.lastRound) assert.equal(r.domRound, String(r.round), `${tag}: top bar round`);
|
||||
assert.equal(r.teamRows, r.players, `${tag}: one team row per player`);
|
||||
if (r.domLp != null && !['FINAL_ASSAULT', 'HIDDEN_CORE'].includes(r.phase)) assert.equal(r.domLp, String(r.lp), `${tag}: top bar LP`);
|
||||
if (r.domLp != null && ['COMBAT', 'UNITE'].includes(r.phase)) {
|
||||
// live LP (DESIGN §17.5): while the own battle's enemies enter the blue gate the top bar already shows lp − the
|
||||
// pending loss (≤ 10 a round), settled at SETTLE
|
||||
const shown = Number(r.domLp);
|
||||
assert.ok(shown <= r.lp && shown >= Math.max(0, r.lp - 10), `${tag}: top bar LP ${r.domLp} within the round's pending loss of ${r.lp}`);
|
||||
} else if (r.domLp != null && !['FINAL_ASSAULT', 'HIDDEN_CORE'].includes(r.phase)) assert.equal(r.domLp, String(r.lp), `${tag}: top bar LP`);
|
||||
if (r.shopShown) {
|
||||
assert.equal(r.domFunds, String(r.funds), `${tag}: funds card`);
|
||||
assert.equal(r.domRemain, String(Math.max(0, r.cap - r.count)), `${tag}: 剩余可放置角色`);
|
||||
@@ -962,7 +967,9 @@ describe('browser E2E against the real server', { skip: !ENABLED && 'needs Chrom
|
||||
for (let round = 1; round <= 3; round++) {
|
||||
const s0 = await c.waitFor((s) => (s.phase === 'PREP' && s.round === round && !s.ready) || (s.phase === 'SP_DRAFT' && s.round === round), `prep ${round}`, 90000);
|
||||
if (s0.phase === 'SP_DRAFT') {
|
||||
// two taps (user playtest #4 item 2): select, then confirm on the selected card
|
||||
await c.click('.spcard.is-pickable');
|
||||
await c.click('.spcard.is-armed');
|
||||
await c.waitFor((s) => s.phase === 'PREP' && !s.ready, `prep ${round} after 机变`, 30000);
|
||||
}
|
||||
await sleep(1800);
|
||||
@@ -1126,6 +1133,7 @@ describe('browser E2E against the real server', { skip: !ENABLED && 'needs Chrom
|
||||
if (!seen.has(`sp-${c.label}-${s.round}`)) { seen.add(`sp-${c.label}-${s.round}`); await sleep(2000); await c.shot(`sp-r${s.round}`); }
|
||||
if (s.sp?.turn === s.me && (await c.exists('.spcard.is-pickable'))) {
|
||||
await c.click('.spcard.is-pickable');
|
||||
await c.click('.spcard.is-armed');
|
||||
await c.waitFor((x) => x.sp?.turn !== x.me || x.phase !== 'SP_DRAFT', '机变 pick', 8000);
|
||||
did.sp += 1;
|
||||
c.note(`机变 picked (round ${s.round})`);
|
||||
@@ -1238,6 +1246,7 @@ describe('browser E2E against the real server', { skip: !ENABLED && 'needs Chrom
|
||||
await sleep(2000);
|
||||
await solo.shot(`sp-r${round}`);
|
||||
await solo.click('.spcard.is-pickable');
|
||||
await solo.click('.spcard.is-armed');
|
||||
await solo.waitFor((s) => s.phase === 'PREP' && !s.ready, `prep ${round} after 机变`, 30000);
|
||||
solo.note(`solo 机变 picked (round ${round})`);
|
||||
}
|
||||
@@ -1314,6 +1323,7 @@ describe('browser E2E against the real server', { skip: !ENABLED && 'needs Chrom
|
||||
await ready(c);
|
||||
} else if (s.phase === 'SP_DRAFT' && (await c.exists('.spcard.is-pickable'))) {
|
||||
await c.click('.spcard.is-pickable', null, { optional: true, timeout: 2000 });
|
||||
await c.click('.spcard.is-armed', null, { optional: true, timeout: 2000 });
|
||||
} else if ((s.phase === 'FINAL_ASSAULT' || s.phase === 'HIDDEN_CORE') && !bossShot) {
|
||||
await waitUnits(c, 8000);
|
||||
await sleep(1200);
|
||||
|
||||
Reference in new issue
Block a user