Module:ShipInfoKai

local BaseData = require('Module:BaseData') local Ship = require('Module:Ship') local ShipCardKai = require('Module:ShipCardKai') local ResourceIcons = require('Module:ResourceIcons') local StatIcons = require('Module:StatIcons') local Formatting = require('Module:Formatting') local format = require('Module:StringInterpolation').format

local ShipInfoKai = BaseData{ _catbomb = "Catbomb.png|300px", _unbuildable = "Unbuildable", _remodel_level = "Remodel Level", _build_time = "Build Time", _default_slot_num = 4, _normal_construction = "Normal", _normal_construction_category = ":Category:Ships buildable in Normal Construction", _large_ship_construction = "LSC", _large_ship_construction_category = ":Category:Ships buildable in Large Ship Construction", _ship_data_documentation = "Template:ShipDataDocumentation/EditIntro", _edit_link_text = "Edit", _localized_name_template = " ${localized_name}", _kekkon_max_template = "Maximum after marriage: ${value}", _nick_template = " (${nick} ${japanese_nick})", _overridden_category_template = "", _fields = { "edit_link", "rarity", "bg_color", "name", "localized_name", "id", "japanese_name", "nick", "class", "type", "image", "hp", "firepower", "armor", "torpedo", "evasion", "aa", "aircraft", "asw", "speed", "los", "range", "luck", "consumption", "modernization", "scrap", "build_remodel_header", "build_remodel_info", "slots", "slot_details", },	_slot_template = |- align=center style="background-color: whitesmoke; line-height: 1.1;" , _template = - Extra Statistics ${remodel_cost}${reversion_cost} Modernization Bonus  ${modernization}  Scrap Value  ${scrap} 	_remodel_cost_template = [[ Remodel Cost  ${remodel_cost} ,	_reversion_cost_template =  Cost to Revert to ${suffix}  ${level_items} ${resources}, }
 * style="width: 36px; height: 36px; background-color: ${color};${extra_style}" | ${icon}
 * colspan="4" style="width: 190px;" | ${equipment}
 * style="width: 50px;" | ${slot_size}
 * colspan="6" style="position: relative; text-align: center; background-color: ${top_bg_color};${top_extra_style}" title="${rarity}" | ${edit_link}
 * colspan="6" style="position: relative; text-align: center; background-color: ${top_bg_color};${top_extra_style}" title="${rarity}" | ${edit_link}
 * - style="background-color: whitesmoke;"
 * align=center colspan="6" | ${image}
 * colspan="6" style="text-align: center; background-color: LightSkyBlue;"|Statistics
 * - style="background-color: whitesmoke;"
 * colspan="2" style="width: 88px;" | ${icons.hp} ${labels.hp}
 * style="width: 66px;" | ${hp}
 * style="width: 88px;" | ${icons.firepower} ${labels.firepower}
 * colspan="2" style="width: 60px;" | ${firepower}
 * - style="background-color: whitesmoke;"
 * colspan="2" style="width: 88px;" | ${icons.armor} ${labels.armor}
 * style="width: 66px;" | ${armor}
 * style="width: 88px;" | ${icons.torpedo} ${labels.torpedo}
 * colspan="2" style="width: 66px;" | ${torpedo}
 * - style="background-color: whitesmoke;"
 * colspan="2" style="width: 88px;" | ${icons.evasion} ${labels.evasion}
 * style="width: 66px;" | ${evasion}
 * style="width: 88px;" | ${icons.aa} ${labels.aa}
 * colspan="2" style="width: 66px;" | ${aa}
 * - style="background-color: whitesmoke;"
 * colspan="2" style="width: 88px;" | ${icons.aircraft} ${labels.aircraft}
 * style="width: 66px;" | ${aircraft}
 * style="width: 88px;" | ${icons.asw} ${labels.asw}
 * colspan="2" style="width: 66px;" | ${asw}
 * - style="background-color: whitesmoke;"
 * colspan="2" style="width: 88px;" | ${icons.speed} ${labels.speed}
 * style="width: 66px;" | ${speed}
 * style="width: 88px;" | ${icons.los} ${labels.los}
 * colspan="2" style="width: 66px;" | ${los}
 * - style="background-color: whitesmoke;"
 * colspan="2" style="width: 88px;" | ${icons.range} ${labels.range}
 * style="width: 66px;" | ${range}
 * style="width: 88px;" | ${icons.luck} ${labels.luck}
 * colspan="2" style="width: 66px;" | ${luck}
 * colspan="6" style="text-align: center; background-color: lightgrey;"|Resource Consumption
 * - style="background-color: whitesmoke;"
 * colspan="2" style="width: 88px;" | ${icons.fuel} Fuel
 * style="width: 66px;" | ${fuel}
 * style="width: 88px;" | ${icons.ammo} Ammo
 * colspan="2" style="width: 66px;" | ${ammo}
 * colspan="5" style="text-align: center; background-color: LightSkyBlue;"|${build_remodel_header}
 * style="text-align: center; background-color: LightSkyBlue; width: 50px;" | Slots
 * - style="background-color: whitesmoke;"
 * colspan="5" style="text-align: center;"|${build_remodel_info}
 * align=center style="width: 50px;" |${slots}
 * colspan="5" style="text-align: center; background-color: LightSkyBlue;"|Stock Equipment
 * style="text-align: center; background-color: LightSkyBlue; width: 50px;" | Space
 * align=center style="width: 50px;" |${slots}
 * colspan="5" style="text-align: center; background-color: LightSkyBlue;"|Stock Equipment
 * style="text-align: center; background-color: LightSkyBlue; width: 50px;" | Space
 * style="text-align: center; background-color: LightSkyBlue; width: 50px;" | Space
 * colspan="6" style="text-align: center; padding: 0px;" |
 * }]],

