WARFRAME Wiki
WARFRAME Wiki
(replacing normal links with WF template calls)
(Undo revision 2027230 by Cephalon Scientia (talk) nvm doesn't work; wiki can't call template)
Line 146: Line 146:
 
table.sort(variants)
 
table.sort(variants)
 
--First, get the basic version
 
--First, get the basic version
local thisRow = '{{WF|'..baseName.."}}"
+
local thisRow = '[['..baseName.."]]"
 
--then, if there are variants...
 
--then, if there are variants...
 
if(Shared.tableCount(variants) > 1) then
 
if(Shared.tableCount(variants) > 1) then
Line 155: Line 155:
 
if(varName ~= 'Base') then
 
if(varName ~= 'Base') then
 
if(count > 0) then thisRow = thisRow..', ' end
 
if(count > 0) then thisRow = thisRow..', ' end
thisRow = thisRow..'{{WF|'..p.buildName(baseName, varName)..'|'..varName..'}}'
+
thisRow = thisRow..'[['..p.buildName(baseName, varName)..'|'..varName..']]'
 
count = count + 1
 
count = count + 1
 
end
 
end
Line 164: Line 164:
 
else
 
else
 
for i, varName in pairs(variants) do
 
for i, varName in pairs(variants) do
table.insert(result, '{{WF|'..p.buildName(baseName, varName)..'}}')
+
table.insert(result, '[['..p.buildName(baseName, varName)..']]')
 
end
 
end
 
end
 
end

Revision as of 22:29, 17 November 2019


Lua error in Module:Docbunto at line 922: documentation markup for Docbunto not found in Module:Warframes.
Created with Docbunto

See Also

Code


local p = {}

local WarframeData = mw.loadData( 'Module:Warframes/data' )
local ConclaveData = mw.loadData( 'Module:Warframes/Conclave/data' )
local Version = require("Module:Version")
local Icon = require( "Module:Icon" )
local Weapons = require( "Module:Weapons" )
local Shared = require( "Module:Shared" )
local Ability = require( "Module:Ability" )
local UseDefaultList = {"AURAPOLARITY", "EXILUSPOLARITY", "MASTERY"}

function p.getWarframe(FrameName) --NOTE: Copied to Module:Ability. Apparently two modules can't `require` each other. That causes infinite loop.
    local warframe = WarframeData["Warframes"][FrameName]
    if warframe ~= nil and warframe.Name == FrameName then
        return warframe
    else
        for key, Warframe in Shared.skpairs(WarframeData["Warframes"]) do
            if(Warframe.Name == FrameName or key == FrameName) then
                return Warframe            
            end
        end
    end
    return nil
end

local function checkWarframe(warframe, wfName, conclave)
    if warframe == nil or type(warframe) ~= 'table' then
        if conclave then
            return p.getConclaveWarframe(wfName)
        else
            return p.getWarframe(wfName)
        end
    elseif type(warframe) == 'table' then
        return warframe
    end
end

function p.warframeExists(frame)
    local wfName = frame.args ~= nil and frame.args[1] or nil
    
    return p._warframeExists(wfName)
end

function p._warframeExists(wfName, warframe)
    local warframe = checkWarframe(warframe, wfName)
    if warframe then
        return true
    end
    if wfName == nil then
        return 'Enter warframe name.'
    elseif warframe == nil then
        return 'No warframe '..wfName..' found.'
    end
end

function p.getLink(wfName, warframe)
    local warframe = checkWarframe(warframe, wfName)
    local exists = p._warframeExists(wfName, warframe)
    if exists == true then
        local temp = warframe.Link
        if temp then
            return temp
        else
            return warframe.Name
        end
    elseif wfName == nil then
        return false
    else
        return false
    end
end

function p.getConclaveWarframe(FrameName)
    local warframe = ConclaveData["Warframes"][FrameName]
    if warframe ~= nil and warframe.Name == FrameName then
        return warframe
    else
        for key, Warframe in Shared.skpairs(ConclaveData["Warframes"]) do
            if(Warframe.Name == FrameName or key == FrameName) then
                return Warframe           
            end
        end
    end
    return nil
end

function p.isPrime(wframe)
    local frameName
    if(type(wframe) == "string") then frameName = wframe else frameName = wframe.Name end
    local baseName = string.gsub(frameName, ' Prime', '')
    if(Shared.contains(frameName, "Prime")) then
        return true, "Prime", baseName
    else
        return false, "Base", baseName
    end
end
 
