Anonymous

Module:Monsters: Difference between revisions

From Melvor Idle
m
getChestDrops: Added punctuation
(_getMonsterTable: Optimise by using table.concat() instead of repeated string concatenation)
m (getChestDrops: Added punctuation)
(5 intermediate revisions by one other user not shown)
Line 1: Line 1:
local p = {}
local p = {}


local Constants = mw.loadData('Module:Constants/data')
local MonsterData = mw.loadData('Module:Monsters/data')
local MonsterData = mw.loadData('Module:Monsters/data')


local Constants = require('Module:Constants')
local Areas = require('Module:CombatAreas')
local Areas = require('Module:CombatAreas')
local Magic = require('Module:Magic')
local Magic = require('Module:Magic')
Line 103: Line 103:


   local iconText = ''
   local iconText = ''
   if  monster.attackType == Constants.attackType.Melee then
   if  Constants.getCombatStyleName(monster.attackType) == 'Melee' then
     iconText = Icons.Icon({'Melee', notext=notext, nolink=nolink})
     iconText = Icons.Icon({'Melee', notext=notext, nolink=nolink})
   elseif monster.attackType == Constants.attackType.Ranged then
   elseif Constants.getCombatStyleName(monster.attackType) == 'Ranged' then
     iconText = Icons.Icon({'Ranged', type='skill', notext=notext, nolink=nolink})
     iconText = Icons.Icon({'Ranged', type='skill', notext=notext, nolink=nolink})
   else
   elseif Constants.getCombatStyleName(monster.attackType) == 'Magic' then
     iconText = Icons.Icon({'Magic', type='skill', notext=notext, nolink=nolink})
     iconText = Icons.Icon({'Magic', type='skill', notext=notext, nolink=nolink})
   end
   end
Line 183: Line 183:
   local effAttLvl = 0
   local effAttLvl = 0
   local attBonus = 0
   local attBonus = 0
   if monster.attackType == Constants.attackType.Melee then
   if Constants.getCombatStyleName(monster.attackType) == 'Melee' then
     effAttLvl = monster.attackLevel + 9
     effAttLvl = monster.attackLevel + 9
     attBonus = monster.attackBonus + 64
     attBonus = monster.attackBonus + 64
   elseif monster.attackType == Constants.attackType.Ranged then
   elseif Constants.getCombatStyleName(monster.attackType) == 'Ranged' then
     effAttLvl = monster.rangedLevel + 9
     effAttLvl = monster.rangedLevel + 9
     attBonus = monster.attackBonusRanged + 64
     attBonus = monster.attackBonusRanged + 64
   elseif monster.attackType == Constants.attackType.Magic then
   elseif Constants.getCombatStyleName(monster.attackType) == 'Magic' then
     effAttLvl = monster.magicLevel + 9
     effAttLvl = monster.magicLevel + 9
     attBonus = monster.attackBonusMagic + 64
     attBonus = monster.attackBonusMagic + 64
Line 300: Line 300:
   local specialMaxHit = 0
   local specialMaxHit = 0
   local normalMaxHit = p._getMonsterBaseMaxHit(monster)
   local normalMaxHit = p._getMonsterBaseMaxHit(monster)
  local hasActiveBuffSpec = false
   if monster.hasSpecialAttack then
   if monster.hasSpecialAttack then
     for i, specID in pairs(monster.specialAttackID) do
     for i, specID in pairs(monster.specialAttackID) do
Line 321: Line 322:
       end
       end
       if thisMax > specialMaxHit then specialMaxHit = thisMax end
       if thisMax > specialMaxHit then specialMaxHit = thisMax end
      if specAttack.activeBuffs then hasActiveBuffSpec = true end
     end
     end
   end
   end
   --Ensure that if the monster never does a normal attack, the normal max hit is irrelevant
   --Ensure that if the monster never does a normal attack, the normal max hit is irrelevant
   if normalChance == 0 then normalMaxHit = 0 end
   if normalChance == 0 and not hasActiveBuffSpec then normalMaxHit = 0 end
   return math.max(specialMaxHit, normalMaxHit)
   return math.max(specialMaxHit, normalMaxHit)
end
end
Line 342: Line 344:
   local effStrLvl = 0
   local effStrLvl = 0
   local strBonus = 0
   local strBonus = 0
   if monster.attackType == Constants.attackType.Melee then
   if Constants.getCombatStyleName(monster.attackType) == 'Melee' then
     effStrLvl = monster.strengthLevel + 9
     effStrLvl = monster.strengthLevel + 9
     strBonus = monster.strengthBonus
     strBonus = monster.strengthBonus
   elseif monster.attackType == Constants.attackType.Ranged then
   elseif Constants.getCombatStyleName(monster.attackType) == 'Ranged' then
     effStrLvl = monster.rangedLevel + 9
     effStrLvl = monster.rangedLevel + 9
     strBonus = monster.strengthBonusRanged
     strBonus = monster.strengthBonusRanged
   elseif monster.attackType == Constants.attackType.Magic then
   elseif Constants.getCombatStyleName(monster.attackType) == 'Magic' then
     local mSpell = nil
     local mSpell = nil
     if monster.selectedSpell ~= nil then mSpell = Magic.getSpellByID('Spells', monster.selectedSpell) end
     if monster.selectedSpell ~= nil then mSpell = Magic.getSpellByID('Spells', monster.selectedSpell) end
Line 357: Line 359:
     end
     end
   else
   else
    error('blah')
     return "ERROR: This monster has an invalid attack type somehow[[Category:Pages with script errors]]"
     return "ERROR: This monster has an invalid attack type somehow[[Category:Pages with script errors]]"
   end
   end
Line 387: Line 390:
   local iconText = ''
   local iconText = ''
   local typeText = ''
   local typeText = ''
   if  monster.attackType == Constants.attackType.Melee then
   if  Constants.getCombatStyleName(monster.attackType) == 'Melee' then
     iconText = Icons.Icon({'Melee', notext=true})
     iconText = Icons.Icon({'Melee', notext=true})
     typeText = 'Melee'
     typeText = 'Melee'
   elseif monster.attackType == Constants.attackType.Ranged then
   elseif Constants.getCombatStyleName(monster.attackType) == 'Ranged' then
     iconText = Icons.Icon({'Ranged', type='skill', notext=true})
     iconText = Icons.Icon({'Ranged', type='skill', notext=true})
     typeText = 'Ranged'
     typeText = 'Ranged'
   else
   elseif Constants.getCombatStyleName(monster.attackType) == 'Magic' then
     iconText = Icons.Icon({'Magic', type='skill', notext=true})
     iconText = Icons.Icon({'Magic', type='skill', notext=true})
     typeText = 'Magic'
     typeText = 'Magic'
Line 456: Line 459:
   local result = '[[Category:Monsters]]'
   local result = '[[Category:Monsters]]'


   if monster.attackType == Constants.attackType.Melee then
   if Constants.getCombatStyleName(monster.attackType) == 'Melee' then
     result = result..'[[Category:Melee Monsters]]'
     result = result..'[[Category:Melee Monsters]]'
   elseif monster.attackType == Constants.attackType.Ranged then
   elseif Constants.getCombatStyleName(monster.attackType) == 'Ranged' then
     result = result..'[[Category:Ranged Monsters]]'
     result = result..'[[Category:Ranged Monsters]]'
   elseif monster.attackType == Constants.attackType.Magic then
   elseif Constants.getCombatStyleName(monster.attackType) == 'Magic' then
     result = result..'[[Category:Magic Monsters]]'
     result = result..'[[Category:Magic Monsters]]'
   end
   end
Line 500: Line 503:


   result = result.."\r\n|-\r\n|'''Monster Types:''' "..table.concat(monsterTypes, ", ")
   result = result.."\r\n|-\r\n|'''Monster Types:''' "..table.concat(monsterTypes, ", ")
  local SlayerTier = 'N/A'
  if not p._isDungeonOnlyMonster(monster) then
    SlayerTier = Constants.getSlayerTierNameByLevel(p._getMonsterCombatLevel(monster))
  end
  result = result.."\r\n|-\r\n|'''"..Icons.Icon({'Slayer', type='skill'}).." [[Slayer#Slayer Tier Monsters|Tier]]:''' "..SlayerTier


   return result
   return result
Line 537: Line 547:
       avgGp = (monster.dropCoins[1] + monster.dropCoins[2] - 1) / 2
       avgGp = (monster.dropCoins[1] + monster.dropCoins[2] - 1) / 2
       local gpTxt = Icons.GP(monster.dropCoins[1], monster.dropCoins[2] - 1)
       local gpTxt = Icons.GP(monster.dropCoins[1], monster.dropCoins[2] - 1)
       result = result.."\r\nIn addition to loot, the monster will also drop "..gpTxt
       result = result.."\r\nIn addition to loot, the monster will also drop "..gpTxt..'.'
     end
     end


Line 595: Line 605:
     end
     end
     result = result..'\r\n|}'
     result = result..'\r\n|}'
     result = result..'\r\nThe loot dropped by the average kill is worth '..Icons.GP(Shared.round(lootValue, 2, 0)).." if sold"
     result = result..'\r\nThe loot dropped by the average kill is worth '..Icons.GP(Shared.round(lootValue, 2, 0)).." if sold."
     result = result..'<br/>Including GP, the average kill is worth '..Icons.GP(Shared.round(avgGp + lootValue, 2, 0))
     if avgGp > 0 then
      result = result..'<br/>Including GP, the average kill is worth '..Icons.GP(Shared.round(avgGp + lootValue, 2, 0))..'.'
    end
   end
   end


Line 664: Line 676:
     end
     end
     result = result..'\r\n|}'
     result = result..'\r\n|}'
     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))..'.'
   end
   end


Line 686: Line 698:
     local monster = p.getMonsterByID(monsterID)
     local monster = p.getMonsterByID(monsterID)
     tableTxt = tableTxt..'\r\n|-\r\n|'..Icons.Icon({monster.name, type='monster'})
     tableTxt = tableTxt..'\r\n|-\r\n|'..Icons.Icon({monster.name, type='monster'})
     tableTxt = tableTxt..'||'..p.getMonsterCombatLevel(monster.name)
     tableTxt = tableTxt..'||'..p._getMonsterCombatLevel(monster)
     tableTxt = tableTxt..'||'..Shared.formatnum(p.getMonsterHP(monster.name))
     tableTxt = tableTxt..'||'..Shared.formatnum(p.getMonsterHP(monster.name))
     tableTxt = tableTxt..'||'..Shared.formatnum(p.getMonsterMaxHit(monster.name))
     tableTxt = tableTxt..'||'..Shared.formatnum(p.getMonsterMaxHit(monster.name))
Line 723: Line 735:
       if monsterID ~= 1 then
       if monsterID ~= 1 then
         tableTxt = tableTxt..'\r\n|-\r\n|'..Icons.Icon({name, type='monster'})
         tableTxt = tableTxt..'\r\n|-\r\n|'..Icons.Icon({name, type='monster'})
         tableTxt = tableTxt..'||'..p.getMonsterCombatLevel(name)
         tableTxt = tableTxt..'||'..p._getMonsterCombatLevel(monster)
         tableTxt = tableTxt..'||'..Shared.formatnum(p.getMonsterHP(name))
         tableTxt = tableTxt..'||'..Shared.formatnum(p.getMonsterHP(name))
         tableTxt = tableTxt..'||'..Shared.formatnum(p.getMonsterMaxHit(name))
         tableTxt = tableTxt..'||'..Shared.formatnum(p.getMonsterMaxHit(name))
Line 927: Line 939:
   -- Input validation
   -- Input validation
   local tier = frame.args ~= nil and frame.args[1] or frame
   local tier = frame.args ~= nil and frame.args[1] or frame
   local SlayerTiers = Constants.Slayer.Tiers
   local slayerTier = nil
 
   if tier == nil then
   if tier == nil then
     return "ERROR: No tier specified[[Category:Pages with script errors]]"
     return "ERROR: No tier specified[[Category:Pages with script errors]]"
   elseif tonumber(tier) == nil then
   end
     return "ERROR: Tier must be an integer[[Category:Pages with script errors]]"
 
  if tonumber(tier) ~= nil then
     slayerTier = Constants.getSlayerTierByID(tonumber(tier))
   else
   else
     tier = math.floor(tonumber(tier))
     slayerTier = Constants.getSlayerTier(tier)
    local tierCount = Shared.tableCount(SlayerTiers) - 1
  end
    if tier < 0 or tier > tierCount then
 
      return "ERROR: Tier must be between 0 and " .. tierCount..'[[Category:Pages with script errors]]'
  if slayerTier == nil then
    end
    return "ERROR: Invalid slayer tier[[Category:Pages with script errors]]"
    tier = tier + 1
   end
   end


   -- Obtain required tier details
   -- Obtain required tier details
   local minLevel, maxLevel = SlayerTiers[tier].minLevel, SlayerTiers[tier].maxLevel
   local minLevel, maxLevel = slayerTier.minLevel, slayerTier.maxLevel
   if maxLevel < 0 then
   if maxLevel < 0 then
     maxLevel = nil
     maxLevel = nil