Тесты: спринт 4 T4 — свежие скриншоты, харденинг orca-playtest против T2b-гонки escape (атомарный hold) — 47/47 live
|
Before Width: | Height: | Size: 135 KiB After Width: | Height: | Size: 134 KiB |
|
Before Width: | Height: | Size: 352 KiB After Width: | Height: | Size: 371 KiB |
|
Before Width: | Height: | Size: 323 KiB After Width: | Height: | Size: 327 KiB |
|
Before Width: | Height: | Size: 135 KiB After Width: | Height: | Size: 135 KiB |
|
Before Width: | Height: | Size: 435 KiB After Width: | Height: | Size: 428 KiB |
|
Before Width: | Height: | Size: 446 KiB After Width: | Height: | Size: 445 KiB |
|
Before Width: | Height: | Size: 158 KiB After Width: | Height: | Size: 141 KiB |
|
Before Width: | Height: | Size: 159 KiB After Width: | Height: | Size: 159 KiB |
|
Before Width: | Height: | Size: 277 KiB After Width: | Height: | Size: 255 KiB |
|
Before Width: | Height: | Size: 501 KiB After Width: | Height: | Size: 492 KiB |
|
Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 134 KiB |
@@ -180,9 +180,13 @@ async function hookIt() {
|
||||
ok('подсечка: state=REEL', true);
|
||||
}
|
||||
// Заставляем улов: d почти ноль, удержание ~2 c, polling CARD с таймаутом 30 c.
|
||||
// Т2b: сброс и удержание в ОДНОМ eval — гэп между отдельными eval'ами на
|
||||
// реалтайм-вкладке успевает заполнить escape-бар (1.67 c) и рыба сбегает; фазу
|
||||
// тоже сбрасываем в затишье (в рывке держать = трение + нагрузка, до обрыва).
|
||||
async function forceCatch() {
|
||||
await evalPage('reel.d = 0.5; "ok"');
|
||||
const pid = await pointerDown();
|
||||
const pid = ++pointerSeq;
|
||||
await evalPage('reel.d = 0.5; reel.phase = "calm"; reel.phaseT = 5; reel.escape = 0;'
|
||||
+ 'document.getElementById("game").dispatchEvent(new PointerEvent("pointerdown",{pointerId:' + pid + ',isPrimary:true,bubbles:true})); "ok"');
|
||||
try {
|
||||
await sleep(2000);
|
||||
await waitState('CARD', 30000);
|
||||
@@ -342,17 +346,23 @@ async function forceCatch() {
|
||||
await castToWait();
|
||||
await forceBite();
|
||||
await hookIt();
|
||||
const bs = await evalPage('({b: stateBoss, ph: bossPhase, rb: !!(reel && reel.boss)})');
|
||||
// Т2b: за гэп между подсечкой и этой проверкой escape-бар успел подрасти —
|
||||
// гасим, чтобы гонка «CLI-roundtrip vs пассивный сход» не решалась против бота.
|
||||
const bs = await evalPage('if (reel) reel.escape = 0; ({b: stateBoss, ph: bossPhase, rb: !!(reel && reel.boss)})');
|
||||
ok('босс: старт боя (stateBoss=true, bossPhase=1, reel.boss)',
|
||||
bs && bs.b === true && bs.ph === 1 && bs.rb === true, JSON.stringify(bs).slice(0, 80));
|
||||
// Фазы 1-2: d→0 — босс-обрыв (SNAP без штрафа) → авто-REEL в следующую (глубже)
|
||||
// фазу. В SNAP holding сбрасываем в ТОМ ЖЕ eval, что и детекцию: onUp в
|
||||
// состоянии SNAP reel.holding не чистит (см. п.9 «Подводных камней»).
|
||||
// Т2b: сброс d/phase/escape и pointerdown — в ОДНОМ eval (тот же паттерн, что
|
||||
// в forceBite): CLI-roundtrip между отдельными eval'ами — это «пассив в
|
||||
// затишье», а бар схода за 1.67 c игрового времени заполняется → босс сбежал.
|
||||
for (let phase = 1; phase <= 3; phase++) {
|
||||
await evalPage('reel.d = 0.4; reel.phase = "calm"; reel.phaseT = 5; "ok"');
|
||||
const pid = await pointerDown();
|
||||
const pid = ++pointerSeq;
|
||||
await evalPage('reel.d = 0.4; reel.phase = "calm"; reel.phaseT = 5; reel.escape = 0;'
|
||||
+ 'document.getElementById("game").dispatchEvent(new PointerEvent("pointerdown",{pointerId:' + pid + ',isPrimary:true,bubbles:true})); "ok"');
|
||||
if (phase < 3) {
|
||||
await waitCond('state === "SNAP" ? (reel && (reel.holding = false), "yes") : "state=" + state', 30000, 'SNAP фазы ' + phase);
|
||||
await waitCond('state === "SNAP" ? (reel && (reel.holding = false, reel.escape = 0), "yes") : "state=" + state', 30000, 'SNAP фазы ' + phase);
|
||||
await pointerUp(pid);
|
||||
await waitState('REEL', 30000);
|
||||
} else {
|
||||
|
||||