function p.buildName(BaseName, Variant)
    if(Variant == nil or Variant == 'Base' or Variant == '') then
        return BaseName
    else
        return BaseName..' '..Variant
    end
end

function p.getWarframes(validateFunction)
    local wframes = {}
    for i, wframe in Shared.skpairs(WarframeData["Warframes"]) do
        if(validateFunction(wframe)) then
            table.insert(wframes, wframe)
        end
    end
    return wframes
end

--As above, but for the Conclave version
function p.getConclaveWarframes(validateFunction)
    local wframes = {}
    for i, wframe in Shared.skpairs(ConclaveData["Warframes"]) do
        if(validateFunction(wframe)) then
            table.insert(wframes, wframe)
        end
    end
    return wframes
end

--Based on the weapons version.
--The only actual variant possible is 'Prime', but should be pretty easy to fit in 'Umbra' later if needed by copying more code from the Module:Weapons equivalent.
function p.shortLinkList(Frames)
    --First grabbing all the pieces and stashing them in a table
    local baseNames = {}
    for key, wf in Shared.skpairs(Frames) do
        local isVar, varType, baseName = p.isPrime(wf.Name)
        if(baseNames[baseName] == nil) then 
            baseNames[baseName] = {} 
        end
        table.insert(baseNames[baseName], varType)
    end
 
    --Then the fun part: Pulling the table together
    local result = {}
    for baseName, variants in Shared.skpairs(baseNames) do
        --So first, check if 'Base' is in the list
        --Because if it isn't, list all variants separately
        if(Shared.contains(variants, "Base")) then
            table.sort(variants)
            --First, get the basic version
            local thisRow = '[['..baseName.."]]"
            --then, if there are variants...
            if(Shared.tableCount(variants) > 1) then
                --List them in parentheses one at a time
                thisRow = thisRow..' ('
                local count = 0
                for i, varName in pairs(variants) do
                    if(varName ~= 'Base') then
                        if(count > 0) then thisRow = thisRow..', ' end
                        thisRow = thisRow..'[['..p.buildName(baseName, varName)..'|'..varName..']]'
                        count = count + 1
                    end
                end
                thisRow = thisRow..')'
            end
            table.insert(result, thisRow)
        else
            for i, varName in pairs(variants) do
                table.insert(result, '[['..p.buildName(baseName, varName)..']]')
            end
        end
    end
    return result
end

