Module:Equipinfo

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

local currentFrame local args_table local lang local l10n_table

local isDebug local debugStr = ''

local l10n = function(key, data1, data2) return currentFrame:expandTemplate{ title = 'localization/long', args = { 'getEquipInfo', key, calledFromModule = true, __data1 = data1, __data2 = data2 } } 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 formatStatValue(statvalues, stat) -- format value local value = statvalues[stat] if value == nil or value == '' then return { nil } end if stat == 'accRunSpeed' then -- pixels/tick → tiles/sec local tps = round(value * 3.75, 2) local mph = currentFrame:expandTemplate{ title = 'mph', args = { tps .. 'tiles' } } return { 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 return { 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 return { 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' } } return { tps, mph } elseif stat == 'lavaMax' then -- ticks → return { currentFrame:expandTemplate{ title = 'duration', args = { value/60 } } } elseif stat == 'lifeRegen' then -- half return value/2 elseif stat == 'allDamage' or 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 → return { currentFrame:expandTemplate{ title = 'percent', args = { round(value*100, 2) .. '%' } } }	elseif stat == 'allCrit' or stat == 'magicCrit' or stat == 'meleeCrit' or stat == 'rangedCrit' or stat == 'fishingSkill' then -- 		return { 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 return { table.concat(valueList, ', '), #valueList } end -- no format return { value } 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 return { statFormatted = statFormatted, valueFormatted = formatStatValue(statvalues, stat) } end

local function formatSingleStat(statvalues, stat) local 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		local formatted = formatStat(statvalues, stat) if formatted['valueFormatted'][2] == nil or formatted['valueFormatted'][2] == '' then if tostring(value):sub(1, 1) ~= '-' then formatted['valueFormatted'][2] = true else formatted['valueFormatted'][2] = '' end local vF1firstChar = tostring(formatted['valueFormatted'][1]):sub(1, 1) if vF1firstChar == '-' or vF1firstChar == '+' then formatted['valueFormatted'][1] = tostring(formatted['valueFormatted'][1]):sub(2) end end if isDebug then statvalues[stat] = table.concat({ formatted['statFormatted'], formatted['valueFormatted'][1], formatted['valueFormatted'][2] }, '§§') statvalues[stat] = statvalues[stat] .. ' – ' .. l10n(formatted['statFormatted'], formatted['valueFormatted'][1], formatted['valueFormatted'][2]) else statvalues[stat] = l10n(formatted['statFormatted'], formatted['valueFormatted'][1], formatted['valueFormatted'][2]) end 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 isDebug = getArg('debug') local statList = statList local queryItemIdList = queryItemId:gsub('/', ',') local result = cargo.query('Equipinfo__NEXT', statList, { where = 'itemid IN (' .. queryItemIdList .. ')' } )	if result == nil then return end local statvalues = {} -- store the cargo result to statvalues table for _, row in ipairs(result) do		for stat, value in pairs(row) do			if value ~= '' then local doNotAdd = true local valueFirstChar = tostring(value):sub(1, 1) if statvalues[stat] ~= nil then doNotAdd = valueFirstChar ~= '+' and valueFirstChar ~= '-' -- if value starts with +/-, then do perform addition/subtraction end if valueFirstChar == '+' then value = value:sub(2) -- strip plus sign end if doNotAdd then statvalues[stat] = value else statvalues[stat] = 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 if isDebug then outputStr = '(debug start)' .. debugStr .. '(debug end) ' .. outputStr end return outputStr end, }