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
@@ -142,11 +142,16 @@ describe('干员调配 overlay (real server, headless Chrome)', { skip: !ENABLED
|
||||
test('co-op briefing (review fix): the overlay shows the INFO_CHECK time left; an edit that misses the lock is told, not lost silently', async () => {
|
||||
const { ctx, page, problems } = await open();
|
||||
await page.evaluate(() => globalThis.__SP__.net.request('room.create', { mode: 'coop', difficulty: 'NORMAL' }));
|
||||
await waitSt(page, (s) => !!s.room, 'room');
|
||||
const { room } = await waitSt(page, (s) => !!s.room, 'room');
|
||||
// a second human joins: a single human is untimed like solo (Match.soloUntimed, user playtest #4 item 3)
|
||||
const mate = await open();
|
||||
await mate.page.evaluate((code) => globalThis.__SP__.net.request('room.join', { code }), room);
|
||||
await waitSt(mate.page, (s) => s.room === room, 'the teammate in the room');
|
||||
await mate.page.evaluate(() => globalThis.__SP__.net.request('room.ready', { ready: true }));
|
||||
await page.evaluate(() => globalThis.__SP__.net.request('room.addBot', {}));
|
||||
await page.evaluate(() => globalThis.__SP__.net.request('room.start', {}));
|
||||
const brief = await waitSt(page, (s) => s.phase === 'INFO_CHECK', 'briefing');
|
||||
assert.ok(brief.deadline > 0, 'co-op briefing is timed (25 s)');
|
||||
assert.ok(brief.deadline > 0, 'co-op briefing (two humans) is timed (25 s)');
|
||||
await clickSel(page, '.brief [data-testid="loadout-open"]');
|
||||
await page.waitForSelector('.lo .lo-card', { visible: true, timeout: 15000 });
|
||||
// the briefing (and its countdown) is hidden under the overlay: the overlay carries the time left
|
||||
@@ -156,8 +161,9 @@ describe('干员调配 overlay (real server, headless Chrome)', { skip: !ENABLED
|
||||
await page.waitForFunction(() => document.querySelectorAll('.lo-card').length === 1, { timeout: 5000 });
|
||||
await page.click('.lo-card');
|
||||
await page.waitForSelector('.lo-detail .lo-skill[data-skill="0"]', { visible: true });
|
||||
// edit, and the briefing ends before the debounced send (every human ready: here the request stands in for the timer)
|
||||
// edit, and the briefing ends before the debounced send (every human ready: the requests stand in for the timer)
|
||||
await page.click('.lo-detail .lo-skill[data-skill="0"]');
|
||||
await mate.page.evaluate(() => globalThis.__SP__.net.request('g.infoReady', {}));
|
||||
await page.evaluate(() => globalThis.__SP__.net.request('g.infoReady', {}));
|
||||
await page.waitForFunction(() => !document.querySelector('.lo'), { timeout: 5000 });
|
||||
await page.waitForFunction(() => [...document.querySelectorAll('.toast__text')].some((e) => /下一局生效/.test(e.textContent)), { timeout: 5000 });
|
||||
@@ -166,6 +172,8 @@ describe('干员调配 overlay (real server, headless Chrome)', { skip: !ENABLED
|
||||
const stored = await page.evaluate(() => JSON.parse(localStorage.getItem('sp.pref.loadout')));
|
||||
assert.deepEqual(stored.entries[INSIDE], { skill: 0 }, 'kept for the next match');
|
||||
assert.deepEqual(problems, []);
|
||||
assert.deepEqual(mate.problems, []);
|
||||
await mate.ctx.close();
|
||||
await ctx.close();
|
||||
});
|
||||
|
||||
|
||||
Reference in new issue
Block a user