Tourismustal: Audio-Modus fuer Meldungen + eigene Mega-Motive

- Umschalter Topbar (Lese-/Audio-Modus, persistiert): Im Audio-Modus
  laeuft das Spiel weiter, Meldungen werden per Browser-TTS (deutsche
  Stimme) vorgelesen und erscheinen als antippbare Info-Zeile oben;
  Klick oder 🔔-Log oeffnet die volle Karte. Entscheidungen (A/B) und
  wichtige Karten (Sieg, Zwischenbilanz, Bank) bleiben immer modal.
- Megabauwerke: 9 eigene Sprites (mehr Elemente statt vergroesserter
  Fenster/Tueren - glaubwuerdige Proportionen), zentriert, ~80 % der
  bisherigen Darstellungsgroesse; Fallback normales Motiv x1,4.
  Rodelbahn aus der Merge-Liste (dynamische Vektor-Bahn).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-11 11:05:38 +02:00
parent 2591f37191
commit 7e3158aede
15 changed files with 105 additions and 7 deletions
+16 -2
View File
@@ -36,6 +36,16 @@ const SPRITE_DEFS = {
rescue: { w: 60, bottom: 9 },
snow: { w: 44, bottom: 7 },
bikepark: { w: 108, bottom: 14 }, // 2×2-Areal, zentriert gezeichnet
// Megabauwerke: eigene Motive (mehr Elemente statt vergrößerter Fenster)
mega_restaurant: { w: 104, bottom: 12 },
mega_hotel: { w: 106, bottom: 12 },
mega_staffhouse: { w: 102, bottom: 12 },
mega_snow: { w: 96, bottom: 11 },
mega_badesee: { w: 110, bottom: 14 },
mega_ropes: { w: 106, bottom: 11 },
mega_playground: { w: 104, bottom: 12 },
mega_bikerental: { w: 98, bottom: 12 },
mega_trail: { w: 100, bottom: 11 },
ropes: { w: 58, bottom: 8 },
bikerental: { w: 50, bottom: 8 },
platform: { w: 62, bottom: 9 },
@@ -1679,11 +1689,15 @@ export class IsoRenderer {
x = ctr.x; y = ctr.y;
}
// KI-Sprites für Gebäude (Bahnen & Rodelbahn bleiben Vektor: dynamisch)
const spriteName = type === 'hotel' && level >= 2 ? 'hotel2' : type;
let spriteName = type === 'hotel' && level >= 2 ? 'hotel2' : type;
let spriteScale = type === 'hotel'
? (level >= 3 ? 1.15 : 1)
: [1, 1.15, 1.3][Math.min(2, level - 1)];
if (tile.mega) spriteScale *= 1.75; // Megabauwerk füllt sein 2×2-Areal
if (tile.mega) {
// Eigenes Mega-Motiv (glaubwürdige Proportionen); Fallback: normal ×1,4
if (this.sprites[`mega_${type}`]) { spriteName = `mega_${type}`; spriteScale = 1; }
else spriteScale *= 1.4;
}
if (type !== 'lift' && type !== 'gondola' && type !== 'sled'
&& this._sprite(spriteName, x, y, spriteScale)) {
this._badge(x + 18, y - 34, level);