A curious Smacker-related bug

Here’s a thing that has been bothering me since I tested my Smacker decoder for NihAV.

It decoded various test files fine except for one game: Toonstruck.

Various clips there look like they’re coded half-height for certain frames. Here is an example of one clip with gym owner called Jim performing some stunts:

You have this strange wooden object since the first frame and on the next frame the scene changes to this:

I hope it’s much clearer now what it is.

And here’s a bit later in the same clip:

And the very next frame:

The lower half remains unchanged until the next scene where it goes full-frame again.

Most likely explanations are some special Smacker codec version used in the game or there’s some code inside the game engine to compensate for it. No other version of Smacker player I know plays it as expected but the game does.

I used this clip because it’s quite easy to reproduce: download the demo from archive.org (it’s a demo so no piracy involved), run it in DosBox (seems like ScummVM does not support it—maybe that copy is not legal enough for them?), go to the gym, talk to Jim a bit until he agrees to show you his routine. That’s all.

If you watch close enough you’ll see that in certain places the animation becomes blockier when the top half of the frame is scaled to fully fill it while in other places it still has its full 640×400 resolution.

In the full game the gym happens not immediately so while some other clip there may do the trick I still find it easier to reproduce with the demo. The surest way to find out is to delve inside the executable but that’s not a thing I’d like to do right now (because explaining how to RE 32-bit DOS extender executables would take a full post as well).

Anyway, it bugged me and hopefully now it will bug somebody else instead 😉

One Response to “A curious Smacker-related bug”

  1. I mentioned this to the ScummVM folks– the demo version of Toonstruck is *supposed* to work, and the fact that it does not has been noted as a bug to be fixed.