annotate formats/src/th06/std.rs @ 779:ee09657d3789

Replace the stage parser with the Rust one
author Link Mauve <linkmauve@linkmauve.fr>
date Sat, 08 Nov 2025 19:29:33 +0100
parents 94033091458b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
671
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
1 //! STD background format support.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
2
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
3 use nom::{
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
4 IResult,
774
d08eb4c9fce3 formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents: 757
diff changeset
5 Parser,
712
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
6 bytes::complete::tag,
671
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
7 number::complete::{le_u8, le_u16, le_u32, le_i32, le_f32},
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
8 combinator::map,
712
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
9 multi::{many0, count},
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
10 error::ErrorKind,
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
11 Err,
671
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
12 };
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
13 use encoding_rs::SHIFT_JIS;
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
14
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
15 /// A float position in the 3D space.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
16 #[derive(Debug, Clone)]
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
17 pub struct Position {
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
18 /// X component.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
19 pub x: f32,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
20
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
21 /// Y component.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
22 pub y: f32,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
23
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
24 /// Z component.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
25 pub z: f32,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
26 }
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
27
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
28 /// A 3D box around something.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
29 #[derive(Debug, Clone)]
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
30 struct Box3D {
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
31 width: f32,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
32 height: f32,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
33 depth: f32,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
34 }
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
35
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
36 /// A 2D box around something.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
37 #[derive(Debug, Clone)]
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
38 pub struct Box2D {
680
ef2dbd676a91 Add missing quad size override to stdrenderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 679
diff changeset
39 /// Width.
ef2dbd676a91 Add missing quad size override to stdrenderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 679
diff changeset
40 pub width: f32,
ef2dbd676a91 Add missing quad size override to stdrenderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 679
diff changeset
41
ef2dbd676a91 Add missing quad size override to stdrenderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 679
diff changeset
42 /// Height.
ef2dbd676a91 Add missing quad size override to stdrenderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 679
diff changeset
43 pub height: f32,
671
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
44 }
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
45
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
46 /// A quad in the 3D space.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
47 #[derive(Debug, Clone)]
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
48 pub struct Quad {
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
49 /// The anm script to run for this quad.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
50 pub anm_script: u16,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
51
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
52 /// The position of this quad in the 3D space.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
53 pub pos: Position,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
54
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
55 /// The size of this quad.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
56 pub size_override: Box2D,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
57 }
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
58
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
59 /// A model formed of multiple quads in space.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
60 #[derive(Debug, Clone)]
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
61 pub struct Model {
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
62 /// TODO: find what that is.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
63 pub unknown: u16,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
64
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
65 /// The bounding box around this model.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
66 pub bounding_box: [f32; 6],
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
67
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
68 /// The quads composing this model.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
69 pub quads: Vec<Quad>,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
70 }
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
71
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
72 /// An instance of a model.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
73 #[derive(Debug, Clone)]
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
74 pub struct Instance {
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
75 /// The instance identifier.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
76 pub id: u16,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
77
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
78 /// Where to position the instance of this model.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
79 pub pos: Position,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
80 }
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
81
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
82 /// A single instruction, part of a `Script`.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
83 #[derive(Debug, Clone)]
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
84 pub struct Call {
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
85 /// Time at which this instruction will be called.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
86 pub time: u32,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
87
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
88 /// The instruction to call.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
89 pub instr: Instruction,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
90 }
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
91
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
92 /// Parse a SHIFT_JIS byte string of length 128 into a String.
712
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
93 #[allow(non_snake_case)]
671
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
94 pub fn le_String(i: &[u8]) -> IResult<&[u8], String> {
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
95 let data = i.splitn(2, |c| *c == b'\0').nth(0).unwrap();
712
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
96 let (string, _encoding, _replaced) = SHIFT_JIS.decode(data);
671
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
97 Ok((&i[128..], string.into_owned()))
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
98 }
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
99
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
100 /// Main struct of the STD stage format.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
101 #[derive(Debug, Clone)]
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
102 pub struct Stage {
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
103 /// The name of the stage.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
104 pub name: String,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
105
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
106 /// A list of (name, path) of background music.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
107 // TODO: there are maximum four of them, and in practice never more than 2.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
108 pub musics: Vec<Option<(String, String)>>,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
109
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
110 /// List of models.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
111 pub models: Vec<Model>,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
112
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
113 /// List of instances.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
114 pub instances: Vec<Instance>,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
115
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
116 /// List of instructions in the script.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
117 pub script: Vec<Call>,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
118 }
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
119
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
120 impl Stage {
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
121 /// Parse a slice of bytes into an `Stage` struct.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
122 pub fn from_slice(data: &[u8]) -> IResult<&[u8], Stage> {
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
123 parse_stage(data)
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
124 }
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
125 }
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
126
776
94033091458b formats: Update to ${concat(…)} to build on current nightly
Link Mauve <linkmauve@linkmauve.fr>
parents: 774
diff changeset
127 macro_rules! gen_match {
94033091458b formats: Update to ${concat(…)} to build on current nightly
Link Mauve <linkmauve@linkmauve.fr>
parents: 774
diff changeset
128 ($arg_type:ident) => {
94033091458b formats: Update to ${concat(…)} to build on current nightly
Link Mauve <linkmauve@linkmauve.fr>
parents: 774
diff changeset
129 ${concat(le_, $arg_type)}
94033091458b formats: Update to ${concat(…)} to build on current nightly
Link Mauve <linkmauve@linkmauve.fr>
parents: 774
diff changeset
130 };
94033091458b formats: Update to ${concat(…)} to build on current nightly
Link Mauve <linkmauve@linkmauve.fr>
parents: 774
diff changeset
131 }
94033091458b formats: Update to ${concat(…)} to build on current nightly
Link Mauve <linkmauve@linkmauve.fr>
parents: 774
diff changeset
132
671
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
133 macro_rules! declare_stage_instructions {
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
134 ($($opcode:tt => fn $name:ident($($arg:ident: $arg_type:ident),*)),*,) => {
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
135 /// Available instructions in an `Stage`.
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
136 #[allow(missing_docs)]
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
137 #[derive(Debug, Clone, Copy)]
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
138 pub enum Instruction {
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
139 $(
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
140 $name($($arg_type),*)
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
141 ),*
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
142 }
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
143
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
144 fn parse_instruction_args(input: &[u8], opcode: u16) -> IResult<&[u8], Instruction> {
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
145 let mut i = &input[..];
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
146 let instr = match opcode {
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
147 $(
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
148 $opcode => {
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
149 $(
776
94033091458b formats: Update to ${concat(…)} to build on current nightly
Link Mauve <linkmauve@linkmauve.fr>
parents: 774
diff changeset
150 let (i2, $arg) = gen_match!($arg_type)(i)?;
671
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
151 i = i2;
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
152 )*
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
153 Instruction::$name($($arg),*)
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
154 }
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
155 )*
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
156 _ => unreachable!()
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
157 };
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
158 Ok((i, instr))
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
159 }
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
160 };
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
161 }
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
162
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
163 declare_stage_instructions!{
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
164 0 => fn SetViewpos(x: f32, y: f32, z: f32),
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
165 1 => fn SetFog(r: u8, g: u8, b: u8, a: u8, near: f32, far: f32),
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
166 2 => fn SetViewpos2(x: f32, y: f32, z: f32),
710
377c241be559 std_vm: Implement SetViewpos, SetViewpos2 and StartInterpolatinvViewpos2.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 680
diff changeset
167 3 => fn StartInterpolatingViewpos2(frame: u32, _unused: i32, _unused: i32),
377c241be559 std_vm: Implement SetViewpos, SetViewpos2 and StartInterpolatinvViewpos2.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 680
diff changeset
168 4 => fn StartInterpolatingFog(frame: u32, _unused: i32, _unused: i32),
671
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
169 5 => fn Unknown(_unused: i32, _unused: i32, _unused: i32),
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
170 }
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
171
712
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
172 fn parse_quad(i: &[u8]) -> IResult<&[u8], Quad> {
774
d08eb4c9fce3 formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents: 757
diff changeset
173 let (i, (unk1, size)) = (le_u16, le_u16).parse(i)?;
712
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
174 if unk1 == 0xffff {
755
fc937d93a57c Bump nom to version 6, and image to 0.23.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 712
diff changeset
175 return Err(Err::Error(nom::error::Error::new(i, ErrorKind::Eof)));
712
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
176 }
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
177 // TODO: replace this assert with a custom error.
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
178 assert_eq!(size, 0x1c);
774
d08eb4c9fce3 formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents: 757
diff changeset
179 let (i, (anm_script, _, x, y, z, width, height)) = (le_u16, tag(&b"\0\0"[..]), le_f32, le_f32, le_f32, le_f32, le_f32).parse(i)?;
712
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
180 let quad = Quad {
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
181 anm_script,
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
182 pos: Position { x, y, z },
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
183 size_override: Box2D { width, height },
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
184 };
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
185 Ok((i, quad))
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
186 }
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
187
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
188 fn parse_model(i: &[u8]) -> IResult<&[u8], Model> {
774
d08eb4c9fce3 formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents: 757
diff changeset
189 let (i, (_id, unknown, x, y, z, width, height, depth, quads)) = (le_u16, le_u16, le_f32, le_f32, le_f32, le_f32, le_f32, le_f32, many0(parse_quad)).parse(i)?;
712
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
190 let bounding_box = [x, y, z, width, height, depth];
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
191 let model = Model {
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
192 unknown,
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
193 bounding_box,
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
194 quads,
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
195 };
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
196 Ok((i, model))
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
197 }
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
198
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
199 fn parse_instance(i: &[u8]) -> IResult<&[u8], Instance> {
774
d08eb4c9fce3 formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents: 757
diff changeset
200 let (i, (id, unknown, x, y, z)) = (le_u16, le_u16, le_f32, le_f32, le_f32).parse(i)?;
712
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
201 if id == 0xffff && unknown == 0xffff {
755
fc937d93a57c Bump nom to version 6, and image to 0.23.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 712
diff changeset
202 return Err(Err::Error(nom::error::Error::new(i, ErrorKind::Eof)));
712
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
203 }
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
204 // TODO: replace this assert with a custom error.
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
205 assert_eq!(unknown, 0x100);
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
206 let instance = Instance {
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
207 id,
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
208 pos: Position { x, y, z },
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
209 };
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
210 Ok((i, instance))
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
211 }
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
212
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
213 fn parse_instruction(i: &[u8]) -> IResult<&[u8], Call> {
774
d08eb4c9fce3 formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents: 757
diff changeset
214 let (i, (time, opcode, size)) = (le_u32, le_u16, le_u16).parse(i)?;
712
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
215 if time == 0xffffffff && opcode == 0xffff && size == 0xffff {
755
fc937d93a57c Bump nom to version 6, and image to 0.23.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 712
diff changeset
216 return Err(Err::Error(nom::error::Error::new(i, ErrorKind::Eof)));
712
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
217 }
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
218 // TODO: replace this assert with a custom error.
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
219 assert_eq!(size, 12);
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
220 let (i, instr) = parse_instruction_args(i, opcode)?;
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
221 let call = Call { time, instr };
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
222 Ok((i, call))
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
223 }
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
224
671
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
225 fn parse_stage(input: &[u8]) -> IResult<&[u8], Stage> {
712
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
226 let i = &input[..];
671
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
227
774
d08eb4c9fce3 formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents: 757
diff changeset
228 let (i, (num_models, _num_faces, object_instances_offset, script_offset, _, name, music_names, music_paths)) = (
d08eb4c9fce3 formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents: 757
diff changeset
229 le_u16, le_u16, le_u32, le_u32, tag(&b"\0\0\0\0"[..]),
712
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
230 le_String,
774
d08eb4c9fce3 formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents: 757
diff changeset
231 map((le_String, le_String, le_String, le_String), |(a, b, c, d)| [a, b, c, d]),
d08eb4c9fce3 formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents: 757
diff changeset
232 map((le_String, le_String, le_String, le_String), |(a, b, c, d)| [a, b, c, d])
d08eb4c9fce3 formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents: 757
diff changeset
233 ).parse(i)?;
671
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
234 let musics = music_names.iter().zip(&music_paths).map(|(name, path)| if name == " " { None } else { Some((name.clone(), path.clone())) }).collect();
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
235
774
d08eb4c9fce3 formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents: 757
diff changeset
236 let (_, offsets) = count(le_u32, num_models as usize).parse(i)?;
671
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
237
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
238 let mut models = vec![];
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
239 for offset in offsets {
712
13fd434d5d1b std: Split parser to simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 710
diff changeset
240 let (_, model) = parse_model(&input[offset as usize..])?;
671
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
241 models.push(model);
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
242 }
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
243
774
d08eb4c9fce3 formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents: 757
diff changeset
244 let (_, instances) = many0(parse_instance).parse(&input[object_instances_offset as usize..])?;
d08eb4c9fce3 formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents: 757
diff changeset
245 let (_, script) = many0(parse_instruction).parse(&input[script_offset as usize..])?;
671
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
246
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
247 let stage = Stage {
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
248 name,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
249 musics,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
250 models,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
251 instances,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
252 script,
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
253 };
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
254 Ok((b"", stage))
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
255 }
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
256
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
257 #[cfg(test)]
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
258 mod tests {
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
259 use super::*;
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
260 use std::io::{self, Read};
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
261 use std::fs::File;
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
262
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
263 #[test]
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
264 fn std() {
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
265 let file = File::open("EoSD/ST/stage1.std").unwrap();
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
266 let mut file = io::BufReader::new(file);
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
267 let mut buf = vec![];
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
268 file.read_to_end(&mut buf).unwrap();
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
269 let (_, stage) = Stage::from_slice(&buf).unwrap();
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
270 assert_eq!(stage.name, "夢幻夜行絵巻 ~ Mystic Flier");
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
271 assert_eq!(stage.musics.len(), 4);
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
272 assert_eq!(stage.models.len(), 13);
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
273 assert_eq!(stage.instances.len(), 90);
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
274 assert_eq!(stage.script.len(), 21);
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
275 }
266911c0ccfd Add a parser for the stage background format.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
276 }