Abzeichen: thematische Sim-Abzeichen + saubere Icons + Lehreransicht

- badges.js: 5 Basis-Abzeichen + je Sim 1 thematisches (Vier-Jahreszeiten,
  Sterne-Koch, Alpen-Pilot …), 19 sauber generierte Flat-Emblem-Icons (keine Emojis)
- Erfolge-Tab: Sammlung mit Bild-Icons, gesperrte grau = Ziele; alte Emoji-Badges raus
- Lehrer-Matrix: neue Spalte „Abzeichen" (freigeschaltet von gesamt) pro Schüler:in

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-20 14:35:43 +02:00
parent 65ca8692cb
commit 504b0098a6
22 changed files with 85 additions and 58 deletions
+12
View File
@@ -412,6 +412,7 @@ schueler01,Max M.,,,,,</pre>
</div>
</div>
<script src="assets/js/badges.js"></script>
<script>
var BASE = (window.__GGS__?.baseUrl) || '';
if (!BASE) { var p = location.pathname, i = p.indexOf('/geograsim'); if (i !== -1) { var rest = p.substring(i + '/geograsim'.length); BASE = rest.indexOf('/App/') === 0 ? p.substring(0, i) + '/geograsim/App' : p.substring(0, i) + '/geograsim'; } }
@@ -3203,6 +3204,8 @@ function renderMatrix() {
html += '<th class="r-mod" onclick="sortMatrix(\''+mod.id+'\')" title="'+esc(mod.name)+'">'+mod.icon+' '+arrow(mod.id)+'</th>';
});
html += '<th class="r-total" onclick="sortMatrix(\'total\')">Gesamt '+arrow('total')+'</th>';
var hasBadges = (typeof ggsBadgeCount === 'function');
if (hasBadges) html += '<th class="r-total" title="Freigeschaltete Abzeichen (Basis + thematisch)">Abzeichen</th>';
html += '</tr></thead><tbody>';
students.forEach(function(s) {
@@ -3220,6 +3223,15 @@ function renderMatrix() {
});
var t = m.totals[s.id] || {score:0, plays:0};
html += '<td class="r-total"><b>'+t.score.toFixed(1)+'</b><span class="rp">'+t.plays+'×</span></td>';
if (hasBadges) {
var bc = 0, bmax = 0;
m.modules.forEach(function(mod){
var c = m.cells[s.id]?.[mod.id];
bmax += ggsSimBadges(mod.id).length;
if (c) bc += ggsBadgeCount({plays:c.plays, best_stars:c.stars, level:c.level}, mod.id);
});
html += '<td class="r-total"><b>'+bc+'</b><span class="rp">von '+bmax+'</span></td>';
}
html += '</tr>';
});
html += '</tbody></table></div></div>';