Ermögliche Schwangerschaften während der Verlobung
Some checks failed
Deploy yourpart (blue-green) / deploy (push) Has been cancelled

This commit is contained in:
Torsten Schulz (local)
2026-11-04 15:01:59 +01:00
parent 4fbb4d371c
commit 94074c8129
2 changed files with 27 additions and 14 deletions

View File

@@ -1062,11 +1062,16 @@ impl FalukantFamilyWorker {
continue; 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 { 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 { 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);
} }
} }

View File

@@ -2370,7 +2370,7 @@ pub const QUERY_GET_PLANNED_CHARACTER_BIRTH_DELIVERIES: &str = r#"
WHEN EXISTS ( WHEN EXISTS (
SELECT 1 SELECT 1
FROM falukant_data.relationship r 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) 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) OR (r.character1_id = c_m.id AND r.character2_id = c_f.id)
) THEN 'lover' ) THEN 'lover'
@@ -3907,7 +3907,7 @@ pub const QUERY_UPDATE_CHARACTER_REPUTATION: &str = r#"
WHERE id = $2::int; 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). /// Max. ein Kind pro Mutter und Kalendertag — unabhängig vom Vater (Ehe/Liebschaft/geplant).
pub const QUERY_GET_LOVER_PREGNANCY_CANDIDATES: &str = r#" pub const QUERY_GET_LOVER_PREGNANCY_CANDIDATES: &str = r#"
SELECT 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 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 = '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, 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 (CURRENT_DATE - c_female.birthdate::date)::int AS mother_age_days
FROM falukant_data.relationship r 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')
JOIN falukant_data.relationship_state rs ON rs.relationship_id = r.id AND rs.active = true 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 c1 ON c1.id = r.character1_id
JOIN falukant_data.character c2 ON c2.id = r.character2_id JOIN falukant_data.character c2 ON c2.id = r.character2_id
JOIN falukant_data.character c_female ON c_female.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 LEFT JOIN falukant_data.falukant_user fu2 ON fu2.id = c2.user_id
WHERE ((c1.gender = 'female' AND c2.gender = 'male') WHERE ((c1.gender = 'female' AND c2.gender = 'male')
OR (c1.gender = 'male' AND c2.gender = 'female')) OR (c1.gender = 'male' AND c2.gender = 'female'))
AND rs.affection >= 45 AND (
AND rs.maintenance_level >= 30 -- Verlobungen brauchen weder Liebschaftsunterhalt noch einen Abrechnungslauf.
-- `last_monthly_processed_at` wird im Familien-Tageslauf mitgeführt (1 Spieljahr = 1 Kalendertag). -- Fehlende Zustandszeilen entsprechen dem Backend-Standard (aktiv, Zuneigung 50).
AND rs.last_monthly_processed_at IS NOT NULL (rt.tr = 'engaged' AND rs.active IS NOT FALSE
AND rs.last_monthly_processed_at >= NOW() - INTERVAL '50 days' 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 - c1.birthdate::date) >= c1.fertile_from_age
AND (CURRENT_DATE - c2.birthdate::date) >= c2.fertile_from_age AND (CURRENT_DATE - c2.birthdate::date) >= c2.fertile_from_age
AND c_female.pregnancy_due_at IS NULL 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). -- Ein Kalendertag entspricht einem Spieljahr (vgl. Ehe-Konzeption).
AND random() * 100.0 < ( AND random() * 100.0 < (
LEAST(12.0, GREATEST(0.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 'secret_affair' THEN 2.0
WHEN 'lover' THEN 4.0 WHEN 'lover' THEN 4.0
WHEN 'mistress_or_favorite' THEN 6.0 WHEN 'mistress_or_favorite' THEN 6.0
ELSE 0.0 ELSE 0.0
END END END
+ CASE WHEN rs.affection >= 75 THEN 2.0 ELSE 0.0 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 + 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()`. /// (gleicher Geburtsweg wie Admin/Spiel): Geburt erfolgt, wenn `pregnancy_due_at <= NOW()`.
pub const QUERY_SET_CHARACTER_PREGNANCY_FROM_LOVER: &str = r#" pub const QUERY_SET_CHARACTER_PREGNANCY_FROM_LOVER: &str = r#"
UPDATE falukant_data.character c_m UPDATE falukant_data.character c_m