Files
yourpart3/docs/FALUKANT_UI_WEBSOCKET.md

193 lines
5.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Falukant: UI-Anpassung WebSocket & Familie / Liebschaften
Dieses Dokument beschreibt die Nachrichten, die der externe Falukant-Daemon für Familien-, Ehe- und Liebschaftsänderungen sendet, damit die UI gezielt reagieren kann.
Transport:
- Alle Clients erhalten denselben Broadcast.
- Die UI muss nach `user_id` filtern und nur Events für die eingeloggte Session verarbeiten.
## 1. Übersicht der Events
| `event` | Pflichtfelder | Typische UI-Reaktion |
|---------|----------------|----------------------|
| `falukantUpdateFamily` | `user_id`, `reason` | Gezielter Refresh von Familie, Liebschaften und je nach `reason` auch Geld oder Ruf |
| `falukantUpdateStatus` | `user_id` | Allgemeiner Falukant-Status-/Spielstands-Refresh |
| `children_update` | `user_id` | Kinderliste und Familienansicht aktualisieren |
| `falukant_family_scandal_hint` | `relationship_id` | Optionaler Hinweis oder Logeintrag; kein `user_id` |
## 2. JSON-Payloads
### 2.1 `falukantUpdateFamily`
```json
{
"event": "falukantUpdateFamily",
"user_id": 123,
"reason": "daily"
}
```
`reason` ist immer genau einer dieser festen Strings:
- `daily`
- `monthly`
- `scandal`
- `lover_birth`
Es gibt keine weiteren `reason`-Werte.
### 2.2 `falukantUpdateStatus`
```json
{
"event": "falukantUpdateStatus",
"user_id": 123
}
```
Dieses Event wird typischerweise direkt nach `falukantUpdateFamily` mit derselben `user_id` gesendet.
### 2.3 `children_update`
```json
{
"event": "children_update",
"user_id": 123
}
```
Dieses Event tritt bei Geburt aus einer Liebschaft auf, meist zusammen mit:
- `falukantUpdateFamily` mit `reason: "lover_birth"`
- `falukantUpdateStatus`
### 2.4 `falukant_family_scandal_hint`
```json
{
"event": "falukant_family_scandal_hint",
"relationship_id": 456
}
```
Hinweis:
- Dieses Event enthält kein `user_id`.
- Die UI kann es ignorieren oder optional nur für Log-/Toast-Zwecke verwenden.
- Die eigentliche nutzerbezogene Aktualisierung läuft über `falukantUpdateFamily` mit `reason: "scandal"`.
## 3. Fachliche Bedeutung von `reason`
### `reason: "daily"`
`daily` ist der Sammelgrund für tägliche Änderungen im Familien- und Liebschaftssystem.
Darunter fallen insbesondere:
- tägliche Drift und Änderung der Ehezufriedenheit
- Ehe-Buffs und temporäre Zähler wie Geschenk-, Fest- oder Haus-Effekte
- tägliche Liebschaftslogik für aktive Beziehungen
- Rufverlust bei zwei oder mehr sichtbaren Liebschaften
- Zufalls-Mali wie Gerücht oder Tadel
Wichtig:
- Es gibt kein separates Event für „nur Ehe-Buff“.
- Es gibt kein separates Event für „nur zwei sichtbare Liebschaften“.
- Es gibt kein separates Event für „nur Gerücht/Tadel“.
- Alles davon erscheint in der UI ausschließlich als `falukantUpdateFamily` mit `reason: "daily"`.
### `reason: "scandal"`
`scandal` wird zusätzlich zu einem gelungenen Skandalwurf gesendet.
Typischer Ablauf:
- optional `falukant_family_scandal_hint`
- `falukantUpdateFamily` mit `reason: "scandal"`
- `falukantUpdateStatus`
Danach kann für denselben Nutzer am selben Tag zusätzlich noch `daily` folgen.
### `reason: "monthly"`
`monthly` steht für Monatsverarbeitung, insbesondere:
- laufende Kosten
- Unterversorgung
- Geldänderungen
### `reason: "lover_birth"`
`lover_birth` signalisiert ein neues Kind aus einer Liebschaft.
Meist folgen zusammen:
- `falukantUpdateFamily` mit `reason: "lover_birth"`
- `children_update`
- `falukantUpdateStatus`
## 4. Empfohlene Handler-Logik
```text
onMessage(json):
if json.user_id exists and json.user_id != currentUserId:
return
switch json.event:
case "falukantUpdateStatus":
refreshPlayerStatus()
return
case "children_update":
refreshChildrenAndFamilyView()
return
case "falukantUpdateFamily":
switch json.reason:
case "daily":
refreshFamilyAndRelationships()
refreshReputationIfNeeded()
break
case "monthly":
refreshMoney()
refreshFamilyAndRelationships()
break
case "scandal":
showScandalToastOptional()
refreshFamilyAndRelationships()
refreshReputationIfNeeded()
break
case "lover_birth":
refreshChildrenAndFamilyView()
break
return
case "falukant_family_scandal_hint":
// optional: nur als Hinweis verarbeiten
return
```
## 5. Deduplizierung
Am selben Tag kann ein Nutzer mehrere relevante Events erhalten, zum Beispiel:
- `scandal`
- danach `daily`
- danach `falukantUpdateStatus`
Die UI sollte deshalb:
- Refreshes bündeln oder entprellen
- idempotente Reloads verwenden
- nicht davon ausgehen, dass jeder fachliche Effekt einen eigenen `reason` hat
## 6. Welche Daten sollten neu geladen werden?
| Situation | Sinnvolle Reaktion |
|-----------|--------------------|
| Jede `falukantUpdateFamily` | Family-/Relationship-Daten neu laden |
| `reason: "monthly"` | Family-Daten plus Geld/Status neu laden |
| `reason: "daily"` | Family-Daten neu laden, bei Bedarf auch Ruf-/Statusdaten |
| `reason: "scandal"` | Family-Daten plus Ruf-/Statusdaten neu laden |
| `children_update` / `lover_birth` | Kinderdaten und FamilyView neu laden |
## 7. Sonderfälle
| Fall | Verhalten |
|------|-----------|
| NPC ohne `user_id` | Keine nutzerbezogenen Family-Socket-Events |
| Mehrere Events kurz hintereinander | Normal; UI sollte damit robust umgehen |
| Nur `falukantUpdateStatus` ohne Family-Event | Kann von anderen Falukant-Workern kommen |