RedeeMOD
- 12 Devlogs
- 66 Total hours
A cross-platform (Windows/Linux) modding platform for games! It was primarily built for Unreal Tournament game series, but can be easily expanded to support any game imaginable!
A cross-platform (Windows/Linux) modding platform for games! It was primarily built for Unreal Tournament game series, but can be easily expanded to support any game imaginable!
How RedeeMOD’s last improvement before Stardance wraps up looks like:
CLI had an option to specify missing paths, but specifying paths manually usually comes with the intention of overriding them no matter what.
Unfortunately, for the backend it didn’t matter - if defaults are specified, the custom-set paths in CLI were disregarded. Now it’s fixed, bringing stability for server environments, where control is preferred!
Alongside the previous improvement, paths can also be overridden within the Settings menu, together with custom launch flag specification!
This lets anyone preserve the mod libraries if installation path changes instead of requiring a full re-addition of a game.
Looks were also slightly modified - both internally and externally.
Internal classes changed in order to maintain simplicity, and externally - cancel/delete buttons have a vivid border. This helps with distinction and makes buttons stand out/differ.
I really like the current shape of RedeeMOD and I hope more people discover it and help me with the ecosystem growth.
Every game deserves preservation and appreciation through mods. Let’s make loading them simple!
Honestly, I wouldn’t even have thought about it if not for my other project, UT99 server container. Turns out, this is quite useful!
Like any other CLI app would. It lets anyone load mods on any game without opening the GUI.
It’s useful for 2 audiences:
After the beginning of UT99 server project one of the things I immediately thought about was modding the server, not only the client. Whether it’s a mutator, map or anything else - tinkering with individual directories can be brittle, especially in a server environment.
Having a tool manage mods is much simplier and foolproof, since RedeeMOD even handles mods disposably - they don’t override the main installation, leading to a predictable setup at all times.
Yes! Qt is no longer a dependency of the backend, allowing CLI app to be much smaller.
The application data paths are now handled manually.
The repo now also has more tests to account for new CLI features.
How (and why) I implemented tests in RedeeMOD
My dad is a high profile developer, and many new things I try are influenced by him. While I always liked setting up CI/CD pipelines and other automations, one thing my projects lacked was testing.
Turns out, many tech jobs require knowledge about tests, because they guarantee several things:
So, after considering these benefits, I started reading how tests are implemented.
There are 3 main types of tests:
First thing any testable software should have is clear dependency injection.
Dependency injection is a pattern where you don’t call dependencies directly, but pass them externally. I opted for implementing method argument injection that I could later use in tests.
Why is DI required? Well, during testing, the external environments must be mocked and created virtually to test different use cases (things like sys.* calls and more). Luckily, RedeeMOD already had a nice and semi-testable architecture where very few things needed to be changed.
Writing tests is a tedious and rather boring process, because all the edge cases must be defined. Don’t hate me for this, but I handed over writing tests to AI. My arguments for why AI is appropriate for this are:
While one could argue that Test-Driven Development exists, after trying it out I can confidently say that I’m not a fan of TDD.
However, giving very broad instructions, like “Make me tests for this project” usually doesn’t go well, because AI can’t retain project philosophy and tests what doesn’t need to be tested (things that don’t contain logic, thus can’t really fail).
RedeeMOD currently has a test suite based on pytest with integration and unit tests written.
With tests, instead of clicking around (and often forgetting) every edge case manually, you can offload it to a machine that does hundreds of calculations extremely fast. Not only is it a well-regarded pattern within the developer community, but also helps with coding efficiency and guards from failed refactors.
Thought RedeeMOD would only be available for niche titles? Not exactly!
Most people would probably agree with me that Quake 3 Arena was the best entry of the series for multiplayer games.
After seeing just how many Quake 3 mods there are (some even being standalone games) I had to implement an adapter for it with support for both standalone games and mods!
I resorted to the IOQuake 3 engine support due to its extra capabilities and being the modern choice for most, so original Id Tech 3 might not work.
IOQuake 3 inherits cvar support (and adds more!) from Id Tech 3 engine. Utilizing com_basegame, i could bypass Quake 3 Arena file presence for standalone games.
The new adapter follows an interesting edge-case detection logic:
default.cfg file somewhere within its .pk3 files, it’s considered standalone. Other games are required to have genuine Quake 3 Arena present, about what RedeeMOD will warn.baseq3 and missionpack directories. This adapter handles warning users against such restriction.All mods I tested worked fine. If you find one that does not, kindly report it on GitHub issues 😄
No doubt, the amount of testing that was required to get this working is absurd, and definitely it was the most challenging adapter of all.
Maitenance pre-ship revealed 3 more bugs that I couldn’t live with…
Actually, very counter-intuitive!
... if it is too long. In some rare instances however it failed and set a boundary on window size instead of truncating. However, it’s not an issue anymore!I ran into an issue that got me confused - I couldn’t launch a game. I panicked, thought that my launcher was broken again, and only then did I realise that the game wasn’t installed!
Launcher did not notify me and I got frustrated. Since I want the UX to be flawless, the best decision was to make a pop-up in case of a critical error.
I gotta say - the ship is finally truly 100% ready!
Here’s what the final 1.0.0 release of RedeeMOD brings:
I built RedeeMOD not only as an app to manage Unreal Tournament games exclusively (though at first, that was the plan), but also as a framework to create more games in the future compatible with RedeeMOD!
I recently wrote a Contribution guide that lets anyone create adapters and expand RedeeMOD by following a detailed guide!
Also, as a standard practice, GitHub actions were added to help with releases. Both Windows and Linux builds work perfectly, but are unsigned, so Windows might throw Smart Screen or Smart App Control warnings. These are safe to ignore, and if they bother you too much, you can always resort to launching RedeeMOD directly through Python!
The code is formatted with Black formatter. It’s way easier to format the code using a tool than doing so manually.
Also, I found some bugs that weren’t immediately noticeable. Things like:
TypeError)They are now fully fixed. Some inconsistencies between files have also been resolved.
This latest build now features logos to feel more professional. User interface has been updated with more detailed card subtitles, so the app is easier to navigate.
Overall, RedeeMOD is in its stable form for the first time ever. Now it’s just the matter of whether more adapters will be created for other games by the community!
Well, the mod management is very simple - adding, removing and enabling/disabling a mod probably doesn’t sound like the most sophisticated mod manager on the earth, but I am planning to later add a pop up that lets users customize the mods even further, like adding custom launch options, paths, even image customization, but that will require more time and I feel confident enough that the current feature set is good for the first ship.
For more info on RedeeMOD, visit its GitHub repository!
So, after a LOT of trial and error, and MANY wrong paths taken, Unreal Tournament 2004 adapter is functioning!
UT2004 differs from UT99 in many different areas, even its modding system:
My plan was to replicate what I was doing with UT99 - building a custom mod at runtime that would bundle every enabled mod together.
Since this game is quite old, so are its development sources. I resorted to the best source there is - proven to work mods.
Bad Mod errorCommunity tab (which defeats the point of my launcher)Since I wanted to use the modern -mod flag, I had to make my own mod, which needs such files to function:
\r\n line)I’m thankful to whatever or whoever made me as patient as I am, because DefUser being absolutely empty causing a segfault or files requiring CRLF even in Linux was very unexpected, and required hours of investigation.
On top of said implementation, backend framework also needed changes to ensure stability and flexibility. New methods returning more data to the game adapters were added, as well as improvements in attribute names and path handling.
After testing with some edge cases, I found bugs that got resolved shortly after.
Windows, as of now, works flawlessly, but I’ll be performing more tests when I distribute a full build.
Yes! I wanted to implement logos since the day 1 of starting this project. Surprisingly, that was one of the easiest modifications to date.
Screen state tracking was also improved to provide no visual bugs after adding, removing, selecting and deselecting added material.
Again, yes. All the intended functionality is verified to be working, and you can already try it out for yourself!
Running python -m frontend.app from the project’s root will open up this GUI for you to play around! Over the next few days I’ll finish making all the necessary branding, README and ensure licensing is correct. Then I’ll push a final devlog and make a ship.
Thank you for everyone following RedeeMOD’s journey. Keep rocking, and make the world truly Unreal!
After taking a look at the previous design I thought it looked quite ugly and inconsistent when some cards have center-aligned elements and others don’t. This update fixes these issues!
Yes and no. While the primary purpose of this devlog IS to describe subtle interface change, under the hood many quality of development improvements hide as I’m trying to implement and fiddle with Unreal Tournament 2004 game adapter, which required a more streamlined API of adapter creation rather than what was previously developed.
So, this devlog has hours logged from both a fully developed interface and half-developed new game adapter implementation. Stardance was warning me about getting close to 10h limit, so I must post this before diving deeper into Unreal Tournament 2004, which has way more twisted stuff within its modding system.
Stay tuned and wish me luck!
Expanding on the design I like, I decided to add some improvements.
All these things:
I could ship the current version, but there are exactly 3 things stopping me from doing so.
I need to:
Following a design language similar to Unreal Engine 5, I was able to make a functional UI, that can launch the game with selected mods!
The UI is written with PySide6, which allows for Qt6 API to be used on Python, giving a modern development workflow, with customizable stylesheets and cross-platform capabilities.
I want to rewrite the launcher a bit to support more games in the future and be more architecturally correct, at the same time feeling more premium both from the user-facing app, and the source code too.
With the installation discovery done, I can finally focus on the real provisioning and frontend.
Utilizing common installation paths of Unreal Tournament, I could build a simple config.json file that has all this information for Windows and Linux.
Then, I wrote a simple json parser, and methods to use as a simple interface for the frontend.
The current source tree has this functionality implemented:
I will try and build a user-facing application that does exactly 3 things:
Maybe something more will come to my mind as time passes.
As a kid, I used to play Unreal Tournament ’99 with my dad. I always thought that game is genius - how it encompasses the soul of classic arena shooters yet still being fun to play!
You’ve most likely heard of Unreal Engine. The reason it got this name is due to Epic Games’ first major game - Unreal!
While at first it acted as a competitor to Quake I and II style games with its campaign against various creatures, in a year turned to compete with upcoming genre of Arena Shooters, specifically Quake 3, focusing entirely on multiplayer.
While the game itself was awesome not only the way it was written (with an interpreted UScript language, which lets pure UScript mods run on every platform, as well as GPU utilization), and Epic even released the last installment’s source code available to read with promises of development based on what the community wants, quickly realized the harsh reality of Arena Shooters losing market share and turned to developing Fortnite, finally shutting down official server support on 24th of January, 2023.
Despite cancellation of the whole series, community has stepped in and is still keeping up with modern games!
Epic Games even allowed the Unreal and Unreal Tournament (original as well as 2004 version) ecosystem be maintained by a group called OldUnreal, while the latest game is available on UT4Ever, a self-hosted group of volunteers, who have rewritten Epic’s servers. And, guess what, all of this is available for free!
I am always looking at ways to modularize the software I use for maximum customization. Currently the mods follow a drag-over logic, which mixes mod files with original game’s files, rendering the original, pure and unmodified version unplayable if you ever want it back.
After researching how modding architecture of Unreal Tournament ’99 works, I was able to prepare a plan on how to implement a mod loader, and started to work on it! So stay tuned, and join the Unreal Tournament community!