event adjusted for epidemic
This commit is contained in:
@@ -895,17 +895,21 @@ 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!({
|
effect_results.push(json!({
|
||||||
"type": "character_health_change",
|
"type": "character_health_change",
|
||||||
"affected_count": affected_characters.len(),
|
"affected_count": affected_characters.len(),
|
||||||
@@ -920,15 +924,17 @@ impl EventsWorker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
EventEffect::CharacterDeath { probability } => {
|
EventEffect::CharacterDeath { probability } => {
|
||||||
if effect_roll < *probability {
|
// WICHTIG: Bei regionalen Ereignissen ist `probability` als
|
||||||
// Für regionale Ereignisse: Betrifft alle Charaktere in der Region
|
// "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(
|
if let Ok(dead_characters) = Self::apply_regional_character_death(
|
||||||
&mut conn,
|
&mut conn,
|
||||||
region_id,
|
region_id,
|
||||||
|
*probability,
|
||||||
pool,
|
pool,
|
||||||
broker,
|
broker,
|
||||||
|
rng,
|
||||||
) {
|
) {
|
||||||
effect_results.push(json!({
|
effect_results.push(json!({
|
||||||
"type": "character_death",
|
"type": "character_death",
|
||||||
@@ -937,7 +943,6 @@ impl EventsWorker {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
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());
|
||||||
|
|||||||
Reference in New Issue
Block a user