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:
@@ -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'
|
||||
|
||||
Reference in New Issue
Block a user