veloren_common/states/
skate.rs1use super::utils::*;
2use crate::{
3 comp::{
4 CharacterState, InventoryAction, StateUpdate, character_state::OutputEvents,
5 item::armor::Friction,
6 },
7 states::{
8 behavior::{CharacterBehavior, JoinData},
9 idle,
10 },
11};
12use serde::{Deserialize, Serialize};
13
14#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
15pub struct Data {
16 pub(crate) footwear: Friction,
17 pub turn: f32, pub accelerate: f32, pub sidewalk: f32, }
22
23impl Data {
24 pub fn new(_: &JoinData, footwear: Friction) -> Self {
25 Self {
26 footwear,
27 turn: Default::default(),
28 accelerate: Default::default(),
29 sidewalk: Default::default(),
30 }
31 }
32}
33
34impl CharacterBehavior for Data {
35 fn behavior(&self, data: &JoinData, output_events: &mut OutputEvents) -> StateUpdate {
36 let mut update = StateUpdate::from(data);
37
38 handle_wield(data, &mut update);
39 handle_jump(data, output_events, &mut update, 1.0);
40
41 if !data.physics.skating_active {
42 update.character = CharacterState::Idle(idle::Data {
43 is_sneaking: false,
44 time_entered: *data.time,
45 footwear: Some(self.footwear),
46 });
47 } else {
48 let plane_ori = data.inputs.look_dir.xy();
49 let orthogonal = vek::Vec2::new(plane_ori.y, -plane_ori.x);
50 update.ori = vek::Vec3::new(plane_ori.x, plane_ori.y, 0.0).into();
51 let current_planar_velocity = data.vel.0.xy().magnitude();
52 let long_input = data.inputs.move_dir.dot(plane_ori);
53 let lat_input = data.inputs.move_dir.dot(orthogonal);
54 let acceleration = if long_input.abs() > lat_input.abs() {
55 if long_input > 0.0 {
56 if let CharacterState::Skate(data) = &mut update.character {
57 data.accelerate = 1.0;
58 data.sidewalk = 0.0;
59 }
60 (data.dt.0 * 3.0)
62 .min(8.0 - current_planar_velocity)
63 .max(0.0)
64 } else {
65 if let CharacterState::Skate(data) = &mut update.character {
66 data.accelerate = -1.0;
67 data.sidewalk = 0.0;
68 }
69 (data.dt.0 * 4.0).min(current_planar_velocity)
71 }
72 } else {
73 if let CharacterState::Skate(data) = &mut update.character {
74 data.accelerate = 0.0;
75 data.sidewalk = lat_input;
76 }
77 (0.5 - current_planar_velocity).max(0.0)
79 };
80 if let CharacterState::Skate(skate_data) = &mut update.character {
81 skate_data.turn = orthogonal.dot(data.vel.0.xy());
82 }
83 let delta_vel = acceleration * data.inputs.move_dir;
84 update.vel.0 += vek::Vec3::new(delta_vel.x, delta_vel.y, 0.0);
85 }
86
87 update
88 }
89
90 fn manipulate_loadout(
91 &self,
92 data: &JoinData,
93 output_events: &mut OutputEvents,
94 inv_action: InventoryAction,
95 ) -> StateUpdate {
96 let mut update = StateUpdate::from(data);
97 handle_manipulate_loadout(data, output_events, &mut update, inv_action);
98 update
99 }
100
101 fn wield(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
102 let mut update = StateUpdate::from(data);
103 attempt_wield(data, &mut update);
104 update
105 }
106
107 fn sit(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
108 let mut update = StateUpdate::from(data);
109 attempt_sit(data, &mut update);
110 update
111 }
112
113 fn crawl(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
114 let mut update = StateUpdate::from(data);
115 attempt_crawl(data, &mut update);
116 update
117 }
118
119 fn stand(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
120 let mut update = StateUpdate::from(data);
121 update.character = CharacterState::Idle(idle::Data::default());
123 update
124 }
125}