Thanks for sharing, it's a really interesting writeup and project!
There have been a few attempts to make open source versions of Crimsonland and I had a good time with Violetland https://github.com/ooxi/violetland
https://store.playstation.com/en-us/product/UP4403-PPSA02752...
I found the software at a thrift store in 2009, when I was eighteen, and I was immediately impressed. This was actually very intuitive, easy-to-use animation software that was very powerful, years before FutureSplash/Flash was released.
There's not a ton of info available on the internet now, but I have been trying to remedy that a bit [2] by uploading the manual. I reached out to Disney to ask if I could potentially buy and release the source code off of them, and they politely told me "no". I reached out to the creators in the credits on LinkedIn to see if there there was any way I could look at the code or if they could at least answer some questions, and they never got back to me.
I think the only way we're going to get the source code to The Animation Studio will be if I learn how to use Ghidra (or something similar) and decompile it myself.
[1] https://en.wikipedia.org/wiki/The_Animation_Studio
[2] https://archive.org/details/disney_beginner_guide_2/disney_b...
There used to be a Linux version but apparently it hasn't been updated to be added to or even compiled on modern Linux kernels and distros.
Someone I know tried to resurrect it a few years back but now I'm wondering if couldn't use OpenCode etc to get it up and running again.
(I did find a recent-ish clone [1] so may start with that)
Reversing this by hand seems like it would have taken orders of magnitude longer…
So there is a big hurdle to get over in the initial stages but you soon find out that a lot higher code structure/scaffold isn't wiped out by the compiler. For example, the generated assembly code very closely mirrors the C/C++ function boundaries. This enables you to infer the over-all original code structure/layout basically from the call chain, and then you can manually step through and figure out what the original programmer was trying to achieve - abet the order of execution does get messed up by the compiler but it isn't that bad.
In my project with A-10 Cuba, I was successful in reverse engineering its file format, the over-all module layout, engine and rendering engine during my three weeks break. I still have some time to work out the AI logic, and mission design but one builds on another. What do I mean one builds on another? Well when you first start you have no types, not structs. So the first days you think you're making absolutly no progress because you're trying to calculate pointer offsets and structs layouts in IDA. I highly recommend Google Gemini or Claude code to do this heavy lifting because you can get away with a lot by asking it (for this IDA Pseudocode, infer what the struct layout is and tell me what it is doing?).
The first stage of getting those first struct layout is painstaking, then you soon can branch off one strut, or struct pointer to another. This feeds back like a feed-back loop - because programmers are lazy. And you soon have a large part of the struct/code-flow layout figured out.
You then take the structs/code-flow, and pesudo code and then do a re-write in a modern C/C++ compiler until you have a working version.
Old games like this have a small (and shrinking) audience of people who care about them. With Tribes 2, for example, there are only ~50 people who actively play on a regular basis. A subset of those people are programmers, and a subset of those have the time & energy to put into a project like t2-mapper, assuming they're even interested. I got a basic version working, but then Claude Code helped decode and convert obsolete Dynamix/Torque3D file formats (improving existing Blender addons that were incomplete), got TorqueScript running in the browser, wrote shaders, and generally helped figure out what the original C++ code was doing.
In the past, you'd need the stars to perfectly align for stuff like this to happen: a passionate super-fan with the time, resources, knowledge, and persistence to see it through. Now, you mostly just need the persistence (and maybe a couple hundred bucks for tokens). I foresee people with niche interests (but not necessarily a programmer's skillset) being able to extend the lifetime (and maybe audience) of their obscure or obsolete software.
[0] I am aware that such a wiki exists exactly for this purpose.
I'm also impressed by the game's jaz image format. Very cool.
Do you have a writeup of how you did it? Both (regular) tooling (radare2? rizin? IDA? ...) and how the LLM did (or did not) use it?
In the little spare time I have, I've been able to reverse engineer the "compressed" file format (ended up being basically a XOR'ed zlib-compressed TAR-like archive), but not much else. I have not used LLMs to help me.
Last Humble Bundle update from 2019, but I can't get it to run on my current Ubuntu. Runs in my Ubuntu 16 QEMU vm, but no audio for some reason.
Pretty much expected level of success for old binary-only Linux games. Can probably be fixed, but usually just playing the Windows version in WINE is easier and plays better.
Looks like the game still only runs in a small window, but Valve's gamescope*, had it running full screen right away too.
* gamescope -W 2560 -H 1440 -r 60 -S stretch uvx crimsonland@latest
I guess this is because they all are trained on an intermediate code bases when this was required some times (even at that time the real usage was quite rare).
And now this line is parroting everywhere like a junk DNA :)
Some of the custom features you may be referring to I implemented as custom properties in the glTF output - like surface flags. "Outside Visible" is one example, it's a flag baked into each .dif surface that determines whether rays can reach it from the outside, so the engine knows whether to apply the map's directional sunlight, or just ambient and light map lighting. So, even though it technically could try to render with modern PBR, dynamic lighting/shadows and all that, it instead renders as close to the original as possible using the same (or similar) techniques. Comparing screenshots with actual Tribes 2 renders is often indistinguishable unless you really know what to look for!
Going to give this a spin after work. Thanks for the work and the writeup!
Old devs of the games could enlighten the game preservation community anonymously.
Game dev was a frontier and hardware pushing activity even in the directx era. The magic shift code for ...quake??? Was just the tip of the iceberg.
A-10 Cuba! came out around 1996, and only now am I getting to know its internal engine. For example, it utilizes a signed Q15.16 fixed-point representation for its X and Z axes. For instance, a raw value of 98,304 (0x00018000) decodes to 1.5 units - where a unit is defined as 6607.92 feet - which translates to 9,911.88 feet in the game world. Then to top it off, it uses a different coordinate scaling convention for its up axis. For example the up-axis resolution is 1/10th of a foot so a raw value of 10,000 is actually 1,000 feet. Then there are other discrete exponent scaling factors which the game applies to maintain numerical precision and accuracy.
I had a great time learning all this well reverse engineering the game, and also come to learn even today how common it is for chips not to come with FPU unit, and how common it is that those chips actually perform fixed point arithmetic.
I was sure this one was for Python from 3.7 up to 3.10. But it is still here.. But as for 2026 it will not stay forever as it was supposed to - there are 2 PEPs which are suppose to fix it in Python 3.14 - https://peps.python.org/pep-0649/ and https://peps.python.org/pep-0749/