Technische Dokumentation¶
Architektur-Überblick¶
IfRPG ist eine browserbasierte Single-Page-Application auf Basis von:
- React
- Vite
- TypeScript
- Zustand für globalen Spielzustand
- Monaco Editor für die IDE
- external/java-ide als extern gepflegte Java-Compiler-/Interpreter-Komponente
- PHP + SQLite für den optionalen Cloud-Speicherserver
Das Spiel selbst läuft lokal im Browser. Der Server ist nur für Editor-APIs und die optionale Cloud-Speicherung notwendig.
Für die praktische Arbeit mit dem Projekt ergänzen diese technischen Hintergründe vor allem das Benutzerhandbuch, das Level Editor Handbuch und das Handbuch zu den World- und Global-Settings.
Hauptsysteme im Frontend¶
App und Modi¶
Die App hat im Wesentlichen drei größere Laufzeitmodi:
- Startbildschirm mit lokalem Save-Menü, Cloud-Login und Cinematic-Hintergrund
- Spielmodus mit Canvas-Renderer, HUD, Quest-/Journal-/Achievement-Menüs und Systemmenü
- Editor-Modus unter
?editormit Level-, Quest-, Journal-, Tileset-, H5P- und Settings-Bereichen
Zentral orchestriert wird das aus src/App.tsx.
Globaler Zustand¶
Der meiste Runtime-Zustand liegt in src/state/useGameStore.ts:
- Weltname, Level und Spielerposition
- Variablen, Switches und Queststatus
- Journal- und Achievement-Freischaltungen
- UI-Status und Modale
- Cloud-Session
- globale Defaults und Interaktionen
- Skin-, Pet-, Template- und Treasure-Definitionen
Der Persistenzpfad ist klar getrennt:
- abgeleitete Werte werden nicht mehr blind gespeichert
- Questcode bleibt erhalten
- globale Textdaten werden nicht mehr unnötig mitpersistiert
- Cloud-Session-Daten werden getrennt vom eigentlichen Savegame gehalten
Die inhaltliche Sicht auf diese Datenstrukturen liegt vor allem in den Handbüchern zu Quests, Journalen, Leveln und den World- und Global-Settings.
Content- und World-Layer¶
Registry¶
src/data/Registry.ts ist die zentrale Laufzeit-Registry für:
- Leveldaten
- Quests
- Journaleinträge
- Audio-Discovery
- Weltwechsel
- Templates, Treasures und Erfolge
Die Inhalte liegen zur Laufzeit unter public/data/worlds/<world>/.... Zusätzlich werden Manifest- und World-Content-Dateien generiert, damit Welten rekursiv geladen werden können.
Rich-Content¶
Quest- und Journaltexte laufen über einen gemeinsamen Rich-Content-Pfad:
- HTML-Sanitizing
- Variablensubstitution
- Syntax-Highlighting
- Tabellen-Wrapping
- Mermaid-Rendering
- Mermaid-Objektdiagramm-Nachbearbeitung
- NSD-Rendering über benutzerdefinierte Tags
Das sitzt zentral in src/ui/HighlightedContent.tsx, src/utils/RichHtmlUtils.ts und src/utils/NsdUtils.ts.
Die Autorenperspektive dazu beschreiben das Quest Editor Handbuch, das Journal Editor Handbuch und die Quest-Design-Konzepte.
Rendering und Spielwelt¶
GameView und Renderer¶
Die eigentliche Spielwelt wird aus src/game/GameView.tsx und src/game/hooks/useWorldRenderer.ts gerendert.
Wesentliche Bausteine:
- Tile-Layer
- Spieler, Pet, NPCs, Template-Entities und Treasures
- Licht- und Effektlayer
- Debug-Overlay und Interaktionsindikatoren
- separater Top-Pass für States mit
drawOnTop
Die dazugehörigen editorseitigen Arbeitsabläufe stehen im Level Editor Handbuch und in den Level-Design-Konzepten.
Interaktionen und Kollisionen¶
Interaktionen werden zentral über src/game/hooks/useInteractionEngine.ts abgewickelt. Dazu gehören:
- Interaktionsqueue
- Busy-Locks für asynchrone Aktionen
- Dialoge, Variablen, Switches, Teleports und Schleifen
- Pfadfindung für
move_playerundmove_npc - H5P-Callbacks und Queststarts
Kollisionen und logische Hitboxen sitzen in src/game/CollisionManager.ts und src/game/GameUtils.ts. Die Implementierung unterscheidet sauber zwischen:
- logischen Fuß-Hitboxen
- größeren oder kleineren Displaygrößen
- Template-States
- Interaktionsindikatoren
Java-IDE und Aufgabenruntime¶
IDE¶
Die IDE liegt in src/ide/IDEView.tsx. Sie lädt lazy und trennt den normalen UI-Pfad vom schweren Java-Runtime-Chunk.
Wesentliche Teile:
- Monaco Editor
- Multi-File-Verwaltung
- Questbeschreibung, Ziele, Hinweise und Test-/Run-Workflow
- H5P-Ansicht als alternativer Aufgabenmodus
- Game-API-Dokumentation in der IDE
Java-Runtime¶
Die eigentliche Ausführung läuft über src/ide/runtime.ts, src/ide/JavaRunner.ts, src/ide/IfRPGModule.ts und src/ide/GameIOModule.ts.
Wichtig für die Wartbarkeit:
external/java-idebleibt bewusst eine externe, updatefähige Komponente- die App kapselt nur die Brücke zur Spielwelt
- GameIO und IfRPG sind die öffentlichen Java-Bibliotheken für Aufgaben
- grafische Ausgabe wird appseitig in ein vorgeschaltetes Modal geroutet, nicht direkt in die externe Komponente hinein verändert
- grafische Questziele werden über Runtime-Snapshots und
graphics_assertin der App ausgewertet
Für Grafikprogramme erzeugt die App beim Beenden oder Schließen des Fensters einen Snapshot des Grafikzustands. Dieser enthält:
- aktive Grafikmodi wie
world2d,processingoderworld3d - Laufzeitobjekte mit Klassenname, Feldern und sichtbaren Eigenschaften
- bei Bedarf Canvas-Pixeldaten für Pixel- und Regionsprüfungen
Damit lassen sich Grafikquests auswerten, ohne external/java-ide selbst für questspezifische Prüfregeln umzubauen.
Die Autoren- und Nutzersicht dazu ergänzen das Quest Editor Handbuch, die Quest-Design-Konzepte und die Game-API-Referenz.
Savegames und Integrität¶
Lokale Savegames¶
Lokale Savegames werden signiert und beim Laden geprüft. Das ist bewusst kein manipulationssicheres Anti-Cheat-System, sondern ein Hürdenmodell für Unterricht und Alltagsbetrieb.
Wesentliche Punkte:
- Savegames erhalten Metadaten, Nonce und Snapshot
- grob unplausible Werte werden erkannt
- abgeleitete Werte wie Level oder gelöste Quests werden normalisiert
- erkannte Manipulation führt in den Cheat-Pfad
Cheaterkennung¶
Manipulierte Savegames können lokal, per Import oder aus der Cloud erkannt werden. Daraus entstehen:
- harter Cheat-Status im Client
- das persistente Achievement
cheating_piggy - optional accountweite Persistenz auf dem Cloudserver
Die sichtbaren Folgen im Spiel erklärt das Benutzerhandbuch. Die inhaltlichen Einstellungen dazu liegen in den World- und Global-Settings.
Cloud-Speicherserver¶
Der optionale Cloudserver liegt unter server/php/ und nutzt:
- PHP
- SQLite
- Session-Token per
Authorization: Bearer - CORS-Whitelist für
ifrpg.deund lokale Entwicklungsumgebungen
Der Server bietet unter anderem:
- Registrierung und Login
- Spielstandliste
- Laden, Speichern, Löschen, Anpinnen
- accountweite Achievement-IDs
- Admin-Endpunkte für den Savegame-Editor
Die Authentifizierung ist vollständig headerbasiert; URL-Token werden nicht verwendet.
Editor-Backend¶
Im Dev-Betrieb stellt Vite die Editor-APIs bereit. Dazu gehören unter anderem:
- Level, Quest und Journal lesen und speichern
- Welten anlegen, umbenennen, schützen oder verstecken
- H5P-Pakete importieren
- Medienlisten und Sprites discovery
Build, Bundles und Assets¶
Der Build läuft über npm run build.
Relevante Punkte:
- Startpfad und IDE wurden weiter entkoppelt
- Monaco und Java-Runtime bleiben die größten Chunks
- Welt-Manifest, World-Content und Audio-Indizes werden automatisch erzeugt
- große Medienassets können über Git LFS verwaltet werden
- ein Build-Guard prüft buildkritische LFS-Dateien, damit keine Pointer-Dateien im Arbeitsbaum landen