Add marriage management features: Implement endpoints for spending time with, gifting to, and reconciling with spouses in the FalukantController. Update UserHouse model to include household tension attributes. Enhance frontend components to manage marriage actions and display household tension details, including localization updates in multiple languages.

This commit is contained in:
Torsten Schulz (local)
2026-03-23 09:34:56 +01:00
parent 2055c11fd9
commit f7e0d97174
23 changed files with 1997 additions and 52 deletions

View File

@@ -0,0 +1,569 @@
# Falukant: Steuerung von Ehezustand und Hausfrieden
Dieses Dokument beschreibt:
- wie Spieler `Ehezustand` und `Hausfrieden` direkt beeinflussen können
- welche Werte dafür im Backend sichtbar und änderbar sein müssen
- was der externe Daemon täglich und monatlich berechnen soll
Die Datei ist bewusst als gemeinsame Arbeitsgrundlage für UI, Backend und externen Daemon formuliert.
## 1. Zielbild
Es soll zwei getrennte, aber gekoppelte Systeme geben:
- `marriageSatisfaction`
- numerisch `0..100`
- individueller Kernwert der Ehe
- `householdTension`
- aggregierter Haushaltszustand
- nach außen in UI als `low | medium | high`
- intern sinnvollerweise als numerischer Spannungswert `0..100`
Interpretation:
- `marriageSatisfaction` beschreibt die Qualität der Paarbeziehung
- `householdTension` beschreibt Spannungen im gesamten Haus
- Liebschaften
- Unterversorgung
- Ordnung
- Kinderkonflikte
- Dienerschaft
## 2. Werte und Ableitungen
## 2.1 Ehe
Bestehend:
- `relationship_state.marriage_satisfaction`
Neu sinnvoll:
- `relationship_state.marriage_public_stability`
- besteht bereits
- soll aktiv genutzt werden
- optional später:
- `last_affection_action_at`
- `last_conflict_action_at`
- `last_shared_time_at`
UI-Ableitung:
- `0..19` => `broken`
- `20..39` => `fragile`
- `40..59` => `strained`
- `60..79` => `stable`
- `80..100` => `harmonious`
## 2.2 Hausfrieden
Der bisherige reine UI-Helfer
- `low`
- `medium`
- `high`
reicht für eine echte Steuerung nicht aus.
Neu sinnvoll:
- interner Wert `householdTensionScore`
- Bereich `0..100`
- `0` = sehr ruhig
- `100` = offener Hauskonflikt
UI-Ableitung:
- `0..24` => `low`
- `25..59` => `medium`
- `60..100` => `high`
Falls kein eigener Persistenzwert angelegt werden soll, darf der Daemon den Score auch nur berechnen und als API-Feld zurückgeben.
## 3. Direkte Spieleraktionen
Es braucht direkte Spielzüge, die der Spieler bewusst auslösen kann.
Wichtig:
- nicht jede Aktion muss sofort große Werte ändern
- direkte Aktionen sollen kleine, klare Effekte haben
- der Daemon übernimmt Drift, Gegenkräfte und Folgewirkungen
## 3.1 Ehe-Aktionen
Diese Aktionen gehören fachlich in `FamilyView`.
### A. Zeit mit Ehepartner verbringen
Zweck:
- Standardaktion zur Pflege der Beziehung
Regel:
- verfügbar nur bei aktiver Ehe
- Cooldown: `1x pro Tag`
- Kosten: `0` oder sehr klein
Soforteffekt:
- `marriageSatisfaction +2`
- `householdTensionScore -1`
Modifikatoren:
- wenn aktive sichtbare Liebschaft `visibility >= 45`: nur `+1`
- wenn `householdOrder <= 35`: kein Bonus auf Hausfrieden
- wenn `marriageSatisfaction < 25`: stattdessen nur `+1`
### B. Geschenk an Ehepartner
Zweck:
- Geld gegen schnellere Stabilisierung
Regel:
- verfügbar nur bei aktiver Ehe
- Stufen: `small`, `decent`, `lavish`
- Cooldown: `1x pro 3 Tage`
Soforteffekt:
- `small`: `marriageSatisfaction +2`
- `decent`: `marriageSatisfaction +4`
- `lavish`: `marriageSatisfaction +7`
Nebeneffekt:
- `marriagePublicStability +1/+2/+3`
Malus:
- bei gleichzeitig unterfinanzierter Liebschaft halbierter Effekt
### C. Streit schlichten
Zweck:
- gezielte Krisenintervention
Regel:
- verfügbar nur wenn `householdTensionScore >= 35` oder `marriageSatisfaction <= 50`
- Cooldown: `1x pro 2 Tage`
Soforteffekt:
- `householdTensionScore -4`
- `marriageSatisfaction +1`
Malus:
- wenn `visibility` einer aktiven Liebschaft `>= 60`, dann nur `householdTensionScore -2`
### D. Fest nur für den Haushalt
Zweck:
- Hausfrieden über Geld und Repräsentation stützen
Regel:
- verfügbar bei vorhandenem Haus
- kleiner interner Hausakt, nicht großes Reputationsfest
- Cooldown: `1x pro Monat`
Soforteffekt:
- `householdTensionScore -6`
- `marriageSatisfaction +2`
- `householdOrder +2`
Malus:
- bei unterbesetzter Dienerschaft nur halbe Wirkung
## 3.2 Haus-Aktionen
Diese Aktionen gehören fachlich in `HouseView`.
### A. Haus ordnen
Zweck:
- kleine direkte Ordnungsmaßnahme
Regel:
- Cooldown: `1x pro Tag`
- Kosten: niedrig
Soforteffekt:
- `householdOrder +3`
- wenn `householdOrder > 70`: stattdessen nur `+1`
Indirekter Effekt:
- besserer Daily-Wert für `householdTensionScore`
### B. Diener einstellen
Bereits vorhanden.
Neue fachliche Wirkung:
- wenn vorher `servantCount < expectedMin`
- sofort `householdTensionScore -2`
### C. Diener entlassen
Bereits vorhanden.
Neue fachliche Wirkung:
- wenn danach `servantCount < expectedMin`
- sofort `householdTensionScore +3`
### D. Bezahlung erhöhen
Bereits vorhanden.
Neue fachliche Wirkung:
- wenn von `low -> normal` oder `normal -> high`
- sofort `householdOrder +2`
- `householdTensionScore -1`
## 3.3 Familien-/Kinder-Aktionen
### A. Uneheliches Kind anerkennen
Zweck:
- offenere, geordnetere Lösung statt versteckter Konfliktlage
Soforteffekt:
- `publicKnown = true`
- `legitimacy = acknowledged_bastard`
- `householdTensionScore -2`, wenn Beziehung bereits öffentlich geordnet
- `householdTensionScore +3`, wenn Ehe schwach und Beziehung skandalös
Eheeffekt:
- `marriageSatisfaction -2` bis `-6` je nach Sichtbarkeit und Stand
### B. Erbenfrage regeln
Wenn uneheliche Kinder sichtbar werden, kann die UI später eine Handlung
`Erbfolge klären` bekommen.
Erste Version:
- nur vorgemerkt
- noch keine direkte Aktion nötig
## 3.4 Liebschafts-Aktionen mit Einfluss auf Ehe und Haus
Bestehend:
- Unterhalt ändern
- Beziehung anerkennen
- Beziehung beenden
Diese Aktionen sollen explizit folgende Sofortwirkung haben:
### Unterhalt erhöhen
- `monthsUnderfunded` baut sich später im Daemon ab
- sofort kein großer Ehebonus
- aber `householdTensionScore -1`, wenn vorher Unterversorgung bestand
### Beziehung anerkennen
- `visibility` steigt nicht automatisch hart, aber öffentlicher Charakter nimmt zu
- bei hohen Ständen geordnet eher neutral bis leicht positiv für Ehe-Stabilität
- bei niedrigen Ständen eher negativ
Sofortregel:
- Standesgruppe `0-1`: `marriageSatisfaction -3`, `householdTensionScore +2`
- Standesgruppe `2`: `marriageSatisfaction -1`, `householdTensionScore +1`
- Standesgruppe `3`: `marriagePublicStability +1`, `householdTensionScore -1`, wenn Diskretion und Versorgung gut sind
### Beziehung beenden
- sofort `householdTensionScore -3`, wenn Liebschaft riskant war
- sofort `marriageSatisfaction +1`, wenn aktive Ehe existiert
- aber bei hoher `affection >= 70` auch möglicher Malus auf Stimmungssystem später
## 4. Daemon-Berechnung
## 4.1 Daily-Input
Der externe Daemon braucht pro Spielerfigur:
- aktive Ehebeziehung mit `marriageSatisfaction`, `marriagePublicStability`
- aktive Liebschaften mit:
- `loverRole`
- `visibility`
- `discretion`
- `maintenanceLevel`
- `statusFit`
- `monthsUnderfunded`
- `acknowledged`
- Kinderdaten:
- `legitimacy`
- `birthContext`
- `publicKnown`
- Hausdaten:
- `servantCount`
- `servantQuality`
- `servantPayLevel`
- `householdOrder`
- Charakterdaten:
- `titleOfNobility`
- `reputation`
## 4.2 Daily-Berechnung für Ehe
Grunddrift:
```text
marriageDelta = 0
if marriageSatisfaction > 55: marriageDelta -= 1 every 3 days
if marriageSatisfaction < 55: marriageDelta += 1 every 5 days
```
Liebschaften:
```text
for each active lover:
if visibility >= 60: marriageDelta -= 2
else if visibility >= 35: marriageDelta -= 1
if monthsUnderfunded >= 2: marriageDelta -= 1
if acknowledged = true and statusGroup <= 1: marriageDelta -= 1
if acknowledged = true and statusGroup = 3 and visibility <= 35 and maintenanceLevel >= 60:
marriageDelta += 0 or +1 every few days
```
Zu jung:
```text
if minAge <= 15: marriageDelta -= 1
if minAge <= 13: marriageDelta -= 2
```
Haus:
```text
if householdOrder >= 75: marriageDelta += 1
if householdOrder <= 35: marriageDelta -= 1
if householdTensionScore >= 60: marriageDelta -= 1
```
Dienerschaft:
```text
if servantCount < expectedMin: marriageDelta -= 1
if servantPayLevel = high and servantQuality >= 70 and householdOrder >= 70:
marriageDelta += 1 every 3 days
```
Danach:
- clamp `0..100`
## 4.3 Daily-Berechnung für Hausfrieden
Interner Wert:
```text
householdTensionScore = base
```
Empfohlene Berechnung:
```text
base = 10
for each active lover:
if visibility >= 60: base += 18
else if visibility >= 35: base += 10
else: base += 4
if monthsUnderfunded >= 1: base += 6
if monthsUnderfunded >= 2: base += 6
if acknowledged = true: base += 4
if statusFit = -1: base += 3
if statusFit = -2: base += 6
```
Kinder:
```text
for each child where birthContext = 'lover':
if publicKnown = true: base += 6
else: base += 2
if legitimacy = 'acknowledged_bastard': base += 2
if legitimacy = 'hidden_bastard': base += 4
```
Haus:
```text
if householdOrder >= 80: base -= 6
else if householdOrder >= 65: base -= 3
if householdOrder <= 35: base += 8
else if householdOrder <= 50: base += 4
```
Dienerschaft:
```text
if servantCount < expectedMin: base += 5
if servantPayLevel = low: base += 2
if servantQuality >= 70 and servantPayLevel = high: base -= 3
```
Ehe:
```text
if marriageSatisfaction <= 35: base += 6
if marriageSatisfaction >= 75: base -= 2
```
Danach:
- clamp `0..100`
- UI-Ableitung auf `low/medium/high`
## 4.4 Monthly-Berechnung
Monatlich soll der Daemon zusätzlich:
- Dienerkosten abbuchen
- Liebschaftskosten abbuchen
- bei Unterversorgung `householdTensionScore` stärker erhöhen
- langfristige Ordnungs- oder Eheboni addieren
Empfohlene Zusatzregeln:
```text
if a lover was underfunded this month:
householdTensionScore += 4
if servantCount far below expectedMin for full month:
householdTensionScore += 3
if householdOrder >= 80 for full month:
marriageSatisfaction += 1
if householdOrder <= 30 for full month:
marriageSatisfaction -= 2
```
## 5. UI-Anforderungen
## 5.1 FamilyView
Neu sinnvolle Aktionen:
- `Zeit miteinander verbringen`
- `Geschenk machen`
- `Streit schlichten`
- `Liebschaft beenden`
- `Uneheliches Kind anerkennen`
Zusätzlich hilfreiche Anzeige:
- kurze Ursachenliste für `Hausfrieden`
- z. B. `sichtbare Liebschaft`
- `Unruhe im Haus`
- `zu wenig Diener`
- `anerkanntes uneheliches Kind`
## 5.2 HouseView
Neu sinnvolle Aktionen:
- `Haus ordnen`
- vorhandene Dieneraktionen mit klarer Auswirkungstextzeile
Anzeige:
- `Haushaltsordnung`
- `erwartete Dienerzahl`
- `Auswirkung auf Hausfrieden`
## 6. Backend-Anforderungen
## 6.1 Direktaktionen
Dieses Projekt sollte Endpunkte für direkte Einflussaktionen bereitstellen:
- `POST /api/falukant/family/marriage/spend-time`
- `POST /api/falukant/family/marriage/gift`
- `POST /api/falukant/family/marriage/reconcile`
- `POST /api/falukant/houses/order`
- später optional:
- `POST /api/falukant/family/children/acknowledge`
## 6.2 API-Rückgabe
Family-API sollte zusätzlich liefern:
- `marriageSatisfaction`
- `marriageState`
- `marriagePublicStability`
- `householdTension`
- `householdTensionScore`
- optional:
- `householdTensionReasons[]`
House-API sollte zusätzlich liefern:
- `householdOrder`
- `expectedServantsMin`
- `expectedServantsMax`
- `marriageComfortModifier`
## 7. Priorisierte Umsetzung
## Phase A
- `statusFit`-Fehler korrigieren
- direkte Ehe-Aktionen `Zeit`, `Geschenk`, `Streit schlichten`
- direkte Haus-Aktion `Haus ordnen`
- Family-API um `householdTensionScore` erweitern
## Phase B
- externer Daemon berechnet Daily-Drift für Ehe und Hausfrieden
- Dienerschaft fließt in Hausfrieden ein
- Liebschaften und Unterversorgung wirken vollständig auf Hausfrieden
## Phase C
- uneheliche Kinder als aktiver Konfliktfaktor
- Anerkennungsaktion
- genauere Ursachenlisten in der UI
## 8. Offene Balancing-Punkte
Diese Werte sind absichtlich noch nicht final:
- exakte Geldkosten für Ehe-Aktionen
- Stärke der Boni für hohe Stände
- Stärke des Malus bei sichtbaren Liebschaften
- Stärke der Dienerwirkung auf Ehe und Haus
Die Struktur sollte jetzt aber stabil genug sein, damit UI und Daemon unabhängig voneinander anfangen können.