|
|
Line 2: |
Line 2: |
| --Several functions related to use tables can be found at Module:Items/UseTables | | --Several functions related to use tables can be found at Module:Items/UseTables |
| --Functions related to source tables can be found at Module:Items/SourceTables | | --Functions related to source tables can be found at Module:Items/SourceTables |
| | --Other functions moved to Module:Items/ComparisonTables |
|
| |
|
| local p = {} | | local p = {} |
Line 245: |
Line 246: |
|
| |
|
| return p._getOtherItemBoxText(item, asList) | | return p._getOtherItemBoxText(item, asList) |
| end
| |
|
| |
| function p.getEquipmentTable(frame)
| |
| local args = frame.args ~= nil and frame.args or frame
| |
| local type = args.type
| |
| local tier = args.tier
| |
| local slotStr = args.slot
| |
| local ammoTypeStr = args.ammoType
| |
| local category = args.category ~= nil and args.category or 'Combat'
| |
|
| |
| --Find out what Ammo Type we're working with
| |
| local ammoType = nil
| |
| if ammoTypeStr ~= nil then
| |
| if ammoTypeStr == "Arrows" then
| |
| ammoType = 0
| |
| elseif ammoTypeStr == 'Bolts' then
| |
| ammoType = 1
| |
| elseif ammoTypeStr == 'Javelins' then
| |
| ammoType = 2
| |
| elseif ammoTypeStr == 'Throwing Knives' then
| |
| ammoType = 3
| |
| end
| |
| end
| |
|
| |
| --Find out what slot we're working with
| |
| local slot = nil
| |
| if slotStr ~= nil then
| |
| slot = Constants.equipmentSlot[slotStr]
| |
| end
| |
|
| |
|
| |
| --Getting some lists set up here that will be used later
| |
| --First, the list of columns used by both weapons & armour
| |
| local statColumns = {'stabAttackBonus', 'slashAttackBonus','blockAttackBonus','rangedAttackBonus', 'magicAttackBonus', 'strengthBonus', 'rangedStrengthBonus', 'magicDamageBonus', 'defenceBonus', 'rangedDefenceBonus', 'magicDefenceBonus', 'damageReduction', 'attackLevelRequired', 'defenceLevelRequired', 'rangedLevelRequired', 'magicLevelRequired'}
| |
| --Then the lists for just weapons/just armour
| |
| --Then the list of weapon types
| |
| local weaponTypes = {'Magic Staff', 'Magic Wand', 'Ranged Weapon', 'Weapon'}
| |
|
| |
| local isWeaponType = Shared.contains(weaponTypes, type)
| |
|
| |
| --Now we need to figure out which items are in this list
| |
| local itemList = {}
| |
| for i, itemBase in pairs(ItemData.Items) do
| |
| local item = Shared.clone(itemBase)
| |
| item.id = i - 1
| |
| local listItem = false
| |
| if isWeaponType then
| |
| listItem = item.type == type and item.category == category
| |
| if ammoType ~= nil then listItem = listItem and item.ammoTypeRequired == ammoType end
| |
| else
| |
| --Now for handling armour
| |
| if type == "Armour" or type == "Melee" then
| |
| listItem = item.defenceLevelRequired ~= nil or (item.category == 'Combat' and item.type == 'Armour')
| |
| elseif type == "Ranged Armour" or type == "Ranged" then
| |
| listItem = item.rangedLevelRequired ~= nil or (item.category == 'Combat' and item.type == 'Ranged Armour')
| |
| elseif type == "Magic Armour" or type == "Magic" then
| |
| listItem = item.magicLevelRequired ~= nil or (item.category == 'Combat' and item.type == 'Magic Armour')
| |
| else
| |
| listItem = item.type == type and item.category ~= 'Combat'
| |
| end
| |
| if ammoType ~= nil then listItem = listItem and item.ammoType == ammoType end
| |
| if slot ~= nil then listItem = listItem and item.equipmentSlot == slot end
| |
| end
| |
| if listItem then
| |
| table.insert(itemList, item)
| |
| end
| |
| end
| |
|
| |
| --Now that we have a preliminary list, let's figure out which columns are irrelevant (IE are zero for all items in the selection)
| |
| local ignoreColumns = Shared.clone(statColumns)
| |
| for i, item in pairs(itemList) do
| |
| local ndx = 1
| |
| while Shared.tableCount(ignoreColumns) >= ndx do
| |
| if p._getItemStat(item, ignoreColumns[ndx], true) ~= 0 then
| |
| table.remove(ignoreColumns, ndx)
| |
| else
| |
| ndx = ndx + 1
| |
| end
| |
| end
| |
| end
| |
|
| |
| --Now to remove the ignored columns (and also we need to track groups like defence bonuses to see how many remain)
| |
| local attBonusCols = 5
| |
| local strBonusCols = 2
| |
| local defBonusCols = 3
| |
| local lvlReqCols = 4
| |
| local ndx = 1
| |
| while Shared.tableCount(statColumns) >= ndx do
| |
| local colName = statColumns[ndx]
| |
| if Shared.contains(ignoreColumns, colName) then
| |
| if Shared.contains(colName, 'AttackBonus') then attBonusCols = attBonusCols - 1 end
| |
| if Shared.contains(colName, 'trengthBonus') then strBonusCols = strBonusCols - 1 end
| |
| if Shared.contains(colName, 'efenceBonus') then defBonusCols = defBonusCols - 1 end
| |
| if Shared.contains(colName, 'LevelRequired') then lvlReqCols = lvlReqCols - 1 end
| |
| table.remove(statColumns, ndx)
| |
| else
| |
| ndx = ndx + 1
| |
| end
| |
| end
| |
|
| |
|
| |
| --Alright, let's start the table by building the shared header
| |
| local result = '{| class="wikitable sortable stickyHeader"\r\n|-class="headerRow-0"'
| |
| if isWeaponType then
| |
| --Weapons have extra columns here for Attack Speed and "Two Handed?"
| |
| result = result..'\r\n!colspan="4"|'
| |
| else
| |
| result = result..'\r\n!colspan="2"|'
| |
| end
| |
| if attBonusCols > 0 then
| |
| result = result..'\r\n!colspan="'..attBonusCols..'"style="padding:0 0.5em 0 0.5em;"|Attack Bonus'
| |
| end
| |
| if strBonusCols > 0 then
| |
| result = result..'\r\n!colspan="'..strBonusCols..'"style="padding:0 0.5em 0 0.5em;"|Strength Bonus'
| |
| end
| |
| if Shared.contains(statColumns, 'magicDamageBonus') then
| |
| result = result..'\r\n!colspan="1"style="padding:0 0.5em 0 0.5em;"|% Damage Bonus'
| |
| end
| |
| if defBonusCols > 0 then
| |
| result = result..'\r\n!colspan="'..defBonusCols..'"style="padding:0 0.5em 0 0.5em;"|Defence Bonus'
| |
| end
| |
| if Shared.contains(statColumns, 'damageReduction') then
| |
| result = result..'\r\n!colspan="1"style="padding:0 0.5em 0 0.5em;"|Damage Reduction'
| |
| end
| |
| if lvlReqCols > 0 then
| |
| result = result..'\r\n!colspan="'..lvlReqCols..'"style="padding:0 0.5em 0 0.5em;"|Levels Required'
| |
| end
| |
| result = result..'\r\n!colspan="1"|'
| |
| --One header row down, one to go
| |
| result = result..'\r\n|-class="headerRow-1"'
| |
| result = result..'\r\n!style="padding:0 1em 0 0.5em;"|Item'
| |
| result = result..'\r\n!style="padding:0 1em 0 0.5em;"|Name'
| |
| --Weapons have Attack Speed here
| |
| if isWeaponType then
| |
| result = result..'\r\n!style="padding:0 1em 0 0.5em;"|Attack Speed'
| |
| result = result..'\r\n!style="padding:0 1em 0 0.5em;"|Two Handed?'
| |
| end
| |
| --Attack bonuses
| |
| if Shared.contains(statColumns, 'slashAttackBonus') then
| |
| result = result..'\r\n!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Attack', type='skill', notext='true'})
| |
| end
| |
| if Shared.contains(statColumns, 'stabAttackBonus') then
| |
| result = result..'\r\n!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Strength', type='skill', notext='true'})
| |
| end
| |
| if Shared.contains(statColumns, 'blockAttackBonus') then
| |
| result = result..'\r\n!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Defence', type='skill', notext='true'})
| |
| end
| |
| if Shared.contains(statColumns, 'rangedAttackBonus') then
| |
| result = result..'\r\n!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Ranged', type='skill', notext='true'})
| |
| end
| |
| if Shared.contains(statColumns, 'magicAttackBonus') then
| |
| result = result..'\r\n!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Magic', type='skill', notext='true'})
| |
| end
| |
| --Strength bonuses
| |
| if Shared.contains(statColumns, 'strengthBonus') then
| |
| result = result..'\r\n!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Strength', type='skill', notext='true'})
| |
| end
| |
| if Shared.contains(statColumns, 'rangedStrengthBonus') then
| |
| result = result..'\r\n!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Ranged', type='skill', notext='true'})
| |
| end
| |
| if Shared.contains(statColumns, 'magicDamageBonus') then
| |
| result = result..'\r\n!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Magic', type='skill', notext='true'})
| |
| end
| |
| --Defence bonuses
| |
| if Shared.contains(statColumns, 'defenceBonus') then
| |
| result = result..'\r\n!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Defence', type='skill', notext='true'})
| |
| end
| |
| if Shared.contains(statColumns, 'rangedDefenceBonus') then
| |
| result = result..'\r\n!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Ranged', type='skill', notext='true'})
| |
| end
| |
| if Shared.contains(statColumns, 'magicDefenceBonus') then
| |
| result = result..'\r\n!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Magic', type='skill', notext='true'})
| |
| end
| |
| if Shared.contains(statColumns, 'damageReduction') then
| |
| result = result..'\r\n!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Defence', type='skill', notext='true'})
| |
| end
| |
| --Level requirements
| |
| if Shared.contains(statColumns, 'attackLevelRequired') then
| |
| result = result..'\r\n!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Attack', type='skill', notext='true'})
| |
| end
| |
| if Shared.contains(statColumns, 'defenceLevelRequired') then
| |
| result = result..'\r\n!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Defence', type='skill', notext='true'})
| |
| end
| |
| if Shared.contains(statColumns, 'rangedLevelRequired') then
| |
| result = result..'\r\n!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Ranged', type='skill', notext='true'})
| |
| end
| |
| if Shared.contains(statColumns, 'magicLevelRequired') then
| |
| result = result..'\r\n!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Magic', type='skill', notext='true'})
| |
| end
| |
| --And finally Sources
| |
| result = result..'\r\n!style="padding:0 1em 0 0.5em;"|Sources'
| |
|
| |
| table.sort(itemList, function(a, b) return a.id < b.id end)
| |
| for i, item in pairs(itemList) do
| |
| if isWeaponType then
| |
| --Building rows for weapons
| |
| result = result..'\r\n|-'
| |
| result = result..'\r\n|style ="text-align: left;padding: 0 0 0 0;"|'..Icons.Icon({item.name, type='item', size=50, notext=true})
| |
| result = result..'\r\n|style ="text-align: left;padding: 0 0.5em 0 0.5em;"|[['..item.name..']]'
| |
| result = result..'\r\n| style ="text-align: right;padding: 0 0.5em 0 0;" |'..Shared.formatnum(item.attackSpeed)
| |
| --That's the first list out of the way, now for 2-Handed
| |
| result = result..'\r\n| style ="text-align: right;"|'
| |
| if item.isTwoHanded then result = result..'Yes' else result = result..'No' end
| |
| for j, statName in pairs(statColumns) do
| |
| local statValue = p._getItemStat(item, statName, true)
| |
| result = result..'\r\n| style ="text-align: right;padding: 0 0.5em 0 0;'
| |
| if not Shared.contains(statName, 'LevelRequired') then
| |
| if statValue > 0 then
| |
| result = result..'background-color:lightgreen;'
| |
| elseif statValue < 0 then
| |
| result = result..'background-color:lightpink;'
| |
| end
| |
| end
| |
| result = result..'"|'..Shared.formatnum(statValue)
| |
| if statName == 'magicDamageBonus' or statName == 'damageReduction' then result = result..'%' end
| |
| end
| |
| --Finally, the Sources
| |
| result = result..'\r\n| style ="text-align: right;white-space: nowrap;padding: 0 0.5em 0 0.5em;" |'
| |
| result = result..p._getItemSources(item)
| |
| else
| |
| --Building rows for armour
| |
| result = result..'\r\n|-'
| |
| result = result..'\r\n|style ="text-align: left;padding: 0 0 0 0;"|'..Icons.Icon({item.name, type='item', size=50, notext=true})
| |
| result = result..'\r\n|style ="text-align: left;padding: 0 0.5em 0 0.5em;"|[['..item.name..']]'
| |
| for j, statName in pairs(statColumns) do
| |
| local statValue = p._getItemStat(item, statName, true)
| |
| result = result..'\r\n| style ="text-align: right;padding: 0 0.5em 0 0;'
| |
| if statValue > 0 then
| |
| result = result..'background-color:lightgreen;'
| |
| elseif statValue < 0 then
| |
| result = result..'background-color:lightpink;'
| |
| end
| |
| result = result..'"|'..Shared.formatnum(statValue)
| |
| if statName == 'magicDamageBonus' or statName == 'damageReduction' then result = result..'%' end
| |
| end
| |
| --Finally, the Sources
| |
| result = result..'\r\n| style ="text-align: right;white-space: nowrap;padding: 0 0.5em 0 0.5em;" |'
| |
| result = result..p._getItemSources(item)
| |
| end
| |
| end
| |
|
| |
| result = result..'\r\n|}'
| |
| return result
| |
| end | | end |
|
| |
|