annotate src/th06/ecl.rs @ 661:598f3125cbac

Implement enough instructions to execute sub 0 from stage 1.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Sat, 10 Aug 2019 21:04:54 +0200
parents 31fc0d881105
children f08e8e3c6196
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
650
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
1 //! ECL enemy script format support.
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
2
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
3 use nom::{
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
4 IResult,
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
5 bytes::complete::take_while_m_n,
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
6 number::complete::{le_u8, le_u16, le_u32, le_i16, le_i32, le_f32},
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
7 };
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
8 use encoding_rs::SHIFT_JIS;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
9
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
10 /// A single instruction, part of a `Script`.
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
11 #[derive(Debug, Clone)]
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
12 pub struct CallSub {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
13 /// Time at which this instruction will be called.
660
31fc0d881105 Make ecl_vm compile, and use it in eclrenderer (doesn’t render yet).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 651
diff changeset
14 pub time: i32,
650
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
15
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
16 /// TODO
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
17 pub rank_mask: u16,
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
18
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
19 /// TODO
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
20 pub param_mask: u16,
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
21
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
22 /// The instruction to call.
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
23 pub instr: SubInstruction,
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
24 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
25
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
26 /// Script driving an animation.
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
27 #[derive(Debug, Clone)]
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
28 pub struct Sub {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
29 /// List of instructions in this script.
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
30 pub instructions: Vec<CallSub>,
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
31 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
32
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
33 /// A single instruction, part of a `Script`.
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
34 #[derive(Debug, Clone)]
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
35 pub struct CallMain {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
36 /// Time at which this instruction will be called.
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
37 pub time: u16,
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
38
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
39 /// Subroutine to call for this enemy.
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
40 pub sub: u16,
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
41
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
42 /// The instruction to call.
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
43 pub instr: MainInstruction,
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
44 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
45
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
46 /// Script driving an animation.
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
47 #[derive(Debug, Clone)]
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
48 pub struct Main {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
49 /// List of instructions in this script.
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
50 pub instructions: Vec<CallMain>,
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
51 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
52
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
53 /// Main struct of the ANM0 animation format.
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
54 #[derive(Debug, Clone)]
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
55 pub struct Ecl {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
56 /// A list of subs.
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
57 pub subs: Vec<Sub>,
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
58
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
59 /// A list of mains.
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
60 pub mains: Vec<Main>,
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
61 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
62
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
63 impl Ecl {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
64 /// Parse a slice of bytes into an `Ecl` struct.
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
65 pub fn from_slice(data: &[u8]) -> IResult<&[u8], Ecl> {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
66 parse_ecl(data)
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
67 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
68 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
69
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
70 macro_rules! declare_main_instructions {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
71 ($($opcode:tt => fn $name:ident($($arg:ident: $arg_type:ident),*)),*,) => {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
72 /// Available instructions in an `Ecl`.
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
73 #[allow(missing_docs)]
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
74 #[derive(Debug, Clone, Copy)]
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
75 pub enum MainInstruction {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
76 $(
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
77 $name($($arg_type),*)
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
78 ),*
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
79 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
80
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
81 fn parse_main_instruction_args(input: &[u8], opcode: u16) -> IResult<&[u8], MainInstruction> {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
82 let mut i = &input[..];
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
83 let instr = match opcode {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
84 $(
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
85 $opcode => {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
86 $(
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
87 let (i2, $arg) = concat_idents!(le_, $arg_type)(i)?;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
88 i = i2;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
89 )*
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
90 MainInstruction::$name($($arg),*)
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
91 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
92 )*
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
93 _ => unreachable!()
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
94 };
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
95 Ok((i, instr))
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
96 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
97 };
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
98 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
99
651
5f02984dd12a Fix SHIFT_JIS parsing to not include nul bytes.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 650
diff changeset
100 /// Parse a SHIFT_JIS byte string of length 34 into a String.
650
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
101 pub fn le_String(i: &[u8]) -> IResult<&[u8], String> {
651
5f02984dd12a Fix SHIFT_JIS parsing to not include nul bytes.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 650
diff changeset
102 assert_eq!(i.len(), 34);
5f02984dd12a Fix SHIFT_JIS parsing to not include nul bytes.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 650
diff changeset
103 let data = i.splitn(2, |c| *c == b'\0').collect::<Vec<_>>()[0];
5f02984dd12a Fix SHIFT_JIS parsing to not include nul bytes.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 650
diff changeset
104 let (string, encoding, replaced) = SHIFT_JIS.decode(data);
650
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
105 Ok((&i[34..], string.into_owned()))
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
106 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
107
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
108 macro_rules! declare_sub_instructions {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
109 ($($opcode:tt => fn $name:ident($($arg:ident: $arg_type:ident),*)),*,) => {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
110 /// Available instructions in an `Ecl`.
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
111 #[allow(missing_docs)]
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
112 #[derive(Debug, Clone)]
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
113 pub enum SubInstruction {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
114 $(
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
115 $name($($arg_type),*)
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
116 ),*
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
117 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
118
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
119 fn parse_sub_instruction_args(input: &[u8], opcode: u16) -> IResult<&[u8], SubInstruction> {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
120 let mut i = &input[..];
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
121 let instr = match opcode {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
122 $(
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
123 $opcode => {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
124 $(
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
125 let (i2, $arg) = concat_idents!(le_, $arg_type)(i)?;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
126 i = i2;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
127 )*
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
128 SubInstruction::$name($($arg),*)
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
129 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
130 )*
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
131 _ => unreachable!()
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
132 };
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
133 Ok((i, instr))
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
134 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
135 };
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
136 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
137
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
138 declare_main_instructions!{
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
139 0 => fn SpawnEnemy(x: f32, y: f32, z: f32, life: i16, bonus_dropped: i16, die_score: u32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
140 2 => fn SpawnEnemyMirrored(x: f32, y: f32, z: f32, life: i16, bonus_dropped: i16, die_score: u32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
141 4 => fn SpawnEnemyRandom(x: f32, y: f32, z: f32, life: i16, bonus_dropped: i16, die_score: u32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
142 6 => fn SpawnEnemyMirroredRandom(x: f32, y: f32, z: f32, life: i16, bonus_dropped: i16, die_score: u32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
143 8 => fn CallMessage(),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
144 9 => fn WaitMessage(),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
145 10 => fn ResumeEcl(x: f32, y: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
146 12 => fn WaitForBossDeath(),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
147 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
148
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
149 declare_sub_instructions!{
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
150 0 => fn Noop(),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
151 1 => fn Destroy(unused: u32),
660
31fc0d881105 Make ecl_vm compile, and use it in eclrenderer (doesn’t render yet).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 651
diff changeset
152 2 => fn RelativeJump(frame: i32, ip: i32),
31fc0d881105 Make ecl_vm compile, and use it in eclrenderer (doesn’t render yet).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 651
diff changeset
153 3 => fn RelativeJumpEx(frame: i32, ip: i32, variable_id: i32),
650
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
154 4 => fn SetInt(var: i32, value: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
155 5 => fn SetFloat(var: i32, value: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
156 6 => fn SetRandomInt(var: i32, max: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
157 8 => fn SetRandomFloat(var: i32, max: f32),
660
31fc0d881105 Make ecl_vm compile, and use it in eclrenderer (doesn’t render yet).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 651
diff changeset
158 9 => fn SetRandomFloatMin(var: i32, amplitude: f32, min: f32),
650
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
159 10 => fn StoreX(var: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
160 13 => fn AddInt(var: i32, a: i32, b: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
161 14 => fn SubstractInt(var: i32, a: i32, b: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
162 15 => fn MultiplyInt(var: i32, a: i32, b: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
163 16 => fn DivideInt(var: i32, a: i32, b: i32),
660
31fc0d881105 Make ecl_vm compile, and use it in eclrenderer (doesn’t render yet).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 651
diff changeset
164 17 => fn ModuloInt(var: i32, a: i32, b: i32),
650
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
165 18 => fn Increment(var: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
166 20 => fn AddFloat(var: i32, a: f32, b: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
167 21 => fn SubstractFloat(var: i32, a: f32, b: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
168 23 => fn DivideFloat(var: i32, a: f32, b: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
169 25 => fn GetDirection(var: i32, x1: f32, y1: f32, x2: f32, y2: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
170 26 => fn FloatToUnitCircle(var: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
171 27 => fn CompareInts(a: i32, b: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
172 28 => fn CompareFloats(a: f32, b: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
173 29 => fn RelativeJumpIfLowerThan(frame: i32, ip: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
174 30 => fn RelativeJumpIfLowerOrEqual(frame: i32, ip: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
175 31 => fn RelativeJumpIfEqual(frame: i32, ip: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
176 32 => fn RelativeJumpIfGreaterThan(frame: i32, ip: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
177 33 => fn RelativeJumpIfGreaterOrEqual(frame: i32, ip: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
178 34 => fn RelativeJumpIfNotEqual(frame: i32, ip: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
179 35 => fn Call(sub: i32, param1: i32, param2: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
180 36 => fn Return(),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
181 39 => fn CallIfEqual(sub: i32, param1: i32, param2: f32, a: i32, b: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
182 43 => fn SetPosition(x: f32, y: f32, z: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
183 45 => fn SetAngleAndSpeed(angle: f32, speed: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
184 46 => fn SetRotationSpeed(speed: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
185 47 => fn SetSpeed(speed: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
186 48 => fn SetAcceleration(acceleration: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
187 49 => fn SetRandomAngle(min: f32, max: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
188 50 => fn SetRandomAngleEx(min: f32, max: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
189 51 => fn TargetPlayer(TODO: f32, speed: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
190 52 => fn MoveInDecel(duration: i32, angle: f32, speed: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
191 56 => fn MoveToLinear(duration: i32, x: f32, y: f32, z: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
192 57 => fn MoveToDecel(duration: i32, x: f32, y: f32, z: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
193 59 => fn MoveToAccel(duration: i32, x: f32, y: f32, z: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
194 61 => fn StopIn(duration: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
195 63 => fn StopInAccel(duration: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
196 65 => fn SetScreenBox(xmin: f32, ymin: f32, xmax: f32, ymax: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
197 66 => fn ClearScreenBox(),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
198 67 => fn SetBulletAttributes1(anim: i16, sprite_index_offset: i16, bullets_per_shot: i32, number_of_shots: i32, speed: f32, speed2: f32, launch_angle: f32, angle: f32, flags: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
199 68 => fn SetBulletAttributes2(anim: i16, sprite_index_offset: i16, bullets_per_shot: i32, number_of_shots: i32, speed: f32, speed2: f32, launch_angle: f32, angle: f32, flags: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
200 69 => fn SetBulletAttributes3(anim: i16, sprite_index_offset: i16, bullets_per_shot: i32, number_of_shots: i32, speed: f32, speed2: f32, launch_angle: f32, angle: f32, flags: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
201 70 => fn SetBulletAttributes4(anim: i16, sprite_index_offset: i16, bullets_per_shot: i32, number_of_shots: i32, speed: f32, speed2: f32, launch_angle: f32, angle: f32, flags: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
202 71 => fn SetBulletAttributes5(anim: i16, sprite_index_offset: i16, bullets_per_shot: i32, number_of_shots: i32, speed: f32, speed2: f32, launch_angle: f32, angle: f32, flags: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
203 74 => fn SetBulletAttributes6(anim: i16, sprite_index_offset: i16, bullets_per_shot: i32, number_of_shots: i32, speed: f32, speed2: f32, launch_angle: f32, angle: f32, flags: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
204 75 => fn SetBulletAttributes7(anim: i16, sprite_index_offset: i16, bullets_per_shot: i32, number_of_shots: i32, speed: f32, speed2: f32, launch_angle: f32, angle: f32, flags: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
205 76 => fn SetBulletInterval(interval: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
206 77 => fn SetBulletIntervalEx(interval: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
207 78 => fn DelayAttack(),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
208 79 => fn NoDelayAttack(),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
209 81 => fn SetBulletLaunchOffset(x: f32, y: f32, z: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
210 82 => fn SetExtendedBulletAttributes(a: i32, b: i32, c: i32, d: i32, e: f32, f: f32, g: f32, h: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
211 83 => fn ChangeBulletsInStarBonus(),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
212 // 84: ('i', None),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
213 85 => fn NewLaser(laser_type: i16, sprite_idx_offset: i16, angle: f32, speed: f32, start_offset: f32, end_offset: f32, max_length: f32, width: f32, start_duration: i32, duration: i32, end_duration: i32, grazing_delay: i32, grazing_extra_duration: i32, UNK1: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
214 86 => fn NewLaserTowardsPlayer(laser_type: i16, sprite_idx_offset: i16, angle: f32, speed: f32, start_offset: f32, end_offset: f32, max_length: f32, width: f32, start_duration: i32, duration: i32, end_duration: i32, grazing_delay: i32, grazing_extra_duration: i32, UNK1: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
215 87 => fn SetUpcomingLaserId(id: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
216 88 => fn AlterLaserAngle(id: i32, delta: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
217 90 => fn RepositionLaser(id: i32, ox: f32, oy: f32, oz: f32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
218 92 => fn CanceLaser(id: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
219 93 => fn SetSpellcard(face: i16, number: i16, name: String),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
220 94 => fn Endspellcard(),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
221 95 => fn SpawnEnemy(sub: i32, x: f32, y: f32, z: f32, life: i16, bonus_dropped: i16, die_score: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
222 96 => fn KillAllEnemies(),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
223 97 => fn SetAnim(script: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
224 98 => fn SetMultipleAnims(default: i16, end_left: i16, end_right: i16, left: i16, right: i16, UNUSED: i16),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
225 99 => fn SetAuxAnm(number: i32, script: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
226 100 => fn SetDeathAnim(sprite_index: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
227 101 => fn SetBossMode(value: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
228 102 => fn CreateSquares(UNK1: i32, UNK2: f32, UNK3: f32, UNK4: f32, UNK5: f32),
661
598f3125cbac Implement enough instructions to execute sub 0 from stage 1.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 660
diff changeset
229 103 => fn SetHitbox(width: f32, height: f32, depth: f32),
650
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
230 104 => fn SetCollidable(collidable: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
231 105 => fn SetDamageable(damageable: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
232 106 => fn PlaySound(index: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
233 107 => fn SetDeathFlags(death_flags: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
234 108 => fn SetDeathCallback(sub: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
235 109 => fn MemoryWriteInt(value: i32, index: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
236 111 => fn SetLife(life: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
237 112 => fn SetEllapsedTime(frame: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
238 113 => fn SetLowLifeTrigger(trigger: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
239 114 => fn SetLowLifeCallback(sub: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
240 115 => fn SetTimeout(timeout: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
241 116 => fn SetTimeoutCallback(sub: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
242 117 => fn SetTouchable(touchable: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
243 118 => fn DropParticles(anim: i32, number: u32, r: u8, g: u8, b: u8, UNUSED: u8),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
244 119 => fn DropBonus(number: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
245 120 => fn SetAutomaticOrientation(automatic: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
246 121 => fn CallSpecialFunction(function: i32, argument: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
247 122 => fn UNK1(TODO: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
248 123 => fn SkipFrames(frames: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
249 124 => fn DropSpecificBonus(type_: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
250 125 => fn UNK2(),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
251 126 => fn SetRemainingLives(lives: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
252 127 => fn UNK3(TODO: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
253 128 => fn Interrupt(event: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
254 129 => fn InterruptAux(number: i32, event: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
255 130 => fn UNK5(TODO: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
256 131 => fn SetDifficultyCoeffs(speed_a: f32, speed_b: f32, nb_a: i32, nb_b: i32, shots_a: i32, shots_b: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
257 132 => fn SetInvisible(invisible: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
258 133 => fn CopyCallbacks(),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
259 134 => fn UNK6(),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
260 135 => fn EnableSpellcardBonus(UNKNOW: i32),
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
261 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
262
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
263 fn parse_ecl(input: &[u8]) -> IResult<&[u8], Ecl> {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
264 let i = input;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
265
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
266 let (i, sub_count) = le_u16(i)?;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
267 let (mut i, main_count) = le_u16(i)?;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
268 assert_eq!(main_count, 0);
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
269
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
270 let mut main_offsets = Vec::new();
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
271 for _ in 0..3 {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
272 let (i2, offset) = le_u32(i)?;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
273 main_offsets.push(offset as usize);
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
274 i = i2;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
275 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
276
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
277 let mut sub_offsets = Vec::new();
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
278 for _ in 0..sub_count {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
279 let (i2, offset) = le_u32(i)?;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
280 sub_offsets.push(offset as usize);
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
281 i = i2;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
282 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
283
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
284 // Read all subs.
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
285 let mut subs = Vec::new();
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
286 for offset in sub_offsets {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
287 let mut i = &input[offset..];
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
288 let mut instructions = Vec::new();
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
289 loop {
660
31fc0d881105 Make ecl_vm compile, and use it in eclrenderer (doesn’t render yet).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 651
diff changeset
290 let (i2, time) = le_i32(i)?;
650
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
291 let (i2, opcode) = le_u16(i2)?;
660
31fc0d881105 Make ecl_vm compile, and use it in eclrenderer (doesn’t render yet).
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 651
diff changeset
292 if time == -1 || opcode == 0xffff {
650
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
293 break;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
294 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
295
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
296 let (i2, size) = le_u16(i2)?;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
297 let (i2, rank_mask) = le_u16(i2)?;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
298 let (i2, param_mask) = le_u16(i2)?;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
299 // FIXME: this - 12 can trigger a panic, fuzz it!
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
300 let data = &i2[..size as usize - 12];
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
301 let (data, instr) = parse_sub_instruction_args(data, opcode)?;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
302 assert_eq!(data.len(), 0);
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
303 instructions.push(CallSub { time, rank_mask, param_mask, instr });
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
304 i = &i[size as usize..];
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
305 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
306 subs.push(Sub { instructions });
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
307 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
308
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
309 // Read all mains (always a single one atm).
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
310 let mut mains = Vec::new();
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
311 for offset in main_offsets {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
312 if offset == 0 {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
313 break;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
314 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
315
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
316 let mut i = &input[offset..];
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
317 let mut instructions = Vec::new();
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
318 loop {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
319 let (i2, time) = le_u16(i)?;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
320 let (i2, sub) = le_u16(i2)?;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
321 if time == 0xffff && sub == 4 {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
322 break;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
323 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
324
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
325 let (i2, opcode) = le_u16(i2)?;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
326 let (i2, size) = le_u16(i2)?;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
327 // FIXME: this - 8 can trigger a panic, fuzz it!
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
328 let data = &i2[..size as usize - 8];
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
329 let (data, instr) = parse_main_instruction_args(data, opcode)?;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
330 assert_eq!(data.len(), 0);
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
331 instructions.push(CallMain { time, sub, instr });
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
332 i = &i[size as usize..];
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
333 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
334 mains.push(Main { instructions });
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
335 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
336
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
337 let ecl = Ecl {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
338 subs,
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
339 mains,
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
340 };
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
341 Ok((b"", ecl))
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
342 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
343
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
344 #[cfg(test)]
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
345 mod tests {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
346 use super::*;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
347 use std::io::{self, Read};
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
348 use std::fs::File;
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
349
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
350 #[test]
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
351 fn ecl() {
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
352 let file = File::open("EoSD/ST/ecldata1.ecl").unwrap();
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
353 let mut file = io::BufReader::new(file);
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
354 let mut buf = vec![];
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
355 file.read_to_end(&mut buf).unwrap();
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
356 let (_, ecl) = Ecl::from_slice(&buf).unwrap();
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
357 assert_eq!(ecl.subs.len(), 24);
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
358 assert_eq!(ecl.mains.len(), 1);
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
359 }
f6bfc9e6dab0 Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
360 }