11 KiB
Falukant: Daemon-Spezifikation für die Beziehung zwischen Liebschaften und Untergrund
Dieses Dokument beschreibt die konkrete Daemon-Logik für die Verbindung zwischen:
- aktiven Liebschaften
- Sichtbarkeit und Diskretion
- Untergrundaktivitäten vom Typ
investigate_affair - Aufdeckung, Skandal und Erpressung
Es ist die technische Spezifikation für den externen Daemon und ergänzt:
- FALUKANT_LOVERS_DAEMON_SPEC.md
- FALUKANT_LOVERS_DAEMON_HANDOFF.md
- FALUKANT_UNDERGROUND_AFFAIR_DAEMON_HANDOFF.md
- FALUKANT_SERVANTS_IMPLEMENTATION_SPEC.md
1. Ziel
Der Untergrund soll Liebschaften nicht nur "finden oder nicht finden", sondern auf dieselben Zustände zugreifen, die das Lovers-System ohnehin täglich verarbeitet:
visibilitydiscretionacknowledgedloverRolepublicKnownunehelicher Kinder- Ruflage und Stand
- Haushalts- und Dienerschaftseffekte
Dadurch entsteht ein gemeinsames System statt zweier getrennter Minigames.
2. Grundprinzip
Untergrundaktivitäten gegen Liebschaften sind keine völlig unabhängigen Zufallstests.
Sie hängen ab von:
- wie sichtbar die Beziehung ohnehin schon ist
- wie diskret sie geführt wird
- wie groß und unruhig der Haushalt ist
- ob Kinder oder Anerkennung die Sache bereits schwer verbergen machen
- wie gut das Opfer sozial abgesichert ist
Faustregel:
- hohe Sichtbarkeit + geringe Diskretion + schlechte Dienerschaft = gute Aufdeckungschance
- niedrige Sichtbarkeit + hohe Diskretion + geordneter Haushalt = geringe Aufdeckungschance
3. Betroffene Aktivitäten
In Phase 1 betrifft diese Spezifikation nur:
investigate_affair
mit den Zielen:
exposeblackmail
4. Pflichtdaten für den Daemon
4.1 Aktivität
Aus falukant_data.underground:
idperformer_idvictim_idtype_idparameters.goalresultcreated_at
Aus falukant_type.underground:
tr
4.2 Opferdaten
Für das Opfer:
falukant_user.iduser.hashed_idcharacter.idcharacter.reputationcharacter.birthdatecharacter.title_of_nobility
4.3 Liebschaftsdaten
Für alle aktiven Liebschaften des Opfers:
relationship.idrelationship.character1_idrelationship.character2_idrelationship_type.trrelationship_state.lover_rolerelationship_state.visibilityrelationship_state.discretionrelationship_state.affectionrelationship_state.acknowledgedrelationship_state.status_fitrelationship_state.active
4.4 Kinderdaten
Optional, aber empfohlen:
child_relation.legitimacychild_relation.birth_contextchild_relation.public_known
4.5 Haushalts-/Dienerdaten
Wenn das Dienersystem aktiv ist:
user_house.servant_countuser_house.servant_qualityuser_house.servant_pay_leveluser_house.household_order- daraus abgeleitete Haushalts-/Diskretionswerte
5. Auswahl des Zielobjekts
Wenn ein Opfer mehrere aktive Liebschaften hat, muss der Daemon eine Ziellogik verwenden.
Empfohlene Reihenfolge:
- Nur aktive
lover-Beziehungen betrachten - je Beziehung einen
discoveryScoreberechnen - die Beziehung mit dem höchsten
discoveryScoreals primäres Ziel verwenden - bei fast gleichen Werten darf der Daemon zufällig zwischen den besten Kandidaten wählen
6. Discovery-Score
Der discoveryScore bestimmt, wie leicht eine konkrete Liebschaft durch den Untergrund verwertbar wird.
6.1 Formel
discoveryScore =
visibility * 0.45
+ (100 - discretion) * 0.30
+ acknowledgedBonus
+ childBonus
+ ageMalusVisibilityBonus
+ householdLeakBonus
+ multipleAffairBonus
+ statusMismatchBonus
6.2 Teilwerte
acknowledgedBonus
if acknowledged = true => +10
sonst => +0
childBonus
if hidden bastard exists => +8
if public_known bastard exists => +18
Wenn mehrere Kinder existieren:
- maximal
+20in Summe
ageMalusVisibilityBonus
Wenn die Liebschaft wegen jungen Alters bereits reputationsschädlich ist:
minAge <= 13 => +18
minAge <= 15 => +12
minAge <= 17 => +6
sonst => +0
householdLeakBonus
Aus dem Dienersystem:
if no house data => +0
if householdOrder <= 35 => +8
if servantPayLevel = low => +5
if servantCount > expectedMax + 1 => +4
if servantQuality <= 35 => +6
Deckel:
- maximal
+15
multipleAffairBonus
if victim has 2 active lovers => +8
if victim has 3 or more active lovers => +14
statusMismatchBonus
Wenn die Beziehung standesmäßig auffällig ist:
status_fit = -2 => +10
status_fit = -1 => +5
sonst => +0
7. Erfolgswahrscheinlichkeit
7.1 Grundwurf
Auf Basis des höchsten discoveryScore:
successChance = clamp(20 + discoveryScore * 0.55, 5, 95)
Interpretation:
- selbst sehr diskrete Beziehungen bleiben mit kleinem Restrisiko auffindbar
- offen geführte, chaotische Beziehungen werden fast sicher entdeckt
7.2 Ergebnisstufen
roll <= successChance * 0.55 => full success
roll <= successChance => partial success
sonst => failure
8. Behandlung von goal = expose
8.1 Ziel
Die Beziehung soll öffentlich sichtbar und reputationsschädlich werden.
8.2 Wirkung bei vollem Erfolg
Auf Ziel-Liebschaft:
visibility += 18..30discretion -= 8..18
Auf Opfer:
reputationDelta = -2 .. -6
Zusätzlich:
- wenn
visibility >= 60nach Anpassung: Skandalprüfung sofort auslösen - wenn
public_knownuneheliches Kind bereits existiert: zusätzlicher Rufschaden-1
8.3 Wirkung bei Teilerfolg
Auf Ziel-Liebschaft:
visibility += 8..15discretion -= 3..8
Auf Opfer:
reputationDelta = -1 .. -3
Kein garantierter sofortiger Skandal, aber deutlich erhöhte Folgewahrscheinlichkeit.
8.4 Wirkung bei Fehlschlag
Keine öffentliche Wirkung, aber optional:
- kleines Gegenrisiko für den Untergrund später
- oder
notesmit "no proof"
Für Phase 1 genügt:
status = failedoutcome = failure
9. Behandlung von goal = blackmail
9.1 Ziel
Belastendes Wissen beschaffen, ohne sofort volle Öffentlichkeit zu erzeugen.
9.2 Wirkung bei vollem Erfolg
Auf Ziel-Liebschaft:
visibility += 4..9discretion -= 2..6
Auf Aktivität:
blackmailAmountsetzendiscoveriesmit verwertbaren Details befüllen
Auf Opfer:
- kein großer Sofort-Rufschaden
- optional
reputationDelta = 0 .. -1
9.3 Wirkung bei Teilerfolg
Auf Ziel-Liebschaft:
visibility += 2..5
Auf Aktivität:
- kleinerer
blackmailAmount outcome = partial
9.4 Wirkung bei Fehlschlag
- keine verwertbare Entdeckung
status = failedoutcome = failure
10. Berechnung der Erpressungssumme
Die Erpressungssumme soll aus sozialer Fallhöhe und Beweiswert entstehen.
10.1 Formel
base =
500
+ visibility * 12
+ max(0, reputation) * 15
+ titleGroupBonus
+ childBlackmailBonus
blackmailAmount = round(base * outcomeFactor)
10.2 titleGroupBonus
Aus der Standesgruppe des Lovers-Systems:
group 0 => +0
group 1 => +600
group 2 => +1800
group 3 => +4200
10.3 childBlackmailBonus
hidden_bastard exists => +900
public_known bastard exists => +1600
10.4 outcomeFactor
full success => 1.0
partial success => 0.55
failure => 0
11. Sofortige Skandalprüfung
Bei goal = expose und starker Sichtbarkeitssteigerung darf der Untergrund direkt einen Skandal anstoßen.
11.1 Triggerschwelle
if visibility_after >= 60:
trigger scandal check
Zusatzbonus:
+10Punkte auf die reguläre Skandalchance bei sehr jungem Alter<= 15+6Punkte beipublic_knownKind+5Punkte beihouseholdOrder <= 35
11.2 Socket-Events
Wenn daraus ein Skandal resultiert:
falukant_family_scandal_hintfalukantUpdateFamilymitreason = scandalfalukantUpdateStatus
12. Struktur von underground.result
Der Daemon schreibt mindestens:
{
"status": "resolved",
"outcome": "success",
"discoveries": {
"relationshipId": 123,
"loverRole": "secret_affair",
"visibility": 58,
"acknowledged": false,
"publicKnownChild": false,
"householdLeak": true
},
"visibilityDelta": 14,
"reputationDelta": -3,
"blackmailAmount": 2400,
"notes": "Servants and low discretion made the affair easy to trace."
}
13. Pflichtregeln für discoveries
discoveries soll mindestens enthalten:
relationshipIdloverRolevisibilityacknowledged
Optional, aber sehr nützlich:
publicKnownChildhiddenChildhouseholdLeakminAgeBracketmultipleAffairs
14. Interaktion mit Dienerschaft
Das Dienersystem ist ein eigenständiger Modifikator, kein Ersatz für Sichtbarkeit oder Diskretion.
Der Untergrund soll Dienerschaft nur als Verstärker oder Dämpfer nutzen:
Günstig für Aufdeckung:
- niedrige Bezahlung
- schlechte Qualität
- chaotischer Haushalt
- übergroße Dienerschaft
Ungünstig für Aufdeckung:
- hohe Qualität
- großzügige Bezahlung
- geordneter Haushalt
- passende, nicht zu große Dienerschaft
15. Interaktion mit Lover-Daily
Wichtig:
- Der Untergrund darf Lovers-Zustände verändern.
- Danach verarbeitet das normale Daily-System diese Zustände weiter.
Das heißt:
visibility-Erhöhungen aus dem Untergrund laufen später in Daily-Skandale und Rufdrift hinein.- Untergrund ersetzt nicht die Daily-Logik, sondern stößt sie an.
16. Idempotenz
Jede investigate_affair-Aktivität darf genau einmal verarbeitet werden.
Verarbeitbar nur wenn:
underground_type.tr = investigate_affairresult.status = pending
Nach Verarbeitung:
result.statusaufresolvedoderfailed
Der Daemon darf keine Aktivität erneut anfassen, deren result.status nicht mehr pending ist.
17. Transaktionsgrenze
Folgendes soll atomar laufen:
- Ziel-Liebschaft bestimmen
- Erfolgswurf
- Sichtbarkeit/Diskretion ändern
- Rufänderung anwenden
underground.resultschreiben- optionale Skandalereignisse vorbereiten
Empfehlung:
- eine DB-Transaktion pro Aktivität
18. Definition of Done
Die Daemon-Umsetzung ist ausreichend, wenn:
investigate_affairfürexposeundblackmailverschieden behandelt wird- nicht beliebige, sondern die plausibelste aktive Liebschaft des Opfers gewählt wird
- Sichtbarkeit und Diskretion aus dem Lovers-System als Eingangsgrößen verwendet werden
- Dienerschaft optional als Leck-/Diskretionsfaktor einfließt
exposeSichtbarkeit und Ruf spürbar verschieben kannblackmailbelastbareblackmailAmount-Werte produziert- Skandale bei starken Fällen sofort ausgelöst werden können
underground.resultvollständig und UI-lesbar gefüllt wird
19. Empfehlung für die Implementierungsreihenfolge
- Ziel-Liebschaft und
discoveryScoreimplementieren success / partial / failurefürexposeblackmailAmountfürblackmaildiscoveries-Füllung- Sofort-Skandalprüfung
- Dienerschaftsmodifikator ergänzen
- Balancing nach ersten Tests