bool GBACheatAddAutodetect(struct GBACheatSet* set, uint32_t op1, uint32_t op2) { uint32_t o1 = op1; uint32_t o2 = op2; char line[18] = "XXXXXXXX XXXXXXXX"; snprintf(line, sizeof(line), "%08X %08X", op1, op2); GBACheatRegisterLine(set, line); switch (set->gsaVersion) { case 0: // Try to detect GameShark version GBACheatDecryptGameShark(&o1, &o2, GBACheatGameSharkSeeds); if ((o1 & 0xF0000000) == 0xF0000000 && !(o2 & 0xFFFFFCFE)) { GBACheatSetGameSharkVersion(set, 1); return GBACheatAddGameSharkRaw(set, o1, o2); } o1 = op1; o2 = op2; GBACheatDecryptGameShark(&o1, &o2, GBACheatProActionReplaySeeds); if ((o1 & 0xFE000000) == 0xC4000000 && !(o2 & 0xFFFF0000)) { GBACheatSetGameSharkVersion(set, 3); return GBACheatAddProActionReplayRaw(set, o1, o2); } break; case 1: GBACheatDecryptGameShark(&o1, &o2, set->gsaSeeds); return GBACheatAddGameSharkRaw(set, o1, o2); case 3: GBACheatDecryptGameShark(&o1, &o2, set->gsaSeeds); return GBACheatAddProActionReplayRaw(set, o1, o2); } return false; }
static bool GBACheatAddAutodetect(struct GBACheatSet* set, uint32_t op1, uint32_t op2) { uint32_t o1 = op1; uint32_t o2 = op2; char line[18] = "XXXXXXXX XXXXXXXX"; snprintf(line, sizeof(line), "%08X %08X", op1, op2); int gsaP, rgsaP, parP, rparP; int maxProbability = INT_MIN; switch (set->gsaVersion) { case 0: // Try to detect GameShark version GBACheatDecryptGameShark(&o1, &o2, GBACheatGameSharkSeeds); gsaP = GBACheatGameSharkProbability(o1, o2); o1 = op1; o2 = op2; if (gsaP > maxProbability) { maxProbability = gsaP; GBACheatSetGameSharkVersion(set, 1); } GBACheatDecryptGameShark(&o1, &o2, GBACheatProActionReplaySeeds); parP = GBACheatProActionReplayProbability(o1, o2); if (parP > maxProbability) { maxProbability = parP; GBACheatSetGameSharkVersion(set, 3); } rgsaP = GBACheatGameSharkProbability(op1, op1); if (rgsaP > maxProbability) { maxProbability = rgsaP; GBACheatSetGameSharkVersion(set, 2); } rparP = GBACheatProActionReplayProbability(op1, op1); if (rparP > maxProbability) { maxProbability = rparP; GBACheatSetGameSharkVersion(set, 4); } if (set->gsaVersion < 3) { return GBACheatAddGameShark(set, op1, op2); } else { return GBACheatAddProActionReplay(set, op1, op2); } break; case 1: case 2: return GBACheatAddGameShark(set, o1, o2); case 3: case 4: return GBACheatAddProActionReplay(set, o1, o2); } return false; }
static void GBACheatParseDirectives(struct mCheatSet* set, const struct StringList* directives) { struct GBACheatSet* cheats = (struct GBACheatSet*) set; size_t d; for (d = 0; d < StringListSize(directives); ++d) { const char* directive = *StringListGetConstPointer(directives, d); if (strcmp(directive, "GSAv1") == 0) { GBACheatSetGameSharkVersion(cheats, 1); continue; } if (strcmp(directive, "PARv3") == 0) { GBACheatSetGameSharkVersion(cheats, 3); continue; } } }
bool GBACheatParseFile(struct GBACheatDevice* device, struct VFile* vf) { char cheat[MAX_LINE_LENGTH]; struct GBACheatSet* set = 0; struct GBACheatSet* newSet; int gsaVersion = 0; bool nextDisabled = false; bool reset = false; while (true) { size_t i = 0; ssize_t bytesRead = vf->readline(vf, cheat, sizeof(cheat)); if (bytesRead == 0) { break; } if (bytesRead < 0) { return false; } while (isspace((int) cheat[i])) { ++i; } switch (cheat[i]) { case '#': do { ++i; } while (isspace((int) cheat[i])); newSet = malloc(sizeof(*set)); GBACheatSetInit(newSet, &cheat[i]); newSet->enabled = !nextDisabled; nextDisabled = false; if (set) { GBACheatAddSet(device, set); } if (set && !reset) { GBACheatSetCopyProperties(newSet, set); } else { GBACheatSetGameSharkVersion(newSet, gsaVersion); } reset = false; set = newSet; break; case '!': do { ++i; } while (isspace((int) cheat[i])); if (strncasecmp(&cheat[i], "GSAv", 4) == 0 || strncasecmp(&cheat[i], "PARv", 4) == 0) { i += 4; gsaVersion = atoi(&cheat[i]); break; } if (strcasecmp(&cheat[i], "disabled") == 0) { nextDisabled = true; break; } if (strcasecmp(&cheat[i], "reset") == 0) { reset = true; break; } break; default: if (!set) { set = malloc(sizeof(*set)); GBACheatSetInit(set, 0); set->enabled = !nextDisabled; nextDisabled = false; GBACheatSetGameSharkVersion(set, gsaVersion); } GBACheatAddLine(set, cheat); break; } } if (set) { GBACheatAddSet(device, set); } return true; }