Today marks the release of PARTYMOD THPS3 2.0, which was a pretty gigantic effort. It's a full rewrite of the patch and its utilities. The code of the original version had started to get quite messy because I just didn't want to deal with CMake project files. I also wanted to take the chance to get a little ambitious. There are some ideas that didn't quite pan out (more on those later), but I think I more or less achieved what I set out to, which is to get this version of the game to appear as it should.
In the past few years I've been drifting toward writing more Rust than C, and I became a big fan of its toolchain. I'd run some experiments porting PARTYMOD THPS4 over to Rust that were decently successful but I hadn't gotten far enough to justify any release. Rust may seem like a strange choice for a project that's very inherently memory-unsafe, but Cargo alone was a huge pull for me. Because of the unsafe nature of patching a game, this project does use quite a bit of 'unsafe' code (Rust's term for code that cannot be automatically proved to be memory-safe). The experience has been really nice. The result was a far cleaner codebase. There are still some messes where pointer math has gotten ugly, or rustfmt has really done a number on some lines, but I'm proud of what's there. The code is free of compiler warnings at the moment!
Some familiar with the computing landscape might be a little justifiably scared with a rewrite in Rust. A big story this year was Anthropic's rewrite of Bun in Rust by just throwing LLMs at it (with some pretty poor results!). To be clear, none of this release's work was AI-written, nor AI-assisted. I wasn't about to rob myself of learning more about a game I love.
The rewrite also made it very easy to spin off a lot of the code that I would otherwise copy and paste between different releases into a new common repo. Over the years, different releases would get different versions of these files and functions and the inconsistency was really bugging me. I would often lose track of which release had the newest or best version of something. It's something really trivial that I should've done much earlier, but still, it's nice!
PARTYMOD THPS3 was in a state I wasn't very satisfied with. Every other game had a lot of nice stuff that this game didn't, and the game still had a lot of graphics inconsistencies and errors. The first thought I had was to replace the renderer for this game, a project more ambitious than the THPS2 renderer replacement. Once I got into this game deeper I decided against actually doing that because it would be a ton of work to reverse engineer the existing renderer. After working with the graphics fixes, I'm realizing that a new renderer would demand a lot of non-trivial changes that would require a much deeper understanding of RenderWare than I currently possess. Maybe someday, but not today. That said, I really do hate working with stateful graphics APIs...
That's probably enough boring reflection. Here's some fun little things I discovered while working on the patch:
If you're familiar with Tony Hawk's Pro Skater 3's PC port, you'll know it's pretty strange. Many assets don't resemble their console counterparts, and levels don't quite look right. Coming from THPS2 where all assets were just the same files as the Playstation version, I was expecting this process to focus a lot more on just fixing the renderer. I wasn't quite right about that! Turns out a lot of issues come from plain incorrect assets.
Something interesting about THPS3's engine is that it is the only game in the series to use RenderWare, Criterion's engine. That might be confusing to those more familiar with modern day, all-encompassing, game engines such as Unity or Unreal Engine. RenderWare is a lot different, my understanding is that most developers used it purely for rendering, and it doesn't go nearly as far as, say, Unreal used in modern conversions like the Grand Theft Auto Definitive Edition releases. There's a surprising amount of Direct3D 8 specific code in THPS3, and most rendering is not done directly by RenderWare. It's easiest to think of it as what you would call a Render Hardware Interface these days (and even that is not really accurate. RenderWare also provides certain file formats for assets). Some inconsistencies can be attributed to the differences in platform-specific rendering code.
Something interesting about THPS3's engine is that it is the only game in the series to use RenderWare, Criterion's engine. That might be confusing to those more familiar with modern day, all-encompassing, game engines such as Unity or Unreal Engine. RenderWare is a lot different, my understanding is that most developers used it purely for rendering, and it doesn't go nearly as far as, say, Unreal used in modern conversions like the Grand Theft Auto Definitive Edition releases. There's a surprising amount of Direct3D 8 specific code in THPS3, and most rendering is not done directly by RenderWare. It's easiest to think of it as what you would call a Render Hardware Interface these days (and even that is not really accurate. RenderWare also provides certain file formats for assets). Some inconsistencies can be attributed to the differences in platform-specific rendering code. Later games would use a custom renderer and the PC ports would be derived from the Xbox ports.
Anyway, first of all of the new fixes is the levels. Many surfaces feature incorrect transparency, some surfaces appear invisible from certain angles. The latter issue turned out to be missing data in the levels' BSP files (that's a RenderWare-specific format, not to be confused with Quake's BSP format). For some reason, the PC version lacked proper face sidedness flags. Patching the level files to resemble the PS2 versions restored this flag, but by default levels draw with a lot of missing geometry. After analyzing the Xbox version of the game a bit, I found it reading a flag within its drawing code to change the face culling mode and mirrored that in the PC version. Sure enough, that was all I needed to do to get faces rendering correctly.
Next was transparency. Many surfaces throughout the game just lack transparency effects. Now using the original PS2 level files, we can tell for sure that this is not a problem with the level geometry (that or I missed some override in the rendering code). I put together a tool to edit individual textures within each level's texture dictionary file to give them the proper transparency. There were a few instances of incorrect blend modes as well. Namely, Airport's arrivals board was a complete mess, and Suburbia's brick fence had always bugged me. After some comparison to emulators (and some experimentation with texture blend ops), I managed to recreate the proper results:
After transplanting the PS2 files in, I noticed some missing geometry in Skater Island. The doors had gaps where you could see outside. That kind of ruins the effect of unlocking the outdoor section, so I needed to figure out what was going on. I managed to track the issue down to the doors being reflective. After a lot of debugging, I narrowed the issue down to some RenderWare plugin code that just prevented any "pseudo env map" (PS2 did not support cubemaps or per-pixel shading, so the game uses flat, scrolling textures to simulate dull reflections) surfaces from rendering. Enabling this allowed a lot more detail to be shown in almost all levels. It also fixed the missing geometry in the towers in LA!
At some point in development I'd connected the dots on something I spotted years ago. I'd noticed a reference in the code to a "shadow.png" file. I sort of figured this was their way of accessing the skater shadow. When reverse engineering the code more closely, I realized that this was actually referring to the texture used for blob shadows under pedestrians. After a little tracing that code, I found a variable that was always preventing these shadows from being created, now showing the shadows that were always meant to be there... sort of.
THPS3 on PC strikes again. For some reason the blob shadow texture is replaced with a very crudely drawn shadow made with a paintbrush tool with a few streaks overflowing. Needless to say, this wouldn't work. Throughout development, I've been running emulators through Renderdoc to inspect color blend modes to restore some effects here and there. That also allowed me to grab the proper shadow texture and create a patch restoring it into the PC version. With some more hacking to fix the shadow's blend mode to match consoles, we're left with the finished result:
Another fix that is a little difficult to demonstrate here is that a lot of animated textures did not animate (the code calls this 'wibbling'). Every frame, the game updates every mesh unless a specific flag is set. That means that once a mesh is put into GPU memory, it isn't updated unless it needs to be. This flag was sometimes getting disabled for certain animated meshes, causing them to freeze up. First I just let every vertex update on every frame. Performance was acceptable on my desktop pc, but when I tried it on a Steam Machine, the framerate started to tank in LA, so I knew it wouldn't fly. I implemented a more correct fix for animated textures, but noticed some animated vertex colors weren't updating. There wasn't a consistent flag that I could find for those, so I just hardcoded the specific textures that used vertex color wibbling to reset the flag.
That leaves THPS3's graphics in a pretty good state. I can't really fix issues like Bam's incorrect shirt, or the incorrect texture for the deck pickup model without starting to run into issues of Fair Use, so I'm calling it here. I'd be very curious why those textures differ from the final PS2 version. They seem to be early versions of those textures, judging by trailers and prototype versions of the game that have made it out over the years.
I also took the time to fix a lot of audio issues that had bugged me over the years. First, voices and other long sounds always seemed to play so loudly. They also didn't respect the player's sound volume setting as they should, so I investigated and found that this was a pretty simple issue.
The game has two mechanisms for playing sound. There are sound effects meant for repeated use (stored as .wav files), and one-off sounds meant to stream off of the hard drive (stored as .mp3 files). The latter were never actually having their volume changed. The function to play those streams had left and right channel volumes passed in, but they were only used to calculate panning. The port utilizes Miles Sound System, which uses a single volume level and a panning position. The original game uses two volume levels, so the game has to convert those values into a panning position. I plugged in some code to set the volume level (and multiply it by the player's sound effect volume setting), and suddenly the game sounded much better.
One thing I couldn't fix but was happy to get to the bottom of was some particularly infamous audio clipping when grinding the toilets in Airport. Earlier this year, I happened to be practicing some audio programming by starting to write my own module file (a type of music used often by the demoscene and old games, it uses live-sequenced samples to construct music at runtime) player. While working on audio resampling, I'd noticed that using integer resampling in SDL would result in really bad distortion. With this knowledge, I resampled the toilet flush sound effect in Audacity to the game's native 44.1khz and sure enough, the distortion was completely gone. Sadly, I cannot patch these files at runtime to correct this issue. I think I would need to replace Miles Sound System (I've seen an open source implementation start to pop up, so it may end up being possible), or replace the game's audio code. Surprisingly the latter seems somewhat attainable, but it's out of scope for now.
Before I finished up this writeup, I read this excellent post on Mubi's blog. In it, Devan Scott reflects upon the fan scene preserving The Good, the Bad, and the Ugly, and companies' poor efforts in preserving their work for themselves. It felt very apt as I prepared to release a this new version of the THPS3 patch.
I'm lucky to be to be able to do this work publicly and provide it for free out in the open. I'm able to patch the game in-place such that I can maintain fair use, so I can open source the effort. That said, this game is starting to show its age. The official installer no longer works if you own too large a hard drive (in my experience, it errored out after upgrading to two 4tb nvme drivers. luckily the LLM industry is solving this problem for us by making large drives unavailable. great work!), fewer and fewer people own CD drives to install the game from its original media and to pass the game's CD check.
25 years after its original release, Tony Hawk's Pro Skater 3 is still considered by some one of the greatest games ever made. Metacritic still lists it amongst its highest scores, Gamespot awarded it a very rare at the time 10/10 perfect score. As of writing, it is unavailable on any modern storefront. In 2025, a remake of the game was released and remains available on all modern platforms, but it is not the same game.
A modern release of the original game would be a tall order: while some content is... dated (the couple of r-words sure hit like a brick), but a large amount of the game is licensed branding and music. Skaters and their sponsors that may not be current, Jeep and Nokia advertisements, a killer soundtrack. All of that would need to be re-licensed, so sadly this game remains somewhat lost to time. As time goes on, I start to see this game remembered more for its soundtracks than as the achievement in pure mechanical design that I see it as.
We're living through a pretty good time for modernized releases of old games. The original Thief is getting remastered! Many games we never thought would be available for modern systems are now. Nintendo released Star Fox 2! Hamster rereleased the first two Tetris: The Grand Master games as a part of their Arcade Archives series!! Still, THPS3 is locked to old platforms and an increasingly obscure and dysfunctional PC release.
This year, Xbox, the current owners of Activision and by extension Tony Hawk's Pro Skater, underwent a massive set of layoffs. What's left of the company appears to only leave capacity to develop only their most popular franchises (Call of Duty, Halo, Gears of War, Forza). The future looks grim for THPS. As with DIY skateparks in the real world, we're forced to keep these games alive on our own.
A lot of footage I see of THPS around the internet is now captured via emulation. While that is a great way to experience those games, I hope to see more people pick up the PC versions of these games. They're arguably the best way to experience the series, and my own patches have made setup pretty seamless. While a modern official release would be nice, I think these patches are the best we're going to have for some time.
Please share my patches around! In the last month, I was laid off from my full time job. More eyes on my work would be big help, and hey, if you are looking to employ someone who can fix up a 25 year old game (just imagine what i could do with some source codeβ¦), get in touch!