function ShipInfoKai:Infobox(args) return self{ _args = args, }:create_infobox end

function ShipInfoKai:edit_link self._vars.edit_link = Formatting:format_edit_link(self._ship_data_module, self._edit_link_text, self._ship_data_documentation) end

function ShipInfoKai:bg_color local back = self._ship:back self._vars.top_bg_color, self._vars.top_extra_style = Formatting:format_ship_back(back), Formatting:extra_style_background_image(back and back > 7, back and back > 6) or "" end

function ShipInfoKai:rarity self._vars.rarity = Formatting:format_ship_rarity(self._ship:rarity) end

function ShipInfoKai:name self._vars.name = Formatting:format_link(self._ship:link) end

function ShipInfoKai:localized_name local localized_name = self._ship:localized_name if localized_name then self._vars.localized_name = format{self._localized_name_template, localized_name = Formatting:format_stat(localized_name)} else self._vars.localized_name = "" end end

function ShipInfoKai:japanese_name self._vars.japanese_name = tostring(Formatting:japanese_text(Formatting:format_stat(self._ship:japanese_name), Formatting:format_stat(self._ship:reading))) end

function ShipInfoKai:nick local nick = self._ship:nick if nick then local japanese_nick = self._ship:japanese_nick local reading_nick = self._ship:reading_nick if reading_nick then japanese_nick = tostring(Formatting:japanese_text{japanese_nick, reading_nick}) end self._vars.nick = format{self._nick_template, nick = nick, japanese_nick = japanese_nick} else self._vars.nick = "" end end

function ShipInfoKai:id local true_id = self._ship:true_id if true_id then self._vars.id = Formatting:tooltip(Formatting:format_stat(self._ship:id), Formatting:format_stat(true_id)) else self._vars.id = Formatting:format_stat(self._ship:id) end end

function ShipInfoKai:class local class = self._ship:class self._vars.class = Formatting:format_stat(class and class:name) end

function ShipInfoKai:type local class = self._ship:class local ship_type = Formatting:format_ship_type(self._ship:type) if class and class:is_type then ship_type = "(" .. ship_type .. ")" end self._vars.type = ship_type end

function ShipInfoKai:image self._vars.image = ShipCardKai:get{ship = self._ship} end

