From ab2b3811813cfb628a987b7e95eeed88a97cb483 Mon Sep 17 00:00:00 2001 From: G2-Games Date: Thu, 19 Sep 2024 02:05:54 -0500 Subject: [PATCH] Added more opcodes --- luca_script/Cargo.toml | 2 ++ luca_script/src/main.rs | 68 ++++++++++++++++++++++++++++------------- 2 files changed, 49 insertions(+), 21 deletions(-) diff --git a/luca_script/Cargo.toml b/luca_script/Cargo.toml index a81e3dc..e88bc3c 100644 --- a/luca_script/Cargo.toml +++ b/luca_script/Cargo.toml @@ -6,8 +6,10 @@ authors.workspace = true [dependencies] byteorder = "1.5" +encoding_rs = "0.8.34" num-derive = "0.4" num-traits = "0.2" +safe-transmute = "0.11.3" [lints] workspace = true diff --git a/luca_script/src/main.rs b/luca_script/src/main.rs index 66790be..84d5a76 100644 --- a/luca_script/src/main.rs +++ b/luca_script/src/main.rs @@ -8,6 +8,7 @@ use safe_transmute::{transmute_many, SingleManyGuard}; fn main() { let mut script = BufReader::new(File::open("LOOPERS_scenario_01").unwrap()); + let mut unknown_count = 0; while let Ok(byte) = script.read_u8() { if let Some(opcode) = Opcode::from_u8(byte) { println!( @@ -20,13 +21,16 @@ fn main() { parse_opcode(opcode, &mut script).unwrap(); } else { println!( - "{:X?}: {:#04X?} (ยก{:?}!)", + "{:X?}: {:#04X?} (\x1b[0;41m{:?}\x1b[0m)", script.stream_position().unwrap() - 1, byte, Opcode::UNKNOWN, ); + unknown_count += 1; } } + + println!("Encountered {unknown_count} unknown opcodes, it is very likely these are incorrect"); } fn parse_opcode(opcode: Opcode, mut input: R) -> Result<(), io::Error> { @@ -57,37 +61,50 @@ fn parse_opcode(opcode: Opcode, mut input: R) -> Result<(), i println!("-----"); }, Opcode::IMAGELOAD => { - let mode = input.read_u8().unwrap(); + let mode = input.read_u8()?; println!("Mode: {mode}"); if mode == 0 { - println!("Unknown: {}", input.read_u16::().unwrap()); + println!("Unknown: {}", input.read_u16::()?); } else { - println!("Unknown: {}", input.read_u16::().unwrap()); - println!("Unknown: {}", input.read_u16::().unwrap()); + println!("Unknown: {}", input.read_u16::()?); + println!("Unknown: {}", input.read_u16::()?); } - let image_id = input.read_u16::().unwrap(); + let image_id = input.read_u32::()?; println!("Image ID: {image_id}"); println!("-----"); }, - /* - Opcode::SELECT => { - let var_id = script.read_u16::().unwrap(); - script.read_u16::().unwrap(); - script.read_u16::().unwrap(); - script.read_u16::().unwrap(); - let msg_str = script.read_u16::().unwrap(); - script.read_u16::().unwrap(); - script.read_u16::().unwrap(); - script.read_u16::().unwrap(); - println!("{var_id} & {msg_str}\n-----"); - }, - */ + Opcode::BGM => { + input.read_u8().unwrap(); // ? + input.read_u16::().unwrap(); // ? + let bgm_id = input.read_u32::().unwrap(); + + println!("ID: \x1b[0;45m{bgm_id}\x1b[0m"); + println!("-----"); + } Opcode::JUMP => { + input.read_u8().unwrap(); input.read_u16::().unwrap(); } Opcode::VARSTR => { - println!("Unknown: {}", input.read_u32::()?); + let id = input.read_u16::().unwrap(); + println!("ID: {id}"); + println!("-----"); + } + Opcode::VARSTR_SET => { + let varstr = VarStrSet { + opcode, + variant: input.read_u8()?, + unknown1: input.read_u16::()?, + unknown2: input.read_u16::()?, + string: ScriptString::read(&mut input)?, + unknown3: input.read_u16::()?, + }; + //println!("{}", varstr.string.to_string()); + println!("{:02X?}", varstr.variant); + println!("{:02X?}", varstr.unknown1); + println!("ID: {}", varstr.unknown2); + println!("{:02X?}", varstr.unknown3); println!("-----"); } _ => (), @@ -251,6 +268,16 @@ struct Message { strings: Vec, } +#[derive(Debug, PartialEq, Eq)] +struct VarStrSet { + opcode: Opcode, + variant: u8, + unknown1: u16, + unknown2: u16, + string: ScriptString, + unknown3: u16, +} + #[derive(Debug, PartialEq, Eq)] struct ScriptString { length: i16, @@ -307,7 +334,6 @@ impl ToString for ScriptString { StringFormat::UTF8 | StringFormat::ASCII => String::from_utf8_lossy(&self.buffer).to_string(), StringFormat::UTF16 => String::from_utf16_lossy(transmute_many::(&self.buffer).unwrap()), StringFormat::ShiftJIS => SHIFT_JIS.decode(&self.buffer).0.to_string(), - _ => unimplemented!(), } } }