Anonymous

Module:Items: Difference between revisions

From Melvor Idle
474 bytes removed ,  11 October 2021
Fixed check for WeaponAttackType for throwing knives and javelins
No edit summary
(Fixed check for WeaponAttackType for throwing knives and javelins)
(5 intermediate revisions by 3 users not shown)
Line 25: 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 56:
   return result
   return result
end
end
function p.getSpecialAttackByID(ID)
  local result = Shared.clone(ItemData.SpecialAttacks[ID + 1])
  if result ~= nil then
    result.id = ID
  end
  return result
end


function p.getItemByID(ID)
function p.getItemByID(ID)
Line 102: Line 92:
   end
   end
   return result
   return result
end
-- Input: equipmentStats property of an item in the format { { ["key"] = "stabAttackBonus", ["value"] = 2 }, ... }
-- Output: Table in the format { ["stabAttackBonus"] = 2, ... }
function p._processEquipmentStats(equipStats)
  local out = {}
  if type(equipStats) == 'table' then
    for i, stat in pairs(equipStats) do
      local k, v = stat["key"], stat["value"]
      if out[k] == nil then
        out[k] = v
      else
        out[k] = out[k] + v
      end
    end
  end
  return out
end
-- Input: equipRequirements property of an item
-- Output: Table in the format { ["Attack"] = 80, ... }
function p._processEquipmentLevelReqs(equipReqs)
  local out = {}
  if type(equipReqs) == 'table' then
    for i, req in pairs(equipReqs) do
      if req.type == 'Level' then
        for j, levelReq in pairs(req.levels) do
          local skillName = Constants.getSkillName(levelReq.skill)
          if skillName ~= nil then out[skillName] = levelReq.level end
        end
      end
    end
  end
  return out
end
end


Line 142: Line 98:
   --Special Overrides:
   --Special Overrides:
   -- Equipment stats first
   -- Equipment stats first
   if Shared.contains(ItemData.EquipmentStatKeys, StatName) then
   if Shared.contains(ItemData.EquipmentStatKeys, StatName) and item.equipmentStats ~= nil then
     local equipStats = p._processEquipmentStats(item.equipmentStats)
     result = item.equipmentStats[StatName]
    result = equipStats[StatName]
   elseif StatName == 'isTwoHanded' then
   elseif StatName == 'isTwoHanded' then
     if item.validSlots ~= nil and item.occupiesSlots ~= nil then
     if item.validSlots ~= nil and item.occupiesSlots ~= nil then
       return Shared.contains(item.validSlots, 'Weapon') and Shared.contains(item.occupiesSlots, 'Shield')
       result = Shared.contains(item.validSlots, 'Weapon') and Shared.contains(item.occupiesSlots, 'Shield')
     else
     else
       return false
       result = false
     end
     end
   elseif string.find(StatName, '^(.+)LevelRequired$') ~= nil then
   elseif string.find(StatName, '^(.+)LevelRequired$') ~= nil and item.equipRequirements ~= nil and item.equipRequirements.Level ~= nil then
     local skillName = Shared.titleCase(string.match(StatName, '^(.+)LevelRequired$'))
     local skillName = Shared.titleCase(string.match(StatName, '^(.+)LevelRequired$'))
     if skillName ~= nil then
     if skillName ~= nil then
       local levelReqs = p._processEquipmentLevelReqs(item.equipRequirements)
       local skillID = Constants.getSkillID(skillName)
       result = levelReqs[skillName]
       if skillID ~= nil then
        result = item.equipRequirements.Level[skillID]
      end
     end
     end
   elseif StatName == 'attackType' then
   elseif StatName == 'attackType' then
Line 164: 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 227: Line 184:


function p.hasCombatStats(item)
function p.hasCombatStats(item)
   if not item.isEquipment or item.validSlots == nil and item.equipmentStats ~= nil then
   if item.isEquipment or (item.validSlots == nil and item.equipmentStats ~= nil) then
     -- Ensure at least one stat has a non-zero value
     -- Ensure at least one stat has a non-zero value
    local equipStats = p._processEquipmentStats(item.equipmentStats)
     for statName, statVal in pairs(item.equipmentStats) do
     for statName, statVal in pairs(equipStats) do
       if statVal ~= 0 then return true end
       if statVal ~= 0 then return true end
     end
     end
