Mercurial > touhou
annotate formats/src/th06/anm0.rs @ 776:94033091458b
formats: Update to ${concat(…)} to build on current nightly
${concat(…)} replaces the removed concat_idents!() macro, but doesn’t support
being used in nested repetitions for now. We can remove the gen_match!() macro
once this is supported again.
| author | Link Mauve <linkmauve@linkmauve.fr> |
|---|---|
| date | Tue, 14 Oct 2025 12:41:29 +0000 |
| parents | d08eb4c9fce3 |
| children |
| rev | line source |
|---|---|
| 638 | 1 //! ANM0 animation format support. |
| 2 | |
| 3 use nom::{ | |
| 4 IResult, | |
|
774
d08eb4c9fce3
formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents:
766
diff
changeset
|
5 Parser, |
| 638 | 6 bytes::complete::{tag, take_while_m_n}, |
|
639
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
7 number::complete::{le_u8, le_u16, le_u32, le_i32, le_f32}, |
|
713
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
8 multi::{many_m_n, many0}, |
| 638 | 9 }; |
|
765
2a5279168d5a
formats: Use a BTreeMap instead of a HashMap for scripts
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
757
diff
changeset
|
10 use std::collections::BTreeMap; |
| 638 | 11 |
| 12 /// Coordinates of a sprite into the image. | |
| 13 #[derive(Debug, Clone)] | |
| 14 pub struct Sprite { | |
|
639
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
15 /// Index inside the anm0. |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
16 pub index: u32, |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
17 |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
18 /// X coordinate in the sprite sheet. |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
19 pub x: f32, |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
20 |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
21 /// Y coordinate in the sprite sheet. |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
22 pub y: f32, |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
23 |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
24 /// Width of the sprite. |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
25 pub width: f32, |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
26 |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
27 /// Height of the sprite. |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
28 pub height: f32, |
| 638 | 29 } |
| 30 | |
| 31 /// A single instruction, part of a `Script`. | |
| 32 #[derive(Debug, Clone)] | |
|
639
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
33 pub struct Call { |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
34 /// Time at which this instruction will be called. |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
35 pub time: u16, |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
36 |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
37 /// The instruction to call. |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
38 pub instr: Instruction, |
| 638 | 39 } |
| 40 | |
| 41 /// Script driving an animation. | |
| 42 #[derive(Debug, Clone)] | |
| 43 pub struct Script { | |
|
639
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
44 /// List of instructions in this script. |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
45 pub instructions: Vec<Call>, |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
46 |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
47 /// List of interrupts in this script. |
|
765
2a5279168d5a
formats: Use a BTreeMap instead of a HashMap for scripts
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
757
diff
changeset
|
48 pub interrupts: BTreeMap<i32, u8> |
| 638 | 49 } |
| 50 | |
| 51 /// Main struct of the ANM0 animation format. | |
| 52 #[derive(Debug, Clone)] | |
| 53 pub struct Anm0 { | |
| 54 /// Resolution of the image used by this ANM. | |
| 55 pub size: (u32, u32), | |
| 56 | |
| 57 /// Format of this ANM. | |
|
766
8a3b8e2ffa24
formats: Expose color_key on Anm0
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
765
diff
changeset
|
58 // TODO: use an enum for that. |
| 638 | 59 pub format: u32, |
| 60 | |
|
766
8a3b8e2ffa24
formats: Expose color_key on Anm0
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
765
diff
changeset
|
61 /// Color key, probably used for transparency. |
|
8a3b8e2ffa24
formats: Expose color_key on Anm0
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
765
diff
changeset
|
62 pub color_key: u32, |
|
8a3b8e2ffa24
formats: Expose color_key on Anm0
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
765
diff
changeset
|
63 |
| 638 | 64 /// File name of the main image. |
|
704
84af5bedbde4
anmrenderer: also load the alpha PNG.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
702
diff
changeset
|
65 pub png_filename: String, |
| 638 | 66 |
| 67 /// File name of an alpha channel image. | |
|
704
84af5bedbde4
anmrenderer: also load the alpha PNG.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
702
diff
changeset
|
68 pub alpha_filename: Option<String>, |
| 638 | 69 |
| 70 /// A list of sprites, coordinates into the attached image. | |
| 71 pub sprites: Vec<Sprite>, | |
| 72 | |
| 73 /// A map of scripts. | |
|
765
2a5279168d5a
formats: Use a BTreeMap instead of a HashMap for scripts
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
757
diff
changeset
|
74 pub scripts: BTreeMap<u8, Script>, |
| 638 | 75 } |
| 76 | |
| 77 impl Anm0 { | |
| 78 /// Parse a slice of bytes into an `Anm0` struct. | |
|
701
b6c351ca0a35
anm0: return the nom IResult and the list of Anm0s.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
694
diff
changeset
|
79 pub fn from_slice(data: &[u8]) -> IResult<&[u8], Vec<Anm0>> { |
|
774
d08eb4c9fce3
formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents:
766
diff
changeset
|
80 many0(parse_anm0).parse(data) |
| 638 | 81 } |
|
643
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
639
diff
changeset
|
82 |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
639
diff
changeset
|
83 /// TODO |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
639
diff
changeset
|
84 pub fn inv_size(&self) -> (f32, f32) { |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
639
diff
changeset
|
85 let (x, y) = self.size; |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
639
diff
changeset
|
86 (1. / x as f32, 1. / y as f32) |
|
01849ffd0180
Add an anmrenderer binary.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
639
diff
changeset
|
87 } |
| 638 | 88 } |
| 89 | |
|
702
718348c7608e
anm0: simplify parsing with more combinators.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
701
diff
changeset
|
90 fn parse_name(i: &[u8]) -> IResult<&[u8], String> { |
| 638 | 91 let (_, slice) = take_while_m_n(0, 32, |c| c != 0)(i)?; |
|
694
3ff1af76e413
anm0: only use recoverable errors, no panics except for anm0 asserts.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
645
diff
changeset
|
92 let string = match String::from_utf8(slice.to_vec()) { |
|
3ff1af76e413
anm0: only use recoverable errors, no panics except for anm0 asserts.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
645
diff
changeset
|
93 Ok(string) => string, |
|
3ff1af76e413
anm0: only use recoverable errors, no panics except for anm0 asserts.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
645
diff
changeset
|
94 // XXX: use a more specific error instead. |
|
755
fc937d93a57c
Bump nom to version 6, and image to 0.23.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
713
diff
changeset
|
95 Err(_) => return Err(nom::Err::Failure(nom::error::Error::new(i, nom::error::ErrorKind::Eof))) |
|
694
3ff1af76e413
anm0: only use recoverable errors, no panics except for anm0 asserts.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
645
diff
changeset
|
96 }; |
| 638 | 97 Ok((i, string)) |
| 98 } | |
| 99 | |
| 100 fn parse_sprite(i: &[u8]) -> IResult<&[u8], Sprite> { | |
|
774
d08eb4c9fce3
formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents:
766
diff
changeset
|
101 let (i, (index, x, y, width, height)) = (le_u32, le_f32, le_f32, le_f32, le_f32).parse(i)?; |
| 638 | 102 Ok((i, Sprite { |
| 103 index, | |
| 104 x, | |
| 105 y, | |
| 106 width, | |
| 107 height, | |
| 108 })) | |
| 109 } | |
| 110 | |
|
776
94033091458b
formats: Update to ${concat(…)} to build on current nightly
Link Mauve <linkmauve@linkmauve.fr>
parents:
774
diff
changeset
|
111 macro_rules! gen_match { |
|
94033091458b
formats: Update to ${concat(…)} to build on current nightly
Link Mauve <linkmauve@linkmauve.fr>
parents:
774
diff
changeset
|
112 ($arg_type:ident) => { |
|
94033091458b
formats: Update to ${concat(…)} to build on current nightly
Link Mauve <linkmauve@linkmauve.fr>
parents:
774
diff
changeset
|
113 ${concat(le_, $arg_type)} |
|
94033091458b
formats: Update to ${concat(…)} to build on current nightly
Link Mauve <linkmauve@linkmauve.fr>
parents:
774
diff
changeset
|
114 }; |
|
94033091458b
formats: Update to ${concat(…)} to build on current nightly
Link Mauve <linkmauve@linkmauve.fr>
parents:
774
diff
changeset
|
115 } |
|
94033091458b
formats: Update to ${concat(…)} to build on current nightly
Link Mauve <linkmauve@linkmauve.fr>
parents:
774
diff
changeset
|
116 |
|
639
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
117 macro_rules! declare_anm_instructions { |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
118 ($($opcode:tt => fn $name:ident($($arg:ident: $arg_type:ident),*)),*,) => { |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
119 /// Available instructions in an `Anm0`. |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
120 #[allow(missing_docs)] |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
121 #[derive(Debug, Clone, Copy)] |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
122 pub enum Instruction { |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
123 $( |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
124 $name($($arg_type),*) |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
125 ),* |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
126 } |
| 638 | 127 |
|
694
3ff1af76e413
anm0: only use recoverable errors, no panics except for anm0 asserts.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
645
diff
changeset
|
128 fn parse_instruction_args(mut i: &[u8], opcode: u8) -> IResult<&[u8], Instruction> { |
|
639
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
129 let instr = match opcode { |
| 638 | 130 $( |
| 131 $opcode => { | |
| 132 $( | |
|
776
94033091458b
formats: Update to ${concat(…)} to build on current nightly
Link Mauve <linkmauve@linkmauve.fr>
parents:
774
diff
changeset
|
133 let (i2, $arg) = gen_match!($arg_type)(i)?; |
| 638 | 134 i = i2; |
| 135 )* | |
|
639
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
136 Instruction::$name($($arg),*) |
| 638 | 137 } |
| 138 )* | |
|
694
3ff1af76e413
anm0: only use recoverable errors, no panics except for anm0 asserts.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
645
diff
changeset
|
139 // XXX: use a more specific error instead. |
|
755
fc937d93a57c
Bump nom to version 6, and image to 0.23.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
713
diff
changeset
|
140 _ => return Err(nom::Err::Failure(nom::error::Error::new(i, nom::error::ErrorKind::Eof))) |
|
639
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
141 }; |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
142 Ok((i, instr)) |
| 638 | 143 } |
| 144 }; | |
| 145 } | |
| 146 | |
| 147 declare_anm_instructions!{ | |
|
639
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
148 0 => fn Delete(), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
149 1 => fn LoadSprite(sprite_number: u32), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
150 2 => fn SetScale(sx: f32, sy: f32), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
151 3 => fn SetAlpha(alpha: u32), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
152 4 => fn SetColor(red: u8, green: u8, blue: u8/*, XXX: x8*/), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
153 5 => fn Jump(instruction: u32), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
154 7 => fn ToggleMirrored(), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
155 9 => fn SetRotations3d(x: f32, y: f32, z: f32), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
156 10 => fn SetRotationsSpeed3d(x: f32, y: f32, z: f32), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
157 11 => fn SetScaleSpeed(sx: f32, sy: f32), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
158 12 => fn Fade(alpha: u32, duration: u32), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
159 13 => fn SetBlendmodeAdd(), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
160 14 => fn SetBlendmodeAlphablend(), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
161 15 => fn KeepStill(), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
162 16 => fn LoadRandomSprite(min_index: u32, amplitude: u32), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
163 17 => fn Move(x: f32, y: f32, z: f32), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
164 18 => fn MoveToLinear(x: f32, y: f32, z: f32, duration: u32), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
165 19 => fn MoveToDecel(x: f32, y: f32, z: f32, duration: u32), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
166 20 => fn MoveToAccel(x: f32, y: f32, z: f32, duration: u32), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
167 21 => fn Wait(), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
168 22 => fn InterruptLabel(label: i32), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
169 23 => fn SetCornerRelativePlacement(), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
170 24 => fn WaitEx(), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
171 25 => fn SetAllowOffset(allow: u32), // TODO: better name |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
172 26 => fn SetAutomaticOrientation(automatic: u32), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
173 27 => fn ShiftTextureX(dx: f32), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
174 28 => fn ShiftTextureY(dy: f32), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
175 29 => fn SetVisible(visible: u32), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
176 30 => fn ScaleIn(sx: f32, sy: f32, duration: u32), |
|
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
177 31 => fn Todo(todo: u32), |
| 638 | 178 } |
| 179 | |
|
713
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
180 fn parse_anm0(input: &[u8]) -> IResult<&[u8], Anm0> { |
|
766
8a3b8e2ffa24
formats: Expose color_key on Anm0
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
765
diff
changeset
|
181 let (i, (num_sprites, num_scripts, _, width, height, format, color_key, |
|
8a3b8e2ffa24
formats: Expose color_key on Anm0
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
765
diff
changeset
|
182 first_name_offset, _, second_name_offset, version, _, |
|
8a3b8e2ffa24
formats: Expose color_key on Anm0
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
765
diff
changeset
|
183 _texture_offset, has_data, _next_offset, _)) = |
|
774
d08eb4c9fce3
formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents:
766
diff
changeset
|
184 (le_u32, le_u32, tag(&b"\0\0\0\0"[..]), le_u32, le_u32, le_u32, le_u32, le_u32, |
|
d08eb4c9fce3
formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents:
766
diff
changeset
|
185 tag(&b"\0\0\0\0"[..]), le_u32, le_u32, tag(&b"\0\0\0\0"[..]), le_u32, le_u32, le_u32, |
|
d08eb4c9fce3
formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents:
766
diff
changeset
|
186 tag(&b"\0\0\0\0"[..])).parse(input)?; |
| 638 | 187 |
|
713
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
188 assert_eq!(version, 0); |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
189 assert_eq!(has_data, 0); |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
190 let num_sprites = num_sprites as usize; |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
191 let num_scripts = num_scripts as usize; |
| 638 | 192 |
|
774
d08eb4c9fce3
formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents:
766
diff
changeset
|
193 let (i, sprite_offsets) = many_m_n(num_sprites, num_sprites, le_u32).parse(i)?; |
|
d08eb4c9fce3
formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents:
766
diff
changeset
|
194 let (_, script_offsets) = many_m_n(num_scripts, num_scripts, (le_u32, le_u32)).parse(i)?; |
| 638 | 195 |
|
713
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
196 let png_filename = if first_name_offset > 0 { |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
197 if input.len() < first_name_offset as usize { |
|
755
fc937d93a57c
Bump nom to version 6, and image to 0.23.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
713
diff
changeset
|
198 return Err(nom::Err::Failure(nom::error::Error::new(input, nom::error::ErrorKind::Eof))); |
|
713
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
199 } |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
200 let i = &input[first_name_offset as usize..]; |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
201 let (_, name) = parse_name(i)?; |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
202 name |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
203 } else { |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
204 String::new() |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
205 }; |
| 638 | 206 |
|
713
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
207 let alpha_filename = if second_name_offset > 0 { |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
208 if input.len() < second_name_offset as usize { |
|
755
fc937d93a57c
Bump nom to version 6, and image to 0.23.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
713
diff
changeset
|
209 return Err(nom::Err::Failure(nom::error::Error::new(input, nom::error::ErrorKind::Eof))); |
|
713
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
210 } |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
211 let i = &input[second_name_offset as usize..]; |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
212 let (_, name) = parse_name(i)?; |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
213 Some(name) |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
214 } else { |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
215 None |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
216 }; |
| 638 | 217 |
|
713
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
218 let mut sprites = vec![]; |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
219 let mut i = &input[..]; |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
220 for offset in sprite_offsets.into_iter().map(|x| x as usize) { |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
221 if input.len() < offset { |
|
755
fc937d93a57c
Bump nom to version 6, and image to 0.23.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
713
diff
changeset
|
222 return Err(nom::Err::Failure(nom::error::Error::new(input, nom::error::ErrorKind::Eof))); |
| 638 | 223 } |
|
713
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
224 i = &input[offset..]; |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
225 let (_, sprite) = parse_sprite(i)?; |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
226 sprites.push(sprite); |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
227 } |
| 638 | 228 |
|
765
2a5279168d5a
formats: Use a BTreeMap instead of a HashMap for scripts
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
757
diff
changeset
|
229 let mut scripts = BTreeMap::new(); |
|
713
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
230 for (index, offset) in script_offsets.into_iter().map(|(index, offset)| (index as u8, offset as usize)) { |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
231 if input.len() < offset { |
|
755
fc937d93a57c
Bump nom to version 6, and image to 0.23.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
713
diff
changeset
|
232 return Err(nom::Err::Failure(nom::error::Error::new(input, nom::error::ErrorKind::Eof))); |
|
713
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
233 } |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
234 i = &input[offset..]; |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
235 let mut instruction_offsets = vec![]; |
| 638 | 236 |
|
713
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
237 let mut instructions = vec![]; |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
238 loop { |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
239 let tell = input.len() - i.len(); |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
240 instruction_offsets.push(tell - offset); |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
241 // TODO: maybe check against the size of parsed data? |
|
774
d08eb4c9fce3
formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents:
766
diff
changeset
|
242 let (i2, (time, opcode, _size)) = (le_u16, le_u8, le_u8).parse(i)?; |
|
713
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
243 let (i2, instr) = parse_instruction_args(i2, opcode)?; |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
244 instructions.push(Call { time, instr }); |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
245 i = i2; |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
246 if opcode == 0 { |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
247 break; |
| 638 | 248 } |
|
713
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
249 } |
|
765
2a5279168d5a
formats: Use a BTreeMap instead of a HashMap for scripts
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
757
diff
changeset
|
250 let mut interrupts = BTreeMap::new(); |
|
713
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
251 let mut j = 0; |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
252 for Call { time: _, instr } in &mut instructions { |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
253 match instr { |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
254 Instruction::Jump(ref mut offset) => { |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
255 let result = instruction_offsets.binary_search(&(*offset as usize)); |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
256 match result { |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
257 Ok(ptr) => *offset = ptr as u32, |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
258 Err(ptr) => { |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
259 // XXX: use a more specific error instead. |
|
755
fc937d93a57c
Bump nom to version 6, and image to 0.23.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
713
diff
changeset
|
260 return Err(nom::Err::Failure(nom::error::Error::new(input, nom::error::ErrorKind::Eof))); |
|
713
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
261 //println!("Instruction offset not found for pointer: {}", ptr); |
|
639
a8e0219162b6
Implement AnmRunner.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
638
diff
changeset
|
262 } |
| 638 | 263 } |
|
713
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
264 } |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
265 Instruction::InterruptLabel(interrupt) => { |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
266 interrupts.insert(*interrupt, j + 1); |
| 638 | 267 } |
|
713
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
268 _ => () |
| 638 | 269 } |
|
713
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
270 j += 1; |
| 638 | 271 } |
|
713
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
272 scripts.insert(index, Script { |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
273 instructions, |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
274 interrupts, |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
275 }); |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
276 } |
| 638 | 277 |
|
713
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
278 let anm0 = Anm0 { |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
279 size: (width, height), |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
280 format, |
|
766
8a3b8e2ffa24
formats: Expose color_key on Anm0
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
765
diff
changeset
|
281 color_key, |
|
713
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
282 png_filename, |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
283 alpha_filename, |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
284 sprites, |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
285 scripts, |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
286 }; |
|
258f4aebf3fc
anm0: Parse only a single anm0 at once and use many0 for more, to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
704
diff
changeset
|
287 Ok((i, anm0)) |
| 638 | 288 } |
| 289 | |
| 290 #[cfg(test)] | |
| 291 mod tests { | |
| 292 use super::*; | |
| 293 use std::io::{self, Read}; | |
| 294 use std::fs::File; | |
| 295 | |
| 296 #[test] | |
| 297 fn anm0() { | |
|
645
7bde50132735
Don’t hardcode my home directory in tests.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
643
diff
changeset
|
298 let file = File::open("EoSD/CM/player01.anm").unwrap(); |
| 638 | 299 let mut file = io::BufReader::new(file); |
| 300 let mut buf = vec![]; | |
| 301 file.read_to_end(&mut buf).unwrap(); | |
|
701
b6c351ca0a35
anm0: return the nom IResult and the list of Anm0s.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
694
diff
changeset
|
302 let (_, mut anms) = Anm0::from_slice(&buf).unwrap(); |
|
b6c351ca0a35
anm0: return the nom IResult and the list of Anm0s.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
694
diff
changeset
|
303 assert_eq!(anms.len(), 1); |
|
b6c351ca0a35
anm0: return the nom IResult and the list of Anm0s.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
694
diff
changeset
|
304 let anm0 = anms.pop().unwrap(); |
| 638 | 305 assert_eq!(anm0.size, (256, 256)); |
| 306 assert_eq!(anm0.format, 5); | |
| 307 } | |
| 308 } |
