Implement lover relationship management features: Add endpoints for creating, acknowledging, and managing lover relationships in the FalukantController. Enhance backend models with RelationshipState for tracking relationship statuses. Update frontend components to display and manage lover details, including marriage satisfaction and household tension. Improve localization for new features in multiple languages.

This commit is contained in:
Torsten Schulz (local)
2026-03-20 11:37:46 +01:00
parent c7d33525ff
commit 2977b152a2
29 changed files with 4551 additions and 86 deletions

View File

@@ -0,0 +1,180 @@
# Falukant: Daemon-Handoff für `investigate_affair`
## Zweck
Dieses Dokument beschreibt die Auswertung der Untergrundaktivität `investigate_affair` im externen Daemon.
Es ergänzt:
- [FALUKANT_UNDERGROUND_AFFAIR_PLAN.md](/mnt/share/torsten/Programs/YourPart3/docs/FALUKANT_UNDERGROUND_AFFAIR_PLAN.md)
- [FALUKANT_LOVERS_DAEMON_SPEC.md](/mnt/share/torsten/Programs/YourPart3/docs/FALUKANT_LOVERS_DAEMON_SPEC.md)
- [FALUKANT_LOVERS_DAEMON_HANDOFF.md](/mnt/share/torsten/Programs/YourPart3/docs/FALUKANT_LOVERS_DAEMON_HANDOFF.md)
## Betroffene Daten
Der externe Daemon liest:
- `falukant_data.underground`
- `falukant_type.underground`
- `falukant_data.relationship`
- `falukant_data.relationship_state`
- `falukant_data.character`
- optional `falukant_data.child_relation`
Relevant ist jeweils:
- Untergrundaktivität vom Typ `investigate_affair`
- `performer_id`
- `victim_id`
- `parameters.goal`
- `expose`
- `blackmail`
- `result`
## Erwarteter Input
Eine Aktivität ist für den Daemon verarbeitbar, wenn:
- `underground_type.tr = investigate_affair`
- `result.status = pending`
Der Daemon soll dann beim Opfer prüfen:
- aktive Liebschaften
- Sichtbarkeit und Diskretion dieser Liebschaften
- evtl. bekannte uneheliche Kinder
- Stand und Ansehen des Opfers
## Ergebnis-Schema in `underground.result`
Der Daemon schreibt nach der Auswertung ein JSON mit folgender Struktur:
```json
{
"status": "resolved",
"outcome": "success",
"discoveries": {
"relationshipId": 123,
"loverRole": "secret_affair",
"visibility": 42,
"acknowledged": false,
"publicKnownChild": false
},
"visibilityDelta": 12,
"reputationDelta": -3,
"blackmailAmount": 1500,
"notes": "Affair was uncovered and partially exposed."
}
```
Erlaubte Werte:
- `status`
- `pending`
- `resolved`
- `failed`
- `outcome`
- `success`
- `partial`
- `failure`
## Auswertung: `goal = expose`
Ziel:
- Liebschaft öffentlich machen
- Sichtbarkeit stark erhöhen
- ggf. Skandal auslösen
Empfohlene Wirkung:
- `relationship_state.visibility +10..25`
- optional `relationship_state.discretion -5..15`
- sofortiger Reputationsschaden beim Opfer
- bei sehr sichtbarer oder junger Beziehung zusätzliche Skandalchance
Zusätzliche Empfehlung:
- wenn die Beziehung bereits fast öffentlich war, darf `outcome = partial` gesetzt werden statt voller Erfolg
## Auswertung: `goal = blackmail`
Ziel:
- belastendes Wissen gewinnen
- keinen sofortigen vollen öffentlichen Effekt erzeugen
- ein Erpressungspotenzial vorbereiten
Empfohlene Wirkung:
- `relationship_state.visibility +3..10`
- `blackmailAmount` setzen
- kleiner oder kein sofortiger Reputationsschaden
- optional separates Log oder spätere Forderung
Wenn ihr noch kein echtes Erpressungssystem habt:
- `blackmailAmount` trotzdem setzen
- `notes` befüllen
- UI zeigt den Vorgang als abgeschlossen mit Erpressungssumme
## Mindestregeln für Erfolg
Erfolgswahrscheinlichkeit sollte steigen bei:
- hoher vorhandener Sichtbarkeit
- niedriger Diskretion
- mehreren aktiven Liebschaften
- bereits bekannten unehelichen Kindern
Erfolgswahrscheinlichkeit sollte sinken bei:
- hoher Diskretion
- niedriger Sichtbarkeit
- standesgemäß geführter Mätresse/Favorit auf hohem Rang
## Folgewirkungen auf Lovers-System
Bei Erfolg darf der Daemon auslösen:
- `falukant_family_scandal_hint`
- `falukantUpdateFamily` mit `reason = scandal`
- zusätzlich normale Status-Updates
Wenn `goal = expose`, sollte mindestens eine dieser Wirkungen eintreten:
- Sichtbarkeit steigt
- Ruf sinkt
- Skandalwahrscheinlichkeit steigt
Wenn `goal = blackmail`, sollte mindestens eine dieser Wirkungen eintreten:
- `blackmailAmount > 0`
- kleiner Sichtbarkeitsanstieg
- interner Merker für spätere Forderung
## UI-Erwartung
Das Frontend dieses Projekts erwartet derzeit:
- `type`
- `goal`
- `status`
- `additionalInfo.blackmailAmount`
Optional nutzbar später:
- `discoveries`
- `visibilityDelta`
- `reputationDelta`
- `notes`
## Definition of Done
Die externe Umsetzung gilt als ausreichend, wenn:
1. `investigate_affair`-Einträge mit `status = pending` verarbeitet werden
2. `result.status` danach nicht mehr `pending` ist
3. `goal = expose` und `goal = blackmail` verschieden behandelt werden
4. mindestens Sichtbarkeit oder Reputationswirkung zurückgeschrieben wird
5. `blackmailAmount` bei Erpressung gesetzt werden kann