function ShipInfoKai:hp local hp = Formatting:format_stat(self._ship:hp) local hp_max = self._ship:hp_max if hp_max then self._vars.hp = Formatting:tooltip(hp, format{self._kekkon_max_template, value = Formatting:format_stat(hp_max)}) else self._vars.hp = hp	end end

function ShipInfoKai:firepower self._vars.firepower = Formatting:format_stat_with_max(self._ship:firepower, self._ship:firepower_max) end

function ShipInfoKai:armor self._vars.armor = Formatting:format_stat_with_max(self._ship:armor, self._ship:armor_max) end

function ShipInfoKai:torpedo self._vars.torpedo = Formatting:format_stat_with_max(self._ship:torpedo, self._ship:torpedo_max) end

function ShipInfoKai:evasion local evasion, evasion_max local override = self._args.evasion local override_max = self._args.evasion_max local overridden = false if override and override ~= "auto" then evasion = override overridden = true else evasion = self._ship:evasion end if override_max and override_max ~= "auto" then evasion_max = override_max overridden = true else evasion_max = self._ship:evasion_max end local result = Formatting:format_stat_with_max(evasion, evasion_max) if overridden then result = result .. self._overridden_category_template end self._vars.evasion = result end

function ShipInfoKai:aa self._vars.aa = Formatting:format_stat_with_max(self._ship:aa, self._ship:aa_max) end

function ShipInfoKai:aircraft self._vars.aircraft = Formatting:format_stat(self._ship:total_space) end

function ShipInfoKai:asw local asw, asw_max local overridden = false local override = self._args.asw local override_max = self._args.asw_max if override and override ~= "auto" then asw = override overridden = true else asw = self._ship:asw end if override_max and override_max ~= "auto" then asw_max = override_max overridden = true else asw_max = self._ship:asw_max end local result = Formatting:format_stat_with_max(asw, asw_max) if overridden then result = result .. self._overridden_category_template end self._vars.asw = result end

function ShipInfoKai:speed self._vars.speed = Formatting:format_speed(self._ship:speed) end

function ShipInfoKai:los local los, los_max local override = self._args.los local override_max = self._args.los_max local overridden = false if override and override ~= "auto" then los = override overridden = true else los = self._ship:los end if override_max and override_max ~= "auto" then los_max = override_max overridden = true else los_max = self._ship:los_max end local result = Formatting:format_stat_with_max(los, los_max) if overridden then result = result .. self._overridden_category_template end self._vars.los = result end

function ShipInfoKai:range self._vars.range = Formatting:format_range(self._ship:range) end

function ShipInfoKai:luck self._vars.luck = Formatting:format_stat_with_max(self._ship:luck, self._ship:luck_max) end

function ShipInfoKai:build_remodel_header self._vars.build_remodel_header = self._ship:remodel_level and self._remodel_level or self._build_time end

function ShipInfoKai:build_remodel_info local remodel_level = self._ship:remodel_level if remodel_level or self._ship:remodel_from then self._vars.build_remodel_info = Formatting:format_remodel_level_and_item_cost(remodel_level, self._ship:remodel_blueprint, self._ship:remodel_catapult) else local buildable = self._ship:buildable local buildable_lsc = self._ship:buildable_lsc if buildable or buildable_lsc then local buildable_methods = {} if buildable then table.insert(buildable_methods, Formatting:format_link(self._normal_construction_category, self._normal_construction)) end if buildable_lsc then table.insert(buildable_methods, Formatting:format_link(self._large_ship_construction_category, self._large_ship_construction)) end self._vars.build_remodel_info = Formatting:format_stat_with_max(Formatting:seconds_to_hms(self._ship:build_time * 60), table.concat(buildable_methods, ", ")) else local build_time = self._ship:build_time self._vars.build_remodel_info = build_time and Formatting:tooltip(self._unbuildable, Formatting:seconds_to_hms(build_time * 60)) or self._unbuildable end end

local remodel_cost = self._ship:remodel_cost if remodel_cost then self._vars.remodel_cost = format{self._remodel_cost_template, remodel_cost = Formatting:format_resources(remodel_cost)} else self._vars.remodel_cost = "" end

