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
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,
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 }