local function getValue(Warframe, Value, giveDefault, asString)
    if(giveDefault == nil) then giveDefault = false end
    if(asString == nil) then asString = false end
    
    if Warframe == nil then
        return nil
    end
    
    ValName = string.upper(Value)
    if(ValName == "NAME") then
        if(Warframe.Name ~= nil) then
            return Warframe.Name
        else
            if (asString) then
                return ""
            else
                return nil
            end
        end
    elseif(ValName == "ARMORPLUS") then
        if(Warframe.Armor ~= nil) then
            if(asString) then
                local result = Shared.round(Warframe.Armor, 0)
                if(Warframe.ArmorRank30 ~= nil) then
                    result = result.." ("..Shared.round(Warframe.ArmorRank30, 0).." at rank 30)"
                end
                return result
            else
                return Warframe.Armor
            end
        elseif(giveDefault) then
            return 0
        else
            if (asString) then
                return ""
            else
                return nil
            end
        end
    elseif(ValName == "ARMORPLUSMINIMAL") then
        if(Warframe.Armor ~= nil) then
            if(asString) then
                local result = Shared.round(Warframe.Armor, 0)
                if(Warframe.ArmorRank30 ~= nil) then
                    result = result.." ("..Shared.round(Warframe.ArmorRank30, 0)..")"
                end
                return result
            else
                return Warframe.Armor
            end
        elseif(giveDefault) then
            return 0
        else
            if (asString) then
                return ""
            else
                return nil
            end
        end
    elseif(ValName == "ARMOR") then
        if(Warframe.Armor ~= nil) then
            return Warframe.Armor
        elseif(giveDefault) then
            return 0
        else
            if (asString) then
                return "-"
            else
                return nil
            end
        end
    elseif(ValName == "ARMORRANK30") then
        if(Warframe.ArmorRank30 ~= nil) then
            return Warframe.ArmorRank30
        elseif(Warframe.Armor ~= nil) then
            return Warframe.Armor
        elseif(giveDefault) then
            return 0
        else
            if (asString) then
                return "-"
            else
                return nil
            end
        end
    elseif(ValName == "AURAPOLARITY") then
        if(Warframe.AuraPolarity ~= nil) then
            if(asString and Warframe.AuraPolarity ~= "None") then
                return Icon._Pol(Warframe.AuraPolarity)
            else
                return Warframe.AuraPolarity
            end
        elseif giveDefault then
            return "None"
        else
            return nil
        end
    elseif(ValName == "CONCLAVE") then
        if(Warframe.Conclave ~= nil) then
            return Warframe.Conclave
        else
            if (asString) then
                return ""
            else
                return nil
            end
        end
    elseif(ValName == "ENERGYPLUS") then
        if(Warframe.Energy ~= nil) then
            if(asString) then
                local result = Shared.round(Warframe.Energy, 0)
                if(Warframe.EnergyRank30 ~= nil) then
                    result = result.." ("..Shared.round(Warframe.EnergyRank30, 0).." at rank 30)"
                else
                    result = result.." ("..Shared.round(Warframe.Energy * 1.5, 0).." at rank 30)"
                end
                return result
            else
                return Warframe.Energy
            end
        elseif(giveDefault) then
            return 0
        else
            if (asString) then
                return ""
            else
                return nil
            end
        end
    elseif(ValName == "ENERGYPLUSMINIMAL") then
        if(Warframe.Energy ~= nil) then
            if(asString) then
                local result = Shared.round(Warframe.Energy, 0)
                if(Warframe.EnergyRank30 ~= nil) then
                    result = result.." ("..Shared.round(Warframe.EnergyRank30, 0)..")"
                else
                    result = result.." ("..Shared.round(Warframe.Energy * 1.5, 0)..")"
                end
                return result
            else
                return Warframe.Energy
            end
        elseif(giveDefault) then
            return 0
        else
            if (asString) then
                return ""
            else
                return nil
            end
        end
    elseif(ValName == "ENERGY") then
        if(Warframe.Energy ~= nil) then
            return Warframe.Energy
        elseif(giveDefault) then
            return 0
        else
            if (asString) then
                return "-"
            else
                return nil
            end
        end
    elseif(ValName == "ENERGYRANK30") then
        if(Warframe.EnergyRank30 ~= nil) then
            return Warframe.EnergyRank30
        elseif(Warframe.Energy ~= nil) then
            return Shared.round(Warframe.Energy * 1.5, 0)
        elseif(giveDefault) then
            return 0
        else
            if (asString) then
                return "-"
            else
                return nil
            end
        end
    elseif(ValName == "HEALTHPLUS") then
        if(Warframe.Health ~= nil) then
            if(asString) then
                local result = Shared.round(Warframe.Health, 0)
                if(Warframe.HealthRank30 ~= nil) then
                    result = result.." ("..Shared.round(Warframe.HealthRank30, 0).." at rank 30)"
                else
                    result = result.." ("..Shared.round(Warframe.Health * 3, 0).." at rank 30)"
                end
                return result
            else
                return Warframe.Health
            end
        elseif(giveDefault) then
            return 0
        else
            if (asString) then
                return "-"
            else
                return nil
            end
        end
    elseif(ValName == "HEALTHPLUSMINIMAL") then
        if(Warframe.Health ~= nil) then
            if(asString) then
                local result = Shared.round(Warframe.Health, 0)
                if(Warframe.HealthRank30 ~= nil) then
                    result = result.." ("..Shared.round(Warframe.HealthRank30, 0)..")"
                else
                    result = result.." ("..Shared.round(Warframe.Health * 3, 0)..")"
                end
                return result
            else
                return Warframe.Health
            end
        elseif(giveDefault) then
            return 0
        else
            if (asString) then
                return "-"
            else
                return nil
            end
        end
    elseif(ValName == "HEALTH") then
        if(Warframe.Health ~= nil) then
            return Warframe.Health
        elseif(giveDefault) then
            return 0
        else
            if (asString) then
                return "-"
            else
                return nil
            end
        end
    elseif(ValName == "HEALTHRANK30") then
        if(Warframe.HealthRank30 ~= nil) then
            return Warframe.HealthRank30
        elseif(Warframe.Health ~= nil) then
            return Warframe.Health * 3
        elseif(giveDefault) then
            return 0
        else
            if (asString) then
                return "-"
            else
                return nil
            end
        end
    elseif(ValName == "EXILUSPOLARITY") then
        if(Warframe.ExilusPolarity ~= nil) then
            if(asString) then
                return Icon._Pol(Warframe.ExilusPolarity)
            else
                return Warframe.ExilusPolarity
            end
        elseif giveDefault then
            return "None"
        else
            return nil
        end
    elseif(ValName == "IMAGE") then
        if(Warframe.Image ~= nil) then
            return Warframe.Image
        elseif giveDefault then
            return "Panel.png"
        else
            return nil
        end
    elseif(ValName == "INTRODUCED") then
        if(Warframe.Introduced ~= nil) then
            local ver, num = Version.getVersion(Warframe.Introduced)
            if(ver ~= nil) then
                return Version.getVersionLink(Warframe.Introduced)
            else
                return "Unknown"
            end
        elseif giveDefault then
            return ""
        else
            return nil
        end
    elseif(ValName == "VERNUM") then
        if(Warframe.Introduced ~= nil) then
            local ver, num = Version.getVersion(Warframe.Introduced)
            if(num ~= nil) then
                return num
            else
                return -1
            end
        elseif giveDefault then
            return -1
        else
            return nil
        end
    elseif(ValName == "MASTERY") then
        if(Warframe.Mastery ~= nil) then
            return Warframe.Mastery
        elseif giveDefault then
            return 0
        else
            return nil
        end
    elseif(ValName == "MOBILITY") then
        if(Warframe.Mobility ~= nil) then
            if(asString) then
                return Shared.round(Warframe.Mobility, 2, 1)
            else
                return Warframe.Mobility
            end
        elseif giveDefault then
            return "1"
        else
            return 1
        end
    elseif(ValName == "POLARITIES") then
        if(Warframe.Polarities ~= nil) then
            if(asString) then
                return Weapons.GetPolarityString(Warframe)
            else
                return Warframe.Polarities
            end
        elseif giveDefault then
            if(asString) then
                return "None"
            else
                return {}
            end
        else
            return nil
        end
    elseif(ValName == "PORTRAIT") then
        if(Warframe.Portrait ~= nil) then
            return Warframe.Portrait
        elseif giveDefault then
            return "Panel.png"
        else
            return nil
        end
    elseif(ValName == "RELEASEDATE") then
        if(Warframe.Introduced ~= nil) then
            local relDate = Version.getVersionDate(Warframe.Introduced)
            if(relDate == nil) then 
                return "Unknown"
            else
                return relDate
            end
        else
            return "Unknown"
        end
    elseif(ValName == "SEX") then
        if(Warframe.Sex ~= nil) then
            return Warframe.Sex
        else
            return "Unknown"
        end
    elseif(ValName == "SHIELDPLUS") then
        if(Warframe.Shield ~= nil) then
            if(asString) then
                local result = Shared.round(Warframe.Shield, 0)
                if(Warframe.Shield > 0) then
                    if(Warframe.ShieldRank30 ~= nil) then
                        result = result.." ("..Shared.round(Warframe.ShieldRank30, 0).." at rank 30)"
                    else
                        result = result.." ("..Shared.round(Warframe.Shield * 3, 0).." at rank 30)"
                    end
                end
                return result
            else
                return Warframe.Shield
            end
        elseif(giveDefault) then
            return 0
        else
            if (asString) then
                return ""
            else
                return nil
            end
        end
    elseif(ValName == "SHIELDPLUSMINIMAL") then
        if(Warframe.Shield ~= nil) then
            if(asString) then
                local result = Shared.round(Warframe.Shield, 0)
                if(Warframe.Shield > 0) then
                    if(Warframe.ShieldRank30 ~= nil) then
                        result = result.." ("..Shared.round(Warframe.ShieldRank30, 0)..")"
                    else
                        result = result.." ("..Shared.round(Warframe.Shield * 3, 0)..")"
                    end
                end
                return result
            else
                return Warframe.Shield
            end
        elseif(giveDefault) then
            return 0
        else
            if (asString) then
                return ""
            else
                return nil
            end
        end
    elseif(ValName == "SHIELD") then
        if(Warframe.Shield ~= nil) then
            if(Warframe.Shield == 0 and asString) then
                return "-"
            else
                return Warframe.Shield
            end
        elseif(giveDefault) then
            return 0
        else
            if (asString) then
                return "-"
            else
                return nil
            end
        end
    elseif(ValName == "SHIELDRANK30") then
        if(Warframe.ShieldRank30 ~= nil) then
            return Warframe.ShieldRank30
        elseif(Warframe.Shield ~= nil) then
            if(Warframe.Shield == 0 and asString) then
                return "-"
            else
                return Warframe.Shield * 3
            end
        elseif(giveDefault) then
            return 0
        else
            if (asString) then
                return "-"
            else
                return nil
            end
        end
    elseif(ValName == "SPRINT") then
        if(Warframe.Sprint ~= nil) then
            if(asString) then
                return Shared.round(Warframe.Sprint, 2, 1)
            else
                return Warframe.Sprint
            end
        elseif giveDefault then
            return ""
        else
            return nil
        end
    elseif(ValName == "VAULTED") then
        if(Warframe.Vaulted ~= nil) then
            if(asString) then
                if (Warframe.Vaulted == true) then return "Yes" 
                elseif (Warframe.Vaulted == false) then return "No"
                else return tostring(Warframe.Vaulted) 
                end
            else 
                return Warframe.Vaulted 
            end
        elseif giveDefault then
            return "No"
        else
            return nil
        end
    end
