• Welcome to the Kancolle Wiki!
  • If you have any questions regarding site content, account registration, etc., please visit the KanColle Wiki Discord

Changes

Jump to navigation Jump to search
another item attempt. doesn't work. revert if needed.
Line 3: Line 3:  
local Equipment = require("Module:Equipment")
 
local Equipment = require("Module:Equipment")
 
local Iterator = require("Module:Iterator")
 
local Iterator = require("Module:Iterator")
local ShipIterator = require("Module:ShipIterator")
   
local ShipCapabilities = require("Module:ShipCapabilities")
 
local ShipCapabilities = require("Module:ShipCapabilities")
 
local ShipCardKai = require("Module:ShipCardKai")
 
local ShipCardKai = require("Module:ShipCardKai")
Line 10: Line 9:  
local EquipmentCardKai = require("Module:EquipmentCardKai")
 
local EquipmentCardKai = require("Module:EquipmentCardKai")
 
local EquipmentGraphicKai = require("Module:EquipmentGraphicKai")
 
local EquipmentGraphicKai = require("Module:EquipmentGraphicKai")
local EquipmentCollection = require("Module:Collection/Equipment")
+
local EquipmentCollection = require("Module:Data/Equipment")
local AllEquipmentCollection = require("Module:Collection/EquipmentByApiId")
+
local ItemCollection = require('Module:Collection/Items')
 +
-- local AllEquipmentCollection = require("Module:Collection/EquipmentByApiId")
 
local Development = require("Module:Development")
 
local Development = require("Module:Development")
 
local ShipsByApiId = require("Module:Collection/ShipsByApiId")
 
local ShipsByApiId = require("Module:Collection/ShipsByApiId")
 +
local Ship = require("Module:Ship")
    
local args = nil
 
local args = nil
local Ship = nil
+
-- local Ship = nil
 
local ship = nil
 
local ship = nil
 
local shipCapabilities = {}
 
local shipCapabilities = {}
 
local target = nil
 
local target = nil
 
local equipment = nil
 
local equipment = nil
local filterArg = {}
  −
local sorted = false
   
local sequence = nil
 
local sequence = nil
 
local sequence_length = nil
 
local sequence_length = nil
 
local sequence_position = nil
 
local sequence_position = nil
local env = {}
+
-- local sorted = false
local implicitTrigger = true
+
-- local env = {}
    
local enumerating_functions = {
 
local enumerating_functions = {
 
     args = function() return mw.text.split(args.args, "%s*,%s*") end,
 
     args = function() return mw.text.split(args.args, "%s*,%s*") end,
     base_names = function() return ShipIterator.baseForms end,
+
     base_names = function() return require('Module:Collection/ShipsBase') end,
     all_names = function() return ShipIterator.allForms end,
+
     all_names = function() return require('Module:Collection/Ships') end,
     enemy = function() return ShipIterator.enemyForms end,
+
    remodel_names = function()
     equipment = function() return U.imap(EquipmentCollection, function(e) return e._name end) end,
+
    local all_names = require('Module:Collection/Ships')
 +
    local base_names = require('Module:Collection/ShipsBase')
 +
    local result = {}
 +
    for _, name in ipairs(all_names) do
 +
    if not U.includes(base_names, name) then
 +
    local ship = Ship(name)
 +
    if ship._implementation_date then
 +
    table.insert(result, name)
 +
    end
 +
    end
 +
    end
 +
    return result
 +
    end,
 +
     enemy = function() return require('Module:Collection/EnemyShips') end,
 +
     equipment = function()
 +
    equipment = true
 +
    return U.imap(EquipmentCollection, function(e) return e._name end)
 +
    end,
 +
    item = function()
 +
    item = true
 +
    return U.imap(ItemCollection, function(e) return e._name end)
 +
    end,
 +
    --[[
 
     allEquipment = function()
 
     allEquipment = function()
 +
    equipment = true
 
         local result = {}
 
         local result = {}
 
         for i = 1, 700 do
 
         for i = 1, 700 do
Line 45: Line 67:  
     end,
 
     end,
 
     enemyEquipment = function()
 
     enemyEquipment = function()
 +
    equipment = true
 
         local result = {}
 
         local result = {}
 
         for i = 501, 700 do
 
         for i = 501, 700 do
Line 53: Line 76:  
         return result
 
         return result
 
     end,
 
     end,
 +
    ]]--
 
}
 
}
   Line 103: Line 127:  
     end,
 
     end,
 
     code = function(obj) return equipment and Formatting:format_equipment_type(obj:type()) or Formatting:format_ship_code(obj:type()) end,
 
     code = function(obj) return equipment and Formatting:format_equipment_type(obj:type()) or Formatting:format_ship_code(obj:type()) end,
 +
    code_link = function(obj) return string.format("[[%s]]", Formatting:format_ship_code(obj:type())) end,
 
     type = function(obj) return equipment and Formatting:format_equipment_type(obj:type()) or Formatting:format_ship_type(obj:type()) end,
 
     type = function(obj) return equipment and Formatting:format_equipment_type(obj:type()) or Formatting:format_ship_type(obj:type()) end,
 
     icon = function(obj)
 
     icon = function(obj)
