Mercurial > touhou
annotate formats/src/th06/ecl.rs @ 777:11249e4b4e03
Rust: Bump dependencies which require no code change
| author | Link Mauve <linkmauve@linkmauve.fr> |
|---|---|
| date | Tue, 14 Oct 2025 12:42:06 +0000 |
| parents | 94033091458b |
| children |
| 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, |
|
774
d08eb4c9fce3
formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents:
757
diff
changeset
|
5 Parser, |
|
650
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}, |
|
714
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
7 multi::{count, many0}, |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
8 error::ErrorKind, |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
9 Err, |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
10 }; |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
11 use encoding_rs::SHIFT_JIS; |
|
664
f08e8e3c6196
Use bitflags for the rank, instead of an u16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
661
diff
changeset
|
12 use bitflags::bitflags; |
|
f08e8e3c6196
Use bitflags for the rank, instead of an u16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
661
diff
changeset
|
13 |
|
f08e8e3c6196
Use bitflags for the rank, instead of an u16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
661
diff
changeset
|
14 bitflags! { |
|
f08e8e3c6196
Use bitflags for the rank, instead of an u16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
661
diff
changeset
|
15 /// Bit flags describing the current difficulty level. |
|
777
11249e4b4e03
Rust: Bump dependencies which require no code change
Link Mauve <linkmauve@linkmauve.fr>
parents:
776
diff
changeset
|
16 #[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)] |
|
664
f08e8e3c6196
Use bitflags for the rank, instead of an u16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
661
diff
changeset
|
17 pub struct Rank: u16 { |
|
f08e8e3c6196
Use bitflags for the rank, instead of an u16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
661
diff
changeset
|
18 /// Easy mode. |
|
703
81232dac8136
ecl: simplify parsing with more combinators.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
696
diff
changeset
|
19 const EASY = 0x100; |
|
664
f08e8e3c6196
Use bitflags for the rank, instead of an u16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
661
diff
changeset
|
20 |
|
f08e8e3c6196
Use bitflags for the rank, instead of an u16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
661
diff
changeset
|
21 /// Normal mode. |
|
703
81232dac8136
ecl: simplify parsing with more combinators.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
696
diff
changeset
|
22 const NORMAL = 0x200; |
|
664
f08e8e3c6196
Use bitflags for the rank, instead of an u16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
661
diff
changeset
|
23 |
|
f08e8e3c6196
Use bitflags for the rank, instead of an u16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
661
diff
changeset
|
24 /// Hard mode. |
|
703
81232dac8136
ecl: simplify parsing with more combinators.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
696
diff
changeset
|
25 const HARD = 0x400; |
|
664
f08e8e3c6196
Use bitflags for the rank, instead of an u16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
661
diff
changeset
|
26 |
|
f08e8e3c6196
Use bitflags for the rank, instead of an u16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
661
diff
changeset
|
27 /// Lunatic mode. |
|
703
81232dac8136
ecl: simplify parsing with more combinators.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
696
diff
changeset
|
28 const LUNATIC = 0x800; |
|
664
f08e8e3c6196
Use bitflags for the rank, instead of an u16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
661
diff
changeset
|
29 |
|
f08e8e3c6196
Use bitflags for the rank, instead of an u16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
661
diff
changeset
|
30 /// Any or all modes. |
|
703
81232dac8136
ecl: simplify parsing with more combinators.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
696
diff
changeset
|
31 const ALL = 0xff00; |
|
664
f08e8e3c6196
Use bitflags for the rank, instead of an u16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
661
diff
changeset
|
32 } |
|
f08e8e3c6196
Use bitflags for the rank, instead of an u16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
661
diff
changeset
|
33 } |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
34 |
|
665
965ecdbf0316
Make rank user-defined in eclrenderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
664
diff
changeset
|
35 impl std::str::FromStr for Rank { |
|
965ecdbf0316
Make rank user-defined in eclrenderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
664
diff
changeset
|
36 type Err = String; |
|
965ecdbf0316
Make rank user-defined in eclrenderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
664
diff
changeset
|
37 |
|
965ecdbf0316
Make rank user-defined in eclrenderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
664
diff
changeset
|
38 fn from_str(s: &str) -> Result<Rank, Self::Err> { |
|
965ecdbf0316
Make rank user-defined in eclrenderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
664
diff
changeset
|
39 Ok(match s { |
|
703
81232dac8136
ecl: simplify parsing with more combinators.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
696
diff
changeset
|
40 "easy" => Rank::EASY, |
|
81232dac8136
ecl: simplify parsing with more combinators.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
696
diff
changeset
|
41 "normal" => Rank::NORMAL, |
|
81232dac8136
ecl: simplify parsing with more combinators.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
696
diff
changeset
|
42 "hard" => Rank::HARD, |
|
81232dac8136
ecl: simplify parsing with more combinators.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
696
diff
changeset
|
43 "lunatic" => Rank::LUNATIC, |
|
665
965ecdbf0316
Make rank user-defined in eclrenderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
664
diff
changeset
|
44 _ => return Err(format!("unknown rank {}", s)) |
|
965ecdbf0316
Make rank user-defined in eclrenderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
664
diff
changeset
|
45 }) |
|
965ecdbf0316
Make rank user-defined in eclrenderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
664
diff
changeset
|
46 } |
|
965ecdbf0316
Make rank user-defined in eclrenderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
664
diff
changeset
|
47 } |
|
965ecdbf0316
Make rank user-defined in eclrenderer.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
664
diff
changeset
|
48 |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
49 /// A single instruction, part of a `Script`. |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
50 #[derive(Debug, Clone)] |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
51 pub struct CallSub { |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
52 /// 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
|
53 pub time: i32, |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
54 |
|
664
f08e8e3c6196
Use bitflags for the rank, instead of an u16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
661
diff
changeset
|
55 /// The difficulty level(s) this instruction will be called at. |
|
f08e8e3c6196
Use bitflags for the rank, instead of an u16.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
661
diff
changeset
|
56 pub rank_mask: Rank, |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
57 |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
58 /// TODO |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
59 pub param_mask: u16, |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
60 |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
61 /// The instruction to call. |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
62 pub instr: SubInstruction, |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
63 } |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
64 |
|
696
7ae576a418ff
ecl_vm: implement Call, Return, and the call stack thingy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
686
diff
changeset
|
65 impl CallSub { |
|
7ae576a418ff
ecl_vm: implement Call, Return, and the call stack thingy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
686
diff
changeset
|
66 /// Create a new instruction call. |
|
7ae576a418ff
ecl_vm: implement Call, Return, and the call stack thingy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
686
diff
changeset
|
67 pub fn new(time: i32, rank_mask: Rank, instr: SubInstruction) -> CallSub { |
|
7ae576a418ff
ecl_vm: implement Call, Return, and the call stack thingy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
686
diff
changeset
|
68 CallSub { |
|
7ae576a418ff
ecl_vm: implement Call, Return, and the call stack thingy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
686
diff
changeset
|
69 time, |
|
7ae576a418ff
ecl_vm: implement Call, Return, and the call stack thingy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
686
diff
changeset
|
70 rank_mask, |
|
7ae576a418ff
ecl_vm: implement Call, Return, and the call stack thingy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
686
diff
changeset
|
71 param_mask: 0, |
|
7ae576a418ff
ecl_vm: implement Call, Return, and the call stack thingy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
686
diff
changeset
|
72 instr, |
|
7ae576a418ff
ecl_vm: implement Call, Return, and the call stack thingy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
686
diff
changeset
|
73 } |
|
7ae576a418ff
ecl_vm: implement Call, Return, and the call stack thingy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
686
diff
changeset
|
74 } |
|
7ae576a418ff
ecl_vm: implement Call, Return, and the call stack thingy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
686
diff
changeset
|
75 } |
|
7ae576a418ff
ecl_vm: implement Call, Return, and the call stack thingy.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
686
diff
changeset
|
76 |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
77 /// Script driving an animation. |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
78 #[derive(Debug, Clone)] |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
79 pub struct Sub { |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
80 /// List of instructions in this script. |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
81 pub instructions: Vec<CallSub>, |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
82 } |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
83 |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
84 /// A single instruction, part of a `Script`. |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
85 #[derive(Debug, Clone)] |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
86 pub struct CallMain { |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
87 /// Time at which this instruction will be called. |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
88 pub time: u16, |
|
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 /// Subroutine to call for this enemy. |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
91 pub sub: u16, |
|
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 /// The instruction to call. |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
94 pub instr: MainInstruction, |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
95 } |
|
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 /// Script driving an animation. |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
98 #[derive(Debug, Clone)] |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
99 pub struct Main { |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
100 /// List of instructions in this script. |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
101 pub instructions: Vec<CallMain>, |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
102 } |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
103 |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
104 /// Main struct of the ANM0 animation format. |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
105 #[derive(Debug, Clone)] |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
106 pub struct Ecl { |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
107 /// A list of subs. |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
108 pub subs: Vec<Sub>, |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
109 |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
110 /// A list of mains. |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
111 pub mains: Vec<Main>, |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
112 } |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
113 |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
114 impl Ecl { |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
115 /// Parse a slice of bytes into an `Ecl` struct. |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
116 pub fn from_slice(data: &[u8]) -> IResult<&[u8], Ecl> { |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
117 parse_ecl(data) |
|
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 } |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
120 |
|
776
94033091458b
formats: Update to ${concat(…)} to build on current nightly
Link Mauve <linkmauve@linkmauve.fr>
parents:
774
diff
changeset
|
121 macro_rules! gen_match { |
|
94033091458b
formats: Update to ${concat(…)} to build on current nightly
Link Mauve <linkmauve@linkmauve.fr>
parents:
774
diff
changeset
|
122 ($arg_type:ident) => { |
|
94033091458b
formats: Update to ${concat(…)} to build on current nightly
Link Mauve <linkmauve@linkmauve.fr>
parents:
774
diff
changeset
|
123 ${concat(le_, $arg_type)} |
|
94033091458b
formats: Update to ${concat(…)} to build on current nightly
Link Mauve <linkmauve@linkmauve.fr>
parents:
774
diff
changeset
|
124 }; |
|
94033091458b
formats: Update to ${concat(…)} to build on current nightly
Link Mauve <linkmauve@linkmauve.fr>
parents:
774
diff
changeset
|
125 } |
|
94033091458b
formats: Update to ${concat(…)} to build on current nightly
Link Mauve <linkmauve@linkmauve.fr>
parents:
774
diff
changeset
|
126 |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
127 macro_rules! declare_main_instructions { |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
128 ($($opcode:tt => fn $name:ident($($arg:ident: $arg_type:ident),*)),*,) => { |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
129 /// Available instructions in an `Ecl`. |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
130 #[allow(missing_docs)] |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
131 #[derive(Debug, Clone, Copy)] |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
132 pub enum MainInstruction { |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
133 $( |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
134 $name($($arg_type),*) |
|
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 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
|
139 let mut i = &input[..]; |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
140 let instr = match opcode { |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
141 $( |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
142 $opcode => { |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
143 $( |
|
776
94033091458b
formats: Update to ${concat(…)} to build on current nightly
Link Mauve <linkmauve@linkmauve.fr>
parents:
774
diff
changeset
|
144 let (i2, $arg) = gen_match!($arg_type)(i)?; |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
145 i = i2; |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
146 )* |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
147 MainInstruction::$name($($arg),*) |
|
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 )* |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
150 _ => unreachable!() |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
151 }; |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
152 Ok((i, instr)) |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
153 } |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
154 }; |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
155 } |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
156 |
|
651
5f02984dd12a
Fix SHIFT_JIS parsing to not include nul bytes.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
650
diff
changeset
|
157 /// Parse a SHIFT_JIS byte string of length 34 into a String. |
|
714
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
158 #[allow(non_snake_case)] |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
159 pub fn le_String(i: &[u8]) -> IResult<&[u8], String> { |
|
669
1bb8b34dbd32
Don’t allocate a Vec while reading a String in ECL.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
665
diff
changeset
|
160 let data = i.splitn(2, |c| *c == b'\0').nth(0).unwrap(); |
|
714
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
161 let (string, _encoding, _replaced) = SHIFT_JIS.decode(data); |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
162 Ok((&i[34..], string.into_owned())) |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
163 } |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
164 |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
165 macro_rules! declare_sub_instructions { |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
166 ($($opcode:tt => fn $name:ident($($arg:ident: $arg_type:ident),*)),*,) => { |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
167 /// Available instructions in an `Ecl`. |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
168 #[allow(missing_docs)] |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
169 #[derive(Debug, Clone)] |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
170 pub enum SubInstruction { |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
171 $( |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
172 $name($($arg_type),*) |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
173 ),* |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
174 } |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
175 |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
176 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
|
177 let mut i = &input[..]; |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
178 let instr = match opcode { |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
179 $( |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
180 $opcode => { |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
181 $( |
|
776
94033091458b
formats: Update to ${concat(…)} to build on current nightly
Link Mauve <linkmauve@linkmauve.fr>
parents:
774
diff
changeset
|
182 let (i2, $arg) = gen_match!($arg_type)(i)?; |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
183 i = i2; |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
184 )* |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
185 SubInstruction::$name($($arg),*) |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
186 } |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
187 )* |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
188 _ => unreachable!() |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
189 }; |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
190 Ok((i, instr)) |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
191 } |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
192 }; |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
193 } |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
194 |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
195 declare_main_instructions!{ |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
196 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
|
197 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
|
198 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
|
199 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
|
200 8 => fn CallMessage(), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
201 9 => fn WaitMessage(), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
202 10 => fn ResumeEcl(x: f32, y: f32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
203 12 => fn WaitForBossDeath(), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
204 } |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
205 |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
206 declare_sub_instructions!{ |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
207 0 => fn Noop(), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
208 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
|
209 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
|
210 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
|
211 4 => fn SetInt(var: i32, value: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
212 5 => fn SetFloat(var: i32, value: f32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
213 6 => fn SetRandomInt(var: i32, max: i32), |
|
685
11d7e4d6947a
ecl_vm: nearing the complete list
Gauvain "GovanifY" Roussel-Tarbouriech <gauvain@govanify.com>
parents:
684
diff
changeset
|
214 7 => fn SetRandomIntMin(var: i32, max: i32, min: i32), |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
215 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
|
216 9 => fn SetRandomFloatMin(var: i32, amplitude: f32, min: f32), |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
217 10 => fn StoreX(var: i32), |
|
685
11d7e4d6947a
ecl_vm: nearing the complete list
Gauvain "GovanifY" Roussel-Tarbouriech <gauvain@govanify.com>
parents:
684
diff
changeset
|
218 11 => fn StoreY(var: i32), |
|
11d7e4d6947a
ecl_vm: nearing the complete list
Gauvain "GovanifY" Roussel-Tarbouriech <gauvain@govanify.com>
parents:
684
diff
changeset
|
219 12 => fn StoreZ(var: i32), |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
220 13 => fn AddInt(var: i32, a: i32, b: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
221 14 => fn SubstractInt(var: i32, a: i32, b: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
222 15 => fn MultiplyInt(var: i32, a: i32, b: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
223 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
|
224 17 => fn ModuloInt(var: i32, a: i32, b: i32), |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
225 18 => fn Increment(var: i32), |
|
685
11d7e4d6947a
ecl_vm: nearing the complete list
Gauvain "GovanifY" Roussel-Tarbouriech <gauvain@govanify.com>
parents:
684
diff
changeset
|
226 19 => fn Decrement(var: i32), |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
227 20 => fn AddFloat(var: i32, a: f32, b: f32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
228 21 => fn SubstractFloat(var: i32, a: f32, b: f32), |
|
685
11d7e4d6947a
ecl_vm: nearing the complete list
Gauvain "GovanifY" Roussel-Tarbouriech <gauvain@govanify.com>
parents:
684
diff
changeset
|
229 22 => fn MultiplyFloat(var: i32, a: f32, b: f32), |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
230 23 => fn DivideFloat(var: i32, a: f32, b: f32), |
|
685
11d7e4d6947a
ecl_vm: nearing the complete list
Gauvain "GovanifY" Roussel-Tarbouriech <gauvain@govanify.com>
parents:
684
diff
changeset
|
231 24 => fn ModuloFloat(var: i32, a: f32, b: f32), |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
232 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
|
233 26 => fn FloatToUnitCircle(var: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
234 27 => fn CompareInts(a: i32, b: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
235 28 => fn CompareFloats(a: f32, b: f32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
236 29 => fn RelativeJumpIfLowerThan(frame: i32, ip: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
237 30 => fn RelativeJumpIfLowerOrEqual(frame: i32, ip: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
238 31 => fn RelativeJumpIfEqual(frame: i32, ip: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
239 32 => fn RelativeJumpIfGreaterThan(frame: i32, ip: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
240 33 => fn RelativeJumpIfGreaterOrEqual(frame: i32, ip: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
241 34 => fn RelativeJumpIfNotEqual(frame: i32, ip: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
242 35 => fn Call(sub: i32, param1: i32, param2: f32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
243 36 => fn Return(), |
|
685
11d7e4d6947a
ecl_vm: nearing the complete list
Gauvain "GovanifY" Roussel-Tarbouriech <gauvain@govanify.com>
parents:
684
diff
changeset
|
244 37 => fn CallIfSuperior(sub: i32, param1: i32, param2: f32, a: i32, b: i32), |
|
11d7e4d6947a
ecl_vm: nearing the complete list
Gauvain "GovanifY" Roussel-Tarbouriech <gauvain@govanify.com>
parents:
684
diff
changeset
|
245 38 => fn CallIfSuperiorOrEqual(sub: i32, param1: i32, param2: f32, a: i32, b: i32), |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
246 39 => fn CallIfEqual(sub: i32, param1: i32, param2: f32, a: i32, b: i32), |
|
685
11d7e4d6947a
ecl_vm: nearing the complete list
Gauvain "GovanifY" Roussel-Tarbouriech <gauvain@govanify.com>
parents:
684
diff
changeset
|
247 40 => fn CallIfInferior(sub: i32, param1: i32, param2: f32, a: i32, b: i32), |
|
11d7e4d6947a
ecl_vm: nearing the complete list
Gauvain "GovanifY" Roussel-Tarbouriech <gauvain@govanify.com>
parents:
684
diff
changeset
|
248 41 => fn CallIfInferiorOrEqual(sub: i32, param1: i32, param2: f32, a: i32, b: i32), |
|
11d7e4d6947a
ecl_vm: nearing the complete list
Gauvain "GovanifY" Roussel-Tarbouriech <gauvain@govanify.com>
parents:
684
diff
changeset
|
249 42 => fn CallIfNotEqual(sub: i32, param1: i32, param2: f32, a: i32, b: i32), |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
250 43 => fn SetPosition(x: f32, y: f32, z: f32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
251 45 => fn SetAngleAndSpeed(angle: f32, speed: f32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
252 46 => fn SetRotationSpeed(speed: f32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
253 47 => fn SetSpeed(speed: f32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
254 48 => fn SetAcceleration(acceleration: f32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
255 49 => fn SetRandomAngle(min: f32, max: f32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
256 50 => fn SetRandomAngleEx(min: f32, max: f32), |
|
682
d6cc9086058c
ecl_vm: more instructions
Gauvain "GovanifY" Roussel-Tarbouriech <gauvain@govanify.com>
parents:
676
diff
changeset
|
257 51 => fn TargetPlayer(angle: f32, speed: f32), |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
258 52 => fn MoveInDecel(duration: i32, angle: f32, speed: f32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
259 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
|
260 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
|
261 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
|
262 61 => fn StopIn(duration: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
263 63 => fn StopInAccel(duration: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
264 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
|
265 66 => fn ClearScreenBox(), |
|
686
aefe5b5f481e
ecl_vm: implement the SetBulletAttributes opcodes.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
685
diff
changeset
|
266 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: u32), |
|
aefe5b5f481e
ecl_vm: implement the SetBulletAttributes opcodes.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
685
diff
changeset
|
267 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: u32), |
|
aefe5b5f481e
ecl_vm: implement the SetBulletAttributes opcodes.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
685
diff
changeset
|
268 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: u32), |
|
aefe5b5f481e
ecl_vm: implement the SetBulletAttributes opcodes.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
685
diff
changeset
|
269 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: u32), |
|
aefe5b5f481e
ecl_vm: implement the SetBulletAttributes opcodes.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
685
diff
changeset
|
270 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: u32), |
|
aefe5b5f481e
ecl_vm: implement the SetBulletAttributes opcodes.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
685
diff
changeset
|
271 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: u32), |
|
aefe5b5f481e
ecl_vm: implement the SetBulletAttributes opcodes.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
685
diff
changeset
|
272 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: u32), |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
273 76 => fn SetBulletInterval(interval: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
274 77 => fn SetBulletIntervalEx(interval: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
275 78 => fn DelayAttack(), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
276 79 => fn NoDelayAttack(), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
277 81 => fn SetBulletLaunchOffset(x: f32, y: f32, z: f32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
278 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
|
279 83 => fn ChangeBulletsInStarBonus(), |
|
676
826c16e5f909
Rename unknown ECL instructions to better recognise them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
674
diff
changeset
|
280 // TODO: Found in stage 4 onward. |
|
728
414f8611f344
ecl: Add support for bullet sounds, instruction 84.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
716
diff
changeset
|
281 84 => fn SetBulletSound(sound: i32), |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
282 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
|
283 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), |
|
683
8c50a7b19425
ecl_vm: more work
Gauvain "GovanifY" Roussel-Tarbouriech <gauvain@govanify.com>
parents:
682
diff
changeset
|
284 87 => fn SetUpcomingLaserId(id: u32), |
|
8c50a7b19425
ecl_vm: more work
Gauvain "GovanifY" Roussel-Tarbouriech <gauvain@govanify.com>
parents:
682
diff
changeset
|
285 88 => fn AlterLaserAngle(id: u32, delta: f32), |
|
8c50a7b19425
ecl_vm: more work
Gauvain "GovanifY" Roussel-Tarbouriech <gauvain@govanify.com>
parents:
682
diff
changeset
|
286 90 => fn RepositionLaser(id: u32, ox: f32, oy: f32, oz: f32), |
|
684
c8bb28961d31
ecl_vm: fixes for previous instructions
Gauvain "GovanifY" Roussel-Tarbouriech <gauvain@govanify.com>
parents:
683
diff
changeset
|
287 91 => fn LaserSetCompare(id: u32), |
|
683
8c50a7b19425
ecl_vm: more work
Gauvain "GovanifY" Roussel-Tarbouriech <gauvain@govanify.com>
parents:
682
diff
changeset
|
288 92 => fn CancelLaser(id: u32), |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
289 93 => fn SetSpellcard(face: i16, number: i16, name: String), |
|
685
11d7e4d6947a
ecl_vm: nearing the complete list
Gauvain "GovanifY" Roussel-Tarbouriech <gauvain@govanify.com>
parents:
684
diff
changeset
|
290 94 => fn EndSpellcard(), |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
291 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
|
292 96 => fn KillAllEnemies(), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
293 97 => fn SetAnim(script: i32), |
|
716
5016c09e5d7c
Fix some warnings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
714
diff
changeset
|
294 98 => fn SetMultipleAnims(default: i16, end_left: i16, end_right: i16, left: i16, right: i16, _unused: i16), |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
295 99 => fn SetAuxAnm(number: i32, script: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
296 100 => fn SetDeathAnim(sprite_index: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
297 101 => fn SetBossMode(value: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
298 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
|
299 103 => fn SetHitbox(width: f32, height: f32, depth: f32), |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
300 104 => fn SetCollidable(collidable: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
301 105 => fn SetDamageable(damageable: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
302 106 => fn PlaySound(index: i32), |
|
674
3e4cc64a254d
ecl_vm: more instructions.
Gauvain "GovanifY" Roussel-Tarbouriech <gauvain@govanify.com>
parents:
669
diff
changeset
|
303 107 => fn SetDeathFlags(death_flags: u32), |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
304 108 => fn SetDeathCallback(sub: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
305 109 => fn MemoryWriteInt(value: i32, index: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
306 111 => fn SetLife(life: i32), |
|
685
11d7e4d6947a
ecl_vm: nearing the complete list
Gauvain "GovanifY" Roussel-Tarbouriech <gauvain@govanify.com>
parents:
684
diff
changeset
|
307 112 => fn SetElapsedTime(frame: i32), |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
308 113 => fn SetLowLifeTrigger(trigger: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
309 114 => fn SetLowLifeCallback(sub: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
310 115 => fn SetTimeout(timeout: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
311 116 => fn SetTimeoutCallback(sub: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
312 117 => fn SetTouchable(touchable: i32), |
|
714
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
313 118 => fn DropParticles(anim: i32, number: u32, r: u8, g: u8, b: u8, a: u8), |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
314 119 => fn DropBonus(number: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
315 120 => fn SetAutomaticOrientation(automatic: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
316 121 => fn CallSpecialFunction(function: i32, argument: i32), |
|
714
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
317 122 => fn SetSpecialFunctionCallback(function: i32), |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
318 123 => fn SkipFrames(frames: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
319 124 => fn DropSpecificBonus(type_: i32), |
|
676
826c16e5f909
Rename unknown ECL instructions to better recognise them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
674
diff
changeset
|
320 // TODO: Found in stage 3. |
|
826c16e5f909
Rename unknown ECL instructions to better recognise them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
674
diff
changeset
|
321 125 => fn UNK_ins125(), |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
322 126 => fn SetRemainingLives(lives: i32), |
|
676
826c16e5f909
Rename unknown ECL instructions to better recognise them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
674
diff
changeset
|
323 // TODO: Found in stage 4. |
|
716
5016c09e5d7c
Fix some warnings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
714
diff
changeset
|
324 127 => fn UNK_ins127(UNK1: i32), |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
325 128 => fn Interrupt(event: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
326 129 => fn InterruptAux(number: i32, event: i32), |
|
676
826c16e5f909
Rename unknown ECL instructions to better recognise them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
674
diff
changeset
|
327 // TODO: Found in stage 4. |
|
716
5016c09e5d7c
Fix some warnings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
714
diff
changeset
|
328 130 => fn UNK_ins130(UNK1: i32), |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
329 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
|
330 132 => fn SetInvisible(invisible: i32), |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
331 133 => fn CopyCallbacks(), |
|
676
826c16e5f909
Rename unknown ECL instructions to better recognise them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
674
diff
changeset
|
332 // TODO: Found in stage 4. |
|
826c16e5f909
Rename unknown ECL instructions to better recognise them.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
674
diff
changeset
|
333 134 => fn UNK_ins134(), |
|
716
5016c09e5d7c
Fix some warnings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
714
diff
changeset
|
334 135 => fn EnableSpellcardBonus(UNK1: i32), |
|
650
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 |
|
714
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
337 fn parse_sub_instruction(input: &[u8]) -> IResult<&[u8], CallSub> { |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
338 let i = &input[..]; |
|
774
d08eb4c9fce3
formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents:
757
diff
changeset
|
339 let (i, (time, opcode)) = (le_i32, le_u16).parse(i)?; |
|
714
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
340 if time == -1 || opcode == 0xffff { |
|
755
fc937d93a57c
Bump nom to version 6, and image to 0.23.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
728
diff
changeset
|
341 return Err(Err::Error(nom::error::Error::new(i, ErrorKind::Eof))); |
|
714
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
342 } |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
343 |
|
774
d08eb4c9fce3
formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents:
757
diff
changeset
|
344 let (i, (size, rank_mask, param_mask)) = (le_u16, le_u16, le_u16).parse(i)?; |
|
714
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
345 let rank_mask = Rank::from_bits(rank_mask).unwrap(); |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
346 let (i, instr) = parse_sub_instruction_args(i, opcode)?; |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
347 assert_eq!(input.len() - i.len(), size as usize); |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
348 let call = CallSub { time, rank_mask, param_mask, instr }; |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
349 Ok((i, call)) |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
350 } |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
351 |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
352 fn parse_sub(i: &[u8]) -> IResult<&[u8], Sub> { |
|
774
d08eb4c9fce3
formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents:
757
diff
changeset
|
353 let (i, instructions) = many0(parse_sub_instruction).parse(i)?; |
|
714
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
354 let sub = Sub { instructions }; |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
355 Ok((i, sub)) |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
356 } |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
357 |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
358 fn parse_main_instruction(input: &[u8]) -> IResult<&[u8], CallMain> { |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
359 let i = &input[..]; |
|
774
d08eb4c9fce3
formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents:
757
diff
changeset
|
360 let (i, (time, sub)) = (le_u16, le_u16).parse(i)?; |
|
714
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
361 if time == 0xffff && sub == 4 { |
|
755
fc937d93a57c
Bump nom to version 6, and image to 0.23.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
728
diff
changeset
|
362 return Err(Err::Error(nom::error::Error::new(i, ErrorKind::Eof))); |
|
714
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
363 } |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
364 |
|
774
d08eb4c9fce3
formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents:
757
diff
changeset
|
365 let (i, (opcode, size)) = (le_u16, le_u16).parse(i)?; |
|
714
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
366 let size = size as usize; |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
367 let (i, instr) = parse_main_instruction_args(i, opcode)?; |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
368 assert_eq!(input.len() - i.len(), size as usize); |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
369 let call = CallMain { time, sub, instr }; |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
370 Ok((i, call)) |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
371 } |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
372 |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
373 fn parse_main(i: &[u8]) -> IResult<&[u8], Main> { |
|
774
d08eb4c9fce3
formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents:
757
diff
changeset
|
374 let (i, instructions) = many0(parse_main_instruction).parse(i)?; |
|
714
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
375 let main = Main { instructions }; |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
376 Ok((i, main)) |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
377 } |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
378 |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
379 fn parse_ecl(input: &[u8]) -> IResult<&[u8], Ecl> { |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
380 let i = input; |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
381 |
|
774
d08eb4c9fce3
formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents:
757
diff
changeset
|
382 let (i, (sub_count, main_count)) = (le_u16, le_u16).parse(i)?; |
|
703
81232dac8136
ecl: simplify parsing with more combinators.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
696
diff
changeset
|
383 let sub_count = sub_count as usize; |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
384 |
|
714
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
385 if main_count != 0 { |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
386 // TODO: use a better error. |
|
755
fc937d93a57c
Bump nom to version 6, and image to 0.23.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
728
diff
changeset
|
387 return Err(Err::Error(nom::error::Error::new(i, ErrorKind::Eof))); |
|
714
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
388 } |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
389 |
|
774
d08eb4c9fce3
formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents:
757
diff
changeset
|
390 let (_, (main_offsets, sub_offsets)) = ( |
|
714
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
391 count(le_u32, 3), |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
392 count(le_u32, sub_count), |
|
774
d08eb4c9fce3
formats: Upgrade nom to version 8
Link Mauve <linkmauve@linkmauve.fr>
parents:
757
diff
changeset
|
393 ).parse(i)?; |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
394 |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
395 // Read all subs. |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
396 let mut subs = Vec::new(); |
|
703
81232dac8136
ecl: simplify parsing with more combinators.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
696
diff
changeset
|
397 for offset in sub_offsets.into_iter().map(|offset| offset as usize) { |
|
714
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
398 let (_, sub) = parse_sub(&input[offset..])?; |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
399 subs.push(sub); |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
400 } |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
401 |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
402 // Read all mains (always a single one atm). |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
403 let mut mains = Vec::new(); |
|
703
81232dac8136
ecl: simplify parsing with more combinators.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
696
diff
changeset
|
404 for offset in main_offsets.into_iter().map(|offset| offset as usize) { |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
405 if offset == 0 { |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
406 break; |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
407 } |
|
714
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
408 let (_, main) = parse_main(&input[offset..])?; |
|
fcc8f736c746
ecl: Simplify parsing.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
703
diff
changeset
|
409 mains.push(main); |
|
650
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
410 } |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
411 |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
412 let ecl = Ecl { |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
413 subs, |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
414 mains, |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
415 }; |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
416 Ok((b"", ecl)) |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
417 } |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
418 |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
419 #[cfg(test)] |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
420 mod tests { |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
421 use super::*; |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
422 use std::io::{self, Read}; |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
423 use std::fs::File; |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
424 |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
425 #[test] |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
426 fn ecl() { |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
427 let file = File::open("EoSD/ST/ecldata1.ecl").unwrap(); |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
428 let mut file = io::BufReader::new(file); |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
429 let mut buf = vec![]; |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
430 file.read_to_end(&mut buf).unwrap(); |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
431 let (_, ecl) = Ecl::from_slice(&buf).unwrap(); |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
432 assert_eq!(ecl.subs.len(), 24); |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
433 assert_eq!(ecl.mains.len(), 1); |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
434 } |
|
f6bfc9e6dab0
Add an ECL parser.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
435 } |
