// Modell-Langzeittest ohne Browser: spielt eine typische Schüler-Strategie // über 600 Tage (5 Jahre) durch – inkl. Freischalt-Reihenfolge – und prüft, // ob Balancing und Meilensteine plausibel bleiben. import { createState, simulateDay, canPlace, place, MAP_COLS, MAP_ROWS } from '../js/model.js'; import { MILESTONES } from '../js/data.js'; const s = createState(); // Bau-Wunschliste in sinnvoller Reihenfolge; gebaut wird, sobald // freigeschaltet, leistbar und ein Platz gefunden ist. const queue = ['restaurant', 'lift', 'access', 'hotel', 'staffhouse', 'restaurant', 'lift', 'snow']; function tryBuildNext() { const type = queue[0]; if (!type) return; for (let r = MAP_ROWS - 1; r >= 0; r--) { for (let c = 0; c < MAP_COLS; c++) { if (canPlace(s, type, c, r).ok) { place(s, type, c, r); queue.shift(); console.log(` Tag ${s.day + 1}: ${type} gebaut @ ${c},${r}`); return; } } } } let goalsDay = null; const milestonesFired = new Set(); for (let d = 1; d <= 600; d++) { // Meilensteine wie im Spiel freischalten for (const m of MILESTONES) { if (!milestonesFired.has(m.id) && m.when(s)) { milestonesFired.add(m.id); s.unlocked.add(m.unlock); console.log(` Tag ${d}: Meilenstein ${m.id} → ${m.unlock} frei`); } } tryBuildNext(); simulateDay(s); if (s.goalsDone && goalsDay === null) goalsDay = d; if (!Number.isFinite(s.money) || !Number.isFinite(s.nature)) { console.error('NaN am Tag', d); process.exit(1); } if (d % 120 === 0) { console.log(`Tag ${d} (${s.season} ${s.year}): Geld ${s.money} € · Gäste ${s.guestsToday} · maxGäste ${s.stats.maxGuests} · Zufr. ${s.satisfaction} % · Natur ${Math.round(s.nature)} %`); } } console.log('---'); console.log('Nicht gebaut:', queue.length ? queue : 'alles gebaut'); console.log('Meilensteine:', [...milestonesFired].join(', ') || 'KEINE'); console.log('Ziele erreicht an Tag:', goalsDay ?? 'NICHT erreicht'); console.log('Endstand:', `${s.money} €`, `· maxGäste ${s.stats.maxGuests}`, `· Natur ${Math.round(s.nature)} %`, `· Zufriedenheit ${s.satisfaction} %`); // --- Kurzcheck der weiteren Szenen: Vorbauten + 240 Tage ohne Ausreißer --- for (const scene of ['boom', 'klimawandel']) { const st = createState(scene); console.log(`\n[${scene}] Vorbauten:`, st.buildings.map(b => b.type).join(', '), `· Start: ${st.money} € · Natur ${st.nature} % · freigeschaltet: ${[...st.unlocked].join(', ')}`); // im Klimawandel-Szenario einen Panoramaweg dazubauen if (scene === 'klimawandel') { outer: for (let r = MAP_ROWS - 1; r >= 0; r--) { for (let c = 0; c < MAP_COLS; c++) { if (canPlace(st, 'trail', c, r).ok) { place(st, 'trail', c, r); break outer; } } } } for (let d = 1; d <= 240; d++) { simulateDay(st); if (!Number.isFinite(st.money) || !Number.isFinite(st.nature)) { console.error(`[${scene}] NaN am Tag`, d); process.exit(1); } } console.log(`[${scene}] Tag 240 (${st.season} ${st.year}): Geld ${st.money} € · maxGäste ${st.stats.maxGuests} · maxSommer ${st.stats.maxSummerGuests} · Natur ${Math.round(st.nature)} % · Zufr. ${st.satisfaction} %`); }