if self._ship:remodel_from == self._ship:remodel_to then self._vars.reversion_cost = format{self._reversion_cost_template, suffix = Ship(self._ship:remodel_to):display_suffix, level_items = Formatting:format_remodel_level_and_item_cost(self._ship:remodel_to_level, self._ship:remodel_to_blueprint, self._ship:remodel_to_catapult), resources = Formatting:format_resources(self._ship:remodel_to_cost) }	else self._vars.reversion_cost = "" end end

function ShipInfoKai:slots self._vars.slots = Formatting:format_stat(self._ship:slots) end

function ShipInfoKai:slot_details local slots = {} local num_of_slots = self._ship:slots_length local slots_to_show if num_of_slots then slots_to_show = math.max(self._default_slot_num, num_of_slots) else slots_to_show = self._default_slot_num end for i = 1, slots_to_show do		local equipment, size, estimation, icon, color, equipment_type if num_of_slots and i > num_of_slots then equipment, size, estimation, icon, color, equipment_type = "- Locked -", false, false, "", 0, false else equipment, size, estimation = self._ship:slot(i) if equipment then icon = equipment:icon color = equipment:back equipment_type = equipment:type equipment = Formatting:format_link(equipment:link) else icon = false color = 0 equipment = equipment == false and "- Unequipped -" or Formatting:format_stat(equipment) equipment_type = false end if size == false then equipment = Formatting:strike(equipment) end icon = Formatting:format_image{Formatting:format_equipment_icon(icon), caption = Formatting:format_equipment_type(equipment_type)} end table.insert(slots, format{self._slot_template, 			icon = icon, 			equipment = equipment, 			slot_size = Formatting:format_slot_size(size, estimation), 			color = "whitesmoke", --Formatting:format_equipment_back(color), 			extra_style = "", --Formatting:extra_style_background_image(false, color >= 4)		}) end self._vars.slot_details = table.concat(slots) end

function ShipInfoKai:consumption self._vars.fuel, self._vars.ammo = Formatting:format_stat(self._ship:fuel), Formatting:format_stat(self._ship:ammo) end

function ShipInfoKai:modernization self._vars.modernization = Formatting:format_modernization_bonuses(self._ship:modernization) end

function ShipInfoKai:scrap self._vars.scrap = Formatting:format_resources(self._ship:scrap) end

function ShipInfoKai:create_item if self._args.name then self._ship = Ship(self._args.name, self._args.model) else self._ship = Ship(self._args[1]) end end

function ShipInfoKai:get_module self._ship_data_module = Ship:get_module(self._args.name or self._args[1]) end

function ShipInfoKai:create_infobox_prep local icons = { hp = StatIcons.hp, firepower = StatIcons.firepower, armor = StatIcons.armor, torpedo = StatIcons.torpedo, evasion = StatIcons.evasion, aa = StatIcons.aa, aircraft = StatIcons.aircraft, asw = StatIcons.asw, speed = StatIcons.speed, los = StatIcons.los, range = StatIcons.range, luck = StatIcons.luck, fuel = ResourceIcons.fuel, ammo = ResourceIcons.ammo, }	local labels = {} for k,v in pairs(icons) do		icons[k] = Formatting:format_image{v} labels[k] = Formatting:format_stat_name(k) end self._vars = {icons = icons, labels = labels} local table_classes = {"typography-xl-optout", "infobox"} if self._args.classes then table.insert(table_classes, self._args.classes) end local collapsible = self._args.collapsible if collapsible then table.insert(table_classes, "mw-collapsible") table.insert(table_classes, "mw-collapsed") end self._vars.table_class = table.concat(table_classes, " ") self._vars.table_id = collapsible and collapsible ~= "true" and ("mw-customcollapsible-" .. collapsible) or "" self._vars.float = self._args.float or "none" end

function ShipInfoKai:format_template for _, field in ipairs(self._fields) do		self[field](self) end return format(self._template, self._vars) end

function ShipInfoKai:add_fields return end

function ShipInfoKai:create_infobox self:add_fields self:create_item self:get_module self:create_infobox_prep return self:format_template end

return ShipInfoKai