wolfrpg_map_parser/common/move/
state.rs

1#[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}