This is Unreal Engine 1, which used UnrealScript programming language. It was extremely flexible, and you can extract the original UnrealScript code (including comments) from the game. This means it’s nearly an open source game, except for the native code. But pretty much everything is controlled by the UnrealScript anyways. Including the GUIs, HUDs, conversations, most of the AI stuff, damage calculations, keyboard key bindings, etc.
On top of this, Deus Ex released their SDK tools (I think in 2001, around the time of the multiplayer patch). Which is their version of the UnrealEd map editor, conversation file editor, and UnrealScript compiler/extractor.
This game is really open, there are many approaches to every situation. Which means when things get randomized, it tips the scales of balance and you have to reconsider every option for every seed.
Even just choosing a melee weapon, you’re thinking about knife vs baton vs crowbar vs sword vs eventually the dragon’s tooth sword. On some seeds the knife does a bit extra damage and then you gotta think if it’s better than the baton and crowbar because of its speed, and it only uses a single inventory space. On some seeds you might get a weak and slow dragon’s tooth sword and it might not even be worth keeping!
And then you’ve got all the different paths through the levels, and you’ll be rethinking routes based on random start locations, random goal locations, or random enemies in different spots, or items or medical bots. Or maybe a door was randomized to need more lockpicks and your lockpicking skill is worse than vanilla, maybe you need another way around or you choose to find the key to save lockpicks for later. You won’t be doing the same thing every playthrough like vanilla where eventually you figure out which approaches you like best for each spot. The randomizer gets you to rethink it all and adapt.
The ability to do anything also means you can always progress, you don’t get stuck just because you’re missing a password or low on multitools, there’s always another way. The randomizer really forces you to adapt.
I think any game with good replayability is a good target for a randomizer, it just amplifies that replayability.
Thanks for your responses. Pretty incredible that its capable of being so flexible and still be a coherent game. The community behind it must be amazingly passionate about it.
Thanks! Yea everything shown in that trailer is in UnrealScript aside from the creation of the mirrored map files, and the installer obviously, both of those were done in Python. The death markers and other online features (which are all optional and opt-in, disabled by default) use a TCP connection in the game written in UnrealScript to make HTTP requests, the backend is a Python Flask server. We even wrote our own JSON parser inside of UnrealScript (it’s not perfect but it does enough for us). Technically it’s possible to add a DLL module to the game for stuff like JSON parsing but we haven’t needed to, and technically this keeps it more easily portable (like if SurrealEngine even gets to a more completed state).
We had to write our own PRNG function to work inside UnrealScript, because the provided one doesn’t allow seeding.
What is it about Deus Ex that allows that type of mod to exist?
Technical perspective first…
This is Unreal Engine 1, which used UnrealScript programming language. It was extremely flexible, and you can extract the original UnrealScript code (including comments) from the game. This means it’s nearly an open source game, except for the native code. But pretty much everything is controlled by the UnrealScript anyways. Including the GUIs, HUDs, conversations, most of the AI stuff, damage calculations, keyboard key bindings, etc.
On top of this, Deus Ex released their SDK tools (I think in 2001, around the time of the multiplayer patch). Which is their version of the UnrealEd map editor, conversation file editor, and UnrealScript compiler/extractor.
Gameplay perspective…
This game is really open, there are many approaches to every situation. Which means when things get randomized, it tips the scales of balance and you have to reconsider every option for every seed.
Even just choosing a melee weapon, you’re thinking about knife vs baton vs crowbar vs sword vs eventually the dragon’s tooth sword. On some seeds the knife does a bit extra damage and then you gotta think if it’s better than the baton and crowbar because of its speed, and it only uses a single inventory space. On some seeds you might get a weak and slow dragon’s tooth sword and it might not even be worth keeping!
And then you’ve got all the different paths through the levels, and you’ll be rethinking routes based on random start locations, random goal locations, or random enemies in different spots, or items or medical bots. Or maybe a door was randomized to need more lockpicks and your lockpicking skill is worse than vanilla, maybe you need another way around or you choose to find the key to save lockpicks for later. You won’t be doing the same thing every playthrough like vanilla where eventually you figure out which approaches you like best for each spot. The randomizer gets you to rethink it all and adapt.
The ability to do anything also means you can always progress, you don’t get stuck just because you’re missing a password or low on multitools, there’s always another way. The randomizer really forces you to adapt.
I think any game with good replayability is a good target for a randomizer, it just amplifies that replayability.
are you asking from a technical perspective or a gameplay perspective?
Thanks for your responses. Pretty incredible that its capable of being so flexible and still be a coherent game. The community behind it must be amazingly passionate about it.
Thanks! Yea everything shown in that trailer is in UnrealScript aside from the creation of the mirrored map files, and the installer obviously, both of those were done in Python. The death markers and other online features (which are all optional and opt-in, disabled by default) use a TCP connection in the game written in UnrealScript to make HTTP requests, the backend is a Python Flask server. We even wrote our own JSON parser inside of UnrealScript (it’s not perfect but it does enough for us). Technically it’s possible to add a DLL module to the game for stuff like JSON parsing but we haven’t needed to, and technically this keeps it more easily portable (like if SurrealEngine even gets to a more completed state).
We had to write our own PRNG function to work inside UnrealScript, because the provided one doesn’t allow seeding.