Anonymous

Module:Items: Difference between revisions

From Melvor Idle
Fixed check for WeaponAttackType for throwing knives and javelins
No edit summary
(Fixed check for WeaponAttackType for throwing knives and javelins)
(9 intermediate revisions by 3 users not shown)
Line 6: Line 6:
local p = {}
local p = {}


local MonsterData = mw.loadData('Module:Monsters/data')
local ItemData = mw.loadData('Module:Items/data')
local ItemData = mw.loadData('Module:Items/data')
local SkillData = mw.loadData('Module:Skills/data')


local Constants = require('Module:Constants')
local Constants = require('Module:Constants')
Line 14: Line 12:
local Icons = require('Module:Icons')
local Icons = require('Module:Icons')


p.EasterEggs = {'Amulet of Calculated Promotion', 'Clue Chasers Insignia', '8', 'Lemon'}
p.EasterEggs = {'Amulet of Calculated Promotion', 'Clue Chasers Insignia', '8', 'Lemon', 'Easter Egg', 'Abnormal Log', 'Red Herring', 'Cool Glasses'}
p.OtherShopItems = {'Cooking Gloves', 'Mining Gloves', 'Gem Gloves', 'Smithing Gloves', 'Thieving Gloves'}
p.OtherShopItems = {'Cooking Gloves', 'Mining Gloves', 'Gem Gloves', 'Smithing Gloves', 'Thieving Gloves'}
--This is hardcoded, so there's no easy way to scrape it. Hopefully it doesn't change
--This is hardcoded, so there's no easy way to scrape it. Hopefully it doesn't change
p.GemTable = {["Topaz"] = {name = 'Topaz', id = 128, chance = 50},  
p.GemTable = {["Topaz"] = {name = 'Topaz', id = 128, chance = 50},
                   ["Sapphire"] = {name = "Sapphire", id = 129, chance = 17.5},  
                   ["Sapphire"] = {name = "Sapphire", id = 129, chance = 17.5},
                   ["Ruby"] = {name = "Ruby", id = 130, chance = 17.5},  
                   ["Ruby"] = {name = "Ruby", id = 130, chance = 17.5},
                   ["Emerald"] = {name = "Emerald", id = 131, chance = 10},  
                   ["Emerald"] = {name = "Emerald", id = 131, chance = 10},
                   ["Diamond"] = {name = "Diamond", id = 132, chance = 5}}
                   ["Diamond"] = {name = "Diamond", id = 132, chance = 5}}
