Die Dogen-Muenzen: drei Saetze zu je drei Stufen

Filipe, 28.09.2026: "ich werde die drei varianten schicken fuer
niedrige spenden. mittlere und hohe spenden. alle drei varianten will
ich drauf so dass ich sie aussuchen kann wie ich will. aber pass sie
sofort diesen 3 kategorien an."

DIE ZUORDNUNG IST GELESEN, NICHT GERATEN

In allen drei Saetzen geht es nacktes Metall -> Steinkranz ->
Vollbesatz; Filipes Dateinummern (01/02/03) und die Uhrzeiten seiner
Entwuerfe laufen genau mit. Klassik: Palladium, Gold mit Saphir,
Diamant. Amethyst: Stahl, Rosegold, Vollbesatz. Neon: Chrom auf
Schwarz, Steinkranz, Vollbesatz.

AUS 25 MB WURDEN 443 KB

Je Bild 320 px WebP statt 1254 px PNG, Faktor 58. Die Zahl ist
gemessen: Groesster Fall in der Seite 110 px (Karte, hoechste Stufe),
auf der OBS-Tafel 189 px, bei doppelter Bildschirmdichte rund 220.
Drei Megabyte fuer ein 24-Pixel-Zeichen waeren ein Ladebalken mitten
in der Sendung -- wer auf dem Handy zusieht, bekaeme die Karte, wenn
sie schon wieder weg ist. Die Originale liegen neben den
Datenbanksicherungen, nicht im Repo: 26 MB, die bei jedem Klon
mitkaemen und die niemand ausliefert.

WELCHE MUENZE WANN -- ABGELEITET STATT GEPFLEGT

"Niedrig, mittel, hoch" gibt es im Haus schon: die Stufenleiter. Zwei
eigene Grenzen daneben waeren eine zweite Antwort auf dieselbe Frage,
und spaetestens beim Verschieben einer Stufe zeigte die Muenze etwas
anderes an als der Name auf der Karte. Die Leiter wird deshalb in
DRITTEL geteilt -- bei den drei Werksstufen genau eine je Muenze, bei
sechs zwei je Muenze, bei einer einzigen ueberall die mittlere.

DIE MUENZE STEHT AUCH GROSS AUF DER KARTE

Sonst haette Filipe neun Bilder fuer ein 24-Pixel-Zeichen gezeichnet.
"dogen" ist dafuer eine neue Vorlage neben Herz, Welle und Krone --
und die drei Werksstufen bekommen sie EINMAL zugeteilt, nur wo noch
die Werksvorlage steht und kein eigenes Bild hochgeladen ist. Wer
danach ein Herz zurueckstellt, findet es morgen nicht wieder als
Muenze vor: Eine Einstellung, die sich gegen den Benutzer durchsetzt,
wird abgeschafft.

Und steht sie gross da, nimmt das Stilblatt die kleine neben der Zahl
weg -- dieselbe Muenze in zwei Groessen auf einer Karte sieht aus wie
ein Versehen.

AM BILDSCHIRMFOTO NACHGEBESSERT

Bei 0,92em blieb an den Spendenknoepfen ein 13,5-Pixel-Fleck uebrig;
bei einem flachen Symbol reicht das, bei einer Muenze mit Pfote,
Schriftzug und Steinen nicht. Jetzt 1,05em ueberall und 1,6em auf den
Knoepfen. In der Auswahl sahen "Amethyst" und "Neon" bei 40 px
praktisch gleich aus -- und genau sie auseinanderzuhalten ist der
Zweck dieser Liste. Jetzt 56/64/72 px. Und was gewaehlt ist, steht
als WORT da: Neben neun glaenzenden Muenzen geht ein ruhiger Rahmen
unter, und wer Farben schlecht unterscheidet, sieht ihn gar nicht.

EIN SATZWECHSEL ERREICHT ALLE

Die Karten trugen ihren Satz immer selbst mit und waren richtig. Die
Muenzen an den Spendenknoepfen und beim eigenen Stand aber nicht --
die holt eine Seite nur bei einer Spende neu. Eine Einstellung, die
nur dort ankommt, wo sie gemacht wurde, ist keine Einstellung des
Hauses.

ZWEI BEFUNDE GEGEN DIE PRUEFUNG SELBST

1. Sie verlangte "erste Grenze ECHT kleiner als zweite". Bei genau
   zwei Stufen fallen beide absichtlich zusammen -- sie meldete einen
   Fehler, wo das Verhalten richtig ist.
2. Sie prueft die Muenzverteilung jetzt auf einer FRISCHEN Datenbank.
   Vorher lief sie auf der, die ein frueherer Abschnitt umgebaut
   hatte: Eine Pruefung, die den eigenen Kollateralschaden misst,
   misst sich selbst. Dazu eine Gegenprobe, dass eine selbst
   gewaehlte Vorlage NICHT ueberschrieben wird.

UND DREI AN DER MESSUNG

