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