annotate formats/src/th06/msg.rs @ 792:11bc22bad1bf default tip

python: Replace the image crate with png We weren’t using any of its features anyway, so the png crate is exactly what we need, without the many heavy dependencies of image. https://github.com/image-rs/image-png/pull/670 will eventually make it even faster to build.
author Link Mauve <linkmauve@linkmauve.fr>
date Sat, 17 Jan 2026 22:22:25 +0100
parents a30ce01b9154
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
782
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
1 //! MSG format support.
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
2
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
3 use encoding_rs::SHIFT_JIS;
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
4 use nom::{
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
5 multi::length_count,
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
6 number::complete::{le_u16, le_u32, le_u8},
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
7 IResult, Parser,
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
8 };
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
9 use std::collections::BTreeMap;
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
10
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
11 /// Parse a SHIFT_JIS byte string of length 34 into a String.
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
12 #[allow(non_snake_case)]
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
13 pub fn le_String(i: &[u8]) -> IResult<&[u8], String> {
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
14 let data = i.splitn(2, |c| *c == b'\0').nth(0).unwrap();
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
15 let (string, _encoding, _replaced) = SHIFT_JIS.decode(data);
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
16 Ok((b"", string.into_owned()))
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
17 }
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
18
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
19 /// A single instruction, part of a `Script`.
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
20 #[derive(Debug, Clone)]
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
21 pub struct Call {
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
22 /// Time at which this instruction will be called.
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
23 pub time: u16,
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
24
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
25 /// The instruction to call.
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
26 pub instr: Instruction,
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
27 }
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
28
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
29 /// Main struct of the MSG format.
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
30 #[derive(Debug, Clone)]
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
31 pub struct Msg {
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
32 /// Map of indices to scripts in this msg.
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
33 pub scripts: BTreeMap<u8, Vec<Call>>,
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
34 }
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
35
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
36 impl Msg {
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
37 /// Parse a slice of bytes into a `Msg` struct.
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
38 pub fn from_slice(data: &[u8]) -> IResult<&[u8], Msg> {
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
39 parse_msg.parse(data)
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
40 }
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
41 }
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
42
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
43 macro_rules! gen_match {
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
44 ($arg_type:ident) => {
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
45 ${concat(le_, $arg_type)}
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
46 };
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
47 }
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
48
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
49 macro_rules! declare_msg_instructions {
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
50 ($($opcode:tt => fn $name:ident($($arg:ident: $arg_type:ident),*)),*,) => {
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
51 /// Available instructions in a `Msg`.
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
52 #[allow(missing_docs)]
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
53 #[derive(Debug, Clone, PartialEq)]
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
54 pub enum Instruction {
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
55 $(
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
56 $name($($arg_type),*)
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
57 ),*
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
58 }
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
59
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
60 fn parse_instruction_args(mut i: &[u8], opcode: u8) -> IResult<&[u8], Instruction> {
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
61 let instr = match opcode {
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
62 $(
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
63 $opcode => {
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
64 $(
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
65 let (i2, $arg) = gen_match!($arg_type)(i)?;
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
66 i = i2;
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
67 )*
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
68 Instruction::$name($($arg),*)
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
69 }
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
70 )*
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
71 // XXX: use a more specific error instead.
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
72 _ => return Err(nom::Err::Failure(nom::error::Error::new(i, nom::error::ErrorKind::Eof)))
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
73 };
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
74 Ok((i, instr))
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
75 }
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
76 };
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
77 }
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
78
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
79 declare_msg_instructions! {
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
80 0 => fn Unk1(),
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
81 1 => fn Enter(side: u16, effect: u16),
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
82 2 => fn ChangeFace(side: u16, index: u16),
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
83 3 => fn DisplayText(side: u16, index: u16, text: String),
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
84 4 => fn Pause(duration: u32),
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
85 5 => fn Animate(side: u16, effect: u16),
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
86 6 => fn SpawnEnemySprite(),
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
87 7 => fn ChangeMusic(track: u32),
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
88 8 => fn DisplayDescription(side: u16, index: u16, text: String),
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
89 9 => fn ShowScores(unk1: u32),
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
90 10 => fn Freeze(),
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
91 11 => fn NextStage(),
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
92 12 => fn Unk2(),
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
93 13 => fn SetAllowSkip(boolean: u32),
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
94 14 => fn Unk3(),
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
95 }
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
96
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
97 fn parse_msg(input: &[u8]) -> IResult<&[u8], Msg> {
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
98 let (mut i, entry_offsets) = length_count(le_u32, le_u32).parse(input)?;
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
99 let first_offset = entry_offsets[0];
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
100
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
101 let mut scripts = BTreeMap::new();
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
102 for (index, offset) in entry_offsets
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
103 .into_iter()
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
104 .enumerate()
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
105 .map(|(index, offset)| (index as u8, offset))
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
106 {
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
107 if input.len() < offset as usize {
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
108 return Err(nom::Err::Failure(nom::error::Error::new(
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
109 input,
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
110 nom::error::ErrorKind::Eof,
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
111 )));
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
112 }
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
113
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
114 // In EoSD, Reimu’s scripts start at 0, and Marisa’s ones at 10.
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
115 // If Reimu has less than 10 scripts, the remaining offsets are equal to her first.
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
116 if index > 0 && offset == first_offset {
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
117 continue;
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
118 }
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
119
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
120 i = &input[offset as usize..];
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
121 let mut instructions = Vec::new();
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
122 loop {
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
123 let (i2, (time, opcode, size)) = (le_u16, le_u8, le_u8).parse(i)?;
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
124 if time == 0 && opcode == 0 && size == 0 {
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
125 break;
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
126 }
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
127 let (i2, data) = (&i2[size as usize..], &i2[..size as usize]);
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
128 let (empty, instr) = parse_instruction_args(data, opcode)?;
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
129 assert!(empty.is_empty());
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
130 instructions.push(Call { time, instr });
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
131 i = i2;
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
132 }
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
133 scripts.insert(index, instructions);
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
134 }
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
135
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
136 Ok((i, Msg { scripts }))
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
137 }
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
138
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
139 #[cfg(test)]
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
140 mod tests {
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
141 use super::*;
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
142 use std::fs::File;
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
143 use std::io::{self, Read};
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
144
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
145 #[test]
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
146 fn msg() {
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
147 println!("{}", std::env::current_dir().unwrap().display());
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
148 let file = File::open("EoSD/ST/msg1.dat").unwrap();
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
149 let mut file = io::BufReader::new(file);
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
150 let mut buf = Vec::new();
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
151 file.read_to_end(&mut buf).unwrap();
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
152 let (_, msg) = Msg::from_slice(&buf).unwrap();
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
153 assert_eq!(msg.scripts.len(), 4);
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
154 assert_eq!(msg.scripts[&0].len(), 89);
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
155 assert_eq!(msg.scripts[&1].len(), 13);
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
156 assert_eq!(msg.scripts[&10].len(), 58);
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
157 assert_eq!(msg.scripts[&11].len(), 13);
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
158 let script = &msg.scripts[&0];
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
159 assert_eq!(script[3].time, 60);
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
160 assert_eq!(
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
161 script[3].instr,
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
162 Instruction::DisplayText(0, 0, String::from("久々のお仕事だわ。"))
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
163 );
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
164 }
a30ce01b9154 formats: Rewrite msg parsing in Rust
Link Mauve <linkmauve@linkmauve.fr>
parents:
diff changeset
165 }