Files
Adminator fecd8bb9c9 Textsystem: Bis-Strich mit Leerzeichen (Zahl – Zahl) per Agent-Sweep
562 Ersetzungen in 50 Dateien: Halbgeviertstrich zwischen zwei Ziffern (=
"bis"-Bereich) bekommt Leerzeichen davor/danach (3–4 -> 3 – 4). Regex
/([0-9])\s*–\s*(?=[0-9])/ auf Rohtext (format-erhaltend, CRLF/Einrueckung
unveraendert), Bindestriche in Woertern und Minuszeichen unangetastet, alle
JSON weiter gueltig. Energiemanager-Zeitbloecke sind Display-Labels (kein
Logik-Key) -> safe.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-22 12:38:19 +02:00

101 lines
5.9 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ============================================================================
* GeoGraSim — gemeinsame Abzeichen-Bibliothek
* ----------------------------------------------------------------------------
* Zwei Ebenen, für alle Sims einheitlich strukturiert:
* 1) BASIS — 5 Abzeichen, in jeder Sim identisch, Bedingung aus allgemeinen
* Leistungsdaten (plays / best_stars / level) → gelten sofort für JEDE Sim.
* 2) THEMATISCH — je Sim ein eigenes, thematisch benanntes Abzeichen.
*
* Icons sind sauber generierte Emblems (Flat-Scandinavian, keine Emojis) unter
* assets/img/badges/. Gesperrte Abzeichen bleiben sichtbar (Zielvorstellung),
* die Beschreibung ist das Ziel. Sterne laufen parallel; ggsErfolgToStars()
* bildet den normierten Erfolg (0 100) auf 0 5 Sterne ab.
*
* progressObj (pro Sim): { plays, best_stars, level }
* ==========================================================================*/
(function (root) {
'use strict';
var IMG = 'assets/img/badges/';
// 1) BASIS — 5 Abzeichen, überall gleich.
var GGS_BADGES = [
{ id: 'einstieg', icon: IMG + 'bg-einstieg.webp', name: 'Einstieg',
desc: 'Ersten Durchlauf geschafft', cond: function (p) { return (p && p.plays || 0) >= 1; } },
{ id: 'fortgeschritten', icon: IMG + 'bg-fortgeschritten.webp', name: 'Fortgeschritten',
desc: 'Level 2 erreicht', cond: function (p) { return (p && p.level || 1) >= 2; } },
{ id: 'koenner', icon: IMG + 'bg-koenner.webp', name: 'Könner',
desc: 'Vier Sterne geschafft', cond: function (p) { return (p && p.best_stars || 0) >= 4; } },
{ id: 'meister', icon: IMG + 'bg-meister.webp', name: 'Meister',
desc: 'Fünf Sterne — Bestleistung', cond: function (p) { return (p && p.best_stars || 0) >= 5; } },
{ id: 'ausdauer', icon: IMG + 'bg-ausdauer.webp', name: 'Ausdauer',
desc: 'Acht Durchläufe', cond: function (p) { return (p && p.plays || 0) >= 8; } }
];
// Bedingungs-Bausteine für thematische Abzeichen
function lvl3(p) { return (p && p.level || 1) >= 3; }
function star5(p) { return (p && p.best_stars || 0) >= 5; }
function played6(p) { return (p && p.plays || 0) >= 6; }
function b(sim, name, desc, cond) {
return { id: 'th-' + sim, icon: IMG + 'th-' + sim + '.webp', name: name, desc: desc, cond: cond, thematic: true };
}
// 2) THEMATISCH — je Sim ein eigenes Abzeichen (Name/Icon sim-spezifisch).
var GGS_SIM_BADGES = {
'tourismustal': b('tourismustal', 'Vier-Jahreszeiten', 'Level 3 im Tourismustal', lvl3),
'tourismusregion': b('tourismusregion', 'Regionen-Meister', 'Fünf Sterne in der Region', star5),
'kofferdetektiv': b('kofferdetektiv', 'Welt-Detektiv', 'Sechs Fälle gelöst', played6),
'busfahrt': b('busfahrt', 'Europa-Kenner', 'Fünf Sterne auf der Tour', star5),
'logistik': b('logistik', 'Lieferketten-Profi','Level 3 in der Logistik', lvl3),
'weltkueche': b('weltkueche', 'Sterne-Koch', 'Fünf Sterne in der Weltküche', star5),
'farmer': b('farmer', 'Ernte-Meister', 'Sechs Ernten eingefahren', played6),
'klima': b('klima', '1,5-Grad-Held', 'Fünf Sterne im Klimaschutz', star5),
'klima-3d': b('klima-3d', 'Küstenwächter', 'Level 3 im Küstenschutz', lvl3),
'fluss': b('fluss', 'Renaturierer', 'Fünf Sterne am Fluss', star5),
'energiemanager': b('energiemanager', 'Grundlast-Profi', 'Level 3 im Energienetz', lvl3),
'heli': b('heli', 'Alpen-Pilot', 'Sechs Einsätze geflogen', played6),
'sonnensystem': b('sonnensystem', 'Astronom', 'Fünf Sterne am Himmel', star5),
'eu-werkstatt': b('eu-werkstatt', 'Gesetzgeber:in', 'Level 3 in der EU-Werkstatt', lvl3)
};
// Spielbare Simulationen (aktiv/beta) — Reihenfolge wie im Schulbuch.
var GGS_SIMS = [
{ id: 'tourismustal', title: 'Tourismustal', icon: '🏔️' },
{ id: 'tourismusregion', title: 'Tourismusregion', icon: '🗺️' },
{ id: 'kofferdetektiv', title: 'Kofferdetektiv', icon: '🧳' },
{ id: 'busfahrt', title: 'Busfahrt', icon: '🚌' },
{ id: 'logistik', title: 'Logistik Europa', icon: '🚚' },
{ id: 'weltkueche', title: 'Weltküche', icon: '🍽️' },
{ id: 'farmer', title: 'Landwirtschaft', icon: '🌾' },
{ id: 'klima', title: 'Klimawächter', icon: '🌍' },
{ id: 'klima-3d', title: 'Klimawächter 3D', icon: '🌊' },
{ id: 'fluss', title: 'Flussmanagement', icon: '🏞️' },
{ id: 'energiemanager', title: 'Energiemanager', icon: '⚡' },
{ id: 'heli', title: 'Heli-Navigation', icon: '🚁' },
{ id: 'sonnensystem', title: 'Sonnensystem', icon: '🪐' },
{ id: 'eu-werkstatt', title: 'EU-Werkstatt', icon: '🏛️' }
];
// Alle Abzeichen einer Sim = 5 Basis + (falls vorhanden) 1 thematisches.
function ggsSimBadges(simId) {
var out = GGS_BADGES.slice();
if (GGS_SIM_BADGES[simId]) out.push(GGS_SIM_BADGES[simId]);
return out;
}
function ggsBadgeCount(p, simId) {
var list = simId ? ggsSimBadges(simId) : GGS_BADGES, n = 0;
for (var i = 0; i < list.length; i++) if (list[i].cond(p)) n++;
return n;
}
function ggsErfolgToStars(pct) {
if (pct == null || isNaN(pct)) return 0;
return Math.max(0, Math.min(5, Math.round(pct / 20)));
}
root.GGS_BADGES = GGS_BADGES;
root.GGS_SIM_BADGES = GGS_SIM_BADGES;
root.GGS_SIMS = GGS_SIMS;
root.ggsSimBadges = ggsSimBadges;
root.ggsBadgeCount = ggsBadgeCount;
root.ggsErfolgToStars = ggsErfolgToStars;
})(typeof window !== 'undefined' ? window : this);