Tourismustal: Soziale Verantwortung (Personalhaus) + Editor-Fixes

- Personalhaus-Ausbau = Wohnqualitaet: zufriedenes Personal, freundlicher
  Service, +2/+4/+6 Gaeste-Zufriedenheit je Stufe (nur bei Beschaeftigten).
  Report-Zeile, Wissensbaustein (reale Saisonkraft-Unterkuenfte),
  BUILD_INFO + Audio neu, spezieller Ausbau-Toast. Glossar-Begriff
  soziale-verantwortung mit Bild + Modul-Zuordnung (SQL).
- Editor-Bugfix: _sprite las w/bottom aus der beim Laden eingefrorenen
  Kopie - Justierungen wirkten nicht. Jetzt live aus SPRITE_DEFS.
- Export-Button klargestellt: exportiert ALLE justierten Gebaeude auf einmal.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-11 23:48:47 +02:00
parent 250532f9a8
commit 20974b8b3b
8 changed files with 57 additions and 9 deletions
@@ -0,0 +1,23 @@
-- ============================================================
-- Tourismustal: Glossar-Begriff "Soziale Verantwortung" (+ Zuordnung)
-- Stand: 2026-07-11 · Atlas · idempotent
-- Mechanik in der Sim: Personalhaus-Ausbau → Wohnqualität → Personal-
-- zufriedenheit → freundlicherer Service → Gäste-Zufriedenheit (Win-win).
-- ============================================================
INSERT INTO glossar (key_slug, title, short, text, short_easy, text_easy, category, sort_order, image_path) VALUES
('soziale-verantwortung', 'Soziale Verantwortung',
'Unternehmen tragen Verantwortung für ihre Beschäftigten gute Arbeits- und Wohnbedingungen zahlen sich doppelt aus.',
'Soziale Verantwortung (Corporate Social Responsibility) heißt: Ein Betrieb kümmert sich nicht nur um Gewinn, sondern auch um Menschen und Umwelt. Im Alpentourismus betrifft das besonders die Saisonarbeitskräfte real wohnen sie oft in engen, schlechten Personalunterkünften. Wer in gute Personalhäuser, faire Löhne und gutes Arbeitsklima investiert, bekommt zufriedenes, loyales Personal und Gäste spüren freundlichen Service sofort. Soziale Verantwortung ist damit kein Kostenfaktor, sondern eine Investition: ein Win-win für Beschäftigte, Gäste und Betrieb.',
'Ein Betrieb kümmert sich gut um seine Mitarbeiter:innen.',
'Soziale Verantwortung heißt: Ein Betrieb schaut auch auf seine Leute, nicht nur aufs Geld. Zum Beispiel: gute Wohnungen für das Personal. Zufriedene Mitarbeiter sind freundlich. Das freut auch die Gäste. Alle gewinnen.',
'gesellschaft', 214,
'assets/img/glossar/soziale-verantwortung.webp')
ON DUPLICATE KEY UPDATE
title=VALUES(title), short=VALUES(short), text=VALUES(text),
short_easy=VALUES(short_easy), text_easy=VALUES(text_easy),
category=VALUES(category), sort_order=VALUES(sort_order), image_path=VALUES(image_path);
INSERT INTO glossar_modules (glossar_id, module_id)
SELECT id, 'tourismustal' FROM glossar WHERE key_slug = 'soziale-verantwortung'
ON DUPLICATE KEY UPDATE module_id=VALUES(module_id);
Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

