From 944b48a732b7bd36c766aec31f2c4c0c5a06893a Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 8 Dec 2014 17:33:02 +0100 Subject: [PATCH] (Untested) Implement cheats --- src/cheat.c | 23 +++++++++++++++++++++++ src/cheat.h | 2 ++ src/drivers/libretro/libretro.c | 29 ++++++++++++++++++++++++++--- 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/src/cheat.c b/src/cheat.c index 85795bd..9ebe329 100644 --- a/src/cheat.c +++ b/src/cheat.c @@ -302,6 +302,29 @@ void FCEU_FlushGameCheats(FILE *override, int nosave) { RebuildSubCheats(); /* Remove memory handlers. */ } +void FCEU_ResetCheats(void) +{ + if (CheatComp) { + free(CheatComp); + CheatComp = 0; + } + + if (cheats) + { + struct CHEATF *next = cheats; + for (;; ) { + struct CHEATF *last = next; + next = next->next; + free(last->name); + free(last); + if (!next) break; + } + cheats = cheatsl = 0; + } + + RebuildSubCheats(); /* Remove memory handlers. */ +} + int FCEUI_AddCheat(const char *name, uint32 addr, uint8 val, int compare, int type) { char *t; diff --git a/src/cheat.h b/src/cheat.h index b612888..824e513 100644 --- a/src/cheat.h +++ b/src/cheat.h @@ -9,4 +9,6 @@ void FCEU_FlushGameCheats(FILE *override, int nosave); void FCEU_ApplyPeriodicCheats(void); void FCEU_PowerCheats(void); +void FCEU_ResetCheats(void); + #endif diff --git a/src/drivers/libretro/libretro.c b/src/drivers/libretro/libretro.c index 89f16eb..c1a9433 100644 --- a/src/drivers/libretro/libretro.c +++ b/src/drivers/libretro/libretro.c @@ -797,10 +797,33 @@ bool retro_unserialize(const void * data, size_t size) } void retro_cheat_reset(void) -{} +{ + FCEU_ResetCheats(); +} -void retro_cheat_set(unsigned a, bool b, const char* c) -{ } +void retro_cheat_set(unsigned index, bool enabled, const char *code) +{ + char name[256]; + sprintf(name, "N/A"); + uint16 a; + uint8 v; + int c; + int type = 1; + + if (FCEUI_DecodeGG(code, &a, &v, &c)) + goto input_cheat; + + /* Not a Game Genie code. */ + + if (FCEUI_DecodePAR(code, &a, &v, &c, &type)) + goto input_cheat; + + /* Not a Pro Action Replay code. */ + + return; +input_cheat: + FCEUI_AddCheat(name, a, v, c, type); +} bool retro_load_game(const struct retro_game_info *game) {