Lustige Raumnamen: Generator, Lobby-Anzeige + Würfel-Button
Build & Deploy / deploy (push) Successful in 19s

- Server: 3 Name-Muster (Adj+Tiere, Wort-Event, Action-im-Ort), rename-Endpunkt (Host, Lobby)
- Lobby: Raumname ueber Code, Host kann wuerfeln, Share-Text mit Name
This commit is contained in:
Kimi Work
2026-10-10 19:06:57 +02:00
parent 8cf4986b48
commit b1fb42fe7c
3 changed files with 75 additions and 2 deletions
+56
View File
@@ -13,6 +13,8 @@
* POST /api/game/room/:code/question -> Fragesteller stellt die Frage
* POST /api/game/room/:code/ranking -> eigenes geheimes Ranking abgeben
* POST /api/game/room/:code/next -> Auflösung -> Punktestand -> neue Runde
* POST /api/game/room/:code/redmode -> Red Mode an/aus (Host, nur Lobby)
* POST /api/game/room/:code/rename -> Raumnamen neu würfeln (Host, nur Lobby)
*
* Auth: X-Player-Token-Header (oder Body-Feld "token"), pro Spieler ein Token.
* Start: Sobald ALLE Spieler ready sind (min. 3), wechselt der Raum automatisch
@@ -116,6 +118,49 @@ function neuerCode() {
return null;
}
/* ── Lustige Raumnamen ──────────────────────────────────── */
const NAMEN = {
adj: [
'durstigen', 'tanzenden', 'kichernden', 'brüllenden', 'flüsternden', 'glühenden',
'schunkelnden', 'zappelnden', 'grölenden', 'funkelnden', 'randalierenden', 'frechen',
'mutigen', 'verpeilten', 'torkelnden', 'jauchzenden', 'grinsenden', 'schwatzenden',
'pfeifenden', 'trommelnden', 'hopsenden', 'sabbernden', 'schleimigen', 'schillernden',
'tollpatschigen', 'unersättlichen', 'übermütigen', 'schäumenden', 'quietschenden',
'polternden', 'strahlenden', 'müden',
],
tier: [
'Piraten', 'Kartoffeln', 'Nachteulen', 'Chamäleons', 'Pinguine', 'Flamingos',
'Rentiere', 'Einhörner', 'Gurken', 'Muffins', 'Kekse', 'Bananen', 'Tomaten',
'Schildkröten', 'Waschbären', 'Faultiere', 'Kängurus', 'Seehunde', 'Wombats',
'Lemminge', 'Spechte', 'Otter', 'Marder', 'Igel', 'Kamele', 'Lamas', 'Alpakas',
'Zebras', 'Quokkas', 'Tukane', 'Kronkorken', 'Glühbirnen', 'Staubsauger', 'Kaugummis',
'Regenwürmer', 'Luftballons', 'Wackelpuddinge', 'Nudeln', 'Schokolinsen', 'Popcorntüten',
],
sing: [
'Pinguin', 'Kartoffel', 'Muffin', 'Einhorn', 'Otter', 'Faultier', 'Kamel', 'Lama',
'Wackelpudding', 'Kronkorken', 'Kaugummi', 'Regenwurm', 'Igel', 'Quokka', 'Flamingo',
'Waschbär', 'Specht', 'Tomate', 'Banane', 'Keks',
],
event: ['Alarm', 'Manie', 'Panik', 'Invasion', 'Verschwörung', 'Olympiade', 'Revolution', 'Notstand', 'Expedition', 'Befreiung'],
action: ['Party', 'Chaos', 'Krawall', 'Sause', 'Rambazamba', 'Zoff'],
ort: ['Keller', 'Garten', 'Palast', 'U-Boot', 'Zirkus', 'All', 'Baumhaus', 'Schloss', 'Dschungel', 'Wolkenkuckucksheim', 'Kiosk', 'Weltraum'],
};
const pick = (liste) => liste[crypto.randomInt(liste.length)];
function lustigerRaumname() {
for (let versuch = 0; versuch < 25; versuch++) {
const typ = crypto.randomInt(3);
let name;
if (typ === 0) name = `Die ${pick(NAMEN.adj)} ${pick(NAMEN.tier)}`;
else if (typ === 1) name = `${pick(NAMEN.sing)}-${pick(NAMEN.event)}`;
else name = `${pick(NAMEN.action)} im ${pick(NAMEN.ort)}`;
const vergeben = Object.values(rooms).some((r) => r.raumname === name);
if (!vergeben) return name;
}
return `Die ${pick(NAMEN.adj)} ${pick(NAMEN.tier)} ${crypto.randomInt(100)}`;
}
function raumFinden(code) {
const raum = rooms[(code || '').toUpperCase()];
if (!raum) return null;
@@ -141,6 +186,7 @@ function oeffentlicherZustand(raum, token) {
const alleReady = raum.spieler.length >= MIN_SPIELER && raum.spieler.every((s) => s.ready);
return {
code: raum.code,
raumname: raum.raumname || '',
status: raum.status,
runde: raum.runde,
anzahlRunden: raum.spieler.length,
@@ -207,6 +253,7 @@ const server = http.createServer(async (req, res) => {
if (!neuerRaumCode) return fehler(res, 500, 'kein Raumcode frei');
const raum = {
code: neuerRaumCode,
raumname: lustigerRaumname(),
erstelltAm: Date.now(),
aktivitaet: Date.now(),
status: 'lobby',
@@ -271,6 +318,15 @@ const server = http.createServer(async (req, res) => {
return antwort(res, 200, { ok: true, zustand: oeffentlicherZustand(raum, token) });
}
/* Raumnamen neu wuerfeln (nur Host, nur vor Spielstart) */
if (req.method === 'POST' && aktion === 'rename') {
if (raum.status !== 'lobby') return fehler(res, 409, 'Der Raumname ist nur vor Spielstart aenderbar');
if (!spieler.istHost) return fehler(res, 403, 'Nur der Host kann den Raumnamen aendern');
raum.raumname = lustigerRaumname();
speichern();
return antwort(res, 200, { ok: true, zustand: oeffentlicherZustand(raum, token) });
}
/* Frage stellen */
if (req.method === 'POST' && aktion === 'question') {
if (raum.status !== 'question') return fehler(res, 409, 'Keine Fragephase');