event adjusted for epidemic
This commit is contained in:
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user