# Insellauf – Ins Hauptspiel übertragen ## SQL-Skripte ### Schritt 2 – Neue Tabellen (wandelndes_dorf_game_test) ✅ ausgeführt 2026-04-13 ```sql USE wandelndes_dorf_game_test; CREATE TABLE brettspiel_runden ( id INT AUTO_INCREMENT PRIMARY KEY, status ENUM('aktiv','beendet') NOT NULL DEFAULT 'aktiv', gestartet_am DATETIME NOT NULL DEFAULT NOW(), beendet_am DATETIME NULL ) ENGINE=InnoDB; CREATE TABLE brettspiel_spieler ( id INT AUTO_INCREMENT PRIMARY KEY, runde_id INT NOT NULL, user_id INT NOT NULL, feld_position TINYINT UNSIGNED NOT NULL DEFAULT 0, interne_glasperlen INT NOT NULL DEFAULT 0, letzter_wurf_datum DATE NULL, ziel_erreicht_rang TINYINT UNSIGNED NULL, kreativpunkte_erhalten TINYINT UNSIGNED NOT NULL DEFAULT 0, angemeldet_am DATETIME NOT NULL DEFAULT NOW(), UNIQUE KEY uq_runde_user (runde_id, user_id), KEY idx_runde (runde_id), KEY idx_user (user_id) ) ENGINE=InnoDB; CREATE TABLE brettspiel_inventar ( id INT AUTO_INCREMENT PRIMARY KEY, spieler_id INT NOT NULL, item_typ ENUM('bombe','platztausch','schutzschild') NOT NULL, erhalten_am DATETIME NOT NULL DEFAULT NOW(), KEY idx_spieler (spieler_id) ) ENGINE=InnoDB; CREATE TABLE brettspiel_bomben ( id INT AUTO_INCREMENT PRIMARY KEY, runde_id INT NOT NULL, platziert_von_spieler_id INT NOT NULL, feld_nr TINYINT UNSIGNED NOT NULL, platziert_am DATETIME NOT NULL DEFAULT NOW(), KEY idx_runde_feld (runde_id, feld_nr) ) ENGINE=InnoDB; CREATE TABLE brettspiel_aktionen ( id INT AUTO_INCREMENT PRIMARY KEY, runde_id INT NOT NULL, spieler_id INT NOT NULL, aktion_typ VARCHAR(50) NOT NULL, details JSON NULL, erstellt_am DATETIME NOT NULL DEFAULT NOW(), KEY idx_runde (runde_id), KEY idx_spieler (spieler_id), KEY idx_erstellt (erstellt_am) ) ENGINE=InnoDB; CREATE TABLE brettspiel_tages_felder ( datum DATE NOT NULL, feld_nr TINYINT UNSIGNED NOT NULL, typ ENUM('normal','item','portal','ereignis') NOT NULL, PRIMARY KEY (datum, feld_nr) ) ENGINE=InnoDB; CREATE TABLE brettspiel_tages_kopplungen ( datum DATE NOT NULL, feld_a TINYINT UNSIGNED NOT NULL, feld_b TINYINT UNSIGNED NOT NULL, PRIMARY KEY (datum, feld_a) ) ENGINE=InnoDB; ``` ### Schritt 3 – Baustelle (für alle Spieler mit Geheimnisvollen Insel) ✅ ausgeführt 2026-04-13 ```sql -- Baustelle 'Der Insellauf' für alle vorhandenen mystery island Einträge anlegen INSERT INTO mystery_island_construction_sites (mystery_island_id, site_key, name, description, status, sort_order) SELECT id, 'brettspiel_info', 'Der Insellauf', 'Ein tägliches Brettspiel auf der Geheimnisvollen Insel', 'available_to_unlock', 20 FROM player_mystery_islands WHERE id NOT IN ( SELECT mystery_island_id FROM mystery_island_construction_sites WHERE site_key = 'brettspiel_info' ); ``` ## Cron-Task – Systemd-Service einrichten Der Cron-Task `34_brettspiel-tagesreset.php` braucht einen eigenen systemd-Service und einen Eintrag im Runner. ### 1. Service-Datei anlegen (auf dem Ziel-Server als root/sudo) ```bash sudo nano /etc/systemd/system/gametick-prod-34_brettspiel-tagesreset.service ``` Inhalt: ```ini [Unit] Description=GameTick Task (Prod): 34_brettspiel-tagesreset [Service] Type=oneshot User=www-data ExecStart=/usr/bin/php /var/www/html/spielegruppe/game/cron/tasks/34_brettspiel-tagesreset.php ``` ### 2. In Runner-Skript eintragen ```bash sudo nano /var/www/html/spielegruppe/game/cron/sequential_runner.sh ``` Eintrag nach `gametick-prod-33_erfolge-pruefen.service` hinzufügen: ``` "gametick-prod-34_brettspiel-tagesreset.service" ``` ### 3. Aktivieren ```bash sudo systemctl daemon-reload sudo systemctl restart gametick-prod.timer ``` ### Falltür + Karte 2 – Mehrkarten-System *(ausstehend)* ```sql -- 1. Spieler-Karte speichern (DEFAULT 1 → bestehende Spieler bleiben auf Karte 1) ALTER TABLE brettspiel_spieler ADD COLUMN karte_id TINYINT UNSIGNED NOT NULL DEFAULT 1 AFTER feld_position; -- 2. Neuer Feldtyp 'falltuer' in Tagesfelder-Enum ALTER TABLE brettspiel_tages_felder MODIFY COLUMN typ ENUM('normal','item','portal','ereignis','falltuer') NOT NULL; -- 3. Bomben sind kartengebunden ALTER TABLE brettspiel_bomben ADD COLUMN karte_id TINYINT UNSIGNED NOT NULL DEFAULT 1 AFTER feld_nr; ``` --- ## Geänderte Dateien ### Neu erstellt (Falltür + Karte 2) X- `game/config/brettspiel_karten.php` *(Karten-Standard: Transitions, Feldtypen, Überlauf)* X- `tools/koordinaten-picker/plans/insellauf-2.json` X- `game/config/brettspiel_felder_2.php` *(31 Koordinaten Karte 2, via Picker generiert)* ### Geändert (Falltür + Karte 2) X- `game/src/Repository/BrettspielRepository.php` *(updateSpielerFeld, getSpielerAufFeld, getBombeAufFeld, hatBombeAufFeld, platzierbombe – alle mit karte_id-Parameter)* X- `game/src/Service/BrettspielService.php` *(spielzugAusfuehren Mehrkarten-Flow, tagesresetAusfuehren +falltuer, platztauschEinsetzen +karte_id, bombePlatzieren kartengebunden, getKartenConfig, getFeldTypKarte)* X- `game/brettspiel.php` *(Karten-Config laden, dynamisches Board-Bild + SVG, renderTokens/Bomben/Falltür kartenbewusst, switchBoard, animiereZug mit Falltür+K2-Rückkehr, Event-Anzeige)* X- `game/brettspiel_info.php` *(Spielregeln Falltür+K2, Teilnehmerliste Karte-Badge)* ### Neu erstellt (Basis) X- `game/src/Repository/BrettspielRepository.php` X- `game/src/Service/BrettspielService.php` X- `game/cron/tasks/34_brettspiel-tagesreset.php` X- `tools/koordinaten-picker/index.php` X- `tools/koordinaten-picker/plans/insellauf.json` X- `game/config/brettspiel_felder.php` X- `game/config/mystery_spiele.php` *(zentrale Spieldefinition für Auto-Seeding: Klangwerkstatt, Regenbogental, Insellauf)* - `game/brettspiel_test.php` *(Testdatei, wird am Ende gelöscht)* X- `game/brettspiel_info.php` *(Lobby-Seite, Anmeldung + Rundeninfo)* X- `game/process_brettspiel.php` *(POST-Handler: anmelden, wuerfeln, bombe, platztausch)* X- `game/brettspiel.php` *(Spielseite: Dark-Layout wie Testspiel, SVG-Overlay, Animationen, Verlauf-Log)* X- `game/brettspiel_api.php` *(JSON-API: Highscores für mystery_island_stats.php)* X- `game/admin/brettspiel_verwalten.php` *(Admin: Runden verwalten, Tagesreset, Spieler entfernen)* ### Neu erstellt (Verlauf + Log) X- `game/brettspiel_verlauf.php` *(Vollständiger Verlauf der aktiven Runde)* X- `game/brettspiel_verlauf_archiv.php` *(Verlauf der letzten abgeschlossenen Runde)* X- `game/brettspiel_log_helper.php` *(Gemeinsame Render-Funktion bs_render_log_eintrag())* ### Geändert (Verlauf + Log) X- `game/brettspiel.php` *(Island-Nav-Links, Inline-Log auf 10 Einträge, korrekte CSS-Klassen + Spielerfarben)* X- `game/brettspiel_info.php` *(Zurück-Button zur Insel, Island-Navigation)* X- `game/src/Service/BrettspielService.php` *(logAktion: user_id statt spieler_id; events[] im wurf-Log gespeichert; Rohstoffname mitgeloggt)* X- `game/src/Repository/BrettspielRepository.php` *(getZufaelligerBasisrohstoff() gibt id+name zurück)* X- `templates/header_game.php` *(brettspiel_info in Island-Nav-Liste eingetragen)* - `docs/dev-wiki/20-brettspiel.md` - `docs/player-wiki/20-brettspiel.md` ### Geändert (Basis) X- `game/cron/sequential_runner.sh` *(Task 34 eingetragen)* X- `game/mystery_island.php` *(Auto-Seeding: fehlende Spiele bei fertigem Hafen automatisch anlegen)* X- `game/mystery_island_stats.php` *(Insellauf-Highscores Abschnitt ergänzt)* - `tests/smoke_test.php` *(7 Brettspiel-Tabellen + 7 PHP-Dateien geprüft)* - `PROJECT_CONTEXT.md`