end

function p.getValue(frame)
    local FrameName = frame.args[1]
    local ValName = frame.args[2]
    if(FrameName == nil) then
        return ""
    elseif(ValName == nil) then
        return "ERROR: No value selected"
    end
 
    local theFrame = p.getWarframe(FrameName)
    if(theFrame == nil) then
        return ""
    end
 
    local vName = ValName
    local useDefault = Shared.contains(UseDefaultList, string.upper(ValName))
 
    return getValue(theFrame, vName, useDefault, true)
end

--The Conclave variant
function p.getConclaveValue(frame)
    local FrameName = frame.args[1]
    local ValName = frame.args[2]
    if(FrameName == nil) then
        return ""
    elseif(ValName == nil) then
        return "ERROR: No value selected"
    end
 
    local theFrame = p.getConclaveWarframe(FrameName)
    if(theFrame == nil) then
        return ""
    end
 
    local vName = ValName
    local useDefault = Shared.contains(UseDefaultList, string.upper(ValName))
 
    return getValue(theFrame, vName, useDefault, true)
end

function getWarframeComparisonRow(wframe, useRank30)
    if(useRank30 == nil) then useRank30 = false end
    local addOn = ""
    if(useRank30) then addOn = "Rank30" end
    local styleString = ""--"border: 1px solid lightgray;"
    local td = '|| style = "'..styleString..'" |'
    local result = ''
    result = '\n|-\n| style = "'..styleString..'"|[['..wframe.Name.."]]"
    result = result..td..getValue(wframe, "Health"..addOn, false, true)
    result = result..td..getValue(wframe, "Shield"..addOn, false, true)
    result = result..td..getValue(wframe, "Energy"..addOn, false, true)
    result = result..td..getValue(wframe, "Armor"..addOn, false, true)
    result = result..td..getValue(wframe, "Sprint", false, true)
    return result
