automod

Learn More Download

An automated, polyglot, and highly parallel Unreal Engine game mod generator



     v3.2.1    

The Auto Modding Script (automod) is an automated, polyglot, and highly parallel Unreal Engine game mod generator from succinct TOML patch files for .uasset properties, which may include embedded regular expressions and Scala, Typescript, Javascript, Python, and/or Lua patchlets, enabling complex patching tasks with significantly lower manual efforts, all with patch auto-merging support.

A VSCode/VSCodium extension is provided to ease use, complementing an existing extension providing TOML syntax highlighting/checking.


Patch File Examples

# Based on https://www.nexusmods.com/stellarblade/mods/897
[P_Eve_SkillTree_JustEvade_BurstGauge1]
CalculationMultipleValue = 4
LifeTime = 11
LoopIntervalTime = 1
LoopTargetFilterAlias = "Self"
OverlapCount = 1
StartDelayTime = 1

[P_Eve_SkillTree_JustEvade_BurstGauge2]
CalculationMultipleValue = 3
LifeTime = 11
LoopIntervalTime = 1
LoopTargetFilterAlias = "Self"
OverlapCount = 1
StartDelayTime = 1

[P_Eve_SkillTree_JustParry_BetaGauge1]
CalculationMultipleValue = 8
LifeTime = 11
LoopIntervalTime = 1
LoopTargetFilterAlias = "Self"
OverlapCount = 1
StartDelayTime = 1

[P_Eve_SkillTree_JustParry_BetaGauge2]
CalculationMultipleValue = 6
LifeTime = 11
LoopIntervalTime = 1
LoopTargetFilterAlias = "Self"
OverlapCount = 1
StartDelayTime = 1
['.*: ^P_Eve_SkillTree_Just(.*BetaGauge|.*BurstGauge).*$']
CalculationMultipleValue = '''=> v.objName match {
  case "P_Eve_SkillTree_JustParry_BetaGauge1" => 8
  case "P_Eve_SkillTree_JustParry_BetaGauge2" => 6
  case "P_Eve_SkillTree_JustEvade_BurstGauge1" => 4
  case "P_Eve_SkillTree_JustEvade_BurstGauge2" => 3
}'''
OverlapCount = 1
LifeTime = 11
StartDelayTime = 1
LoopIntervalTime = 1
LoopTargetFilterAlias = 'Self'
['.*: ^P_Eve_SkillTree_Just(.*BetaGauge|.*BurstGauge).*$']
CalculationMultipleValue = '''=ts> 
let r: number = 0;
switch(v.objName()) {
  case "P_Eve_SkillTree_JustParry_BetaGauge1": r = 8; break;
  case "P_Eve_SkillTree_JustParry_BetaGauge2": r = 6; break;
  case "P_Eve_SkillTree_JustEvade_BurstGauge1": r = 4; break;
  case "P_Eve_SkillTree_JustEvade_BurstGauge2": r = 3; break;
}
r
'''
OverlapCount = 1
LifeTime = 11
StartDelayTime = 1
LoopIntervalTime = 1
LoopTargetFilterAlias = 'Self'
['.*: ^P_Eve_SkillTree_Just(.*BetaGauge|.*BurstGauge).*$']
CalculationMultipleValue = '''=js> 
let r = 0;
switch(v.objName()) {
  case "P_Eve_SkillTree_JustParry_BetaGauge1": r = 8; break;
  case "P_Eve_SkillTree_JustParry_BetaGauge2": r = 6; break;
  case "P_Eve_SkillTree_JustEvade_BurstGauge1": r = 4; break;
  case "P_Eve_SkillTree_JustEvade_BurstGauge2": r = 3; break;
}
r
'''
OverlapCount = 1
LifeTime = 11
StartDelayTime = 1
LoopIntervalTime = 1
LoopTargetFilterAlias = 'Self'
['.*: ^P_Eve_SkillTree_Just(.*BetaGauge|.*BurstGauge).*$']
CalculationMultipleValue = '''=py> 
r = 0
match v.objName():
  case "P_Eve_SkillTree_JustParry_BetaGauge1": 
    r = 8
  case "P_Eve_SkillTree_JustParry_BetaGauge2":
    r = 6
  case "P_Eve_SkillTree_JustEvade_BurstGauge1": 
    r = 4
  case "P_Eve_SkillTree_JustEvade_BurstGauge2": 
    r = 3
r
'''
OverlapCount = 1
LifeTime = 11
StartDelayTime = 1
LoopIntervalTime = 1
LoopTargetFilterAlias = 'Self'
['.*: ^P_Eve_SkillTree_Just(.*BetaGauge|.*BurstGauge).*$']
CalculationMultipleValue = '''=lua> 
local r = {
  ["P_Eve_SkillTree_JustParry_BetaGauge1"] = 8,
  ["P_Eve_SkillTree_JustParry_BetaGauge2"] = 6,
  ["P_Eve_SkillTree_JustEvade_BurstGauge1"] = 4,
  ["P_Eve_SkillTree_JustEvade_BurstGauge2"] = 3
}
return r[v.objName]
'''
OverlapCount = 1
LifeTime = 11
StartDelayTime = 1
LoopIntervalTime = 1
LoopTargetFilterAlias = 'Self'