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; }