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;
}
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);
}
}

View File

@@ -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