end

function getWarframeComparisonTable(Warframes, useRank30)
    local styleString = "border: 1px solid black;border-collapse: collapse;"--"background-color:transparent;color:black;border: 1px solid black;border-collapse: collapse;"
    local tHeader = ""
    tHeader = tHeader..'\n{| cellpadding="1" cellspacing="0" class="listtable sortable" style="font-size:11px;"'-- style="margin:auto;text-align:center;border:1px solid black;font-size:11px;"'
    tHeader = tHeader..'\n!style="'..styleString..'"|Name'
    tHeader = tHeader..'\n! data-sort-type="number" style="'..styleString..'"|[[Attributes#Health|Health]]'
    tHeader = tHeader..'\n! data-sort-type="number" style="'..styleString..'"|[[Attributes#Shields|Shields]]'
    tHeader = tHeader..'\n! data-sort-type="number" style="'..styleString..'"|[[Attributes#Energy|Energy]]'
    tHeader = tHeader..'\n! data-sort-type="number" style="'..styleString..'"|[[Attributes#Armor|Armor]]'
    tHeader = tHeader..'\n! data-sort-type="number" style="'..styleString..'"|[[Maneuvers#Sprinting|Sprint]]'
    local tRows = ""
    for i, wframe in Shared.skpairs(Warframes) do
        local didWork, rowStr = pcall(getWarframeComparisonRow, wframe, useRank30)
        if(didWork)then
            tRows = tRows..rowStr
        else
            mw.log("Error trying to build row for "..wframe.Name..": "..rowStr)
        end
    end
 
    return tHeader..tRows.."\n|}[[Category:Automatic Comparison Table]]"
end

function p.getWarframeComparisonTable(frame)
    return getWarframeComparisonTable(WarframeData["Warframes"])
end

