Skip to content
Snippets Groups Projects
Verified Commit 19fbe728 authored by João Magalhães's avatar João Magalhães :rocket:
Browse files

chore: better cheat code handling

parent 3efbb52b
No related branches found
No related tags found
1 merge request!25Game Genie support
Pipeline #3120 passed
...@@ -374,7 +374,7 @@ pub extern "C" fn retro_cheat_set(_index: c_uint, enabled: bool, code: *const c_ ...@@ -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 emulator = unsafe { EMULATOR.as_mut().unwrap() };
let code_c = unsafe { CStr::from_ptr(code) }; let code_c = unsafe { CStr::from_ptr(code) };
let code_s = code_c.to_string_lossy().into_owned(); 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] #[no_mangle]
......
...@@ -237,9 +237,9 @@ impl Emulator { ...@@ -237,9 +237,9 @@ impl Emulator {
self.ram_path = ram_path; self.ram_path = ram_path;
// @TODO: hardcoded adding of game genie codes // @TODO: hardcoded adding of game genie codes
self.system.add_cheat_code("00A-17B-C49"); self.system.add_cheat_code("00A-17B-C49").unwrap();
self.system.add_cheat_code("008-60A-E6E"); self.system.add_cheat_code("008-60A-E6E").unwrap();
self.system.add_cheat_code("99D-49C-E62"); self.system.add_cheat_code("99D-49C-E62").unwrap();
} }
pub fn reset(&mut self) { pub fn reset(&mut self) {
......
...@@ -1034,8 +1034,11 @@ impl GameBoy { ...@@ -1034,8 +1034,11 @@ impl GameBoy {
self.reset_game_genie(); self.reset_game_genie();
} }
pub fn add_cheat_code(&mut self, code: &str) { pub fn add_cheat_code(&mut self, code: &str) -> Result<bool, String> {
self.add_game_genie_code(code).unwrap(); match self.add_game_genie_code(code) {
Ok(_) => Ok(true),
Err(message) => Err(message),
}
} }
pub fn reset_game_genie(&mut self) { pub fn reset_game_genie(&mut self) {
......
...@@ -38,7 +38,7 @@ impl GameGenie { ...@@ -38,7 +38,7 @@ impl GameGenie {
pub fn add_code(&mut self, code: &str) -> Result<&GameGenieCode, String> { pub fn add_code(&mut self, code: &str) -> Result<&GameGenieCode, String> {
let genie_code = match GameGenieCode::from_code(code, None) { let genie_code = match GameGenieCode::from_code(code, None) {
Ok(genie_code) => genie_code, Ok(genie_code) => genie_code,
Err(e) => return Err(e), Err(message) => return Err(message),
}; };
let addr = genie_code.addr; let addr = genie_code.addr;
self.codes.insert(addr, genie_code); self.codes.insert(addr, genie_code);
...@@ -202,7 +202,7 @@ mod tests { ...@@ -202,7 +202,7 @@ mod tests {
#[test] #[test]
fn test_from_code() { 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.code, "00A-17B-C49");
assert_eq!(game_genie_code.addr, 0x4a17); assert_eq!(game_genie_code.addr, 0x4a17);
assert_eq!(game_genie_code.new_data, 0x00); assert_eq!(game_genie_code.new_data, 0x00);
...@@ -211,8 +211,20 @@ mod tests { ...@@ -211,8 +211,20 @@ mod tests {
assert_eq!(game_genie_code.condensed, false); assert_eq!(game_genie_code.condensed, false);
assert_eq!(game_genie_code.is_valid(0xc8), true); assert_eq!(game_genie_code.is_valid(0xc8), true);
assert_eq!(game_genie_code.is_valid(0xc9), false); 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.code, "00A+17B+C49");
assert_eq!(game_genie_code.addr, 0x4a17); assert_eq!(game_genie_code.addr, 0x4a17);
assert_eq!(game_genie_code.new_data, 0x00); assert_eq!(game_genie_code.new_data, 0x00);
...@@ -221,8 +233,20 @@ mod tests { ...@@ -221,8 +233,20 @@ mod tests {
assert_eq!(game_genie_code.condensed, false); assert_eq!(game_genie_code.condensed, false);
assert_eq!(game_genie_code.is_valid(0xc8), true); assert_eq!(game_genie_code.is_valid(0xc8), true);
assert_eq!(game_genie_code.is_valid(0xc9), false); 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.code, "00A+17B");
assert_eq!(game_genie_code.addr, 0x4a17); assert_eq!(game_genie_code.addr, 0x4a17);
assert_eq!(game_genie_code.new_data, 0x00); assert_eq!(game_genie_code.new_data, 0x00);
...@@ -231,5 +255,6 @@ mod tests { ...@@ -231,5 +255,6 @@ mod tests {
assert_eq!(game_genie_code.condensed, true); assert_eq!(game_genie_code.condensed, true);
assert_eq!(game_genie_code.is_valid(0xc8), true); assert_eq!(game_genie_code.is_valid(0xc8), true);
assert_eq!(game_genie_code.is_valid(0xc9), true); assert_eq!(game_genie_code.is_valid(0xc9), true);
assert_eq!(game_genie_code.patch_data(0x12), 0x012);
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment