12,817
edits
(getChestDrops: Extend to include healing value for containers whose contents are entirely food) |
(getSpecAttackMaxHit: Resolve issue with aggregation of damage from multiple special attack damage sources) |
||
(6 intermediate revisions by 4 users not shown) | |||
Line 138: | Line 138: | ||
if monster ~= nil then | if monster ~= nil then | ||
return math.floor((p._getMonsterHP(monster)/(1 - p._getMonsterStat(monster, 'damageReduction')/100)) + 0.5) | return math.floor((p._getMonsterHP(monster)/(1 - p._getMonsterStat(monster, 'damageReduction')/100)) + 0.5) | ||
else | |||
return Shared.printError('No monster with that name found') | |||
end | |||
end | |||
function p.getMonsterEffectiveBarrier(frame) | |||
local MonsterName = frame.args ~= nil and frame.args[1] or frame | |||
local monster = p.getMonster(MonsterName) | |||
if monster ~= nil then | |||
return math.floor((p._getMonsterBarrier(monster)/(1 - p._getMonsterStat(monster, 'damageReduction')/100)) + 0.5) | |||
else | else | ||
return Shared.printError('No monster with that name found') | return Shared.printError('No monster with that name found') | ||
Line 379: | Line 389: | ||
function p.getSpecAttackMaxHit(specAttack, normalMaxHit, monster) | function p.getSpecAttackMaxHit(specAttack, normalMaxHit, monster) | ||
local bestHit = 0 | local bestHit, prevHit = 0, 0 | ||
for i, dmg in | for i, dmg in ipairs(specAttack.damage) do | ||
local thisHit = 0 | local thisHit = 0 | ||
if dmg.damageType == 'Normal' then | if dmg.damageType == 'Normal' then | ||
Line 414: | Line 424: | ||
-- TODO: This is limited in that there is no verification that bleed/poison | -- TODO: This is limited in that there is no verification that bleed/poison | ||
-- can be applied to the target, it is assumed that it can and so this applies | -- can be applied to the target, it is assumed that it can and so this applies | ||
thisHit = | thisHit = prevHit + dmg.maxPercent * 10 | ||
end | end | ||
prevHit = thisHit | |||
if thisHit > bestHit then | if thisHit > bestHit then | ||
bestHit = thisHit | bestHit = thisHit | ||
Line 950: | Line 961: | ||
local bones = p._getMonsterBones(monster) | local bones = p._getMonsterBones(monster) | ||
local boneVal = 0 | local boneVal = 0 | ||
local barrierDust = Items.getItemByID("melvorAoD:Barrier_Dust") | |||
local dustVal = 0 | |||
--Show the bones only if either the monster shows up outside of dungeons _or_ the monster drops shards | --Show the bones only if either the monster shows up outside of dungeons _or_ the monster drops shards | ||
if bones ~= nil then | if bones ~= nil then | ||
local boneQty = (bones.quantity ~= nil and bones.quantity or 1) | local boneQty = (bones.quantity ~= nil and bones.quantity or 1) | ||
local barrier = p._getMonsterBarrier(monster) | |||
result = result.."'''Always Drops:'''" | result = result.."'''Always Drops:'''" | ||
result = result..'\r\n{|class="wikitable" id="bonedrops"' | result = result..'\r\n{|class="wikitable" id="bonedrops"' | ||
result = result..'\r\n!Item !! Qty' | result = result..'\r\n!Item !! Qty' | ||
result = result..'\r\n|-\r\n|'..Icons.Icon({bones.item.name, type='item'}) | result = result..'\r\n|-\r\n|'..Icons.Icon({bones.item.name, type='item'}) | ||
result = result..'||'..boneQty..'\r\n'..'|}' | result = result..'||'..boneQty | ||
if barrier > 0 then | |||
local dustQty = math.max(math.floor(barrier / 10 / 20), 1) | |||
result = result..'\r\n|-\r\n|'..Icons.Icon({barrierDust.name, type='item'}) | |||
result = result..'||'..dustQty | |||
dustVal = dustQty * barrierDust.sellsFor | |||
end | |||
result = result..'\r\n'..'|}' | |||
boneVal = boneQty * bones.item.sellsFor | boneVal = boneQty * bones.item.sellsFor | ||
end | end | ||
Line 1,059: | Line 1,080: | ||
result = result..' and bones' | result = result..' and bones' | ||
end | end | ||
result = result..', the average kill is worth '..Icons.GP(Shared.round(avgGp + lootValue + boneVal, 2, 0))..'.' | if dustVal > 0 then | ||
result = result..' and barrier dust' | |||
end | |||
result = result..', the average kill is worth '..Icons.GP(Shared.round(avgGp + lootValue + boneVal + dustVal, 2, 0))..'.' | |||
end | end | ||
end | end | ||
Line 1,197: | Line 1,221: | ||
result = result..'\r\n{|class="wikitable sortable"' | result = result..'\r\n{|class="wikitable sortable"' | ||
result = result..'\r\n!Item!!Qty' | result = result..'\r\n!Item!!Qty' | ||
result = result..'!!colspan="2"|Chance!!Price' .. (isAllFood and '!!Healing' or '') | result = result..'!!colspan="2"|Chance!!Price' .. (isAllFood and '!!Healing!!Avg. Healing' or '') | ||
--Sort the loot table by weight in descending order | --Sort the loot table by weight in descending order | ||
Line 1,224: | Line 1,248: | ||
local hp = thisItem.healsFor * 10 | local hp = thisItem.healsFor * 10 | ||
local minHeal, maxHeal = hp * row.minQuantity, hp * row.maxQuantity | local minHeal, maxHeal = hp * row.minQuantity, hp * row.maxQuantity | ||
local avgHpPerLoot = (dropChance * 0.01 * (minHeal + maxHeal) / 2) | |||
foodValue = foodValue + avgHpPerLoot | |||
result = result .. '||data-sort-value="' .. thisItem.healsFor .. '"' | result = result .. '||data-sort-value="' .. thisItem.healsFor .. '"' | ||
result = result .. '|' .. Icons.Icon({'Hitpoints', type='skill', notext=true, nolink=true}) .. ' ' .. formatNumRange(minHeal, maxHeal) | result = result .. '|' .. Icons.Icon({'Hitpoints', type='skill', notext=true, nolink=true}) .. ' ' .. formatNumRange(minHeal, maxHeal) | ||
result = result .. '||data-sort-value="' .. avgHpPerLoot .. '"' | |||
result = result .. '|' .. Icons.Icon({'Hitpoints', type='skill', notext=true, nolink=true}) .. ' ' .. Shared.round(avgHpPerLoot, 2, 0) | |||
end | end | ||
end | end | ||
Line 1,232: | Line 1,259: | ||
result = result..'\r\nThe average value of the contents of one chest is '..Icons.GP(Shared.round(lootValue, 2, 0))..'.' | result = result..'\r\nThe average value of the contents of one chest is '..Icons.GP(Shared.round(lootValue, 2, 0))..'.' | ||
if isAllFood then | if isAllFood then | ||
result = result..'\r\nThe average healing of the contents of one chest is ' .. Icons.Icon({'Hitpoints', type='skill', notext=true, nolink=true}) .. ' ' .. Shared.round(foodValue, 2, 0) .. '.' | result = result..'\r\n\r\nThe average healing of the contents of one chest is ' .. Icons.Icon({'Hitpoints', type='skill', notext=true, nolink=true}) .. ' ' .. Shared.round(foodValue, 2, 0) .. '.' | ||
end | end | ||
end | end |