Module:Mazunki/Dungeons: Difference between revisions
From Melvor Idle
mNo edit summary |
mNo edit summary |
||
Line 42: | Line 42: | ||
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 = | local styleName = monster.attackType | ||
local maxHit = Monsters._getMonsterMaxHit(monster, true) -- doStuns = true | local maxHit = Monsters._getMonsterMaxHit(monster, true) -- doStuns = true | ||
if maxHit > maxHitsPerMonsterStyle[styleName] then | if maxHit > maxHitsPerMonsterStyle[styleName] then | ||
Line 54: | Line 54: | ||
end | end | ||
function p._getDRRequiredPerPlayerStyle(dung, playerStyle, autoEatTreshold) | function p._getDRRequiredPerPlayerStyle(dung, playerStyle, autoEatTreshold, enemyMaxHitsPerStyle) | ||
for enemyStyle, styleHit in Shared.skpairs( | 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) | ||
Line 63: | Line 63: | ||
end | end | ||
minDR = math.min(minDR, maxStyleDR) | minDR = math.min(minDR, maxStyleDR) | ||
return minDR | |||
end | end | ||
Line 71: | Line 72: | ||
local MaxVisibleDR = 85 | local MaxVisibleDR = 85 | ||
local autoEatTreshhold = math.floor( | local autoEatTreshhold = math.floor(maxHP * autoEatTresholdPercentage) | ||
local enemyMaxHitsPerStyle = p._getMaxHitPerMonsterStyle(dung) | |||
mw.logObject(enemyMaxHitsPerStyle) | |||
local reductionRequiredPerPlayerStyle = { | local reductionRequiredPerPlayerStyle = { melee = 0, ranged = 0, magic = 0 } | ||
for playerStyle, dr in | |||
reductionRequiredPerPlayerStyle[playerStyle] = p._getDRRequiredPerPlayerStyle(dung, playerStyle, autoEatTreshold) | for playerStyle, dr in ipairs(reductionRequiredPerPlayerStyle) do | ||
reductionRequiredPerPlayerStyle[playerStyle] = p._getDRRequiredPerPlayerStyle(dung, playerStyle, autoEatTreshold, enemyMaxHitsPerStyle) | |||
end | end | ||
return reductionRequiredPerPlayerStyle | |||
end | |||
function p._testing() | |||
local dung = CombatAreas.getArea("Spider Forest") | |||
local maxHp = 1120 | |||
local ae = 0.4 | |||
return p._getDungeonMinDR(dung, maxHp, ae) | |||
end | end | ||
Line 83: | Line 97: | ||
if disableAgilityObstacles ~= nil then | if disableAgilityObstacles ~= nil then | ||
AutoEatVals = {T1 = 0.2, T2 = 0.3, T3 = 0.4} | AutoEatVals = {T1 = 0.2, T2 = 0.3, T3 = 0.4} | ||
end | end | ||
Line 101: | Line 109: | ||
result = result..'\r\n!DR %!!'..StyleHeader | result = result..'\r\n!DR %!!'..StyleHeader | ||
result = result..'\r\n|}' | result = result..'\r\n|}' | ||
Line 118: | Line 120: | ||
end | end | ||
return | return p |
Revision as of 16:10, 13 April 2022
Documentation for this module may be created at Module:Mazunki/Dungeons/doc
local pm = require("Module:CombatAreas/AreaTables")
local p = {}
local AreaData = mw.loadData('Module:CombatAreas/data')
local Constants = require('Module:Constants')
local Shared = require('Module:Shared')
local Icons = require('Module:Icons')
local Items = require('Module:Items')
local Monsters = require('Module:Monsters')
local CombatAreas = require('Module:CombatAreas')
local Pets = require('Module:Pets')
function p.getDungeonTable(frame)
local result = '{| class="wikitable sortable stickyHeader"'
result = result..'\r\n|-class="headerRow-0"'
result = result..'\r\n!Icon!!Dungeon!!Monsters!!Boss Level!!Total HP!!Min. DR!!Reward(s)!!Boss Pet'
for i, dungIdx in ipairs(AreaData.displayOrder.dungeons) do
local dung = CombatAreas.getAreaByID('dungeon', dungIdx)
result = result..'\r\n|-'
result = result..'\r\n|data-sort-value="'..dung.name..'"|'..Icons.Icon({dung.name, type='dungeon', size='50', notext=true})
result = result..'||'..Icons.Icon({dung.name, type='dungeon', noicon=true})
result = result..'||'..Shared.tableCount(dung.monsters)
local boss = Monsters.getMonsterByID(dung.monsters[Shared.tableCount(dung.monsters)])
result = result..'||'..Monsters._getMonsterCombatLevel(boss)
result = result..'||'..p.getDungeonTotalHP(dung)
result = result..'||'..p.getDungeonMinDR(dung)
result = result..'||'..pm._getDungeonRewards(dung, false)
if dung.petID ~= nil then
local pet = Pets.getPetByID(dung.petID)
result = result..'||data-sort-value="'..pet.name..'"|'..Icons.Icon({pet.name, type='pet'})
else
result = result..'|| '
end
end
result = result..'\r\n|}'
return result
end
function p._getMaxHitPerMonsterStyle(dung)
local maxHitsPerMonsterStyle = { melee = 0, ranged = 0, magic = 0 }
for i, monsterID in Shared.skpairs(dung.monsters) do
local monster = Monsters.getMonsterByID(monsterID)
local styleName = monster.attackType
local maxHit = Monsters._getMonsterMaxHit(monster, true) -- doStuns = true
if maxHit > maxHitsPerMonsterStyle[styleName] then
maxHitsPerMonsterStyle[styleName] = maxHit
end
end
return maxHitsPerStyle
end
function p._getDRRequiredPerPlayerStyle(dung, playerStyle, autoEatTreshold, enemyMaxHitsPerStyle)
for enemyStyle, styleHit in Shared.skpairs(enemyMaxHitsPerStyle) do
if styleHit > 0 and styleHit > autoEatTreshold then
local styleDR = math.ceil((1 - (autoEatTreshold / styleHit)) * 100)
styleDR = math.ceil(styleDR / Constants.getTriangleDRModifier(playerStyle, enemyStyle, mode))
maxStyleDR = math.max(maxStyleDR, styleDR)
end
end
minDR = math.min(minDR, maxStyleDR)
return minDR
end
function p._getDungeonMinDR(dung, maxHP, autoEatTresholdPercentage)
--This is the highest DR to list as possible. Value might be slightly off right now, currently just setting up value for testing
local MaxViableDR = 81
--This is the highest DR row shown. This should be higher than MaxViableDR
local MaxVisibleDR = 85
local autoEatTreshhold = math.floor(maxHP * autoEatTresholdPercentage)
local enemyMaxHitsPerStyle = p._getMaxHitPerMonsterStyle(dung)
mw.logObject(enemyMaxHitsPerStyle)
local reductionRequiredPerPlayerStyle = { melee = 0, ranged = 0, magic = 0 }
for playerStyle, dr in ipairs(reductionRequiredPerPlayerStyle) do
reductionRequiredPerPlayerStyle[playerStyle] = p._getDRRequiredPerPlayerStyle(dung, playerStyle, autoEatTreshold, enemyMaxHitsPerStyle)
end
return reductionRequiredPerPlayerStyle
end
function p._testing()
local dung = CombatAreas.getArea("Spider Forest")
local maxHp = 1120
local ae = 0.4
return p._getDungeonMinDR(dung, maxHp, ae)
end
function p._getDungeonDrTable(dung, gamemode, maxHP, autoEatTreshold)
local AutoEatVals = {T1 = 0.2, T2 = 0.3, T3 = 0.4, T3W = 0.45}
if disableAgilityObstacles ~= nil then
AutoEatVals = {T1 = 0.2, T2 = 0.3, T3 = 0.4}
end
--Finally, build the table using those starting points
local StyleHeader = "Melee!!Ranged!!Magic"
StyleHeader = StyleHeader..'!!'..StyleHeader..'!!'..StyleHeader..'!!'..StyleHeader
local result = '{| class="wikitable stickyHeader"'
result = result..'\r\n|-class="headerRow-0"'
result = result..'\r\n!Pre-Triangle DR!!colspan=3|AE T3 + Wasteful!!colspan=3|Auto Eat Tier 3!!colspan=3|Auto Eat Tier 2!!colspan=3|Auto Eat Tier 1'
result = result..'\r\n|-class="headerRow-0"'
result = result..'\r\n!DR %!!'..StyleHeader
result = result..'\r\n|}'
return result
end
function p._getDungeonTotalHP(dung)
return
end
return p