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:
@@ -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.',
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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)],
|
||||
};
|
||||
})();
|
||||
|
||||
Reference in New Issue
Block a user