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'