⚠️ Jank code alert! This project is still in the proof of concept stages and contains unfinished code.
A project to allow you to control the CATHODE scripting system in Alien: Isolation's engine.
In its current state, the project can intercept requests from the game's code to CATHODE for script parameter values on entities.
It also features an ImGui-based in-game UI allowing you to control some visual demonstrations of what this project could allow you to do.
- This tool will patch parts of the game's executable code (in memory) on injection to disable integrity checks Creative Assembly added into the game.
Without doing this, any attempts to modify key data files such as
MAIN.PKG
,MODELS_LEVEL.BIN
and other*.PKG
files will trip the integrity check and the game will close.
The interaction between the game's code and CATHODE (as I understand it) is as follows:
- The game's code requests the value of a node's parameter on an entity via CATHODE's function
find_parameter
. - CATHODE searches for the parameter on that entity, if it finds it,
find_parameter
returns true and stores the value of that parameter in theoutput_ptr
parameter. (output_ptr
is initialised with a default value by the game's code, which is used as a fallback in case CATHODE fails to find the value). - The game's code updates the entity's state in-game with the new value of that parameter.
By hijacking this interaction between the game and CATHODE, we can effectively control (in theory) the state of almost any parameter on any entity in the game, as long as we have two key parameters:
- The pointer to the entity's object in memory (I currently have no automated solution for acquiring this).
- The parameter's ShortGuid (essentially a SHA1 hash of the SHA1 hash of the parameter's name).
It will eventually provide a facility for you to globally override the return value for any of these requests with your own desired value, as long as you know the ShortGuid of the parameter.
Generally, CATHODE will tolerate you doing things wrong in the scripting system, in fact, if you completely disable a node in the scripting system, the game will not crash, and instead that node's call seems to just be skipped in a flowgraph.
You can break things in interesting ways by doing that, (like making it okay for you to attack story critical NPCs).
Ripley, in the 3rd person, this was caused when I blocked all requests from the game to CATHODE for the value of almost any Enum parameters.
(This forces the game to use the default values which are hard-coded into the game's binary for all of the blocked Enums, which makes all NPCs your ally, and causes the camera to do the above, amongst others).
- Rewrite (using templates) the repetitive janky mess that I wrote to hijack CATHODE's templated
find_parameter
function. - Intercept requests from the game's code to CATHODE's templated function
create_entity
, this might let us track which entities exist and display them in the UI.