Module:Iteminfo

---Item info database. ---luacache.get is relative slow, therefore we load data from luacache only once per page. local data = mw.loadData('Module:Iteminfo/loaddata')

local trim = mw.text.trim

local info = { version = '1.4.4.9', -- set this to the version displayed on Module:Iteminfo/data IDs = { -- min and max are both inclusive min = 1, max = 5455, } } info.IDs.isValid = function(id) return id ~= nil and type(id) == 'number' and id >= info.IDs.min and id <= info.IDs.max end

-- cache local currentFrame

-- helper function local getArg = function(key) local value = currentFrame.args[key] if not value then return nil end value = trim(value) if value == '' then return nil else return value end end

-- credit: http://richard.warburton.it -- this version is with trim. local function explode(div,str) if (div=='') then return false end local pos,arr = 0,{} -- for each divider found for st,sp in function return string.find(str,div,pos,true) end do		arr[#arr + 1] = trim(string.sub(str,pos,st-1)) -- Attach chars left of current divider pos = sp + 1 -- Jump past current divider end arr[#arr + 1] = trim(string.sub(str,pos)) -- Attach chars right of last divider return arr end

local getStat = function(itemid, stat) return data[itemid][stat] or data[0][stat] or nil -- "or nil" will convert "false" to "nil" end

local statname = { ["acc"] = "accessory", ["autoreuse"] = "autoReuse", ["autoswing"] = "autoReuse", ["auto"] = "autoReuse", ["axe power"] = "axe", ["axepower"] = "axe", ["bait power"] = "bait", ["baitpower"] = "bait", ["body slot"] = "bodySlot", ["bodyslot"] = "bodySlot", ["buff duration"] = "buffTime", ["buff id"] = "buffType", ["buffduration"] = "buffTime", ["buffid"] = "buffType", ["bufftime"] = "buffTime", ["bufftype"] = "buffType", ["carttrack"] = "cartTrack", ["createtile"] = "createTile", ["createwall"] = "createWall", ["critical"] = "crit", ["dd2summon"] = "DD2Summon", ["dmg"] = "damage", ["fishing power"] = "fishingPole", ["fishingpole"] = "fishingPole", ["fishingpower"] = "fishingPole", ["fishing"] = "fishingPole", ["hair dye"] = "hairDye", ["hairdye"] = "hairDye", ["hammer power"] = "hammer", ["hammerpower"] = "hammer", ["head slot"] = "headSlot", ["headslot"] = "headSlot", ["heallife"] = "healLife", ["healmana"] = "healMana", ["holdstyle"] = "holdStyle", ["id"] = "type", ["internal name"] = "internalName", ["internalname"] = "internalName", ["item id"] = "type", ["itemid"] = "type", ["kb"] = "knockBack", ["knockback"] = "knockBack", ["leg slot"] = "legSlot", ["legslot"] = "legSlot", ["liferegen"] = "lifeRegen", ["makenpc"] = "makeNPC", ["maxstack"] = "maxStack", ["mount id"] = "mountType", ["mountid"] = "mountType", ["mounttype"] = "mountType", ["mount"] = "mountType", ["nomelee"] = "noMelee", ["notammo"] = "notAmmo", ["nousegraphic"] = "noUseGraphic", ["nowet"] = "noWet", ["pick power"] = "pick", ["pickpower"] = "pick", ["pickaxe power"] = "pick", ["pickaxepower"] = "pick", ["pickaxe"] = "pick", ["placestyle"] = "placeStyle", ["projectileid"] = "shoot", ["projectile id"] = "shoot", ["questitem"] = "questItem", ["range bonus"] = "tileBoost", ["rangebonus"] = "tileBoost", ["rarity"] = "rare", ["reusedelay"] = "reuseDelay", ["shootspeed"] = "shootSpeed", ["sound"] = "UseSound", ["sounduse"] = "UseSound", ["stack"] = "maxStack", ["stringcolor"] = "stringColor", ["tile id"] = "createTile", ["tile sub id"] = "placeStyle", ["tile subid"] = "placeStyle", ["tilesubid"] = "placeStyle", ["tile wand"] = "tileWand", ["tileboost"] = "tileBoost", ["tileid"] = "createTile", ["tilewand"] = "tileWand", ["tile"] = "createTile", ["tool speed"] = "useTime", ["toolspeed"] = "useTime", ["tooltip"] = "ToolTip", ["uniquestack"] = "uniqueStack", ["use delay"] = "reuseDelay", ["use sound"] = "UseSound", ["use style"] = "useStyle", ["use time"] = "useAnimation", ["useammo"] = "useAmmo", ["useanimation"] = "useAnimation", ["usedelay"] = "reuseDelay", ["usesound"] = "UseSound", ["usestyle"] = "useStyle", ["usetime"] = "useAnimation", ["useturn"] = "useTurn", ["use"] = "useAnimation", ["velocity"] = "shootSpeed", ["wall id"] = "createWall", ["wallid"] = "createWall", ["wall"] = "createWall", ["sell"] = "value", --non-native stats: ["buy"] = "buyValue", ["price"] = "buyValue", ["buffname"] = "buffName", ["buff name"] = "buffName", ["buff"] = "buffName", ["research"] = "sacrifices" }