function p.getWarframeRank30ComparisonTable(frame)
    return getWarframeComparisonTable(WarframeData["Warframes"], true)
end

function p.getConclaveWarframeComparisonTable(frame)
    return getWarframeComparisonTable(ConclaveData["Warframes"])
end

function p.getConclaveWarframeRank30ComparisonTable(frame)
    return getWarframeComparisonTable(ConclaveData["Warframes"], true)
end

function p.getTunaTestTable(frame)
    local iconSize = frame.args ~= nil and frame.args[1] or 64
    
    local result = '{| class="emodtable"'
    result = result..'\n|-'
    result = result..'\n! Warframe'
    result = result..'\n! x'..iconSize
    result = result..'\n! Resized Defaults'
    for i, wframe in Shared.skpairs(WarframeData["Warframes"]) do
        result = result..'\n|-'
        result = result..'\n| '..wframe.Name..' || [[File:'..string.gsub(wframe.Name, ' ', '')..'Icon'..iconSize..'.png|link=File:'..string.gsub(wframe.Name, ' ', '')..'Icon'..iconSize..'.png]]'
        if(wframe.Image ~= nil) then
            result = result..' || [[File:'..wframe.Image..'|'..iconSize..'x'..iconSize..'px|link=File:'..wframe.Image..']]'
        else
            result = result..' || <span style="color:red">No Default Image Found</span>' 
        end
    end
    result = result..'\n|}'
    return result
end
 
function p.getWarframeCount(frame)
    local count = 0
    for i, val in Shared.skpairs(WarframeData["Warframes"]) do
        if(not Shared.contains(WarframeData["IgnoreInCount"], i)) then
            count = count + 1
        end
    end
    return count
end

function p.getMasteryShortList(frame)
    local MasteryRank = tonumber(frame.args[1])
 
    local frameArray = p.getWarframes(function(x) 
                                    if(x.Mastery ~= nil) then
                                        return x.Mastery == MasteryRank
                                    else
                                        return MasteryRank == 0
                                    end
                                end)
 
    local result = ""
    local shortList = p.shortLinkList(frameArray)
    for i, pair in Shared.skpairs(shortList) do
        if(string.len(result) > 0) then result = result.." • " end
        result = result..pair
    end
    return result
end

function p.getConclaveList(frame)
    local frameArray = p.getWarframes(function(x) 
                                    if(x.Conclave ~= nil) then
                                        return x.Conclave
                                    else
                                        return false
                                    end
                                end)
 
    local result = ""
    local shortList = p.shortLinkList(frameArray)
    for i, pair in Shared.skpairs(shortList) do
        result = result..'\n* '..pair
    end
    return result
end

function p.getReleaseDateRow(warframe,prime)
    local result = '\n|-'
    result = result..'\n| [['..warframe.Name..']] || '..getValue(warframe, 'SEX')..' || '..getValue(warframe, 'RELEASEDATE')..' || '
    
    local ver, num = getValue(warframe, 'INTRODUCED')
    if(ver ~= nil) then
        result = result..'data-sort-value="'..getValue(warframe, "VERNUM")..'" | '..ver
    end
    
    if(prime) then
        result = result..' || '..getValue(warframe, "VAULTED", true, true)    
    end
    
    return result
end

function p.getReleaseDateTable(frame)
    local category = frame.args ~= nil and frame.args[1] or frame
    if(category ~= nil) then category = string.upper(category) end
    
    local prime=false
    
    local warframes = {}
    if(category == nil or category == "" or category == "ALL") then
        warframes = p.getWarframes(function(wf) return true end)
    elseif(category == "ORIGINAL") then
        warframes = p.getWarframes(function(wf) return not p.isPrime(wf) end)
    elseif(category == "PRIME") then
        warframes = p.getWarframes(function(wf) return p.isPrime(wf) end)
        prime = true
    elseif(category == "FEMALE") then
        warframes = p.getWarframes(function(wf) return wf.Sex == "Female" end)
    elseif(category == "MALE") then
        warframes = p.getWarframes(function(wf) return wf.Sex == "Male" end)
    end
    
    
    local result = '{| class="listtable sortable" style="width:100%; white-space:nowrap;" align="center"'
    result = result..'\n|-'
    result = result..'\n! data-sort-type="text" | Warframe Name<br>'
    result = result..'\n! data-sort-type="text" | Sex<br>'
    result = result..'\n! data-sort-type="date" | Release Date <small>(<i>mm-dd-yyyy</i>)</small><br>'
    result = result..'\n! data-sort-type="numeric" | Update Version<br>'
    if (prime) then result = result..'\n! data-sort-type="text" | Vaulted<br>' end
    
    for name, warframe in pairs(warframes) do
        result = result..p.getReleaseDateRow(warframe,prime)
    end
    
    result = result..'\n|}'
    return result
