From 94074c812958b167de9132998acfd06e1779ed5f Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Wed, 4 Nov 2026 15:01:59 +0100 Subject: [PATCH] =?UTF-8?q?Erm=C3=B6gliche=20Schwangerschaften=20w=C3=A4hr?= =?UTF-8?q?end=20der=20Verlobung?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/worker/falukant_family.rs | 9 +++++++-- src/worker/sql.rs | 32 ++++++++++++++++++++------------ 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/worker/falukant_family.rs b/src/worker/falukant_family.rs index 5e47b41..6a2eda1 100755 --- a/src/worker/falukant_family.rs +++ b/src/worker/falukant_family.rs @@ -1062,11 +1062,16 @@ impl FalukantFamilyWorker { continue; } + let reason = if row.get("relationship_type").map(String::as_str) == Some("engaged") { + "engaged_pregnancy" + } else { + "lover_pregnancy" + }; if let Some(uid) = father_uid { - self.publish_falukant_update_family_and_status(uid, "lover_pregnancy"); + self.publish_falukant_update_family_and_status(uid, reason); } if let Some(uid) = mother_uid { - self.publish_falukant_update_family_and_status(uid, "lover_pregnancy"); + self.publish_falukant_update_family_and_status(uid, reason); } } diff --git a/src/worker/sql.rs b/src/worker/sql.rs index 7e8fd3d..e6197fc 100755 --- a/src/worker/sql.rs +++ b/src/worker/sql.rs @@ -2370,7 +2370,7 @@ pub const QUERY_GET_PLANNED_CHARACTER_BIRTH_DELIVERIES: &str = r#" WHEN EXISTS ( SELECT 1 FROM falukant_data.relationship r - JOIN falukant_type.relationship rt ON rt.id = r.relationship_type_id AND rt.tr = 'lover' + JOIN falukant_type.relationship rt ON rt.id = r.relationship_type_id AND rt.tr IN ('lover', 'engaged') WHERE (r.character1_id = c_f.id AND r.character2_id = c_m.id) OR (r.character1_id = c_m.id AND r.character2_id = c_f.id) ) THEN 'lover' @@ -3907,7 +3907,7 @@ pub const QUERY_UPDATE_CHARACTER_REPUTATION: &str = r#" WHERE id = $2::int; "#; -/// Liebschafts-Konzeption: gleiche Sperre wie Ehe auf `character.pregnancy_due_at` (geplante Schwangerschaft). +/// Konzeption bei Liebschaften und Verlobten: gleiche Sperre wie Ehe auf `character.pregnancy_due_at` (geplante Schwangerschaft). /// Max. ein Kind pro Mutter und Kalendertag — unabhängig vom Vater (Ehe/Liebschaft/geplant). pub const QUERY_GET_LOVER_PREGNANCY_CANDIDATES: &str = r#" SELECT @@ -3923,10 +3923,11 @@ pub const QUERY_GET_LOVER_PREGNANCY_CANDIDATES: &str = r#" CASE WHEN c1.gender = 'male' THEN c1.region_id ELSE c2.region_id END AS region_id, CASE WHEN c1.gender = 'male' THEN fu1.id ELSE fu2.id END AS father_uid, CASE WHEN c1.gender = 'female' THEN fu1.id ELSE fu2.id END AS mother_uid, + rt.tr AS relationship_type, (CURRENT_DATE - c_female.birthdate::date)::int AS mother_age_days 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 + JOIN falukant_type.relationship rt ON rt.id = r.relationship_type_id AND rt.tr IN ('lover', 'engaged') + LEFT JOIN falukant_data.relationship_state rs ON rs.relationship_id = r.id JOIN falukant_data.character c1 ON c1.id = r.character1_id JOIN falukant_data.character c2 ON c2.id = r.character2_id JOIN falukant_data.character c_female ON c_female.id = ( @@ -3936,11 +3937,18 @@ pub const QUERY_GET_LOVER_PREGNANCY_CANDIDATES: &str = r#" LEFT JOIN falukant_data.falukant_user fu2 ON fu2.id = c2.user_id WHERE ((c1.gender = 'female' AND c2.gender = 'male') OR (c1.gender = 'male' AND c2.gender = 'female')) - AND rs.affection >= 45 - AND rs.maintenance_level >= 30 - -- `last_monthly_processed_at` wird im Familien-Tageslauf mitgeführt (1 Spieljahr = 1 Kalendertag). - AND rs.last_monthly_processed_at IS NOT NULL - AND rs.last_monthly_processed_at >= NOW() - INTERVAL '50 days' + AND ( + -- Verlobungen brauchen weder Liebschaftsunterhalt noch einen Abrechnungslauf. + -- Fehlende Zustandszeilen entsprechen dem Backend-Standard (aktiv, Zuneigung 50). + (rt.tr = 'engaged' AND rs.active IS NOT FALSE + AND COALESCE(rs.affection, 50) >= 45 + AND c1.health > 0 AND c2.health > 0) + OR (rt.tr = 'lover' AND rs.active = true + AND rs.affection >= 45 + AND rs.maintenance_level >= 30 + AND rs.last_monthly_processed_at IS NOT NULL + AND rs.last_monthly_processed_at >= NOW() - INTERVAL '50 days') + ) AND (CURRENT_DATE - c1.birthdate::date) >= c1.fertile_from_age AND (CURRENT_DATE - c2.birthdate::date) >= c2.fertile_from_age AND c_female.pregnancy_due_at IS NULL @@ -3964,19 +3972,19 @@ pub const QUERY_GET_LOVER_PREGNANCY_CANDIDATES: &str = r#" -- Ein Kalendertag entspricht einem Spieljahr (vgl. Ehe-Konzeption). AND random() * 100.0 < ( LEAST(12.0, GREATEST(0.0, - CASE rs.lover_role + CASE WHEN rt.tr = 'engaged' THEN 4.0 ELSE CASE rs.lover_role WHEN 'secret_affair' THEN 2.0 WHEN 'lover' THEN 4.0 WHEN 'mistress_or_favorite' THEN 6.0 ELSE 0.0 - END + END END + CASE WHEN rs.affection >= 75 THEN 2.0 ELSE 0.0 END + CASE WHEN rs.visibility >= 70 AND rs.affection < 50 THEN -2.0 ELSE 0.0 END )) ); "#; -/// Liebschafts-Konzeption setzt eine geplante Schwangerschaft am Mutter-Charakter +/// Konzeption bei Liebschaften/Verlobten setzt eine geplante Schwangerschaft am Mutter-Charakter /// (gleicher Geburtsweg wie Admin/Spiel): Geburt erfolgt, wenn `pregnancy_due_at <= NOW()`. pub const QUERY_SET_CHARACTER_PREGNANCY_FROM_LOVER: &str = r#" UPDATE falukant_data.character c_m