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,
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<i32> = row
.get("id")
.and_then(|v| v.parse::<i32>().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<Vec<i32>, 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<i32> = row
.get("id")
.and_then(|v| v.parse::<i32>().ok());