diff --git a/src/Data/BossSkills.lua b/src/Data/BossSkills.lua index 296fcef5d8..c79a11edfc 100644 --- a/src/Data/BossSkills.lua +++ b/src/Data/BossSkills.lua @@ -8,16 +8,16 @@ return { ["Atziri Flameblast"] = { DamageType = "Spell", DamageMultipliers = { - Fire = { 57.29394377618, 0.2864697188809 } + Fire = { 51.086684344463, 0.25543342172232 } }, + UberDamageMultiplier = 1.26, DamagePenetrations = { - FirePen = "" + FirePen = 8 }, UberDamagePenetrations = { FirePen = 10 }, - speed = 12500, - UberSpeed = 25000, + speed = 25000, critChance = 0, earlierUber = true, tooltip = "The Uber variant has 10 ^xB97123Fire^7 penetration (Applied on Pinnacle And Uber)" @@ -25,7 +25,7 @@ return { ["Shaper Ball"] = { DamageType = "SpellProjectile", DamageMultipliers = { - Cold = { 11.666076975909, 0.058330384879546 } + Cold = { 11.668066430448, 0.058340332152239 } }, DamagePenetrations = { ColdPen = 25 @@ -91,7 +91,7 @@ return { speed = 3000, tooltip = "Allocating Throw the Gauntlet increases Damage by a further 100% (Applied on Uber) and causes the fireball to have 30 ^xB97123Fire^7 penetration (Applied on Uber)" }, - ["Maven MemoryGame"] = { + ["Maven Memory Game"] = { DamageType = "Melee", DamageMultipliers = { Lightning = { 34.763635149472, 0.17381817574736 }, @@ -102,4 +102,14 @@ return { speed = 7500, tooltip = "Is three separate hits, and has a large DoT effect. Neither is taken into account here. \n i.e. Hits before death should be more than 3 to survive" }, -} +},{ + { val = "None", label = "None" }, + { val = "Atziri Flameblast", label = "Atziri Flameblast" }, + { val = "Shaper Ball", label = "Shaper Ball" }, + { val = "Shaper Slam", label = "Shaper Slam" }, + { val = "Sirus Meteor", label = "Sirus Meteor" }, + { val = "Exarch Ball", label = "Exarch Ball" }, + { val = "Eater Beam", label = "Eater Beam" }, + { val = "Maven Fireball", label = "Maven Fireball" }, + { val = "Maven Memory Game", label = "Maven Memory Game" } +} \ No newline at end of file diff --git a/src/Export/bossSkills.txt b/src/Export/Enemies/BossSkills.txt similarity index 94% rename from src/Export/bossSkills.txt rename to src/Export/Enemies/BossSkills.txt index 2c9d492617..f3185ea7e1 100644 --- a/src/Export/bossSkills.txt +++ b/src/Export/Enemies/BossSkills.txt @@ -5,7 +5,7 @@ -- return { #boss Atziri Metadata/Monsters/Atziri/Atziri true -#skill Flameblast AtziriFlameblast, GrantedEffectIdUber = AtziriFlameblastEmpowered, stages = 10, +#skill Flameblast AtziriFlameblastEmpowered, stages = 10, #tooltip "The Uber variant has 10 ^xB97123Fire^7 penetration (Applied on Pinnacle And Uber)" #boss Shaper Metadata/Monsters/AtlasBosses/TheShaperBoss false #skill Ball AtlasBossAcceleratingProjectiles @@ -26,4 +26,4 @@ return { #tooltip "Allocating Throw the Gauntlet increases Damage by a further 100% (Applied on Uber) and causes the fireball to have 30 ^xB97123Fire^7 penetration (Applied on Uber)" #skill MemoryGame MavenMemoryGame #tooltip "Is three separate hits, and has a large DoT effect. Neither is taken into account here. \n i.e. Hits before death should be more than 3 to survive" -} \ No newline at end of file +#skillList \ No newline at end of file diff --git a/src/Export/Enemies/Bosses.txt b/src/Export/Enemies/Bosses.txt index 774c42ea7f..b742ecc932 100644 --- a/src/Export/Enemies/Bosses.txt +++ b/src/Export/Enemies/Bosses.txt @@ -5,30 +5,30 @@ -- 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 Venarius SynthesisVenarius {Uber} +#boss EaterOfWorlds AtlasInvadersConsumeBoss {Uber} +#boss SearingExarch AtlasInvadersCleansingBoss {Uber} +#boss Maven TheMaven {Uber} +#boss Sirus AtlasExiles5 {Uber} +#boss Shaper TheShaperBoss {Uber} +#boss Elder TheElder {Uber} -#boss AtlasInvadersBlackStarBoss BlackStar -#boss AtlasInvadersDoomBoss InfiniteHunger +#boss BlackStar AtlasInvadersBlackStarBoss +#boss InfiniteHunger AtlasInvadersDoomBoss #boss Atziri Atziri -#boss AtlasBossPhoenix Phoenix -#boss AtlasBossHydra Hydra -#boss AtlasBossMinotaur Minotaur -#boss AtlasBossChimera Chimera +#boss Phoenix AtlasBossPhoenix +#boss Hydra AtlasBossHydra +#boss Minotaur AtlasBossMinotaur +#boss Chimera AtlasBossChimera -#boss ElderGuardian1 Enslaver -#boss ElderGuardian2 Eradicator -#boss ElderGuardian3 Constrictor -#boss ElderGuardian4 Purifier +#boss Enslaver ElderGuardian1 +#boss Eradicator ElderGuardian2 +#boss Constrictor ElderGuardian3 +#boss Purifier ElderGuardian4 -#boss AtlasExiles1 Baran -#boss AtlasExiles2 Veritania -#boss AtlasExiles3 AlHezmin -#boss AtlasExiles4 Drox \ No newline at end of file +#boss Baran AtlasExiles1 +#boss Veritania AtlasExiles2 +#boss AlHezmin AtlasExiles3 +#boss Drox AtlasExiles4 \ No newline at end of file diff --git a/src/Export/Scripts/bossSkills.lua b/src/Export/Scripts/bossData.lua similarity index 83% rename from src/Export/Scripts/bossSkills.lua rename to src/Export/Scripts/bossData.lua index edeeeb427f..84b8bbea57 100644 --- a/src/Export/Scripts/bossSkills.lua +++ b/src/Export/Scripts/bossData.lua @@ -6,14 +6,14 @@ local rarityDamageMult = { Unique = (1 + dat("Mods"):GetRow("Id", "MonsterUnique5").Stat1Value[1] / 100), UniqueAttack = (1 + dat("Mods"):GetRow("Id", "MonsterUnique5").Stat1Value[1] / 100) * (1 - dat("Mods"):GetRow("Id", "MonsterUnique8").Stat1Value[1] / 100) } -local monsterBaseDamage = { 1.59, 4.9899997711182, 5.5599999427795, 6.1599998474121, 6.8099999427795, 7.5, 8.2299995422363, 9, 9.8199996948242, 10.699999809265, 11.619999885559, 12.60000038147, 13.640000343323, 14.739999771118, 15.909999847412, 17.139999389648, 18.450000762939, 19.829999923706, 21.290000915527, 22.840000152588, 24.469999313354, 26.190000534058, 28.010000228882, 29.940000534058, 31.959999084473, 34.110000610352, 36.360000610352, 38.75, 41.259998321533, 43.909999847412, 46.700000762939, 49.650001525879, 52.75, 56.009998321533, 59.450000762939, 63.080001831055, 66.889999389648, 70.910003662109, 75.129997253418, 79.580001831055, 84.26000213623, 89.180000305176, 94.349998474121, 99.800003051758, 105.51999664307, 111.5299987793, 117.86000061035, 124.5, 131.49000549316, 138.83000183105, 146.5299987793, 154.63000488281, 163.13999938965, 172.07000732422, 181.44999694824, 191.30000305176, 201.63000488281, 212.47999572754, 223.86999511719, 235.83000183105, 248.36999511719, 261.5299987793, 275.32998657227, 289.82000732422, 305.01000976562, 320.94000244141, 337.64999389648, 355.17999267578, 373.54998779297, 392.80999755859, 413.01000976562, 434.17999267578, 456.36999511719, 479.61999511719, 504, 529.53997802734, 556.29998779297, 584.34997558594, 613.72998046875, 644.5, 676.75, 710.52001953125, 745.89001464844, 782.94000244141, 821.72998046875, 862.35998535156, 904.90002441406, 949.44000244141, 996.07000732422, 1044.8900146484, 1096, 1149.5, 1205.5, 1264.1099853516, 1325.4499511719, 1389.6400146484, 1456.8199462891, 1527.1199951172, 1600.6800537109, 1677.6400146484, 1758.1700439453, } +local monsterBaseDamage = { 4.9899997711182, 5.5599999427795, 6.1599998474121, 6.8099999427795, 7.5, 8.2299995422363, 9, 9.8199996948242, 10.699999809265, 11.619999885559, 12.60000038147, 13.640000343323, 14.739999771118, 15.909999847412, 17.139999389648, 18.450000762939, 19.829999923706, 21.290000915527, 22.840000152588, 24.469999313354, 26.190000534058, 28.010000228882, 29.940000534058, 31.959999084473, 34.110000610352, 36.360000610352, 38.75, 41.259998321533, 43.909999847412, 46.700000762939, 49.650001525879, 52.75, 56.009998321533, 59.450000762939, 63.080001831055, 66.889999389648, 70.910003662109, 75.129997253418, 79.580001831055, 84.26000213623, 89.180000305176, 94.349998474121, 99.800003051758, 105.51999664307, 111.5299987793, 117.86000061035, 124.5, 131.49000549316, 138.83000183105, 146.5299987793, 154.63000488281, 163.13999938965, 172.07000732422, 181.44999694824, 191.30000305176, 201.63000488281, 212.47999572754, 223.86999511719, 235.83000183105, 248.36999511719, 261.5299987793, 275.32998657227, 289.82000732422, 305.01000976562, 320.94000244141, 337.64999389648, 355.17999267578, 373.54998779297, 392.80999755859, 413.01000976562, 434.17999267578, 456.36999511719, 479.61999511719, 504, 529.53997802734, 556.29998779297, 584.34997558594, 613.72998046875, 644.5, 676.75, 710.52001953125, 745.89001464844, 782.94000244141, 821.72998046875, 862.35998535156, 904.90002441406, 949.44000244141, 996.07000732422, 1044.8900146484, 1096, 1149.5, 1205.5, 1264.1099853516, 1325.4499511719, 1389.6400146484, 1456.8199462891, 1527.1199951172, 1600.6800537109, 1677.6400146484, 1758.1700439453, } local monsterMapDifficultyMult = {} for row in dat("MonsterMapDifficulty"):Rows() do monsterMapDifficultyMult[row.AreaLevel] = 1 + row.DamagePercentIncrease / 100 end local baseDamage = { - AtziriFlameblast = { index = 1, uberIndex = 2, oldMethod = true }, - AtlasBossAcceleratingProjectiles = { index = 1, uberIndex = 2, oldMethod = true }, + AtziriFlameblastEmpowered = { index = 1, uberIndex = 2, mapBoss = true }, + AtlasBossAcceleratingProjectiles = { index = 1, uberIndex = 2 }, AtlasBossFlickerSlam = { index = 1, uberIndex = 2, oldMethod = true, attack = true }, AtlasExileOrionCircleMazeBlast3 = { index = 4, uberIndex = 5 }, CleansingFireWall = { index = 1, oldMethod = true }, @@ -22,7 +22,7 @@ local baseDamage = { MavenMemoryGame = { index = 1, oldMethod = true, mapBoss = true }, } local oldMethod = { - AtziriFlameblast = { Fire = { 1210.408, 0 } }, + AtziriFlameblastEmpowered = { Fire = { 1210.408, 0 } }, AtlasBossAcceleratingProjectiles = { Cold = { 3358.0288, 0 } }, AtlasBossFlickerSlam = { Physical = { 1769.847, 0 } }, AtlasExileOrionCircleMazeBlast3 = { Physical = { 18154.481, 0 }, SkillUberDamageMult = 152 }, @@ -74,7 +74,7 @@ local function calcSkillDamage(state) break end end - ExtraDamageMult = { ExtraDamageMult[1] * (1 + stageMulti * (skill.stages - 1)), ExtraDamageMult[2] * (1 + stageMulti * (skill.stages - 1)) } + ExtraDamageMult = { ExtraDamageMult[1] * (1 + stageMulti * skill.stages), ExtraDamageMult[2] * (1 + stageMulti * skill.stages) } end -- old method with hardcoded values (Still used for Shaper Slam) if baseDamage[grantedId].oldMethod then @@ -83,7 +83,7 @@ local function calcSkillDamage(state) local conversionDivisor = m_max(totalConversions, 100) physConversions = { m_max(1 - totalConversions / 100, 0), physConversions[2] / conversionDivisor, physConversions[3] / conversionDivisor, physConversions[4] / conversionDivisor, physConversions[5] / conversionDivisor } end - local baseDamageMult = state.SkillExtraDamageMult * ExtraDamageMult[1] * boss.damageMult / 100 * (rarityDamageMult[rarityType] or 1) * (baseDamage[grantedId].mapBoss and monsterMapDifficultyMult[84] or 1) / (monsterBaseDamage[monsterLevel] or 1) + local baseDamageMult = state.SkillExtraDamageMult * ExtraDamageMult[1] * boss.damageMult / 100 * (rarityDamageMult[rarityType] or 1) * (baseDamage[grantedId].mapBoss and monsterMapDifficultyMult[monsterLevel] or 1) / (monsterBaseDamage[monsterLevel - 1] or 1) if oldMethod[grantedId].Physical and physConversions[1] ~= 0 then local damageRange = (oldMethod[grantedId].Physical[2] == 0) and (boss.damageRange / 100) or oldMethod[grantedId].Physical[2] / 100 local damageMult = oldMethod[grantedId].Physical[1] * physConversions[1] * baseDamageMult @@ -106,12 +106,11 @@ local function calcSkillDamage(state) end end if ExtraDamageMult[1] ~= ExtraDamageMult[2] then - state.DamageData.SkillUberDamageMult = 100 * ExtraDamageMult[2] / ExtraDamageMult[1] * (baseDamage[grantedId].mapBoss and (monsterMapDifficultyMult[85] / monsterMapDifficultyMult[84]) or 1) - end - if oldMethod[grantedId].SkillUberDamageMult then - state.DamageData.SkillUberDamageMult = oldMethod[grantedId].SkillUberDamageMult * (baseDamage[grantedId].mapBoss and (monsterMapDifficultyMult[85] / monsterMapDifficultyMult[84]) or 1) + state.DamageData.SkillUberDamageMult = 100 * ExtraDamageMult[2] / ExtraDamageMult[1] * (baseDamage[grantedId].mapBoss and (monsterMapDifficultyMult[monsterLevel + 1] / monsterMapDifficultyMult[monsterLevel]) or 1) + elseif oldMethod[grantedId].SkillUberDamageMult then + state.DamageData.SkillUberDamageMult = oldMethod[grantedId].SkillUberDamageMult * (baseDamage[grantedId].mapBoss and (monsterMapDifficultyMult[monsterLevel + 1] / monsterMapDifficultyMult[monsterLevel]) or 1) elseif baseDamage[grantedId].mapBoss then - state.DamageData.SkillUberDamageMult = 100 * (monsterMapDifficultyMult[85] / monsterMapDifficultyMult[84]) + state.DamageData.SkillUberDamageMult = 100 * (monsterMapDifficultyMult[baseDamage[grantedId].uberMapBoss or (monsterLevel + 1)] / monsterMapDifficultyMult[monsterLevel]) end else @@ -143,13 +142,13 @@ local function calcSkillDamage(state) end end end - monsterLevel = skill.statsPerLevel[baseDamage[grantedId].index].PlayerLevelReq + 1 + monsterLevel = skill.statsPerLevel[baseDamage[grantedId].index].PlayerLevelReq if baseDamages["minPhysical1"] or baseDamages["maxPhysical1"] then local totalConversions = physConversions[2] + physConversions[3] + physConversions[4] + physConversions[5] local conversionDivisor = m_max(totalConversions, 100) physConversions = { m_max(1 - totalConversions / 100, 0), physConversions[2] / conversionDivisor, physConversions[3] / conversionDivisor, physConversions[4] / conversionDivisor, physConversions[5] / conversionDivisor } end - local baseDamageMult = state.SkillExtraDamageMult * ExtraDamageMult[1] * (rarityDamageMult[rarityType] or 1) * (baseDamage[grantedId].mapBoss and monsterMapDifficultyMult[84] or 1) / (monsterBaseDamage[monsterLevel] or 1) -- * boss.damageMult / 100 + local baseDamageMult = state.SkillExtraDamageMult * ExtraDamageMult[1] * (rarityDamageMult[rarityType] or 1) * (baseDamage[grantedId].mapBoss and monsterMapDifficultyMult[monsterLevel] or 1) / (monsterBaseDamage[monsterLevel] or 1) -- * boss.damageMult / 100 if (baseDamages["minPhysical1"] or baseDamages["maxPhysical1"]) and physConversions[1] ~= 0 then local damageMult = physConversions[1] * baseDamageMult state.DamageData["PhysicalDamageMultMin"], state.DamageData["PhysicalDamageMultMax"] = damageMult * (baseDamages["minPhysical1"] or 0), damageMult * (baseDamages["maxPhysical1"] or 0) @@ -171,14 +170,14 @@ local function calcSkillDamage(state) if baseDamage[grantedId].uberIndex then local SkillUberDamageMult = 0 local SkillDamageMult = 0 - local uberMonsterLevel = skill.statsPerLevel[baseDamage[grantedId].uberIndex].PlayerLevelReq + 1 + local uberMonsterLevel = skill.statsPerLevel[baseDamage[grantedId].uberIndex].PlayerLevelReq for _, damageType in ipairs({"Physical", "Lightning", "Cold", "Fire", "Chaos"}) do if (baseDamages["min"..damageType.."1"] or baseDamages["max"..damageType.."1"]) then SkillDamageMult = SkillDamageMult + baseDamages["min"..damageType.."1"] or baseDamages["max"..damageType.."1"] SkillUberDamageMult = SkillUberDamageMult + baseDamages["min"..damageType.."2"] or baseDamages["max"..damageType.."2"] end end - SkillUberDamageMult = (SkillUberDamageMult / (monsterBaseDamage[uberMonsterLevel] or 1)) / (SkillDamageMult / (monsterBaseDamage[monsterLevel] or 1)) * (baseDamage[grantedId].mapBoss and (monsterMapDifficultyMult[85] / monsterMapDifficultyMult[84]) or 1) + SkillUberDamageMult = (SkillUberDamageMult / (monsterBaseDamage[uberMonsterLevel] or 1)) / (SkillDamageMult / (monsterBaseDamage[monsterLevel] or 1)) * (baseDamage[grantedId].mapBoss and (monsterMapDifficultyMult[uberMonsterLevel] / monsterMapDifficultyMult[monsterLevel]) or 1) if SkillUberDamageMult > 1.15 or SkillUberDamageMult < 0.85 then state.DamageData.SkillUberDamageMult = m_ceil(SkillUberDamageMult * 100) end @@ -233,20 +232,7 @@ local function getStat(state, stat) end end end - if boss.earlierUber then - local statsPerLevel = skill.statsPerLevelUber[2] - for i, additionalStat in ipairs(statsPerLevel.AdditionalStats) do - if additionalStat.Id == "base_reduce_enemy_lightning_resistance_%" then - DamageData["LightningUberPen"] = statsPerLevel.AdditionalStatsValues[i] - elseif additionalStat.Id == "base_reduce_enemy_cold_resistance_%" then - DamageData["ColdUberPen"] = statsPerLevel.AdditionalStatsValues[i] - elseif additionalStat.Id == "base_reduce_enemy_fire_resistance_%" then - DamageData["FireUberPen"] = statsPerLevel.AdditionalStatsValues[i] - elseif additionalStat.Id == "base_reduce_enemy_chaos_resistance_%" then - DamageData["ChaosUberPen"] = statsPerLevel.AdditionalStatsValues[i] - end - end - elseif skill.statsPerLevel2 then + if skill.statsPerLevel2 then for level, statsPerLevel in ipairs(skill.statsPerLevel2) do for i, additionalStat in ipairs(statsPerLevel.AdditionalStats) do if additionalStat.Id == "base_reduce_enemy_lightning_resistance_%" then @@ -313,16 +299,32 @@ local function getStat(state, stat) end end -local directiveTable = {} +local directiveTable = { monsters = {}, skills = {} } --- #boss [] --- Initialises the boss -directiveTable.boss = function(state, args, out) - local displayName, monsterId, earlierUber = args:match("(%w+) (.+) (%w+)") +-- #boss [] [] +directiveTable.monsters.boss = function(state, args, out) + local displayName, monsterId, isUber = args:match("(%w+) (.+) {(%w+)}") if not displayName then - displayName = args - monsterId = args + displayName, monsterId = args:match("(%w+) (.+)") end + + local monsterType = dat("MonsterTypes"):GetRow("Id", monsterId) + if not monsterType then + print("Invalid Type: "..monsterId) + return + end + + out:write('bosses["', displayName, '"] = {\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 + +-- #boss [] [] +-- Initialises the boss +directiveTable.skills.boss = function(state, args, out) + local displayName, monsterId, earlierUber = args:match("(%w+) (.+) (%w+)") local bossData = dat("MonsterVarieties"):GetRow("Id", monsterId) state.boss = { displayName = displayName, damageRange = bossData.Type.DamageSpread, damageMult = bossData.DamageMultiplier, critChance = m_ceil(bossData.CriticalStrikeChance / 100) } if earlierUber == "true" then @@ -339,12 +341,17 @@ end -- #skill [] [] -- optional# -- Initialises and emits the skill data -directiveTable.skill = function(state, args, out) +directiveTable.skills.skill = function(state, args, out) local displayName, grantedId = args:match("(%w+) (%w+)") if not grantedId then displayName, grantedId = args end + if displayName == "MemoryGame" then + displayName = "Memory Game" + end local boss = state.boss + state.skillList = state.skillList or {} + table.insert(state.skillList, boss.displayName.." "..displayName) local skill = {} local skillData = dat("GrantedEffects"):GetRow("Id", grantedId) local GrantedEffectStatSets = dat("GrantedEffectStatSets"):GetRow("Id", grantedId) @@ -430,7 +437,7 @@ directiveTable.skill = function(state, args, out) end -- #tooltip - directiveTable.tooltip = function(state, args, out) + directiveTable.skills.tooltip = function(state, args, out) if args then out:write(',\n tooltip = ', args,'\n') end @@ -438,6 +445,20 @@ end state.skill = nil end -processTemplateFile("bossSkills", "", "../Data/", directiveTable) + -- #skillList + directiveTable.skills.skillList = function(state, args, out) + out:write('},{\n') + out:write(' { val = "None", label = "None" }') + for _, skillName in pairs(state.skillList) do + out:write(',\n { val = "', skillName, '", label = "', skillName, '" }') + end + out:write('\n}') + state.boss = nil + state.skillList = nil +end +processTemplateFile("BossSkills", "Enemies/", "../Data/", directiveTable.skills) print("Boss skill data exported.") +processTemplateFile("Bosses", "Enemies/", "../Data/", directiveTable.monsters) +print("Boss data exported.") + diff --git a/src/Export/Scripts/enemies.lua b/src/Export/Scripts/enemies.lua deleted file mode 100644 index fc4f9f19c8..0000000000 --- a/src/Export/Scripts/enemies.lua +++ /dev/null @@ -1,36 +0,0 @@ -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/ConfigOptions.lua b/src/Modules/ConfigOptions.lua index f47fcf818d..f0e01c1844 100644 --- a/src/Modules/ConfigOptions.lua +++ b/src/Modules/ConfigOptions.lua @@ -1454,31 +1454,8 @@ Huge sets the radius to 11. { var = "conditionEnemyRareOrUnique", type = "check", label = "Is the enemy Rare or Unique?", ifEnemyCond = "EnemyRareOrUnique", tooltip = "The enemy will automatically be considered to be Unique if they are a Boss,\nbut you can use this option to force it if necessary.", apply = function(val, modList, enemyModList) enemyModList:NewMod("Condition:RareOrUnique", "FLAG", true, "Config", { type = "Condition", var = "Effective" }) end }, - { var = "enemyIsBoss", type = "list", label = "Is the enemy a Boss?", defaultIndex = 1, tooltip = [[ -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 - ^794% of monster damage - -Guardian / Pinnacle Boss adds the following modifiers: - +50% to enemy Elemental Resistances - +30% to enemy ^xD02090Chaos Resistance - ^7188% of monster damage - 5% penetration - -Uber Pinnacle Boss adds the following modifiers: - +50% to enemy Elemental Resistances - +30% to enemy ^xD02090Chaos Resistance - ^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 + { var = "enemyIsBoss", type = "list", label = "Is the enemy a Boss?", defaultIndex = 1, tooltip = data.enemyIsBossTooltip, 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 placeholders get reset correctly build.configTab.varControls['enemySpeed']:SetPlaceholder(700, true) build.configTab.varControls['enemyCritChance']:SetPlaceholder(5, true) build.configTab.varControls['enemyCritDamage']:SetPlaceholder(30, true) @@ -1571,10 +1548,8 @@ Uber Pinnacle Boss adds the following modifiers: 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) + build.configTab.varControls['enemyArmour']:SetPlaceholder(round(data.monsterArmourTable[defaultLevel] * (data.bossStats.PinnacleArmourMean/100)), true) + build.configTab.varControls['enemyEvasion']:SetPlaceholder(round(data.monsterEvasionTable[defaultLevel] * (data.bossStats.PinnacleEvasionMean/100)), 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" }) @@ -1605,10 +1580,8 @@ Uber Pinnacle Boss adds the following modifiers: 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) + build.configTab.varControls['enemyArmour']:SetPlaceholder(round(data.monsterArmourTable[defaultLevel] * (data.bossStats.UberArmourMean/100)), true) + build.configTab.varControls['enemyEvasion']:SetPlaceholder(round(data.monsterEvasionTable[defaultLevel] * (data.bossStats.UberArmourMean/100)), 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) @@ -1651,7 +1624,7 @@ 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) + { var = "enemyEvasion", type = "count", label = "Enemy Base ^x33FF77Evasion:", 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) @@ -1712,6 +1685,11 @@ Uber Pinnacle Boss adds the following modifiers: end modList:NewMod("BossSkillActive", "FLAG", true, "Config") + + -- boss specific mods + if val == "Atziri Flameblast" and isUber then + enemyModList:NewMod("Damage", "INC", 60, "Alluring Abyss Map Mod") + end else build.configTab.varControls['enemyDamageType'].enabled = true end diff --git a/src/Modules/Data.lua b/src/Modules/Data.lua index 237fc8a177..f7e51b392a 100644 --- a/src/Modules/Data.lua +++ b/src/Modules/Data.lua @@ -8,6 +8,7 @@ LoadModule("Data/Global") local m_min = math.min local m_max = math.max +local m_floor = math.floor local t_insert = table.insert local t_concat = table.concat @@ -498,25 +499,66 @@ data.misc = { -- magic numbers PvpNonElemental2 = 90, } -data.bossSkills = LoadModule("Data/BossSkills") --- auto generation of skill list using boss skills above, is currently disabled because it messes with the order -data.bossSkillsList = { - { val = "None", label = "None" }, - { val = "Atziri Flameblast", label = "Atziri Flameblast" }, - { val = "Shaper Ball", label = "Shaper Ball" }, - { val = "Shaper Slam", label = "Shaper Slam" }, - --{ val = "Elder Slam", label = "Elder Slam" }, - { val = "Sirus Meteor", label = "Sirus Meteor" }, - { val = "Exarch Ball", label = "Exarch Ball" }, - { val = "Eater Beam", label = "Eater Beam" }, - { val = "Maven Fireball", label = "Maven Fireball" }, - { val = "Maven MemoryGame", label = "Maven Memory Game" } -} ---[[ -for bossSkillName, bossSkillData in pairs(data.bossSkills) do - t_insert(data.bossSkillsList, {val = bossSkillName, label = bossSkillName}) +-- Load bosses +do + data.bosses = { } + LoadModule("Data/Bosses", data.bosses) + + local count, uberCount = 0, 0 + local armourTotal, evasionTotal = 0, 0 + local uberArmourTotal, uberEvasionTotal = 0, 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 = 100 + armourTotal / count, + PinnacleEvasionMean = 100 + evasionTotal / count, + UberArmourMean = 100 + uberArmourTotal / uberCount, + UberEvasionMean = 100 + uberEvasionTotal / uberCount + } + + data.bossSkills, data.bossSkillsList = LoadModule("Data/BossSkills") + + data.enemyIsBossTooltip = [[Bosses' damage is monster damage scaled to an average damage of their attacks +This is divided by 4.40 to represent 4 damage types + some (40% as much) ^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 + ^7]]..tostring(m_floor(data.misc.stdBossDPSMult * 100))..[[% of monster Damage of each type + ]]..tostring(m_floor(data.misc.stdBossDPSMult * 4.4 * 100))..[[% of monster Damage total + +Guardian / Pinnacle Boss adds the following modifiers: + +50% to enemy Elemental Resistances + +30% to enemy ^xD02090Chaos Resistance + ^7]]..tostring(m_floor(data.bossStats.PinnacleArmourMean))..[[% of monster Armour + ]]..tostring(m_floor(data.bossStats.PinnacleEvasionMean))..[[% of monster ^x33FF77Evasion + ^7]]..tostring(m_floor(data.misc.pinnacleBossDPSMult * 100))..[[% of monster Damage of each type + ]]..tostring(m_floor(data.misc.pinnacleBossDPSMult * 4.4 * 100))..[[% of monster Damage total + ]]..tostring(data.misc.pinnacleBossPen)..[[% penetration + +Uber Pinnacle Boss adds the following modifiers: + +50% to enemy Elemental Resistances + +30% to enemy ^xD02090Chaos Resistance + ^7]]..tostring(m_floor(data.bossStats.UberArmourMean))..[[% of monster Armour + ]]..tostring(m_floor(data.bossStats.UberEvasionMean))..[[% of monster ^x33FF77Evasion + ^770% less to enemy Damage taken + ]]..tostring(m_floor(data.misc.uberBossDPSMult * 100))..[[% of monster Damage of each type + ]]..tostring(m_floor(data.misc.uberBossDPSMult * 4.25 * 100))..[[% of monster Damage total + ]]..tostring(data.misc.uberBossPen)..[[% penetration]] end ---]] -- Misc data tables LoadModule("Data/Misc", data) @@ -596,7 +638,6 @@ for size, jewel in pairs(data.clusterJewels.jewels) do end -- Load legion jewel data - local function loadJewelFile(jewelTypeName) jewelTypeName = "/Data/TimelessJewelData/" .. jewelTypeName local jewelData @@ -988,37 +1029,6 @@ 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