12,790
edits
mNo edit summary |
(Use game data for list of ITM afflicted monsters) |
||
(17 intermediate revisions by one other user not shown) | |||
Line 14: | Line 14: | ||
local result = '{| class="wikitable sortable stickyHeader"' | local result = '{| class="wikitable sortable stickyHeader"' | ||
result = result..'\r\n|-class="headerRow-0"' | result = result..'\r\n|-class="headerRow-0"' | ||
result = result..'\r\n!Icon!!Dungeon!!Monsters!!Boss Level!!Total HP!!Min | result = result..'\r\n!Icon!!Dungeon!!Monsters!!Boss Level!!Total HP!!Min DR (melee)!!Min DR (ranged)!!Min DR (magic)!!Reward(s)!!Boss Pet' | ||
for i, dungIdx in ipairs(AreaData.displayOrder.dungeons) do | for i, dungIdx in ipairs(AreaData.displayOrder.dungeons) do | ||
Line 25: | Line 25: | ||
local boss = Monsters.getMonsterByID(dung.monsters[Shared.tableCount(dung.monsters)]) | local boss = Monsters.getMonsterByID(dung.monsters[Shared.tableCount(dung.monsters)]) | ||
result = result..'||'..Monsters._getMonsterCombatLevel(boss) | result = result..'||'..Monsters._getMonsterCombatLevel(boss) | ||
result = result..'||'..p. | result = result..'||'..p._getDungeonTotalHP(dung, true) -- accountForEnemyDR = true | ||
result = result..'||'.. | |||
local minDR = p._getDungeonMinDR(dung, 1000, 0.4) | |||
result = result..'||'..minDR["Melee"].."%" | |||
result = result..'||'..minDR["Ranged"].."%" | |||
result = result..'||'..minDR["Magic"].."%" | |||
result = result..'||'..pm._getDungeonRewards(dung, false) | result = result..'||'..pm._getDungeonRewards(dung, false) | ||
Line 42: | Line 46: | ||
function p._getMaxHitPerMonsterStyle(dung) | function p._getMaxHitPerMonsterStyle(dung) | ||
local maxHitsPerMonsterStyle = { | local maxHitsPerMonsterStyle = { Melee = 0, Ranged = 0, Magic = 0 } | ||
for i, monsterID in Shared.skpairs(dung.monsters) do | for i, monsterID in Shared.skpairs(dung.monsters) do | ||
local monster = Monsters.getMonsterByID(monsterID) | local monster = Monsters.getMonsterByID(monsterID) | ||
local styleName = monster.attackType | if monster == nil and monsterID == -1 then | ||
for _, id in Shared.skpairs(AreaData.itm.monsters) do | |||
if maxHit > maxHitsPerMonsterStyle[styleName] then | local monster = Monsters.getMonsterByID(id) | ||
maxHitsPerMonsterStyle[styleName] = maxHit | local styleName = Constants.getCombatStyleName(monster.attackType) | ||
local maxHit = Monsters._getMonsterMaxHit(monster, true) -- doStuns = true | |||
if styleName == "Random" then | |||
for randomStyle, value in Shared.skpairs(maxHitsPerMonsterStyle) do | |||
if maxHit > value then | |||
maxHitsPerMonsterStyle[randomStyle] = maxHit | |||
end | |||
end | |||
else | |||
if maxHit > maxHitsPerMonsterStyle[styleName] then | |||
maxHitsPerMonsterStyle[styleName] = maxHit | |||
end | |||
end | |||
end | |||
else | |||
local styleName = Constants.getCombatStyleName(monster.attackType) | |||
local maxHit = Monsters._getMonsterMaxHit(monster, true) -- doStuns = true | |||
if styleName == "Random" then | |||
for randomStyle, value in Shared.skpairs(maxHitsPerMonsterStyle) do | |||
if maxHit > value then | |||
maxHitsPerMonsterStyle[randomStyle] = maxHit | |||
end | |||
end | |||
else | |||
if maxHit > maxHitsPerMonsterStyle[styleName] then | |||
maxHitsPerMonsterStyle[styleName] = maxHit | |||
end | |||
end | |||
end | end | ||
end | end | ||
return | return maxHitsPerMonsterStyle | ||
end | end | ||
function p._getDRRequiredPerPlayerStyle(dung, playerStyle, autoEatTreshold, enemyMaxHitsPerStyle) | function p._getDRRequiredPerPlayerStyle(dung, playerStyle, autoEatTreshold, enemyMaxHitsPerStyle, mode) | ||
local _mode = mode or "Hardcore" -- default to hardcore if mode is nil | |||
maxStyleDR = 0 | |||
for enemyStyle, styleHit in Shared.skpairs(enemyMaxHitsPerStyle) do | for enemyStyle, styleHit in Shared.skpairs(enemyMaxHitsPerStyle) do | ||
if styleHit > 0 and styleHit > autoEatTreshold then | if styleHit > 0 and styleHit > autoEatTreshold then | ||
local styleDR = math.ceil((1 - (autoEatTreshold / styleHit)) * 100) | local styleDR = math.ceil((1 - (autoEatTreshold / styleHit)) * 100) | ||
styleDR = math.ceil(styleDR / Constants.getTriangleDRModifier(playerStyle, enemyStyle, | styleDR = math.ceil(styleDR / Constants.getTriangleDRModifier(playerStyle, enemyStyle, _mode)) | ||
maxStyleDR = math.max(maxStyleDR, styleDR) | maxStyleDR = math.max(maxStyleDR, styleDR) | ||
end | end | ||
end | end | ||
return maxStyleDR | |||
end | end | ||
Line 72: | Line 105: | ||
local MaxVisibleDR = 85 | local MaxVisibleDR = 85 | ||
local | local autoEatTreshold = math.floor(maxHP * autoEatTresholdPercentage) | ||
local enemyMaxHitsPerStyle = p._getMaxHitPerMonsterStyle(dung) | local enemyMaxHitsPerStyle = p._getMaxHitPerMonsterStyle(dung) | ||
mw.logObject(enemyMaxHitsPerStyle) | -- mw.logObject(enemyMaxHitsPerStyle) | ||
-- mw.log("ae: "..autoEatTreshold) | |||
local reductionRequiredPerPlayerStyle = { | local reductionRequiredPerPlayerStyle = { Melee = 0, Ranged = 0, Magic = 0 } | ||
for playerStyle, dr in | for playerStyle, dr in pairs(reductionRequiredPerPlayerStyle) do | ||
reductionRequiredPerPlayerStyle[playerStyle] = p._getDRRequiredPerPlayerStyle(dung, playerStyle, autoEatTreshold, enemyMaxHitsPerStyle) | reductionRequiredPerPlayerStyle[playerStyle] = p._getDRRequiredPerPlayerStyle(dung, playerStyle, autoEatTreshold, enemyMaxHitsPerStyle) | ||
end | end | ||
Line 86: | Line 120: | ||
function p._testing() | function p._testing() | ||
local dung = CombatAreas.getArea(" | local dung = CombatAreas.getArea("Into the Mist") | ||
local maxHp = 1120 | local maxHp = 1120 | ||
local ae = 0.4 | local ae = 0.4 | ||
--return p._getDungeonTotalHP(dung, true) | |||
return p._getDungeonMinDR(dung, maxHp, ae) | return p._getDungeonMinDR(dung, maxHp, ae) | ||
end | end | ||
function p._getDungeonDrTable(dung, gamemode, maxHP | function p._getDungeonDrTable(dung, gamemode, maxHP) | ||
local AutoEatVals = {T1 = 0.2, T2 = 0.3, T3 = 0.4, T3W = 0.45} | local AutoEatVals = { T1 = 0.2, T2 = 0.3, T3 = 0.4, T3W = 0.45 } -- W = wasteful ring | ||
--Finally, build the table using those starting points | --Finally, build the table using those starting points | ||
Line 109: | Line 141: | ||
result = result..'\r\n!DR %!!'..StyleHeader | result = result..'\r\n!DR %!!'..StyleHeader | ||
for tier, aevalue in Shared.skpairs(AutoEatValues) do | |||
--mw.log(aevalue) | |||
end | |||
result = result..'\r\n|}' | result = result..'\r\n|}' | ||
Line 116: | Line 150: | ||
end | end | ||
function p._getDungeonTotalHP(dung) | function p._getStrongestAfflicted() | ||
return | local maxHitsPerMonsterStyle = { Melee = 0, Ranged = 0, Magic = 0 } | ||
for _, id in Shared.skpairs(AreaData.itm.monsters) do | |||
local monster = Monsters.getMonsterByID(id) | |||
local styleName = Constants.getCombatStyleName(monster.attackType) | |||
local maxHit = Monsters._getMonsterMaxHit(monster, true) -- doStuns = true | |||
if styleName == "Random" then | |||
for randomStyle, value in Shared.skpairs(maxHitsPerMonsterStyle) do | |||
if maxHit > value then | |||
maxHitsPerMonsterStyle[randomStyle] = maxHit | |||
end | |||
end | |||
else | |||
if maxHit > maxHitsPerMonsterStyle[styleName] then | |||
maxHitsPerMonsterStyle[styleName] = maxHit | |||
end | |||
end | |||
end | |||
return maxHitsPerMonsterStyle | |||
end | |||
function p._getAfflictedAverageHP() | |||
local totalHp = 0 | |||
local afflicted = AreaData.itm.monsters | |||
for _, id in Shared.skpairs(afflicted) do | |||
local monster = Monsters.getMonsterByID(id) | |||
totalHp = totalHp + Monsters._getMonsterHP(monster) | |||
end | |||
return math.ceil(totalHp / Shared.tableCount(afflicted)) | |||
end | |||
function p._getDungeonTotalHP(dung, accountForEnemyDR) | |||
local calculateDr = accountForEnemyDR or false | |||
local totalHp = 0 | |||
for i, monsterID in Shared.skpairs(dung.monsters) do | |||
local dr = 0 | |||
local monsterHp = 0 | |||
local monster = Monsters.getMonsterByID(monsterID) | |||
if monster == nil and monsterID == -1 then | |||
monsterHp = p._getAfflictedAverageHP() | |||
dr = 0.2 -- afflicted always have +20% dr | |||
else | |||
monsterHp = Monsters._getMonsterHP(monster) | |||
dr = 0 | |||
end | |||
if calculateDR then | |||
for i, eq in Shared.skpairs(monster.equipmentStats) do | |||
if eq.key == "damageReduction" then | |||
dr = dr + eq.value/100 | |||
end | |||
end | |||
else | |||
dr = 0 | |||
end | |||
local monsterPostReductionHP = math.floor(monsterHp / (1-dr)) | |||
totalHp = totalHp + monsterPostReductionHP | |||
end | |||
return totalHp | |||
end | end | ||
return p | return p |