Line 112: Line 137:  
             end
 
             end
 
         else
 
         else
             return obj.icon and ([[<span data-sort-value="]] .. (obj._type or '0') .. [=[">[[File:]=] .. Formatting:format_equipment_icon(obj:icon()) .. "]]</span>") or ''
+
        return obj.icon and ([=[[[File:]=] .. Formatting:format_equipment_icon(obj:icon()) .. "]]") or ''
 +
             -- return obj.icon and ([[<span data-sort-value="]] .. (obj._type or '0') .. [=[">[[File:]=] .. Formatting:format_equipment_icon(obj:icon()) .. "]]</span>") or ''
 
         end
 
         end
 
     end,
 
     end,
 
     icon_damaged = function(obj) return string.format("[[File:Ship Icon %s Damaged.png|100px]]", obj:name()) end,
 
     icon_damaged = function(obj) return string.format("[[File:Ship Icon %s Damaged.png|100px]]", obj:name()) end,
     link = function(obj)
+
     link = function(obj) return string.format("[[%s]]", equipment and obj:name() or obj:unique_name()) end,
        if obj._dummy then
  −
            local link = ShipsByApiId[obj._api_id]
  −
            if link then
  −
                link = link:gsub('/', ' ')
  −
            end
  −
            return link and Formatting:format_link(link) or ''
  −
        else
  −
            return Formatting:format_link(obj:link())
  −
        end
  −
    end,
   
     class = function(ship) return ship:class() and ship:class():name() or "?" end,
 
     class = function(ship) return ship:class() and ship:class():name() or "?" end,
 
     implementation_date = function(ship)
 
     implementation_date = function(ship)
Line 140: Line 156:  
     card = function(obj)
 
     card = function(obj)
 
     if not obj or not obj.lua_name then
 
     if not obj or not obj.lua_name then
     return ' '
+
     if equipment then --attempted to stop equipment from being filtered out, as equip cards weren't showing up. Don't know if this only works for equip and if I broke the original funtion's intention. This may not work at filtering out errors -chocolatecravinghobo
 +
    else
 +
    return ' '
 +
    end
 
     end
 
     end
 
         if obj.hp then
 
         if obj.hp then
Line 177: Line 196:  
         end
 
         end
 
     end,
 
     end,
     scrap = function(eq)
+
     scrap_string = function(eq)
 
         local scrap = eq:scrap()
 
         local scrap = eq:scrap()
 
         return string.format("%s/%s/%s/%s", scrap.fuel or 0, scrap.ammo or 0, scrap.steel or 0, scrap.bauxite or 0)
 
         return string.format("%s/%s/%s/%s", scrap.fuel or 0, scrap.ammo or 0, scrap.steel or 0, scrap.bauxite or 0)
Line 184: Line 203:  
     development_rate = function(eq) return Development.formatRates(eq) end,
 
     development_rate = function(eq) return Development.formatRates(eq) end,
 
     development_hq = function(eq) return Development.formatHQ(eq) end,
 
     development_hq = function(eq) return Development.formatHQ(eq) end,
     backMinusRarity = function(ship) return ship:back() - ship:rarity() end,
+
     backMinusRarity = function(ship) return (ship:back() or 0) - (ship:rarity() or 0) end,
 
     rarity_bg = function(ship)
 
     rarity_bg = function(ship)
 
         return string.format('style="background:%s"|%s<br>%s', Formatting:format_ship_back(ship:rarity()), ship:rarity() or '??', Formatting:format_ship_rarity(ship:rarity()))
 
         return string.format('style="background:%s"|%s<br>%s', Formatting:format_ship_back(ship:rarity()), ship:rarity() or '??', Formatting:format_ship_rarity(ship:rarity()))
Line 190: Line 209:  
     back_bg = function(ship)
 
     back_bg = function(ship)
 
         return string.format('style="background:%s"|%s<br>%s', Formatting:format_ship_back(ship:back()), ship:back() or '??', Formatting:format_ship_rarity(ship:back()))
 
         return string.format('style="background:%s"|%s<br>%s', Formatting:format_ship_back(ship:back()), ship:back() or '??', Formatting:format_ship_rarity(ship:back()))
 +
    end,
 +
    same_day_remodel_links = function(ship)
 +
    local result = { string.format("[[%s]]", ship:name()) }
 +
    local visited = {}
 +
visited[ship:name()] = true
 +
    while true do
 +
    local next = ship:remodel_to()
 +
    if not next then break end
 +
    ship = Ship(next)
 +
    if ship._implementation_date then break end
 +
    if visited[ship:name()] then break end
 +
    visited[ship:name()] = true
 +
    table.insert(result, string.format("[[%s]]", ship:name()))
 +
    end
 +
    return table.concat(result, ", ")
 
     end,
 
     end,
 
}
 
}
    +
--[[
 
local function addFormattingFunctions(name, table)
 
local function addFormattingFunctions(name, table)
 
     for k, v in pairs(table) do
 
     for k, v in pairs(table) do
Line 201: Line 236:  
addFormattingFunctions("FitData", require("Module:CalcFit"))
 
addFormattingFunctions("FitData", require("Module:CalcFit"))
 
addFormattingFunctions("Assets", require("Module:CalcAsset"))
 
addFormattingFunctions("Assets", require("Module:CalcAsset"))
 +
]]--
    
local function format_value(key, ship, target)
 
local function format_value(key, ship, target)
    local formatting_function = formatting_functions[key]
+
local keys = mw.text.split(key, "%s*%.%s*")
    if formatting_function then
+
local result = ship
        return formatting_function(ship, target)
+
for _, key in ipairs(keys) do
    end
+
    local formatting_function = formatting_functions[key]
    if shipCapabilities[key] then
+
    if formatting_function then
        local a, b = shipCapabilities[key](shipCapabilities)
+
        result = formatting_function(result, target)
        return format_lua(b or a)
+
    else
    end
+
    local lua = result[key] or result['_' .. key]
    if ship then
+
    if type(lua) == "function" then
        local lua = ship[key]
+
        result = lua(result)
        if type(lua) == "function" then
+
    else
            return format_lua(lua(ship))
+
        result = lua
        else
+
    end
            return format_lua(lua)
+
    end
        end
+
if type(result) ~= 'table' then
    end
+
return format_lua(result)
 +
end
 +
    --[[
 +
    if shipCapabilities[key] then
 +
        local a, b = shipCapabilities[key](shipCapabilities)
 +
        return format_lua(b or a)
 +
    end
 +
    ]]--
 +
end
 +
return format_lua(result)
 
end
 
end
   Line 225: Line 270:  
end
 
end
    +
--[[
 
local function interpret_setter(s)
 
local function interpret_setter(s)
 
     local kv = mw.text.split(s, "%s*~%s*")
 
     local kv = mw.text.split(s, "%s*~%s*")
Line 268: Line 314:  
end
 
end
   −
local function trigger(implicit)
+
local function trigger()
implicitTrigger = implicit
   
     local ship_key = sequence[sequence_position]
 
     local ship_key = sequence[sequence_position]
    ship_key = tonumber(ship_key) or ship_key
   
     sequence_position = sequence_position + 1
 
     sequence_position = sequence_position + 1
 
     ship = Ship(ship_key)
 
     ship = Ship(ship_key)
Line 286: Line 330:  
     local prefix = string.sub(arg, 1, 1)
 
     local prefix = string.sub(arg, 1, 1)
 
     local prefix2 = string.sub(arg, 1, 2)
 
     local prefix2 = string.sub(arg, 1, 2)
     if arg == "_" then
+
     if arg == "-" then return format_arg("")
        return false
+
elseif arg == "!@" then trigger(false)
    elseif arg == "-" then
  −
        return format_arg("")
  −
    elseif prefix == "~" then
  −
    table.insert(filterArg, string.sub(arg, 2))
  −
    elseif prefix == "@" then
  −
        local enumerator = string.sub(arg, 2)
  −
        local enumerating_function = enumerating_functions[enumerator]
  −
        if enumerating_function and not sequence then
  −
            sequence = enumerating_function()
  −
            sequence_position = 1
  −
            sequence_length = #sequence
  −
        elseif not sequence then
  −
            local buildIterator = Iterator[enumerator]
  −
            if buildIterator then
  −
                sequence = {}
  −
                sequence_position = 1
  −
                local iterator = buildIterator(args)
  −
                while iterator.next() do
  −
                    table.insert(sequence, iterator.current())
  −
                end
  −
                sequence_length = #sequence
  −
            end
  −
        end
  −
        if args.sort and sequence and not sorted then
  −
        sorted = true
  −
        local sorts = mw.text.split(args.sort, "%s*,%s*")
  −
        table.sort(sequence, function(a, b)
  −
        local a = Ship(a)
  −
        local b = Ship(b)
  −
        for _, sort in ipairs(sorts) do
  −
      local x = a[sort](a)
  −
      local y = b[sort](b)
  −
      if x < y then return true end
  −
      if x > y then return false end
  −
        end
  −
return false
  −
end)
  −
        end
  −
    elseif arg == "!@" then
  −
trigger(false)
   
     elseif prefix2 == "!!" then
 
     elseif prefix2 == "!!" then
 
         local key = string.sub(arg, 3)
 
         local key = string.sub(arg, 3)
Line 355: Line 359:  
     elseif prefix == "#" and args.format == "table" then
 
     elseif prefix == "#" and args.format == "table" then
 
         return "|-\n"
 
         return "|-\n"
     elseif prefix == "?" then
+
     if prefix == "?" then
    if implicitTrigger and sequence then
  −
    trigger(true)
  −
    end
   
         local prefix2 = string.sub(arg, 1, 2)
 
         local prefix2 = string.sub(arg, 1, 2)
         if prefix2 == "??" then
+
         if prefix2 == "??" then return format_arg(format_value(string.sub(arg, 3), target, ship))
            return format_arg(format_value(string.sub(arg, 3), target, ship))
+
         elseif prefix2 == "?#" then return "?# is unimplemented" -- frame:preprocess(format{string.sub(arg, 3), this = env[this] or ""})
         elseif prefix2 == "?#" then
  −
            return "?# is unimplemented" -- frame:preprocess(format{string.sub(arg, 3), this = env[this] or ""})
   
         else
 
         else
        if #filterArg > 0 then
+
if test then
        local test = true
+
return format_arg(format_value(string.sub(arg, 2), ship, target))
        for _, e in ipairs(filterArg) do
+
else
        local kv = mw.text.split(e, "%s*~%s*")
+
return nil
        local xs = mw.text.split(kv[2], "%s*,%s*")
+
end
        local test2 = false
  −
        for _, e2 in ipairs(xs) do
  −
if tostring(ship[kv[1]](ship)) == e2 then
  −
        test2 = true
  −
        break
  −
        end
  −
        end
  −
        if not test2 then
  −
        test = false
  −
        break
  −
        end
  −
        end
  −
        if test then
  −
        return format_arg(format_value(string.sub(arg, 2), ship, target))
  −
        else
  −
        return nil
  −
        end
  −
        else
  −
            return format_arg(format_value(string.sub(arg, 2), ship, target))
  −
            end
  −
        end
   
     else
 
     else
 
         return format_arg(arg)
 
         return format_arg(arg)
Line 396: Line 374:  
end
 
end
   −
local function interpret_args(args_)
  −
args = args_
   
     Ship = args.enemy and require("Module:EnemyShip") or require("Module:Ship")
 
     Ship = args.enemy and require("Module:EnemyShip") or require("Module:Ship")
 
     if args.from and args.to then
 
     if args.from and args.to then
Line 406: Line 382:  
         sequence_position = 1
 
         sequence_position = 1
 
     end
 
     end
     local i = 1
+
 
 +
        else
 +
            local buildIterator = Iterator[enumerator]
 +
            if buildIterator then
 +
                sequence = {}
 +
                sequence_position = 1
 +
                local iterator = buildIterator(args)
 +
                while iterator.next() do
 +
                    table.insert(sequence, iterator.current())
 +
                end
 +
                sequence_length = #sequence
 +
            end
 +
 
 +
]]--
 +
 
 +
local function interpret(args_)
 +
args = args_
 +
local filterArgs = {}
 +
     for _, arg in ipairs(args) do
 +
    local prefix = string.sub(arg, 1, 1)
 +
    if prefix == "~" then
 +
    -- ~x.y.z~a.b.c means obj.x.y.z == a or obj.x.y.z == b or obj.x.y.z == c
 +
    -- obj.x.y.z can be obj:x():y():z(), etc.
 +
    local ksvs = mw.text.split(string.sub(arg, 2), "%s*~%s*")
 +
    local ks = mw.text.split(ksvs[1], "%s*%.%s*")
 +
    local vs = mw.text.split(ksvs[2], "%s*,%s*")
 +
    table.insert(filterArgs, {ks, vs})
 +
    end
 +
    end
 +
    local actions = {}
 +
    for _, arg in ipairs(args) do
 +
    local prefix = string.sub(arg, 1, 1)
 +
    if prefix == "@" then
 +
    local enumerator = string.sub(arg, 2)
 +
        local enumerating_function = enumerating_functions[enumerator]
 +
        if enumerating_function then
 +
        sequence = {}
 +
        for _, e in ipairs(enumerating_function()) do
 +
        local ship
 +
        if equipment or item then
 +
        ship = Equipment(e)
 +
        else
 +
        ship = Ship(e)
 +
        end
 +
        if #filterArgs > 0 then
 +
    local test = true
 +
for _, ksvs in ipairs(filterArgs) do
 +
local test2 = false
 +
 
 +
local obj = ship
 +
for _, k in ipairs(ksvs[1]) do
 +
local g = obj[k]
 +
if type(g) == 'function' then
 +
obj = g(obj)
 +
if type(obj) == 'nil' then
 +
obj = '??'
 +
break
 +
end
 +
elseif type(g) == 'table' then
 +
obj = g
 +
else
 +
obj = g
 +
break
 +
end
 +
end
 +
local v1 = tostring(obj)
 +
 
 +
for _, v2 in ipairs(ksvs[2]) do
 +
if v1 == v2 then
 +
test2 = true
 +
break
 +
end
 +
end
 +
 
 +
if not test2 then
 +
test = false
 +
break
 +
end
 +
end
 +
if test then
 +
table.insert(sequence, ship)
 +
end
 +
        else
 +
        table.insert(sequence, ship)
 +
        end
 +
        end
 +
        sequence_position = 1
 +
sequence_length = #sequence
 +
        end
 +
    elseif prefix == '!' then
 +
    local name = string.sub(arg, 2)
 +
    local obj = Ship(name)
 +
    if not obj:hp() then
 +
    equipment = true
 +
    obj = Equipment(name)
 +
    end
 +
    sequence = {}
 +
    table.insert(sequence, obj)
 +
        sequence_position = 1
 +
sequence_length = 1
 +
    elseif arg == "#" or prefix == "?" then
 +
    table.insert(actions, string.sub(arg, 2))
 +
    end
 +
    end
 +
    if args.sort and sequence then
 +
    local sorts = mw.text.split(args.sort, "%s*,%s*")
 +
    table.sort(sequence, function(a, b)
 +
    for _, sort in ipairs(sorts) do
 +
  local x = a[sort](a)
 +
  local y = b[sort](b)
 +
  if x == nil then return true end
 +
  if y == nil then return false end
 +
  if x < y then return true end
 +
  if x > y then return false end
 +
    end
 +
return false
 +
end)
 +
    end
 
     local values = {}
 
     local values = {}
 
     repeat
 
     repeat
         for _, arg in ipairs(args) do
+
    if sequence then
            local value = interpret_arg(arg)
+
    ship = sequence[sequence_position]
            if value then
+
    sequence_position = sequence_position + 1
                table.insert(values, value)
+
    end
 +
         for _, arg in ipairs(actions) do
 +
        if arg == '' then
 +
        if args.format == "table" then
 +
        table.insert(values, "|-\n")
 +
        end
 +
        else
 +
            local value = ship and format_arg(format_value(arg, ship)) -- interpret_arg(arg)
 +
            if value then
 +
                table.insert(values, value)
 +
            end
 
             end
 
             end
            i = i + 1
   
         end
 
         end
 
     until not sequence_length or sequence_position > sequence_length
 
     until not sequence_length or sequence_position > sequence_length
Line 420: Line 522:  
end
 
end
   −
return { format = function(frame) return interpret_args(U.getTemplateArgs(frame).explicit) end }
+
local function test()
 +
mw.log(interpret({"@base_names", "~is_battleship~true", "?link", sort = "type,id"}))
 +
mw.log(interpret({"@base_names", "~class.name~Kagerou Class", "?link", sort = "type,id"}))
 +
mw.log(interpret({"!Saiun", "?icon"}))
 +
mw.log(interpret({"!Ayanami", "?scrap_string", "?scrap.fuel", "?scrap_fuel", "?_scrap_fuel"}))
 +
mw.log(interpret({'@all_names', '~class.name~Akizuki Class', '?api_id', '?banner', '?link', '?japanese_name', '?code_link', '?class_number', '?firepower_max', '?torpedo_max', '?night_battle_power', '?aa_max', '?asw_max', '?los_max', '?luck', '?hp', '?armor_max', '?evasion_max', '?slots', '?fuel', '?ammo', sort = 'class_number,rarity,api_id'}))
 +
end
 +
 
 +
-- print(p.test())
 +
return {
 +
format = function(frame) return interpret(U.getTemplateArgs(frame).explicit) end,
 +
test = test,
 +
}
advmod, cssedit, Interface administrators, janitor, Moderators, prechecked, Widget editors
7,932

edits

Navigation menu