1#[macro_use] extern crate nom;
9extern crate byteorder;
10
11mod mscb_file;
12pub use mscb_file::MscsbFile;
13
14#[derive(Debug, Copy, Clone)]
15pub enum Cmd {
16 Nop, Unk1, Begin {
19 arg_count: u16,
20 var_count: u16
21 }, End, Jump {
24 loc: u32
25 }, Jump5 {
27 loc: u32
28 }, Return6, Return7, Return8, Return9, PushInt {
34 val: u32,
35 }, PushVar {
37 var_type: u8,
38 var_num: u16,
39 }, ErrorC,
41 PushShort {
42 val: u16
43 }, AddI, SubI, MultI,DivI, ModI, NegI, IncI {
51 var_type: u8,
52 var_num: u16,
53 }, DecI{
55 var_type: u8,
56 var_num: u16,
57 }, AndI, OrI, NotI, XorI, ShiftL,ShiftR,SetVar {
65 var_type: u8,
66 var_num: u16,
67 }, AddVarBy{
69 var_type: u8,
70 var_num: u16,
71 }, SubVarBy{
73 var_type: u8,
74 var_num: u16,
75 }, MultVarBy{
77 var_type: u8,
78 var_num: u16,
79 },DivVarBy{
81 var_type: u8,
82 var_num: u16,
83 }, ModVarBy{
85 var_type: u8,
86 var_num: u16,
87 }, AndVarBy{
89 var_type: u8,
90 var_num: u16,
91 }, OrVarBy{
93 var_type: u8,
94 var_num: u16,
95 }, XorVarBy{
97 var_type: u8,
98 var_num: u16,
99 }, Equals, NotEquals, LessThan, LessOrEqual,Greater, GreaterOrEqual,Not, PrintF {
108 arg_count: u8
109 }, Sys {
111 arg_count: u8,
112 sys_num: u8,
113 }, Try {
115 loc: u32,
116 }, CallFunc {
118 arg_count: u8,
119 }, CallFunc2 {
121 arg_count: u8,
122 }, CallFunc3 {
124 arg_count: u8,
125 }, Push, Pop, If {
129 loc: u32,
130 }, IfNot {
132 loc: u32,
133 },Else {
135 loc: u32,
136 }, Error37, IntToFloat {
139 stack_pos: u8,
140 }, FloatToInt {
142 stack_pos: u8,
143 }, AddF, SubF, MultF,DivF, NegF, IncF{
150 var_type: u8,
151 var_num: u16,
152 }, DecF{
154 var_type: u8,
155 var_num: u16,
156 }, VarSetF{
158 var_type: u8,
159 var_num: u16,
160 }, AddVarByF{
162 var_type: u8,
163 var_num: u16,
164 }, SubVarByF{
166 var_type: u8,
167 var_num: u16,
168 }, MultVarByF{
170 var_type: u8,
171 var_num: u16,
172 },DivVarByF{
174 var_type: u8,
175 var_num: u16,
176 }, EqualsF, NotEqualsF, LessThanF, LessOrEqualF,GreaterF, GreaterOrEqualF,Error4C, Exit, }
186
187#[derive(Debug, Clone)]
188pub struct Command {
189 pub cmd: Cmd,
190 pub push_bit: bool,
191 pub position: u32,
192}
193
194#[derive(Debug, Clone)]
195pub struct Script {
196 pub commands: Vec<Command>,
197 pub bounds: (u32, u32),
198}
199
200impl Script {
201 pub fn iter(&self) -> std::slice::Iter<Command> {
202 self.commands.iter()
203 }
204}
205
206#[cfg(test)]
207mod test {
208 use super::*;
209
210 #[test]
211 fn test_parser() {
212 let pikachu = MscsbFile::open("/home/jam/dev/msc/pikachu.mscsb").unwrap();
213 println!("# of scripts - {}", pikachu.scripts.len());
214 println!("Script 1\n--------");
215 for c in pikachu.scripts[0].iter() {
216 println!("{:?}", c);
217 }
218 }
219}
220