4,951
edits
Falterfire (talk | contribs) (Added function for compiling item sources. (Somewhat incomplete right now)) |
Falterfire (talk | contribs) (Initial implementation of the automatic equipment table) |
||
Line 4: | Line 4: | ||
local ItemData = mw.loadData('Module:Items/data') | local ItemData = mw.loadData('Module:Items/data') | ||
local SkillData = mw.loadData('Module:Skills/data') | local SkillData = mw.loadData('Module:Skills/data') | ||
local Constants = mw.loadData('Module:Constants/data') | |||
local Shared = require('Module:Shared') | local Shared = require('Module:Shared') | ||
Line 9: | Line 10: | ||
local EasterEggs = {'Amulet of Calculated Promotion', 'Clue Chasers Insignia', '8', 'Lemon'} | local EasterEggs = {'Amulet of Calculated Promotion', 'Clue Chasers Insignia', '8', 'Lemon'} | ||
local OtherShopItems = {'Cooking Gloves', 'Mining Gloves', 'Gem Gloves', 'Smithing Gloves', 'Thieving Gloves'} | |||
function p.getItemByID(ID) | function p.getItemByID(ID) | ||
Line 300: | Line 302: | ||
--Shop items | --Shop items | ||
if item.slayerCost ~= nil or item.buysFor ~= nil then | if item.slayerCost ~= nil or item.buysFor ~= nil then | ||
if string.len(result) > 0 then result = result..'\r\n<br/>' end | |||
result = result..'[[Shop]]' | |||
end | |||
--Special Shop Items (ie gloves, which don't technically exist in the shop) | |||
if Shared.contains(OtherShopItems, item.name) then | |||
if string.len(result) > 0 then result = result..'\r\n<br/>' end | if string.len(result) > 0 then result = result..'\r\n<br/>' end | ||
result = result..'[[Shop]]' | result = result..'[[Shop]]' | ||
Line 321: | Line 329: | ||
return p._getItemSources(item) | return p._getItemSources(item) | ||
end | |||
function p.getEquipmentTable(frame) | |||
local args = frame.args ~= nil and frame.args[1] 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 | |||
mw.log("Type = "..(type ~= nil and type or '')..", Slot = "..(slot ~= nil and slot or '')..", AmmoType = "..(ammoType ~= nil and ammoType or '')) | |||
--Getting some lists set up here that will be used later | |||
--First, the list of columns used by both weapons & armor | |||
local statColumns = {'slashAttackBonus', 'stabAttackBonus','blockAttackBonus','rangedAttackBonus', 'magicAttackBonus', 'strengthBonus', 'rangedStrengthBonus', 'magicDamageBonus', 'defenceBonus', 'rangedDefenceBonus', 'magicDefenceBonus'} | |||
--Then the lists for just weapons/just armor | |||
local weaponStatColumns = {'attackLevelRequired', 'rangedLevelRequired', 'magicLevelRequired'} | |||
local armorStatColumns = {'damageReduction', 'defenceLevelRequired', 'rangedLevelRequired', 'magicLevelRequired'} | |||
--Then the list of weapon types | |||
local weaponTypes = {'Magic Staff', 'Magic Wand', 'Ranged Weapon', 'Weapon'} | |||
local isWeaponType = Shared.contains(weaponTypes, type) | |||
--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 an extra column here for Attack Speed | |||
result = result..'\r\n!colspan="2"|' | |||
else | |||
result = result..'\r\n!colspan="1"|' | |||
end | |||
result = result..'\r\n!colspan="5"style="padding:0 0.5em 0 0.5em;"|Attack Bonus' | |||
result = result..'\r\n!colspan="2"style="padding:0 0.5em 0 0.5em;"|Strength Bonus' | |||
result = result..'\r\n!colspan="1"style="padding:0 0.5em 0 0.5em;"|% Damage Bonus' | |||
result = result..'\r\n!colspan="3"style="padding:0 0.5em 0 0.5em;"|Defence Bonus' | |||
if isWeaponType then | |||
--Weapons have an extra columns here for "Two Handed?" | |||
result = result..'\r\n!colspan="1"|' | |||
else | |||
--Only armor pieces have DR right now, so ignore that column for weapons | |||
result = result..'\r\n!colspan="1"style="padding:0 0.5em 0 0.5em;"|Damage Reduction' | |||
end | |||
result = result..'\r\n!colspan="3"style="padding:0 0.5em 0 0.5em;"|Levels Required' | |||
result = result..'\r\n!colspan="1"|' | |||
--One header row down, one to go | |||
result = result..'\r\n|-class="headerRow-1"' | |||
result = result..'!style="padding:0 1em 0 0.5em;"|Item' | |||
--Weapons have Attack Speed here | |||
if isWeaponType then | |||
result = result..'!style="padding:0 1em 0 0.5em;"|Attack Speed' | |||
end | |||
--Attack bonuses | |||
result = result..'!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Attack', type='skill', notext='true'}) | |||
result = result..'!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Strength', type='skill', notext='true'}) | |||
result = result..'!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Defence', type='skill', notext='true'}) | |||
result = result..'!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Ranged', type='skill', notext='true'}) | |||
result = result..'!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Magic', type='skill', notext='true'}) | |||
--Strength bonuses | |||
result = result..'!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Strength', type='skill', notext='true'}) | |||
result = result..'!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Ranged', type='skill', notext='true'}) | |||
result = result..'!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Magic', type='skill', notext='true'}) | |||
--Defence bonuses | |||
result = result..'!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Defence', type='skill', notext='true'}) | |||
result = result..'!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Ranged', type='skill', notext='true'}) | |||
result = result..'!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Magic', type='skill', notext='true'}) | |||
--Damage Reduction/Defence Req for armor, 2-handed/Attack Req for weapons | |||
if isWeaponType then | |||
result = result..'!style="padding:0 1em 0 0.5em;"|Two Handed?' | |||
result = result..'!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Attack', type='skill', notext='true'}) | |||
else | |||
result = result..'!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Defence', type='skill', notext='true'}) | |||
result = result..'!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Defence', type='skill', notext='true'}) | |||
end | |||
--Then Ranged/Magic requirements | |||
result = result..'!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Ranged', type='skill', notext='true'}) | |||
result = result..'!style="padding:0 1em 0 0.5em;"|'..Icons.Icon({'Magic', type='skill', notext='true'}) | |||
--And finally Sources | |||
result = result..'!style="padding:0 1em 0 0.5em;"|Sources' | |||
--And with all the header out of the way, finally time to actually build the table itself. | |||
for i, item in pairs(ItemData) do | |||
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 | |||
if listItem then | |||
result = result..'\r\n|-' | |||
result = result..'\r\n|style="text-align:left;padding:0 0.5em 0 0.5em;"|'..Icons.Icon({item.name, type='item'}) | |||
result = result..'| style ="text-align: right;padding: 0 0.5em 0 0;" |'..Shared.formatnum(item.attackSpeed) | |||
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..'color:lightgreen;' | |||
elseif statValue < 0 then | |||
result = result..'color:lightpink;' | |||
end | |||
result = result..'"|'..Shared.formatnum(statValue) | |||
if statName == 'magicDamageBonus' or statName == 'damageReduction' then result = result..'%' end | |||
end | |||
--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 | |||
--Now the weapon exclusive columns | |||
for j, statName in pairs(weaponStatColumns) 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..'color:lightgreen;' | |||
elseif statValue < 0 then | |||
result = result..'color:lightpink;' | |||
end | |||
result = result..'"|'..Shared.formatnum(statValue) | |||
if statName == 'magicDamageBonus' or statName == 'damageReduction' then result = result..'%' end | |||
end | |||
--Finally, the Sources | |||
result = result..'| style ="text-align: right;white-space: nowrap;padding: 0 0.5em 0 0.5em;" |' | |||
result = result..p._getItemSources(item) | |||
end | |||
else | |||
--Now for handling armor | |||
listItem = item.type == type and item.category == category | |||
if ammoType ~= nil then listItem = listItem and item.ammoType == ammoType end | |||
if slot ~= nil then listItem = listItem and item.equipmentSlot == slot end | |||
if listItem then | |||
result = result..'\r\n|-' | |||
result = result..'\r\n|style="text-align:left;padding:0 0.5em 0 0.5em;"|'..Icons.Icon({item.name, type='item'}) | |||
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..'color:lightgreen;' | |||
elseif statValue < 0 then | |||
result = result..'color:lightpink;' | |||
end | |||
result = result..'"|'..Shared.formatnum(statValue) | |||
if statName == 'magicDamageBonus' or statName == 'damageReduction' then result = result..'%' end | |||
end | |||
--That's the first list out of the way, now for armor specific things | |||
for j, statName in pairs(armorStatColumns) 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..'color:lightgreen;' | |||
elseif statValue < 0 then | |||
result = result..'color:lightpink;' | |||
end | |||
result = result..'"|'..Shared.formatnum(statValue) | |||
if statName == 'magicDamageBonus' or statName == 'damageReduction' then result = result..'%' end | |||
end | |||
--Finally, the Sources | |||
result = result..'| style ="text-align: right;white-space: nowrap;padding: 0 0.5em 0 0.5em;" |' | |||
result = result..p._getItemSources(item) | |||
end | |||
end | |||
end | |||
result = result..'|}' | |||
return result | |||
end | end | ||
return p | return p |