local proc = {} proc.axe = function(value) return currentFrame:expandTemplate{ title = 'percent', args = { tostring((value or 0) * 5) .. '%' } } end proc.bodySlot = function(value) return (value == -1) and "" or value end proc.createTile = proc.bodySlot proc.createWall = proc.bodySlot proc.damage = proc.bodySlot proc.hairDye = proc.bodySlot proc.headSlot = proc.bodySlot proc.legSlot = proc.bodySlot proc.mountType = proc.bodySlot proc.tileWand = proc.bodySlot proc.bait = function(value) return currentFrame:expandTemplate{ title = 'percent', args = { tostring(value) .. '%' } } end proc.fishingPole = proc.bait proc.hammer = proc.bait proc.pick = proc.bait proc.buffTime = function(value) return currentFrame:expandTemplate{ title = 'duration', args = { (value or 0)/60 } } end proc.buffName = function(value, id) return currentFrame:expandTemplate{ title = 'GetBuffInfo', args = { getStat(id, 'buffType'), 'ename' } } end proc.crit = function(value, id) if getStat(id, 'damage') == -1 then return currentFrame:expandTemplate{ title = 'percent', args = { tostring(value) .. '%' } } -- no damage value else return currentFrame:expandTemplate{ title = 'percent', args = { tostring(value+4) .. '%' } } -- has damage value end end proc.damagetype = function(value, id) if getStat(id, 'melee') then return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'damagetype_melee' } } end if getStat(id, 'ranged') then return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'damagetype_ranged' } } end if getStat(id, 'magic') then return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'damagetype_magic' } } end if getStat(id, 'summon') then return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'damagetype_summon' } } end if getStat(id, 'thrown') then return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'damagetype_thrown' } } end end proc.rare = function(value) return currentFrame:expandTemplate{ title = 'rare', args = { (value or 0) } } end proc.tileBoost= function(value) if value ~= 0 then if value > 0 then value = '+' .. tostring(value) else value = tostring(value) end return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'tileBoost', ['$tiles$'] = value } } end end proc.useAmmo = function(value) if value == 40 or value == 71 or value == 97 or value == 283 or value == 771 or value == 931 then return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'ammo'..tostring(value) } } end return currentFrame:expandTemplate{ title = 'itemNameFromId', args = { value } } end proc.UseSound = function(value) local str = '' for _,v in pairs(explode(',', value)) do str = str .. currentFrame:expandTemplate{ title = 'sound', args = { '', v..'.wav' } } end return str end proc.useStyle = function(value) if value == 0 then return end if value >= 1 and value <= 5 then return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'usestyle'..tostring(value) } } end return value end proc.buyValue = function(value, id) local t=getStat(id, 'shopCustomPrice') if t then return currentFrame:expandTemplate{ title = 'dm', args = { t } } else return currentFrame:expandTemplate{ title = 'coin', args = { tostring(getStat(id, 'value'))..'cc' } } end end proc.value = function(value) value = tonumber(value or 0) if value > 0 then if value < 5 then -- items with value<5 have a sell value of 1, not 0 (contrary to regular rounding) return currentFrame:expandTemplate{ title = 'coin', args = { '1cc' } } else return currentFrame:expandTemplate{ title = 'coin', args = { tostring(math.floor(value/5))..'cc' } } end else return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'noValue' } } end end

---

local p = { -- info table for other modules info = info, -- info table data for templates v = function(frame) return info.version end, maxId = function(frame) return info.IDs.max end, isValidId = function(frame) currentFrame = frame -- cache return info.IDs.isValid(tonumber(getArg(1)) or 0) and 1 or 0 end,

-- for other modules: get all stats, return them as a table getItemInfo = function(itemid) if not info.IDs.isValid(itemid) then itemid = 0 end local result = {['type'] = itemid} for k,v in pairs(data[0]) do			result[k] = v		end for k,v in pairs(data[itemid]) do			result[k] = v		end return result end,

-- for templates: get all stats, set them in dplvars getInfo = function(frame) currentFrame = frame -- cache

local itemid = tonumber(getArg('id')) or tonumber(getArg(1)) or 0 local prefix = getArg('prefix') or getArg(2) or '_iteminfo_'

if not info.IDs.isValid(itemid) then itemid = 0 end local result = {['type'] = itemid} for k,v in pairs(data[0]) do			result[k] = v		end for k,v in pairs(data[itemid]) do			result[k] = v		end

local args = {} local fields = {} for k,v in pairs(result) do args[#args + 1] = prefix .. k			args[#args + 1] = v			fields[#fields + 1] = k		end args[#args + 1] = prefix .. '_fields' args[#args + 1] = table.concat(fields, '/')

frame:callParserFunction{ name = '#dplvar:set', args = args } end,

-- for other modules: get a single stat, return it directly getItemStat = function(itemid, stat) if stat == 'count' then -- this is deprecated, p.info.IDs.max should be used directly return info.IDs.max end if not info.IDs.isValid(itemid) then itemid = 0 end if stat == 'type' then return itemid end return data[itemid][stat] or data[0][stat] end,

-- for templates: get a single stat, return it directly getStat = function(frame) currentFrame = frame -- cache

local itemid = tonumber(getArg('id')) or tonumber(getArg(1)) or 0 local stat = getArg('stat') or getArg(2) stat = statname[stat] or stat

if not stat then return end

if not info.IDs.isValid(itemid) then itemid = 0 end

local result if stat == 'type' then return itemid end if stat == 'count' then -- this is deprecated, should be used return info.IDs.max end result = getStat(itemid, stat) if not getArg('raw') and proc[stat] then result = proc[stat](result, itemid) end

if getArg('format') then result = frame:callParserFunction('formatnum', result) end

return result end, }

--alias p.getinfo = p.getInfo p.GetInfo = p.getInfo p.getstat = p.getStat p.GetStat = p.getStat

return p