Hello! This posts shows the game BallisticNG v1.3.1 hacked with cheats created thru the program Cheat Engine 7.5.
Sample video
In this sample video I show 5 non-playable ships which can be unlocked (replacing a playable one) running in 5 different tracks.
About cheats
Activating cheats using the following hotkeys:
- Instant random weapon (On "PgUp"/Off "PgDown").
- Auto-pilot (On "Num1"/Off "Num0").
- Auto-pilot speed; Hold speed increase (On "Num3"/Off "Num2").
- Shield (On "Num5"/Off "Num4").
- Change player name.
An important note: All cheats which are scripts are available from the first time its respective custom race began.
Also, it comes with a cheat table Lua script:

As you can see, the buttons from upside are for let the ship use always use the same weapon. This is necesary since the weapons are chosen with indexes, but these are relative.

There are many "??"s because the cheat table is not attached to any process.
"Choose next weapon (blue pointers should be built correctly):" cheat must be activated to give the indexes using its below pointer address's value.
And how can I know which weapon the index belongs to?
Easy, using the index in another pointer which leads to the weapon name:
readString(ReadQword(ReadQword(ReadQword(ReadQword(ReadQword(ReadQword(ReadQword(ReadQword(getAddress("UnityPlayer.dll")+0x01A50000)+0x30)+0x0)+0x158)+0x258)+0x10)+X*0x8+0x20)+0x10)+0x14,64,true)
Where "X" is the weapon index. The code uses many predefined functions by CheatEngine (see "https://wiki.cheatengine.org/index.php?title=Lua" for more info about it).
To let player select a specific weapon (eg. "rockets"), we execute the following function when click in "rockets" button in Lua script:
1 function ChooseWeapon0()
2 for X=0x1,0x400 do
3 if readString(ReadQword(ReadQword(ReadQword(ReadQword(ReadQword(ReadQword(ReadQword(ReadQword(getAddress("UnityPlayer.dll")+0x01A50000)+0x30)+0x0)+0x158)+0x258)+0x10)+X*0x8+0x20)+0x10)+0x14,64,true) == "rockets" then
4 WriteQword(getAddress("UnityPlayer.dll")+0x01A50008,X)
5 break
6 end
7 end
8 end
The function ChooseWeapon0() looks on all the indexes from 0x1 to 0x400 to check if the pointer readString(ReadQword(ReadQword(ReadQword(ReadQword(ReadQword(ReadQword(ReadQword(ReadQword(getAddress ("UnityPlayer.dll")+0x01A50000)+0x30)+0x0)+0x158)+0x258)+0x10)+X*0x8+0x20)+0x10)+0x14,64,true) points to the string "rockets" (in other words, it searches for the index which lets the player pick the weapon "rockets"). If it finds one (line 3) then it stores the index in the address mentioned in line 4, and stops searching (expressed in line 5 with the instruction break).
On the line 4 I use a static address which is not being used by any instruction in the game, this is for let the cheat "Choose next weapon (b..." work fine:

And as for unlocking ships, it's very easy. Just wait the game to load fully, and after, in main menu, you can click on any of the non-playable ships you want to use.
If this is the first time you use any of the mentioned toggleboxes (buttons which can be checked/unchecked) it will take a while (some seconds) to be activated, because CheatEngine scans where the directory of original ship to be replaced is located. But after it's found, it stores its address in a variable, so you can reactivate it instantly (unless you restart CheatEngine or BallisticNG).
Downloads
You can download the cheat table here.