Files
yourpart3/docs/FALUKANT_DEBTORS_PRISON_DAEMON_SPEC.md

9.5 KiB

Falukant: Schuldturm und Pfändung - Daemon-Spezifikation

Dieses Dokument beschreibt die Umsetzung des Schuldturm-Systems im externen Daemon.

Wichtig:

  • Die projektseitigen DB-Felder, API-Erweiterungen, UI-Warnungen und Aktionssperren sind bereits umgesetzt.
  • Der Daemon ist die führende Quelle für:
    • Verzugstage
    • Eintritt in den Schuldturm
    • Pfändung und Verwertung
    • soziale Folgen
    • Freilassung

1. Bereits vorhandene Datenbasis

Bereits im Projekt vorhanden:

  • falukant_data.credit
  • falukant_data.debtors_prism
  • falukant_data.user_house
    • inkl. household_tension_score
    • inkl. household_tension_reasons_json
  • Familien-/Liebschaftsdaten in:
    • falukant_data.relationship
    • falukant_data.relationship_state
    • falukant_data.child_relation

Bereits erweitert:

  • debtors_prism.status
  • debtors_prism.entered_at
  • debtors_prism.released_at
  • debtors_prism.debt_at_entry
  • debtors_prism.remaining_debt
  • debtors_prism.days_overdue
  • debtors_prism.reason
  • debtors_prism.creditworthiness_penalty
  • debtors_prism.next_forced_action
  • debtors_prism.assets_seized_json
  • debtors_prism.public_known

Es sind für den Daemon derzeit keine weiteren DB-Änderungen nötig.

2. Grundregel

Ein Charakter kommt in den Schuldturm, wenn:

  • mindestens ein aktiver Kredit offen ist
  • fällige Kreditbedienung ausbleibt
  • und days_overdue >= 3

Der Daemon prüft dies im Daily-Tick.

3. Zustände

debtors_prism.status verwendet mindestens:

  • delinquent
  • imprisoned
  • released

Bedeutung:

  • delinquent: Kreditverzug, aber noch nicht im Schuldturm
  • imprisoned: im Schuldturm, Verwertung läuft
  • released: historischer abgeschlossener Fall

4. Daily-Tick

Der Daily-Tick prüft pro Falukant-Nutzer:

  1. aktive Kredite
  2. verbleibende Schuld
  3. geleistete Bedienung seit letztem Tick
  4. neue Verzugstage
  5. Schuldturm-Eintritt
  6. laufende soziale Folgen
  7. Verwertungsschritt

4.1 Verzugstage

Regel:

  • wenn offene Schuld vorhanden und fällige Bedienung ausbleibt:
    • days_overdue += 1
  • wenn Kreditpflicht erfüllt wurde:
    • days_overdue = 0
    • falls nicht im Schuldturm

Wenn noch kein aktiver debtors_prism-Eintrag existiert:

  • bei erstem Verzug debtors_prism anlegen mit
    • status = 'delinquent'
    • days_overdue = 1
    • remaining_debt = aktuelle offene Schuld
    • next_forced_action = 'reminder'

4.2 Warnstufen

Bei Verzug:

  • Tag 1:
    • next_forced_action = 'reminder'
    • Event falukantUpdateDebt mit reason: 'delinquency'
  • Tag 2:
    • next_forced_action = 'final_warning'
    • Event falukantUpdateDebt mit reason: 'delinquency'
  • Tag 3:
    • Schuldturm-Eintritt

Für Warnstufen senden:

  • falukantUpdateDebt
  • zusätzlich falukantUpdateStatus

5. Eintritt in den Schuldturm

Bei days_overdue >= 3:

  • status = 'imprisoned'
  • entered_at = now()
  • released_at = null
  • debt_at_entry = aktuelle offene Schuld
  • remaining_debt = aktuelle offene Schuld
  • reason = 'credit_default'
  • creditworthiness_penalty += 45
  • next_forced_action = 'asset_seizure'
  • public_known = true

5.1 Sofortfolgen bei Eintritt

