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};
9use serde::{Deserialize, Serialize};
10use std::time::Duration;
11
12const TURN_RATE: f32 = 40.0;
13const MIN_TALK_TIME: Duration = Duration::from_millis(500);
14
15#[derive(Copy, Clone, Default, Debug, PartialEq, Serialize, Deserialize, Eq, Hash)]
16pub struct Data {
17    pub timer: Duration,
18}
19
20impl CharacterBehavior for Data {
21    fn behavior(&self, data: &JoinData, _output_events: &mut OutputEvents) -> StateUpdate {
22        let mut update = StateUpdate::from(data);
23
24        handle_wield(data, &mut update);
25        handle_orientation(data, &mut update, TURN_RATE, None);
26
27        update.character = if self.timer >= MIN_TALK_TIME {
28            CharacterState::Idle(idle::Data::default())
29        } else {
30            CharacterState::Talk(Self {
31                timer: self.timer + Duration::from_secs_f32(data.dt.0),
32            })
33        };
34
35        update
36    }
37
38    fn talk(&self, data: &JoinData, _output_events: &mut OutputEvents) -> StateUpdate {
39        let mut update = StateUpdate::from(data);
40
41        // Refresh timer
42        update.character = CharacterState::Talk(Self::default());
43
44        update
45    }
46
47    fn manipulate_loadout(
48        &self,
49        data: &JoinData,
50        output_events: &mut OutputEvents,
51        inv_action: InventoryAction,
52    ) -> StateUpdate {
53        let mut update = StateUpdate::from(data);
54        handle_manipulate_loadout(data, output_events, &mut update, inv_action);
55        update
56    }
57
58    fn wield(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
59        let mut update = StateUpdate::from(data);
60        attempt_wield(data, &mut update);
61        update
62    }
63
64    fn sit(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
65        let mut update = StateUpdate::from(data);
66        update.character = CharacterState::Idle(idle::Data::default());
67        attempt_sit(data, &mut update);
68        update
69    }
70
71    fn dance(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
72        let mut update = StateUpdate::from(data);
73        update.character = CharacterState::Idle(idle::Data::default());
74        attempt_dance(data, &mut update);
75        update
76    }
77
78    fn stand(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
79        let mut update = StateUpdate::from(data);
80        // Try to Fall/Stand up/Move
81        update.character = CharacterState::Idle(idle::Data::default());
82        update
83    }
84}