Line 259: Line 215:


function p._getWeaponAttackType(item)
function p._getWeaponAttackType(item)
   if item.isEquipment == true and item.validSlots ~= nil and Shared.contains(item.validSlots, 'Weapon') then
   if item.isEquipment == true and (item.validSlots ~= nil and Shared.contains(item.validSlots, 'Weapon')) or
  (item.occupiesSlots ~= nil  and Shared.contains(item.occupiesSlots, 'Weapon')) then
     if Shared.contains({'melee', 'ranged', 'magic'}, item.attackType) then
     if Shared.contains({'melee', 'ranged', 'magic'}, item.attackType) then
       local iconType = item.attackType ~= 'melee' and 'skill' or nil
       local iconType = item.attackType ~= 'melee' and 'skill' or nil
Line 281: 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.validSlots ~= nil then
   if item.validSlots ~= nil then
     result = result.."\r\n|-\r\n|'''Equipment Slot:''' "..table.concat(item.validSlots, ', ')
     table.insert(resultPart, "\r\n|-\r\n|'''Equipment Slot:''' "..table.concat(item.validSlots, ', '))
   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 spAttPart = {}
     table.insert(resultPart, "\r\n|-\r\n|'''Special Attack:'''")
     table.insert(spAttPart, "\r\n|-\r\n|'''Special Attack:'''")
     for i, spAtt in ipairs(item.specialAttacks) do
     for i, spID in ipairs(item.specialAttacks) do
       table.insert(resultPart, '\r\n* ' .. spAtt.defaultChance .. '% chance for ' .. spAtt.name .. ':')
      local spAtt = p.getSpecialAttackByID(spID)
       table.insert(resultPart, '\r\n** ' .. spAtt.description)
       table.insert(spAttPart, '\r\n* ' .. spAtt.defaultChance .. '% chance for ' .. spAtt.name .. ':')
       table.insert(spAttPart, '\r\n** ' .. spAtt.description)
     end
     end
    result = result .. table.concat(spAttPart)
   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 351: 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.validSlots ~= nil then
   if item.validSlots ~= nil then
     local slotRemap = {
     local slotRemap = {
Line 365: Line 323:
       local slotRemapName = slotName
       local slotRemapName = slotName
       if slotRemap[slotName] ~= nil then slotRemapName = slotRemap[slotName] end
       if slotRemap[slotName] ~= nil then slotRemapName = slotRemap[slotName] end
       if slotRemapName ~= '' then result = result .. '[[Category:' .. slotRemapName .. ']]' end
       if slotRemapName ~= '' then table.insert(resultPart, '[[Category:' .. slotRemapName .. ']]') end
     end
     end
   end
   end
Line 379: Line 337:
     for modName, val in pairs(item.modifiers) do
     for modName, val in pairs(item.modifiers) do
       if Shared.contains(modsDL, modName) then
       if Shared.contains(modsDL, modName) then
         result = result..'[[Category:Double Loot Chance Items]]'
         table.insert(resultPart, '[[Category:Double Loot Chance Items]]')
         break
         break
       end
       end
     end
     end
   end
   end
   return result
   return table.concat(resultPart)
end
end


Line 400: 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|}')
   return table.concat(resultPart)
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


Line 427: Line 387:
   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
       for i, spID in ipairs(item.specialAttacks) do
       for i, spAtt in ipairs(item.specialAttacks) do
        local spAtt = p.getSpecialAttackByID(spID)
         if spAttTable[spAtt.id] == nil then spAttTable[spAtt.id] = {sortName=item.name, defn = spAtt, Icons = {}} end
         if spAttTable[spID] == nil then spAttTable[spID] = {sortName=item.name, Icons = {}} end
         table.insert(spAttTable[spAtt.id].Icons, Icons.Icon({item.name, type='item'}))
         table.insert(spAttTable[spID].Icons, Icons.Icon({item.name, type='item'}))
       end
       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.defaultChance..'"|'..spAtt.defaultChance..'%'
     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