舰R百科是靠无数自愿编辑者持续地建设更新完善的。编辑非常简单,请勇于更新页面!
编辑入门 | 资助百科 | 留言讨论页 | 微博@舰R百科 | 百科编辑讨论Q群:366818861

模块:敌舰

来自舰R百科
跳转到导航 跳转到搜索
{{#invoke:敌舰|属性|atk|20000001}}

5

{{#invoke:敌舰|装备|1|20000001}}

火力+1
射程: 短

{{#invoke:敌舰|搭载|20000017}}

90

{{#invoke:敌舰|出现场所|20000001}}

1-1, 1-2

{{#invoke:敌舰|阵容|<位置>|<带格式位置>|<列数>}}

结果可视为列表的一行(实际上为1~3行), 每列内容分别是: 位置, 舰队名, 阵型, 配置(默认6列), 索敌, 制空, 航速

参数除位置外均可省略

位置格式为x-y/z, 例如1-1/A

带格式位置为列表第一列显示的内容, 可以修改来表示 boss 点或迂回点等

列数为这张表中最多一队的敌舰个数, 比如1-1一个点最多有4艘船就设成4 例:

{| class='wikitable'
!位置!!舰队!!阵型!!colspan=6|配置!!索敌!!制空!!航速
|-
{{#invoke:敌舰|阵容|2-5/A|随便改改}}
|-
{{#invoke:敌舰|阵容|2-5/B}}
|}
位置 舰队 阵型 配置 索敌 制空 航速
随便改改 敌哨戒舰队 复纵 战巡Κ级Ⅱ型 重巡Ι级Ⅱ型 重巡Ι级Ⅱ型 轻巡Η级Ⅲ型 驱逐Τ级Ⅱ型 67 0 30
敌哨戒舰队 复纵 战巡Κ级Ⅱ型 重巡Ι级Ⅱ型 轻巡Ζ级Ⅲ型 轻巡Η级Ⅲ型 驱逐Τ级Ⅱ型 驱逐Τ级Ⅱ型 92 0 30
敌哨戒舰队 梯形 战巡Κ级Ⅱ型 轻巡Ζ级Ⅲ型 轻巡Ζ级Ⅲ型 驱逐Τ级Ⅱ型 驱逐Τ级Ⅱ型 驱逐Τ级Ⅱ型 111 0 30
B 敌巡洋编队 复纵 轻母Ξ级Ⅲ型 轻母Ξ级Ⅲ型 轻巡Ζ级Ⅲ型 轻巡Ζ级Ⅲ型 驱逐Τ级Ⅱ型 驱逐Τ级Ⅱ型 160 28.90 35
敌巡洋编队 轮形 轻母Ξ级Ⅲ型 重巡Ι级Ⅲ型 轻巡Ζ级Ⅲ型 轻巡Ζ级Ⅲ型 驱逐Τ级Ⅱ型 驱逐Τ级Ⅱ型 140 14.45 35
敌巡洋编队 单纵 战巡Κ级Ⅲ型 重巡Ι级Ⅲ型 轻巡Ζ级Ⅲ型 轻巡Ζ级Ⅲ型 驱逐Τ级Ⅱ型 驱逐Τ级Ⅱ型 120 0 33

local enemyData = mw.loadData("模块:敌舰数据")
local ships = enemyData.ships
local fleets = enemyData.fleets
local equipts = mw.loadData("模块:特殊数据/装备").equipts
local tr = mw.loadData("模块:对照表")

p = { }

p['属性'] = function(frame)
    local ship = ships[frame.args[2]]
    if ship == nil then return '' end
    local ret = ship[frame.args[1]]
    if ret == nil then return '' end
    return ret
end

p['搭载'] = function(frame)
    local ship = ships[frame.args[1]]
    if ship == nil then return '' end
    return ship.cap1 + ship.cap2 + ship.cap3 + ship.cap4
end

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

    if equipt == nil then return '' end
    local ret = ''
    for i,attr in pairs(attrNames) 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 .. ':<br>' .. val .. '%'
            elseif val > 0 then
                ret = ret .. '+' .. val
            else
                ret = ret .. val
            end
        end
    end
    if equipt.effect ~= nil then
        ret = ret .. '<br>' .. equipt.effect
    end
    return ret
end

p['装备'] = function(frame)
    local ship = ships[frame.args[2]]
    if ship == nil then return '' end
    local equiptName = ship['eq' .. frame.args[1]]
    return getEquiptAttrs(equipts[equiptName])
end

p['出现场所'] = function(frame)
    local shipId = frame.args[1]
    local maps = { }
    for node, nodeFleets in pairs(fleets) do
        local map = node:sub(1, 3)
        for i, fleet in pairs(nodeFleets) do
            for j, ship in pairs(fleet.ships) do
                if ship == shipId then
                    maps[map] = true
                    break
                end
            end
        end
    end

    sort = { }
    for map, _ in pairs(maps) do
        table.insert(sort, map)
    end
    table.sort(sort)
    local ret = ''
    for _, map in ipairs(sort) do
        ret = ret .. ', ' .. map
    end
    return ret:sub(3)
end

local function formatEnemyShip(ship)
    local colorName = { 'black', 'green', 'blue', 'purple', 'orange', 'red' }

    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 speedType = { }
speedType['航空母舰'] = 1
speedType['轻型航空母舰'] = 1
speedType['战列舰'] = 1
speedType['航空战列舰'] = 1
speedType['战列巡洋舰'] = 1
speedType['重巡洋舰'] = 2
speedType['重雷装巡洋舰'] = 2
speedType['轻巡洋舰'] = 2
speedType['驱逐舰'] = 2
speedType['补给舰'] = 2
speedType['潜艇'] = 3

p['阵容'] = function(frame)
    local node = frame.args[1]
    local label = frame.args[2]
    if label == nil or label == '' then label = node:sub(5,5) end
    local shipNum = frame.args[3]
    if shipNum == nil then shipNum = 6 end

    local ret = ''
    local n = 0
    for i, fleet in pairs(fleets[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 = ships[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

return p