Tourismustal: iPad-Feedback Runde 2 (5 Punkte)

- Bau-Ablehnung erklaert jetzt immer auch die Bauregeln des Gebaeudes
  (Toast: Grund + Beschreibung, 7 s).
- Lehrer-Schalter fuer den Vorlese-Modus: class_modules.audio_info
  (Migration, Default AN) + modules-API set_audio_info + Toggle auf der
  Modul-Karte im Cockpit (Vorlesen an/aus) + Wrapper injiziert
  TT_FEATURES.audioInfo + Sim blendet den Umschalter aus und erzwingt
  Lese-Modus, wenn gesperrt.
- Bus zeigt bei Rueckfahrt sein Heck: Heckscheibe + rote Ruecklichter,
  Tuer/Spiegel richtungsabhaengig.
- Bikepark-Flowtrails: 3 Stufen hangAUFwaerts (gleiche Richtung wie
  Lift-Pisten).
- Info-Button an jedem Bauwerk im Baumenue: erklaert Wirkung, Kosten,
  Lage-Regeln und Lehrplan-Wissen VOR dem Bau.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-11 18:07:03 +02:00
parent cb60a8c16d
commit 55a83d5daf
10 changed files with 131 additions and 35 deletions
+16 -2
View File
@@ -52,7 +52,7 @@ if ($method === 'GET') {
$classId = $session['class_id'];
$classMap = [];
$settings = $db->fetchAll(
'SELECT module_id, mode, current_level, quiz_enabled, due_date, started_at, paused
'SELECT module_id, mode, current_level, quiz_enabled, audio_info, due_date, started_at, paused
FROM class_modules WHERE class_id = ?', [$classId]);
foreach ($settings as $s) $classMap[$s['module_id']] = $s;
@@ -108,6 +108,7 @@ if ($method === 'GET') {
'mode' => $mode,
'forcedLevel' => ($mode === 'teacher_started' && $cm) ? (int)($cm['current_level'] ?? 1) : null,
'quizEnabled' => (bool)($cm['quiz_enabled'] ?? 0),
'audioInfo' => (bool)($cm['audio_info'] ?? 1),
'dueDate' => $cm['due_date'] ?? null,
'paused' => (bool)($cm['paused'] ?? 0),
'assignmentCompleted' => $assignmentCompleted,
@@ -129,7 +130,7 @@ if ($method === 'GET') {
// Klassen-Defaults laden (inkl. Level + Pause-Status für die Lehrer-UI)
$settings = $db->fetchAll(
'SELECT module_id, mode, current_level, paused, due_date, started_at FROM class_modules WHERE class_id = ?',
'SELECT module_id, mode, current_level, paused, audio_info, due_date, started_at FROM class_modules WHERE class_id = ?',
[$classId]
);
$classMap = [];
@@ -191,6 +192,7 @@ if ($method === 'GET') {
'classMode' => $classMap[$mod['id']] ?? 'locked',
'currentLevel' => $meta ? (int)($meta['current_level'] ?? 1) : 1,
'paused' => $meta ? (bool)($meta['paused'] ?? 0) : false,
'audioInfo' => $meta ? (bool)($meta['audio_info'] ?? 1) : true,
'dueDate' => $meta['due_date'] ?? null,
'startedAt' => $meta['started_at'] ?? null,
];
@@ -264,6 +266,18 @@ if ($method === 'POST') {
Response::ok();
}
// Vorlese-Modus (Audio-Info) für die Klasse erlauben/sperren
if ($action === 'set_audio_info') {
$on = !empty($body['enabled']) ? 1 : 0;
$db->execute(
'INSERT INTO class_modules (class_id, module_id, enabled, audio_info)
VALUES (?, ?, 1, ?)
ON DUPLICATE KEY UPDATE audio_info = VALUES(audio_info)',
[$classId, $moduleId, $on]
);
Response::ok();
}
// Auftrag pausieren / fortsetzen
if ($action === 'pause' || $action === 'resume') {
$paused = $action === 'pause' ? 1 : 0;