Kampfwerte auf dem Charakterbogen; Plan für Kampagnen-PDFs
12.09.2026 · Ingo Wiarda · 7b211ba
Ohne Kampfwerte war der PDF-Bogen kein Charakterbogen: die eine Zahl, die man
mitten im Kampf nachsieht, fehlte.
- CreaturePdfService.combatValuesTable zeigt Basis- und Effektivwert je
Kampfwert, nach derselben Regel wie CharacterDerivedExportService: jeder
CombatStat außer RESISTANCE, die per Schadenstyp gefragt wird und
multiplikativ stapelt - sie folgt als eigene Zeilen. Parade und Ausweichen
entfallen, wo das Spielsystem sie nicht anbietet, wie schon Mana ohne Magie.
Die Namen kommen aus CombatStat.getGermanLabel(), wie in jedem Template.
- Der Test liest die Seite jetzt zurück. openpdf bringt PdfTextExtractor mit,
also prüft CreaturePdfControllerTest Name, Attribut, Fertigkeit und die
Kampfwert-Zeilen als Text statt nur body.length > 500.
- docs/plans/kampagnen-pdf.adoc: Kampagne als PDF, mit Spielleiter- und
Handout-Fassung. Der Inhalt wird von CampaignExportService schon gesammelt,
nur ohne Bilder, ohne Mob-Werte und ohne die Trennung SL/Spieler; das PDF
baut darauf auf. Sechs Inkremente, das erste ist dieses hier.
Claude-Session: https://claude.ai/code/session_018UUooLMDSwYZMY3SCQyx8F
Importierte Mobs gehen mit ihrer Kampagne; Migrationsbericht nennt Kampagnen und Räume
12.09.2026 · Ingo Wiarda · f119030
Nachlese zu den sechs doppelten Kampagnen auf play:
- campaign_definition_creature.created_with_campaign merkt sich, ob der Import
die Kreatur mitgebracht hat. Ein von Hand eingetragener Mob ist eine Kreatur
des Autors und überlebt die Kampagne; eine importierte gehört ihr und wird
beim Löschen mitgelöscht - aber nur, solange keine zweite Kampagne sie hält.
Vorher blieb pro gelöschter Kampagne ein herrenloser "Trolli" in der Liste.
- Der Textbericht der Migration listet jetzt auch Kampagnen und Räume. Bisher
nannte er nur Charaktere, weshalb ein Lauf, der jede Kampagne duplizierte,
im Deploy-Log genauso aussah wie ein sauberer.
- creature/list.jte übergibt _csrf an shared.head. Die Seite selbst hat kein
HTMX-POST, die Zeilen tragen ihr eigenes Hidden-Input - aber ohne die
Meta-Tags würde das erste hx-post dort still im 403 enden.
Claude-Session: https://claude.ai/code/session_018UUooLMDSwYZMY3SCQyx8F
Fix: migrations-service passt auch auf Kampagnen auf
11.09.2026 · Ingo Wiarda · dacc242
Ketib @ Foundry: damit man auch komplett in Foundry spielen kann (wip)
11.09.2026 · Ingo Wiarda · 5d15c6d
Charakter-Export verbessert: Charaktere werden mit System-Updates migriert.
09.09.2026 · Ingo Wiarda · 1e16556
Schadenstypen eingeführt
08.09.2026 · Ingo Wiarda · b75c1f6
aktuell gibt es in Ketib:
* Feuer
* Kälte
* Energie
* Magie
Layout für Kreaturen verbessert; Login-redirect bei alter Session gefixt.
03.09.2026 · Ingo Wiarda · 7dbf65e
Layout für Kreaturen verbessert; Login-redirect bei alter Session gefixt.
03.09.2026 · Ingo Wiarda · a63a5f9
Foundry zeigt eine Liste der Charaktere des Users von Schedim.
02.09.2026 · Ingo Wiarda · 20be604
Sync zwischen Foundry und Schedim geht nun auf Knopfdruck für Charaktere.
01.09.2026 · Ingo Wiarda · e2cfc17
Qualitätsstufen für Waffen und Rüstungen hinzugefügt.
01.09.2026 · Ingo Wiarda · deda4ac
Qualitätsstufen für Waffen und Rüstungen hinzugefügt.
01.09.2026 · Ingo Wiarda · 4b52ad5
Erlaube import von Foundry-Charakteren (zum Abgleich) + Installations-URL
31.08.2026 · Ingo Wiarda · 54be734
Mit der Installations-URL kann man das Ketib-Regelwerk direkt in der Foundry-UI importieren (muss also nicht auf dem Server des Hosting-Partners direkt Dateien auspacken usw).
Code cleanup + User-purge-script
29.08.2026 · Ingo Wiarda · 2058e72
User & alles, was ihnen gehört zu löschen, ist problematisch - wenn das aus Versehen gemacht wird, kann sehr viel Arbeit verloren gehen. Daher gibt es nun die Option, das per Script zu machen, außerhalb des laufenden Servers.
Kampagnen-Export nimmt nun auch Loot mit und Hintergrundbild von Szenen
29.08.2026 · Ingo Wiarda · f3c4a46
Zeige auf Wunsch alle Rassen bei der Charaktererstellung (auch Monster)
29.08.2026 · Ingo Wiarda · 5a83d60
Ketib nutzt nun Kampfreihen.
29.08.2026 · Ingo Wiarda · 4083073
Übertragung von Charakter-Porträts nach Foundry
29.08.2026 · Ingo Wiarda · 981baef
Kampfreihen hinzugefügt: vorne, hinten -> ermöglicht Fernkampf
29.08.2026 · Ingo Wiarda · 62c9adc
FoundryVTT-Export hinzugefügt: Ketib kann auch in Foundry gespielt werden.
28.08.2026 · Ingo Wiarda · f5aa448
KreaturenTypen können besser verwaltet werden
28.08.2026 · Ingo Wiarda · f9645b3
Kampf-Fertigkeiten können nun auch pro Level skalieren
27.08.2026 · Ingo Wiarda · eda0973
Beispiel: Eine Kreatur mit Trampeln 3 macht 3W6 (3 x 1W6) Schaden. Je nachdem, wie stark die Kreatur trampeln kann, bekommt sie z.B. Trampeln 1 (Wildschwein) oder Trampeln 8 (Elefant)
Kampagnen (bzw. deren Szenen) können nun Textblöcke haben.
26.08.2026 · Ingo Wiarda · 9c1c748
- Editor für Szenen erweitert (wip)
- Keine Dubletten von Bildern anzeigen beim Auswählen
Einige neue Spielelemente in die Doku exportiert.
22.08.2026 · Ingo Wiarda · 06cd094
* erstes Tier (Jagdspinne)
* zwei Rassen (Goblins und Orks)
* es gibt nun generische Rasseneigenschaften ("kräftig")
Code-Kommentare ein klein wenig verbessert.
22.08.2026 · Ingo Wiarda · 72d95e3
Layout von Character-Skill/Attribut-Proben & Schutzwürfen verbessert
22.08.2026 · Ingo Wiarda · 83aa626
Leeren Raum zwischen Chatnachrichten reduziert.
Rassen-Editor verbessert: man kann neue Traits direkt erzeugen oder aus der Tag-Cloud wählen. Traits können jetzt generisch sein ("stark +1") oder spezifisch (Trollregeneration -> nur für Trolle)
Zugriff auf Charaktere wird nun besser gesteuert. Layout verbessert
21.08.2026 · Ingo Wiarda · f4fe6f2
Skill-Management überarbeitet; Konsistenz-Check für Charaktere
21.08.2026 · Ingo Wiarda · 9d432ff
Beim Import von Charakteren werden diese auf Stimmigkeit geprüft, damit man nicht aus Versehen mit einem kaputten Charakter spielt (oder sich 1000 Kreativpunkte erschummelt...)
Optimierung von Bearbeitungsfunktionen (Massen-Edit für Rassen z.B.)
21.08.2026 · Ingo Wiarda · 9d648c1
Wechsel zu SSE (Server schickt Nachrichten, Browser muss nicht alle 2s pollen)
21.08.2026 · Ingo Wiarda · 9320a86
Im- und Export von veröffentlichten Charakteren
18.08.2026 · Ingo Wiarda · c6090e0
Ziel ist es, ein paar öffentliche Test-Charaktere zu haben, die z.B. im Kampfsimulator oder für Kampagnen verwendet werden können.
kleine Arbeiten am Kampfsimulator; BalancingLabTest hinzugefügt
17.08.2026 · Ingo Wiarda · 969b5cf
Aktuell dauert ein BalancingLabTest noch 3h, siehe simulation.adoc.
Es fehlen Waffen, mehr Rassen, mehr ... alles. Und mehr Balancing :)
Layout Kampfsimulator angepasst (ad-hoc Block kann zusammenklappen)
16.08.2026 · Ingo Wiarda · 7e35fbf
verstecke Klone und Vorlagenkreaturen.
16.08.2026 · Ingo Wiarda · 4739d94
fix tests
15.08.2026 · Ingo Wiarda · 9368718
usability: Menü für Spielsystem überarbeitet
15.08.2026 · Ingo Wiarda · bf5e137
usability: aktueller Raum wird im Seitenmenü angezeigt
15.08.2026 · Ingo Wiarda · 05c8366
usability: Menü an die Seite verfrachtet, einklappbar
14.08.2026 · Ingo Wiarda · 03d397b
usability: Anwender kann aktives Spielsystem setzen
14.08.2026 · Ingo Wiarda · ddf3804
Dann muss man nicht dauernd das gewünschte Spielsystem auswählen. Beim Wechseln in einen Raum mit einem anderen System wird dieses aktiv.
neu: run-roleplay skill zum Testen via chromium browser
13.08.2026 · Ingo Wiarda · a499efb
neu: CreatureTypes (definiert Rassentypen - Monster, Drache, Tier, Spielbar)
13.08.2026 · Ingo Wiarda · 83dc8dd
neu: Spielleiter kann Loot & Mob in Szenen zeigen/verbergen
11.08.2026 · Ingo Wiarda · ed52fb7
fix: "5 weitere Zeilen" kopiert keine Inhalte mehr
11.08.2026 · Ingo Wiarda · 08d8a91
neu: Kampfmanöver (Wuchtschlag, Durchstich, Entwaffnen usw)
10.08.2026 · Ingo Wiarda · b868469
Ziel ist, Kriegern ein paar sinnvolle Kampfmanöver zu geben. Das ist auch eine Chance fürs Balancing: wenn ein Charakter einen sehr hohen Angriffswert hat, kann er es verkraften, Manöver zu machen, um Trefferchance oder Schaden zu erhöhen.
neu: Script zum Updaten von play.ketib.de mit lokaler dev-db
09.08.2026 · Ingo Wiarda · 32c1be9
Wird benötigt, um als Entwickler lokal zu testen und dann das aktualisierte Ketib-System hochzuladen für andere Tester.
filtert nichtssagende Git-Mergenachrichten raus.
09.08.2026 · Ingo Wiarda · 2a16d28
neu: Beispiel-Getränke hinzugefügt.
09.08.2026 · Ingo Wiarda · 27d3028
refactoring: CombatChatService -> RoomChatService
09.08.2026 · Ingo Wiarda · 2f3e847
neu: Zaubersprüche können dynamisiert werden
09.08.2026 · Ingo Wiarda · 7b0fe86
neu: Getränke als Itemklasse
09.08.2026 · Ingo Wiarda · 4e1d0d5
neu: Zaubersprüche / Magiesystem hinzugefügt
09.08.2026 · Ingo Wiarda · 1fbc39a
todos: CreatureType hinzugefügt
09.08.2026 · Ingo Wiarda · dc136ff
docs: Ketib Handbuch mit Inhaltsübersicht
09.08.2026 · Ingo Wiarda · ddc1167
small-fixes: offene TODOs umgesetzt
09.08.2026 · Ingo Wiarda · 8bd899d
Fehlermeldungen im Formular statt weißer Seite (ErrorPageAdvice plus
BindingResult am Namensfeld), Elementnamen ohne Rücksicht auf Groß-/
Kleinschreibung, öffentliche Bilder in der Bildauswahl mit Kopie beim
Auswählen, Würfelwürfe als Wurf des Charakters, Kampf-Chat in derselben
Reihenfolge wie der normale, SkillType COMBAT_MAGIC, nginx-Uploadgrenze.
Geprüft und dokumentiert: "Probe" ist im deutschen Chat richtig; Heilung
über negativen Schaden ist nicht billig zu haben und steht als Befund
unter Later. Dabei behoben: die Trefferpunkte waren nur nach unten
geklammert.
aufräumen: JavaScript überarbeiten
09.08.2026 · Ingo Wiarda · da83134
aufräumen: Tests überarbeiten, Teil 2
09.08.2026 · Ingo Wiarda · 08edabb
aufräumen: Controller entflechten, Docs aktualisieren
08.08.2026 · Ingo Wiarda · 76846f5
aufräumen: God-Controller entflechten
08.08.2026 · Ingo Wiarda · d3fd2df
aufräumen: create & edit pages
08.08.2026 · Ingo Wiarda · 11279c1
aufräumen: MassEditSupport
08.08.2026 · Ingo Wiarda · 6737554
aufräumen: MassEditSupport
08.08.2026 · Ingo Wiarda · 5946c5a
aufräumen: Berechtigungschecks vereinfacht und mehr unnötigen Code entfernt
08.08.2026 · Ingo Wiarda · 7eb1bf6
docs: Regelwerk in Kapitel aufgeteilt (1 Datei / Kapitel)
08.08.2026 · Ingo Wiarda · e27f5de
aufräumen: unnötige Parameter entfernt (currentPath-Zuweisungen)
08.08.2026 · Ingo Wiarda · 7615df8
aufräumen: globale Löschfunktionen entfernt
08.08.2026 · Ingo Wiarda · 95a7e66
Entwickler / Admin konnte alle Daten komplett löschen - nützlich für die Entwicklung, aber mit separater Test-DB nun nicht mehr sinnvoll und zu gefährlich.
Neu: changelog auf der Startseite
08.08.2026 · Ingo Wiarda · 983b21d
Während der Entwicklung sollen hier die Änderungen der letzten 7 Tage (oder: 10 Änderungen) angezeigt werden. Das macht es auch für gelegentliche Tester einfacher, die neuesten Änderungen nachzuvollziehen.
Ältere Änderungen stehen im Archiv.
Neu: kompletter Im- und Export von Spielsystemen
08.08.2026 · Ingo Wiarda · a03db9f
Ziel für den Export als ZIP Archiv ist es, Spielsysteme mit allem Drum und Dran von einem Server zum anderen zu portiern, ohne auf Datenbankebene dump & load machen zu müssen.
Ziel für den Export als Asciidoc ist es, dass man damit das Handbuch besser überarbeiten kann - und die Änderungen werden so auch in git vernünftig versionierbar.
Die Namen von Skills, Items, Rassen usw. müssen nun einmalig sein (es hat keinen Sinn, zwei Fertigkeiten "Schleichen" und "schleichen" anzulegen - das war aber vorher möglich).
Neu: Kampagnenexport und -import
07.08.2026 · Ingo Wiarda · df7f886
fix home page image list
07.08.2026 · Ingo Wiarda · 77a707a
update install script for nginx
07.08.2026 · Ingo Wiarda · 788b076
Kampf-UI-Test: Klick wiederholen, bis die Wirkung da ist
07.08.2026 · Ingo Wiarda · 866656c
gameMasterControlsSitOnTheCreatureCard fiel sporadisch aus, immer an derselben
Stelle: dem Warten darauf, dass ein entfernter Effekt aus der Datenbank
verschwindet.
onCard kann nur melden, dass ein Klick abgeschickt wurde. Die Kampfrunde tauscht
sich alle zwei Sekunden aus, und ein Klick auf ein Element, das der Swap gerade
ersetzt hat, wirft nichts und tut nichts - Selenium klickt bereitwillig auf
einen Knoten, der nicht mehr im Dokument steht. Der Request geht nie raus, und
das Warten auf die Wirkung kann nur ablaufen.
onCardUntil dreht das um: die Wirkung ist die Schleifenbedingung, der Klick ist
das, was die Schleife tut. Geprüft wird zuerst, es wird also nie ein Klick zu
viel geschickt.
inCard/onCard warten außerdem mit UiWait.polling statt UiWait.of. Sie kämpfen
gegen einen 2s-Poll, entscheidend ist der Abstand zum Intervall und nicht der
Anteil an einer Obergrenze; eine Headroom-Messung zeigte onCard bei 2236ms von
5s - der mit Abstand knappste Wert der Suite, alles andere unter 12%.
cardHasNo bleibt aus dem Grund, den sein eigener Kommentar nennt, bei begrenzten
Wiederholungen.
Installer: fünf Fehler aus dem ersten echten Deployment
07.08.2026 · Ingo Wiarda · 4042bf9
Alle beim Aufsetzen von tim aufgefallen, keiner davon in einem Test sichtbar:
* psql interpoliert :'pw' nur in Eingaben, die es selbst liest - in einem
-c-String landet der Doppelpunkt beim Server. Das ALTER ROLE läuft jetzt
über stdin, das Passwort bleibt weiter Variable statt Textbaustein.
* JAVA_HOME in conf/install.env: ein vorhandenes JDK statt default-jdk-headless,
das vor Debian trixie ohnehin zu alt ist. Der aufgelöste Pfad landet im
ExecStart der Unit - sonst startet der Dienst weiter /usr/bin/java.
* ProtectHome=true versteckt /home vor dem Dienst; ein JDK darunter endet in
203/EXEC. Wird jetzt auf read-only gesetzt, und ein runuser-Test fängt den
Fall ab, dass der Dienstbenutzer den Pfad gar nicht betreten darf.
* systemctl reset-failed vor dem Start, plus StartLimit in [Unit]: mit
RestartSec=10 greift systemds Vorgabe nie, ein kaputter Dienst lief 182 mal
neu und blockierte danach den Neustart des Installers.
* Der Health-Check benutzte curl ohne zu prüfen, ob es da ist, und schluckte
"command not found". Auf einem minimalen Debian scheiterten so alle 60
Versuche, und der Installer beschuldigte eine laufende Anwendung. Jetzt
curl / wget / TCP-Connect, benannt, und der letzte Versuch ohne /dev/null.
Dazu: setup-postgresql.sh unterscheidet "schon von diesem Installer befüllt"
(behalten, Seed überspringen) von fremden Daten (verweigern). Vorher war jeder
späte Fehlschlag nur durch Löschen der Datenbank von Hand zu beheben.
Option: install app without letsencrypt (for example, if cert already exists)
06.08.2026 · Ingo Wiarda · 9d741fe
Szenen: UI verbessert
06.08.2026 · Ingo Wiarda · 1b37a3f
Implementierung: Szenen, #2-4
06.08.2026 · Ingo Wiarda · 4b3a558
Start Implementierung: Szenen, #1
06.08.2026 · Ingo Wiarda · 6d00fc4
Rename app; change "Wucht Roll" zu "Schadenswert"
06.08.2026 · Ingo Wiarda · 3fbb20c
Rename app; change "Wucht Roll" zu "Schadenswert"
06.08.2026 · Ingo Wiarda · c81e72d
Natürliche Waffen als AttackSource hinzugefügt.
06.08.2026 · Ingo Wiarda · b8b7c44
Attriute-Bonus-Kurve geändert. Attribut-Bonus wird auf Char-Sheet angezeigt.
06.08.2026 · Ingo Wiarda · 9c909c7
Level für Berufe und Kreaturen eingeführt.
06.08.2026 · Ingo Wiarda · 975371c
Spielsysteme können in der UI nur noch logisch gelöscht werden.
05.08.2026 · Ingo Wiarda · 95dd859
Für echtes Löschen: GameSystemDestroyer aufrufen.
Kampfsimulator: Ausgerüstete Waffen machen nun Schaden.
05.08.2026 · Ingo Wiarda · 5cf05f5
fix: delete confirmation on race
05.08.2026 · Ingo Wiarda · ee8abe6
Szenen-Konzept erarbeitet
05.08.2026 · Ingo Wiarda · db38219
Kampfsimulator - initial commit
05.08.2026 · Ingo Wiarda · 34dc6a3
add race-skill and race-trait editing to race edit page
05.08.2026 · Ingo Wiarda · d2440c7
Race edit could only manage attribute modifiers, even though the
race_skill_definition and race_trait_definition link tables already
existed and were shown read-only on the show/list pages. Adds add/edit/
delete HTMX sections for both, mirroring the existing attribute-modifier
pattern.
entferne roomId von ChannelUser
04.08.2026 · Ingo Wiarda · 6e56c62
(Wir haben roomId zu Hause ... über channelId)
fix chat message join condition
04.08.2026 · Ingo Wiarda · 27ba0c4
add migration script
04.08.2026 · Ingo Wiarda · feeb928
fix test
04.08.2026 · Ingo Wiarda · 2f1a040
Test was broken for snap-based Firefox (on Ubuntu, for example)
Kampfsystem-WWizard verbesert.
04.08.2026 · Ingo Wiarda · cc23be5
Kampfsystem-WWizard verbesert.
04.08.2026 · Ingo Wiarda · 79635df
Dunkel und Hell-Modus-switcher eingefügt.
04.08.2026 · Ingo Wiarda · 958e96c
Neu: Installationsskript + mvn -Pbundle Ziel
04.08.2026 · Ingo Wiarda · 1d06dcd
Assistent für Würfelsysteme; Namen anderer Spielsysteme entfernt.
04.08.2026 · Ingo Wiarda · ee2d0d1
erlaubt das Speichern von Würfelsystemen
03.08.2026 · Ingo Wiarda · 904669d
Kleine Korrekturen; breadcrumbs hinzugefügt, Layout gefixt.
03.08.2026 · Ingo Wiarda · c080e9d
rework user's start page
03.08.2026 · Ingo Wiarda · 36440fd
Kampf-Effekte und Kampf-Formeln sind nun konfigurierbar (wip)
02.08.2026 · Ingo Wiarda · 40972a2
implement parry and dodge
02.08.2026 · Ingo Wiarda · 5655b5e
Würfelsysteme überarbeitet und flexibler gemacht
02.08.2026 · Ingo Wiarda · 37b36f6
Würfelsysteme hinzugefügt, initial import
02.08.2026 · Ingo Wiarda · 9ce11fc
Sortiere Skills im Handbuch nach Typ
01.08.2026 · Ingo Wiarda · 13b902b
Entferne alte SQL-Migrations-Schritte aus init.sql
01.08.2026 · Ingo Wiarda · c2617ca
Konfiguration des Spielsystems erfolgt nun über ein JSONB-Feld in der DB
01.08.2026 · Ingo Wiarda · 10e319a
(reduziert Aufwand beim Hinzufügen neuer Config-Optionen)
Name des Spielsystems aus den h1.title Elementen entfernt
01.08.2026 · Ingo Wiarda · 7a23935
(redundant, da wir nun breadcrumbs haben)
search-as-you-type für Listen hinzugefügt
01.08.2026 · Ingo Wiarda · 7b80948
Formel fürs Steigern von Skills geändert - Kosten sind nun das Ziel-Level.
01.08.2026 · Ingo Wiarda · 899d6ab
Fix: message in mass edits (wie viele Zeilen betroffen waren)
31.07.2026 · Ingo Wiarda · b16cb64
Flag-Group im/export round-trip
31.07.2026 · Ingo Wiarda · 0491e41
Im-/Export sollte nun funktionieren.
31.07.2026 · Ingo Wiarda · 3de7e65
Erweitert: Im-/Export, mass edit
31.07.2026 · Ingo Wiarda · 0051db8
Import & Export von Rassen
31.07.2026 · Ingo Wiarda · a831cf1
Export der Regelwerk-Tabellen: Round-Trip für Spielelemente
31.07.2026 · Ingo Wiarda · 1baf07b
GameSystemExporter (@Profile("exporter")) schreibt die Elemente eines
Spielsystems zurück nach docs/ketib/tables/ - das fehlende Gegenstück zu
GameSystemCreator und wie dieser aufgebaut: ein exportX pro Tabelle, wo der
Creator ein addX hat. Damit können Massen-Edits und Regelwerk nicht mehr
auseinanderlaufen: bearbeiten, exportieren, git diff, committen.
Zehn Tabellen: Skills, Eigenschaften, Waffen, Rüstung und die sechs
Modifikator-Tabellen von /modifier/list.
Die schreibende Hälfte liegt jeweils im Converter, der die Tabelle schon
liest, nicht in einer parallelen Exporter-Klasse: eine geordnete
HEADERS/COLUMN_MAPPING-Definition treibt beide Richtungen, damit eine neue
Spalte nicht in der einen fehlen kann. AsciiDocTableWriter rendert und nutzt
den vorhandenen AsciiDocTableFormatter, sodass ein Export kein
Whitespace-Diff ist.
Zwei Tabellen waren zu schmal für das, was die Massen-Edit-Seiten schreiben:
skills.adoc bekommt Kreativpunkte und "Nur über Gewährung", traits.adoc Wert,
Pflicht und Kreativpunkte. Damit entfällt die Namensprüfung im Creator -
Kampfschrei ist jetzt eine Zelle, kein Sonderfall im Code. Umgekehrt hatte
trait_attribute_modifiers.adoc eine Bemerkung-Spalte ohne Feld im Modell:
trait_attribute_modifier bekommt description, die Massen-Edit-Tabelle eine
Spalte dafür.
Jeder ItemType hat jetzt eine Tabelle. Neu und vorläufig: scrolls, food,
containers, tools, clothing mit den vier Spalten, die alle Items teilen. Ein
ItemDefinitionConverter statt fünf Klassen - die Tabellen unterscheiden sich
nur in Titel und ItemType.
Der Exporter liest über die rohen Mapper, nicht über die ...Localized-
Servicemethoden: die .adoc ist die kanonische deutsche Quelle. Und er lässt
eine Datei in Ruhe, wenn das Spielsystem keine Zeilen dafür hat - ein leeres
Ergebnis ist eher ein vertippter Systemname als ein Kapitel, das geleert
gehört. Die Reihenfolge ist deterministisch (ranking, dann Name; bei
Verknüpfungen die Namen beider Enden), damit ein Re-Export nichts umsortiert.
TableRoundTripTest vergleicht geparste Objekte, keine Bytes: der Writer
normalisiert Zellen, die der Reader immer schon toleriert hat (10% -> 10,
nein -> Nein). GameSystemExportTest deckt ab, was der andere Test ausklammert:
die Mapper-Abfragen und die Auflösung jedes Fremdschlüssels zurück auf den
Namen.
Nebenbei: Troll-Regeneration war in trait_attribute_modifiers.adoc
referenziert, aber nirgends definiert - die Zeile wurde beim Import still
verworfen. Die Eigenschaft steht jetzt in traits.adoc und wird in
race_traits.adoc an Trolle vergeben.
Rassenbilder nach images/races/ verschoben
31.07.2026 · Ingo Wiarda · 20345d8
Die vier Beispielbilder der Standardrassen liegen jetzt in einem eigenen
Unterverzeichnis; races.adoc zeigt auf die neuen Pfade.
Massenupdate von Modifikatoren
31.07.2026 · Ingo Wiarda · 35a6cc6
delete old docs
31.07.2026 · Ingo Wiarda · e547821
Massenänderungen für Items
31.07.2026 · Ingo Wiarda · db548f6
Massenänderungen eingeführt für einige Spielelemente
31.07.2026 · Ingo Wiarda · c1e7c64
- skills
- traits
- quality
- flags
+ copy-Funktion für Charaktere
Massenänderungen eingeführt für einige Spielelemente
31.07.2026 · Ingo Wiarda · f4ea312
- skills
- traits
- quality
- flags
Alte Migrationsklassen aufgeräumt
31.07.2026 · Ingo Wiarda · e1a1b40
Brotkrümelnavigationsleiste hinzugefügt.
31.07.2026 · Ingo Wiarda · 1beaf81
Chat läuft nicht mehr unten aus dem Bild.
Skillbaum anzeigen in Übersicht
31.07.2026 · Ingo Wiarda · 335be84
Rassenauswahl vereinfacht
31.07.2026 · Ingo Wiarda · 578c724
Skillbeschreibungen + Effekte anzeigen
31.07.2026 · Ingo Wiarda · b494502
add design.adoc
30.07.2026 · Ingo Wiarda · 99a31d0
Skills can grant skills (skill trees)
30.07.2026 · Ingo Wiarda · 3f69437
A skill can now open up further skills, the way a profession already could:
Schmieden ab Stufe 5 eröffnet Dunkelstahl-Schmieden, Mithril-Schmieden und
Magische Erzveredelung.
- new SkillSkillModifier + skill_skill_modifier table and mapper, edited in a
section on the skill edit page (HTMX swap, like the profession one)
- ProfessionSkillGrantType renamed to SkillGrantType and shared by both sides;
AUTOMATIC/OPTIONAL/IMPROVE keep their meaning, no migration needed
- AUTOMATIC grants sync to a fixpoint so a tree resolves in one pass; each skill
is granted at most once, which makes cycles terminate
- OPTIONAL grants feed the character editor's picker, IMPROVE is computed on load
- new SkillCondition.SKILL marks a skill as reachable only through a tree and
keeps it out of the normal picker; skills.adoc gained a Bedingung column
simplify combat for GMs
30.07.2026 · Ingo Wiarda · cd15bf9
Show game system values
30.07.2026 · Ingo Wiarda · 1d3e64a
Config für lokale tools
30.07.2026 · Ingo Wiarda · 43844b6
Feld: description für Bilder hinzugefügt
30.07.2026 · Ingo Wiarda · 730835c
Bild-Suche hinzugefügt
30.07.2026 · Ingo Wiarda · 721ac8c
Überarbeitung der Bildverwaltung; Import-Util hinzugefügt
30.07.2026 · Ingo Wiarda · ffce4eb
* inklusive Commander-Ansicht zum Verschieben / Sortieren der Bilder
add human priestess image
29.07.2026 · Ingo Wiarda · e70f30b
Make the turn-order card the game master's control surface
29.07.2026 · Ingo Wiarda · 8ba1987
Everything the GM does to a creature now happens on that creature's card,
and the room hears about it in the chat.
The card: no "am Zug" label any more (the heading names whoever is acting
and the card is coloured), a ✕ in the corner takes the creature out of the
fight, hit points are an editable field, and an effect is dropped by the ✕
on its own tag - no confirmation, since putting it back is one pick away.
The status tag above the GM's own select is gone; everyone else still has it.
Hit points get their own endpoint, GM-only, clamped to 0..max and bumping
the combat revision by hand - nothing else on that path does, and without it
the other players' polls answer 204 and keep the old number.
Chat: a status change posts one sentence per state ("Moribundus ist tot") and
only when the status really changed - the select posts on every pick. An
effect says how long it lasts ("... geblendet (bis Runde 5)", or "(bis auf
Weiteres)"), and lifting one says so too.
The turn-order poll now skips its swap while a field on a card has focus.
Without that a hit point edit could be replaced mid-typing, and the change
event would then fire on a detached input - the edit was lost with nothing
to show for it.
Tests run against precompiled templates. Dozens of Spring contexts in one JVM
compiling templates on demand into one shared directory raced, and a context
could load a page whose class was on disk while an included fragment's was
not - ClassNotFoundException ...JteprofessionSectionGenerated, which showed
up as two UI tests failing in the full suite while passing on their own.
Rework the combat screen's chat, turn order and creature panel
28.07.2026 · Ingo Wiarda · 38f320d
Whose turn it is now sits beside the "Reihenfolge" heading, where everyone
sees it; the action bar only says that *you* are the one to act. The heading
moved into the polled fragment so it updates on a hand-off, with the cards
scrolling below it.
The dice bar is back in the chat column, where its results land, and the chat
box is capped at the window: .box.combat-chat-box is a flex column, the
message list takes the scrollbar, and the dice bar and send form stay on
screen. Written with two classes on purpose - bulma.css loads after main.css
and its ".box { display: block }" beats a single class, which left the list
spilling down the page.
The creature panel had two dropdowns for picking a character; the one at the
top is gone. Adding to the roster (which makes the first creature active) and
"aktiv setzen" cover it. The character block is no longer foldable.
Dev-mode jte templates now compile into target/jte-classes instead of the
starter's hardcoded project-root jte-classes, so mvn clean clears them - a
stale class there used to survive a clean build as a NoClassDefFoundError.
add template character images
28.07.2026 · Ingo Wiarda · 5f09386
generated with mistral ai (quick and dirty, not much effort - to be improved later. This is just so we can assign images to test characters to test portrait rendering etc)
move tables out of main.adoc into tables folder.
28.07.2026 · Ingo Wiarda · c9b0d76
improve combat screen
28.07.2026 · Ingo Wiarda · 5bd45df
update rules
27.07.2026 · Ingo Wiarda · d68a1e8
add weapon skills
27.07.2026 · Ingo Wiarda · 5b1aa34
add small fixes
26.07.2026 · Ingo Wiarda · a537ef3
(see: small-fixes.adoc)
initial version of comat chat
26.07.2026 · Ingo Wiarda · 4f72831
(steps 1+2 of implementation)
reduce wait times in UI tests
25.07.2026 · Ingo Wiarda · 96aa3fb
improve tests: reduce run time by ~50% to 107s
20.07.2026 · Ingo Wiarda · 049548d
fix channel-dropdown-bug
20.07.2026 · Ingo Wiarda · e19ce0a
.gitignore erweitert um docs/user-journey
20.07.2026 · Ingo Wiarda · 5503b07
Tests verbessert.
20.07.2026 · Ingo Wiarda · a66f4d7
entfernt: ID-Spalte in Listenübersicht
19.07.2026 · Ingo Wiarda · 5e678e4
User kann mit der internen ID nicht wirklich was anfangen.
fix: Kreativpunktkosten werden beim Editieren auch gespeichert.
19.07.2026 · Ingo Wiarda · 4a6c679
fix-2: Spielsystem-Verwaltungs-Buttons laufen nicht mehr aus der Seite raus (war mobile layout ohne Umbruch)
neu: Attribut-CRUD
item.creature_id is nullable
19.07.2026 · Ingo Wiarda · c7f589b
Items können nun dem Spielleiter gehören statt einer bestimmten Kreatur (wichtig zum Vorbereiten)
Refactor: creationPoints -> creativePoints; Datenbanken-Split fürs Testen
19.07.2026 · Ingo Wiarda · ca39d46
Update: Sortierung von Spielelementen
19.07.2026 · Ingo Wiarda · 104186c
- inklusive Umlaute
- sortOrder hängt nicht mehr an den einzelnen Elementen
Umbenennung: Platzhalter zu Ketib als Spielsystem-Name
19.07.2026 · Ingo Wiarda · 0d95e02
cleanup admin access
19.07.2026 · Ingo Wiarda · 676e5b9
Originalplan für Gegenstände
18.07.2026 · Ingo Wiarda · a356593
Geld nicht mehr nullable; TraitGroup.multiSelect wird durchgesetzt
18.07.2026 · Ingo Wiarda · a389045
- money ist wieder ein einfaches long mit Vorgabe 0, in Snapshot wie Export.
Ein Snapshot von vor der Geld-Einführung setzt den Kontostand damit auf 0
statt ihn stehen zu lassen - solange Charaktere Wegwerfware sind, ist das
in Ordnung.
- TraitGroup.multiSelect galt seit jeher nur auf dem Papier: eine Kreatur
konnte sämtliche Eigenschaften einer Einfachauswahl-Gruppe nehmen. Der
Editor bietet die restlichen jetzt nicht mehr an, addTrait weist sie mit
409 ab.
Abweisen statt Austauschen: Eigenschaften kosten Erschaffungspunkte, ein
stiller Austausch müsste die alte Eigenschaft erstatten - das tut sonst kein
Pfad im Editor. Bei Gegenstands-Flags wird dagegen ausgetauscht, weil die
nichts kosten.
Die eingelesenen Eigenschaftsgruppen stehen alle auf multiSelect=true, das
Standard-Spielsystem ist also nicht betroffen.
Gegenstands-Instanzen im Charakterbogen bearbeitbar
18.07.2026 · Ingo Wiarda · f7b6bc0
CreatureItemService konnte Flags setzen und Strukturpunkte ändern, der
Controller hat davon aber nur Kaufen und Verkaufen freigegeben - das
Kernbeispiel aus docs/plans/items.adoc (19 Pfeile + 1 vergifteter) war über
die Oberfläche gar nicht erreichbar.
- Endpunkte für Flag setzen/entfernen und Strukturpunkte, jeweils mit
Besitzprüfung gegen geratene item-IDs
- Knöpfe dafür in creature/itemSection.jte
- EditPageFragmentSwapTest fährt jetzt beides im Browser: das Abspalten des
vergifteten Stücks und die Rückerstattung beim Verkauf
Gegenstände in Snapshot, Export, PDF und Dev-Reset eingebunden
18.07.2026 · Ingo Wiarda · bcf310e
Fünfter Teil von docs/plans/items.adoc: die Stellen, die sonst still
falschliegen.
- CreatureSnapshotData/-Service: ohne das rollte ein Restore das Geld zurück
und ließ die gekaufte Ausrüstung stehen - Ware und Geld zugleich
- CharacterExport/-Portability: Gegenstände werden über Namen aufgelöst, Flags
als verschachtelte Namensliste. Ein unbekanntes Flag lässt nur das Flag
fallen, nicht den ganzen Gegenstand.
- CreaturePdfService: Ausrüstungstabelle
- DevController: der Reset kannte weder Schutzwürfe noch Gegenstände; die
Schutzwürfe waren eine Lücke aus b3bddd4, die hier mit aufgeräumt wird.
Weder CURRENT_VERSION noch CURRENT_FORMAT_VERSION werden angehoben: beide
werden mit != geprüft, eine Anhebung würde alle vorhandenen Snapshots und
Exportdateien unlesbar machen. Jackson ignoriert unbekannte Felder, additive
Ergänzungen sind also ohne Anhebung verträglich. money ist deshalb ein Long -
ist es nicht gesetzt (alte Datei), bleibt der Kontostand unangetastet, statt
auf 0 zu fallen.
Neu: Geld sowie Kaufen und Verkaufen im Charakter-Editor
18.07.2026 · Ingo Wiarda · 00c8419
Vierter Teil von docs/plans/items.adoc.
- creature.money (Basiswährung, Vorgabe 1000)
- chargeMoney/refundMoney nach dem Vorbild von chargeCreationPoints, inklusive
409 bei zu wenig Geld. Die Gutschrift-Richtung gab es bisher nirgends -
Erschaffungspunkte kennen keine Rückerstattung.
- Verkauf zum vollen Wert: das hier ist Budgetierung bei der Charaktererschaffung
und kein Handelsplatz, ein Fehlkauf muss sich sauber rückgängig machen lassen.
Sobald es echte Läden gibt, gehört die Rate an den Laden.
- creature/itemSection.jte als Out-of-band-Swap wie die übrigen Sheet-Sections
- das Geld sitzt im pointsBadge, das ohnehin bei jeder Aktion mitwandert -
damit aktualisiert es sich ohne zusätzliche Verdrahtung
Die Ausrüstung hängt an einer eigenen CreatureItemsView statt an CreatureEditView:
das Record hat bereits neunzehn Komponenten.
Neu: Gegenstands-Instanzen mit Stapelung
18.07.2026 · Ingo Wiarda · 253a444
Dritter Teil von docs/plans/items.adoc: was eine Kreatur tatsächlich besitzt.
- item und item_flag; kein condition-Feld, der Zustand folgt aus den
Strukturpunkten
- CreatureItemService mit addItem/removeItem/splitOne/addFlag/removeFlag/
setStructuralPoints. Gleiche Stücke teilen sich eine Zeile, das Verändern
eines einzelnen spaltet es ab, das Rückgängigmachen führt sie wieder zusammen
- multiSelect wird hier tatsächlich durchgesetzt: ein Flag aus einer
Einfachauswahl-Gruppe verdrängt das bisherige der Gruppe. (TraitGroup.multiSelect
bleibt weiterhin folgenlos - das nachzuziehen würde bestehende Charaktere
betreffen und gehört nicht hierher.)
Der Stapel-Schlüssel nutzt die Strukturpunkte statt des daraus abgeleiteten
Zustands: ein Schwert mit 7 und eines mit 6 von 10 Punkten sind beide
"gebraucht", beim Zusammenlegen müsste die Zeile sich aber für einen Wert
entscheiden und der andere ginge verloren. Punkte sind der feinere,
verlustfreie Schlüssel - und gleiche Punkte bedeuten immer gleichen Zustand.
Ebenso zählen leerer und fehlender Hersteller als derselbe.
item_flag ist die erste Join-Tabelle an einer Instanz statt an einer
Definition; die Kaskaden in CreatureService, GameSystemService und
GameSystemDestroyer kannten so etwas noch nicht und wurden ergänzt.
Neu: Flag-Gruppen und Flag-Verwaltung
18.07.2026 · Ingo Wiarda · a625c9b
Zweiter Teil von docs/plans/items.adoc. Flags hatten bisher gar keine
Oberfläche - kein Controller, kein Service, kein Template - und wurden von
keinem Seed angelegt. Ohne Verwaltung lässt sich aber keine Gruppe füllen und
kein Gegenstand mit Flags versehen, deshalb kommt beides zusammen.
- FlagDefinitionGroup mit flagType (Kreatur/Gegenstand) und multiSelect,
nach dem Vorbild von TraitGroup
- flag_definition bekommt flag_definition_group_id; bewusst nullable, da sich
ein NOT NULL-Fremdschlüssel ohne gültigen Default nicht ergänzen lässt. Der
Editor verlangt immer eine Gruppe, alte Rollen ohne Gruppe bleiben sichtbar
und reparierbar.
- CRUD für Flags und Flag-Gruppen
- item_definition_flag: die Standard-Flags eines Prototyps, als Section-Swap
nach dem Muster aus af36f31
- der Picker bietet nur ITEM-Flags an; Kreatur-Flags sind ein eigener Pool
Zwei Schutzgitter, die der Plan nicht vorgesehen hat: der flagType einer
gefüllten Gruppe lässt sich nicht mehr ändern und eine gefüllte Gruppe nicht
löschen - beides würde Flags auf der falschen Art von Ziel zurücklassen.
Neu: Gegenstands-Prototypen (ItemDefinition, Quality)
18.07.2026 · Ingo Wiarda · b233717
Erster Teil von docs/plans/items.adoc: die Prototypen-Seite.
- ItemDefinition (Gewicht in g, Wert in Basiswährung, Art, Material,
Strukturpunkte) und Quality als GameElements samt CRUD
- ItemType und ItemCondition als einfache Enums - sie brauchen keine
spielsystem-eigenen Namen und bleiben so aus GameElementType heraus
- ItemCondition.of() leitet den Zustand aus den Strukturpunkten ab, statt ihn
zu speichern: sonst könnte ein Schwert bei vollen Punkten "zerstört" sein.
100% neuwertig, >=75% gut, >=50% gebraucht, >0 beschädigt, 0 zerstört;
ohne Strukturpunkte gilt der Gegenstand als unzerstörbar
- Übersetzungs-Editor, Lösch-Kaskaden und Navigation angebunden
Die Default-Flags eines Prototyps folgen im nächsten Schritt - dafür brauchen
Flags erst eine eigene Verwaltung.
Schutzwürfe auf das Section-Swap-Muster umgestellt
18.07.2026 · Ingo Wiarda · acf80a8
Die Schutzwürfe wurden gemergt, bevor af36f31 die Edit-Seiten auf
HTMX-Section-Swaps umgestellt hat, und waren daher als einzige noch auf
redirect: - inkl. eines inline-Blocks in trait/edit.jte neben den beiden
bereits extrahierten Sections.
- neu: savingThrow/attributeSection.jte und trait/savingThrowModifierSection.jte
- die vier mutierenden Endpunkte liefern jetzt die Section statt eines Redirects
- savingThrow/edit.jte reicht _csrf an shared.head weiter, sonst bekommen die
HTMX-POSTs ein 403
- EditPageFragmentSwapTest deckt beide neuen Sections ab
fix: Merge-Rest in CreatureController entfernt
18.07.2026 · Ingo Wiarda · c7aafef
addSheetAttributes wurde beim Merge von af36f31 zu void, die alte
return-Zeile blieb stehen - master hat nicht kompiliert.
Beispiel-Bild für Rasse: Troll
18.07.2026 · Ingo Wiarda · 78b6e06
(Mistrail.ai generated)
docs: verweise auf die maven-Skills statt auf .vibe/tools
18.07.2026 · Ingo Wiarda · 762fa91
Die in CLAUDE.md genannten Skripte existieren nicht mehr - .vibe/tools
enthält nur noch github_issue.py. Die gleichwertigen Skills liegen unter
~/.claude/skills/.
Neu: Schutzwürfe (saving throws)
18.07.2026 · Ingo Wiarda · b3bddd4
Implementiert den in main.adoc beschriebenen Schutzwurf: höchster
Attribut-Bonus + Eigenschaften-Boni + 3W6 + Schwierigkeit gegen Ziel 12.
Schutzwürfe sind errechnete Werte - es gibt keine Kreatur-Tabelle, jede
Definition eines Spielsystems gilt für jede Kreatur darin. Entsprechend
ändert sich am Charakter-Export nichts.
- saving_throw_definition mit scope (ganz/teilweise) und Schadensreduktion,
dazu die Join-Tabellen saving_throw_attribute und trait_saving_throw_modifier
- Import der Tabellen "Schutzwürfe" und "Schutzwürfe: Bonus durch
Eigenschaften" über den GameSystemCreator (7 Definitionen, 8 Attribut-Links,
4 Eigenschaften-Boni)
- CreatureDisplayService.calculateSavingThrowValues: nutzt die vorhandene
attributeModifier-Kurve und die Höchstwert-Auswahl der Skillproben
- CRUD unter /saving-throw, Eigenschaften-Boni werden auf der Eigenschaft
gepflegt (wie die Skill-Modifikatoren)
- Wurf im Raum als dritter Check neben Skill- und Attributprobe; bei Erfolg
nennt die Nachricht die Konsequenz (Effekt abgewehrt bzw. Schaden reduziert)
- Anzeige auf dem Charakterbogen samt (?)-Aufschlüsselung
Bewusst ohne Prozent-Bonus bei trait_saving_throw_modifier: die Basis eines
Schutzwurfs ist ein einstelliger Attribut-Modifikator, ein Prozentwert würde
dort weggerundet und einen negativen Modifikator verschlechtern.
Neu: Schutzwürfe-Beschreibung
18.07.2026 · Ingo Wiarda · a998635
UI überarbeitet
18.07.2026 · Ingo Wiarda · af36f31
neu: mehr Dinge, die man mit Kreativpunkten kaufen kann
18.07.2026 · Ingo Wiarda · 8fe2cb1
mehr Kreativpunkte zum Testen
18.07.2026 · Ingo Wiarda · 925159b
fix var name
18.07.2026 · Ingo Wiarda · e0e1772
Neue Selenium-Tests
18.07.2026 · Ingo Wiarda · a6b2bd1
Neu: Export und Import von Charakteren
17.07.2026 · Ingo Wiarda · 26f39f5
Neu: Snapshots von Charakteren (bevor man was kaputt machen kann)
17.07.2026 · Ingo Wiarda · 9ffaaf6
Neu: CRUD für Trait/Skill
17.07.2026 · Ingo Wiarda · 119528f
fix labels
17.07.2026 · Ingo Wiarda · f8f0559
Neu: Option eine Profession auf bestimmte Rassen zu beschränken
17.07.2026 · Ingo Wiarda · 051c303
Neu: Profession CRUD
17.07.2026 · Ingo Wiarda · 0bdbcfa
Neu: Professionen (Berufe)
17.07.2026 · Ingo Wiarda · 8571283
Neu: PDF Export von Creature
17.07.2026 · Ingo Wiarda · e618215
Neu: TraitSkillModifier: Eigenschaften können Skills ändern/gewähren
17.07.2026 · Ingo Wiarda · 915d7ef
Verbesserter SkillType-Import
17.07.2026 · Ingo Wiarda · 8909afb
Chat-Nachrichten für Skillproben verbessert & konfigurierbar gemacht.
17.07.2026 · Ingo Wiarda · 2e48975
Skill/Attribut-Proben Modifikatoren.
17.07.2026 · Ingo Wiarda · 79fb78b
Skillproben einführen + Bonus auf Skills berechnen
17.07.2026 · Ingo Wiarda · df6f1ed
Skillproben einführen + Bonus auf Skills berechnen
17.07.2026 · Ingo Wiarda · e3aaa5f
Berechnete Charakterwerte mit Modifikator-Erklärung
16.07.2026 · Ingo Wiarda · 6c36bbe
- Neu: trait_attribute_modifier - Eigenschaften geben Attribut-Boni (fest oder
prozentual), gepflegt über die Tabelle "Eigenschaft-Attribut-Modifikatoren"
im Regelwerk und importiert vom GameSystemCreator.
- CreatureDisplayService berechnet effektive Attributwerte beim Laden
(Basis + feste Modifikatoren, dann Prozente auf die Zwischensumme,
abgerundet); Quellen: Rassen-Attribut-Modifikatoren und Eigenschaften.
- (?)-Icon neben dem effektiven Wert lädt per htmx eine Aufschlüsselung
(Basiswert, jeder Modifikator mit lokalisierter Quelle, Ergebnis) auf
creature/show, creature/edit und im Raum-Kreaturen-Panel.
- Attribute.current_value und Skill.current_level entfernt: sie wurden nach
der Erstellung nie geschrieben; temporäre Änderungen werden künftig als
Modifikatoren modelliert statt als persistierte Kopien.
- GameSystemDestroyer: Kreaturen werden vor dem Löschen aus Räumen gelöst
(room_user/chat_message/room_creature), Räume samt Kindern (channel,
channel_user, chat_message, room_user, room_creature) kaskadiert gelöscht;
DevController-Löschpfad um fehlende race_*- und trait_attribute_modifier-
Kaskaden ergänzt.
Traits / Eigenschaften hinzugefügt.
16.07.2026 · Ingo Wiarda · cec1182
Neu: Eigenschaften können geladen werden. (früher: Features, nun: Traits)
15.07.2026 · Ingo Wiarda · 8e4033f
Use imports instead of inline fully qualified names
15.07.2026 · Ingo Wiarda · 87de238
Export and import game content translations as XLIFF
15.07.2026 · Ingo Wiarda · 96bd809
Answers the open i18n question in docs/Import und Export.adoc: the app stores
translations, but it does not try to be a translation tool. It hands the texts
out in XLIFF 1.2 - what OmegaT, Weblate, memoQ and Trados read - and takes the
translated file back, which is the translation memory path the doc asked for.
Written and parsed with the JDK's own XML support, so no new dependency.
GET /game-system/{id}/translations/export?targetLanguage=en
POST /game-system/{id}/translations/import
trans-unit ids are RACE:42:name, so a unit maps back to exactly one field of one
game element. A game system changes between export and re-import, so units whose
element no longer exists are counted and skipped rather than thrown: one stale id
must not discard a translator's whole file.
An empty target means "not translated" and clears any existing row, restoring the
fallback to the source text. But an untouched export is almost entirely empty
targets, so TranslationService.save now reports whether it actually changed
anything - otherwise re-importing a fresh export claimed "29 removed" when nothing
had been removed, which reads as if a TM run had wiped the user's work.
The uploaded file is untrusted input: DTDs and external entities are disabled.
The UI chrome needs none of this - .properties is already a format those tools read.
Add translations for game content
15.07.2026 · Ingo Wiarda · 59469d6
Game material is imported in whatever language it was authored in, and a race
bundle arrives as "Drachen" with no English version attached. So translations
are a sidecar, never in place:
- game_element_translation(element_type, element_id, language, name, description)
covers all eight GameElement subclasses at once. The mappers all SELECT *
with no @Results, so none of their SQL changed.
- The existing name/description columns stay canonical. They have to: game_system.name
is UNIQUE, attribute_definition has UNIQUE(name, game_system_id), and the import
spec in docs/Import und Export.adoc matches entries by name.
- game_system.source_language records which language those columns are in.
GameElement gains getDisplayName()/getDisplayDescription(), which return the
translation when there is one and the source text when there is not. getName()
keeps returning the source, so edit forms go on editing the source and cannot
overwrite the German name with the English one. Untranslated is the normal case,
not an error: an English user sees "Drachen" until somebody translates it.
TranslationService loads one game system's translations in a single query and
applies them in the service layer, so the controllers and templates never learn
that translation exists. That is what Phase 0 bought.
/game-system/{id}/translations is the editor: source text on the left, target on
the right, htmx save per row. Clearing both fields deletes the row and restores
the fallback.
Creature.name is not a GameElement, so character names are excluded for free.
Add i18n message bundles for the UI chrome
14.07.2026 · Ingo Wiarda · b87f2d0
Templates look up strings through a static import:
@import static de.dewarim.roleplay.i18n.Msg.msg
<h1>${msg("race.show.title")}</h1>
Msg reads the locale from Spring's LocaleContextHolder, so no template needs
a msg parameter and shared/head + shared/menu keep working without their
callers forwarding anything. The cost is a static MessageSource assigned from
the Spring-managed constructor; the alternative was threading a parameter
through all 48 templates and every @template.shared.*(...) call site.
German is pinned as the default via SessionLocaleResolver.setDefaultLocale:
Accept-Language is deliberately not consulted, so a browser set to English
still gets German until the user picks a language with the DE/EN switch in the
navbar. That also keeps the wording the Selenium suite asserts on unchanged.
All 48 templates, both hardcoded controller error strings and every bean
validation message now resolve through messages.properties (German, 271 keys)
and messages_en.properties.
Not translated, on purpose:
- the dice chat lines in DiceController, which are persisted into the chat log
and are data rather than view text
- the W6/W20 dice buttons, which mirror the German dice formula syntax the
parser accepts
- "Roleplay App", which is the product name
MessageBundleTest guards the bundles: identical key sets, no template
referencing an undefined key (Msg falls back to the key, so a typo would
otherwise just render as literal text), and no unescaped single quote in a
parameterized message. LocaleSwitchControllerTest covers the German default,
the ?lang=en switch, its persistence in the session, and that Accept-Language
does not override the default.
Extract services from Race/Creature/GameSystem controllers
14.07.2026 · Ingo Wiarda · 44e4e7c
Controllers were reaching straight into mappers, against the
Controller -> Service -> Mapper flow in CLAUDE.md. Multi-mapper writes
therefore ran with no transaction boundary, which hid two delete bugs:
- Deleting a race that had attribute modifiers or race skills violated
fk_ram_race / fk_rsd_race: neither child has ON DELETE CASCADE and the
controller never removed them. The imageId=null update it did first had
already committed on its own, so a failed delete also stripped the race
of its image.
- Deleting a creature that owned any skill violated fk_skill_creature. The
controller deleted only the attributes, even though CreatureService
already had a correct deleteCreatureCascading that DevController uses.
New RaceService, SkillDefinitionService and CreatureEditService own the
fetching, aggregating and writes; the controllers keep authorization,
validation and view selection. GameSystemService takes over the delete that
GameSystemController did with a raw JdbcTemplate and @Transactional on the
controller method.
Adds the missing class-level @Transactional to CreatureService,
GameSystemService, UserService and CustomImageService.
Regression tests cover both delete paths.
allow user to add multiple creatures to chat room.
13.07.2026 · Ingo Wiarda · 311f605
For example: character and their pet / summon.
Add Selenium regression guards for the htmx fixes
12.07.2026 · Ingo Wiarda · 7940bb9
The suite was green after the htmx fixes, but three of the bugs would have
regressed silently - the old, broken code passed every existing test.
- RoomTest.testCreateRoomLoadsFragmentOnly: asserts the create-room button
swaps in a form fragment, not a whole document (no second <nav>, no
nested #create-room).
- ChannelTest.testPollingSurvivesSubscribeAndKeepsChannelSelection: asserts
the channel list still polls after a subscribe replaces it, and that a
full poll cycle does not reset the channel the user selected.
- ChannelTest.testChannelListPolling now waits for the swapped-in fragment
before asserting on it, so it proves the fragment re-arms its own poll
instead of reading the initial placeholder.
Each was verified to fail against the pre-fix code.
Fix htmx integration bugs and clean up JTE templates
12.07.2026 · Ingo Wiarda · 76edd5e
Review of the JTE templates surfaced several defects in the htmx wiring,
all rooted in fragments not owning their swap target.
Bugs:
- Subscribing to a channel killed the 10s poll: the polling container and
the channels fragment both used id="channel-list", so the subscribe
button's outerHTML swap replaced the poller with markup that had no
hx-get. Fragments now re-arm their own poll.
- The channel poll reset the user's selected chat channel every 10s via an
out-of-band select update. That update is now only sent when the
subscriptions actually changed.
- Selecting a creature in a room never worked: the POST was a raw fetch()
without a CSRF token (403), and GET /creature/{id}/display returned an
empty body because both the view name and the template used Thymeleaf
fragment syntax, which JTE does not implement. Replaced with htmx.
- The race skill (R) marker was built as an HTML string inside ${...} and
therefore rendered escaped, as visible text.
- hx-get="/room/create" swapped a whole HTML document (doctype, head, a
second nav) into a div; the form is now a fragment.
- race/listFragment called desc.isEmpty() on a description that is null
for any modifier built with the no-arg constructor, which made the whole
race list page throw. This is what the two "flaky" RaceAttributeModifier
list-page tests had been reporting all along.
- The chat list no longer scrolls to the bottom while the user is reading
older messages.
- room/messages sliced LocalDateTime.toString(), which throws when seconds
and nanos are zero; it now uses a DateTimeFormatter.
Cleanups:
- Extracted room/diceButton, room/channelSelect, room/createForm and
creature/skillAddForm; view.jte 388 -> 237 lines.
- Moved the race-skill set logic out of creature/edit.jte into the
controller; edit.jte 287 -> 181 lines.
- Removed dead code: room/saved.jte, creature/load-skill-definitions
(endpoint + template + its two empty placeholder divs).
- Fixed colspan in race/delete-confirm (5 -> 9 columns).
Tests: added coverage for the race-skills edit page (which had none, hence
the escaping bug), the creature display fragment, and end-to-end creature
selection in a room. Suite is green: 108 tests.
CLAUDE.md: broken tests must be fixed before starting other work.
neu: vergessener RaceSkillDefinitionMapper; RSD als Liste in create
10.07.2026 · Ingo Wiarda · bb8efd8
Extend creature/create page to show race skills in description cell
10.07.2026 · Ingo Wiarda · 1a15657
- Added RaceSkillDefinitionMapper for database access to race skills
- Updated CreatureController.loadRaces() to load race skills and skill definitions
- Modified load-races.jte template to display race skills after race description
- Race skills show: skill name, level bonus (if > 0), and inherent status
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
RaceSkillDefinition hinzugefügt (wip)
05.07.2026 · Ingo Wiarda · 6a6a2f2
Selenium-Tests für Kreatur-Feature hinzufügen
01.07.2026 · Ingo Wiarda · 30138d7
Bisher gab es für Kreaturen keine Browser-Tests; CreatureTest deckt
Anlegen (inkl. HTMX-Rassenauswahl), Bearbeiten (Rasse bleibt fix,
siehe #49), Liste, Löschen und die Portrait-Bildauswahl ab.
Rasse-Auswahl aus Kreatur-Bearbeitung entfernen
30.06.2026 · Ingo Wiarda · 734616a
Die Rasse wird beim Erstellen der Kreatur festgelegt und beeinflusst die
verfügbaren Start-Fertigkeiten; eine nachträgliche Änderung ist daher
nicht sinnvoll. Im Edit-View wird die Rasse jetzt nur noch als fester
Text angezeigt, raceId wird beim Speichern nicht mehr übernommen.
close #49
Neu: Beschreibung für Rasse-Attribut-Modifikatoren
28.06.2026 · Ingo Wiarda · 521f804
+ fix <label> elemnents
Warnungen reduzieren in Tests
28.06.2026 · Ingo Wiarda · ded48eb
Warnungen vor möglichen NPE reduzieren
28.06.2026 · Ingo Wiarda · e4a17bf
RaceAttributeModifier funktional machen; Tests fixen
28.06.2026 · Ingo Wiarda · 83b9f9a
add value to feature class
27.06.2026 · Ingo Wiarda · 5d45978
add dice result per die
27.06.2026 · Ingo Wiarda · ca8c58e
add dice formula
27.06.2026 · Ingo Wiarda · dc64174
fix init script
27.06.2026 · Ingo Wiarda · 2ba3c6c
simplify image selection workflow
26.06.2026 · Ingo Wiarda · 46c2b36
simplify the race CRUD workflow
26.06.2026 · Ingo Wiarda · 03baa2a
Merge pull request #50 from dewarim/feature/races-as-table-with-image
23.06.2026 · Ingo Wiarda · 901bd16
show race image in list view and when creating a creature
show race image in list view and when creating a creature
23.06.2026 · Ingo Wiarda · f7b5d7a
close #43
add UserService to streamline UserController.
23.06.2026 · Ingo Wiarda · bf83a0d
add import for race image from main.adoc, also refactored CustomImageController
22.06.2026 · Ingo Wiarda · 26d1256
setup mvn:site
21.06.2026 · Ingo Wiarda · 1727560
fix import after merge
21.06.2026 · Ingo Wiarda · eb99d5b
remove unused UserMapper import
21.06.2026 · Ingo Wiarda · c7a4a3e
refactor to use findOrThrow to fetch objects in endpoints.
21.06.2026 · Ingo Wiarda · 89a69f5
refactor to use new @CurrentUser annotation to inject User object into endpoints
21.06.2026 · Ingo Wiarda · ec7d132
Merge pull request #46 from dewarim/fix/cleanup-code
21.06.2026 · Ingo Wiarda · e8d79c4
cleanup code a little
cleanup code a little
21.06.2026 · Ingo Wiarda · b87e389
- reduce some redundant constructs
- fix some code inspection issues
Merge pull request #45 from dewarim/feature/images-for-race
21.06.2026 · Ingo Wiarda · 5bc319f
Feature/images for race
fix RaceMapper and tests
21.06.2026 · Ingo Wiarda · 8f84ac7
fix flow of race crud (wip)
21.06.2026 · Ingo Wiarda · 8c331f7
user can add custom image to race
20.06.2026 · Ingo Wiarda · f3c178d
(mixed: Mistral & Me)
add symlinks
20.06.2026 · Ingo Wiarda · a71cdff
add example images for races.
20.06.2026 · Ingo Wiarda · 646077d
(yes, they are AI & 3 minute effort, but at least we now have test images. If the user creates their own game system, they are welcome to use real images :) )
small refactoring: after race is chosen, go to edit view (not show)
20.06.2026 · Ingo Wiarda · 1d4078f
remove trailing bracket
20.06.2026 · Ingo Wiarda · 9e13a30
add development controller to help admin clean up test data
20.06.2026 · Ingo Wiarda · e42e303
close #42
Fix CSRF error in /dev/main/remove-all-creatures and add Selenium tests
20.06.2026 · Ingo Wiarda · 1a3a66b
- Add CSRF token support to DevController.devPage method
- Add CSRF token parameter to all PostMapping methods in DevController
- Add CSRF hidden input fields to all forms in dev/main.jte template
- Create DevMainTest.java with Selenium tests for /dev/main page
- Test page accessibility after login
- Test statistics table display
- Test delete buttons presence in development mode
- Test CSRF tokens in forms
- Test hints section display
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
add Claude.md
20.06.2026 · Ingo Wiarda · 41cb69b
remove duplicate files (created symbolic link to actual resources)
20.06.2026 · Ingo Wiarda · 52a5dee
Merge pull request #41 from dewarim/feature/add-character-image
20.06.2026 · Ingo Wiarda · 8696ed8
allow user to set portrait of their creature (initial implementation).
allow user to set portrait of their creature (initial implementation).
20.06.2026 · Ingo Wiarda · 99d8638
close #25
Merge pull request #40 from dewarim/fix/screenshots-in-tests
19.06.2026 · Ingo Wiarda · c4c5a7d
add flag: screenshot on failure enabled (default: false)
Merge pull request #39 from dewarim/feature/character-skills
19.06.2026 · Ingo Wiarda · ad5317a
add example image for character portrait
add flag: screenshot on failure enabled (default: false)
19.06.2026 · Ingo Wiarda · 44a35aa
close #38
add example image for character portrait
19.06.2026 · Ingo Wiarda · cca5e35
Merge pull request #37 from dewarim/feature/add-create-channel
19.06.2026 · Ingo Wiarda · a2bf69e
Feature/add create channel
add create channel feature: fix other tests
19.06.2026 · Ingo Wiarda · 6cbeaf9
(mixing contributions from Mistral Vibe CLI and Claude Code)
close #36
add create channel feature: fix some tests
19.06.2026 · Ingo Wiarda · a7e7c69
add create channel feature: fix some tests
14.06.2026 · Ingo Wiarda · 9c34cb8
add create channel feature: fix some tests
14.06.2026 · Ingo Wiarda · 69e918a
add create channel feature
14.06.2026 · Ingo Wiarda · d4a8b0b
(wip, tests are failing)
Merge pull request #35 from dewarim/feature/chat-channel-subscriptions
14.06.2026 · Ingo Wiarda · f715fd8
add channel subscriptions and channel list
add channel subscriptions and channel list
14.06.2026 · Ingo Wiarda · ba69cab
close #34
Merge pull request #33 from dewarim/feature/character-skills
14.06.2026 · Ingo Wiarda · 6c9c1ee
load character skills during creation
load character skills during creation
14.06.2026 · Ingo Wiarda · 0c489ec
close #32
close #23
Merge pull request #31 from dewarim/feature/user-and-authorities-cache
14.06.2026 · Ingo Wiarda · bb21dce
add a cache for User & Authorities.
add a cache for User & Authorities.
14.06.2026 · Ingo Wiarda · 2bc9883
close #29 (went a bit beyond its scope)
Merge pull request #30 from dewarim/feature/roll-dice
14.06.2026 · Ingo Wiarda · 6823011
add simple die rolls to room chat
add simple die rolls to room chat
14.06.2026 · Ingo Wiarda · 8b63790
close #28
improve creature & user /show templates
14.06.2026 · Ingo Wiarda · 206ea62
Merge pull request #27 from dewarim/feature/install-script
13.06.2026 · Ingo Wiarda · 158883a
Feature/install script
add scripts to install nginx & postgres for deployments to new hosts; add startup script.
13.06.2026 · Ingo Wiarda · b8f4d92
make some properties configurable via environment variables
13.06.2026 · Ingo Wiarda · fd41d2a
fix pom to configure JTE template compilation when packaging application to JAR
13.06.2026 · Ingo Wiarda · d7d80e4
ignore some more folders
13.06.2026 · Ingo Wiarda · 02ccb07
Merge pull request #22 from dewarim/feature/custom-images
13.06.2026 · Ingo Wiarda · 06d22d4
add image upload
add image upload
13.06.2026 · Ingo Wiarda · df45fdf
close #21
allow user to view game systems; check for duplicate name error when editing game system
12.06.2026 · Ingo Wiarda · e22ca87
Merge pull request #20 from dewarim/feature/extend-skills
12.06.2026 · Ingo Wiarda · d327eda
Feature/extend skills
extending skills with type and condition; add SkillAttribute mapping
12.06.2026 · Ingo Wiarda · e79fac8
close #13
fetch github issue(s)
12.06.2026 · Ingo Wiarda · 464b0e1
fix setting deleted flag on room and deleting rooms completely (with messages)
12.06.2026 · Ingo Wiarda · 7860b38
handle duplicate room name and allow adding game system to room
12.06.2026 · Ingo Wiarda · 9a6be8c
fix page titles
12.06.2026 · Ingo Wiarda · 47bd4d7
fix #15
Merge pull request #18 from dewarim/chat-room
12.06.2026 · Ingo Wiarda · 1648f44
Initial chat room, created with Mistral.AI
- improvements needed, especially with HTMX integration.
send chat messages without reloading the whole page
12.06.2026 · Ingo Wiarda · e00a90e
more improvements for chat channels & rooms
12.06.2026 · Ingo Wiarda · 56bcbb7
reduce security logging level to info as long as we are not investigating it
12.06.2026 · Ingo Wiarda · 9f48f45
reduce security logging level to info as long as we are not investigating it
12.06.2026 · Ingo Wiarda · fe9e0db
add chatroom feature.
12.06.2026 · Ingo Wiarda · c9f8e56
close #12
add language instruction for Agents
12.06.2026 · Ingo Wiarda · 52e1955
improve navbar so we have whitespace between navbar and content
10.06.2026 · Ingo Wiarda · 56e8ccd
(almost a bit much, but better than mushed together)
improve navbar to not be 100% width
10.06.2026 · Ingo Wiarda · 7546212
improve action links and navbar.
10.06.2026 · Ingo Wiarda · 52d2dfa
add bulma css framework (first styles applied)
09.06.2026 · Ingo Wiarda · fb62c40
close #3
move <head> section to shared template
08.06.2026 · Ingo Wiarda · ed80f3b
close #5
load races dynamically during character creation
08.06.2026 · Ingo Wiarda · 60d757d
add LinkChecker tool
08.06.2026 · Ingo Wiarda · 1e5f255
add GlobalModelAttributes for currentPath
08.06.2026 · Ingo Wiarda · ebef67a
replace default-ui.css to fix broken link to plaintext.css
08.06.2026 · Ingo Wiarda · 7ace07a
close: #7, #8, #9, #10
highlight current menu item by adding currentPath param
07.06.2026 · Ingo Wiarda · d8e2776
add menu as shared template
07.06.2026 · Ingo Wiarda · b0c9663
close #4
add menu
07.06.2026 · Ingo Wiarda · 110a27d
close #2
update agents file
07.06.2026 · Ingo Wiarda · 3b512a7
add basic input validation for GameSystem.
07.06.2026 · Ingo Wiarda · 3cf8fa2
close #1
add info on github location
06.06.2026 · Ingo Wiarda · 3d028cd
exclude .env file from repo
06.06.2026 · Ingo Wiarda · a64939f
reduce IntelliJ false warnings
06.06.2026 · Ingo Wiarda · 97e4aca
improve creature creation screen
06.06.2026 · Ingo Wiarda · a163455
validation: add name constraint to GameSystem model
06.06.2026 · Ingo Wiarda · 6d7d092
Update für dependencies + Hibernate Validator
06.06.2026 · Ingo Wiarda · adf9298
Spielsystem zur Kreaturenliste hinzugefügt
04.06.2026 · Ingo Wiarda · 5bb4150
Spieldesign in eigene Datei ausgelagert
04.06.2026 · Ingo Wiarda · 95aa8d0
Attribute zuweisen und initialisieren
04.06.2026 · Ingo Wiarda · c4d2e1e
neu: initial_value für attribute_definition
04.06.2026 · Ingo Wiarda · f7998f4
link zur edit-Seite
04.06.2026 · Ingo Wiarda · f4cc3a1
spentCreationPoints ist nun read-only für user
04.06.2026 · Ingo Wiarda · 7c65372
Creature edit hinzugefügt mit Vibe (Mistral.ai)
04.06.2026 · Ingo Wiarda · c05d930
Agents hinzugefügt
04.06.2026 · Ingo Wiarda · e4c32c1
neu: list-page für Kreaturen
04.06.2026 · Ingo Wiarda · 5da23cc
create a simple list of actions (instead of mashing all links together)
04.06.2026 · Ingo Wiarda · 0eff3ac
add creature list to game system view
04.06.2026 · Ingo Wiarda · ae0f6fd
remove RaceAttributeModifier, add very basic creature controller
25.05.2026 · Ingo Wiarda · 922f79a
TODO: fix broken links
remove CustomTextDefinition - not used for anything
25.05.2026 · Ingo Wiarda · 0d30c32
I can't remember what that was intended for.
Creatures can have custom texts associated with them (for example, a description, biography or adventure notes).
If at some point every creature gets the same type of custom text, we can add it again.
cleanup
23.05.2026 · Ingo Wiarda · a6d5f02
add attributePointCost to GameSystem
23.05.2026 · Ingo Wiarda · 968ae02
add initial CreatureController
23.05.2026 · Ingo Wiarda · 2ae3e07
ignore junie config files for now
22.05.2026 · Ingo Wiarda · bd20a41
convert raceCreationPoints table from main.adoc to objects; add creationPoint cost to Race
22.05.2026 · Ingo Wiarda · 60fb9cc
added show/$id endpoint to GameSystemController
22.05.2026 · Ingo Wiarda · 66760a6
convert table Standardrassen: Modifikatoren to race + raceAttribute definitions
02.05.2026 · Ingo Wiarda · ae9e564
create asciiDocTableFormatter to format main.adoc
02.05.2026 · Ingo Wiarda · 6689b2b
add creation points, switch x/y axis for racial modifier table
02.05.2026 · Ingo Wiarda · 044c273
add script to create html documentation for game system
02.05.2026 · Ingo Wiarda · 8339a31
add World and WorldMapper classes
02.05.2026 · Ingo Wiarda · 86c4021
refactoring GameSystemCreator + GS deletion
18.04.2026 · Ingo Wiarda · 2b1a9ba
Start again, based on what features are actually described in the sample game system.
It does not make sense to have lots of random demo content - I want the system to be usable at each point of its development (meaning: if attributes and race are defined, the next step is to create a character editor that allows to create a character with just attribtues and race, and not with skills, features, etc that have no thought behind them)
create attributes based on game design adoc
18.04.2026 · Ingo Wiarda · dfe3478
add races to standard system description
18.04.2026 · Ingo Wiarda · fbf48a9
add race class
06.04.2026 · Ingo Wiarda · 0191de7
System-Beschreibung: Standard System
06.04.2026 · Ingo Wiarda · 0848aa4
System-Beschreibung
06.04.2026 · Ingo Wiarda · 1821327
add description field for GameElement and inheriting classes/tables
05.04.2026 · Ingo Wiarda · 4900459
neu: Design-Überlegungen
05.04.2026 · Ingo Wiarda · a928bbb
fix table name in mapper
01.03.2026 · Ingo Wiarda · 19c9292
add missed CreatureFeatureMapper
01.03.2026 · Ingo Wiarda · bcadb55
fix db mapping in game system create/destroy feature
01.03.2026 · Ingo Wiarda · b9e6fbb
refactor Feature, FeatureGroup and CreatureFeature
01.03.2026 · Ingo Wiarda · 52e9029
add CustomText + mapper
01.03.2026 · Ingo Wiarda · 73c18c6
change status value + maxValue field to long
cleanup
17.02.2026 · Ingo Wiarda · 5157077
refactoring: GameMappers added
17.02.2026 · Ingo Wiarda · 82e3628
goal: GameSystemCreator/Destroyer/~Tests should not need refactoring of their constructor for each added mapper.
AI: add StatusDefinition- + StatusMapper
17.02.2026 · Ingo Wiarda · 4ac9162
Human: refactor StatusDefinition
set default game system for GameSystemDestroyer
17.02.2026 · Ingo Wiarda · c2cf921
AI: create GameSystemController
17.02.2026 · Ingo Wiarda · a1cc3eb
1. prompt:
Add GameSystemController with CRUD operations that uses JTE templates like UserController.
• needs admin permission
• when deleting a GameSystem, ask for confirmation via htmx
• when deleting a GameSystem, delete all its dependencies.
2. prompt:
add a Selenium based UI test for the GameSystemController (see the other UI tests) that exercises the CRUD operations.
3. prompt:
Trying to help you: the test fails since the contains(systemName+" ") will be true if even the edit succeeded. Solution: check that the pageSource contains systemName+"<" since after the name the enclosing end-tag should start.
4. prompt:
when canceling the "delete game system" confirmation query, a blank page is loaded (the URL is /game-system/list).
5. prompt:
testUserCrudAsAdmin fails if the name testuser already exists.
AI: fix issue with running GameSystemCreator also triggering the GameSystemDestroyer
17.02.2026 · Ingo Wiarda · de6709b
Human: add AttributeDefinitions for default game system.
add minified version of JTE to .gitignore
16.02.2026 · Ingo Wiarda · 8784e31
Currently not needed, but I want to keep it for now without it cluttering up the VCS view
AI: add GameSystemDestroyer
16.02.2026 · Ingo Wiarda · 6c486e3
prompt: analog to GameSystemCreator, create GameSystemDestroyer - a tool to remove a game system and all its dependencies completely (the system is needed for development and testing, and it would be good to have the option to nuke and recreate it as needed)
AI: make GameSystemCreator transactional
16.02.2026 · Ingo Wiarda · fcc7140
prompt: Do I need to commit() the db changes made by GameSystemCreator somehow or is this done automatically when the app shuts down?
AI: create a runner to insert a game system into the database for development.
16.02.2026 · Ingo Wiarda · 6eaf192
prompt: Create a utility class that can be run manually to create a game system and insert it into the DB via the MyBatis mappers.
separate creation of database tables and test data + make tests independent of actual user.id
15.02.2026 · Ingo Wiarda · 2522f08
AI Add Creature and dependent classes.
14.02.2026 · Ingo Wiarda · a454f36
(non-AI: fix UserTest to handle unique constraint problems)
1. prompt:
Add tables for the model classes in the de.dewarim.roleplay.model.game.prototype package
Add MyBatis mappers for those classes in the mapper package.
2. prompt:
In the same way, add tables and mappers for the Creature class in de.dewarim.roleplay.model.game and its dependencies (Attribute, Skill, Feature, Flag)
initial import of Creature model and dependent classes
14.02.2026 · Ingo Wiarda · 7659f93
cleanup
14.02.2026 · Ingo Wiarda · 8ca57fc
AI: during UI testing, add screenshots of user journey
14.02.2026 · Ingo Wiarda · daeb5ad
1. prompt: For each UI test, I want to document the user journey with screenshots from the browser where the application is running.
Currently, screenshots are created on error and stored in temporary /target/selenium-screenshots folder.
Additionally, I want to have a screenshot everytime the page changes in a UI test.
The new screenshots should be stored in a folder docs/user-journey/$testName.
2. prompt: On failure during UI test, the screenshot should be saved in target/selenium-screenshot
// the failure screenshots would be saved with the user journey.
cleanup
14.02.2026 · Ingo Wiarda · fb786c5
fix AI generated code
14.02.2026 · Ingo Wiarda · 0f0c7df
AI: add CRUD UserController
14.02.2026 · Ingo Wiarda · 771da96
prompt was:
Create CRUD UserController with:
•/user/create
•/user/list
•/user/edit/$id
•/user/show/$id
Check permissions:
•user with USER_CREATE role should be allowed to create a user account.
•user with role ADMIN may edit all users
•normal user may call /user/edit and /user/show for his own user.
The UserController must use JTE as template language (like the other controllers).
AI: add rudimentary UI AdminTest
14.02.2026 · Ingo Wiarda · be9a8a2
add initial AdminController with start page
14.02.2026 · Ingo Wiarda · 06a47fb
AI: added RoomTest
14.02.2026 · Ingo Wiarda · d85bfc2
add simple room creation
08.02.2026 · Ingo Wiarda · 15dbe85
add login test with Selenium
08.02.2026 · Ingo Wiarda · 43b05b4
add simple tests for start page and login
07.02.2026 · Ingo Wiarda · ca3a0e7
add initial room mapper
07.02.2026 · Ingo Wiarda · 900ffaf
add cucumber test framework
07.02.2026 · Ingo Wiarda · df33280
add login link to start page
07.02.2026 · Ingo Wiarda · 2ac9e8c
configure /static in SecurityConfig, add initial RoomController/view
31.01.2026 · Ingo Wiarda · 95d4e54
use database for login
17.01.2026 · Ingo Wiarda · d684550
do not insert default user at the moment
15.01.2026 · Ingo Wiarda · 062ba74
add log4j2
15.01.2026 · Ingo Wiarda · af19e2d
add initial public and private controller and configure database connection
15.01.2026 · Ingo Wiarda · 5b2c005
initial import
15.01.2026 · Ingo Wiarda · fcba007
(fails due to MyBatis mapper / db config missing)