end

function p.tooltipText(frame)
    local wfName = frame.args ~= nil and frame.args[1] or nil
    local noIcon = frame.args["noIcon"] == "true" and true
    local conclave = frame.args["Conclave"] == "true" and true
    local dConclave = '' --"data for conclave". If there's no data for it, don't link to conclave namespace
    local conclaveParam = '' --conclave
    local linkText = ''
    local namespace = ''
    
    local warframe = checkWarframe(warframe, wfName, conclave)
    if warframe == nil and conclave == true then
        warframe = checkWarframe(warframe, wfName)
        dConclave = false
    end
    
    if warframe ~= nil then
        local link = p.getLink(wfName, warframe)
        
        if conclave == true then
            conclaveParam = ' data-param2="true"'
            if warframe.Conclave == true then
                namespace = 'Conclave:'
            end
            if dConclave == false then
                namespace = ''
            end
        end
        
        if link == wfName then
            linkText = '[['..namespace..link..'|'..link..']]'
        elseif link then
            linkText = '[['..namespace..link..'|'..wfName..']]'
        else
            linkText = '[['..namespace..wfName..'|'..wfName..']]'
        end
        
        if link ~= false then
            if not noIcon then 
                local image = warframe.Portrait
            
                if image == nil and conclave then --if no image found (not in conclave data), and conclave link -> try getting it from the regular data
                    tempWF = checkWarframe(nil, wfName)
                    image = tempWF.Portrait
                end
                if image == nil then --yet another check for the image. Showing a default icon for legit warframes without a portrait icon.
                    image = 'Warframe Icon.png'
                end
            
                return '<span class="warframe-tooltip" data-param="'..wfName..'"'..conclaveParam..' style="white-space:pre">'..'[[File:'..image..'|x19px|link='..namespace..link..']] '..linkText..'</span>'
            else
                return '<span class="warframe-tooltip" data-param="'..wfName..'"'..conclaveParam..' style="white-space:pre">'..linkText..'</span>'
            end
        else
            return '<span style="color:red;">{{[[Template:WF|WF]]}}</span> "'..wfName..'" not found[[Category:Warframe '..'Tooltip error]]'
        end
    else
        return '<span style="color:red;">{{[[Template:WF|WF]]}}</span> "'..wfName..'" not found[[Category:Warframe '..'Tooltip error]]'
    end
end