--The base chance to receive a gem while mining
--The base chance to receive a gem while mining
Line 27: Line 25:
p.junkCount = 8
p.junkCount = 8
--Items (aside from bars & gems) which can be created via Alt Magic
--Items (aside from bars & gems) which can be created via Alt Magic
local AltMagicProducts = {'Rune Essence', 'Bones', 'Holy Dust'}
p.AltMagicProducts = {'Rune Essence', 'Bones', 'Holy Dust'}
--The kinds of gloves with cost & charges
--The kinds of gloves with cost & charges
p.GloveTable = {['Cooking Gloves'] = {cost=50000, charges=500},
p.GloveTable = {['Cooking Gloves'] = {cost=50000, charges=500},
Line 56: Line 54:
   local result = 'p.specialFishWt = '..totalWt..'\r\n'
   local result = 'p.specialFishWt = '..totalWt..'\r\n'
   result = result..'p.specialFishLoot = {'..table.concat(lootArray, ', ')..'}'
   result = result..'p.specialFishLoot = {'..table.concat(lootArray, ', ')..'}'
  return result
end
function p.getSpecialAttackByID(ID)
  local result = Shared.clone(ItemData.SpecialAttacks[ID + 1])
  if result ~= nil then
    result.id = ID
  end
   return result
   return result
end
end
Line 107: Line 97:
   local result = item[StatName]
   local result = item[StatName]
   --Special Overrides:
   --Special Overrides:
   if StatName == 'stabAttackBonus' then
  -- Equipment stats first
     if item.attackBonus == nil then  
   if Shared.contains(ItemData.EquipmentStatKeys, StatName) and item.equipmentStats ~= nil then
       result = nil
    result = item.equipmentStats[StatName]
  elseif StatName == 'isTwoHanded' then
     if item.validSlots ~= nil and item.occupiesSlots ~= nil then
       result = Shared.contains(item.validSlots, 'Weapon') and Shared.contains(item.occupiesSlots, 'Shield')
     else
     else
       result = item.attackBonus[1]
       result = false
     end
     end
   elseif StatName == 'slashAttackBonus' then
   elseif string.find(StatName, '^(.+)LevelRequired$') ~= nil and item.equipRequirements ~= nil and item.equipRequirements.Level ~= nil then
    if item.attackBonus == nil then  
     local skillName = Shared.titleCase(string.match(StatName, '^(.+)LevelRequired$'))
      result = nil
     if skillName ~= nil then
     else
       local skillID = Constants.getSkillID(skillName)
      result = item.attackBonus[2]
      if skillID ~= nil then
    end
        result = item.equipRequirements.Level[skillID]
  elseif StatName == 'blockAttackBonus' then
      end
     if item.attackBonus == nil then  
       result = nil
    else
      result = item.attackBonus[3]
     end
     end
   elseif StatName == 'attackType' then
   elseif StatName == 'attackType' then
Line 132: Line 121:
   elseif StatName == 'completionReq' then
   elseif StatName == 'completionReq' then
     if item.ignoreCompletion == nil or not item.ignoreCompletion then
     if item.ignoreCompletion == nil or not item.ignoreCompletion then
       return 'Yes'
       result = 'Yes'
     else
     else
       return 'No'
       result = 'No'
     end
     end
   elseif StatName == 'slayerBonusXP' then
   elseif StatName == 'slayerBonusXP' then
Line 167: Line 156:
     skill = Constants.getSkillID(skill)
     skill = Constants.getSkillID(skill)
   end
   end
  mw.log(item.name..', '..modifier)


   local result = 0
   local result = 0
Line 197: Line 184:


function p.hasCombatStats(item)
function p.hasCombatStats(item)
   if item.equipmentSlot == nil then
   if item.isEquipment or (item.validSlots == nil and item.equipmentStats ~= nil) then
    return false
     -- Ensure at least one stat has a non-zero value
  elseif item.equipmentSlot == Constants.getEquipmentSlotID('Weapon') then
    for statName, statVal in pairs(item.equipmentStats) do
     return true
      if statVal ~= 0 then return true end
  end
 
  local combatStatList = {'strengthBonus', 'defenceBonus', 'stabAttackBonus', 'slashAttackBonus', 'blockAttackBonus', 'damageReduction',
                          'rangedDefenceBonus', 'magicDefenceBonus', 'rangedAttackBonus', 'rangedStrengthBonus', 'magicAttackBonus', 'magicDamageBonus'}
 
  for i, stat in Shared.skpairs(combatStatList) do
    if p._getItemStat(item, stat, true) > 0 then
      return true
     end
     end
   end
   end
   return false
   return false
end
end
Line 237: Line 215:


function p._getWeaponAttackType(item)
function p._getWeaponAttackType(item)
   if item.type == 'Weapon' then
   if item.isEquipment == true and (item.validSlots ~= nil and Shared.contains(item.validSlots, 'Weapon')) or
    return Icons.Icon({'Melee', nolink='true'})
  (item.occupiesSlots ~= nil  and Shared.contains(item.occupiesSlots, 'Weapon')) then
  elseif item.type == 'Ranged Weapon' then
     if Shared.contains({'melee', 'ranged', 'magic'}, item.attackType) then
     return Icons.Icon({'Ranged', type='skill', nolink='true'})
      local iconType = item.attackType ~= 'melee' and 'skill' or nil
  elseif item.type == 'Magic Staff' or item.type == 'Magic Wand' then
      return Icons.Icon({Shared.titleCase(item.attackType), type=iconType, nolink='true'})
    return Icons.Icon({'Magic', type='skill', nolink='true'})
     end
  else
     return "Invalid"
   end
   end
  return 'Invalid'
end
end


function p.getWeaponAttackType(frame)
function p.getWeaponAttackType(frame)
Line 262: Line 238:
   local tiers = {'I', 'II', 'III', 'IV'}
   local tiers = {'I', 'II', 'III', 'IV'}


   local result = '{| class="wikitable"'
   local resultPart = {}
   result = result..'\r\n!Potion!!Tier!!Charges!!Effect'
  table.insert(resultPart, '{| class="wikitable"')
   table.insert(resultPart, '\r\n!Potion!!Tier!!Charges!!Effect')


   local tier1potion = p.getItem(potionName..' I')
   local tier1potion = p.getItem(potionName..' I')
  if tier1potion == nil then
    return 'ERROR: No potion named "' .. potionName .. '" was found[[Category:Pages with script errors]]'
  end
   for i, tier in pairs(tiers) do
   for i, tier in pairs(tiers) do
     local tierName = potionName..' '..tier
     local tierName = potionName..' '..tier
     local potion = p.getItemByID(tier1potion.id + i - 1)
     local potion = p.getItemByID(tier1potion.id + i - 1)
     if potion ~= nil then
     if potion ~= nil then
       result = result..'\r\n|-'
       table.insert(resultPart, '\r\n|-')
       result = result..'\r\n|'..Icons.Icon({tierName, type='item', notext='true', size='60'})
       table.insert(resultPart, '\r\n|'..Icons.Icon({tierName, type='item', notext=true, size='60'}))
       result = result..'||'..'[['..tierName..'|'..tier..']]'
       table.insert(resultPart, '||'..Icons.Icon({tierName, tier, type='item', noicon=true}))
       result = result..'||'..potion.potionCharges..'||'..potion.description
       table.insert(resultPart, '||'..potion.potionCharges..'||'..potion.description)
     end
     end
   end
   end


   result = result..'\r\n|}'
   table.insert(resultPart, '\r\n|}')
   return result
   return table.concat(resultPart)
end
end


function p._getOtherItemBoxText(item)
function p._getOtherItemBoxText(item)
   result = ''
   resultPart = {}
   --For equipment, show the slot they go in
   --For equipment, show the slot they go in
   if item.equipmentSlot ~= nil then
   if item.validSlots ~= nil then
     result = result.."\r\n|-\r\n|'''Equipment Slot:''' "..Constants.getEquipmentSlotName(item.equipmentSlot)
     table.insert(resultPart, "\r\n|-\r\n|'''Equipment Slot:''' "..table.concat(item.validSlots, ', '))
    if item.isPassiveItem then
      result = result..', Passive'
    end
   end
   end
   --For weapons with a special attack, show the details
   --For weapons with a special attack, show the details
   if item.hasSpecialAttack then
   if item.hasSpecialAttack then
     local spAtt = p.getSpecialAttackByID(item.specialAttackID)
     table.insert(resultPart, "\r\n|-\r\n|'''Special Attack:'''")
    result = result.."\r\n|-\r\n|'''Special Attack:'''"
     for i, spAtt in ipairs(item.specialAttacks) do
     result = result..'\r\n* '..spAtt.chance..'% chance for '..spAtt.name..':'
      table.insert(resultPart, '\r\n* ' .. spAtt.defaultChance .. '% chance for ' .. spAtt.name .. ':')
    result = result..'\r\n** '..spAtt.description
      table.insert(resultPart, '\r\n** ' .. spAtt.description)
    end
   end
   end
   --For potions, show the number of charges
   --For potions, show the number of charges
   if item.potionCharges ~= nil then
   if item.potionCharges ~= nil then
     result = result.."\r\n|-\r\n|'''Charges:''' "..item.potionCharges
     table.insert(resultPart, "\r\n|-\r\n|'''Charges:''' "..item.potionCharges)
   end
   end
   --For food, show how much it heals for
   --For food, show how much it heals for
   if item.healsFor ~= nil then
   if item.healsFor ~= nil then
     result = result.."\r\n|-\r\n|'''Heals for:''' "..Icons.Icon({"Hitpoints", type="skill", notext="true"})..' '..(item.healsFor * 10)
     table.insert(resultPart, "\r\n|-\r\n|'''Heals for:''' "..Icons.Icon({"Hitpoints", type="skill", notext="true"})..' '..(item.healsFor * 10))
   end
   end
   --For Prayer Points, show how many you get
   --For Prayer Points, show how many you get
   if item.prayerPoints ~= nil then
   if item.prayerPoints ~= nil then
     result = result.."\r\n|-\r\n|'''"..Icons.Icon({'Prayer', type='skill'}).." Points:''' "..item.prayerPoints
     table.insert(resultPart, "\r\n|-\r\n|'''"..Icons.Icon({'Prayer', type='skill'}).." Points:''' "..item.prayerPoints)
   end
   end
   --For items with modifiers, show what those are
   --For items with modifiers, show what those are
   if item.modifiers ~= nil and Shared.tableCount(item.modifiers) > 0 then
   if item.modifiers ~= nil and Shared.tableCount(item.modifiers) > 0 then
     result = result.."\r\n|-\r\n|'''Modifiers:'''\r\n"..Constants.getModifiersText(item.modifiers, true)
     table.insert(resultPart, "\r\n|-\r\n|'''Modifiers:'''\r\n"..Constants.getModifiersText(item.modifiers, true))
   end
   end
   return result
   return table.concat(resultPart)
end
end


Line 320: Line 298:
   local item = p.getItem(itemName)
   local item = p.getItem(itemName)
   local asList = false
   local asList = false
   if frame.args ~= nil then  
   if frame.args ~= nil then
     asList = frame.args.asList ~= nil and frame.args.asList ~= '' and frame.args.asList ~= 'false'
     asList = frame.args.asList ~= nil and frame.args.asList ~= '' and frame.args.asList ~= 'false'
   end
   end
Line 331: Line 309:


function p._getItemCategories(item)
function p._getItemCategories(item)
   local result = ''
   local resultPart = {}
   if item.category ~= nil then result = result..'[[Category:'..item.category..']]' end
   if item.category ~= nil then table.insert(resultPart, '[[Category:'..item.category..']]') end
   if item.type ~= nil then result = result..'[[Category:'..item.type..']]' end
   if item.type ~= nil then table.insert(resultPart, '[[Category:'..item.type..']]') end
   if item.tier ~= nil then result = result..'[[Category:'..Shared.titleCase(item.tier)..' '..item.type..']]' end
   if item.tier ~= nil then table.insert(resultPart, '[[Category:'..Shared.titleCase(item.tier)..' '..item.type..']]') end
   if item.hasSpecialAttack then result = result..'[[Category:Items With Special Attacks]]' end
   if item.hasSpecialAttack then table.insert(resultPart, '[[Category:Items With Special Attacks]]') end
   if item.isPassiveItem then result = result..'[[Category:Passive Items]]' end
   if item.validSlots ~= nil then
   if item.chanceToDoubleLoot ~= nil and item.chanceToDoubleLoot > 0 then result = result..'[[Category:Double Loot Chance Items]]' end
    local slotRemap = {
   return result
      ['Passive'] = 'Passive Items',
      ['Summon1'] = 'Summoning Familiars',
      ['Summon2'] = ''
    }
    for i, slotName in ipairs(item.validSlots) do
      local slotRemapName = slotName
      if slotRemap[slotName] ~= nil then slotRemapName = slotRemap[slotName] end
      if slotRemapName ~= '' then table.insert(resultPart, '[[Category:' .. slotRemapName .. ']]') end
    end
  end
   if item.modifiers ~= nil then
    local modsDL = {
      'increasedChanceToDoubleLootCombat',
      'decreasedChanceToDoubleLootCombat',
      'increasedChanceToDoubleLootThieving',
      'decreasedChanceToDoubleLootThieving',
      'increasedChanceToDoubleItemsGlobal',
      'decreasedChanceToDoubleItemsGlobal'
    }
    for modName, val in pairs(item.modifiers) do
      if Shared.contains(modsDL, modName) then
        table.insert(resultPart, '[[Category:Double Loot Chance Items]]')
        break
      end
    end
  end
   return table.concat(resultPart)
end
end


Line 354: Line 358:
   local skillName = frame.args ~= nil and frame.args[1] or frame
   local skillName = frame.args ~= nil and frame.args[1] or frame
   local cape = p.getItem(skillName..' Skillcape')
   local cape = p.getItem(skillName..' Skillcape')
   local result = '{| class="wikitable"\r\n'
   local resultPart = {}
   result = result..'!Skillcape!!Name!!Effect'
  table.insert(resultPart, '{| class="wikitable"\r\n')
   result = result..'\r\n|-\r\n|'..Icons.Icon({cape.name, type='item', size='60', notext=true})
   table.insert(resultPart, '!Skillcape!!Name!!Effect')
  result = result..'||[['..cape.name..']]||'..cape.description
   table.insert(resultPart, '\r\n|-\r\n|'..Icons.Icon({cape.name, type='item', size='60', notext=true}))
  result = result..'\r\n|}'
   table.insert(resultPart, '||'..Icons.Icon({cape.name, type='item', noicon=true})..'||'..cape.description)
  return result
   table.insert(resultPart, '\r\n|}')
end
   return table.concat(resultPart)
 
function p.getShopSkillcapeTable()
   local result = ''
 
  local capeList = {}
  for i, item in pairs(ItemData.Items) do
    if Shared.contains(item.name, 'Skillcape') or item.name == 'Cape of Completion' then
      table.insert(capeList, item)
    end
  end
 
  result = result..'\r\n{|class="wikitable sortable"'
  result = result..'\r\n!colspan="2" style="width:200px"|Cape'
  result = result..'!!Description!!style="width:120px"|Price'
 
  --Sort the table by cost and then name
  table.sort(capeList, function(a, b)
                        if a.buysFor == b.buysFor then
                          return a.name < b.name
                        else
                          return a.sellsFor < b.buysFor
                        end
                      end)
  for i, thisItem in pairs(capeList) do
    result = result..'\r\n|-\r\n|'..Icons.Icon({thisItem.name, type='item', size='50', notext=true})
    result = result..'||[['..thisItem.name..']]'
    result = result..'\r\n||'..thisItem.description
    result = result..'||style="text-align:left" data-sort-value="'..thisItem.buysFor..'"'
    result = result..'|'..Icons.GP(thisItem.buysFor)
   end
  result = result..'\r\n|}'
 
   return result
end
end


function p.getItemGrid(frame)
function p.getItemGrid(frame)
   result = '{|'
   local resultPart = {}
  table.insert(resultPart, '{|')
   for i, item in Shared.skpairs(ItemData.Items) do
   for i, item in Shared.skpairs(ItemData.Items) do
     if i % 17 == 1 then
     if i % 17 == 1 then
       result = result..'\r\n|-\r\n|'
       table.insert(resultPart, '\r\n|-\r\n|')
     else
     else
       result = result..'||'
       table.insert(resultPart, '||')
     end
     end
     result = result..'style="padding:3px"|'..Icons.Icon({item.name, type='item', notext=true, size='40'})
     table.insert(resultPart, 'style="padding:3px"|'..Icons.Icon({item.name, type='item', notext=true, size='40'}))
   end
   end
   result = result..'\r\n|}'
   table.insert(resultPart, '\r\n|}')
   return result
   return table.concat(resultPart)
end
end


function p.getSpecialAttackTable(frame)
function p.getSpecialAttackTable(frame)
   local spAttTable = {}
   local spAttTable = {}
 
 
   for i, item in Shared.skpairs(ItemData.Items) do
   for i, item in Shared.skpairs(ItemData.Items) do
     if item.hasSpecialAttack then
     if item.hasSpecialAttack then
       if spAttTable[item.specialAttackID] == nil then spAttTable[item.specialAttackID] = {sortName=item.name, Icons = {}} end
       for i, spAtt in ipairs(item.specialAttacks) do
      table.insert(spAttTable[item.specialAttackID].Icons, Icons.Icon({item.name, type='item'}))
        if spAttTable[spAtt.id] == nil then spAttTable[spAtt.id] = {sortName=item.name, defn = spAtt, Icons = {}} end
        table.insert(spAttTable[spAtt.id].Icons, Icons.Icon({item.name, type='item'}))
      end
     end
     end
   end
   end


   local result = '{|class="wikitable sortable stickyHeader"'
   local resultPart = {}
   result = result..'\r\n|-class="headerRow-0"'
  table.insert(resultPart, '{|class="wikitable sortable stickyHeader"')
   result = result..'\r\n!style="min-width:180px"|Weapon(s)!!Name!!Chance!!Effect'
   table.insert(resultPart, '\r\n|-class="headerRow-0"')
   table.insert(resultPart, '\r\n!style="min-width:180px"|Weapon(s)!!Name!!Chance!!Effect')
   for i, spAttData in Shared.skpairs(spAttTable) do
   for i, spAttData in Shared.skpairs(spAttTable) do
     local spAtt = p.getSpecialAttackByID(i)
     local spAtt = spAttData.defn
     table.sort(spAttData.Icons, function(a, b) return a < b end)
     table.sort(spAttData.Icons, function(a, b) return a < b end)
     result = result..'\r\n|-'
     table.insert(resultPart, '\r\n|-')
     result = result..'\r\n|data-sort-value="'..spAttData.sortName..'"|'..table.concat(spAttData.Icons, '<br/>')
     table.insert(resultPart, '\r\n|data-sort-value="'..spAttData.sortName..'"|'..table.concat(spAttData.Icons, '<br/>'))
     result = result..'||'..spAtt.name..'||data-sort-value="'..spAtt.chance..'"|'..spAtt.chance..'%'
     table.insert(resultPart, '||'..spAtt.name..'||data-sort-value="'..spAtt.defaultChance..'"|'..spAtt.defaultChance..'%')
     result = result..'||'..spAtt.description
     table.insert(resultPart, '||'..spAtt.description)
   end
   end
   result = result..'\r\n|}'
   table.insert(resultPart, '\r\n|}')


   return result
   return table.concat(resultPart)
end
end


return p
return p