From 0968ab6b0bf7017953f7de99daeefebdb8180a1e Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Sat, 22 Nov 2025 13:31:38 +0100 Subject: [PATCH] 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. --- src/worker/user_character.rs | 41 ++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/src/worker/user_character.rs b/src/worker/user_character.rs index eb1c1c8..6b970ea 100644 --- a/src/worker/user_character.rs +++ b/src/worker/user_character.rs @@ -23,25 +23,32 @@ pub struct UserCharacterWorker { dist: Uniform, last_hourly_run: Option, last_pregnancy_run: Option, + last_mood_run: Option, } // SQL-Queries (1:1 aus der C++-Implementierung übernommen, gruppiert nach Themen) const QUERY_GET_USERS_TO_UPDATE: &str = r#" SELECT id, CURRENT_DATE - birthdate::date AS age, health - FROM falukant_data.character + FROM falukant_data."character" WHERE user_id IS NOT NULL; "#; const QUERY_UPDATE_CHARACTERS_HEALTH: &str = r#" - UPDATE falukant_data.character + UPDATE falukant_data."character" SET health = $1 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#" - UPDATE falukant_data.character AS c + UPDATE falukant_data."character" AS c 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#" @@ -393,6 +400,7 @@ impl UserCharacterWorker { dist, last_hourly_run: None, last_pregnancy_run: None, + last_mood_run: None, } } @@ -400,6 +408,7 @@ impl UserCharacterWorker { self.base.set_current_step("UserCharacterWorker iteration"); self.maybe_run_hourly_tasks(); + self.maybe_run_mood_updates(); self.maybe_run_daily_pregnancies(); // Entspricht in etwa der 1-Sekunden-Schleife im C++-Code @@ -434,7 +443,6 @@ impl UserCharacterWorker { fn run_hourly_tasks(&mut self) -> Result<(), DbError> { self.process_character_events()?; - self.update_characters_mood()?; self.handle_credits()?; 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 .base .pool