From 19fbe7282280a426f82270ca4ddd6accad284ea5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Magalh=C3=A3es?= <joamag@gmail.com> Date: Tue, 1 Aug 2023 15:25:12 +0100 Subject: [PATCH] chore: better cheat code handling --- frontends/libretro/src/lib.rs | 2 +- frontends/sdl/src/main.rs | 6 +++--- src/gb.rs | 7 +++++-- src/genie.rs | 33 +++++++++++++++++++++++++++++---- 4 files changed, 38 insertions(+), 10 deletions(-) diff --git a/frontends/libretro/src/lib.rs b/frontends/libretro/src/lib.rs index 9b1e3070..4829b99e 100644 --- a/frontends/libretro/src/lib.rs +++ b/frontends/libretro/src/lib.rs @@ -374,7 +374,7 @@ pub extern "C" fn retro_cheat_set(_index: c_uint, enabled: bool, code: *const c_ let emulator = unsafe { EMULATOR.as_mut().unwrap() }; let code_c = unsafe { CStr::from_ptr(code) }; let code_s = code_c.to_string_lossy().into_owned(); - emulator.add_cheat_code(&code_s) + emulator.add_cheat_code(&code_s).unwrap(); } #[no_mangle] diff --git a/frontends/sdl/src/main.rs b/frontends/sdl/src/main.rs index 12e43c3a..664e23ac 100644 --- a/frontends/sdl/src/main.rs +++ b/frontends/sdl/src/main.rs @@ -237,9 +237,9 @@ impl Emulator { self.ram_path = ram_path; // @TODO: hardcoded adding of game genie codes - self.system.add_cheat_code("00A-17B-C49"); - self.system.add_cheat_code("008-60A-E6E"); - self.system.add_cheat_code("99D-49C-E62"); + self.system.add_cheat_code("00A-17B-C49").unwrap(); + self.system.add_cheat_code("008-60A-E6E").unwrap(); + self.system.add_cheat_code("99D-49C-E62").unwrap(); } pub fn reset(&mut self) { diff --git a/src/gb.rs b/src/gb.rs index d0d7379e..6627cdee 100644 --- a/src/gb.rs +++ b/src/gb.rs @@ -1034,8 +1034,11 @@ impl GameBoy { self.reset_game_genie(); } - pub fn add_cheat_code(&mut self, code: &str) { - self.add_game_genie_code(code).unwrap(); + pub fn add_cheat_code(&mut self, code: &str) -> Result<bool, String> { + match self.add_game_genie_code(code) { + Ok(_) => Ok(true), + Err(message) => Err(message), + } } pub fn reset_game_genie(&mut self) { diff --git a/src/genie.rs b/src/genie.rs index 5c1b0caa..f9a4b89b 100644 --- a/src/genie.rs +++ b/src/genie.rs @@ -38,7 +38,7 @@ impl GameGenie { pub fn add_code(&mut self, code: &str) -> Result<&GameGenieCode, String> { let genie_code = match GameGenieCode::from_code(code, None) { Ok(genie_code) => genie_code, - Err(e) => return Err(e), + Err(message) => return Err(message), }; let addr = genie_code.addr; self.codes.insert(addr, genie_code); @@ -202,7 +202,7 @@ mod tests { #[test] fn test_from_code() { - let mut game_genie_code = GameGenieCode::from_code("00A-17B-C49").unwrap(); + let mut game_genie_code = GameGenieCode::from_code("00A-17B-C49", None).unwrap(); assert_eq!(game_genie_code.code, "00A-17B-C49"); assert_eq!(game_genie_code.addr, 0x4a17); assert_eq!(game_genie_code.new_data, 0x00); @@ -211,8 +211,20 @@ mod tests { assert_eq!(game_genie_code.condensed, false); assert_eq!(game_genie_code.is_valid(0xc8), true); assert_eq!(game_genie_code.is_valid(0xc9), false); + assert_eq!(game_genie_code.patch_data(0x12), 0x00); - game_genie_code = GameGenieCode::from_code("00A+17B+C49").unwrap(); + game_genie_code = GameGenieCode::from_code("00A+17B+C49", None).unwrap(); + assert_eq!(game_genie_code.code, "00A+17B+C49"); + assert_eq!(game_genie_code.addr, 0x4a17); + assert_eq!(game_genie_code.new_data, 0x00); + assert_eq!(game_genie_code.old_data, 0xc8); + assert_eq!(game_genie_code.additive, false); + assert_eq!(game_genie_code.condensed, false); + assert_eq!(game_genie_code.is_valid(0xc8), true); + assert_eq!(game_genie_code.is_valid(0xc9), false); + assert_eq!(game_genie_code.patch_data(0x12), 0x00); + + game_genie_code = GameGenieCode::from_code("00A+17B+C49", Some(true)).unwrap(); assert_eq!(game_genie_code.code, "00A+17B+C49"); assert_eq!(game_genie_code.addr, 0x4a17); assert_eq!(game_genie_code.new_data, 0x00); @@ -221,8 +233,20 @@ mod tests { assert_eq!(game_genie_code.condensed, false); assert_eq!(game_genie_code.is_valid(0xc8), true); assert_eq!(game_genie_code.is_valid(0xc9), false); + assert_eq!(game_genie_code.patch_data(0x12), 0x12); + + game_genie_code = GameGenieCode::from_code("00A+17B", None).unwrap(); + assert_eq!(game_genie_code.code, "00A+17B"); + assert_eq!(game_genie_code.addr, 0x4a17); + assert_eq!(game_genie_code.new_data, 0x00); + assert_eq!(game_genie_code.old_data, 0x00); + assert_eq!(game_genie_code.additive, false); + assert_eq!(game_genie_code.condensed, true); + assert_eq!(game_genie_code.is_valid(0xc8), true); + assert_eq!(game_genie_code.is_valid(0xc9), true); + assert_eq!(game_genie_code.patch_data(0x12), 0x00); - game_genie_code = GameGenieCode::from_code("00A+17B").unwrap(); + game_genie_code = GameGenieCode::from_code("00A+17B", Some(true)).unwrap(); assert_eq!(game_genie_code.code, "00A+17B"); assert_eq!(game_genie_code.addr, 0x4a17); assert_eq!(game_genie_code.new_data, 0x00); @@ -231,5 +255,6 @@ mod tests { assert_eq!(game_genie_code.condensed, true); assert_eq!(game_genie_code.is_valid(0xc8), true); assert_eq!(game_genie_code.is_valid(0xc9), true); + assert_eq!(game_genie_code.patch_data(0x12), 0x012); } } -- GitLab