Einmalig anwenden:

  • Reputation deutlich senken
    • Empfehlung: -12
  • marriage_satisfaction senken
    • Empfehlung: -10
  • household_tension_score erhöhen
    • Empfehlung: +15
  • household_tension_reasons_json um debtorsPrison ergänzen

Zusätzlich:

  • aktive Liebhaber/Mätressen sichtbar destabilisieren
    • mindestens affection -= 4
  • Kreditaufnahme und aktive Falukant-Aktionen bleiben projektseitig bereits gesperrt

Bei Eintritt senden:

  • falukantUpdateDebt
    • reason: 'debtors_prison_entered'
  • falukantUpdateStatus
  • falukantUpdateFamily
    • reason: 'daily'
  • falukantHouseUpdate
  • falukantBranchUpdate

6. Verwertung / Pfändung

Die Verwertung läuft nicht alles auf einmal, sondern schrittweise pro Tick.

Reihenfolge:

  1. freies Geld
  2. Fahrzeuge
  3. Waren / Lagerbestände
  4. Haus
  5. Niederlassungen

Ziel:

  • remaining_debt schrittweise senken
  • Fortschritt im UI sichtbar machen

6.1 Geld

Wenn falukant_user.money > 0:

  • direkt zur Schuld tilgen
  • remaining_debt -= eingezogener_betrag

Events:

  • falukantUpdateDebt
    • reason: 'asset_seizure'
  • falukantUpdateStatus

6.2 Fahrzeuge

Verkaufe zuerst:

  • freie Fahrzeuge
  • dann weniger wertvolle Typen
  • keine Fahrzeuge in aktiven Transporten im selben Tick anfassen, falls technisch problematisch

Erlös:

  • Empfehlung: vehicle_type.cost * condition_factor * 0.55

Zusätzlich in assets_seized_json protokollieren:

  • Typ
  • Anzahl
  • Erlös

Events:

  • falukantUpdateDebt
    • reason: 'vehicle_liquidation'
  • falukantUpdateStatus

6.3 Waren / Lager

Verwertbare Güter:

  • Lagerbestände
  • Inventar
  • handelbare Waren

Erlös:

  • Empfehlung: Marktwert mit Abschlag von 35% bis 50%

Events:

  • falukantUpdateDebt
    • reason: 'asset_seizure'
  • falukantUpdateStatus
  • falukantBranchUpdate

6.4 Haus

Wenn Restschuld nach Geld/Fahrzeugen/Waren weiter hoch ist:

  • Haus pfänden
  • Spieler auf niedrigeres Haus oder Minimalhaus zurücksetzen
  • Dienerschaft reduzieren
  • household_order senken

Events:

  • falukantUpdateDebt
    • reason: 'house_seizure'
  • falukantHouseUpdate
  • falukantUpdateStatus
  • falukantUpdateFamily
    • reason: 'daily'

6.5 Niederlassungen

Wenn weiter nicht gedeckt:

  • Niederlassungen schließen
  • zuerst niedrige Stufe / niedriger Wert
  • Hauptniederlassung nur als letzter Schritt

Events:

  • falukantUpdateDebt
    • reason: 'branch_closure'
  • falukantBranchUpdate
  • falukantUpdateStatus

7. Laufende soziale Folgen im Schuldturm

Solange status = 'imprisoned':

  • täglicher Reputationsmalus
    • Empfehlung: -2
  • zusätzliche creditworthiness_penalty += 1 pro Tag
  • marriage_satisfaction -= 1
  • household_tension_score += 2

Wenn aktive Liebschaften bestehen:

  • affection -= 2
  • bei niedriger Zuneigung oder hoher Sichtbarkeit kann Beziehung enden

Empfohlene Absprungregel:

  • wenn affection <= 30 oder months_underfunded >= 2
    • Chance auf Beziehungsende prüfen
  • bei repräsentativen Beziehungen zusätzlich höhere Absprungchance, wenn public_known = true

Events bei sozialen Folgewirkungen:

  • falukantUpdateFamily
    • reason: 'daily'
  • zusätzlich falukantUpdateStatus

8. Kreditwürdigkeit

