Module:Mazunki/Dungeons: Difference between revisions

Use game data for list of ITM afflicted monsters
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. DR!!Reward(s)!!Boss Pet'
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.getDungeonTotalHP(dung)
result = result..'||'..p._getDungeonTotalHP(dung, true) -- accountForEnemyDR = true
result = result..'||'..p.getDungeonMinDR(dung)
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 = { melee = 0, ranged = 0, magic = 0 }
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
local maxHit = Monsters._getMonsterMaxHit(monster, true) -- doStuns = true
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 maxHitsPerStyle
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, mode))
styleDR = math.ceil(styleDR / Constants.getTriangleDRModifier(playerStyle, enemyStyle, _mode))
maxStyleDR = math.max(maxStyleDR, styleDR)
maxStyleDR = math.max(maxStyleDR, styleDR)
end
end
end
end
minDR = math.min(minDR, maxStyleDR)
return maxStyleDR
return minDR
end
end


Line 72: Line 105:
local MaxVisibleDR = 85
local MaxVisibleDR = 85
local autoEatTreshhold = math.floor(maxHP * autoEatTresholdPercentage)
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 = { melee = 0, ranged = 0, magic = 0 }
local reductionRequiredPerPlayerStyle = { Melee = 0, Ranged = 0, Magic = 0 }
for playerStyle, dr in ipairs(reductionRequiredPerPlayerStyle) do
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("Spider Forest")
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, autoEatTreshold)
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
if disableAgilityObstacles ~= nil then
AutoEatVals = {T1 = 0.2, T2 = 0.3, T3 = 0.4}
end


--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