13 KiB
Falukant: Technisches Konzept für Liebhaber, Mätressen, Ehezufriedenheit und Kinder aus Liebschaften
Ziel
Dieses Dokument beschreibt die technische Umsetzung für Backend, Daemon und UI. Es basiert auf:
Es soll als direkte Arbeitsgrundlage für Migrationen, Modelle, Service-Methoden, Daemon-Jobs und Frontend-Anpassungen dienen.
Umsetzungsstrategie
Die Umsetzung sollte in drei technischen Stufen erfolgen:
Stufe 1: Datenbasis und Lesepfade
- neue Beziehungsdetaildaten anlegen
- Ehezufriedenheit technisch einführen
- Family-API erweitern
- UI nur lesend erweitern
Stufe 2: Externe Daemon-Logik
- tägliche und monatliche Falukant-Familienlogik an den externen Daemon übergeben
- Kosten, Ansehen, Sichtbarkeit, Diskretion und Ehezufriedenheit laufen dort automatisch
- Kinder aus Liebschaften werden über den externen Daemon ermöglicht
Stufe 3: Interaktive Spielmechanik
- UI-Aktionen für Unterhalt, Diskretion, Anerkennung, Beenden
- Ereignisse, Warnungen und Benachrichtigungen
- spätere Vertiefung wie Skandal- oder Kirchenereignisse
Datenmodell
1. Bestehende Tabellen, die genutzt werden
falukant_data.relationshipfalukant_data.child_relationfalukant_data.character
2. Empfohlene neue Tabelle
Empfohlen wird eine neue Detailtabelle:
falukant_data.relationship_state
Begründung:
relationshipenthält aktuell nur die grobe Beziehung- Liebhaber-/Ehedaten sind zustandsorientiert
- die Detailwerte wachsen voraussichtlich weiter
- eine Nebentabelle ist sauberer als
relationshipmit vielen Spezialspalten zu überladen
3. Tabelle relationship_state
Primärbezug
relationship_id
Spalten für Ehe
marriage_satisfactioninteger not null default55marriage_public_stabilityinteger not null default55
marriage_public_stability ist optional, aber sinnvoll für spätere Ereignisse. Für MVP kann er schon angelegt, aber noch wenig genutzt werden.
Spalten für Liebschaften
lover_rolestring nullablesecret_affairlovermistress_or_favorite
affectioninteger not null default50visibilityinteger not null default15discretioninteger not null default50maintenance_levelinteger not null default50status_fitinteger not null default0monthly_base_costinteger not null default0months_underfundedinteger not null default0activeboolean not null defaulttrueacknowledgedboolean not null defaultfalseexclusive_flagboolean not null defaultfalselast_monthly_processed_atdate nullablelast_daily_processed_atdate nullable
Spalten für spätere Erweiterung
notes_jsonjsonb nullableflags_jsonjsonb nullable
4. Erweiterung child_relation
Neue Spalten:
legitimacystring not null defaultlegitimatelegitimateacknowledged_bastardhidden_bastard
birth_contextstring not null defaultmarriagemarriagelover
public_knownboolean not null defaultfalse
5. Optionale Erweiterung relationship
Für bessere Auswertung kann zusätzlich sinnvoll sein:
ended_atended_reason
Das ist für MVP nicht zwingend, aber nützlich.
Migrationen
Benötigte Migrationen:
Migration 1
- neue Tabelle
falukant_data.relationship_state
Migration 2
- neue Spalten an
falukant_data.child_relation
Migration 3 optional
- Backfill für bestehende Beziehungen
Regeln für Backfill:
- bei
relationshipType = marriedmarriage_satisfaction = 55
- bei
relationshipType = loverlover_role = loveraffection = 50visibility = 20discretion = 45maintenance_level = 50status_fit = 0monthly_base_cost = 30
Sequelize-Modelle
1. Neues Modell
Neue Datei:
2. Associations
In associations.js:
Relationship.hasOne(RelationshipState, { foreignKey: 'relationshipId', as: 'state' })RelationshipState.belongsTo(Relationship, { foreignKey: 'relationshipId', as: 'relationship' })
3. ChildRelation-Erweiterung
legitimacybirthContextpublicKnown
Backend-Service-Konzept
Hauptort:
1. Neue interne Hilfsmethoden
Empfohlene neue interne Methoden:
getRankGroup(titleLabelTr)calculateLoverMonthlyCost(relationship, state, character)calculateMarriageDelta(relationship, state, character, spouseCharacter, context)calculateReputationDeltaFromLover(relationship, state, character, context)calculateDailyVisibilityDelta(state, context)calculateDailyDiscretionDelta(state, context)calculateDailyScandalChance(relationship, state, character, context)calculateMonthlyPregnancyChance(relationship, state, charA, charB)applyLoverMonthlyCosts(transactionDate?)applyLoverDailyEffects(transactionDate?)processLoverBirths(transactionDate?)triggerLoverScandalEvent(...)
2. Erweiterung getFamily
Die Familienausgabe in falukantService.js muss lovers detaillierter liefern.
Zusätzliche API-Felder je Lover:
relationshipIdroleaffectionvisibilitydiscretionmaintenanceLevelstatusFitmonthlyCostreputationEffectmarriageEffectacknowledgedcanBecomePublicriskState
Zusätzliche API-Felder für Ehe:
marriageSatisfactionmarriageStatestablestrainedcrisis
3. Neue Service-Aktionen
Für spätere UI-Steuerung:
setLoverMaintenance(hashedUserId, relationshipId, maintenanceLevel)setLoverDiscretionMode(hashedUserId, relationshipId, mode)acknowledgeLover(hashedUserId, relationshipId)endLoverRelationship(hashedUserId, relationshipId)giftLover(hashedUserId, relationshipId, giftType)
Diese Methoden müssen in Stufe 1 noch nicht voll sichtbar sein, sollten aber im Konzept vorgesehen werden.
API-Konzept
1. Bestehende Family-Route erweitern
Bestehender Endpunkt:
GET /api/falukant/family
Erweitern um:
marriageSatisfactionloversmit DetailfeldernhouseholdTensionoptional
2. Neue Endpunkte
Empfohlene neue Endpunkte:
POST /api/falukant/family/lover/:relationshipId/maintenancePOST /api/falukant/family/lover/:relationshipId/discretionPOST /api/falukant/family/lover/:relationshipId/acknowledgePOST /api/falukant/family/lover/:relationshipId/endPOST /api/falukant/family/lover/:relationshipId/gift
3. Antwortschema
Jede mutierende Aktion sollte zurückgeben:
- aktualisierte Liebhaber-Daten
- aktualisierte Ehe-Zufriedenheit
- aktualisierte Geldmenge
- aktualisiertes Ansehen
- optionale Nachricht für UI
Daemon-Integration
1. Tatsächliche Daemon-Lage
Der operative Daemon ist nicht Teil dieses Projekts. Dieses Projekt stellt daher:
- Datenmodell
- Backfill
- Family-API
- UI-Anzeige
- Fach- und Übergabedokumente
Der externe Daemon ist zuständig für:
- Daily Tick
- Monthly Tick
- Geldabbuchung
- Ansehensänderung
- Ehezufriedenheit
- Kinder aus Liebschaften
Die operative Übergabe dafür steht in:
2. Neue Benachrichtigungstypen
Es sollten neue Falukant-Benachrichtigungen eingeführt werden:
loverCostPaidloverUnderfundedloverRumorloverScandalloverChildHiddenloverChildKnownmarriageCrisis
Kindererzeugung technisch
1. Vorhandene Strukturen nutzen
Neue Kinder aus Liebschaften sollen dieselbe Charakter- und ChildRelation-Logik nutzen wie bestehende Kinder.
2. Erzeugungsort
Die Kind-Erzeugung soll vom externen Daemon ausgeführt oder angestoßen werden. Dieses Backend muss dafür die Zielstruktur stabil bereitstellen.
3. Anerkennung eines Kindes
Spätere Service-Methode:
acknowledgeLoverChild(hashedUserId, childCharacterId)
Wirkung:
legitimacy = acknowledged_bastardpublicKnown = true- Ansehen anpassen
- Ehe-Zufriedenheit anpassen
Frontend-Konzept
Hauptansicht:
1. Ehebereich erweitern
Im Ehe- oder Partnerbereich anzeigen:
Ehe-Zufriedenheit- textlicher Status
stabilangespanntkrisenhaft
- kurzer Hinweis, ob aktive Liebschaften die Ehe belasten oder stabilisieren
2. Lovers-Bereich ausbauen
Aktuell existiert nur Name plus Zuneigung. Neu anzeigen:
- Rolle
- Zuneigung
- Sichtbarkeit
- Diskretion
- Unterhaltsniveau
- Monatskosten
- aktueller Einfluss auf Ansehen
- aktueller Einfluss auf Ehe-Zufriedenheit
- Risikostatus
3. Aktionen im UI
Pro Liebschaft:
- Unterhalt erhöhen oder senken
- Diskretion priorisieren
- öffentlich anerkennen
- beschenken
- Beziehung beenden
4. Farbliche Zustände
Grün
- geordnet
- geringe Sichtbarkeit
- Ehe stabil oder neutral
Gelb
- steigende Sichtbarkeit
- mittlere Ehebelastung
- Unterhalt knapp
Rot
- Skandalrisiko hoch
- Ehekrise
- unterfinanziert
- Kind öffentlich geworden
5. Kinder aus Liebschaften in FamilyView
Im Kinderbereich kenntlich machen:
- legitimes Kind
- uneheliches verborgenes Kind
- anerkanntes uneheliches Kind
Es braucht keine sensationelle Darstellung, aber klare Kennzeichnung.
I18n-Bedarf
Benötigte neue Übersetzungsbereiche in:
- frontend/src/i18n/locales/de/falukant.json
- frontend/src/i18n/locales/en/falukant.json
- frontend/src/i18n/locales/es/falukant.json
Neue Schlüsselgruppen:
falukant.family.marriageSatisfaction.*falukant.family.lovers.role.*falukant.family.lovers.visibilityfalukant.family.lovers.discretionfalukant.family.lovers.maintenancefalukant.family.lovers.monthlyCostfalukant.family.lovers.reputationEffectfalukant.family.lovers.marriageEffectfalukant.family.lovers.risk.*falukant.family.children.legitimacy.*
Admin- und Debug-Bedarf
Für Entwicklung und Balancing später sinnvoll:
- Admin-Sicht auf
relationship_state - Möglichkeit,
marriageSatisfaction,visibility,discretion,maintenanceLevelzu setzen - optionales Debug-Tool zum Simulieren von 30 Tagen
Das sollte nicht Teil des ersten Spieler-UI sein, aber früh mitgedacht werden.
Technische Risiken
1. Tick-Duplikate
Wenn Daily- oder Monthly-Ticks mehrfach laufen, werden Kosten und Ansehen doppelt verrechnet.
Gegenmaßnahme:
last_daily_processed_atlast_monthly_processed_at- idempotente Verarbeitung pro Beziehung und Tag/Monat
2. Dateninkonsistenz
Eine lover-Beziehung ohne relationship_state würde Berechnungen brechen.
Gegenmaßnahme:
- beim Lesen fehlende States automatisch erzeugen
- oder beim Start ein Reparaturskript
3. Kindererzeugung doppelt
Bei konkurrierenden Prozessen könnte ein Kind zweimal entstehen.
Gegenmaßnahme:
- Transaktion
- Sperre pro Beziehung und Tick
- eindeutige Monatsverarbeitung
Empfohlene Implementierungsreihenfolge
Paket 1
- Migrationen
- Modell
RelationshipState - Associations
- Backfill
Paket 2
- Family-Service erweitert lesen
- API-Felder ausliefern
- UI in
FamilyViewlesend erweitern
Paket 3
- Übergabe Daily Tick
- Übergabe Monthly Tick
- Abstimmung zu Geldabbuchung
- Abstimmung zu Ansehen und Ehezufriedenheit
Paket 4
- Kinder aus Liebschaften
- Benachrichtigungen
- UI-Aktionen
Paket 5
- Ereignisse
- spätere Dienerschaft
- Balancing-Phase
Definition of Done
Die technische Erstumsetzung ist abgeschlossen, wenn:
lover-Beziehungen Detailzustand besitzen- Ehezufriedenheit technisch existiert
- Family-API alle neuen Daten ausliefert
- Daily- und Monthly-Tick für den externen Daemon vollständig beschrieben sind
- Monatskosten- und Statuslogik extern ausführbar definiert sind
- Kinder aus Liebschaften technisch entstehen können
FamilyViewdie neuen Daten sichtbar macht- weibliche und männliche Spielfiguren regelgleich behandelt werden