Module:Equipinfo

local l10nReplace = require('Module:Localization/test').go

local trim = mw.text.trim local cargo = mw.ext.cargo

local currentFrame local args_table local lang local l10n_table

local debugStr = ''

local l10n = function(key, args) local str = currentFrame:expandTemplate{ title = 'localization', args = { 'getEquipInfo', key } } return l10nReplace(str, args) end

local getArg = function(key) local value = args_table[key] if not value then return nil end value = trim(value) if value == '' then return nil end return value 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 function round(x, dec) local factor = 10^(dec or 0) return math.floor(x * factor + 0.5) / factor end

local function statList return 'ccdryLight, cciceBarrier, ccwetLight, accCalendar, accCompass, accCritterGuide, accDepthMeter, accDivingHelm, accDreamCatcher, accFishFinder, accFishingLine, accFlipper, accJarOfSouls, accLavaFishing, accMerman, accOreFinder, accRunSpeed, accStopwatch, accTackleBox, accThirdEye, accWatch, accWeatherRadio, aggro, ammoCost75, ammoCost80, arcticDivingGear, armorPenetration, arrowDamage, autoActuator, autoJump, autoPaint, autoReuseGlove, blackBelt, blockRange, boneGlove, brainOfConfusion, buffImmune, bulletDamage, canFloatInWater, CanSeeInvisibleBlocks, carpet, chloroAmmoCost80, cordage, counterWeight, dashType, dd2Accessory, desertBoots, discount, empressBrooch, endurance, equippedAnyTileRangeAcc, equippedAnyTileSpeedAcc, equippedAnyWallSpeedAcc, extraFall, fireWalk, fishingSkill, flowerBoots, frogLegJumpBoost, goldRing, gravControl2, hasCreditsSceneMusicBox, hasJumpOption_Blizzard, hasJumpOption_Cloud, hasJumpOption_Fart, hasJumpOption_Sail, hasJumpOption_Sandstorm, hasLuckyCoin, hasMoltenQuiver, hasPaladinShield, huntressAmmoCost90, iceSkate, InfoAccMechShowWires, jumpBoost, jumpSpeedBoost, kbGlove, killClothier, killGuide, lavaMax, lavaRose, lifeRegen, longInvince, magicCrit, magicCuffs, magicDamage, magicQuiver, magmaStone, manaCost, manaFlower, manaMagnet, manaRegenBonus, manaRegenDelayBonus, maxMinions, maxTurrets, meleeCrit, meleeDamage, meleeScaleGlove, meleeSpeed, minionDamage, minionKB, moonLordLegs, moveSpeed, nightVision, noFallDmg, noKnockback, npcTypeNoAggro, panic, pickSpeed, pStone, rangedCrit, rangedDamage, releaseBeesWhenHurt, rocketBoots, rocketDamage, rulerGrid, rulerLine, scope, shinyStone, skyStoneEffects, slowFall, spikedBoots, sporeSac, starCloak, starCloakIsBeeCloak, starCloakIsManaCloak, starCloakIsStarVeil, statManaMax2, strongBees, tileRangeX, tileRangeY, treasureMagnet, volatileGelatin, waterWalk, waterWalk2, wolfAcc, yoyoGlove, yoyoString' --	currentFrame:expandTemplate{ title = 'getEquipInfo/db', args = {} }	return currentFrame:callParserFunction{ name = ' end

local function formatStat(statvalues, stat) -- format stat, for l10n key local statFormatted = '' if stat == 'accWatch' or stat == 'dashType' or stat == 'rocketBoots' then statFormatted = 'stat_' .. stat .. '-' .. value else statFormatted = 'stat_' .. stat end -- format value local value = statvalues[stat] if value == nil then return { statFormatted = statFormatted, valueFormatted = { 'foo' } } end local valueFormatted = {} if stat == 'accRunSpeed' then -- pixels/tick → tiles/sec local tps = round(value * 3.75, 2) local mph = currentFrame:expandTemplate{ title = 'mph', args = { tps, 'tiles'} } valueFormatted = { tps, mph } elseif stat == 'buffImmune' then -- buff id → name local valueList = explode('¤', value) for i, buffId in ipairs(valueList) do			valueList[i] = currentFrame:expandTemplate{ title = 'exclusive icon link', args = { currentFrame:expandTemplate{ title = 'buffNameFromId', args = { buffId, lang='en' } } } } end valueFormatted = { table.concat(valueList, ', '), #valueList } elseif stat == 'counterWeight' then -- projectile id → name local valueList = explode('¤', value) for i, projectileId in ipairs(valueList) do			valueList[i] = currentFrame:expandTemplate{ title = 'exclusive icon link', args = { currentFrame:expandTemplate{ title = 'projectileNameFromId', args = { projectileId, lang='en' } } } } end valueFormatted = { table.concat(valueList, ', '), #valueList } elseif stat == 'desertBoots' then -- pixels/tick → tiles/sec local tps = round(statvalues['accRunSpeed'] * 1.75 * 3.75, 2) local mph = currentFrame:expandTemplate{ title = 'mph', args = { tps, 'tiles'} } valueFormatted = { tps, mph } elseif stat == 'lavaMax' then -- ticks → valueFormatted = { currentFrame:expandTemplate{ title = 'duration', args = { value/60 } } } elseif stat == 'lifeRegen' then -- half valueFormatted = value/2 elseif stat == 'magicDamage' or stat == 'meleeDamage' or stat == 'minionDamage' or stat == 'rangedDamage' or stat == 'arrowDamage' or stat == 'bulletDamage' or stat == 'rocketDamage' or stat == 'meleeSpeed' or stat == 'moveSpeed' or stat == 'pickSpeed' or stat == 'manaCost' or stat == 'endurance' then -- decimal → valueFormatted = { currentFrame:expandTemplate{ title = 'percent', args = { round(value*100, 2) .. '%' } } }	elseif stat == 'magicCrit' or stat == 'meleeCrit' or stat == 'rangedCrit' or stat == 'fishingSkill' then -- 		valueFormatted = { currentFrame:expandTemplate{ title = 'percent', args = { value .. '%' } } }	elseif stat == 'npcTypeNoAggro' then -- npc id → name local valueList = explode('¤', value) for i, npcId in ipairs(valueList) do			valueList[i] = currentFrame:expandTemplate{ title = 'exclusive icon link', args = { currentFrame:expandTemplate{ title = 'npcNameFromId', args = { npcId, lang='en' } } } } end valueFormatted = { table.concat(valueList, ', '), #valueList } else -- no format valueFormatted = { value } end return { statFormatted = statFormatted, valueFormatted = valueFormatted } end

local function formatSingleStat(statvalues, stat) formatted = formatStat(statvalues, stat) return formatted['valueFormatted'][1] end

local function formatStatList(statvalues) -- remove individual damage/crit stats if we have allDamage/allCrit if statvalues['allDamage'] ~= nil or statvalues['allCrit'] ~= nil then for stat, _ in pairs(statvalues) do			local isDamage = stat == 'magicDamage' or stat == 'meleeDamage' or stat == 'minionDamage' or stat == 'rangedDamage' local isCrit = stat == 'magicCrit' or stat == 'meleeCrit' or stat == 'rangedCrit' if (statvalues['allDamage'] ~= nil and isDamage) or (statvalues['allCrit'] ~= nil and isCrit) then statvalues[stat] = nil -- remove end end end for stat, value in pairs(statvalues) do		formatted = formatStat(statvalues, stat) if formatted['valueFormatted'][2] == nil or formatted['valueFormatted'][2] == '' then if value:sub(1, 2) ~= '-' then formatted['valueFormatted'][2] = 'y'			end vF1sub = formatted['valueFormatted'][1]:sub(1, 2) if vF1sub == '-' or vF1sub == '+' then formatted['valueFormatted'][1] = formatted['valueFormatted'][1]:sub(2) end end statvalues[stat] = table.concat({ formatted['statFormatted'], formatted['valueFormatted'][1], formatted['valueFormatted'][2] }, '§§') --l10n(formatted['statFormatted'], { data1 = formatted['valueFormatted'][1], data2 = formatted['valueFormatted'][2] } ) end local str = '' for _, statStr in pairs(statvalues) do str = str .. '' .. statStr .. '' end if str ~= '' then return '' .. str .. '' end return '' end

- -- main return object return {

go = function(frame) -- init cache currentFrame = frame args_table = frame.args lang = getArg('lang') or 'en'

local queryStat = getArg('queryStat') local queryItemId = getArg('queryItemId') local outputMode = getArg('outputMode') local statList = statList local queryItemIdList = queryItemId:gsub('/', ',') local result = cargo.query('Equipinfo', statList, { where = 'itemid IN (' .. queryItemIdList .. ')' } )	if result == nil then return end local statvalues = {} for _, row in ipairs(result) do		for stat, value in pairs(row) do			if value ~= '' then if statvalues[stat] ~= nil then statvalues[stat] = statvalues[stat] + value else statvalues[stat] = value end end end end -- pre-process local allDamageSet = statvalues['magicDamage'] ~= nil and statvalues['meleeDamage'] ~= nil and statvalues['minionDamage'] ~= nil and statvalues['rangedDamage'] ~= nil if allDamageSet and statvalues['magicDamage'] == statvalues['meleeDamage'] and statvalues['meleeDamage'] == statvalues['minionDamage'] and statvalues['minionDamage'] == statvalues['rangedDamage'] then statvalues['allDamage'] = statvalues['magicDamage'] end local allCritSet = statvalues['magicCrit'] ~= nil and statvalues['meleeCrit'] ~= nil and statvalues['rangedCrit'] ~= nil if allCritSet and statvalues['magicCrit'] == statvalues['meleeCrit'] and statvalues['meleeCrit'] == statvalues['rangedCrit'] then statvalues['allCrit'] = statvalues['magicCrit'] end if statvalues['equippedAnyTileRangeAcc'] then if statvalues['tileRangeX'] ~= nil then statvalues['tileRangeX'] = statvalues['tileRangeX'] + 3 else statvalues['tileRangeX'] = 3 end if statvalues['tileRangeY'] ~= nil then statvalues['tileRangeY'] = statvalues['tileRangeY'] + 2 else statvalues['tileRangeY'] = 2 end end local outputStr = '' if outputMode == 'raw' then outputStr = statvalues[queryStat] elseif outputMode == 'singlestat' then outputStr = formatSingleStat(statvalues, queryStat) elseif outputMode == 'listraw' then local str = '' for stat, value in pairs(statvalues) do str = str .. stat .. ':' .. value .. ';'		end outputStr = str elseif outputMode == 'list' then outputStr = formatStatList(statvalues) end return '' .. debugStr .. ' ' .. outputStr end, }