feat(sasch40): add Nebenraum, Marktplatz minigame & trapdoor to Hinterzimmer
- Split GameBoy chassis brand header: 'AKT III' on clean dedicated second line
- Add 5-room tavern architecture: Schankraum, Nebenraum, Marktplatz, Hinterland, Hinterzimmer
- Introduce Nebenraum (Kemenate/Atelier) with Amy at her easel painting the neon banner and Zuluman magic mirror
- Update Marktplatz scene with Mario juggling chainsaws/hops and NAT on the festival stage
- Implement Wildschwein-Schnick-Schnack-Schnuck minigame against NAT (Best of 3, Keiler > Dickicht > Lanze > Keiler)
- Replace secret tap with cellar floor trapdoor ('Luke zum Hinterraum') initially invisible
- Update automated playtest covering all 25 screens with zero console/network errors
- Document all architectural decisions in projects/sasch40/AGENTS.md
This commit is contained in:
@@ -151,13 +151,52 @@ async function runPlaytest() {
|
||||
await new Promise(r => setTimeout(r, 400));
|
||||
}
|
||||
|
||||
// 6. TAVERN: MARKTPLATZ (Mario with spinning chainsaws)
|
||||
// 5b. TAVERN: NEBENRAUM (Amy painting & Zuluman Mirror)
|
||||
console.log('🎨 Navigating to Nebenraum (Kemenate / Atelier)...');
|
||||
const nebenraumDoor = await page.$('.hotspot-door-nebenraum');
|
||||
if (nebenraumDoor) {
|
||||
await nebenraumDoor.click();
|
||||
} else {
|
||||
const nrTab = await page.$('.room-tab:nth-child(2)');
|
||||
if (nrTab) await nrTab.click();
|
||||
}
|
||||
await new Promise(r => setTimeout(r, 1000));
|
||||
console.log('📸 05b: Capturing Nebenraum (Atelier & Mirror)...');
|
||||
await page.screenshot({ path: path.join(SCREENSHOTS_DIR, '05b_tavern_nebenraum.png') });
|
||||
|
||||
// Test Amy in Nebenraum
|
||||
console.log('🎨 Testing Amy Dialog in Nebenraum...');
|
||||
const amyBtn = await page.$('.hotspot-amy-nebenraum');
|
||||
if (amyBtn) {
|
||||
await amyBtn.click();
|
||||
await new Promise(r => setTimeout(r, 700));
|
||||
console.log('📸 05c: Capturing Amy Dialog...');
|
||||
await page.screenshot({ path: path.join(SCREENSHOTS_DIR, '05c_tavern_amy_dialog.png') });
|
||||
const actionBtn = await page.$('.dialog-actions .action-btn');
|
||||
if (actionBtn) await actionBtn.click();
|
||||
await new Promise(r => setTimeout(r, 400));
|
||||
}
|
||||
|
||||
// Test Zuluman Mirror in Nebenraum
|
||||
console.log('🪞 Testing Zuluman Magic Mirror in Nebenraum...');
|
||||
const mirrorBtn = await page.$('.hotspot-mirror-nebenraum');
|
||||
if (mirrorBtn) {
|
||||
await mirrorBtn.click();
|
||||
await new Promise(r => setTimeout(r, 700));
|
||||
console.log('📸 14: Capturing Zuluman Mirror...');
|
||||
await page.screenshot({ path: path.join(SCREENSHOTS_DIR, '14_tavern_zuluman_mirror.png') });
|
||||
const closeBtn = await page.$('.mirror-box .action-btn');
|
||||
if (closeBtn) await closeBtn.click();
|
||||
await new Promise(r => setTimeout(r, 400));
|
||||
}
|
||||
|
||||
// 6. TAVERN: MARKTPLATZ (Mario with spinning chainsaws & NAT on stage)
|
||||
console.log('🎪 Navigating to Marktplatz...');
|
||||
const marktplatzTab = await page.$('.room-tab:nth-child(2)');
|
||||
const marktplatzTab = await page.$('.room-tab:nth-child(3)');
|
||||
if (marktplatzTab) {
|
||||
await marktplatzTab.click();
|
||||
await new Promise(r => setTimeout(r, 1000));
|
||||
console.log('📸 08: Capturing Marktplatz (Mario chainsaws)...');
|
||||
console.log('📸 08: Capturing Marktplatz (Mario chainsaws & NAT stage)...');
|
||||
await page.screenshot({ path: path.join(SCREENSHOTS_DIR, '08_tavern_marktplatz.png') });
|
||||
|
||||
// Click Mario
|
||||
@@ -172,22 +211,45 @@ async function runPlaytest() {
|
||||
await new Promise(r => setTimeout(r, 400));
|
||||
}
|
||||
|
||||
// Click NAT (Josef)
|
||||
// Click NAT (Josef) & Test Wildschwein Duell
|
||||
const natBtn = await page.$('.hotspot-nat');
|
||||
if (natBtn) {
|
||||
await natBtn.click();
|
||||
await new Promise(r => setTimeout(r, 700));
|
||||
console.log('📸 09b: Capturing NAT (Josef) Dialog...');
|
||||
await page.screenshot({ path: path.join(SCREENSHOTS_DIR, '09b_tavern_nat_dialog.png') });
|
||||
const actionBtn = await page.$('.dialog-actions .action-btn');
|
||||
if (actionBtn) await actionBtn.click();
|
||||
await new Promise(r => setTimeout(r, 400));
|
||||
|
||||
// Start Wild Boar Duel
|
||||
console.log('🐗 Launching Wildschwein-Schnick-Schnack-Schnuck Duel...');
|
||||
const startBoarBtn = await page.$('.dialog-actions .action-btn');
|
||||
if (startBoarBtn) {
|
||||
await startBoarBtn.click();
|
||||
await new Promise(r => setTimeout(r, 800));
|
||||
console.log('📸 09c: Capturing Wildschwein Duel Modal...');
|
||||
await page.screenshot({ path: path.join(SCREENSHOTS_DIR, '09c_tavern_boar_duel.png') });
|
||||
|
||||
// Play a move: Keiler!
|
||||
const keilerBtn = await page.$('.boar-choice-btn:nth-child(1)');
|
||||
if (keilerBtn) {
|
||||
await keilerBtn.click();
|
||||
await new Promise(r => setTimeout(r, 600));
|
||||
console.log('📸 09d: Capturing Boar Duel Clash...');
|
||||
await page.screenshot({ path: path.join(SCREENSHOTS_DIR, '09d_tavern_boar_duel_round.png') });
|
||||
}
|
||||
|
||||
// Close Boar Duel modal
|
||||
const closeBoarBtn = await page.$('.boar-duel-box .duel-close-btn');
|
||||
if (closeBoarBtn) {
|
||||
await closeBoarBtn.click();
|
||||
await new Promise(r => setTimeout(r, 400));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 7. TAVERN: HINTERLAND (Mane hiking)
|
||||
console.log('🌲 Navigating to Hinterland...');
|
||||
const hinterlandTab = await page.$('.room-tab:nth-child(3)');
|
||||
const hinterlandTab = await page.$('.room-tab:nth-child(4)');
|
||||
if (hinterlandTab) {
|
||||
await hinterlandTab.click();
|
||||
await new Promise(r => setTimeout(r, 1000));
|
||||
@@ -207,18 +269,18 @@ async function runPlaytest() {
|
||||
}
|
||||
}
|
||||
|
||||
// 8. TAVERN: SECRET HINTERZIMMER (VIP Rave via Secret Tap)
|
||||
console.log('🗝️ Returning to Schankraum to check Secret Tap (initially invisible)...');
|
||||
// 8. TAVERN: SECRET HINTERZIMMER (VIP Rave via Luke zum Hinterraum)
|
||||
console.log('🗝️ Returning to Schankraum to check Luke zum Hinterraum (trapdoor)...');
|
||||
const schankraumTab = await page.$('.room-tab:nth-child(1)');
|
||||
if (schankraumTab) {
|
||||
await schankraumTab.click();
|
||||
await new Promise(r => setTimeout(r, 600));
|
||||
}
|
||||
|
||||
console.log('🪩 Triggering Secret Tap Easter Egg...');
|
||||
const secretTap = await page.$('.secret-tap-hotspot');
|
||||
if (secretTap) {
|
||||
await secretTap.click();
|
||||
console.log('🪩 Triggering Luke zum Hinterraum Easter Egg...');
|
||||
const trapdoor = await page.$('.trapdoor-hotspot');
|
||||
if (trapdoor) {
|
||||
await trapdoor.click();
|
||||
await new Promise(r => setTimeout(r, 1000));
|
||||
console.log('📸 12: Capturing Secret VIP Hinterzimmer...');
|
||||
await page.screenshot({ path: path.join(SCREENSHOTS_DIR, '12_tavern_hinterzimmer_vip.png') });
|
||||
@@ -236,25 +298,13 @@ async function runPlaytest() {
|
||||
}
|
||||
}
|
||||
|
||||
// 9. ZULUMAN MAGIC MIRROR & GSTANZL DUEL
|
||||
console.log('🪞 Testing Zuluman Magic Mirror...');
|
||||
// 9. GSTANZL DUEL
|
||||
console.log('⚔️ Testing Gstanzl-Duel and [✕] Exit Button...');
|
||||
const backToGaststube = await page.$('.hotspot-door-back-vip');
|
||||
if (backToGaststube) {
|
||||
await backToGaststube.click();
|
||||
await new Promise(r => setTimeout(r, 600));
|
||||
}
|
||||
const mirrorBtn = await page.$('.hotspot-mirror');
|
||||
if (mirrorBtn) {
|
||||
await mirrorBtn.click();
|
||||
await new Promise(r => setTimeout(r, 700));
|
||||
console.log('📸 14: Capturing Zuluman Mirror...');
|
||||
await page.screenshot({ path: path.join(SCREENSHOTS_DIR, '14_tavern_zuluman_mirror.png') });
|
||||
const closeBtn = await page.$('.mirror-box .action-btn');
|
||||
if (closeBtn) await closeBtn.click();
|
||||
await new Promise(r => setTimeout(r, 400));
|
||||
}
|
||||
|
||||
console.log('⚔️ Testing Gstanzl-Duel and [✕] Exit Button...');
|
||||
const duelBtn = await page.$('.duel-trigger');
|
||||
if (duelBtn) {
|
||||
await duelBtn.click();
|
||||
|
||||
Reference in New Issue
Block a user