Fix bug that leads to some players never having urges like hunger

This commit is contained in:
Condorra 2023-10-01 17:03:11 +11:00
parent 50f23e1c56
commit 472bdb4f0e
2 changed files with 29 additions and 8 deletions

View File

@ -10,7 +10,7 @@ use crate::{
task::{Task, TaskDetails, TaskMeta, TaskRecurrence}, task::{Task, TaskDetails, TaskMeta, TaskRecurrence},
}, },
regular_tasks::{TaskHandler, TaskRunContext}, regular_tasks::{TaskHandler, TaskRunContext},
static_content::{species::SpeciesType, StaticTask}, static_content::{npc::npc_by_code, species::SpeciesType, StaticTask},
DResult, DResult,
}; };
use async_trait::async_trait; use async_trait::async_trait;
@ -274,9 +274,27 @@ pub fn urge_tasks() -> Box<dyn Iterator<Item = StaticTask>> {
) )
} }
pub async fn set_has_urges_if_needed(trans: &DBTrans, player_item: &mut Item) -> DResult<()> { pub fn ever_has_urges(item: &mut Item) -> bool {
let mut has_urges = player_item.death_data.is_none() match item.item_type.as_str() {
&& match player_item.urges { "player" => true,
"npc"
if npc_by_code()
.get(item.item_code.as_str())
.map(|npc| npc.has_urges)
.unwrap_or(false) =>
{
true
}
_ => false,
}
}
pub async fn set_has_urges_if_needed(trans: &DBTrans, item: &mut Item) -> DResult<()> {
if !ever_has_urges(item) {
return Ok(());
}
let mut has_urges = item.death_data.is_none()
&& match item.urges {
None => false, None => false,
Some(Urges { Some(Urges {
hunger: Urge { growth: hunger, .. }, hunger: Urge { growth: hunger, .. },
@ -286,7 +304,7 @@ pub async fn set_has_urges_if_needed(trans: &DBTrans, player_item: &mut Item) ->
}) => hunger != 0 || stress != 0 || thirst != 0, }) => hunger != 0 || stress != 0 || thirst != 0,
}; };
if has_urges { if has_urges {
match player_item.location.split_once("/") { match item.location.split_once("/") {
None => {} None => {}
Some((loc_type, loc_code)) => { Some((loc_type, loc_code)) => {
has_urges |= trans has_urges |= trans
@ -298,9 +316,9 @@ pub async fn set_has_urges_if_needed(trans: &DBTrans, player_item: &mut Item) ->
} }
} }
if has_urges { if has_urges {
player_item.flags.push(ItemFlag::HasUrges); item.flags.push(ItemFlag::HasUrges);
} else { } else {
player_item.flags = player_item item.flags = item
.flags .flags
.clone() .clone()
.into_iter() .into_iter()
@ -334,7 +352,7 @@ pub async fn change_stress_considering_cool(
stress_changed(trans, who).await stress_changed(trans, who).await
} }
pub async fn recalculate_urge_growth(_trans: &DBTrans, item: &mut Item) -> DResult<()> { pub async fn recalculate_urge_growth(trans: &DBTrans, item: &mut Item) -> DResult<()> {
let cool = item.total_stats.get(&StatType::Cool).unwrap_or(&8.0); let cool = item.total_stats.get(&StatType::Cool).unwrap_or(&8.0);
let relax_action_factor = match item.action_type { let relax_action_factor = match item.action_type {
LocationActionType::Sitting(_) => 100.0, LocationActionType::Sitting(_) => 100.0,
@ -358,5 +376,6 @@ pub async fn recalculate_urge_growth(_trans: &DBTrans, item: &mut Item) -> DResu
..old_urges.stress ..old_urges.stress
}, },
}); });
set_has_urges_if_needed(trans, item).await?;
Ok(()) Ok(())
} }

View File

@ -115,6 +115,7 @@ pub struct NPC {
pub player_consents: Vec<ConsentType>, pub player_consents: Vec<ConsentType>,
pub hire_data: Option<HireData>, pub hire_data: Option<HireData>,
pub extra_flags: Vec<ItemFlag>, pub extra_flags: Vec<ItemFlag>,
pub has_urges: bool,
} }
impl Default for NPC { impl Default for NPC {
@ -150,6 +151,7 @@ impl Default for NPC {
player_consents: vec![], player_consents: vec![],
hire_data: None, hire_data: None,
extra_flags: vec![], extra_flags: vec![],
has_urges: false,
} }
} }
} }