veloren_common/states/
talk.rs

1use 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        // Refresh timer
67        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        // Try to Fall/Stand up/Move
109        update.character = CharacterState::Idle(idle::Data::default());
110        update
111    }
112}