veloren_common/states/
crawl.rs

1use super::utils::*;
2use crate::{
3    comp::{CharacterState, StateUpdate, character_state::OutputEvents},
4    states::behavior::{CharacterBehavior, JoinData},
5};
6use serde::{Deserialize, Serialize};
7
8#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Default)]
9pub struct Data;
10
11fn can_stand(data: &JoinData) -> bool {
12    data.health
13        .is_none_or(|health| !health.has_consumed_death_protection())
14}
15
16// NOTE: In the future we might want to allow using some items while downed, but
17// right now we just ignore those events.
18impl CharacterBehavior for Data {
19    fn behavior(&self, data: &JoinData, output_events: &mut OutputEvents) -> StateUpdate {
20        let mut update = StateUpdate::from(data);
21
22        leave_stance(data, output_events);
23        handle_orientation(data, &mut update, 0.2, None);
24        handle_move(data, &mut update, 0.2);
25
26        update
27    }
28
29    fn sit(&self, data: &JoinData, _output_events: &mut OutputEvents) -> StateUpdate {
30        let mut update = StateUpdate::from(data);
31        if can_stand(data) {
32            attempt_sit(data, &mut update);
33        }
34        update
35    }
36
37    fn stand(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
38        let mut update = StateUpdate::from(data);
39        if can_stand(data) {
40            update.character = CharacterState::Idle(Default::default());
41        }
42        update
43    }
44
45    fn dance(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
46        let mut update = StateUpdate::from(data);
47        if can_stand(data) {
48            attempt_dance(data, &mut update);
49        }
50        update
51    }
52}