Module:ShipInfoboxGenerator

From Corsair Cove Official Wiki
Revision as of 14:11, 7 August 2026 by Dorce (talk | contribs)

Documentation for this module may be created at Module:ShipInfoboxGenerator/doc

local p = {}

local buildingData = mw.loadData("Module:BuildingData")
local resourceData = mw.loadData("Module:ResourceData")
local principleData = mw.loadData("Module:PrincipleData")
local GenericIcon = require("Module:GenericIcon")
local shipData = require("Module:Ship_data.lua")

local function titleCase(str)
    return str:gsub("(%a)([%w']*)", function(first, rest)
        return first:upper() .. rest:lower()
    end)
end

function p.makeInfobox(frame)
	local name = frame.args.name or frame.args[1] or ""
	if name == "" then
		return "'''Error:''' No ship name provided"
	end

	local ship = shipData.get_ship_by_name(name)
	if ship == nil then
		return "'''Error:''' Ship not found in data\n\nDebug name: " .. tostring(name) .. "\nDebug ship: nil"
	end
	
    local tier = ship.tier
    local principle_path = ship.principle_path
    local class = ship.class
    local hybrid_path = ship.hybrid_path
    local icon_filename = ship.icon_filename
    local pier = ship.pier
    local description = ship.description
    local construction_costs = ship.construction_costs
    local crew_types = ship.crew_types
    local stats_base = ship.stats_base
    local stats_crew_bonuses = ship.stats_crew_bonuses
	
	if principle_path == "NONE" then
		principle_path = ""
	end
	
	local principle_name = titleCase(principle_path)
	local hybrid_name = titleCase(hybrid_path)
	
	local ship_icon = frame:preprocess(
		"{{Ship tier icon|" .. tier .. "|path=" .. principle_name .. "|size=md}}")
	
	-- OUTPUT STRING
	local out = ""
	
	-- HEADER
	out = out .. "<div class='cc-infobox-ship'>"
	out = out .. "<div class='cc-infobox-ship-header'>"
	out = out .. "<div class='cc-infobox-ship-header-tier'>" .. ship_icon .. "</div>"
	
	out = out .. "<div class='cc-infobox-ship-header-name'><span>" .. name .. "</span></div>"
	
	-- PRINCIPLE
	if principle_name == "Notoriety" then
		out = out .. "<div class='cc-infobox-ship-header-class cc-panel-recolor-notoriety'>"
		out = out .. "<span>Prowler"
		if hybrid_name ~= "None" then
			out = out .. "+"
		end
		out = out .. " Tier " .. tier
		out = out .. "</span></div>"
	end
	
	if principle_name == "Empire" then
		out = out .. "<div class='cc-infobox-ship-header-class cc-panel-recolor-empire'>"
		out = out .. "<span>Destroyer"
		if hybrid_name ~= "None" then
			out = out .. "+"
		end
		out = out .. " Tier " .. tier
		out = out .. "</span></div>"
	end
	
	if principle_name == "Seafaring" then
		out = out .. "<div class='cc-infobox-ship-header-class cc-panel-recolor-seafaring'>"
		out = out .. "<span>Hunter"
		if hybrid_name ~= "None" then
			out = out .. "+"
		end
		out = out .. " Tier " .. tier
		out = out .. "</span></div>"
	end
	
	if principle_name == "Wealth" then
		out = out .. "<div class='cc-infobox-ship-header-class cc-panel-recolor-wealth'>"
		out = out .. "<span>Reaver"
		if hybrid_name ~= "None" then
			out = out .. "+"
		end
		out = out .. " Tier " .. tier
		out = out .. "</span></div>"
	end
	
	-- ICON
	out = out .. "<div class='cc-infobox-ship-header-icon'>"
	out = out .. "[[File:" .. icon_filename .. "|x128px]]</div>"
	
	-- DESCRIPTION
	out = out .. "<div class='cc-infobox-ship-header-description'>" .. description .. "</div>"
	
	-- HEADER END
	out = out .. "</div>"
	
	-- STATS
	out = out .. "<div class='cc-infobox-ship-stats'>"
	out = out .. "<div class='cc-infobox-ship-stats-title'>Stats</div><hr>"
	
	-- MAIN STATS
	local healthIcon = GenericIcon.icon_link({
		args = {"Health", size = "sm"}
	})
	local crewIcon = GenericIcon.icon_link({
		args = {"Crew", size = "sm"}
	})
	local suppliesIcon = GenericIcon.icon_link({
		args = {"Supplies", size = "sm"}
	})
	
	out = out .. "<div class='cc-infobox-ship-stats-fullrow'>"
	out = out .. "<div>" .. healthIcon .. "</div><div>" .. stats_base[1].qty .. "</div></div>"
	out = out .. "<div class='cc-infobox-ship-stats-fullrow'>"
	out = out .. "<div>" .. crewIcon .. "</div><div>" .. stats_base[2].qty .. "</div></div>"
	out = out .. "<div class='cc-infobox-ship-stats-fullrow'>"
	out = out .. "<div>" .. suppliesIcon .. "</div><div>" .. stats_base[3].qty .. "</div></div>"
	
	-- COMBAT STATS
	local gunIcon = GenericIcon.just_icon({
		args = {"Guns", size = "sm"}
	})
	local boardingIcon = GenericIcon.just_icon({
		args = {"Boarding Damage", size = "sm"}
	})
	local speedIcon = GenericIcon.just_icon({
		args = {"Speed", size = "sm"}
	})
	local manoeuvrabilityIcon = GenericIcon.just_icon({
		args = {"Manoeuvrability", size = "sm"}
	})
	local armourIcon = GenericIcon.just_icon({
		args = {"Armour", size = "sm"}
	})
	
	out = out .. "<div class='cc-infobox-ship-stats-rowofstats'>"
	out = out .. "<div class='cc-infobox-ship-stats-row-col'>"
	out = out .. "<div>Base</div>"
	out = out .. "<div class='cc-ship-stat-max'>Max</div></div>"
	
	out = out .. "<div class='cc-infobox-ship-stats-row-col'>"
	out = out .. "<div>" .. gunIcon .. "</div><div>" .. stats_base[4].qty .. "</div></div>"
	out = out .. "<div class='cc-infobox-ship-stats-row-col'>"
	out = out .. "<div>" .. boardingIcon .. "</div><div>" .. stats_base[5].qty .. "</div></div>"
	out = out .. "<div class='cc-infobox-ship-stats-row-col'>"
	out = out .. "<div>" .. speedIcon .. "</div><div>" .. stats_base[6].qty .. "</div></div>"
	out = out .. "<div class='cc-infobox-ship-stats-row-col'>"
	out = out .. "<div>" .. manoeuvrabilityIcon .. "</div><div>" .. stats_base[7].qty .. "</div></div>"
	out = out .. "<div class='cc-infobox-ship-stats-row-col'>"
	out = out .. "<div>" .. armourIcon .. "</div><div>" .. stats_base[8].qty .. "</div></div>"
	out = out .. "</div>"
	
	-- CREW
	out = out .. "<div class='cc-infobox-ship-crew'>"
	out = out .. "<div class='cc-infobox-ship-crew-title'>Crew</div><hr>"
	
	-- CREW ITERATION
	for _, entry in ipairs(crew_types) do
		local pirate_name = string.gsub(entry.type, "'", "")
		local pirate_qty = entry.qty
		local pirate_icon = frame:preprocess(
		"{{Pirate icon|" .. pirate_name .. "|size=md}}")
		
		out = out .. "<div class='cc-infobox-ship-crew-row'>"
		out = out .. "<div class='cc-infobox-ship-crew-row-col'>"
		out = out .. "<div>" .. pirate_name .. "</div>"
		
		if pirate_name ~= "Swabbies" then
			out = out .. "<div class='cc-infobox-ship-crew-row-col-advanced'>"
		end
		
		if pirate_name == "Swabbies" then
			out = out .. "<div>"
		end
		
		out = out .. pirate_icon .. "</div>"
		out = out .. "<div>" .. pirate_qty .. "</div>"
		out = out .. "</div></div>"
	end
	
	out = out .. "</div>"
	
	-- CONSTRUCTION
	local pier_name = titleCase(pier)
	local pier_icon = "T Button SelectionBorder Default.png"
	if buildingData[pier_name] then
	    pier_icon = buildingData[pier_name].building_icon_filename or pier_icon
	end
	
	out = out .. "<div class='cc-infobox-ship-construction'>"
	out = out .. "<div class='cc-infobox-ship-construction-title'>Construction</div><hr>"
	out = out .. "<div class='cc-infobox-ship-construction-pier'>"
	out = out .. "[[File:" .. pier_icon .. "|x32px|" .. pier_name .. "]] [[" .. pier_name .. "]]</div>"
	out = out .. "<div class='cc-infobox-ship-construction-table'>\n{|\n"
	
	for i, entry in ipairs(construction_costs) do
		local resource = titleCase(entry.resource)
		local resource_qty = entry.qty
		local resource_icon = "T Button SelectionBorder Default.png"
		if resourceData[resource] then
		    resource_icon = resourceData[resource].icon_file or resource_icon
		end
		
		if i == 5 then
			out = out .. "{|\n"
		end
		
		out = out .. "|class='cc-infobox-ship-construction-qty'| <span>" .. resource_qty .. "</span> "
		out = out .. "|| <span>[[File:" .. resource_icon .. "|x32px"
		out = out .. "|link=" .. resource .. "|" .. resource .. "]]</span> "
		out = out .. "||<span>" .. resource .. "</span>\n"
		out = out .. "|style='min-width: 32px;'|&nbsp;\n"
		
		if i == 2 then
			out = out .. "|-\n"
		end
		
		if i == 4 or i == 5 then
			out = out .. "|}\n"
		end
	end
	
	-- UNLOCK
	local tier_table = {
	    [2] = 3,
	    [3] = 7,
	    [4] = 12,
	    [5] = 20,
	    [6] = 30,
	}
	
	out = out .. "<div class='cc-infobox-ship-unlock'>"
	out = out .. "<div class='cc-infobox-ship-unlock-title'>Unlock</div><hr>"
	out = out .. "<div class='cc-infobox-ship-unlock-requirements'>"
	out = out .. "<div>Spend points:</div>"
	out = out .. "<div class='cc-infobox-ship-unlock-requirements-points'>"
	
	if principle_name == "Wealth" then
		out = out .. "<div class='cc-infobox-ship-unlock-requirements-points-wealth'>"
		out = out .. "[[File:T_ICO_VEC_P_Wealth.png|x24px|link=Wealth|Wealth]]"
	end
	
	if principle_name == "Notoriety" then
		out = out .. "<div class='cc-infobox-ship-unlock-requirements-points-notoriety'>"
		out = out .. "[[File:T_ICO_VEC_P_Notoriety1.png|x24px|link=Notoriety|Notoriety]]"
	end
	
	if principle_name == "Empire" then
		out = out .. "<div class='cc-infobox-ship-unlock-requirements-points-empire'>"
		out = out .. "[[File:T_ICO_VEC_P_Empire2.png|x24px|link=Empire|Empire]]"
	end
	
	if principle_name == "Seafaring" then
		out = out .. "<div class='cc-infobox-ship-unlock-requirements-points-seafaring'>"
		out = out .. "[[File:T_ICO_VEC_P_Sea.png|x24px|link=Seafaring|Seafaring]]"
	end
	
	out = out .. "<span>" .. tier_table[tonumber(tier)] .. "</span></div>"
	
	if hybrid_name == "Wealth" then
		out = out .. "<div class='cc-infobox-ship-unlock-requirements-points-wealth'>"
		out = out .. "[[File:T_ICO_VEC_P_Wealth.png|x24px|link=Wealth|Wealth]]"
	end
	
	if hybrid_name == "Notoriety" then
		out = out .. "<div class='cc-infobox-ship-unlock-requirements-points-notoriety'>"
		out = out .. "[[File:T_ICO_VEC_P_Notoriety1.png|x24px|link=Notoriety|Notoriety]]"
	end
	
	if hybrid_name == "Empire" then
		out = out .. "<div class='cc-infobox-ship-unlock-requirements-points-empire'>"
		out = out .. "[[File:T_ICO_VEC_P_Empire2.png|x24px|link=Empire|Empire]]"
	end
	
	if hybrid_name == "Seafaring" then
		out = out .. "<div class='cc-infobox-ship-unlock-requirements-points-seafaring'>"
		out = out .. "[[File:T_ICO_VEC_P_Sea.png|x24px|link=Seafaring|Seafaring]]"
	end
		
	if hybrid_name ~= "None" then
		out = out .. "<span>" .. tier_table[tonumber(tier)] .. "</span></div>"
	end
	
	out = out .. "</div></div></div>"
	
	-- END
	out = out .. "</div>"
	
	return out
end
	
return p