Tourismustal: Kosten-Check - Realitaets-Quiz mit Bonus-Budget

Kostenwahrheit als Lernmoment statt Fussnote: Nach dem Erst-Bau von
Lift/Gondel/Hotel/Beschneiung/Bushaltestelle erscheint (Event-Pacing)
je einmalig ein Kosten-Check: Info mit echtem AT-Beispiel + Schaetzfrage
(mehr/weniger). Richtig = +2.000 Euro Bank-Bonus, falsch = nur die
Aufloesung. Verifizierte Zahlen: Leppleskofel-6er 12 Mio. (Dolomiten-
stadt), Patscherkofelbahn 58 geplant -> 83,2 Mio. bezahlt (Stadt Ibk),
WKO-Hotelrichtwerte 220-270k/Zimmer, Schneekanone 27-35k + 1 Mio./
Pistenkm, Ski Arlberg Tageskarte 81,50. Erster Check traegt den
Modell-Hinweis (Preise verkleinert, Verhaeltnisse stimmen).
Antwortrichtungen gemischt (3x mehr, 2x weniger). Quiz-Karten sind
Entscheidungen -> immer modal, auch im Audio-Modus.
Schulbuch Seite 2: Daten-Box 'Was kostet das wirklich?' + Meta-Aufgabe D
(Modellkompetenz) + Quellen 8-12. Modulseite: Vereinfachungs-Hinweis
in long_desc (SQL lokal+prod).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-13 01:14:55 +02:00
parent dbfb5be5a0
commit e7e0f922c7
3 changed files with 152 additions and 1 deletions
+57 -1
View File
@@ -2,7 +2,7 @@
// Audio und UI und treibt die laufende Zeit an (einstellbare Zeitskala).
import { createState, simulateDay, canPlace, place, demolish, upgrade, ecoUpgrade, buildingReport } from './model.js';
import { BUILDINGS, EVENTS, MILESTONES, DECISIONS, HINTS, ADVISOR, BUILD_INFO } from './data.js';
import { BUILDINGS, EVENTS, MILESTONES, DECISIONS, HINTS, ADVISOR, BUILD_INFO, KOSTEN_CHECKS } from './data.js';
import { IsoRenderer } from './iso.js';
import { UI } from './ui.js';
import { telemetry } from './telemetry.js';
@@ -193,6 +193,13 @@ function onTileTap(c, r, pointerType) {
state.firedEvents.add(infoId);
ui.showCard({ id: infoId, ...BUILD_INFO[type], sound: 'card' });
}
// 💶 Kosten-Check vormerken: Realitäts-Quiz zum gerade gebauten Typ
// (erscheint später mit Abstand übers Event-Pacing, nicht sofort)
const kc = KOSTEN_CHECKS.find(k => k.trigger === type);
if (kc && !state.firedEvents.has(kc.id)) {
state.firedEvents.add(kc.id);
(state.kcQueue ??= []).push(kc.id);
}
}
// ===== Live-View für Lehrkräfte (Plattform-Hook) =====
@@ -269,6 +276,29 @@ function submitAssessment(completed) {
} catch { /* offline/Standalone: still ok */ }
}
// 💶 Kosten-Check auflösen: richtig = Bonus-Budget, falsch = nur Lerninfo
function resolveKostenCheck(kc, picked) {
const richtig = picked === kc.richtig;
if (richtig) {
state.money += kc.bonus;
const b = state.buildings[0];
if (b) renderer.addFloat(`💶 +${kc.bonus.toLocaleString('de-AT')}`, '#3f8f5e', b.c + 0.5, b.r - 0.5, true);
}
ui.showCard({
id: kc.id + '-aufloesung', transient: true, forceModal: true,
icon: richtig ? '✅' : '📚',
sound: richtig ? 'success' : 'card',
title: richtig
? `Richtig! Gut kalkuliert: +${kc.bonus.toLocaleString('de-AT')} € Bonus`
: 'Nicht ganz aber jetzt weißt du es!',
text: kc.aufloesung + (richtig
? '\n\n🏦 Die Bank ist beeindruckt von deinem Realitätswissen und gewährt bessere Konditionen.'
: ''),
});
ui.updateKPIs();
telemetry.log('kosten_check_result', { id: kc.id, richtig });
}
// ---------- Karten: Meilensteine, Sieg, Entscheidungen, Events ----------
function checkEvents() {
// Meilensteine: Gebäude Schritt für Schritt freischalten (Szene 1)
@@ -317,6 +347,32 @@ function checkEvents() {
// Pacing-Fenster: erst nach Schonfrist und mit Mindestabstand zur letzten Karte
const calmEnough = state.day >= EVENT_GRACE_DAYS
&& (state.day - state.lastInterruptDay) >= EVENT_COOLDOWN;
// 💶 Kosten-Check: Realitäts-Quiz (Info + Schätzfrage, Bonus bei Treffer).
// Läuft im selben Ruhe-Fenster wie Entscheidungen nie im Karten-Stakkato.
if (calmEnough && state.kcQueue?.length) {
const kc = KOSTEN_CHECKS.find(k => k.id === state.kcQueue[0]);
state.kcQueue.shift();
if (kc) {
state.lastInterruptDay = state.day;
const first = !state.firedEvents.has('kc-modellhinweis');
state.firedEvents.add('kc-modellhinweis');
const vorspann = first
? 'Übrigens: Die Preise in dieser Simulation sind stark verkleinert und '
+ 'vereinfacht, damit du schnell entscheiden kannst. Die VERHÄLTNISSE '
+ 'stimmen die echten Zahlen sind viel größer. Zeig, dass du sie kennst:\n\n'
: '';
ui.showCard({
id: kc.id, icon: '💶', title: kc.title,
text: vorspann + kc.info + '\n\n❓ ' + kc.frage,
choices: [
{ label: kc.optionen[0], onPick: () => resolveKostenCheck(kc, 0) },
{ label: kc.optionen[1], onPick: () => resolveKostenCheck(kc, 1) },
],
});
telemetry.log('kosten_check', { id: kc.id });
return;
}
}
// Entscheidungs-Karten: A/B-Wahl mit echten Folgen (je einmal, zeitversetzt)
if (calmEnough) for (const d of DECISIONS) {
if (state.firedEvents.has(d.id)) continue;