veloren_common/states/
talk.rs1use super::utils::*;
2use crate::{
3 comp::{CharacterState, InventoryAction, StateUpdate, character_state::OutputEvents},
4 states::{
5 behavior::{CharacterBehavior, JoinData},
6 idle,
7 },
8 uid::Uid,
9};
10use serde::{Deserialize, Serialize};
11use std::time::Duration;
12
13const TURN_RATE: f32 = 40.0;
14const MIN_TALK_TIME: Duration = Duration::from_millis(500);
15
16#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Eq, Hash)]
17pub struct Data {
18 pub timer: Duration,
19 pub max_time: Duration,
20 pub tgt: Option<Uid>,
21}
22
23impl Data {
24 pub fn at(tgt: Option<Uid>) -> Self {
25 Self {
26 timer: Duration::default(),
27 max_time: MIN_TALK_TIME,
28 tgt,
29 }
30 }
31
32 pub fn refreshed(mut self) -> Self {
33 self.max_time = self.timer + MIN_TALK_TIME;
34 self
35 }
36}
37
38impl CharacterBehavior for Data {
39 fn behavior(&self, data: &JoinData, _output_events: &mut OutputEvents) -> StateUpdate {
40 let mut update = StateUpdate::from(data);
41
42 handle_wield(data, &mut update);
43 handle_orientation(data, &mut update, TURN_RATE, None);
44
45 update.character = if self.timer >= self.max_time {
46 CharacterState::Idle(idle::Data::default())
47 } else {
48 CharacterState::Talk(Self {
49 timer: self.timer + Duration::from_secs_f32(data.dt.0),
50 max_time: self.max_time,
51 tgt: self.tgt,
52 })
53 };
54
55 update
56 }
57
58 fn talk(
59 &self,
60 data: &JoinData,
61 _output_events: &mut OutputEvents,
62 tgt: Option<Uid>,
63 ) -> StateUpdate {
64 let mut update = StateUpdate::from(data);
65
66 update.character = CharacterState::Talk(Self {
68 tgt,
69 ..self.refreshed()
70 });
71
72 update
73 }
74
75 fn manipulate_loadout(
76 &self,
77 data: &JoinData,
78 output_events: &mut OutputEvents,
79 inv_action: InventoryAction,
80 ) -> StateUpdate {
81 let mut update = StateUpdate::from(data);
82 handle_manipulate_loadout(data, output_events, &mut update, inv_action);
83 update
84 }
85
86 fn wield(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
87 let mut update = StateUpdate::from(data);
88 attempt_wield(data, &mut update);
89 update
90 }
91
92 fn sit(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
93 let mut update = StateUpdate::from(data);
94 update.character = CharacterState::Idle(idle::Data::default());
95 attempt_sit(data, &mut update);
96 update
97 }
98
99 fn dance(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
100 let mut update = StateUpdate::from(data);
101 update.character = CharacterState::Idle(idle::Data::default());
102 attempt_dance(data, &mut update);
103 update
104 }
105
106 fn stand(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
107 let mut update = StateUpdate::from(data);
108 update.character = CharacterState::Idle(idle::Data::default());
110 update
111 }
112}