event adjusted for epidemic

This commit is contained in:
Torsten Schulz (local)
2026-01-07 11:15:20 +01:00
parent f96e474f32
commit 282f6542fe

View File

@@ -895,41 +895,27 @@ impl EventsWorker {
min_change, min_change,
max_change, max_change,
} => { } => {
if effect_roll < *probability { // WICHTIG: Bei regionalen Ereignissen ist `probability` als Anteil der
// Für regionale Ereignisse: Betrifft alle Charaktere in der Region // betroffenen Charaktere gemeint (z.B. 0.8 = 80% betroffen),
if let Ok((affected_characters, dead_characters)) = Self::apply_regional_character_health_change( // 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, &mut conn,
pool, pool,
broker, broker,
region_id, region_id,
*probability,
*min_change, *min_change,
*max_change, *max_change,
rng, rng,
) { )
effect_results.push(json!({ {
"type": "character_health_change", effect_results.push(json!({
"affected_count": affected_characters.len(), "type": "character_health_change",
"characters": affected_characters "affected_count": affected_characters.len(),
})); "characters": affected_characters
if !dead_characters.is_empty() { }));
effect_results.push(json!({ if !dead_characters.is_empty() {
"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!({ effect_results.push(json!({
"type": "character_death", "type": "character_death",
"dead_count": dead_characters.len(), "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 { EventEffect::StorageDamage {
probability, probability,
stock_type_label, stock_type_label,
@@ -1422,6 +1427,7 @@ impl EventsWorker {
pool: &ConnectionPool, pool: &ConnectionPool,
broker: &MessageBroker, broker: &MessageBroker,
region_id: i32, region_id: i32,
affected_probability: f64,
min_change: i32, min_change: i32,
max_change: i32, max_change: i32,
rng: &mut impl Rng, rng: &mut impl Rng,
@@ -1434,6 +1440,11 @@ impl EventsWorker {
let mut dead_characters = Vec::new(); let mut dead_characters = Vec::new();
for row in rows { 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<i32> = row let character_id: Option<i32> = row
.get("id") .get("id")
.and_then(|v| v.parse::<i32>().ok()); .and_then(|v| v.parse::<i32>().ok());
@@ -1470,8 +1481,10 @@ impl EventsWorker {
fn apply_regional_character_death( fn apply_regional_character_death(
conn: &mut DbConnection, conn: &mut DbConnection,
region_id: i32, region_id: i32,
death_probability: f64,
pool: &ConnectionPool, pool: &ConnectionPool,
broker: &MessageBroker, broker: &MessageBroker,
rng: &mut impl Rng,
) -> Result<Vec<i32>, DbError> { ) -> Result<Vec<i32>, DbError> {
// Hole alle lebenden Charaktere in der Region // Hole alle lebenden Charaktere in der Region
conn.prepare("get_region_characters_death", QUERY_GET_REGION_CHARACTERS)?; conn.prepare("get_region_characters_death", QUERY_GET_REGION_CHARACTERS)?;
@@ -1480,6 +1493,11 @@ impl EventsWorker {
let mut dead_characters = Vec::new(); let mut dead_characters = Vec::new();
for row in rows { 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<i32> = row let character_id: Option<i32> = row
.get("id") .get("id")
.and_then(|v| v.parse::<i32>().ok()); .and_then(|v| v.parse::<i32>().ok());