function p.tooltip(frame)
    local wfName = frame.args ~= nil and frame.args[1]
    local conclave = frame.args[2] == "true" and true
    
    if wfName == nil then
        return nil
    end
    
    local warframe = nil
    local cAvailability = false
    if conclave then
        warframe = p.getConclaveWarframe(wfName)
        if warframe ~= nil then
            cAvailability = warframe.Conclave
        end
        if not cAvailability then
            warframe = p.getWarframe(wfName)
        end
    else
        warframe = p.getWarframe(wfName)
    end
    
    local conclaveNotice = ''
    if conclave and cAvailability == false then
        conclaveNotice = '\n{| class="Data" style="font-size:10px; white-space:normal;"\n|-\n|Note: Not available in Conclave, displaying Cooperative stats and Cooperative Link.\n|}'
    end
    
    if warframe == nil then
        return 'No warframe '..wfName..' found.'
    end
    
    local function Value(valueName, giveDefault, asString)
        if(giveDefault == nil) then giveDefault = true end
        if(asString == nil) then asString = false end
        return getValue(warframe, valueName, giveDefault, asString)
    end
    
    local function whitePols(valueName)
        local pols = Value(valueName)
        local polIcon = ''
        
        if type(pols) == "table" then
            local i = 0
            if pols[1] == nil then
                polIcon = 'None'
                return polIcon
            else
                while pols[i+1] ~= nil do
                    i = i + 1
                end
                for j = 1, i do
                    polIcon = polIcon..Icon._Pol(pols[j],'white','x16')
                end
                return polIcon
            end
        elseif pols ~= nil and type(pols) == "string" and pols ~= "None" then
            return Icon._Pol(pols,'white','x16')
        end
        return 'None'
    end
    
    local mRankIcon = ''
    local mRank = Value("Mastery")
    local mRankIconLoc = 'top:4px; left:9.5px;'
    if mRank then
        if string.len(mRank) >= 2 then
            mRankIconLoc = 'top:4px; left:5px;'
        end
        mRankIcon = '<div style="position:absolute;top:6px; left:4px; color:white; font-size:16px; font-weight:bold; text-shadow: 0 0 1px #0D1B1C, 0 0 4px #0D1B1C, 1px 1px 2px #0D1B1C, -1px 1px 2px #0D1B1C, 1px -1px 2px #0D1B1C, -1px -1px 2px #0D1B1C;">[[File:MasteryAffinity64.png|28px]]<div style="position:absolute;'..mRankIconLoc..'">'..mRank..'</div></div>'
    end
    
    local function infoHeader(infoName)
        local spanStart = '<span class=\"LinkText\">'
        local spanEnd = '</span>'
        return spanStart..infoName..spanEnd
    end
    
    local space = '&nbsp;'
    local zeroPadding = '\n| style=\"padding:0px;\" |'
    local newRow = '\n|-'
    local spacer = '\n| class=\"Spacer\" |'
    local halfTable = '\n| class=\"TableHalf\" |'
    local dataText = '\n{| class=\"Data\" style=\"font-size:12px;\"'
    local dataTextCenter = '\n{| class=\"Data\" style=\"font-size:12px; text-align:center;\"'
    local tableEnd = '\n|}'
    
    local portrait = warframe.Portrait
    if portrait == nil and conclave == true then
        tempWF = p.getWarframe(wfName)
        portrait = tempWF.Portrait
    end
    if portrait == nil then
        portrait = 'Warframe Icon.png'
    end
    local image = '\n| class=\"Image\" style=\"height:120px; padding-bottom:0;\" | [[File:'..portrait..'|120px]]'
    
    --creating the table
    local result = '{| class="Tooltip"\n|-\n|style="padding:0;"|\n<div style="position:relative;">\n{| class=\"Sub\"'..newRow..image..mRankIcon..newRow..spacer..newRow..zeroPadding
    result = result..dataText..newRow
    result = result..halfTable..infoHeader("Health")..space..Value("HealthPlusMinimal",true,true)..halfTable..infoHeader("Armor")..space..Value("ArmorPlusMinimal",true,true)
    result = result..newRow..halfTable..infoHeader("Shield")..space..Value("ShieldPlusMinimal",true,true)..halfTable..infoHeader("Energy")..space..Value("EnergyPlusMinimal",true,true)
    result = result..newRow..'\n| style=\"text-align:center;\" colspan=2 |'..infoHeader("Polarities")..space..whitePols("AuraPolarity")..' | '..whitePols("ExilusPolarity")..' | '..whitePols("Polarities")..tableEnd
    result = result..newRow..spacer..newRow..zeroPadding
    result = result..dataText..newRow
    result = result..'\n| class="Data" style="padding:4px; text-align:left;"|'..Ability.getAbilityIconsList(wfName)
    result = result..tableEnd..conclaveNotice..tableEnd..'\n</div>\n|}'
    
    return result
end

function p.getWarframeReplaceList(frame)
    --local Type = frame.args ~= nil and frame.args[1] or frame
    local fullList = {}
    
    --local avoidNames ={'Exalted Blade (Umbra)','Corvas (Atmosphere)','Cyngas (Atmosphere)','Dargyn','Dual Decurion (Atmosphere)','Fluctus (Atmosphere)','Grattler (Atmosphere)','Imperator (Atmosphere)','Imperator Vandal (Atmosphere)','Phaedra (Atmosphere)','Rampart','Velocitus (Atmosphere)'}
    
    local function addToList(name)
        --local 6s = '      '
        --local 8s = '        '
        local temp = '      <Replacement>\n        <Find>\[\['..name..']]</Find>\n        <Replace>{{Warframe|'..name..'}}</Replace>\n        <Comment />\n        <IsRegex>false</IsRegex>\n        <Enabled>true</Enabled>\n         <Minor>false</Minor>\n        <BeforeOrAfter>false</BeforeOrAfter>\n        <RegularExpressionOptions>IgnoreCase</RegularExpressionOptions>\n      </Replacement>'
        return table.insert(fullList,temp)
    end
    
    for i, val in Shared.skpairs(WarframeData["Warframes"]) do
        if not Shared.contains(avoidNames,val.Name) then
            
            addToList(val.Name)
        end
    end

    return table.concat(fullList, "\n")
end

return p