Add FalukantFamilyWorker and related SQL queries: Introduced the FalukantFamilyWorker to manage family-related logic, including marriage satisfaction and relationship states. Added new SQL queries for handling lover relationships and marriage updates, enhancing the overall functionality of family dynamics in the application.

This commit is contained in:
Torsten Schulz (local)
2026-03-20 10:26:15 +01:00
parent f9c80bbd6b
commit 6a5ff4557e
8 changed files with 1164 additions and 1 deletions

View File

@@ -0,0 +1,62 @@
-- Falukant: Liebhaber, Ehezufriedenheit, uneheliche Kinder (Handoff: externer Daemon)
-- Siehe docs/FALUKANT_DAEMON_HANDOFF.md
ALTER TABLE falukant_data.character
ADD COLUMN IF NOT EXISTS reputation numeric(6,2) NOT NULL DEFAULT 50.00;
ALTER TABLE falukant_data.relationship
ADD COLUMN IF NOT EXISTS marriage_satisfaction smallint NOT NULL DEFAULT 55
CHECK (marriage_satisfaction >= 0 AND marriage_satisfaction <= 100),
ADD COLUMN IF NOT EXISTS marriage_drift_high smallint NOT NULL DEFAULT 0
CHECK (marriage_drift_high >= 0 AND marriage_drift_high < 3),
ADD COLUMN IF NOT EXISTS marriage_drift_low smallint NOT NULL DEFAULT 0
CHECK (marriage_drift_low >= 0 AND marriage_drift_low < 5);
COMMENT ON COLUMN falukant_data.relationship.marriage_satisfaction IS
'Ehezufriedenheit 0..100 (married / engaged / wooing); Schreiben durch Daemon';
CREATE TABLE IF NOT EXISTS falukant_data.relationship_state (
relationship_id integer PRIMARY KEY
REFERENCES falukant_data.relationship (id) ON DELETE CASCADE,
lover_role varchar(32) NOT NULL
CHECK (lover_role IN ('secret_affair', 'lover', 'mistress_or_favorite')),
affection smallint NOT NULL DEFAULT 50
CHECK (affection >= 0 AND affection <= 100),
visibility smallint NOT NULL DEFAULT 20
CHECK (visibility >= 0 AND visibility <= 100),
discretion smallint NOT NULL DEFAULT 50
CHECK (discretion >= 0 AND discretion <= 100),
maintenance_level smallint NOT NULL DEFAULT 50
CHECK (maintenance_level >= 0 AND maintenance_level <= 100),
status_fit smallint NOT NULL DEFAULT 0
CHECK (status_fit >= -2 AND status_fit <= 2),
monthly_base_cost integer NOT NULL DEFAULT 30,
active boolean NOT NULL DEFAULT true,
acknowledged boolean NOT NULL DEFAULT false,
exclusive boolean,
months_underfunded smallint NOT NULL DEFAULT 0
CHECK (months_underfunded >= 0 AND months_underfunded < 100),
scandal_extra_daily_pct smallint NOT NULL DEFAULT 0
CHECK (scandal_extra_daily_pct >= 0 AND scandal_extra_daily_pct <= 100),
last_daily_processed_at timestamptz,
last_monthly_processed_at timestamptz
);
CREATE INDEX IF NOT EXISTS idx_relationship_state_active
ON falukant_data.relationship_state (active)
WHERE active = true;
COMMENT ON COLUMN falukant_data.relationship_state.last_daily_processed_at IS
'Idempotenz: kein zweiter Daily-Tick am selben Kalendertag (Serverzeit)';
COMMENT ON COLUMN falukant_data.relationship_state.last_monthly_processed_at IS
'Idempotenz: kein zweiter Monthly-Tick im selben Kalendermonat (Serverzeit)';
ALTER TABLE falukant_data.child_relation
ADD COLUMN IF NOT EXISTS legitimacy varchar(32) NOT NULL DEFAULT 'legitimate'
CHECK (legitimacy IN ('legitimate', 'acknowledged_bastard', 'hidden_bastard')),
ADD COLUMN IF NOT EXISTS birth_context varchar(32) NOT NULL DEFAULT 'marriage'
CHECK (birth_context IN ('marriage', 'lover')),
ADD COLUMN IF NOT EXISTS public_known boolean NOT NULL DEFAULT true;
COMMENT ON COLUMN falukant_data.child_relation.legitimacy IS 'legitimate | acknowledged_bastard | hidden_bastard';
COMMENT ON COLUMN falukant_data.child_relation.birth_context IS 'marriage | lover';

View File

@@ -0,0 +1,18 @@
-- Upgrade falls bereits 001 mit alten Spaltennamen eingespielt wurde.
-- Neuinstallationen nutzen 001 direkt und brauchen 002 nicht.
DO $$
BEGIN
IF EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = 'falukant_data' AND table_name = 'relationship_state'
AND column_name = 'consecutive_underpayment_months'
) THEN
ALTER TABLE falukant_data.relationship_state
RENAME COLUMN consecutive_underpayment_months TO months_underfunded;
END IF;
END $$;
ALTER TABLE falukant_data.relationship_state
ADD COLUMN IF NOT EXISTS last_daily_processed_at timestamptz,
ADD COLUMN IF NOT EXISTS last_monthly_processed_at timestamptz;

21
migrations/README.md Normal file
View File

@@ -0,0 +1,21 @@
# Datenbank-Migrationen (Falukant / YpDaemon)
Siehe auch **`docs/FALUKANT_DAEMON_HANDOFF.md`** (Abgleich mit Backend-Übergabe).
## `001_falukant_family_lovers.sql`
Voraussetzung für den **`FalukantFamilyWorker`** (Liebhaber, Ehezufriedenheit, Ansehen, Monatskosten, Kinder aus Liebschaften).
**Manuell ausführen** auf der Ziel-DB (nach Backup):
```bash
psql "$DATABASE_URL" -f migrations/001_falukant_family_lovers.sql
```
## `002_falukant_family_rename_legacy_columns.sql`
Nur nötig, wenn **`001`** bereits mit den **alten** Spaltennamen (`consecutive_underpayment_months`) eingespielt wurde.
**Backend (YourPart3):** Beim Anlegen einer `lover`-Beziehung `relationship_state` erzeugen; Ehezufriedenheit liegt auf **`relationship`** (married / engaged / wooing); Idempotenzfelder `last_daily_processed_at` / `last_monthly_processed_at` werden vom Daemon gesetzt.
Ohne passende Spalten (`last_daily_processed_at`) bleibt der Family-Worker inaktiv.