Die UI rechnet bereits aus creditworthiness_penalty und Status einen sichtbaren Wert.

Der Daemon muss pflegen:

  • creditworthiness_penalty
  • status
  • days_overdue

Empfehlung:

  • Eintritt Schuldturm: +45
  • pro weiterem Hafttag: +1
  • Hauspfändung: zusätzlich +10
  • Niederlassungsschließung: zusätzlich +8

9. Freilassung

Freilassung, wenn:

  • keine relevante Restschuld mehr offen ist oder
  • ein definierter Restwert unterschritten wird, falls ihr einen Bagatellgrenzwert wollt

Dann:

  • status = 'released'
  • released_at = now()
  • next_forced_action = null
  • days_overdue = 0
  • remaining_debt = 0

Events:

  • falukantUpdateDebt
    • reason: 'debtors_prison_released'
  • falukantUpdateStatus
  • falukantUpdateFamily
    • reason: 'daily'
  • falukantHouseUpdate
  • falukantBranchUpdate

Keine automatische vollständige soziale Heilung:

  • Reputation bleibt reduziert
  • Kreditwürdigkeit bleibt reduziert
  • Familie/Haus bleiben in Folgezuständen

10. Event-Kommunikation zur UI

Der Daemon sendet als Primärevent:

{
  "event": "falukantUpdateDebt",
  "user_id": 123,
  "reason": "delinquency"
}

Mögliche reason:

  • delinquency
  • debtors_prison_entered
  • asset_seizure
  • vehicle_liquidation
  • house_seizure
  • branch_closure
  • debtors_prison_released

10.1 Begleitevents

Je nach Folge zusätzlich:

  • falukantUpdateStatus
  • falukantHouseUpdate
  • falukantBranchUpdate
  • falukantUpdateFamily

10.2 Empfohlene Minimalregeln

  • delinquency:
    • falukantUpdateDebt
    • falukantUpdateStatus
  • debtors_prison_entered:
    • falukantUpdateDebt
    • falukantUpdateStatus
    • falukantUpdateFamily
    • falukantHouseUpdate
    • falukantBranchUpdate
  • asset_seizure:
    • falukantUpdateDebt
    • falukantUpdateStatus
    • optional falukantBranchUpdate
  • vehicle_liquidation:
    • falukantUpdateDebt
    • falukantUpdateStatus
  • house_seizure:
    • falukantUpdateDebt
    • falukantUpdateStatus
    • falukantHouseUpdate
    • falukantUpdateFamily
  • branch_closure:
    • falukantUpdateDebt
    • falukantUpdateStatus
    • falukantBranchUpdate
  • debtors_prison_released:
    • falukantUpdateDebt
    • falukantUpdateStatus
    • falukantUpdateFamily
    • falukantHouseUpdate
    • falukantBranchUpdate

11. Idempotenz

Der Worker muss idempotent arbeiten.

Wichtig:

  • Eintritt in den Schuldturm nicht mehrfach für denselben aktiven Fall auslösen
  • Verwertungsschritte nur einmal je Asset anwenden
  • released nicht erneut freisetzen

Empfehlung:

  • pro Tick Transaktion
  • pro Nutzer eine klare Reihenfolge
  • Änderungen in assets_seized_json protokollieren

12. Mindestumsetzung für Version 1

Pflicht:

  1. Verzugstage pflegen
  2. Eintritt nach 3 Tagen
  3. Status und Penalty schreiben
  4. Geld zuerst einziehen
  5. danach Fahrzeuge
  6. Events senden

Danach:

  1. Hauspfändung
  2. Niederlassungsschließung
  3. volle Familienfolgen

13. Hinweis an den Daemon

Die projektseitigen Grundlagen sind bereits umgesetzt:

  • debtors_prism ist erweitert
  • Bank-/Haus-/Familien-/Übersichts-UI reagiert auf den Status
  • aktive Falukant-Aktionen werden im Backend bereits gesperrt, sobald inDebtorsPrison = true

Der Daemon muss daher vor allem die Zustände und Folgen zuverlässig schreiben und die dokumentierten Events senden.