From 282f6542fe5c2b052906e42a0aecbde605d4aa8f Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Wed, 7 Jan 2026 11:15:20 +0100 Subject: [PATCH] event adjusted for epidemic --- src/worker/events.rs | 74 +++++++++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 28 deletions(-) diff --git a/src/worker/events.rs b/src/worker/events.rs index c0bddc9..8abf30d 100644 --- a/src/worker/events.rs +++ b/src/worker/events.rs @@ -895,41 +895,27 @@ impl EventsWorker { min_change, max_change, } => { - if effect_roll < *probability { - // Für regionale Ereignisse: Betrifft alle Charaktere in der Region - if let Ok((affected_characters, dead_characters)) = Self::apply_regional_character_health_change( + // WICHTIG: Bei regionalen Ereignissen ist `probability` als Anteil der + // betroffenen Charaktere gemeint (z.B. 0.8 = 80% betroffen), + // nicht als "Chance, dass der Effekt global auf ALLE greift". + if let Ok((affected_characters, dead_characters)) = + Self::apply_regional_character_health_change( &mut conn, pool, broker, region_id, + *probability, *min_change, *max_change, rng, - ) { - effect_results.push(json!({ - "type": "character_health_change", - "affected_count": affected_characters.len(), - "characters": affected_characters - })); - if !dead_characters.is_empty() { - effect_results.push(json!({ - "type": "character_death", - "dead_count": dead_characters.len(), - "characters": dead_characters - })); - } - } - } - } - EventEffect::CharacterDeath { probability } => { - if effect_roll < *probability { - // Für regionale Ereignisse: Betrifft alle Charaktere in der Region - if let Ok(dead_characters) = Self::apply_regional_character_death( - &mut conn, - region_id, - pool, - broker, - ) { + ) + { + effect_results.push(json!({ + "type": "character_health_change", + "affected_count": affected_characters.len(), + "characters": affected_characters + })); + if !dead_characters.is_empty() { effect_results.push(json!({ "type": "character_death", "dead_count": dead_characters.len(), @@ -938,6 +924,25 @@ impl EventsWorker { } } } + EventEffect::CharacterDeath { probability } => { + // WICHTIG: Bei regionalen Ereignissen ist `probability` als + // "Chance pro Charakter zu sterben" gemeint (z.B. 0.1 = 10%), + // nicht als "10% Chance, dass alle Charaktere der Region sterben". + if let Ok(dead_characters) = Self::apply_regional_character_death( + &mut conn, + region_id, + *probability, + pool, + broker, + rng, + ) { + effect_results.push(json!({ + "type": "character_death", + "dead_count": dead_characters.len(), + "characters": dead_characters + })); + } + } EventEffect::StorageDamage { probability, stock_type_label, @@ -1422,6 +1427,7 @@ impl EventsWorker { pool: &ConnectionPool, broker: &MessageBroker, region_id: i32, + affected_probability: f64, min_change: i32, max_change: i32, rng: &mut impl Rng, @@ -1434,6 +1440,11 @@ impl EventsWorker { let mut dead_characters = Vec::new(); for row in rows { + // Nur ein Teil der Charaktere soll betroffen sein (z.B. 80% bei Epidemie). + if rng.gen_range(0.0..=1.0) >= affected_probability { + continue; + } + let character_id: Option = row .get("id") .and_then(|v| v.parse::().ok()); @@ -1470,8 +1481,10 @@ impl EventsWorker { fn apply_regional_character_death( conn: &mut DbConnection, region_id: i32, + death_probability: f64, pool: &ConnectionPool, broker: &MessageBroker, + rng: &mut impl Rng, ) -> Result, DbError> { // Hole alle lebenden Charaktere in der Region conn.prepare("get_region_characters_death", QUERY_GET_REGION_CHARACTERS)?; @@ -1480,6 +1493,11 @@ impl EventsWorker { let mut dead_characters = Vec::new(); for row in rows { + // Chance pro Charakter (z.B. 10% bei Epidemie), nicht global. + if rng.gen_range(0.0..=1.0) >= death_probability { + continue; + } + let character_id: Option = row .get("id") .and_then(|v| v.parse::().ok());