Merge pull request #1623 from s5bug/master

Fix various things about the cheat system
This commit is contained in:
TuxSH 2022-03-08 23:50:20 +00:00 committed by GitHub
commit 26ea031f0e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -322,18 +322,32 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const
// Simple: If the value at address 0XXXXXXX is less than the value YYYYYYYY. // Simple: If the value at address 0XXXXXXX is less than the value YYYYYYYY.
// Example: 323D6B28 10000000 // Example: 323D6B28 10000000
{ {
bool newSkip;
u32 value = 0; u32 value = 0;
switch (cheat_state.conditionalMode)
{
case 0x0:
if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0;
newSkip = !(value < arg1);
break;
case 0x1:
if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0;
newSkip = !(value < *activeData());
break;
case 0x2:
newSkip = !(*activeData() < arg1);
break;
case 0x3:
newSkip = !(*activeStorage(cheat) < arg1);
break;
case 0x4:
newSkip = !(*activeData() < *activeStorage(cheat));
break;
default:
return 0;
}
cheat_state.ifStack <<= 1; cheat_state.ifStack <<= 1;
if (value < arg1) cheat_state.ifStack |= (newSkip || skipExecution) ? 1 : 0;
{
cheat_state.ifStack |= skipExecution ? 1 : 0;
}
else
{
cheat_state.ifStack |= 1;
}
cheat_state.ifCount++; cheat_state.ifCount++;
} }
break; break;
@ -344,18 +358,32 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const
// Simple: If the value at address 0XXXXXXX is greater than the value YYYYYYYY. // Simple: If the value at address 0XXXXXXX is greater than the value YYYYYYYY.
// Example: 423D6B28 10000000 // Example: 423D6B28 10000000
{ {
bool newSkip;
u32 value = 0; u32 value = 0;
switch (cheat_state.conditionalMode)
{
case 0x0:
if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0;
newSkip = !(value > arg1);
break;
case 0x1:
if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0;
newSkip = !(value > *activeData());
break;
case 0x2:
newSkip = !(*activeData() > arg1);
break;
case 0x3:
newSkip = !(*activeStorage(cheat) > arg1);
break;
case 0x4:
newSkip = !(*activeData() > *activeStorage(cheat));
break;
default:
return 0;
}
cheat_state.ifStack <<= 1; cheat_state.ifStack <<= 1;
if (value > arg1) cheat_state.ifStack |= (newSkip || skipExecution) ? 1 : 0;
{
cheat_state.ifStack |= skipExecution ? 1 : 0;
}
else
{
cheat_state.ifStack |= 1;
}
cheat_state.ifCount++; cheat_state.ifCount++;
} }
break; break;
@ -366,18 +394,32 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const
// Simple: If the value at address 0XXXXXXX is equal to the value YYYYYYYY. // Simple: If the value at address 0XXXXXXX is equal to the value YYYYYYYY.
// Example: 523D6B28 10000000 // Example: 523D6B28 10000000
{ {
bool newSkip;
u32 value = 0; u32 value = 0;
switch (cheat_state.conditionalMode)
{
case 0x0:
if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0;
newSkip = !(value == arg1);
break;
case 0x1:
if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0;
newSkip = !(value == *activeData());
break;
case 0x2:
newSkip = !(*activeData() == arg1);
break;
case 0x3:
newSkip = !(*activeStorage(cheat) == arg1);
break;
case 0x4:
newSkip = !(*activeData() == *activeStorage(cheat));
break;
default:
return 0;
}
cheat_state.ifStack <<= 1; cheat_state.ifStack <<= 1;
if (value == arg1) cheat_state.ifStack |= (newSkip || skipExecution) ? 1 : 0;
{
cheat_state.ifStack |= skipExecution ? 1 : 0;
}
else
{
cheat_state.ifStack |= 1;
}
cheat_state.ifCount++; cheat_state.ifCount++;
} }
break; break;
@ -388,18 +430,32 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const
// Simple: If the value at address 0XXXXXXX is not equal to the value YYYYYYYY. // Simple: If the value at address 0XXXXXXX is not equal to the value YYYYYYYY.
// Example: 623D6B28 10000000 // Example: 623D6B28 10000000
{ {
bool newSkip;
u32 value = 0; u32 value = 0;
switch (cheat_state.conditionalMode)
{
case 0x0:
if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0; if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0;
newSkip = !(value != arg1);
break;
case 0x1:
if (!Cheat_Read32(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0;
newSkip = !(value != *activeData());
break;
case 0x2:
newSkip = !(*activeData() != arg1);
break;
case 0x3:
newSkip = !(*activeStorage(cheat) != arg1);
break;
case 0x4:
newSkip = !(*activeData() != *activeStorage(cheat));
break;
default:
return 0;
}
cheat_state.ifStack <<= 1; cheat_state.ifStack <<= 1;
if (value != arg1) cheat_state.ifStack |= (newSkip || skipExecution) ? 1 : 0;
{
cheat_state.ifStack |= skipExecution ? 1 : 0;
}
else
{
cheat_state.ifStack |= 1;
}
cheat_state.ifCount++; cheat_state.ifCount++;
} }
break; break;
@ -413,13 +469,14 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const
bool newSkip; bool newSkip;
u16 mask = (u16) ((arg1 >> 16) & 0xFFFF); u16 mask = (u16) ((arg1 >> 16) & 0xFFFF);
u16 value = 0; u16 value = 0;
if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0;
switch (cheat_state.conditionalMode) switch (cheat_state.conditionalMode)
{ {
case 0x0: case 0x0:
if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0;
newSkip = !((value & (~mask)) < (arg1 & 0xFFFF)); newSkip = !((value & (~mask)) < (arg1 & 0xFFFF));
break; break;
case 0x1: case 0x1:
if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0;
newSkip = !((value & (~mask)) < (*activeData() & (~mask))); newSkip = !((value & (~mask)) < (*activeData() & (~mask)));
break; break;
case 0x2: case 0x2:
@ -449,13 +506,14 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const
bool newSkip; bool newSkip;
u16 mask = (u16) ((arg1 >> 16) & 0xFFFF); u16 mask = (u16) ((arg1 >> 16) & 0xFFFF);
u16 value = 0; u16 value = 0;
if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0;
switch (cheat_state.conditionalMode) switch (cheat_state.conditionalMode)
{ {
case 0x0: case 0x0:
if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0;
newSkip = !((value & (~mask)) > (arg1 & 0xFFFF)); newSkip = !((value & (~mask)) > (arg1 & 0xFFFF));
break; break;
case 0x1: case 0x1:
if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0;
newSkip = !((value & (~mask)) > (*activeData() & (~mask))); newSkip = !((value & (~mask)) > (*activeData() & (~mask)));
break; break;
case 0x2: case 0x2:
@ -486,13 +544,14 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const
bool newSkip; bool newSkip;
u16 mask = (u16) ((arg1 >> 16) & 0xFFFF); u16 mask = (u16) ((arg1 >> 16) & 0xFFFF);
u16 value = 0; u16 value = 0;
if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0;
switch (cheat_state.conditionalMode) switch (cheat_state.conditionalMode)
{ {
case 0x0: case 0x0:
if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0;
newSkip = !((value & (~mask)) == (arg1 & 0xFFFF)); newSkip = !((value & (~mask)) == (arg1 & 0xFFFF));
break; break;
case 0x1: case 0x1:
if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0;
newSkip = !((value & (~mask)) == (*activeData() & (~mask))); newSkip = !((value & (~mask)) == (*activeData() & (~mask)));
break; break;
case 0x2: case 0x2:
@ -523,13 +582,14 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const
bool newSkip; bool newSkip;
u16 mask = (u16) ((arg1 >> 16) & 0xFFFF); u16 mask = (u16) ((arg1 >> 16) & 0xFFFF);
u16 value = 0; u16 value = 0;
if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0;
switch (cheat_state.conditionalMode) switch (cheat_state.conditionalMode)
{ {
case 0x0: case 0x0:
if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0;
newSkip = !((value & (~mask)) != (arg1 & 0xFFFF)); newSkip = !((value & (~mask)) != (arg1 & 0xFFFF));
break; break;
case 0x1: case 0x1:
if (!Cheat_Read16(processHandle, arg0 & 0x0FFFFFFF, &value)) return 0;
newSkip = !((value & (~mask)) != (*activeData() & (~mask))); newSkip = !((value & (~mask)) != (*activeData() & (~mask)));
break; break;
case 0x2: case 0x2:
@ -1250,14 +1310,21 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const
switch (subcode) switch (subcode)
{ {
case 0x0: case 0x0:
{
if(!skipExecution)
{ {
cheat_state.floatMode = arg1 & 0x1; cheat_state.floatMode = arg1 & 0x1;
} }
}
break; break;
case 0x1: case 0x1:
{
if (!skipExecution)
{ {
if (cheat_state.floatMode) if (cheat_state.floatMode)
{ {
float flarg1;
memcpy(&flarg1, &arg1, sizeof(float));
u32 tmp; u32 tmp;
if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp)) if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp))
{ {
@ -1265,7 +1332,7 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const
} }
float value; float value;
memcpy(&value, &tmp, sizeof(float)); memcpy(&value, &tmp, sizeof(float));
value += arg1; value += flarg1;
memcpy(&tmp, &value, sizeof(u32)); memcpy(&tmp, &value, sizeof(u32));
if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp)) if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp))
{ {
@ -1286,11 +1353,16 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const
} }
} }
} }
}
break; break;
case 0x2: case 0x2:
{
if (!skipExecution)
{ {
if (cheat_state.floatMode) if (cheat_state.floatMode)
{ {
float flarg1;
memcpy(&flarg1, &arg1, sizeof(float));
u32 tmp; u32 tmp;
if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp)) if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp))
{ {
@ -1298,7 +1370,7 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const
} }
float value; float value;
memcpy(&value, &tmp, sizeof(float)); memcpy(&value, &tmp, sizeof(float));
value *= arg1; value *= flarg1;
memcpy(&tmp, &value, sizeof(u32)); memcpy(&tmp, &value, sizeof(u32));
if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp)) if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp))
{ {
@ -1319,11 +1391,16 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const
} }
} }
} }
}
break; break;
case 0x3: case 0x3:
{
if (!skipExecution)
{ {
if (cheat_state.floatMode) if (cheat_state.floatMode)
{ {
float flarg1;
memcpy(&flarg1, &arg1, sizeof(float));
u32 tmp; u32 tmp;
if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp)) if (!Cheat_Read32(processHandle, arg0 & 0x00FFFFFF, &tmp))
{ {
@ -1331,7 +1408,7 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const
} }
float value; float value;
memcpy(&value, &tmp, sizeof(float)); memcpy(&value, &tmp, sizeof(float));
value /= arg1; value /= flarg1;
memcpy(&tmp, &value, sizeof(u32)); memcpy(&tmp, &value, sizeof(u32));
if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp)) if (!Cheat_Write32(processHandle, arg0 & 0x00FFFFFF, tmp))
{ {
@ -1352,14 +1429,19 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const
} }
} }
} }
}
break; break;
case 0x4: case 0x4:
{
if (!skipExecution)
{ {
if (cheat_state.data1Mode) if (cheat_state.data1Mode)
{ {
float flarg1;
memcpy(&flarg1, &arg1, sizeof(float));
float value; float value;
memcpy(&value, activeData(), sizeof(float)); memcpy(&value, activeData(), sizeof(float));
value *= arg1; value *= flarg1;
memcpy(activeData(), &value, sizeof(float)); memcpy(activeData(), &value, sizeof(float));
} }
else else
@ -1367,14 +1449,19 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const
*activeData() *= arg1; *activeData() *= arg1;
} }
} }
}
break; break;
case 0x5: case 0x5:
{
if (!skipExecution)
{ {
if (cheat_state.data1Mode) if (cheat_state.data1Mode)
{ {
float flarg1;
memcpy(&flarg1, &arg1, sizeof(float));
float value; float value;
memcpy(&value, activeData(), sizeof(float)); memcpy(&value, activeData(), sizeof(float));
value /= arg1; value /= flarg1;
memcpy(activeData(), &value, sizeof(float)); memcpy(activeData(), &value, sizeof(float));
} }
else else
@ -1382,38 +1469,59 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const
*activeData() /= arg1; *activeData() /= arg1;
} }
} }
}
break; break;
case 0x6: case 0x6:
{
if (!skipExecution)
{ {
*activeData() &= arg1; *activeData() &= arg1;
} }
}
break; break;
case 0x7: case 0x7:
{
if (!skipExecution)
{ {
*activeData() |= arg1; *activeData() |= arg1;
} }
}
break; break;
case 0x8: case 0x8:
{
if (!skipExecution)
{ {
*activeData() ^= arg1; *activeData() ^= arg1;
} }
}
break; break;
case 0x9: case 0x9:
{
if (!skipExecution)
{ {
*activeData() = ~*activeData(); *activeData() = ~*activeData();
} }
}
break; break;
case 0xA: case 0xA:
{
if (!skipExecution)
{ {
*activeData() <<= arg1; *activeData() <<= arg1;
} }
}
break; break;
case 0xB: case 0xB:
{
if (!skipExecution)
{ {
*activeData() >>= arg1; *activeData() >>= arg1;
} }
}
break; break;
case 0xC: case 0xC:
{
if (!skipExecution)
{ {
u8 origActiveOffset = cheat_state.activeOffset; u8 origActiveOffset = cheat_state.activeOffset;
for (size_t i = 0; i < arg1; i++) for (size_t i = 0; i < arg1; i++)
@ -1432,6 +1540,7 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const
} }
cheat_state.activeOffset = origActiveOffset; cheat_state.activeOffset = origActiveOffset;
} }
}
break; break;
// Search for pattern // Search for pattern
case 0xE: case 0xE:
@ -1482,11 +1591,14 @@ static u32 Cheat_ApplyCheat(const Handle processHandle, CheatDescription* const
} }
break; break;
case 0xF: case 0xF:
{
if (!skipExecution)
{ {
u32 range = arg1 - (arg0 & 0xFFFFFF); u32 range = arg1 - (arg0 & 0xFFFFFF);
u32 number = Cheat_GetRandomNumber() % range; u32 number = Cheat_GetRandomNumber() % range;
*activeData() = (arg0 & 0xFFFFFF) + number; *activeData() = (arg0 & 0xFFFFFF) + number;
} }
}
break; break;
default: default:
return 0; return 0;