可在模块:Preload/doc创建此模块的帮助文档

local tr = require("模块:对照表")
local data = require("模块:特殊数据")
local equipts = data.equipts
local ships = data.ships
local enemy = require("模块:敌舰数据")
local enemyShips = enemy.ships
local enemyFleets = enemy.fleets

local equiptAttrs = { '火力', '装甲', '鱼雷', '对空', '轰炸', '索敌', '对潜', '命中', '回避', '幸运', '射程', '对空补正' }
local rangeName = { '短', '中', '长', '超长' }

local speedType = { }
speedType['航空母舰'] = 1
speedType['轻型航空母舰'] = 1
speedType['战列舰'] = 1
speedType['航空战列舰'] = 1
speedType['战列巡洋舰'] = 1
speedType['重巡洋舰'] = 2
speedType['重雷装巡洋舰'] = 2
speedType['轻巡洋舰'] = 2
speedType['驱逐舰'] = 2
speedType['补给舰'] = 2
speedType['潜艇'] = 3

local colorName = { 'black', 'green', 'blue', 'purple', 'orange', 'red' }


local byIndex = { }
for name, ship in pairs(ships) do
    byIndex[ship.index] = name
end

local replaceCountryName = function(name)
    name = name:gsub('C国', '中国')
    name = name:gsub('E国', '英国')
    name = name:gsub('F国', '法国')
    name = name:gsub('G国', '德国')
    name = name:gsub('I国', '意大利')
    name = name:gsub('J国', '日本')
    name = name:gsub('S国', '苏联')
    name = name:gsub('U国', '美国')
    return name
end

local getAttr = function(ship, attr, default)
    if tr[attr] ~= nil then attr = tr[attr] end
    if attr == '搭载' then
        return ship.cap1 + ship.cap2 + ship.cap3 + ship.cap4
    elseif attr:sub(1, 2) == 'eq' then
        return replaceCountryName(ship[attr])
    elseif attr == '简介' then
        return replaceCountryName(ship['简介'])
    elseif ship[attr] ~= nil then
        return ship[attr]
    else
        return default
    end
end

local function getEquiptAttrs(equipt)
    if equipt == nil then return '' end
    local ret = ''
    for i,attr in pairs(equiptAttrs) do
        local val = equipt[tr[attr]]
        if val ~= nil then
            if ret ~= '' then ret = ret .. '<br>' end
            ret = ret .. attr
            if attr == '射程' then
                ret = ret .. ': ' .. rangeName[val]
            elseif attr == '对空补正' then
                ret = ret .. ':<wbr>' .. val .. '%'
            elseif val > 0 then
                ret = ret .. '+' .. val
            else
                ret = ret .. val
            end
        end
    end
    if equipt.effect ~= nil then
        return ret .. '<br>' .. equipt.effect
    else
        return ret
    end
end

local function formatEnemyShip(ship)
    local ret = '[['
    local len = mw.ustring.len(ship.title)
    if mw.ustring.sub(ship.title, len, len) == '型' and mw.ustring.sub(ship.title, len - 2, len - 2) == '级' then
        ret = ret .. mw.ustring.sub(ship.title, 1, len - 2)
    else
        ret = ret .. ship.title
    end
    return ret .. "|<span style='color:" .. colorName[ship.rarity] .. ";'>" .. ship.title .. "</span>]]"
end

local function calcAa(ship)
    local ret = 0
    local n = math.floor(ship.atk / 5) + 3
    for i = 1, 4 do
        local e = ship['eq' .. i]
        if e:find('战斗机') ~= nil then
            local f = math.log(math.min(n, ship['cap' .. i]) * 2 + 2)
            ret = ret + f * equipts[e].aa
        end
    end
    return ret
end

local function formatFloat(x)
    if x == 0 then return 0 end
    x = math.floor(x * 100 + 0.5) / 100
    return string.format('%.2f', x)
end

local function getEnemyFleet(node, label, shipNum)
    local ret = ''
    local n = 0
    for i, fleet in pairs(enemyFleets[node]) do
        if i ~= 1 then ret = ret .. '|-\n' end
        ret = ret .. '|' .. fleet.title .. '||' .. fleet.formation
        n = n + 1
        local rec = 0
        local aa = 0
        local speed = { 0, 0, 0 }
        local speedCnt = { 0, 0, 0 }
        local m = 0
        for j, shipId in pairs(fleet.ships) do
            m = m + 1
            local ship = enemyShips[shipId]
            ret = ret .. '||' .. formatEnemyShip(ship)
            rec = rec + ship.rec
            aa = aa + calcAa(ship)
            local st = speedType[ship.type]
            speed[st] = speed[st] + ship.speed
            speedCnt[st] = speedCnt[st] + 1
        end
        for j = m + 1, shipNum do
            ret = ret .. '||'
        end

        local s1 = 999
        local s2 = 999
        if speedCnt[1] ~= 0 then s1 = speed[1] / speedCnt[1] end
        if speedCnt[2] ~= 0 then s2 = speed[2] / speedCnt[2] end
        local s = math.min(s1, s2)
        if speedCnt[1] == 0 and speedCnt[2] == 0 then
            s = speed[3] / speedCnt[3]
        end
        ret = ret .. '||' .. rec .. '||' .. formatFloat(aa) .. '||' .. math.floor(s) .. '\n'
    end
    return '|rowspan=' .. n .. '|' .. label .. '|' .. ret
end

local p = { }
p.tr = tr
p.ships = ships
p.equipts = equipts
p.enemyShips = enemyShips
p.byIndex = byIndex
p.getAttr = getAttr
p.getEquiptAttrs = getEquiptAttrs
p.getEnemyFleet = getEnemyFleet
return p