• Welcome to the Kancolle Wiki!
  • Currently account creation is by request only. Once you submit your request please wait 1-2 days for our administrators to process your request.
  • You can also visit our IRC channel at #kancollewiki to directly contact an administrator.

Difference between revisions of "Module:KanmusuModule"

From Kancolle Wiki
Jump to: navigation, search
m
Line 194: Line 194:
 
         equipHeader2 = '<th style="width: 75%; white-space: nowrap; {{border-radius|4px 12px 12px 4px}} background-color: #efe6d7; color: #a3965c; vertical-align: baseline;">Equipment</th>'
 
         equipHeader2 = '<th style="width: 75%; white-space: nowrap; {{border-radius|4px 12px 12px 4px}} background-color: #efe6d7; color: #a3965c; vertical-align: baseline;">Equipment</th>'
 
         equipHeader = equipHeader1 .. equipHeader2
 
         equipHeader = equipHeader1 .. equipHeader2
         equipStyle = '<td style="width: 75%; white-space: nowrap; text-align: center; vertical-align: baseline;">'
+
         equipStyle = '<td style="width: 75%; max-width: 375px; text-align: center; vertical-align: baseline;">'
 
     else
 
     else
 
         equipHeader = '<th style="white-space: nowrap; {{border-radius|12px 12px 12px 12px}} background-color: #efe6d7; color: #a3965c; vertical-align: baseline;">Equipment</th>'
 
         equipHeader = '<th style="white-space: nowrap; {{border-radius|12px 12px 12px 12px}} background-color: #efe6d7; color: #a3965c; vertical-align: baseline;">Equipment</th>'

Revision as of 18:46, 3 December 2019

This module page contains multiple functions that is used by several templates which will be listed below.

List of functions

shipmodule.KanmusuInfo(frame)

This function is used to build a Kanmusu info table on Kanmusu's respective page. This function will utilize Module:ShipDatabase which contains the main data of respective Kanmusu. It should be used with {{KanmusuInfo}} which will utilize this function instead of directly invoking this function.

Usage

Simply invoke the function with the code below:

{{#invoke:KanmusuModule|KanmusuInfo|<ID> or <Name>}}
Highly preferable to use Kanmusu Sort ID instead of Kanmusu name

Kanmusu Sort ID will always have 3 digits, means that leading zero must be included into the ID if the Sort ID doesn't have 3 digits, for example 001 and 045. The only exception is Mist1 to Mist3.

shipmodule.RemodelBlueprintChk(blueprint)

This function is used as a sub-function to shipmodule.KanmusuInfo(frame). It will read the integer value and return whether the Kanmusu's remodel needs blueprint or not in string form.

Usage

Simply invoke the function with the code below:

{{#invoke:KanmusuModule|RemodelBlueprintChk|<integer value>}}
This function is not intended to work independently and should be used by shipmodule.KanmusuInfo(frame).

shipmodule.KanmusuList(frame)

This function is used to list out all Kanmusu data in table format. This function will be planned to use with certain keywords in order to change how the list would be built. This function will also utilize Module:ShipDatabase just like shipmodule.KanmusuInfo(frame). It should be used with {{KanmusuList}} which will utilize this function instead of directly invoking this function.

Usage

Simply invoke the function with the code below:

{{#invoke:KanmusuModule|KanmusuList|<string, optional>|<max, optional>}}
This function will display the full list if no string was entered. String will be used to determine what type of class the list will be displayed (in progress). If max is entered, max values of stats will be displayed, otherwise the base values will be printed.

shipmodule.KanmusuListEntry(id, printMax)

This function is used to list the data of the specific Kanmusu ID. It is intended to be used with shipmodule.KanmusuList(frame) as this function is to be looped with the table-creating function which is within the shipmodule.KanmusuList(frame).

Usage

Simply invoke the function with the code below:

{{#invoke:KanmusuModule|KanmusuListEntry|<kanmusu sort id>|<true or false>}}
This function will built with only <tr> and <td> tags and it is not recommended to be used independently.


zh:模块:舰娘模块


local shipmodule = {}
local shipdb = require("Module:ShipDatabase")
shipmodule.data = shipdb.KanmusuData

local function getMarriedHp(hp, maxHp)
  return math.min(maxHp, hp + ({4, 4, 4, 5, 6, 7, 7, 8, 8, 9})[math.floor(hp / 10) + 1])
end

local function tooltip(content, title)
  return tostring(mw.html.create('span'):attr('title', title):addClass('explain'):wikitext(content))
end

function shipmodule.getIDNum(frame)
    local shipNum = frame.args[1]
    -- Getting ship ID, number, & info
    if (tonumber(string.sub(shipNum, 1, 3)) == nil and string.sub(shipNum, 1, 4) ~= "Mist" ) then -- if given a name instead of ID, this searches the db for the ship's corresponding ID
    	shipNum = shipdb.findID(frame)
    end
    return shipNum
end

function shipmodule.KanmusuInfo(frame) -- Kanmusu Info Template
    local shipNum = shipmodule.getIDNum(frame)

    local shipInfo = assert(shipmodule.data[shipNum], "KanMusu ID " .. shipNum .. " doesn't have a database entry")
    
    local upperTable = shipmodule.makeStatBox(frame)
    local DetailTable = shipmodule.EquipmentBox(frame) .. shipmodule.ModernizationBox(frame) .. shipmodule.getArtVoice(frame) 

    local shipInfoBox = '<div style="display: inline-block; vertical-align: top;"><table style="{{border-radius|10px 10px 10px 10px}} border: 1px solid #aaaaaa; min-width: 495px">'
    shipInfoBox = shipInfoBox .. '<tr><td>' .. upperTable .. '</td></tr>'
    shipInfoBox = shipInfoBox .. '<tr><td>' .. DetailTable .. '</td></tr></table></div>' .. shipmodule.createCategories(frame)

    return shipInfoBox
end

function shipmodule.makeStatBox(frame)
    local shipNum = shipmodule.getIDNum(frame)

    local shipInfo = assert(shipmodule.data[shipNum], "KanMusu ID " .. shipNum .. " doesn't have a database entry")
	-- Top half of infobox
    -- Cards & Banners
    local cardImgFile = '{{#setmainimage:KanMusu' .. shipNum .. 'Card.png}}'
    local CardImg = '<div style="text-align: center; width: 218px; height:300px;">[[File:' .. cardImgFile .. '|218x300px|' .. shipmodule.data[shipNum]["name"][3] .. ' Card]]</div>'
    local CardDmgImg = '<div style="text-align: center; width: 218px; height:300px;">[[File:KanMusu' .. shipNum .. 'CardDmg.png|218x300px|' .. shipmodule.data[shipNum]["name"][3] .. ' Damaged Card]]</div>'
    local BannerImg = '<div style="text-align: center; width: 160px; height:40px;">[[File:KanMusu' .. shipNum .. 'Banner.png|160px|' .. shipmodule.data[shipNum]["name"][3] .. ' Banner|class=imageCenter]]</div>'
    local BannerDmgImg = '<div style="text-align: center; width: 160px; height:40px;">[[File:KanMusu' .. shipNum .. 'BannerDmg.png|160px|' .. shipmodule.data[shipNum]["name"][3] .. ' Damaged Banner|class=imageCenter]]</div>'

    local Cards = '<td rowspan="10" style="text-align: center; width: 218px; height:300px;">' .. frame:extensionTag('slideshow', CardImg .. CardDmgImg, {
    	sequence = 'forward', transition = 'fade', refresh = '10000', center = 'true'
    }) .. '</td>'
    local Banners = '<td colspan="3" style="text-align: center; width: 160px; height:40px;">' .. frame:extensionTag('slideshow', BannerImg .. BannerDmgImg, {
    	sequence = 'forward', transition = 'fade', refresh = '10000', center = 'true'
    }) .. '</td>'

    local row1 = '<tr>' .. Cards .. '<th style="text-align: center;">' .. shipNum .. '</th>' .. Banners .. '</tr>'

    -- Formatting Japanese
    local kanji, form
	local formNum = mw.ustring.find(shipmodule.data[shipNum]["name"][1], "[乙改甲航]")
	if formNum == nil then 
		if mw.ustring.find(shipmodule.data[shipNum]["name"][1], "%szwei") ~= nil then
			formNum = mw.ustring.find(shipmodule.data[shipNum]["name"][1], "%szwei")
			kanji = mw.ustring.sub(shipmodule.data[shipNum]["name"][1], 1, formNum - 1)
			form = "&#32;zwei"
		elseif mw.ustring.find(shipmodule.data[shipNum]["name"][1], "%sdrei") ~= nil then
			formNum = mw.ustring.find(shipmodule.data[shipNum]["name"][1], "%sdrei")
			kanji = mw.ustring.sub(shipmodule.data[shipNum]["name"][1], 1, formNum - 1)
			form = "&#32;drei"
		elseif mw.ustring.find(shipmodule.data[shipNum]["name"][1], "%sdue") ~= nil then
			formNum = mw.ustring.find(shipmodule.data[shipNum]["name"][1], "%sdue")
			kanji = mw.ustring.sub(shipmodule.data[shipNum]["name"][1], 1, formNum - 1)
			form = "&#32;due"
		elseif mw.ustring.find(shipmodule.data[shipNum]["name"][1], "%sдва") ~= nil then
			formNum = mw.ustring.find(shipmodule.data[shipNum]["name"][1], "%sдва")
			kanji = mw.ustring.sub(shipmodule.data[shipNum]["name"][1], 1, formNum - 1)
			form = "&#32;два"
		elseif mw.ustring.find(shipmodule.data[shipNum]["name"][1], "%sMk.II") ~= nil then
            if mw.ustring.find(shipmodule.data[shipNum]["name"][1], "%sMk.II Mod.2") ~= nil then
                formNum = mw.ustring.find(shipmodule.data[shipNum]["name"][1], "%sMk.II Mod.2")
			    kanji = mw.ustring.sub(shipmodule.data[shipNum]["name"][1], 1, formNum - 1)
			    form = "&#32;Mk.II Mod.2"
            else
			    formNum = mw.ustring.find(shipmodule.data[shipNum]["name"][1], "%sMk.II")
			    kanji = mw.ustring.sub(shipmodule.data[shipNum]["name"][1], 1, formNum - 1)
			    form = "&#32;Mk.II"
                end
		elseif mw.ustring.find(shipmodule.data[shipNum]["name"][1], "%sреволюция") ~= nil then -- Gangut "Kai" exception
			kanji = mw.text.split(shipmodule.data[shipNum]["name"][1], "%s")[1] .. '<br/>' .. mw.text.split(shipmodule.data[shipNum]["name"][1], "%s")[2]
			form = ""
		else
			kanji = shipmodule.data[shipNum]["name"][1]
			form = ""
		end
	else
		kanji = mw.ustring.sub(shipmodule.data[shipNum]["name"][1], 1, formNum - 1)
		form = mw.ustring.sub(shipmodule.data[shipNum]["name"][1], formNum , -1)
	end
	
	local JaName = ""
	if shipNum == "147" or shipNum == "311" or shipNum == "312" or shipNum == "313" or shipNum == "313a" or shipNum == "316" then --Russian ship markup
		JaName = '<ruby lang="ru" xml:lang="ru"><rb>' .. kanji .. '</rb><rp> (</rp><rt lang="ja">' .. shipmodule.data[shipNum]["name"][2] .. '</rt><rp>) </rp></ruby>' .. frame:expandTemplate{ title = 'lang', args = { 'ru' , form } }
	else
		JaName = frame:expandTemplate{ title = 'ruby-ja', args = { kanji , shipmodule.data[shipNum]["name"][2] } } .. frame:expandTemplate{ title = 'lang', args = { 'ja' , form } }
	end

    -- Summary of basic ship info
    local row2 = '<tr><th colspan="2">' .. JaName .. '</th><th colspan="2">' .. shipmodule.data[shipNum]["name"][3] .. '</th></tr>'
    local row3 = '<tr><td colspan="4" style="text-align: center;">' .. shipmodule.data[shipNum]["class"] .. ' Class ' .. shipmodule.data[shipNum]["type"] .. '</td></tr>'
    local row4 = '<tr><td colspan="4"><hr style="border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0,0,0,0), rgba(0,0,0,0.75), rgba(0,0,0,0));" /></td></tr>'

    -- Ship stats table
    local statLabel = '<th style="width: 65px; {{border-radius|12px 4px 4px 12px}} padding-left: 5px; padding-right: 5px; background-color: #eae1d1; color: #a3965c; text-align: right; vertical-align: baseline;">'
    local statBox = '<td style="{{border-radius|4px 12px 12px 4px}} padding-left: 5px; padding-right: 5px; border: 1px solid #a3965c; text-align: left; vertical-align: baseline;">'

    local hp = shipmodule.data[shipNum]["hp"][1]
    local maxHp = shipmodule.data[shipNum]["hp"][2]
    local HPinfo
    if maxHp then
      local marriedHp = getMarriedHp(hp, maxHp)
      local maxModHp = math.min(hp + 2, maxHp)
      local maxModMarriedHp = math.min(marriedHp + 2, maxHp)
      local hpSpan1 = tooltip(hp, string.format('%d with DE modernization', maxModHp))
      local hpSpan2 = tooltip(marriedHp, string.format('Married, %d with DE modernization', maxModMarriedHp))
      HPinfo = statLabel .. 'HP [[File:IcoHP.png|HP]]</th>' .. statBox .. hpSpan1 .. '→' .. hpSpan2 .. '</td>'
    else
      HPinfo = statLabel .. 'HP [[File:IcoHP.png|HP]]</th>' .. statBox .. hp .. '</td>'
    end

    local FPinfo = statLabel .. 'FP [[File:IcoAtk.png|Firepower]]</th>' .. statBox .. shipmodule.data[shipNum]["fp"][1] .. '→' .. shipmodule.data[shipNum]["fp"][2] .. '</td>'

    local row5 = '<tr>' .. HPinfo .. FPinfo .. '</tr>'

    -- Armor & Torpedo
    local Armorinfo = statLabel .. 'ARM [[File:IcoArmor.png|Armor]]</th>' .. statBox .. shipmodule.data[shipNum]["armor"][1] .. '→' .. shipmodule.data[shipNum]["armor"][2] .. '</td>'
    local Torpedoinfo = statLabel .. 'TORP [[File:IcoTorpedo.png|Torpedo]]</th>' .. statBox
    if shipmodule.data[shipNum]["torpedo"] == 0 then
        Torpedoinfo = Torpedoinfo .. shipmodule.data[shipNum]["torpedo"]
    else
        Torpedoinfo = Torpedoinfo .. shipmodule.data[shipNum]["torpedo"][1] .. '→' .. shipmodule.data[shipNum]["torpedo"][2]
    end

    local row6 = '<tr>' .. Armorinfo .. Torpedoinfo .. '</tr>'

    -- Evasion & AA
    local Evasioninfo = statLabel .. 'EVA [[File:IcoEvasion.png|Evasion]]</th>' .. statBox .. shipmodule.data[shipNum]["evasion"][1] .. '→' .. shipmodule.data[shipNum]["evasion"][2] .. '</td>'
    local AAinfo = statLabel .. 'AA [[File:IcoAA.png|Anti-Air]]</th>' .. statBox
    if shipmodule.data[shipNum]["aa"] == 0 then
        AAinfo = AAinfo .. shipmodule.data[shipNum]["aa"]
    else
        AAinfo = AAinfo .. shipmodule.data[shipNum]["aa"][1] .. '→' .. shipmodule.data[shipNum]["aa"][2]
    end

    local row7 = '<tr>' .. Evasioninfo .. AAinfo .. '</tr>'

    -- Planes & ASW
    local aircraftTotal = shipdb.TotalAircraft(frame)
    local Planeinfo = statLabel .. 'PLA [[File:IcoAircraft.png|Aircraft]]</th>' .. statBox .. aircraftTotal .. '</td>'
    local ASWinfo = statLabel .. 'ASW [[File:IcoASW.png|Anti-Submarine Warfare]]</th>' .. statBox
    if shipmodule.data[shipNum]["asw"] == 0 then
        ASWinfo = ASWinfo .. shipmodule.data[shipNum]["asw"]
    else
        ASWinfo = ASWinfo .. shipmodule.data[shipNum]["asw"][1] .. '→' .. shipmodule.data[shipNum]["asw"][2]
    end

    local row8 = '<tr>' .. Planeinfo .. ASWinfo .. '</tr>'

    -- Speed & LOS
    local Speedinfo = statLabel .. 'SPD [[File:IcoSpeed.png|Speed]]</th>' .. statBox .. shipmodule.data[shipNum]["spd"] .. '</td>'
    local LOSinfo = statLabel .. 'LOS [[File:IcoLOS.png|Line of Sight]]</th>' .. statBox .. shipmodule.data[shipNum]["los"][1] .. '→' .. shipmodule.data[shipNum]["los"][2] .. '</td>'

    local row9 = '<tr>' .. Speedinfo .. LOSinfo .. '</tr>'

    -- Range & Luck
    local Rangeinfo = statLabel .. 'RGE [[File:IcoRange.png|Range]]</th>' .. statBox .. shipmodule.data[shipNum]["range"] .. '</td>'
    local Luckinfo = statLabel .. 'LUK [[File:IcoLuck.png|Luck]]</th>' .. statBox .. shipmodule.data[shipNum]["luck"][1] .. '→' .. shipmodule.data[shipNum]["luck"][2] .. '</td>'

    local row10 = '<tr>' .. Rangeinfo .. Luckinfo .. '</tr>'
    local StatTable = '<table>' .. row1 .. row2 .. row3 .. row4 .. row5 .. row6 .. row7 .. row8 .. row9 .. row10 .. '</table>'
    return StatTable
end

function shipmodule.EquipmentBox(frame)
    local shipNum = shipmodule.getIDNum(frame)

    local shipInfo = assert(shipmodule.data[shipNum], "KanMusu ID " .. shipNum .. " doesn't have a database entry")

    -- Equipment table
    local equipHeader = ''
    local planeStyle = '<td style="width: 25%; white-space: nowrap; text-align: center; vertical-align: top;">'
    local equipStyle = ''
    if shipmodule.data[shipNum]["aircraft"] ~= "" then
        equipHeader1 = '<th style="width: 25%; white-space: nowrap; {{border-radius|12px 4px 4px 12px}} background-color: #efe6d7; color: #a3965c;">Aircraft</th>'
        equipHeader2 = '<th style="width: 75%; white-space: nowrap; {{border-radius|4px 12px 12px 4px}} background-color: #efe6d7; color: #a3965c; vertical-align: baseline;">Equipment</th>'
        equipHeader = equipHeader1 .. equipHeader2
        equipStyle = '<td style="width: 75%; max-width: 375px; text-align: center; vertical-align: baseline;">'
    else
        equipHeader = '<th style="white-space: nowrap; {{border-radius|12px 12px 12px 12px}} background-color: #efe6d7; color: #a3965c; vertical-align: baseline;">Equipment</th>'
        equipStyle = '<td style="white-space: nowrap; text-align: center; vertical-align: baseline;">'
    end
    
    local numRows = 4
    -- 346 Musashi Kai Ni
    -- 353 Ise Kai Ni
    -- 354 Hyuuga Kai Ni
    if shipNum == "346" or shipNum == "353" or shipNum == "354" or shipNum == "404" or shipNum == "409" then
    	numRows = 5
    end

    local equipTable = ''
    for i = 1, numRows, 1 do
    	local equipRow = '<tr>'
        if shipmodule.data[shipNum]["aircraft"] ~= "" then
        	if shipmodule.data[shipNum]["aircraft"][i] ~= nil then
        		equipRow = equipRow .. planeStyle .. shipmodule.data[shipNum]["aircraft"][i] .. '</td>' .. equipStyle
    		else
    			equipRow = equipRow .. planeStyle .. '</td>' .. equipStyle
    		end
            if shipmodule.data[shipNum]["equip"] ~= "" then
                if shipmodule.data[shipNum]["equip"][i] == "" or shipmodule.data[shipNum]["equip"][i] == "Unequipped" then
                    equipRow = equipRow .. '-Unequipped-</td></tr>'
                elseif shipmodule.data[shipNum]["equip"][i] == nil then
                    equipRow = equipRow .. '\'\'-Locked-\'\'</td></tr>'
                else
                    if string.find(shipmodule.data[shipNum]["equip"][i], "%★") then
                        a,b = string.match(shipmodule.data[shipNum]["equip"][i], "^(.+)★(.+)$")
                        equipRow = equipRow .. '[[' .. a .. '|' .. a .. '★' .. b .. ']]</td></tr>'
                    else
                        equipRow = equipRow .. '[[' .. shipmodule.data[shipNum]["equip"][i] .. ']]</td></tr>'
                    end
                end
            else
                equipRow = equipRow .. '\'\'-Locked-\'\'</td></tr>'
            end
        else
            equipRow = equipRow .. equipStyle
            if shipmodule.data[shipNum]["equip"] ~= "" then
                if shipmodule.data[shipNum]["equip"][i] == "" or shipmodule.data[shipNum]["equip"][i] == "Unequipped" then
                    equipRow = equipRow .. '-Unequipped-</td></tr>'
                elseif shipmodule.data[shipNum]["equip"][i] == nil then
                    equipRow = equipRow .. '\'\'Locked\'\'</td></tr>'
                else
                    if string.find(shipmodule.data[shipNum]["equip"][i], "%★") then
                        a,b = string.match(shipmodule.data[shipNum]["equip"][i], "^(.+)★(.+)$")
                        equipRow = equipRow .. '[[' .. a .. '|' .. a .. '★' .. b .. ']]</td></tr>'
                    else
                        equipRow = equipRow .. '[[' .. shipmodule.data[shipNum]["equip"][i] .. ']]</td></tr>'
                    end
                end
            else
                equipRow = equipRow .. '\'\'Locked\'\'</td></tr>'
            end
        end
        equipTable = equipTable .. equipRow
    end
    return '<table style="width: 100%">' .. equipHeader .. equipTable .. '</table>'
end

function shipmodule.ModernizationBox(frame)
    local shipNum = shipmodule.getIDNum(frame)

    local shipInfo = assert(shipmodule.data[shipNum], "KanMusu ID " .. shipNum .. " doesn't have a database entry")

    local RscHeader = '<th style="width: 25%; white-space: nowrap; {{border-radius|12px 4px 4px 12px}} background-color: #3baef5; color: #ffffff; padding-left: 5px; padding-right: 5px; text-align: right;">'
    local RscData = '<td style="width: 25%; white-space: nowrap; text-align: center;">'
    local RscData2 = '<td colspan="3" style="width: 75%; white-space: nowrap; text-align: center;">'

    -- Construction info
    local constrheader = ''
    local constrdata = ''

    if shipmodule.data[shipNum]["remodellv"] ~= nil and shipmodule.data[shipNum]["remodellv"] ~= "" then
        constrheader = 'Remodel Level'
        constrdata = shipmodule.data[shipNum]["remodellv"]
    else
        constrheader = 'Build Time'
        if shipmodule.data[shipNum]["buildtime"] == nil or shipmodule.data[shipNum]["buildtime"] == "" then
            constrdata = 'Not Buildable'
        else
            constrdata = shipmodule.data[shipNum]["buildtime"]
        end
    end

    local remodelinfo = ''
    if shipmodule.data[shipNum]["remodelreq"] ~= "" then
        local steel = '[[File:IcoSteel.png|18px|Steel]] ' .. shipmodule.data[shipNum]["remodelreq"][1]
        local ammo = '[[File:IcoAmmo.png|18px|Ammo]] ' .. shipmodule.data[shipNum]["remodelreq"][2]
        remodelinfo = steel .. ' ' .. ammo
        local items = shipmodule.RemodelBlueprintChk(shipmodule.data[shipNum]["remodelreq"][3], shipNum)
        if items then
            remodelinfo = remodelinfo .. ' ' .. items
        end
    end

    -- Construction & Remodel
    local row11 = ''
    if constrheader == 'Build Time' then
        row11 = '<tr>' .. RscHeader .. constrheader .. '</th>' .. RscData .. constrdata .. '</td><td colspan="2">&nbsp;</td></tr>'
    else
        row11 = '<tr>' .. RscHeader .. constrheader .. '</th>' .. RscData .. constrdata .. '</td>' .. RscHeader .. 'Remodel Req</th>' .. RscData .. remodelinfo .. '</td></tr>'
    end

    -- Consumption
    local consfuel = '[[File:IcoFuel.png|18px|Fuel]] ' .. shipmodule.data[shipNum]["consumption"][1]
    local consammo = '[[File:IcoAmmo.png|18px|Ammo]] ' .. shipmodule.data[shipNum]["consumption"][2]

    local row12 = '<tr>' .. RscHeader .. 'Consumption</th>' .. RscData .. consfuel .. ' ' .. consammo .. '</td>'

    -- Scrap Info
    local scrapfuel = '[[File:IcoFuel.png|18px|Fuel]] ' .. shipmodule.data[shipNum]["dismantle"][1]
    local scrapammo = '[[File:IcoAmmo.png|18px|Ammo]] ' .. shipmodule.data[shipNum]["dismantle"][2]
    local scrapsteel = '[[File:IcoSteel.png|18px|Steel]] ' .. shipmodule.data[shipNum]["dismantle"][3]
    local scrapbauxite = '[[File:IcoBauxite.png|18px|Bauxite]] ' .. shipmodule.data[shipNum]["dismantle"][4]
    local scrapinfo = scrapfuel .. ' ' .. scrapammo .. ' ' .. scrapsteel .. ' ' .. scrapbauxite
    local row12 = row12 .. RscHeader .. 'Dismantle</th>' .. RscData .. scrapinfo .. '</td></tr>'

    -- Modernization
    local modFP = '[[File:IcoAtkRemodel.png|25px|Firepower]] ' .. shipmodule.data[shipNum]["modernization"][1]
    local modTorp = '[[File:IcoTorpedoRemodel.png|25px|Torpedo]] ' .. shipmodule.data[shipNum]["modernization"][2]
    local modAA = '[[File:IcoAARemodel.png|25px|Anti-Air]] ' .. shipmodule.data[shipNum]["modernization"][3]
    local modArmor = '[[File:IcoArmorRemodel.png|25px|Armor]] ' .. shipmodule.data[shipNum]["modernization"][4]
    local modLuck = ''
    if shipmodule.data[shipNum]["modernization"][5] ~= nil and shipmodule.data[shipNum]["modernization"][5] ~= "" then
        -- modLuck = '[[File:IcoLuck|18px|Luck]] ' .. shipmodule.data[shipNum]["modernization"][5]
        modLuck = '[[File:IcoLuckRemodel.png|25px|Luck]] ' .. shipmodule.data[shipNum]["modernization"][5] -- Just a placeholder
    end

    local modInfo = modFP .. ' ' .. modTorp .. ' ' .. modAA .. ' ' .. modArmor
    if modLuck ~= '' then
        modInfo = modInfo .. ' ' .. modLuck
    end
    local row13 = '<tr>' .. RscHeader .. 'Modernization</th>' .. RscData2 .. modInfo .. '</td></tr>'
    return '<table style="width: 100%">' .. row13 .. row11 .. row12 .. '</table>'
end

function shipmodule.getArtVoice(frame)
    local shipNum = shipmodule.getIDNum(frame)

    local shipInfo = assert(shipmodule.data[shipNum], "KanMusu ID " .. shipNum .. " doesn't have a database entry")
    -- Artist & Voice Info
    local RscHeader = '<th style="width: 25%; white-space: nowrap; {{border-radius|12px 4px 4px 12px}} background-color: #3baef5; color: #ffffff; padding-left: 5px; padding-right: 5px; text-align: right;">'
    local RscData = '<td style="width: 25%; white-space: nowrap; text-align: center;">'

    local illustrator = ''
    local voiceactor = ''
    if shipmodule.data[shipNum]["artist"] ~= "Unknown" and shipmodule.data[shipNum]["artist"] ~= "" then
        illustrator = '[[:Category:' .. shipmodule.data[shipNum]["artist"] .. '|' .. shipmodule.data[shipNum]["artist"] .. ']]'
        --cat = cat .. '[[Category:' .. shipmodule.data[shipNum]["artist"] .. ']]'
    else
        illustrator = 'Unknown'
    end
    art = RscHeader .. 'Artist</th>' .. RscData .. illustrator .. '</td>'
    if shipmodule.data[shipNum]["seiyuu"] ~= "Unknown" and shipmodule.data[shipNum]["seiyuu"] ~= "" then
        voiceactor = '[[:Category:' .. shipmodule.data[shipNum]["seiyuu"] .. '|' .. shipmodule.data[shipNum]["seiyuu"] .. ']]'
        --cat = cat .. '[[Category:' .. shipmodule.data[shipNum]["seiyuu"] .. ']]'
    else
        voiceactor = 'Unknown'
    end
    voice = RscHeader .. 'Seiyuu</th>' .. RscData .. voiceactor .. '</td>'
    local row14 = '<table style="width: 100%">' .. art .. voice .. '</table>'
    return row14
end

function shipmodule.createCategories(frame)
	local shipNum = shipmodule.getIDNum(frame)
	
    local shipInfo = assert(shipmodule.data[shipNum], "KanMusu ID " .. shipNum .. " doesn't have a database entry")

	local cat = '[[Category:Ships]]'
	cat = cat .. '[[Category:' .. shipmodule.data[shipNum]["class"] .. ' Class]][[Category:' .. shipmodule.data[shipNum]["type"] .. 's]]'
	if shipmodule.data[shipNum]["artist"] ~= "Unknown" and shipmodule.data[shipNum]["artist"] ~= "" then
	       cat = cat .. '[[Category:' .. shipmodule.data[shipNum]["artist"] .. ']]'
    end
    if shipmodule.data[shipNum]["seiyuu"] ~= "Unknown" and shipmodule.data[shipNum]["seiyuu"] ~= "" then
        cat = cat .. '[[Category:' .. shipmodule.data[shipNum]["seiyuu"] .. ']]'
    end
	return cat
end

local remodelItems = mw.loadData('Module:KanmusuModule/RemodelHardcode')

function shipmodule.RemodelBlueprintChk(blueprint, shipNum)
  return remodelItems[tonumber(shipNum)] or remodelItems[tonumber(blueprint)]
end

function shipmodule.KanmusuList(frame)
    local shipType = frame.args[1]
    local shipListTable = '<table class="wikitable filterable sortable" style="width: 100%; min-width: 800px;"><tr>'
    shipListTable = shipListTable .. '<th style="text-align: center; background-color: SpringGreen;" class="unfilterable" data-sort-type="number">ID</th>'
    shipListTable = shipListTable .. '<th style="text-align: center; background-color: SpringGreen;" class="unfilterable unsortable">Name</th>'
    shipListTable = shipListTable .. '<th style="text-align: center; background-color: SpringGreen;" class="unfilterable unsortable">Class</th>'
    shipListTable = shipListTable .. '<th style="text-align: center; background-color: SpringGreen;" class="unsortable">Type</th>'
    shipListTable = shipListTable .. '<th style="text-align: center; vertical-align: middle; background-color: LightCoral;" class="unfilterable">[[File:IcoAtk.png|Firepower]]</th>'
    shipListTable = shipListTable .. '<th style="text-align: center; vertical-align: middle; background-color: LightSkyBlue;" class="unfilterable">[[File:IcoTorpedo.png|Torpedo]]</th>'
    shipListTable = shipListTable .. '<th style="text-align: center; vertical-align: middle; background-color: SandyBrown;" class="unfilterable">[[File:IcoAA.png|Anti-Air]]</th>'
    shipListTable = shipListTable .. '<th style="text-align: center; vertical-align: middle; background-color: Seashell;" class="unfilterable">[[File:IcoASW.png|Anti-Submarine Warfare]]</th>'
    shipListTable = shipListTable .. '<th style="text-align: center; vertical-align: middle; background-color: Aquamarine;" class="unfilterable">[[File:IcoLOS.png|Line of Sight]]</th>'
    shipListTable = shipListTable .. '<th style="text-align: center; vertical-align: middle; background-color: PaleGreen;" class="unfilterable">[[File:IcoLuck.png|Luck]]</th>'
    shipListTable = shipListTable .. '<th style="text-align: center; vertical-align: middle; background-color: Pink;" class="unfilterable">[[File:IcoHP.png|HP]]</th>'
    shipListTable = shipListTable .. '<th style="text-align: center; vertical-align: middle; background-color: Yellow;" class="unfilterable">[[File:IcoArmor.png|Armor]]</th>'
    shipListTable = shipListTable .. '<th style="text-align: center; vertical-align: middle; background-color: Violet;" class="unfilterable">[[File:IcoEvasion.png|Evasion]]</th>'
    shipListTable = shipListTable .. '<th style="text-align: center; vertical-align: middle; background-color: Silver;" class="unfilterable">[[File:IcoAircraft.png|Aircraft]]</th>'
    shipListTable = shipListTable .. '<th style="text-align: center; vertical-align: middle; background-color: Aqua;" class="unsortable">[[File:IcoSpeed.png|Speed|link=]]</th>'
    shipListTable = shipListTable .. '<th style="text-align: center; background-color: SpringGreen;" class="unsortable">[[File:IcoRange.png|Range|link=]]</th>'
    shipListTable = shipListTable .. '<th style="text-align: center; background-color: SpringGreen;" class="unfilterable">[[File:IcoFuel.png|Fuel Consumption]]</th>'
    shipListTable = shipListTable .. '<th style="text-align: center; background-color: SpringGreen;" class="unfilterable">[[File:IcoAmmo.png|Ammo Consumption]]</th></tr>'
    local IDList = shipdb.getSortedIDList()
    for num, id in pairs(IDList) do
        if shipType ~= nil then
            if shipType == shipmodule.data[id]["type"] then
                shipListTable = shipListTable .. shipmodule.KanmusuListEntry(id, frame.args[2] ~= nil)
            end
        else
            shipListTable = shipListTable .. shipmodule.KanmusuListEntry(id, frame.args[2] ~= nil)
        end
    end
    shipListTable = shipListTable .. '</table>'
    return shipListTable
end

function shipmodule.KanmusuListEntry(id, printMax) -- Kanmusu List Table
    local strings = '<tr>'
    local aircraftTotal = 0
    if shipmodule.data[id]["aircraft"] ~= "" then
    	local aircraftslot = {0, 0, 0, 0}
        for i = 1, 4, 1 do
            if shipmodule.data[id]["aircraft"][i] ~= nil then
                aircraftslot[i] = shipmodule.data[id]["aircraft"][i]
            else
                aircraftslot[i] = 0
            end
        end
        aircraftTotal = aircraftslot[1] + aircraftslot[2] + aircraftslot[3] + aircraftslot[4]
    else
        aircraftTotal = 0
    end
    
    --finding name of wiki page of ship
    shipname = shipmodule.data[id]["name"][3]
    pagename = shipname
    if string.sub(id,1,-2) == "Mist" then   -- fleet of fog check
    	if string.sub(id, -1) == '1' then
    		pagename = 'Iona_(fog)'
    	elseif string.sub(id, -1) == '2' then
    		pagename = 'Takao_(fog)'
    	elseif string.sub(id, -1) == '3' then
    		pagename = 'Haruna_(fog)'
		else
			pagename = 'Fleet of Fog'
		end
	else
		shipbasename = mw.text.split(shipname, '%s')[1]
		--Chitose/Chiyoda-Kou check; submarines should be unaffected
		if mw.text.split(shipbasename, '%p')[2] ~= nil and mw.text.split(shipbasename, '%p')[2] == "Kou" then
			shipbasename = mw.text.split(shipbasename, '%p')[1]
		end
		--Prinz/Graf/Teste check (for ship names that are 2 or more words)
		if mw.text.split(shipname, '%s')[2] ~= nil and not (mw.text.split(shipname, '%s')[2] == "Kai" or 
			mw.text.split(shipname, '%s')[2] == "A" or mw.text.split(shipname, '%s')[2] == "zwei" or
			mw.text.split(shipname, '%s')[2] == "drei" or mw.text.split(shipname, '%s')[2] == "Due" or
			mw.text.split(shipname, '%s')[2] == "Dva") then
			shipbasename = shipbasename .. ' ' .. mw.text.split(shipname, '%s')[2]
		end
		pagename = shipbasename
	end

    statLevel = 1 --base stat
    if printMax then
		statLevel = 2 --max stat
	end
	
    strings = strings .. '<td style="text-align: center;">' .. id .. '</td>'
    strings = strings .. '<td style="text-align: center;">[[' .. pagename .. '|' .. shipname ..']]</td>'
    strings = strings .. '<td style="text-align: center;">' .. shipmodule.data[id]["class"] .. '</td>'
    strings = strings .. '<td style="text-align: center;">' .. shipmodule.data[id]["type"] .. '</td>'
    strings = strings .. '<td style="text-align: center; background-color: #f0bbbb;">' .. shipmodule.data[id]["fp"][statLevel] .. '</td>'
    if shipmodule.data[id]["torpedo"] == 0 then
        strings = strings .. '<td style="text-align: center; background-color: #99eefa;">' .. shipmodule.data[id]["torpedo"] .. '</td>'
    else
        strings = strings .. '<td style="text-align: center; background-color: #99eefa;">' .. shipmodule.data[id]["torpedo"][statLevel] .. '</td>'
    end
    if shipmodule.data[id]["aa"] == 0 then
        strings = strings .. '<td style="text-align: center; background-color: #faccaa;">' .. shipmodule.data[id]["aa"] .. '</td>'
    else
        strings = strings .. '<td style="text-align: center; background-color: #faccaa;">' .. shipmodule.data[id]["aa"][statLevel] .. '</td>'
    end
    if shipmodule.data[id]["asw"] == 0 then
        strings = strings .. '<td style="text-align: center; background-color: #fff5ee;">' .. shipmodule.data[id]["asw"] .. '</td>'
    else
        strings = strings .. '<td style="text-align: center; background-color: #fff5ee;">' .. shipmodule.data[id]["asw"][statLevel] .. '</td>'
    end
    strings = strings .. '<td style="text-align: center; background-color: #afffee;">' .. shipmodule.data[id]["los"][statLevel] .. '</td>'
    strings = strings .. '<td style="text-align: center; background-color: #cbfbcb;">' .. shipmodule.data[id]["luck"][statLevel] .. '</td>'
    strings = strings .. '<td style="text-align: center; background-color: #ffe0eb;">' .. shipmodule.data[id]["hp"][statLevel] .. '</td>'
    strings = strings .. '<td style="text-align: center; background-color: #ffffaa;">' .. shipmodule.data[id]["armor"][statLevel] .. '</td>'
    strings = strings .. '<td style="text-align: center; background-color: #eeccee;">' .. shipmodule.data[id]["evasion"][statLevel] .. '</td>'
    strings = strings .. '<td style="text-align: center; background-color: #d9d9d9;">' .. aircraftTotal .. '</td>'
    strings = strings .. '<td style="text-align: center; background-color: #aaffff;">' .. shipmodule.data[id]["spd"] .. '</td>'
    strings = strings .. '<td style="text-align: center;">' .. shipmodule.data[id]["range"] .. '</td>'
    strings = strings .. '<td style="text-align: center;">' .. shipmodule.data[id]["consumption"][1] .. '</td>'
    strings = strings .. '<td style="text-align: center;">' .. shipmodule.data[id]["consumption"][2] .. '</td></tr>'
    return strings
end

return shipmodule