bomberman: sunete (sfx), raza initiala 1, powerup-uri raza/bombe
Feedback user: nu se aud sunete, raza prea mare, lipsesc powerup-urile. - sfx(type) WebAudio local in arcade: bomb/explosion/enemy/powerup/death; beep(ok) din libJS ramane pentru raspuns corect/gresit. - raza fixa EXPLOSION_RANGE=3 -> bombRange variabil de la BASE_RANGE=1 (Bomberman clasic); maxBombs de la BASE_BOMBS=1. - powerup-uri: la spargerea cutiei, sansa 0.32 sa cada flacara (raza+1) sau bomba (bombe+1); ridicate mergand pe ele; HUD arata bombe/raza. - fix: powerup-ul cadea pe celula cutiei si checkExplosionHits il stergea instant -> colectez brokenBoxes, drop dupa checkExplosionHits. Hooks __game: powerups/bombRange/maxBombs/dropPowerupAt. Smoke 27/27. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -5,7 +5,7 @@ Smoke + regresie + campanie E2E pentru jocurile generate. Verifică faptic: fiec
|
||||
până la ecranul final, fără erori de consolă.
|
||||
|
||||
## Ownership
|
||||
- `tests/smoke.mjs` — unicul fișier de teste (~26 teste).
|
||||
- `tests/smoke.mjs` — unicul fișier de teste (~27 teste).
|
||||
- `playwright.config.mjs` (la root, **gitignored**) — config dev.
|
||||
|
||||
## Local Contracts
|
||||
@@ -16,11 +16,11 @@ până la ecranul final, fără erori de consolă.
|
||||
HTML temp generat via builder (`gameHTML`) și-l încarcă de pe `file://`.
|
||||
- **Zero erori consolă = invariant.** `trackErrors(page)` colectează `console.error` + `pageerror`;
|
||||
fiecare test asertează `errors.length === 0` la final.
|
||||
- **Tag-uri:** `@regresie` (14 — exemplu-*.html + edge cases + mobil 320px + regenerare via gameHTML +
|
||||
bomberman gameplay) și `@campanie` (12 — intro→hartă→camere→final, resume, cameră moartă,
|
||||
idempotență ușă, `$`/`$&`, beep, mobil, audio S1, voce/narațiune D10, a11y tap/aria/reduced-motion,
|
||||
navigare overworld).
|
||||
- **Status țintă: 26/26 PASS.**
|
||||
- **Tag-uri:** `@regresie` (15 — exemplu-*.html + edge cases + mobil 320px + regenerare via gameHTML +
|
||||
bomberman gameplay + bomberman rază/powerup-uri) și `@campanie` (12 — intro→hartă→camere→final, resume,
|
||||
cameră moartă, idempotență ușă, `$`/`$&`, beep, mobil, audio S1, voce/narațiune D10,
|
||||
a11y tap/aria/reduced-motion, navigare overworld).
|
||||
- **Status țintă: 27/27 PASS.**
|
||||
|
||||
## Work Guidance
|
||||
- După modificări la motoare (`escape-builder.html`): rulează suita completă; extinde `@regresie` dacă
|
||||
@@ -29,7 +29,7 @@ până la ecranul final, fără erori de consolă.
|
||||
|
||||
## Verification
|
||||
```bash
|
||||
npx playwright test tests/smoke.mjs # 26/26
|
||||
npx playwright test tests/smoke.mjs # 27/27
|
||||
npx playwright test tests/smoke.mjs --grep @regresie
|
||||
npx playwright test tests/smoke.mjs --grep @campanie
|
||||
```
|
||||
|
||||
@@ -1190,4 +1190,59 @@ test.describe('Campanie E2E @campanie', () => {
|
||||
expect(errors, errors.join('\n')).toHaveLength(0);
|
||||
});
|
||||
|
||||
test('arcade bomberman — raza initiala 1 + powerup-uri (drop la cutie, pickup creste raza/bombe) @regresie',
|
||||
async ({ page }) => {
|
||||
const errors = trackErrors(page);
|
||||
await page.goto(fileURL('exemplu-arcade.html'));
|
||||
await page.waitForFunction(() => typeof window.__game !== 'undefined', { timeout: 5000 });
|
||||
await page.evaluate(() => window.__game.restartWithSeed(11));
|
||||
|
||||
// Raza initiala = 1, max bombe = 1
|
||||
const base = await page.evaluate(() => ({ r: window.__game.bombRange, m: window.__game.maxBombs }));
|
||||
expect(base.r, 'raza initiala trebuie sa fie 1').toBe(1);
|
||||
expect(base.m, 'numar bombe initial trebuie sa fie 1').toBe(1);
|
||||
|
||||
// Raza 1: cutie la distanta 2 ramane intacta (player mutat departe de explozie)
|
||||
await page.evaluate(() => {
|
||||
window.__game.teleportPlayer(1, 1);
|
||||
window.__game.setTile(2, 1, 2); window.__game.setTile(3, 1, 2);
|
||||
window.__game.placeBomb(); window.__game.teleportPlayer(11, 11); window.__game.explodeAllBombs();
|
||||
});
|
||||
expect(await page.evaluate(() => window.__game.getTile(2, 1)), 'cutia la distanta 1 trebuie spartá').toBe(0);
|
||||
expect(await page.evaluate(() => window.__game.getTile(3, 1)), 'raza 1: cutia la distanta 2 trebuie intactá').toBe(2);
|
||||
|
||||
// Drop: peste multe cutii sparte apar powerup-uri care SUPRAVIETUIESC exploziei care le-a creat.
|
||||
// (Bug-ul prins: powerup-ul cadea pe celula cutiei si checkExplosionHits il stergea instant.)
|
||||
const dropRounds = await page.evaluate(() => {
|
||||
window.__game.restartWithSeed(11);
|
||||
let rounds = 0;
|
||||
for (let i = 0; i < 60; i++) {
|
||||
window.__game.teleportPlayer(1, 1); window.__game.setTile(2, 1, 2);
|
||||
window.__game.placeBomb(); window.__game.teleportPlayer(11, 11); window.__game.explodeAllBombs();
|
||||
// ridica orice powerup ramas (mut player pe el) ca sa nu fie sters de explozia urmatoare
|
||||
window.__game.powerups.slice().forEach(p => { if (p.x === 2 && p.y === 1) rounds++; window.__game.teleportPlayer(p.x, p.y); window.__game.movePlayer('R'); window.__game.movePlayer('L'); });
|
||||
}
|
||||
return rounds;
|
||||
});
|
||||
expect(dropRounds, 'niciun powerup nu a supravietuit pe celula cutiei sparte').toBeGreaterThan(0);
|
||||
|
||||
// Pickup: range creste bombRange, bomb creste maxBombs; powerup consumat
|
||||
const pick = await page.evaluate(() => {
|
||||
window.__game.restartWithSeed(11);
|
||||
window.__game.setTile(2, 1, 0); window.__game.setTile(3, 1, 0);
|
||||
window.__game.teleportPlayer(1, 1);
|
||||
window.__game.dropPowerupAt(2, 1, 'range'); window.__game.movePlayer('R');
|
||||
const a = { r: window.__game.bombRange, pu: window.__game.powerups.length };
|
||||
window.__game.dropPowerupAt(3, 1, 'bomb'); window.__game.movePlayer('R');
|
||||
const c = { m: window.__game.maxBombs, pu: window.__game.powerups.length };
|
||||
return { a, c };
|
||||
});
|
||||
expect(pick.a.r, 'pickup range nu a crescut bombRange').toBe(2);
|
||||
expect(pick.a.pu, 'powerup range nu a fost consumat').toBe(0);
|
||||
expect(pick.c.m, 'pickup bomb nu a crescut maxBombs').toBe(2);
|
||||
expect(pick.c.pu, 'powerup bomb nu a fost consumat').toBe(0);
|
||||
|
||||
expect(errors, errors.join('\n')).toHaveLength(0);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user