diff --git a/src/Data/Bosses.lua b/src/Data/Bosses.lua new file mode 100644 index 0000000000..7a4ee60924 --- /dev/null +++ b/src/Data/Bosses.lua @@ -0,0 +1,123 @@ +-- This file is automatically generated, do not edit! +-- Path of Building +-- +-- Boss Data +-- Boss data (c) Grinding Gear Games +-- +local bosses = ... + +bosses["Venarius"] = { + armourMult = 0, + evasionMult = 0, + isUber = true, +} +bosses["EaterOfWorlds"] = { + armourMult = 0, + evasionMult = 0, + isUber = true, +} +bosses["SearingExarch"] = { + armourMult = 0, + evasionMult = 50, + isUber = true, +} +bosses["Maven"] = { + armourMult = 100, + evasionMult = 0, + isUber = true, +} +bosses["Sirus"] = { + armourMult = 100, + evasionMult = 0, + isUber = true, +} +bosses["Shaper"] = { + armourMult = 33, + evasionMult = 33, + isUber = true, +} +bosses["Elder"] = { + armourMult = 33, + evasionMult = 33, + isUber = true, +} + +bosses["BlackStar"] = { + armourMult = 0, + evasionMult = 50, + isUber = false, +} +bosses["InfiniteHunger"] = { + armourMult = 100, + evasionMult = 0, + isUber = false, +} + +bosses["Atziri"] = { + armourMult = 100, + evasionMult = 50, + isUber = false, +} + +bosses["Phoenix"] = { + armourMult = 50, + evasionMult = 50, + isUber = false, +} +bosses["Hydra"] = { + armourMult = 0, + evasionMult = 100, + isUber = false, +} +bosses["Minotaur"] = { + armourMult = 100, + evasionMult = 0, + isUber = false, +} +bosses["Chimera"] = { + armourMult = 0, + evasionMult = 50, + isUber = false, +} + +bosses["Enslaver"] = { + armourMult = 33, + evasionMult = 33, + isUber = false, +} +bosses["Eradicator"] = { + armourMult = 33, + evasionMult = 33, + isUber = false, +} +bosses["Constrictor"] = { + armourMult = 33, + evasionMult = 33, + isUber = false, +} +bosses["Purifier"] = { + armourMult = 33, + evasionMult = 33, + isUber = false, +} + +bosses["Baran"] = { + armourMult = 100, + evasionMult = 0, + isUber = false, +} +bosses["Veritania"] = { + armourMult = 100, + evasionMult = 0, + isUber = false, +} +bosses["AlHezmin"] = { + armourMult = 100, + evasionMult = 0, + isUber = false, +} +bosses["Drox"] = { + armourMult = 100, + evasionMult = 0, + isUber = false, +} diff --git a/src/Export/Enemies/Bosses.txt b/src/Export/Enemies/Bosses.txt new file mode 100644 index 0000000000..774c42ea7f --- /dev/null +++ b/src/Export/Enemies/Bosses.txt @@ -0,0 +1,34 @@ +-- Path of Building +-- +-- Boss Data +-- Boss data (c) Grinding Gear Games +-- +local bosses = ... + +#boss SynthesisVenarius Venarius {Uber} +#boss AtlasInvadersConsumeBoss EaterOfWorlds {Uber} +#boss AtlasInvadersCleansingBoss SearingExarch {Uber} +#boss TheMaven Maven {Uber} +#boss AtlasExiles5 Sirus {Uber} +#boss TheShaperBoss Shaper {Uber} +#boss TheElder Elder {Uber} + +#boss AtlasInvadersBlackStarBoss BlackStar +#boss AtlasInvadersDoomBoss InfiniteHunger + +#boss Atziri Atziri + +#boss AtlasBossPhoenix Phoenix +#boss AtlasBossHydra Hydra +#boss AtlasBossMinotaur Minotaur +#boss AtlasBossChimera Chimera + +#boss ElderGuardian1 Enslaver +#boss ElderGuardian2 Eradicator +#boss ElderGuardian3 Constrictor +#boss ElderGuardian4 Purifier + +#boss AtlasExiles1 Baran +#boss AtlasExiles2 Veritania +#boss AtlasExiles3 AlHezmin +#boss AtlasExiles4 Drox \ No newline at end of file diff --git a/src/Export/Scripts/enemies.lua b/src/Export/Scripts/enemies.lua new file mode 100644 index 0000000000..fc4f9f19c8 --- /dev/null +++ b/src/Export/Scripts/enemies.lua @@ -0,0 +1,36 @@ +local directiveTable = { } + +-- #boss +directiveTable.boss = function(state, args, out) + state.id = nil + state.name = nil + for arg in args:gmatch("%S+") do + if state.id == nil then + state.id = arg + elseif state.name == nil then + if arg == "#" then + state.name = state.id + else + state.name = arg + end + end + end + + local isUber = args:match("{Uber}") + + local monsterType = dat("MonsterTypes"):GetRow("Id", state.id) + if not monsterType then + print("Invalid Type: "..state.varietyId) + return + end + + out:write('bosses["', state.name, '"] = {\n') + out:write('\tarmourMult = ', monsterType.Armour, ',\n') + out:write('\tevasionMult = ', monsterType.Evasion, ',\n') + out:write('\tisUber = ', isUber and "true" or "false", ',\n') + out:write('}\n') +end + +processTemplateFile("Bosses", "Enemies/", "../Data/", directiveTable) + +print("Enemy data exported.") diff --git a/src/Modules/CalcOffence.lua b/src/Modules/CalcOffence.lua index c0f563f54f..b3c8391533 100644 --- a/src/Modules/CalcOffence.lua +++ b/src/Modules/CalcOffence.lua @@ -1562,7 +1562,7 @@ function calcs.offence(env, actor, activeSkill) if breakdown then breakdown.AccuracyHitChance = { "Enemy level: "..env.enemyLevel..(env.configInput.enemyLevel and " ^8(overridden from the Configuration tab" or " ^8(can be overridden in the Configuration tab)"), - "Average enemy evasion: "..enemyEvasion, + "Enemy evasion: "..enemyEvasion, "Approximate hit chance: "..output.AccuracyHitChance.."%", } end diff --git a/src/Modules/CalcSetup.lua b/src/Modules/CalcSetup.lua index e900d845cd..06a98a2bdb 100644 --- a/src/Modules/CalcSetup.lua +++ b/src/Modules/CalcSetup.lua @@ -493,8 +493,6 @@ function calcs.initEnv(build, mode, override, specEnv) -- Initialise enemy modifier database calcs.initModDB(env, enemyDB) enemyDB:NewMod("Accuracy", "BASE", env.data.monsterAccuracyTable[env.enemyLevel], "Base") - enemyDB:NewMod("Evasion", "BASE", env.data.monsterEvasionTable[env.enemyLevel], "Base") - enemyDB:NewMod("Armour", "BASE", env.data.monsterArmourTable[env.enemyLevel], "Base") -- Add mods from the config tab env.modDB:AddList(build.configTab.modList) diff --git a/src/Modules/ConfigOptions.lua b/src/Modules/ConfigOptions.lua index c434993884..1dcf14c0ba 100644 --- a/src/Modules/ConfigOptions.lua +++ b/src/Modules/ConfigOptions.lua @@ -1444,6 +1444,8 @@ Bosses' damage is monster damage scaled to an average damage of their attacks This is divided by 4.25 to represent 4 damage types + some ^xD02090chaos ^7Fill in the exact damage numbers if more precision is needed +Bosses' armour and evasion multiplier are calculated using the average of the boss type + Standard Boss adds the following modifiers: +40% to enemy Elemental Resistances +25% to enemy ^xD02090Chaos Resistance @@ -1452,15 +1454,13 @@ Standard Boss adds the following modifiers: Guardian / Pinnacle Boss adds the following modifiers: +50% to enemy Elemental Resistances +30% to enemy ^xD02090Chaos Resistance - ^7+33% to enemy Armour - 188% of monster damage + ^7188% of monster damage 5% penetration Uber Pinnacle Boss adds the following modifiers: +50% to enemy Elemental Resistances +30% to enemy ^xD02090Chaos Resistance - ^7+100% to enemy Armour - 70% less to enemy Damage taken + ^770% less to enemy Damage taken 235% of monster damage 8% penetration]], list = {{val="None",label="No"},{val="Boss",label="Standard Boss"},{val="Pinnacle",label="Guardian/Pinnacle Boss"},{val="Uber",label="Uber Pinnacle Boss"}}, apply = function(val, modList, enemyModList, build) --these defaults are here so that the placeholder gets reset correctly @@ -1492,6 +1492,9 @@ Uber Pinnacle Boss adds the following modifiers: build.configTab.varControls['enemyLightningPen']:SetPlaceholder(defaultPen, true) build.configTab.varControls['enemyColdPen']:SetPlaceholder(defaultPen, true) build.configTab.varControls['enemyFirePen']:SetPlaceholder(defaultPen, true) + + build.configTab.varControls['enemyArmour']:SetPlaceholder(data.monsterArmourTable[defaultLevel], true) + build.configTab.varControls['enemyEvasion']:SetPlaceholder(data.monsterEvasionTable[defaultLevel], true) elseif val == "Boss" then enemyModList:NewMod("Condition:RareOrUnique", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) enemyModList:NewMod("AilmentThreshold", "MORE", 488, "Boss") @@ -1521,10 +1524,12 @@ Uber Pinnacle Boss adds the following modifiers: build.configTab.varControls['enemyLightningPen']:SetPlaceholder(defaultPen, true) build.configTab.varControls['enemyColdPen']:SetPlaceholder(defaultPen, true) build.configTab.varControls['enemyFirePen']:SetPlaceholder(defaultPen, true) + + build.configTab.varControls['enemyArmour']:SetPlaceholder(data.monsterArmourTable[defaultLevel], true) + build.configTab.varControls['enemyEvasion']:SetPlaceholder(data.monsterEvasionTable[defaultLevel], true) elseif val == "Pinnacle" then enemyModList:NewMod("Condition:RareOrUnique", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) enemyModList:NewMod("Condition:PinnacleBoss", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) - enemyModList:NewMod("Armour", "MORE", 33, "Boss") enemyModList:NewMod("AilmentThreshold", "MORE", 404, "Boss") modList:NewMod("WarcryPower", "BASE", 20, "Boss") @@ -1550,10 +1555,14 @@ Uber Pinnacle Boss adds the following modifiers: build.configTab.varControls['enemyLightningPen']:SetPlaceholder(data.misc.pinnacleBossPen, true) build.configTab.varControls['enemyColdPen']:SetPlaceholder(data.misc.pinnacleBossPen, true) build.configTab.varControls['enemyFirePen']:SetPlaceholder(data.misc.pinnacleBossPen, true) + + local defaultArmour = round(data.monsterArmourTable[defaultLevel] * (1 + data.bossStats.PinnacleArmourMean/100)) + local defaultEvasion = round(data.monsterEvasionTable[defaultLevel] * (1 + data.bossStats.PinnacleEvasionMean/100)) + build.configTab.varControls['enemyArmour']:SetPlaceholder(defaultArmour, true) + build.configTab.varControls['enemyEvasion']:SetPlaceholder(defaultEvasion, true) elseif val == "Uber" then enemyModList:NewMod("Condition:RareOrUnique", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) enemyModList:NewMod("Condition:PinnacleBoss", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) - enemyModList:NewMod("Armour", "MORE", 100, "Boss") enemyModList:NewMod("DamageTaken", "MORE", -70, "Boss") enemyModList:NewMod("AilmentThreshold", "MORE", 404, "Boss") modList:NewMod("WarcryPower", "BASE", 20, "Boss") @@ -1580,6 +1589,11 @@ Uber Pinnacle Boss adds the following modifiers: build.configTab.varControls['enemyLightningPen']:SetPlaceholder(data.misc.uberBossPen, true) build.configTab.varControls['enemyColdPen']:SetPlaceholder(data.misc.uberBossPen, true) build.configTab.varControls['enemyFirePen']:SetPlaceholder(data.misc.uberBossPen, true) + + local defaultArmour = round(data.monsterArmourTable[defaultLevel] * (1 + data.bossStats.UberArmourMean/100)) + local defaultEvasion = round(data.monsterEvasionTable[defaultLevel] * (1 + data.bossStats.UberArmourMean/100)) + build.configTab.varControls['enemyArmour']:SetPlaceholder(defaultArmour, true) + build.configTab.varControls['enemyEvasion']:SetPlaceholder(defaultEvasion, true) end end }, { var = "deliriousPercentage", type = "list", label = "Delirious Effect:", list = {{val=0,label="None"},{val="20Percent",label="20% Delirious"},{val="40Percent",label="40% Delirious"},{val="60Percent",label="60% Delirious"},{val="80Percent",label="80% Delirious"},{val="100Percent",label="100% Delirious"}}, tooltip = "Delirium scales enemy 'less Damage Taken' as well as enemy 'increased Damage dealt'\nAt 100% effect:\nEnemies Deal 30% Increased Damage\nEnemies take 80% Less Damage", apply = function(val, modList, enemyModList) @@ -1622,6 +1636,12 @@ Uber Pinnacle Boss adds the following modifiers: { var = "enemyBlockChance", type = "integer", label = "Enemy Block Chance:", apply = function(val, modList, enemyModList) enemyModList:NewMod("BlockChance", "BASE", val, "Config") end }, + { var = "enemyEvasion", type = "count", label = "Enemy Base Evasion:", apply = function(val, modList, enemyModList) + enemyModList:NewMod("Evasion", "BASE", val, "Config") + end }, + { var = "enemyArmour", type = "count", label = "Enemy Base Armour:", apply = function(val, modList, enemyModList) + enemyModList:NewMod("Armour", "BASE", val, "Config") + end }, { var = "presetBossSkills", type = "list", label = "Boss Skill Preset", tooltip = [[ Used to fill in defaults for specific boss skills if the boss config is not set diff --git a/src/Modules/Data.lua b/src/Modules/Data.lua index 0d6ddbf46f..f1fddb996e 100644 --- a/src/Modules/Data.lua +++ b/src/Modules/Data.lua @@ -985,6 +985,37 @@ for _, minion in pairs(data.minions) do end end +-- Load bosses +data.bosses = { } +LoadModule("Data/Bosses", data.bosses) + +local count = 0 +local uberCount = 0 + +local armourTotal = 0 +local evasionTotal = 0 + +local uberArmourTotal = 0 +local uberEvasionTotal = 0 + +for _, boss in pairs(data.bosses) do + if boss.isUber then + uberCount = uberCount + 1 + uberArmourTotal = uberArmourTotal + boss.armourMult + uberEvasionTotal = uberEvasionTotal + boss.evasionMult + end + count = count + 1 + armourTotal = armourTotal + boss.armourMult + evasionTotal = evasionTotal + boss.evasionMult +end + +data.bossStats = { + PinnacleArmourMean=armourTotal/count, + PinnacleEvasionMean=evasionTotal/count, + UberArmourMean=uberArmourTotal/uberCount, + UberEvasionMean=uberEvasionTotal/uberCount +} + -- Item bases data.itemBases = { } for _, type in pairs(itemTypes) do