wolfrpg_map_parser/common/move/
state.rs1#[cfg(feature = "serde")]
2use serde::{Serialize, Deserialize};
3use crate::byte_utils::as_u32_le;
4use crate::common::r#move::move_type::MoveType;
5
6#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
7#[derive(PartialEq, Clone)]
8pub enum State {
9 ApproachEvent {
10 event: u32,
11 },
12 Jump {
13 right: i32,
14 down: i32,
15 },
16 ApproachPosition {
17 x: u32,
18 y: u32,
19 },
20 SetVariable {
21 variable: u32,
22 value: u32,
23 },
24 AddToVariable {
25 variable: u32,
26 value: u32,
27 },
28 SetMoveSpeed {
29 speed: u32,
30 },
31 SetAnimationSpeed {
32 speed: u32,
33 },
34 SetMoveFrequency {
35 frequency: u32,
36 },
37 SetGraphic {
38 graphic: u32,
39 },
40 SetOpacity {
41 opacity: u32,
42 },
43 SetHeight {
44 height: u32,
45 },
46 PlaySound {
47 sound: u32,
48 },
49 WaitFrames {
50 frame_count: u32,
51 },
52 None
53}
54
55impl State {
56 pub(crate) fn parse(bytes: &[u8], move_type: &MoveType) -> (usize, Self) {
57 match *move_type {
58 MoveType::ApproachEvent => {
59 Self::parse_approach_event(bytes)
60 },
61 MoveType::Jump => {
62 Self::parse_jump(bytes)
63 },
64 MoveType::ApproachPosition => {
65 Self::parse_approach_position(bytes)
66 },
67 MoveType::SetVariable => {
68 Self::parse_set_variable(bytes)
69 },
70 MoveType::AddToVariable => {
71 Self::parse_add_to_variable(bytes)
72 },
73 MoveType::SetMoveSpeed => {
74 Self::parse_set_move_speed(bytes)
75 },
76 MoveType::SetAnimationSpeed => {
77 Self::parse_set_animation_speed(bytes)
78 },
79 MoveType::SetMoveFrequency => {
80 Self::parse_move_frequency(bytes)
81 },
82 MoveType::SetGraphic => {
83 Self::parse_set_graphic(bytes)
84 },
85 MoveType::SetOpacity => {
86 Self::parse_set_opacity(bytes)
87 },
88 MoveType::SetHeight => {
89 Self::parse_set_height(bytes)
90 },
91 MoveType::PlaySound => {
92 Self::parse_play_sound(bytes)
93 },
94 MoveType::WaitFrames => {
95 Self::parse_wait_frames(bytes)
96 },
97 _ => (0, Self::None),
98 }
99 }
100
101 fn parse_approach_event(bytes: &[u8]) -> (usize, State) {
102 let mut offset: usize = 0;
103
104 let event: u32 = as_u32_le(&bytes[offset..offset + 4]);
105 offset += 4;
106
107 (offset, Self::ApproachEvent {
108 event,
109 })
110 }
111
112 fn parse_jump(bytes: &[u8]) -> (usize, State) {
113 let mut offset: usize = 0;
114
115 let right: i32 = as_u32_le(&bytes[offset..offset + 4]) as i32;
116 offset += 4;
117
118 let down: i32 = as_u32_le(&bytes[offset..offset + 4]) as i32;
119 offset += 4;
120
121 (offset, Self::Jump {
122 right,
123 down,
124 })
125 }
126
127 fn parse_approach_position(bytes: &[u8]) -> (usize, State) {
128 let mut offset: usize = 0;
129
130 let x: u32 = as_u32_le(&bytes[offset..offset + 4]);
131 offset += 4;
132
133 let y: u32 = as_u32_le(&bytes[offset..offset + 4]);
134 offset += 4;
135
136 (offset, Self::ApproachPosition {
137 x,
138 y,
139 })
140 }
141
142 fn parse_set_variable(bytes: &[u8]) -> (usize, State) {
143 let mut offset: usize = 0;
144
145 let variable: u32 = as_u32_le(&bytes[offset..offset + 4]);
146 offset += 4;
147
148 let value: u32 = as_u32_le(&bytes[offset..offset + 4]);
149 offset += 4;
150
151 (offset, Self::SetVariable {
152 variable,
153 value,
154 })
155 }
156
157 fn parse_add_to_variable(bytes: &[u8]) -> (usize, State) {
158 let mut offset: usize = 0;
159
160 let variable: u32 = as_u32_le(&bytes[offset..offset + 4]);
161 offset += 4;
162
163 let value: u32 = as_u32_le(&bytes[offset..offset + 4]);
164 offset += 4;
165
166 (offset, Self::AddToVariable {
167 variable,
168 value,
169 })
170 }
171
172 fn parse_set_move_speed(bytes: &[u8]) -> (usize, State) {
173 let mut offset: usize = 0;
174
175 let speed: u32 = as_u32_le(&bytes[offset..offset + 4]);
176 offset += 4;
177
178 (offset, Self::SetMoveSpeed {
179 speed,
180 })
181 }
182
183 fn parse_set_animation_speed(bytes: &[u8]) -> (usize, State) {
184 let mut offset: usize = 0;
185
186 let speed: u32 = as_u32_le(&bytes[offset..offset + 4]);
187 offset += 4;
188
189 (offset, Self::SetAnimationSpeed {
190 speed,
191 })
192 }
193
194 fn parse_move_frequency(bytes: &[u8]) -> (usize, State) {
195 let mut offset: usize = 0;
196
197 let frequency: u32 = as_u32_le(&bytes[offset..offset + 4]);
198 offset += 4;
199
200 (offset, Self::SetMoveFrequency {
201 frequency,
202 })
203 }
204
205 fn parse_set_graphic(bytes: &[u8]) -> (usize, State) {
206 let mut offset: usize = 0;
207
208 let graphic: u32 = as_u32_le(&bytes[offset..offset + 4]);
209 offset += 4;
210
211 (offset, Self::SetGraphic {
212 graphic,
213 })
214 }
215
216 fn parse_set_opacity(bytes: &[u8]) -> (usize, State) {
217 let mut offset: usize = 0;
218
219 let opacity: u32 = as_u32_le(&bytes[offset..offset + 4]);
220 offset += 4;
221
222 (offset, Self::SetOpacity {
223 opacity,
224 })
225 }
226
227 fn parse_set_height(bytes: &[u8]) -> (usize, State) {
228 let mut offset: usize = 0;
229
230 let height: u32 = as_u32_le(&bytes[offset..offset + 4]);
231 offset += 4;
232
233 (offset, Self::SetHeight {
234 height,
235 })
236 }
237
238 fn parse_play_sound(bytes: &[u8]) -> (usize, State) {
239 let mut offset: usize = 0;
240
241 let sound: u32 = as_u32_le(&bytes[offset..offset + 4]);
242 offset += 4;
243
244 (offset, Self::PlaySound {
245 sound,
246 })
247 }
248
249 fn parse_wait_frames(bytes: &[u8]) -> (usize, State) {
250 let mut offset: usize = 0;
251
252 let frame_count: u32 = as_u32_le(&bytes[offset..offset + 4]);
253 offset += 4;
254
255 (offset, Self::WaitFrames {
256 frame_count,
257 })
258 }
259}