Email or username:

Password:

Forgot your password?
Top-level
Foone🏳️‍⚧️

people who put checksums in their game's save files hate fun

23 comments
Foone🏳️‍⚧️

the dirtiest secret you find when reverse engineering games is how many implementations of String they have.

This one is at least 3, plus it uses some stl so there's probably an std::string somewhere

Foone🏳️‍⚧️

for some reason there's some code that does profile_number % 6
which would make sense if the game stored 6 profiles. it doesn't. it stores 10.

Foone🏳️‍⚧️

arg.
for once they didn't use vtables and RTTI

and so I have two classes. one subclasses the other, for sure. But which is which? I can't tell.

Foone🏳️‍⚧️ replied to Foone🏳️‍⚧️

one of them is, I'm reasonably sure, 342944 bytes.
the other is at least 44 bytes.

Foone🏳️‍⚧️ replied to Foone🏳️‍⚧️

WFSaveGame > GBSaveGame > SaveGame > SaveGameBase > GuiPopup

STOP ALL THE INHERITANCE

Foone🏳️‍⚧️ replied to Foone🏳️‍⚧️

who could have ever predicted that a class named "Matrix4" would be 64 bytes?

(It was either that or 128 bytes)

Foone🏳️‍⚧️ replied to Foone🏳️‍⚧️

ahh, GraphicsDevice extends _GraphicsDevice
this is fine and I'm not screaming at all

Foone🏳️‍⚧️ replied to Foone🏳️‍⚧️

also this compiler (Metroworks CodeWarrior for PowerPC) loves generating global floating point literals in the binary and then NEVER MERGING THEM

Foone🏳️‍⚧️ replied to Foone🏳️‍⚧️

do you know how many copies of float 0.0 and 1.0 there are?

I DON'T BUT IT'S AT LEAST FIVE

Foone🏳️‍⚧️ replied to Foone🏳️‍⚧️

it's especially weird for floating point zero. I don't know if you know this, but the IEEE-754 encoding of floating point zero is just that: zeroes.
And you can initialize a 4-byte variable to integer zero without needing a literal global... so you should be able to do the same for floating point zero!

Foone🏳️‍⚧️ replied to Foone🏳️‍⚧️

I don't know why I'm saying the compiler should be more optimized. That'd make my job harder.

Foone🏳️‍⚧️ replied to Foone🏳️‍⚧️

oh hello
00000000 and 3F800000, fancy meeting you here.

(floating point 0.0 and 1.0)

Foone🏳️‍⚧️ replied to Foone🏳️‍⚧️

I may need to force quit Ghidra. that's not good.

Foone🏳️‍⚧️ replied to Foone🏳️‍⚧️

hey I found a list of supported platforms in the binary! it includes: Wii, PS2, DX9, PSP, X360, and PS3.

Foone🏳️‍⚧️ replied to Foone🏳️‍⚧️

if ((((bVar1) && (bVar1)) && (bVar1)) && (bVar1)) {
_aligned_free(this->field1_0x4);
}

I was gonna ask "are you okay, Ghidra?" but nope, the disassembly matches. the fuck happened here, optimizer?

Foone🏳️‍⚧️ replied to Foone🏳️‍⚧️

if (filename == (String *)0x3) {

NOPE NOPE NOPE NOPE NOPE NOPE "3" IS NOT A VALID POINTER TO A STRING. EVER

Foone🏳️‍⚧️ replied to Foone🏳️‍⚧️

they do a weird thing with picking puzzles: they seem to pick like 13 of them, but the game only uses 4-6.

Foone🏳️‍⚧️ replied to Foone🏳️‍⚧️

they also do some very weird shit with copying them around in RAM. like, I can see them overwriting my changes.

Foone🏳️‍⚧️ replied to Foone🏳️‍⚧️

I think I've figured out how codewarrior works:
every time you write a number in your code, it uses up 4 bytes in the binary.
so if you write "1.0 + 1.0 + 1.0 + 1.0", that's 16 bytes right there.

Foone🏳️‍⚧️ replied to Foone🏳️‍⚧️

oh god I think this game's Quad class initializes some of the points to negative NaN

Foone🏳️‍⚧️ replied to Foone🏳️‍⚧️

amazing moments in compiler optimization:

if (param_1 != (GrQuad *)0x0) {
if (param_1 == (GrQuad *)0x0) {
return (GrQuadBase *)0x0;
}
}

Go Up