Add mood update functionality: Introduced a new mechanism for random mood updates in UserCharacterWorker, allowing characters to change mood approximately every 50 minutes. Updated SQL queries to ensure proper handling of character data.

This commit is contained in:
Torsten Schulz (local)
2025-11-22 13:31:38 +01:00
parent 071c05629e
commit 0968ab6b0b

View File

@@ -23,25 +23,32 @@ pub struct UserCharacterWorker {
dist: Uniform<f64>, dist: Uniform<f64>,
last_hourly_run: Option<Instant>, last_hourly_run: Option<Instant>,
last_pregnancy_run: Option<Instant>, last_pregnancy_run: Option<Instant>,
last_mood_run: Option<Instant>,
} }
// SQL-Queries (1:1 aus der C++-Implementierung übernommen, gruppiert nach Themen) // SQL-Queries (1:1 aus der C++-Implementierung übernommen, gruppiert nach Themen)
const QUERY_GET_USERS_TO_UPDATE: &str = r#" const QUERY_GET_USERS_TO_UPDATE: &str = r#"
SELECT id, CURRENT_DATE - birthdate::date AS age, health SELECT id, CURRENT_DATE - birthdate::date AS age, health
FROM falukant_data.character FROM falukant_data."character"
WHERE user_id IS NOT NULL; WHERE user_id IS NOT NULL;
"#; "#;
const QUERY_UPDATE_CHARACTERS_HEALTH: &str = r#" const QUERY_UPDATE_CHARACTERS_HEALTH: &str = r#"
UPDATE falukant_data.character UPDATE falukant_data."character"
SET health = $1 SET health = $1
WHERE id = $2; WHERE id = $2;
"#; "#;
// Mood-Update mit zufälliger Auswahl pro Charakter:
// Jeder lebende Charakter hat pro Aufruf (ca. 1x pro Minute)
// eine kleine Chance auf Mood-Wechsel. Die Bedingung `random() < 1.0 / 50.0`
// ergibt im Erwartungswert ca. alle 50 Minuten einen Wechsel, verteilt
// individuell und zufällig.
const QUERY_UPDATE_MOOD: &str = r#" const QUERY_UPDATE_MOOD: &str = r#"
UPDATE falukant_data.character AS c UPDATE falukant_data."character" AS c
SET mood_id = falukant_data.get_random_mood_id() SET mood_id = falukant_data.get_random_mood_id()
WHERE c.health > 0; WHERE c.health > 0
AND random() < (1.0 / 50.0);
"#; "#;
const QUERY_UPDATE_GET_ITEMS_TO_UPDATE: &str = r#" const QUERY_UPDATE_GET_ITEMS_TO_UPDATE: &str = r#"
@@ -393,6 +400,7 @@ impl UserCharacterWorker {
dist, dist,
last_hourly_run: None, last_hourly_run: None,
last_pregnancy_run: None, last_pregnancy_run: None,
last_mood_run: None,
} }
} }
@@ -400,6 +408,7 @@ impl UserCharacterWorker {
self.base.set_current_step("UserCharacterWorker iteration"); self.base.set_current_step("UserCharacterWorker iteration");
self.maybe_run_hourly_tasks(); self.maybe_run_hourly_tasks();
self.maybe_run_mood_updates();
self.maybe_run_daily_pregnancies(); self.maybe_run_daily_pregnancies();
// Entspricht in etwa der 1-Sekunden-Schleife im C++-Code // Entspricht in etwa der 1-Sekunden-Schleife im C++-Code
@@ -434,7 +443,6 @@ impl UserCharacterWorker {
fn run_hourly_tasks(&mut self) -> Result<(), DbError> { fn run_hourly_tasks(&mut self) -> Result<(), DbError> {
self.process_character_events()?; self.process_character_events()?;
self.update_characters_mood()?;
self.handle_credits()?; self.handle_credits()?;
Ok(()) Ok(())
} }
@@ -544,7 +552,28 @@ impl UserCharacterWorker {
} }
} }
fn update_characters_mood(&mut self) -> Result<(), DbError> { fn maybe_run_mood_updates(&mut self) {
let now = Instant::now();
let should_run = match self.last_mood_run {
None => true,
Some(last) => now.saturating_duration_since(last) >= Duration::from_secs(60),
};
if !should_run {
return;
}
if let Err(err) = self.update_characters_mood_randomized() {
eprintln!("[UserCharacterWorker] Fehler in updateCharactersMood: {err}");
}
self.last_mood_run = Some(now);
}
/// Setzt die Stimmung einzelner lebender Charaktere zufällig neu.
/// Jeder Charakter hat pro Minute eine kleine Chance auf einen Wechsel,
/// so dass sich über die Zeit ein individueller, zufälliger Rhythmus entsteht.
fn update_characters_mood_randomized(&mut self) -> Result<(), DbError> {
let mut conn = self let mut conn = self
.base .base
.pool .pool