75 lines
3.7 KiB
Markdown
75 lines
3.7 KiB
Markdown
# Individuelle Charakterentwicklung
|
|
|
|
`character.puberty_start_age` und `character.fertile_from_age` sind dauerhaft
|
|
gespeicherte ganze Spieljahre. Ein realer Kalendertag entspricht einem Spieljahr.
|
|
Die Sequelize-Attribute heißen `pubertyStartAge` und `fertileFromAge`.
|
|
|
|
## Vergabe
|
|
|
|
Die Migration `20261104000000-add-character-development-ages.cjs` ergänzt beide
|
|
Werte für bestehende Charaktere. Ein Datenbanktrigger initialisiert sie auch für
|
|
neue Charaktere, einschließlich der direkten SQL-Inserts des Daemons für NPCs
|
|
und Neugeborene. Normale Updates, auch das Übergeben von NULL, würfeln bereits
|
|
gespeicherte Werte nicht neu aus. Explizite gültige Änderungen bleiben möglich.
|
|
|
|
Das vereinfachte Spielmodell verwendet folgende Verteilung:
|
|
|
|
- Weibliche Charaktere: Pubertätsbeginn zwischen 8 und 13 Spieljahren.
|
|
- Männliche und sonstige Charaktere: Pubertätsbeginn zwischen 9 und 14 Spieljahren.
|
|
- Zwei gemittelte Zufallsziehungen gewichten die Mitte stärker als die Ränder.
|
|
- Fruchtbarkeitsalter: Pubertätsbeginn plus zufällig zwei oder drei Spieljahre.
|
|
|
|
Die Abstände und Wahrscheinlichkeiten sind Modellentscheidungen. Sie stellen
|
|
keine medizinische Vorhersage und keine Schätzung mittelalterlicher
|
|
Bevölkerungsdaten dar. Der Beginn der Pubertät und das Erreichen der
|
|
Fortpflanzungsfähigkeit werden als getrennte Ereignisse modelliert. Als
|
|
Orientierung für die Bandbreite dienen die Informationen des
|
|
[NHS zum Pubertätsbeginn](https://www.nhs.uk/conditions/early-or-delayed-puberty/)
|
|
und der [Endocrine Society zur zeitlichen Entwicklung](https://www.endocrine.org/patient-engagement/endocrine-library/precocious-puberty).
|
|
|
|
## Spielregeln und API
|
|
|
|
Die Heiratsgrenze bleibt unabhängig davon bei 14 Spieljahren für beide
|
|
Verlobten. Automatische Schwangerschaften in bestehenden Ehen und Liebschaften
|
|
sowie der Backend-Sonderweg nach einer Hochzeit prüfen das individuelle
|
|
Fruchtbarkeitsalter beider Eltern. Die bisherigen Beziehungsarten,
|
|
Schwangerschaftschancen und Schwangerschaftsdauern gelten weiterhin.
|
|
|
|
Eine bereits geplante Geburt wird nicht nachträglich durch die neuen Werte
|
|
blockiert. Die Migration verändert weder Schwangerschaftstermine noch
|
|
Beziehungen. Admin-Funktionen zum expliziten Setzen von Schwangerschaften
|
|
bleiben manuelle Eingriffe.
|
|
|
|
Die Charakterdaten unter `/api/falukant/info` enthalten beide Alterswerte.
|
|
Die Familienantwort enthält für den eigenen Charakter, Partner und Kinder
|
|
zusätzlich `development` mit beiden Werten sowie `hasReachedPuberty` und
|
|
`hasReachedFertility`. Diese booleschen Werte werden beim Abruf aus dem Alter
|
|
abgeleitet. Es gibt keine Änderungen an Porträts oder 3D-Modellen.
|
|
|
|
## Bereitstellung
|
|
|
|
Zuerst die Backend-Migration ausführen, dann Backend und Daemon gemeinsam
|
|
aktualisieren bzw. neu starten. Beide Anwendungen benötigen die neuen Spalten.
|
|
Die Daemon-Anpassungen liegen im benachbarten Repository `ypdaemon`, in
|
|
`src/worker/sql.rs`. Ein Rollback muss auch die vorherigen Anwendungsversionen
|
|
wiederherstellen, bevor die neuen Spalten entfernt werden.
|
|
|
|
## Prüfung
|
|
|
|
```sh
|
|
cd backend
|
|
node --test tools/characterDevelopment.test.mjs
|
|
```
|
|
|
|
Die Datenbanktests sind ohne `TEST_DATABASE_URL` übersprungen. Mit einer
|
|
explizit angegebenen, isolierten PostgreSQL-Datenbank namens
|
|
`yourpart_development_test` prüfen sie Migration, Backfill, direkte Inserts,
|
|
stabile Werte und Rollback. Diese Tests ersetzen die Schemas `falukant_data`
|
|
und `falukant_type` ausschließlich in dieser Testdatenbank.
|
|
|
|
Wird zusätzlich `DAEMON_SQL_PATH` auf `ypdaemon/src/worker/sql.rs` gesetzt,
|
|
führen sie die tatsächlichen Daemon-Abfragen aus: beide Eltern genau an und
|
|
unter ihrer Altersgrenze, Ehe- und Liebschaftswege sowie bestehende Geburten.
|
|
Für die Prüfung der Voraussetzungen wird der Zufallswurf im Test auf null
|
|
gesetzt.
|