Tourismustal: Megabauwerke + Figuren-Feinschliff

- Merge-Mechanik: 4 gleiche 1x1-Gebaeude im Quadrat verschmelzen zum
  2x2-Megabauwerk. Skaleneffekt als Lernmoment: 4-fache Leistung, nur
  3-fache Betriebskosten (Erklaerkarte beim ersten Mal). Level = Maximum
  der Teile, Abriss-Erloes auf 4-fachem Bauwert, Bahnen/Bus/Bikepark
  ausgenommen. Rendering zentriert und 1.75x skaliert.
- Gaeste stehen nicht mehr im Wasser (dwell auf Wasser -> sofort ans Ufer).
- Skifahrer schimpft "#*!", wenn ihm der Schnee unterm Ski ausgeht.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-11 10:43:06 +02:00
parent 727e82c8fe
commit 2591f37191
3 changed files with 84 additions and 15 deletions
+18 -9
View File
@@ -448,15 +448,23 @@ export class IsoRenderer {
if (!ct || ct.terrain === 'water' || !liftSkiable(s, ct.elev)) {
g.mode = 'walk'; g.route = []; g.nextLift = null; g.longDwell = false;
g.tx = g.x + (Math.random() - 0.5) * 2; g.ty = g.y + 1.5;
this._say(g, '#*!', 4000); // schimpft: Schnee zu Ende, Ski getragen!
}
}
if (g.mode === 'crashed') { g.moving = false; continue; } // liegt, wartet auf Bergung
if (g.mode === 'dwell') { // verweilen (essen, schauen)
g.wait -= dt;
g.moving = false;
if (g.wait <= 0) this._nextActivity(g);
continue;
// Niemand steht im Wasser herum: sofort ans Ufer weitergehen
const wt = s.map[Math.round(g.y)]?.[Math.round(g.x)];
if (wt?.terrain === 'water') {
const d = this._randomDestination();
g.mode = 'walk'; g.longDwell = false; g.tx = d.c; g.ty = d.r;
} else {
g.wait -= dt;
g.moving = false;
if (g.wait <= 0) this._nextActivity(g);
continue;
}
}
if (g.mode === 'ride') { // sitzt sichtbar im Sessel
@@ -1664,17 +1672,18 @@ export class IsoRenderer {
_drawBuilding(type, x, y, tile) {
const ctx = this.ctx;
const level = tile.level || 1;
// 2×2-Gebäude: zentriert über dem Areal zeichnen (Anker = links oben)
if ((BUILDINGS[type]?.size || 1) > 1) {
const half = (BUILDINGS[type].size - 1) / 2;
const ctr = this.tileToWorld(tile.c + half, tile.r + half, tile.elev);
// 2×2-Gebäude (Bikepark oder Megabauwerk): zentriert über dem Areal
const isBig = (BUILDINGS[type]?.size || 1) > 1 || tile.mega;
if (isBig) {
const ctr = this.tileToWorld(tile.c + 0.5, tile.r + 0.5, tile.elev);
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;
const spriteScale = type === 'hotel'
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 (type !== 'lift' && type !== 'gondola' && type !== 'sled'
&& this._sprite(spriteName, x, y, spriteScale)) {
this._badge(x + 18, y - 34, level);