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:
@@ -23,25 +23,32 @@ pub struct UserCharacterWorker {
|
||||
dist: Uniform<f64>,
|
||||
last_hourly_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)
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user