From e306b3bfe35a5353e6985ae64436c651cb291385 Mon Sep 17 00:00:00 2001 From: Tormod Gjeitnes Hellen Date: Tue, 12 Jul 2022 22:16:12 +0200 Subject: [PATCH] Have the ambushers say something. Very unsure about the way I did this... --- assets/voxygen/i18n/en/npc.ftl | 3 +++ common/src/comp/controller.rs | 1 + server/src/sys/agent.rs | 14 +++++++++++++- server/src/sys/agent/behavior_tree.rs | 11 +++++++---- server/src/sys/agent/behavior_tree/interaction.rs | 12 ++++++++++-- 5 files changed, 34 insertions(+), 7 deletions(-) diff --git a/assets/voxygen/i18n/en/npc.ftl b/assets/voxygen/i18n/en/npc.ftl index 708e649d7b..5d85c35b37 100644 --- a/assets/voxygen/i18n/en/npc.ftl +++ b/assets/voxygen/i18n/en/npc.ftl @@ -92,6 +92,9 @@ npc-speech-merchant_trade_declined = npc-speech-merchant_trade_cancelled_hostile = .a0 = Sorry to cut it short, we have a problem to solve here! .a1 = We'll trade later, I need to take care of this first! +npc-speech-ambush = + .a0 = It's unwise to travel alone! + .a1 = Like stealing candy from a baby! npc-speech-villager_cultist_alarm = .a0 = Lookout! There is a cultist on the loose! .a1 = To arms! The cultists are attacking! diff --git a/common/src/comp/controller.rs b/common/src/comp/controller.rs index 6c87700846..3396f22016 100644 --- a/common/src/comp/controller.rs +++ b/common/src/comp/controller.rs @@ -130,6 +130,7 @@ pub enum UtteranceKind { Hurt, Greeting, Scream, + Ambush, /* Death, * TODO: Wait for more post-death features (i.e. animations) before implementing death * sounds */ diff --git a/server/src/sys/agent.rs b/server/src/sys/agent.rs index d336a01676..b172d040b6 100644 --- a/server/src/sys/agent.rs +++ b/server/src/sys/agent.rs @@ -745,7 +745,13 @@ impl<'a> AgentData<'a> { } } - fn choose_target(&self, agent: &mut Agent, controller: &mut Controller, read_data: &ReadData) { + fn choose_target( + &self, + agent: &mut Agent, + controller: &mut Controller, + read_data: &ReadData, + event_emitter: &mut Emitter, + ) { agent.action_state.timer = 0.0; let mut aggro_on = false; @@ -785,6 +791,12 @@ impl<'a> AgentData<'a> { if self.is_enemy(entity, read_data) { Some((entity, true)) } else if can_ambush(entity, read_data) { + controller.clone().push_utterance(UtteranceKind::Ambush); + self.chat_npc_if_allowed_to_speak( + "npc-speech-ambush".to_string(), + agent, + event_emitter, + ); aggro_on = true; Some((entity, true)) } else if self.should_defend(entity, read_data) { diff --git a/server/src/sys/agent/behavior_tree.rs b/server/src/sys/agent/behavior_tree.rs index e4b6dc79ca..d6e42217b0 100644 --- a/server/src/sys/agent/behavior_tree.rs +++ b/server/src/sys/agent/behavior_tree.rs @@ -455,9 +455,12 @@ fn handle_timed_events(bdata: &mut BehaviorData) -> bool { } if bdata.rng.gen::() < 0.1 { - bdata - .agent_data - .choose_target(bdata.agent, bdata.controller, bdata.read_data); + bdata.agent_data.choose_target( + bdata.agent, + bdata.controller, + bdata.read_data, + bdata.event_emitter, + ); } else { bdata.agent_data.handle_sounds_heard( bdata.agent, @@ -577,7 +580,7 @@ fn do_combat(bdata: &mut BehaviorData) -> bool { read_data.time.0 - selected_at > RETARGETING_THRESHOLD_SECONDS; if !in_aggro_range && is_time_to_retarget { - agent_data.choose_target(agent, controller, read_data); + agent_data.choose_target(agent, controller, read_data, event_emitter); } if aggro_on { diff --git a/server/src/sys/agent/behavior_tree/interaction.rs b/server/src/sys/agent/behavior_tree/interaction.rs index f0216ab0b6..b49a4bdc31 100644 --- a/server/src/sys/agent/behavior_tree/interaction.rs +++ b/server/src/sys/agent/behavior_tree/interaction.rs @@ -94,7 +94,13 @@ pub fn handle_inbox_talk(bdata: &mut BehaviorData) -> bool { { let personality = &rtsim_entity.brain.personality; let standard_response_msg = || -> String { - if personality + if personality.will_ambush { + format!( + "I'm heading to {}! Want to come along? We'll make \ + great travel buddies, hehe.", + destination_name + ) + } else if personality .personality_traits .contains(PersonalityTrait::Extroverted) { @@ -121,7 +127,9 @@ pub fn handle_inbox_talk(bdata: &mut BehaviorData) -> bool { }, )); if rtsim_entity.brain.remembers_character(&tgt_stats.name) { - if personality + if personality.will_ambush { + "Just follow me a bit more, hehe.".to_string() + } else if personality .personality_traits .contains(PersonalityTrait::Extroverted) {