You don't need any special tools - the moddable parts of the game are all dynamically-compiled lua code, so you only need a text editor.
Basically, you create a mod folder with a mod_info.lua (copying someone else's and changing the name, version and UID is the easiest way to learn how) and a \hook folder, where you place files to be merged ('hooked') with original Demigod files, using the same directory structure found \Demigod\dgdata.zip (where all the game's moddable code resides).
In other words, if you want to modify some of Oculus' abilities, you create a blank file called \units\heroes\HOculus\HOculus_Abilities.lua in your mod's hook folder, and only override the functions or ability blueprints you want to change (you can copy-paste these individually from the original file in dgdata.zip while you're starting out and they'll override the original function/blueprint, but this is not the best way to make a mod once you're accustomed to lua).
Reading this thread might help you understand how to add or edit items and abilities. I made a post further down (here) about how to make these kinds of changes without breaking other mods, which is something you need to know how to do if for example you want be able to use the Uberfix or other people's item mods along with yours.
Changing unit blueprints (which control things like base damage, speed, etc) is a bit simpler, and can all be done in one mod_units.bp file in your mod's base folder. I briefly touched on how to do this a few posts down in that thread; basically you need to specify the blueprint id (the unit's folder name in dgdata.zip, e.g. 'hoculus' for Oculus or 'hgsa01' for Regulus) and Merge = true inside the blueprint table, and then only specify the values you want changed, e.g. for changing Regulus' base speed:
Code: c++
- UnitBlueprint {
- BlueprintId = "hgsa01",
- Merge = true,
- Physics = {
- MaxSpeed = 6.3, # 6.0
- },
- }
..you don't need to include anything else from the Physics table in the original blueprint, as anything not specified in your merge goes unchanged. (The '#' is a comment character and everything after it on that line is not interpreted, which I used in this example to list the original value for that variable)