+2 -2
View File
@@ -89,10 +89,10 @@
<div class="ed-btns">
<button id="edReset">↩︎ Zurücksetzen</button>
<button id="edCopy" class="primary">📋 Export kopieren</button>
<button id="edCopy" class="primary">📋 ALLES exportieren</button>
</div>
<label>Export (an Atlas → wird fest eingebaut)</label>
<label>Gesamt-Export: enthält ALLE justierten Gebäude & Stufen (an Atlas → wird fest eingebaut)</label>
<textarea id="edOut" readonly></textarea>
</div>
+6 -3
View File
@@ -416,9 +416,11 @@ export const BUILD_INFO = {
icon: '🏠', title: 'Wohnraum für dein Personal!',
text: '12 Angestellte finden hier ein Zuhause. Betriebe ohne Personal '
+ 'laufen nur mit halber Kraft die Personal-Zeile links zeigt, ob '
+ 'alle Stellen besetzt sind.\n\n📍 LAGE ZÄHLT: Baue es nahe bei den '
+ 'Betrieben (max. 4 Felder, Kreis beim Bauen) liegt es weiter weg, '
+ 'wirkt es nur zu zwei Dritteln.',
+ 'alle Stellen besetzt sind.\n\n🤝 SOZIALE VERANTWORTUNG: Baust du das '
+ 'Personalhaus später aus, wohnt dein Personal besser zufriedene '
+ 'Mitarbeiter:innen sind freundlicher, und das merken die Gäste.\n\n'
+ '📍 LAGE ZÄHLT: Baue es nahe bei den Betrieben (max. 4 Felder, Kreis '
+ 'beim Bauen) liegt es weiter weg, wirkt es nur zu zwei Dritteln.',
},
snow: {
icon: '❄️', title: 'Die Beschneiung steht bereit!',
@@ -714,6 +716,7 @@ export const KNOWLEDGE = {
],
staffhouse: [
{ term: 'Saisonarbeit & Wohnraum', text: 'Tourismus braucht viele Arbeitskräfte, oft in Saisonarbeit. Ohne leistbaren Wohnraum finden die Betriebe kein Personal.' },
{ term: 'Soziale Verantwortung', text: 'Real wohnen Saisonkräfte oft in engen, schlechten Unterkünften. Wer in gute Personalhäuser investiert, bekommt zufriedenes Personal und das spüren die Gäste: freundlicher Service, bessere Bewertungen. Ein Win-win.' },
],
snow: [
{ term: 'Klimawandel-Anpassung', text: 'Beschneiung sichert die Saison, wenn die Winter wärmer werden braucht aber viel Wasser und Energie.' },
+5 -2
View File
@@ -1716,10 +1716,13 @@ export class IsoRenderer {
_sprite(name, x, y, scale = 1, flip = false) {
const s = this.sprites[name];
if (!s) return false;
const w = s.w * scale;
// w/bottom IMMER live aus SPRITE_DEFS lesen so wirken Editor-
// Justierungen sofort (die geladene Kopie wäre eingefroren).
const def = SPRITE_DEFS[name] || s;
const w = def.w * scale;
this._shadow(x, y + 2, w * 0.38, w * 0.16);
// Motiv endet im 1024er-Bild bei ~88 % der Höhe
const top = y + s.bottom - w * 0.88;
const top = y + def.bottom - w * 0.88;
if (flip) {
const ctx = this.ctx;
ctx.save(); ctx.translate(x, 0); ctx.scale(-1, 1);
+3 -1
View File
@@ -98,7 +98,9 @@ function inspectBuilding(c, r) {
audio.build();
renderer.addFloat('🏗️ Umbau …', '#e8892b', c + 0.5, r - 0.5, true);
ui.updateKPIs();
ui.toast(`🏗️ ${res.name} wird auf Stufe ${roman} umgebaut (${res.cost.toLocaleString('de-AT')} €) schau zu!`);
ui.toast(rep.type === 'staffhouse'
? `🤝 ${res.name} wird auf Stufe ${roman} ausgebaut (${res.cost.toLocaleString('de-AT')} €) dein Personal wohnt besser, der Service wird freundlicher!`
: `🏗️ ${res.name} wird auf Stufe ${roman} umgebaut (${res.cost.toLocaleString('de-AT')} €) schau zu!`, 6000);
telemetry.log('upgrade', { c, r, cost: res.cost, level: res.level });
ui._closeBuilding(); // Karte schließen → man sieht die Baustelle
},
+18 -1
View File
@@ -506,7 +506,12 @@ export function buildingReport(state, c, r) {
if (def.cap) lines.push(`Förderleistung: ${effVal(b, 'cap')} Gäste/Tag`);
if (def.beds) lines.push(`Betten: ${effVal(b, 'beds')}`);
if (def.access) lines.push(`Anreise: +${effVal(b, 'access')} Gäste/Tag`);
if (def.housing) lines.push(`Wohnraum: ${effVal(b, 'housing')} Angestellte`);
if (def.housing) {
lines.push(`Wohnraum: ${effVal(b, 'housing')} Angestellte`);
lines.push((b.level || 1) > 1
? `🤝 Wohnqualität Stufe ${['', 'I', 'II', 'III', 'IV'][b.level || 1]}: zufriedenes Personal, freundlicherer Service (+${((b.level - 1) * 2)} Zufriedenheit)`
: '🤝 Ausbau verbessert die Wohnqualität soziale Verantwortung zahlt sich in Zufriedenheit aus');
}
if (def.summerCap) lines.push(`Sommergäste: bis ${effVal(b, 'summerCap')}/Tag`);
if (def.spendBonus) lines.push(`Mehrumsatz: +${effVal(b, 'spendBonus')} €/Gast`);
if (def.snowPower) lines.push(`Beschneiung: +${effVal(b, 'snowPower').toFixed(1)} cm/Tag`);
@@ -826,6 +831,18 @@ export function simulateDay(state) {
let satTarget = 70;
if (count(state, 'restaurant') > 0) satTarget += 12;
satTarget += Math.min(8, sum(state, 'satBonus'));
// Soziale Verantwortung: gut ausgebaute Personalhäuser = bessere Wohn-
// qualität = zufriedenes Personal = freundlicherer Service. Wirkt nur,
// wenn überhaupt Personal beschäftigt ist. (Ø-Ausbaustufe → 0…+6)
const shLevels = state.buildings
.filter(b => b.type === 'staffhouse').map(b => b.level || 1);
if (shLevels.length && state.staffNeeded > 0) {
const avg = shLevels.reduce((a, v) => a + v, 0) / shLevels.length;
state.staffCare = Math.round((avg - 1) * 20) / 10; // Stufe II=+2 … IV=+6
satTarget += state.staffCare;
} else {
state.staffCare = 0;
}
if (crowding > 0.9) satTarget -= 20;
if (staffFactor < 1) satTarget -= 15;
if (winter) {