Merge branch 'juliancoffee/forgiving_travellers' into 'master'

AI small fixes

See merge request veloren/veloren!2598
This commit is contained in:
Marcel 2021-07-15 08:15:25 +00:00
commit f05fc79fe2
5 changed files with 513 additions and 329 deletions

View File

@ -12,7 +12,7 @@ use vek::*;
use super::dialogue::Subject;
pub const DEFAULT_INTERACTION_TIME: f32 = 3.0;
pub const DEFAULT_INTERACTION_TIME: f32 = 1.0;
pub const TRADE_INTERACTION_TIME: f32 = 300.0;
pub const MAX_LISTEN_DIST: f32 = 100.0;
@ -305,7 +305,7 @@ pub enum SoundKind {
VillagerAlarm,
}
#[derive(Clone, Debug)]
#[derive(Clone, Copy, Debug)]
pub struct Target {
pub target: EcsEntity,
pub hostile: bool,

View File

@ -22,6 +22,7 @@ impl Component for RtSimEntity {
pub enum RtSimEvent {
AddMemory(Memory),
SetMood(Memory),
ForgetEnemy(String),
PrintMemories,
}

View File

@ -500,6 +500,14 @@ pub struct Brain {
impl Brain {
pub fn add_memory(&mut self, memory: Memory) { self.memories.push(memory); }
pub fn forget_enemy(&mut self, to_forget: &str) {
self.memories.retain(|memory| {
!matches!(
&memory.item,
MemoryItem::CharacterFight {name, ..} if name == to_forget)
})
}
pub fn remembers_mood(&self) -> bool {
self.memories
.iter()
@ -528,10 +536,18 @@ impl Brain {
}
pub fn remembers_character(&self, name_to_remember: &str) -> bool {
self.memories.iter().any(|memory| matches!(&memory.item, MemoryItem::CharacterInteraction { name, .. } if name == name_to_remember))
self.memories.iter().any(|memory| {
matches!(
&memory.item,
MemoryItem::CharacterInteraction { name, .. } if name == name_to_remember)
})
}
pub fn remembers_fight_with_character(&self, name_to_remember: &str) -> bool {
self.memories.iter().any(|memory| matches!(&memory.item, MemoryItem::CharacterFight { name, .. } if name == name_to_remember))
self.memories.iter().any(|memory| {
matches!(
&memory.item,
MemoryItem::CharacterFight { name, .. } if name == name_to_remember)
})
}
}

View File

@ -82,6 +82,12 @@ impl RtSim {
.map(|entity| entity.brain.add_memory(memory));
}
pub fn forget_entity_enemy(&mut self, entity: RtSimId, name: &str) {
if let Some(entity) = self.entities.get_mut(entity) {
entity.brain.forget_enemy(name);
}
}
pub fn set_entity_mood(&mut self, entity: RtSimId, memory: Memory) {
self.entities
.get_mut(entity)

File diff suppressed because it is too large Load Diff