AliveTeam / alive_reversing

Re-implementation of Oddworld: Abe's Exoddus and Oddworld: Abe's Oddysee
331 stars 44 forks source link

Checkpoint gets clipped by the screen clipper #1087

Open MrSapps opened 3 years ago

MrSapps commented 3 years ago

https://user-images.githubusercontent.com/7420121/106371200-846e6a80-6359-11eb-94b4-f524e4409696.mp4

image

The check point gets sliced in half by the screen clipper that the portal creates. The portal is supposed to draw on top of the clipper and not cut the check point.

Leonard2 commented 3 years ago

So I gave this a shot and honestly I kind of got stuck.

The AO::ThrowableTotalIndicator that is spawned (on AO's Abe.cpp line 3075) is clearly set to use Abe's own layer. Yet, Abe himself is supposed to be clipped by the portal. So the indicator itself should also be clipped? .. So... Nothing's broken? Unless I misunderstood something about AO::ScreenClippers. Changing the layer argument in the constructor call to something higher than portals "fixes" the bug.

I also checked the decompiled function and sure enough it seems the indicator is set to use Abe's layer there as well. Although I might be wrong, I'm no assembly expert.

So then I started playing around with the hook manager. Unhooking the AO::ScreenClipper class methods didn't work. Unhooking the AO::ThrowableTotalIndicator methods didn't work either.

So I'm now convinced that this is actually some sort of bug in the OG renderer, or perhaps some extra checks in AO's renderer that look for types? But would that even be possible? Or perhaps the OG renderer didn't/couldn't clip line primitives?

I couldn't really 'unhook' parts of the renderer as it seems to exclusively use AE's renderer. It's either AE's renderer or nothing is draw on the screen. So eitherway I can't really test for this hypothesis. Unless you know of a way to use AO's renderer which works?

EDIT: Btw here's a save file that starts right where the vid starts because I'm too lazy to get to here using ddcheat all over again: test.zip EDIT EDIT: Also, what does the "Stand alone any bit" label mean?

MrSapps commented 3 years ago

Its not easy to test AO with the original rendering code as it uses AEs. However if you simply run the original game you'll see this issue doesn't repro. I don't think its worth trying to fix the software rendering. I would check/fix the OpenGL rendering instead.

"Stand alone any bit" means the standalone EXE 32 or 64bit. As there is also the injected DLL versions of the game code that can be used to compare against original functions.