Super Mudwhumper
Responsibilities
Gameplay & AI Programming, Shader development,
Game Design, 3D Modelling
Project Length
September 2023 – Present (In Active Development)
Game Description
Super Mudwhumper is an isometric, roguelite combat racing game where players compete against AI opponents in various events, with a focus on vehicle customization through diverse equipment and abilities. It’s currently still early in development as a solo project.
It started as a sort of tribute to many of my favorite childhood games, such as Rock n’ Roll Racing, R.C. Pro-Am, F-Zero, and Battle Cars. In fact, the project’s working title, “Super Mudwhumper,” comes from an upgraded set of wheels from Rock n’ Roll Racing.
Unreal Engine
The development of this project actually started in Unity. However, a few weeks after I started, Unity’s runtime fee controversy made me rethink using it. As much as I love the Unity engine and C#, it made me realize that I’d grown a bit too attached to it. Since the project was so new, and since I was already learning a bit of Unreal anyway, it seemed like a good opportunity to switch to Unreal Engine 5. I wish I’d started a project in Unreal sooner, since learning it was even inspiring some of the work I was still doing in Unity on MASSIVE.
Vehicle Controller
One of the first things I worked on was the vehicle controller. I first looked at the built-in Chaos Vehicles, but since this game is more of an arcade racer, I really wanted full control of its implementation. To do this, it uses a combination of a suspension force, steering force, and engine force to calculate how each wheel will affect the vehicle.
Early testing of this controller led me to my first big roadblock. Since Unreal doesn’t have a separate fixed physics tick, it meant the car would handle wildly differently based on the game’s framerate. Although I tried a few solutions, such as enabling physics substepping, I just wasn’t getting the results I wanted. Then I discovered Unreal’s asynchronous physics, which does run with a fixed timestep. It took a bit of effort to set up, but now the vehicle simulation code runs on the physics thread with a fixed timestep, and much more deterministic behavior, regardless of framerate.
Opponent AI
AI plays a crucial role in Super Mudwhumper, especially since it’s a single-player game. It not only needs to drive intelligently, but fire weapons and use abilities as well. While it’s still early days for the combat mechanics, I’m feeling pretty good about the current state of the driving behavior.
I started off using simple steering behaviors to follow a point on the track a given distance ahead of the vehicle. However, I was starting to get some erratic behavior when combining various steering behaviors, since they don’t share information between each other. For instance, a behavior that avoids other cars could just push the vehicle off the track and into a tree. Of course more behaviors could be added and tuned, but it was clear they would be constantly fighting each other.
Instead, I opted to use a context-based steering approach where behaviors write into a shared “context map”, which is used to highlight interesting or dangerous areas of the track. In the beginning of this video, the light blue car is the player, and the yellow car is the AI. Danger and Interest is represented as red and green, respectively. Notice how the AI treats the player as dangerous when it’s travelling too slow, or when it’s too close. The second half of the video shows some aerial views of 4 AI controlled players navigating a hairpin turn. Some of the vehicles are faster than others, causing them to wait for an opportunity to pass when it’s safe.
Track Editing
The tracks have been pretty fun to work on, and they kind of go hand-in-hand with AI. I’ve opted to use a spline to allow users to draw out the track, and the system will generate and deform meshes along it based on given settings. This data also gets baked into directed graph of waypoints which are used at runtime for calculating placement of racers, as well as AI navigation. Similarly, I’ve made an “environment spline” class that can place various objects along it with various settings such as randomized rotation. I’ve been using to place track barriers like stacks of tires.
In this video, you can see edits being made to a track. The red line segments that are visualized is the AI’s ideal racing line, which is generated while the track is being edited.
Items & Shop
One of the features I’m most excited about in this game are its RPG/roguelite elements. The game has various items that can be equipped to your vehicle to alter its stats and give new abilities. For example, a better engine can increase its top speed, while equipping machine guns will let you shoot other racers.
Although I feel like I’ve only just scratched the surface of the amount of variety and customization I have in mind, it’s been really fun to work on. I’m using Unreal’s Gameplay Ability System for vehicles, allowing items to adjust their attributes very easily, while also providing a solid foundation for weapon abilities.
3D Pixel Art Style
When exploring potential art styles for this game, I wanted something that looked interesting, a bit unique, and something that I could achieve by myself. I was intrigued by the development of A Short Hike, since it is also a solo project with a similar artistic goal. Inspired from that, and some of the work I’d seen from Tessel8r, I decided on a pixel art look that was made using 3D art.
The effect is mostly done with a combination of a couple of shaders. I also reduce the render resolution to something much lower, and disabled all anti-aliasing (which has the side benefit of being less resource intensive). For the shaders, it’s a combination of a simple toon shader, and an outline shader that draws a darker outer highlight, and a lighter inner highlight.
I still have more I want to do with this effect, such as playing with dithering. The current implementation also shows a lighter highlight where the wheel meets the ground, which I think I can get rid of by determining concavity. However, I’m quite happy with the effect so far, and I’m excited to see how it evolves as I fill in more of the art.