Sie suchte noch die gezeichnete Muenze (svg), wo jetzt ein Bild
liegt. Umgestellt nicht auf "ist ein img da", sondern auf
`naturalWidth > 0` -- ob es etwas ZEIGT. Ein img, das 404 antwortet,
steht genauso im Dokument wie eines, das laedt; auf dem Bildschirm
ist an seiner Stelle nichts. Und beim Satzwechsel las sie die vorige
Karte, die noch acht Sekunden stand: Die Karten laufen in einer
Schlange, also wird auf das Merkmal gewartet, das nur die neue hat.

pruef-spenden 167/0 (vorher 136) - pruef-reaktion 321/0 -
pruef-css-klassen ok - pruef-tippziele 11/0 -
mess-reaktion und mess-buehne ohne Beanstandung

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-28 19:36:05 +02:00
co-authored by Claude Opus 5
parent c00c209ac9
commit 96bdd79a91
63 changed files with 1446 additions and 770 deletions
+3
View File
@@ -212,6 +212,9 @@
'Es sind schon zwei Gäste dabei. Nimm erst jemanden heraus.',
layout_unbekannt:
'Diese Anordnung gibt es nicht.',
satz_unbekannt:
'Diesen Münzsatz gibt es nicht. Wähl einen aus der Liste — '
+ '„Eigenes Zeichen" geht erst, wenn du eines hochgeladen hast.',
person_unbekannt:
'Diese Person gibt es hier nicht. Wähl jemanden aus der Liste '
+ 'oder lass das Feld leer.',
+59 -14
View File
@@ -2786,6 +2786,9 @@
if (lage && lage.ich.host) spendenHolen();
}
if (d.was === 'offen') spendenHolen();
/* Ein gewechselter Muenzsatz gilt fuer alle -- auch fuer
die, die gerade keine Spende sehen. */
if (d.was === 'zeichen') spendenHolen();
} catch { /* eine kaputte Meldung darf den Strom nicht reissen */ }
});
@@ -3102,23 +3105,65 @@
if (!a.ok) melde(await a.json().catch(() => null), 'Das ging nicht.');
}
/* ==== DAS DOGEN-ZEICHEN ==========================================
/* ==== DIE DREI MÜNZSÄTZE =========================================
Filipe: „die symbole schick ich dir später. bereite jetzt alles
vor."
Filipe: „alle drei varianten will ich drauf so dass ich sie
aussuchen kann wie ich will."
Gezeigt wird immer dasselbe Stück wie überall sonst — mit einer
Zahl daneben, damit man sieht, wie es neben einer Ziffer
aussieht. Ein Symbol allein auf weißem Grund sagt darüber
nichts. */
Jeder Satz steht mit seinen DREI Münzen da, von links nach
rechts aufsteigend. Ein Satz, der nur mit einer Münze
vorgestellt wird, sagt nichts über den Unterschied zwischen
niedrig und hoch — und genau der ist hier die Aussage. */
function zeichenZeichnen() {
const schau = $('zeichen-schau');
if (!schau || !spendenLage) return;
schau.textContent = '';
schau.append(window.Spendenkarte.dogenStueck(2500, spendenLage.zeichen));
$('zeichen-weg').hidden = !spendenLage.zeichen;
$('zeichen-hoch').firstChild.textContent = spendenLage.zeichen
? 'Anderes Zeichen ' : 'Zeichen hochladen ';
const kasten = $('muenzwahl');
if (!kasten || !spendenLage) return;
const jetzt = spendenLage.zeichen?.satz || '';
kasten.textContent = '';
for (const satz of (spendenLage.saetze || [])) {
const k = el('button', 'muenzsatz');
k.type = 'button';
k.dataset.satz = satz.schluessel;
k.setAttribute('aria-pressed', String(satz.schluessel === jetzt));
const reihe = el('div', 'muenzsatz__reihe');
for (const stufe of ['niedrig', 'mittel', 'hoch']) {
const b = document.createElement('img');
b.className = 'muenzsatz__bild';
b.src = satz.bilder?.[stufe] || '';
b.alt = '';
/* Erst laden, wenn das Register „Gestaltung" offen ist. Neun
Münzen beim Seitenaufbau wären knapp ein halbes Megabyte
für etwas, das die meisten nie ansehen. */
b.loading = 'lazy';
reihe.append(b);
}
k.append(reihe);
const text = el('div', 'muenzsatz__text');
text.append(el('strong', 'muenzsatz__name', satz.name));
text.append(el('span', 'muenzsatz__wort', satz.wort));
k.append(text);
k.addEventListener('click', () => satzSetzen(satz.schluessel));
kasten.append(k);
}
$('zeichen-weg').hidden = !spendenLage.zeichen?.eigen;
$('zeichen-hoch').firstChild.textContent = spendenLage.zeichen?.eigen
? 'Anderes eigenes Zeichen ' : 'Eigenes Zeichen hochladen ';
}
async function satzSetzen(satz) {
const a = await hole('/workspace/api/spenden/zeichen/satz', {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ satz }),
});
if (!a.ok) { melde(await a.json().catch(() => null), 'Das ging nicht.'); return; }
/* FRISCH HOLEN. Die Münze steht an sechs Stellen gleichzeitig --
auf den Karten, in beiden Listen, an den Knöpfen, beim eigenen
Stand und in dieser Auswahl. Sie einzeln nachzuziehen wäre die
Gelegenheit, eine zu vergessen. */
spendenHolen();
}
async function zeichenHoch(feld) {
+60 -12
View File
@@ -110,14 +110,38 @@
return Math.abs(Math.round(Number(mille) || 0)) === 1000 ? 'Doge' : 'Dogen';
}
/** Welche Münze zu dieser Zahl gehört.
*
* ==== DIE GRENZEN KOMMEN VOM SERVER, NICHT VON HIER
*
* Filipe: „drei varianten für niedrige spenden. mittlere und hohe
* spenden." Wo „niedrig" aufhört, steht in der Stufenleiter — und
* die kann er ändern. Zwei Zahlen in dieser Datei wären eine
* zweite Antwort darauf, und sie wäre nach der ersten Änderung
* falsch, ohne dass jemand etwas merkt.
*
* Ein fehlender Satz gibt leer zurück, und dann tritt die
* gezeichnete Münze ein. Ein kaputtes Bild neben einer Zahl sieht
* aus wie ein Fehler IN der Zahl. */
function muenzeFuer(satz, mille) {
if (!satz || typeof satz !== 'object') return '';
const g = Array.isArray(satz.grenzen) && satz.grenzen.length === 2
? satz.grenzen : [0, Number.MAX_SAFE_INTEGER];
const m = Math.round(Number(mille) || 0);
if (m < g[0]) return satz.niedrig || '';
if (m < g[1]) return satz.mittel || '';
return satz.hoch || '';
}
/** Zeichen + Zahl + Wort als ein Stück.
*
* AN EINER STELLE GEBAUT. Die Zahl steht auf der Karte, in zwei
* Listen im Pult, an den Spendenknöpfen und beim eigenen Stand.
* Fünfmal zusammengesetzt hieße: Beim nächsten Mal sieht eine
* davon anders aus, und gemerkt wird es im Livestream. */
function dogenStueck(mille, quelle, klasse) {
function dogenStueck(mille, satz, klasse) {
const k = el('span', 'dogen' + (klasse ? ' ' + klasse : ''));
const quelle = muenzeFuer(satz, mille);
if (quelle) {
const b = document.createElement('img');
b.className = 'dogen__zeichen';
@@ -196,19 +220,41 @@
tafel.dataset.stufe = karte.stufe?.name || '';
tafel.setAttribute('role', 'status');
/* ==== WAS GROSS AUF DER KARTE STEHT ==========================
Drei Möglichkeiten, in dieser Reihenfolge:
1. Ein hochgeladenes Bild der Stufe. Wer eines hochlädt,
meint es.
2. Die DOGEN-MÜNZE in der Stufe, die zur Zahl passt —
Filipes drei Varianten. Das ist ab dem 28.09. die
Vorgabe der drei Werksstufen.
3. Eine der gezeichneten Vorlagen (Herz, Welle, Krone …).
Und jede Stufe fällt auf die nächste zurück, wenn sie nicht
lädt. Ein leerer Kasten wäre das Schlimmste von allen. */
const bild = el('div', 'spendenkarte__bild');
if (karte.stufe?.bild) {
/* Ein eigenes Bild schlaegt die Vorlage -- und wenn es nicht
laedt, tritt die Vorlage wieder ein. Ein leerer Kasten waere
das Schlimmste von beidem. */
const muenze = karte.stufe?.vorlage === 'dogen'
? muenzeFuer(karte.zeichen, karte.dogen_mille) : '';
const alsBild = (quelle, ersatz) => {
const b = document.createElement('img');
b.src = karte.stufe.bild;
b.src = quelle;
b.alt = '';
b.addEventListener('error', () => {
b.remove();
bild.append(zeichenBauen(karte.stufe?.vorlage, farbe));
});
b.addEventListener('error', () => { b.remove(); ersatz(); });
bild.append(b);
};
if (karte.stufe?.bild) {
alsBild(karte.stufe.bild, () => bild.append(zeichenBauen(karte.stufe?.vorlage, farbe)));
} else if (muenze) {
/* DIE MÜNZE STEHT DANN SCHON GROSS DA. Neben der Zahl ein
zweites Mal wäre sie einmal zu viel -- dieselbe Münze in
zwei Größen auf derselben Karte sieht aus wie ein
Versehen. Das Stilblatt nimmt die kleine daraufhin weg. */
tafel.dataset.muenze = 'ja';
alsBild(muenze, () => {
delete tafel.dataset.muenze;
bild.append(zeichenBauen('herz', farbe));
});
} else {
bild.append(zeichenBauen(karte.stufe?.vorlage, farbe));
}
@@ -242,7 +288,9 @@
}
window.Spendenkarte = {
zeigen, alsDogen, dogenWort, dogenStueck,
VORLAGEN: Object.keys(VORLAGEN),
zeigen, alsDogen, dogenWort, dogenStueck, muenzeFuer,
/* „dogen" ist keine Zeichnung, aber eine gueltige Vorlage --
deshalb steht sie hier dabei und nicht in `VORLAGEN`. */
VORLAGEN: ['dogen', ...Object.keys(VORLAGEN)],
};
})();