Integrate servant management into Falukant family dynamics: Added support for servant-related logic in FalukantFamilyWorker, including daily and monthly processing of servant data. Updated SQL queries to handle servant attributes and integrated servant discretion modifiers into relationship calculations, enhancing family interaction and satisfaction tracking.

This commit is contained in:
Torsten Schulz (local)
2026-03-22 10:09:26 +01:00
parent c209c41b52
commit d921dc2f7e
9 changed files with 1265 additions and 8 deletions

View File

@@ -2027,6 +2027,115 @@ pub const QUERY_GET_CHARACTERS_FOR_CHURCH_OFFICE: &str = r#"
LIMIT $2;
"#;
// --- Falukant: Dienerschaft (siehe migrations/004_falukant_servants_daemon.sql) ---
pub const QUERY_SERVANTS_SCHEMA_READY: &str = r#"
SELECT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_schema = 'falukant_data'
AND table_name = 'user_house'
AND column_name = 'servants_last_daily_at'
) AS ready;
"#;
pub const QUERY_GET_SERVANT_DAILY_ROWS: &str = r#"
SELECT DISTINCT ON (uh.id)
uh.id AS user_house_id,
fu.id AS falukant_user_id,
c.id AS character_id,
COALESCE(c.reputation, 50)::float8 AS reputation,
COALESCE(t.level, 0)::int AS title_level,
COALESCE(ht.position, 0)::int AS house_position,
COALESCE(ht.cost, 0)::bigint AS house_cost,
uh.servant_count,
uh.servant_quality,
COALESCE(NULLIF(TRIM(uh.servant_pay_level), ''), 'normal') AS servant_pay_level,
uh.household_order
FROM falukant_data.user_house uh
JOIN falukant_data.falukant_user fu ON fu.id = uh.user_id
JOIN falukant_data.character c ON c.user_id = fu.id AND c.health > 0
LEFT JOIN falukant_type.title t ON t.id = c.title_of_nobility
LEFT JOIN falukant_type.house ht ON ht.id = uh.house_type_id
WHERE (uh.servants_last_daily_at IS NULL OR (uh.servants_last_daily_at::date < CURRENT_DATE))
AND NOT EXISTS (
SELECT 1 FROM falukant_type.house h
WHERE h.id = uh.house_type_id AND h.label_tr = 'under_bridge'
)
ORDER BY uh.id, c.id;
"#;
pub const QUERY_UPDATE_USER_HOUSE_SERVANT_DAILY: &str = r#"
UPDATE falukant_data.user_house
SET household_order = $1::smallint,
servant_quality = $2::smallint,
servant_discretion_modifier = $3::smallint,
servants_last_daily_at = NOW()
WHERE id = $4::int;
"#;
pub const QUERY_UPDATE_MARRIAGE_SATISFACTION_ADD_FOR_CHARACTER: &str = r#"
UPDATE falukant_data.relationship r
SET marriage_satisfaction = GREATEST(0, LEAST(100, marriage_satisfaction + $1::int))
FROM falukant_type.relationship rt
WHERE rt.id = r.relationship_type_id
AND rt.tr IN ('married', 'engaged', 'wooing')
AND (r.character1_id = $2::int OR r.character2_id = $2::int);
"#;
pub const QUERY_GET_SERVANT_MONTHLY_ROWS: &str = r#"
SELECT DISTINCT ON (uh.id)
uh.id AS user_house_id,
fu.id AS falukant_user_id,
c.id AS character_id,
COALESCE(c.reputation, 50)::float8 AS reputation,
COALESCE(t.level, 0)::int AS title_level,
COALESCE(ht.position, 0)::int AS house_position,
COALESCE(ht.cost, 0)::bigint AS house_cost,
uh.servant_count,
uh.servant_quality,
COALESCE(NULLIF(TRIM(uh.servant_pay_level), ''), 'normal') AS servant_pay_level,
uh.household_order,
COALESCE(fu.money, 0)::float8 AS user_money,
uh.servants_underfunded
FROM falukant_data.user_house uh
JOIN falukant_data.falukant_user fu ON fu.id = uh.user_id
JOIN falukant_data.character c ON c.user_id = fu.id AND c.health > 0
LEFT JOIN falukant_type.title t ON t.id = c.title_of_nobility
LEFT JOIN falukant_type.house ht ON ht.id = uh.house_type_id
WHERE (uh.servants_last_monthly_at IS NULL
OR date_trunc('month', uh.servants_last_monthly_at) < date_trunc('month', CURRENT_TIMESTAMP))
AND NOT EXISTS (
SELECT 1 FROM falukant_type.house h
WHERE h.id = uh.house_type_id AND h.label_tr = 'under_bridge'
)
ORDER BY uh.id, c.id;
"#;
pub const QUERY_COUNT_ACTIVE_LOVERS_FOR_CHARACTER: &str = r#"
SELECT COUNT(*)::int AS cnt
FROM falukant_data.relationship r
JOIN falukant_type.relationship rt ON rt.id = r.relationship_type_id AND rt.tr = 'lover'
JOIN falukant_data.relationship_state rs ON rs.relationship_id = r.id AND rs.active = true
WHERE r.character1_id = $1::int OR r.character2_id = $1::int;
"#;
pub const QUERY_UPDATE_USER_HOUSE_SERVANT_MONTHLY_META: &str = r#"
UPDATE falukant_data.user_house
SET servants_underfunded = $1::boolean,
servants_last_monthly_at = NOW()
WHERE id = $2::int;
"#;
pub const QUERY_UPDATE_USER_HOUSE_SERVANT_UNDERFUNDED_PENALTY: &str = r#"
UPDATE falukant_data.user_house
SET servant_quality = GREATEST(0, servant_quality - 4),
household_order = GREATEST(0, household_order - 6),
servant_discretion_modifier = GREATEST(-100, LEAST(100,
COALESCE(servant_discretion_modifier, 0) + $1::int))
WHERE id = $2::int;
"#;
// --- Falukant: Familie / Liebhaber / Ehezufriedenheit (siehe migrations/001_falukant_family_lovers.sql) ---
pub const QUERY_FAMILY_SCHEMA_READY: &str = r#"
@@ -2064,7 +2173,17 @@ pub const QUERY_GET_ACTIVE_LOVER_ROWS_FOR_DAILY: &str = r#"
LEAST(
((CURRENT_DATE - c1.birthdate::date) / 365),
((CURRENT_DATE - c2.birthdate::date) / 365)
)::int AS min_age_years
)::int AS min_age_years,
COALESCE((
SELECT MAX(uh.servant_discretion_modifier)::int
FROM falukant_data.user_house uh
WHERE uh.user_id = fu1.id
), 0) AS servant_disc_u1,
COALESCE((
SELECT MAX(uh.servant_discretion_modifier)::int
FROM falukant_data.user_house uh
WHERE uh.user_id = fu2.id
), 0) AS servant_disc_u2
FROM falukant_data.relationship r
JOIN falukant_type.relationship rt
ON rt.id = r.relationship_type_id AND rt.tr = 'lover'