Abzeichen: gemeinsame Bibliothek + Sammlung im Erfolge-Tab

Neue badges.js: 5 einheitliche Abzeichen pro Sim (Einstieg/Fortgeschritten/
Könner/Meister/Ausdauer), Bedingungen aus allgemeinen Leistungsdaten (plays/
best_stars/level) → gelten sofort für ALLE Sims. Gesperrte Abzeichen sichtbar
als Ziele. ggsErfolgToStars() für Sterne aus normiertem Erfolg. Erfolge-Tab in
schueler.html zeigt die Sammlung pro Simulation (auch ungespielte = Ziele).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-20 14:24:55 +02:00
parent 3d1b8e49a3
commit 65ca8692cb
2 changed files with 111 additions and 0 deletions
+35
View File
@@ -57,6 +57,13 @@
.badge .desc{font-size:.6rem;color:#8a8a8a}
.badge.earned{border-color:#4a7c8a;background:linear-gradient(135deg,#f0f8fa,#fff)}
.badge.locked-b{opacity:.4}
.badge .desc{min-height:1.6em}
.sim-coll{margin-bottom:1.1rem}
.sim-coll-head{display:flex;align-items:center;gap:.5rem;margin:.5rem 0 .45rem;font-weight:700;font-size:.82rem}
.sim-coll-head .sc-ic{font-size:1.3rem}
.sim-coll-head .sc-t{flex:1}
.sim-coll-head .sc-stars{color:#e0a838;letter-spacing:1px;font-size:.82rem}
.sim-coll-head .sc-count{font-size:.68rem;color:#8a8a8a;background:#f0eeea;border-radius:99px;padding:.12rem .55rem;font-weight:700}
/* Erfolgs-Liste pro Modul */
.ach-summary{display:grid;grid-template-columns:repeat(3,1fr);gap:.6rem;margin-bottom:1.2rem}
.ach-summary .card{background:#fff;border-radius:10px;padding:.9rem .8rem;text-align:center;border:1.5px solid rgba(0,0,0,.05)}
@@ -87,6 +94,7 @@
.hidden{display:none}
@media(max-width:550px){.mod-grid{grid-template-columns:1fr}.badge-grid{grid-template-columns:repeat(2,1fr)}}
</style>
<script src="assets/js/badges.js"></script>
</head>
<body>
<div class="topbar">
@@ -363,6 +371,33 @@ async function renderAchievements() {
html += '</div>';
});
html += '</div>';
// === Abzeichen-Sammlung pro Simulation (gesperrte = sichtbare Ziele) ===
if (typeof GGS_SIMS !== 'undefined') {
var progBySim = {};
allProgress.forEach(function(p){ progBySim[p.sim_id] = p; });
html += '<p style="font-size:.85rem;font-weight:700;color:#4a7c8a;margin:1.3rem 0 .3rem">Abzeichen-Sammlung</p>';
html += '<p style="font-size:.68rem;color:#8a8a8a;margin:0 0 .7rem">Jede Simulation hat fünf Abzeichen. Blasse sind noch nicht geschafft — das sind deine Ziele.</p>';
GGS_SIMS.forEach(function(sim){
var p = progBySim[sim.id] || {plays:0, best_stars:0, level:1};
var got = ggsBadgeCount(p);
var st = (p.best_stars||0);
var stars = '★'.repeat(st) + '☆'.repeat(Math.max(0, 5-st));
html += '<div class="sim-coll"><div class="sim-coll-head">'
+ '<span class="sc-ic">'+sim.icon+'</span><span class="sc-t">'+sim.title+'</span>'
+ '<span class="sc-stars" title="Beste Sterne">'+stars+'</span>'
+ '<span class="sc-count">'+got+' / '+GGS_BADGES.length+'</span></div>';
html += '<div class="badge-grid">';
GGS_BADGES.forEach(function(b){
var e = b.cond(p);
html += '<div class="badge '+(e?'earned':'locked-b')+'" title="'+(e?'Geschafft!':'Ziel: '+b.desc)+'">'
+ '<div class="icon">'+b.icon+'</div><div class="name">'+b.name+'</div>'
+ '<div class="desc">'+b.desc+'</div></div>';
});
html += '</div></div>';
});
}
document.getElementById('tab-achievements').innerHTML = html;
}