8.3 KiB
Falukant: UI-Anpassung – WebSocket & Familie / Liebschaften
Dieses Dokument beschreibt die Nachrichten, die der YpDaemon (FalukantFamilyWorker) über den WebSocket-Broadcast sendet, damit die UI gezielt reagieren kann (Refresh, Toasts, Family-Ansicht).
Transport: Alle Clients erhalten denselben Broadcast. Die UI sollte Nachrichten nach
user_idfiltern (nur Events anzeigen/verarbeiten, die zur eingeloggten Session passen).
1. Übersicht der Events
event |
Pflichtfelder | Typische UI-Reaktion |
|---|---|---|
falukantUpdateFamily |
user_id, reason |
Gezielter Refresh Familie/Liebe/Geld je nach reason |
falukantUpdateStatus |
user_id |
Allgemeiner Status-/Spielstand-Refresh (wie bisher) |
falukantUpdateProductionCertificate |
user_id, reason, old_certificate, new_certificate |
Produkte / Produktions-UI / Zertifikat neu laden (nach Recalc, ca. 1×/Min., oder Bankrott) |
children_update |
user_id |
Kinderliste / FamilyView aktualisieren |
falukant_family_scandal_hint |
relationship_id |
Optional: Toast, Log – kein user_id (siehe unten) |
falukantUpdateChurch |
user_id, reason |
Kirchenämter: Bewerbungen, Ernennungen (PoliticsWorker) |
Siehe auch: FALUKANT_CHURCH_DAEMON.md.
2. JSON-Payloads (exakt)
2.1 falukantUpdateFamily
{
"event": "falukantUpdateFamily",
"user_id": 123,
"reason": "daily"
}
reason ist immer einer der folgenden festen Strings:
reason |
Bedeutung (Daemon) | Empfehlung UI |
|---|---|---|
daily |
Daily-Tick: Liebschafts-/Ehe-/Ansehens-Logik; u. a. marriage_public_stability, household_tension_score |
Family-API + ggf. Charakter/Ansehen/Haus neu laden |
monthly |
Kalender-monthly (Liebschafts-Monatsmarkierung / selten) oder Dienerschaft zahlt Monatstick: Geld (servants_monthly) |
Geld + Family-State neu laden |
lover_installment |
Alle 2 h: 1/12 Liebschafts-Unterhalt bzw. Unterversorgung (money_history: lover maintenance) |
Geld + Family-State neu laden |
scandal |
Skandal-Ereignis (zusätzlich zu daily möglich) |
Kurzer Hinweis / Eintrag „Skandal“; Family + Ruf |
lover_birth |
Uneheliches Kind angelegt | Wie children_update, plus Eltern-Story |
2.1a falukantUpdateChurch
{
"event": "falukantUpdateChurch",
"user_id": 123,
"reason": "applications"
}
reason:
reason |
Bedeutung | UI |
|---|---|---|
applications |
Spieler ist kirchlicher Vorgesetzter: offene Bewerbungen warten | Bewerbungslisten / supervised applications |
npc_decision |
NPC-Vorgesetzter hat zugesagt (Bewerber ist oft Spielercharakter) | Ämter + Bewerbungen |
appointment |
Auto-Annahme alter NPC-Supervisor-Bewerbung (36 h) | Ämter + Status |
vacancy_fill |
Interimsbesetzung (selten; Bewerber kann Spieler sein) | Ämter + freie Positionen |
promotion |
(reserviert / zukünftig) | — |
Immer zusätzlich mit falukantUpdateStatus (gleiche user_id).
2.2 falukantUpdateStatus
{
"event": "falukantUpdateStatus",
"user_id": 123
}
Kommt typischerweise direkt nach falukantUpdateFamily mit derselben user_id (gemeinsamer Refresh).
2.3 falukantUpdateProductionCertificate
{
"event": "falukantUpdateProductionCertificate",
"user_id": 123,
"reason": "daily_recalculation",
"old_certificate": 2,
"new_certificate": 3
}
reason: in der ersten Version festdaily_recalculation(inkl. Bankrott-Herabstufung, falls so umgesetzt).- Danach sendet der Daemon
falukantUpdateStatusmit derselbenuser_id(wie bei anderen Falukant-Events).
2.4 children_update
{
"event": "children_update",
"user_id": 123
}
Tritt bei Geburt aus Liebschaft auf; oft zusammen mit falukantUpdateFamily (reason: lover_birth) und falukantUpdateStatus.
2.5 falukant_family_scandal_hint
{
"event": "falukant_family_scandal_hint",
"relationship_id": 456
}
- Kein
user_id– Betroffene erkennst du nur über die Beziehung (Backend:relationship.id→ Charaktere laden) oder du ignorierst das Event und verlässt dich auffalukantUpdateFamilymitreason: scandalfür deine Nutzer.
3. Empfohlene Handler-Logik (Pseudo)
onMessage(json):
if json.user_id != currentUserId: return // Broadcast filtern
switch json.event:
case "falukantUpdateStatus":
refreshPlayerStatus() // bestehend
return
case "falukantUpdateProductionCertificate":
refreshProductsAndProductionUi() // Zertifikat / erlaubte Produkte
return
case "children_update":
refreshChildrenAndFamilyView()
return
case "falukantUpdateFamily":
switch json.reason:
case "daily":
refreshFamilyAndRelationships()
refreshCharactersReputationIfNeeded()
break
case "monthly":
refreshMoney()
refreshFamilyAndRelationships()
break
case "lover_installment":
refreshMoney()
refreshFamilyAndRelationships()
break
case "scandal":
showScandalToastOptional()
refreshFamilyAndRelationships()
break
case "lover_birth":
refreshChildrenAndFamilyView()
break
return
case "falukant_family_scandal_hint":
// optional: relationship_id → Detail-Modal / Log
return
Hinweis: Am selben Tag kann ein Nutzer scandal und danach daily erhalten – UI kann deduplizieren (z. B. nur ein voller Refresh) oder beide verarbeiten (idempotente API-Calls).
4. Welche Backend-Daten neu laden?
| Situation | Sinnvolle Endpunkte / Daten (konzeptionell) |
|---|---|
Jede falukantUpdateFamily |
Family-/Relationship-API mit relationship_state, Ehe (married/engaged/wooing) |
reason: monthly |
Geld (Dienerschaft o. ä.), Family-State |
reason: lover_installment |
Geld + Liebschafts-State (Unterhalt/Unterversorgung) |
reason: daily / scandal |
Ansehen (character.reputation), Sichtbarkeit/Diskretion der Liebschaften |
children_update / lover_birth |
child_relation inkl. legitimacy, birth_context, public_known |
Konkrete Routen stehen im YourPart3-Backend; das Frontend sollte eine zentrale Funktion refreshFamilyContext(userId) kapseln.
5. Sonderfälle
| Fall | Verhalten |
|---|---|
Charakter ohne user_id (NPC) |
Keine Socket-Events für diesen Charakter – nur Spieler mit falukant_user erhalten user_id-Events. |
| Mehrere Events hintereinander | Normal; Requests sollten idempotent sein (mehrfaches Laden ok). |
Nur falukantUpdateStatus ohne Family |
Kann von anderen Workern kommen – nicht nur Familie. |
Transportüberfälle (raid_transport)
| Event | Payload (Auszug) |
|---|---|
falukantTransportRaid |
user_id (Opfer), reason: transport_raided |
falukantUndergroundUpdate |
user_id (Auftraggeber), reason: raid_repelled, raid_success, raid_partial_success, raid_loot_stored |
falukantUpdateStatus / falukantBranchUpdate |
beide Seiten nach Überfall |
Daemon: src/worker/falukant_transport_raid.rs, Doku: docs/FALUKANT_TRANSPORT_RAID_DAEMON.md.
6. Bezug zum Code (YpDaemon)
- Worker:
src/worker/falukant_family.rs - Kirche:
src/worker/politics.rs(falukantUpdateChurch) - SQL-Konstanten:
src/worker/sql.rs(Abschnitt Falukant Familie) - Schema:
migrations/001_falukant_family_lovers.sql,006_falukant_lover_installments.sql(Unterhalt 12×/Tag) - Daemon-Handoff (technisch):
docs/FALUKANT_DAEMON_HANDOFF.md
7. Checkliste UI-Integration
- WebSocket-Handler:
user_idmit Session abgleichen - Auf
falukantUpdateFamilyreagieren undreasonauswerten falukantUpdateStatusweiter nutzen (globaler Refresh)children_update+lover_birth: Kinder-Ansicht- Optional:
falukant_family_scandal_hintmitrelationship_id - Optional: Deduplizierung bei
scandal+dailyam selben Tag
Damit kannst du die Oberfläche gezielt an die Daemon-Events anbinden, ohne jedes Mal den vollen Spielstand blind zu aktualisieren.