wolfrpg_map_parser/command/picture_command/
show.rs1use crate::byte_utils::{as_u32_le, parse_string};
2use crate::common::u32_or_string::U32OrString;
3use crate::command::picture_command::display_type::DisplayType;
4use crate::command::picture_command::options::Options;
5use crate::byte_utils::parse_optional_string;
6#[cfg(feature = "serde")]
7use serde::{Serialize, Deserialize};
8use state::State;
9
10pub mod state;
11pub mod base;
12pub mod free_transform;
13pub mod delay;
14mod parser;
15pub mod zoom;
16pub mod color_values;
17mod range_fields;
18mod color_values_fields;
19mod zoom_fields;
20mod free_transform_fields;
21mod delay_fields;
22pub mod range;
23mod colors_fields;
24pub mod colors;
25mod parsable_fields;
26
27#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
28#[derive(PartialEq, Clone)]
29pub struct Show {
30 options: Options,
31 picture: u32,
32 process_time: u32,
33 division_width: u32,
34 division_height: u32,
35 pattern: u32,
36 opacity: u32,
37 zoom: u32,
38 angle: u32,
39 state: State,
40 filename: Option<U32OrString>,
41 string: Option<String>,
42}
43
44type StateParser = fn(&[u8], &Options) -> (usize, Option<u32>, State);
45
46impl Show {
47 fn parse(bytes: &[u8], parse_state: StateParser) -> (usize, Self) {
48 let mut offset: usize = 0;
49
50 let options: u32 = as_u32_le(&bytes[offset..offset+4]);
51 let options: Options = Options::new(options);
52 offset += 4;
53
54 let picture: u32 = as_u32_le(&bytes[offset..offset+4]);
55 offset += 4;
56
57 let process_time: u32 = as_u32_le(&bytes[offset..offset+4]);
58 offset += 4;
59
60 let division_width: u32 = as_u32_le(&bytes[offset..offset+4]);
61 offset += 4;
62
63 let division_height: u32 = as_u32_le(&bytes[offset..offset+4]);
64 offset += 4;
65
66 let pattern: u32 = as_u32_le(&bytes[offset..offset+4]);
67 offset += 4;
68
69 let opacity: u32 = as_u32_le(&bytes[offset..offset+4]);
70 offset += 4;
71
72 let zoom: u32 = as_u32_le(&bytes[offset+8..offset+12]);
73 let angle: u32 = as_u32_le(&bytes[offset+12..offset+16]);
74
75 let (bytes_read, filename_variable, state): (usize, Option<u32>, State)
76 = parse_state(&bytes[offset..], &options);
77 offset += bytes_read;
78
79 let (bytes_read, string_value): (usize, Option<String>)
80 = Self::parse_string_value(&bytes[offset..]);
81 offset += bytes_read;
82
83 let (filename, string): (Option<U32OrString>, Option<String>)
84 = Self::make_filename_and_string(string_value, filename_variable, &options);
85
86 offset += 1; (offset, Self {
89 options,
90 picture,
91 process_time,
92 division_width,
93 division_height,
94 pattern,
95 opacity,
96 zoom,
97 angle,
98 state,
99 filename,
100 string
101 })
102 }
103 fn parse_string_value(bytes: &[u8]) -> (usize, Option<String>) {
104 let mut offset: usize = 0;
105
106 let is_filename_string: bool = bytes[offset] != 0;
107 offset += 1;
108
109 let string_value: Option<String>
110 = parse_optional_string!(bytes, offset, is_filename_string);
111
112 (offset, string_value)
113 }
114
115 fn make_filename_and_string(string_value: Option<String>, filename_variable: Option<u32>,
116 options: &Options) -> (Option<U32OrString>, Option<String>) {
117 let (filename, string): (Option<String>, Option<String>) = match *options.display_type() {
118 DisplayType::StringAsPicture => (None, string_value),
119 _ => (string_value, None)
120 };
121
122 let filename: Option<U32OrString> = match filename {
123 Some(filename) => Some(U32OrString::String(filename)),
124 None => filename_variable.map(U32OrString::U32)
125 };
126
127 (filename, string)
128 }
129
130 pub(crate) fn parse_base(bytes: &[u8]) -> (usize, Self) {
131 Self::parse(bytes, State::parse_base)
132 }
133
134 pub(crate) fn parse_colors(bytes: &[u8]) -> (usize, Self) {
135 Self::parse(bytes, State::parse_colors)
136 }
137
138 pub(crate) fn parse_delay(bytes: &[u8]) -> (usize, Self) {
139 Self::parse(bytes, State::parse_delay)
140 }
141
142 pub(crate) fn parse_range(bytes: &[u8]) -> (usize, Self) {
143 Self::parse(bytes, State::parse_range)
144 }
145
146 pub(crate) fn parse_color_values(bytes: &[u8]) -> (usize, Self) {
147 Self::parse(bytes, State::parse_color_values)
148 }
149
150 pub(crate) fn parse_zoom(bytes: &[u8]) -> (usize, Self) {
151 Self::parse(bytes, State::parse_zoom)
152 }
153
154 pub(crate) fn parse_free_transform(bytes: &[u8]) -> (usize, Self) {
155 Self::parse(bytes, State::parse_free_transform)
156 }
157
158 pub fn options(&self) -> &Options {
159 &self.options
160 }
161
162 pub fn options_mut(&mut self) -> &mut Options {
163 &mut self.options
164 }
165
166 pub fn picture(&self) -> u32 {
167 self.picture
168 }
169
170 pub fn picture_mut(&mut self) -> &mut u32 {
171 &mut self.picture
172 }
173
174 pub fn process_time(&self) -> u32 {
175 self.process_time
176 }
177
178 pub fn process_time_mut(&mut self) -> &mut u32 {
179 &mut self.process_time
180 }
181
182 pub fn division_width(&self) -> u32 {
183 self.division_width
184 }
185
186 pub fn division_width_mut(&mut self) -> &mut u32 {
187 &mut self.division_width
188 }
189
190 pub fn division_height(&self) -> u32 {
191 self.division_height
192 }
193
194 pub fn division_height_mut(&mut self) -> &mut u32 {
195 &mut self.division_height
196 }
197
198 pub fn pattern(&self) -> u32 {
199 self.pattern
200 }
201
202 pub fn pattern_mut(&mut self) -> &mut u32 {
203 &mut self.pattern
204 }
205
206 pub fn opacity(&self) -> u32 {
207 self.opacity
208 }
209
210 pub fn opacity_mut(&mut self) -> &mut u32 {
211 &mut self.opacity
212 }
213
214 pub fn zoom(&self) -> u32 {
215 self.zoom
216 }
217
218 pub fn zoom_mut(&mut self) -> &mut u32 {
219 &mut self.zoom
220 }
221
222 pub fn angle(&self) -> u32 {
223 self.angle
224 }
225
226 pub fn angle_mut(&mut self) -> &mut u32 {
227 &mut self.angle
228 }
229
230 pub fn state(&self) -> &State {
231 &self.state
232 }
233
234 pub fn state_mut(&mut self) -> &mut State {
235 &mut self.state
236 }
237
238 pub fn filename(&self) -> &Option<U32OrString> {
239 &self.filename
240 }
241
242 pub fn filename_mut(&mut self) -> &mut Option<U32OrString> {
243 &mut self.filename
244 }
245
246 pub fn string(&self) -> &Option<String> {
247 &self.string
248 }
249
250 pub fn string_mut(&mut self) -> &mut Option<String> {
251 &mut self.string
252 }
253}