193 lines
5.4 KiB
Markdown
193 lines
5.4 KiB
Markdown
# 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 |
|
||
|