• Welcome to the Kancolle Wiki!
  • If you have any questions regarding site content, account registration, etc., please visit the KanColle Wiki Discord

Difference between revisions of "Module:EnemyShipListKai"

From Kancolle Wiki
Jump to navigation Jump to search
com>Ckwng
 
(39 intermediate revisions by 6 users not shown)
Line 1: Line 1:
 
local BaseTable = require('Module:BaseTable')
 
local BaseTable = require('Module:BaseTable')
 +
local EnemyColors = require('Module:EnemyColors')
 
local EnemyShip = require('Module:EnemyShip')
 
local EnemyShip = require('Module:EnemyShip')
 
local Formatting = require('Module:Formatting')
 
local Formatting = require('Module:Formatting')
 
local ShipBattleCardKai = require('Module:ShipBattleCardKai')
 
local ShipBattleCardKai = require('Module:ShipBattleCardKai')
 
local ShipCapabilities = require('Module:ShipCapabilities')
 
local ShipCapabilities = require('Module:ShipCapabilities')
local StatIcons = require('Module:StatIcons')
+
local StatIcons = require('Module:Data/Asset')
 +
local Iterator = require('Module:Iterator')
 +
local EquipInfo = require('Module:EquipmentInfoKai')
  
local format = require('Module:StringInterpolation').format
+
local format = require('Module:Core').format
  
 
local EnemyShipListKai = BaseTable{
 
local EnemyShipListKai = BaseTable{
Line 20: Line 23:
 
! style="width: 30px; text-align: center; vertical-align: middle; background-color: violet;" | ${evasion}
 
! style="width: 30px; text-align: center; vertical-align: middle; background-color: violet;" | ${evasion}
 
! style="text-align: center; vertical-align: middle;" | Armament
 
! style="text-align: center; vertical-align: middle;" | Armament
! style="text-align:left;" | Notes]],
+
! style="text-align:left;" | Notes
 +
! OASW
 +
! Opening Torpedo
 +
! Night Bombing
 +
! AACI]],
 
_columns = {
 
_columns = {
 
"card",
 
"card",
Line 34: Line 41:
 
"armament",
 
"armament",
 
"notes",
 
"notes",
 +
"oasw",
 +
"otorp",
 +
"nightbombing",
 +
"aaci",
 +
},
 +
_cell = [[|style="text-align:${text_align};background-color:${bg_color}"|${value}]],
 +
_column_cell_templates = {
 +
card = [[|style="text-align:${text_align};background-color:${bg_color};background-image:${background_image}" |${value}]],
 +
--card = [[|style="text-align:${text_align}"|${value}]],
 
},
 
},
_cell = [[| style="text-align: ${text_align}; padding:5px 5px 5px 5px; background-color: ${bg_color};" |${value}]],
 
 
_item_class = function(item_key) return EnemyShip(item_key) end,
 
_item_class = function(item_key) return EnemyShip(item_key) end,
 
_fragment_prefix = "enemyshiplistkai",
 
_fragment_prefix = "enemyshiplistkai",
 
_icon_caption_template = "${equipment} - ${equipment_type}",
 
_icon_caption_template = "${equipment} - ${equipment_type}",
 
_installation_label = "Installation",
 
_installation_label = "Installation",
 +
_pillbox_label = "Pillbox",
 +
_opening_torpedo_label = "Opening Torpedo",
 
_air_power_template = "${air_power} Air Power",
 
_air_power_template = "${air_power} Air Power",
 
_night_bombing_label = "Night Bombing",
 
_night_bombing_label = "Night Bombing",
 
_asw_label = "ASW",
 
_asw_label = "ASW",
 
_high_asw_label = "High ASW",
 
_high_asw_label = "High ASW",
 +
_estimation_label = "Estimation",
 
}
 
}
  
 
function EnemyShipListKai:name(ship)
 
function EnemyShipListKai:name(ship)
local name = ship:name()
+
local name = Formatting:format_link(ship:link())
 
local value = {name}
 
local value = {name}
 
local japanese_name = ship:japanese_name()
 
local japanese_name = ship:japanese_name()
 
if japanese_name and name ~= japanese_name then
 
if japanese_name and name ~= japanese_name then
 +
local reading = ship:reading()
 +
if reading then
 +
japanese_name = Formatting:japanese_text(japanese_name, reading)
 +
end
 
table.insert(value, Formatting:format_stat(japanese_name))
 
table.insert(value, Formatting:format_stat(japanese_name))
 
end
 
end
Line 58: Line 80:
 
function EnemyShipListKai:card(ship)
 
function EnemyShipListKai:card(ship)
 
local value
 
local value
local bg_color = Formatting:format_ship_back(ship:back())
+
local bg_color, background_image = EnemyColors:rarity_colors(ship)
 +
background_image = EnemyColors:variant_background_image(ship, background_image)
 
if ship == false then
 
if ship == false then
 
value = Formatting:format_image{self._blank, size = self._size}
 
value = Formatting:format_image{self._blank, size = self._size}
 
else
 
else
value = ShipBattleCardKai:get{ship = ship, size = self._size, link = ship:link(), caption = ship:name()}
+
value = ShipBattleCardKai:get{ship = ship, size = self._size, link = ship:link(), hd = true, size = '160px', caption = ship:name()}
 
end
 
end
return {value = value, bg_color = bg_color, text_align = self._center_align}
+
return {
 +
value = value,
 +
bg_color = bg_color,
 +
background_image = background_image or self._none,
 +
text_align = self._center_align,
 +
}
 
end
 
end
  
Line 88: Line 116:
  
 
function EnemyShipListKai:hp(ship)
 
function EnemyShipListKai:hp(ship)
return {value = Formatting:format_stat(ship:hp()), bg_color = "#e6cfd3", text_align = self._center_align}
+
return {value = Formatting:format_stat(ship:hp()), bg_color = "#f0d9dd", text_align = self._center_align}
 
end
 
end
  
Line 101: Line 129:
 
function EnemyShipListKai:armament(ship)
 
function EnemyShipListKai:armament(ship)
 
local icons, roles = {}, {}
 
local icons, roles = {}, {}
local sonar, dc, air_power = false, false, false
+
local sonar, dc, air_power, active_midget_submarine = false, false, false, false
  
 
for i = 1, ship:slots_length() do
 
for i = 1, ship:slots_length() do
local equipment, size, estimation, icon, equipment_type, equipment_link = ship:slot(i)
+
local equipment, size, estimation = ship:slot(i)
 +
local icon, equipment_type, equipment_link
 
if equipment then
 
if equipment then
 
icon = equipment:icon()
 
icon = equipment:icon()
Line 115: Line 144:
 
dc = true
 
dc = true
 
end
 
end
 +
local real_equipment = equipment:link()
 +
equipment = real_equipment or equipment
 +
equipment_link = equipment
 +
--[[
 
equipment_link, equipment = Formatting:format_link(equipment:link())
 
equipment_link, equipment = Formatting:format_link(equipment:link())
 
equipment = equipment or equipment_link
 
equipment = equipment or equipment_link
 +
]]
 
else
 
else
 
icon = disabled and "" or false
 
icon = disabled and "" or false
Line 127: Line 161:
 
end
 
end
 
table.insert(icons, icon)
 
table.insert(icons, icon)
end
 
if ShipCapabilities:_is_submarine(ship) then
 
if ship:opening_torpedo() then
 
table.insert(roles, self._opening_torpedo_label)
 
end
 
else
 
if midget_submarine then
 
table.insert(roles, self._opening_torpedo_label)
 
end
 
 
end
 
end
 
if air_power then
 
if air_power then
table.insert(roles, format{self._air_power_template, air_power = Formatting:format_stat(ship:air_power())})
+
    local ap_text = format{self._air_power_template, air_power = Formatting:format_stat(ship:air_power())}
end
+
    if ship:air_power_estimation() then
if ShipCapabilities:_is_aviation_ship(ship) then
+
        ap_text = Formatting:tooltip(ap_text, self._estimation_label)
if ship:night_bombing() then
+
        end
table.insert(roles, self._night_bombing_label)
+
table.insert(roles, ap_text)
end
 
 
end
 
end
 
if sonar or dc then
 
if sonar or dc then
Line 158: Line 182:
 
function EnemyShipListKai:notes(ship)
 
function EnemyShipListKai:notes(ship)
 
local note = self._notes[ship]
 
local note = self._notes[ship]
local back = ship:back()
+
local back = ship:back() or 0
 
local value = {}
 
local value = {}
 
if back < -1 then
 
if back < -1 then
 
table.insert(value, tostring(mw.html.create('span'):css({color = Formatting:format_ship_back(back)}):tag('b'):wikitext(Formatting:format_ship_rarity(back)):allDone()))
 
table.insert(value, tostring(mw.html.create('span'):css({color = Formatting:format_ship_back(back)}):tag('b'):wikitext(Formatting:format_ship_rarity(back)):allDone()))
 
end
 
end
if ship:is_installation() then
+
if ship:speed() == 0 then
table.insert(value, tostring(mw.html.create('b'):wikitext(self._installation_label)))
+
table.insert(value, tostring(mw.html.create('b'):wikitext(ship:is_pillbox() and self._pillbox_label or self._installation_label)))
 
end
 
end
 
if note then
 
if note then
Line 170: Line 194:
 
end
 
end
 
return {value = table.concat(value, "<br/>"), bg_color = self._transparent, text_align = self._start_align}
 
return {value = table.concat(value, "<br/>"), bg_color = self._transparent, text_align = self._start_align}
 +
end
 +
 +
function EnemyShipListKai:oasw(ship)
 +
local capabilities = ShipCapabilities{_ship = ship}
 +
local value = {}
 +
local attack_power, opening, day, night, uncertain = capabilities:asw_attack()
 +
local label = opening and "Yes" or "No"
 +
 +
return {value = label, bg_color = opening and "green" or self._transparent, text_align = self._start_align}
 +
end
 +
 +
function EnemyShipListKai:otorp(ship)
 +
local roles = {}
 +
local active_midget_submarine = false
 +
 +
for i = 1, ship:slots_length() do
 +
local equipment, size, estimation = ship:slot(i)
 +
if equipment then
 +
if ShipCapabilities._is_active_midget_submarine(equipment) then
 +
active_midget_submarine = true
 +
end
 +
end
 +
end
 +
 +
local can_otorp = false
 +
 +
if ShipCapabilities:_is_submarine(ship) then
 +
if ship:suffix() and (ship:suffix():match("Elite") or ship:suffix():match("Flagship")) then
 +
can_otorp = true
 +
end
 +
elseif active_midget_submarine then
 +
can_otorp = true
 +
end
 +
local label = can_otorp and "Yes" or "No"
 +
 +
return {value = label, bg_color = can_otorp and "green" or self._transparent, text_align = self._start_align}
 +
end
 +
 +
function EnemyShipListKai:nightbombing(ship)
 +
local roles = {}
 +
local can_night = false
 +
 +
if ShipCapabilities:_is_night_bombing(ship) then
 +
can_night = true
 +
end
 +
local label = can_night and "Yes" or "No"
 +
 +
return {value = label, bg_color = can_night and "green" or self._transparent, text_align = self._start_align}
 +
end
 +
 +
function EnemyShipListKai:aaci(ship)
 +
local ha_aafd, cd_mg, other_mg, air_radar = 0, 0, 0, 0
 +
 +
for i = 1, ship:slots_length() do
 +
local equipment, size, estimation = ship:slot(i)
 +
local equipment_type
 +
if equipment then
 +
equipment_type = equipment:type()
 +
 +
if ShipCapabilities:_is_main_gun(equipment) or ShipCapabilities:_is_secondary_gun(equipment) then
 +
if equipment:is_aafd() then
 +
ha_aafd = ha_aafd + 1
 +
end
 +
elseif ShipCapabilities:_is_radar(equipment) then
 +
if equipment:aa() and equipment:aa() > 2 then
 +
air_radar = air_radar + 1
 +
end
 +
elseif equipment_type == 21 then --AA guns
 +
if equipment:aa() >= 9 then
 +
cd_mg = cd_mg + 1
 +
elseif equipment:aa() >= 3 then
 +
other_mg = other_mg + 1
 +
end
 +
end
 +
end
 +
end
 +
 +
local can_aaci = true
 +
local api = nil
 +
 +
if ha_aafd >= 2 and air_radar >= 1 then
 +
api = 5
 +
elseif ha_aafd >= 1 and air_radar >= 1 then
 +
api = 8
 +
elseif cd_mg >= 1 and other_mg >= 1 and air_radar >= 1 then
 +
api = 12
 +
else
 +
can_aaci = false
 +
end
 +
local label = can_aaci and "API: " .. api or "No"
 +
 +
return {value = label, bg_color = can_aaci and "green" or self._transparent, text_align = self._start_align}
 
end
 
end
  
Line 196: Line 312:
 
return EnemyShipListKai:Table(args)
 
return EnemyShipListKai:Table(args)
 
end
 
end
 +
 +
-- * Tests.
 +
function EnemyShipListKai.test()
 +
    function testList(name, args)
 +
    local names = {}
 +
        local iterator = Iterator[name](args)
 +
        local i = 0
 +
        while iterator.next() do
 +
            names[i] = iterator.current() or '?'
 +
            i = i + 1
 +
        end
 +
        return names
 +
    end
 +
   
 +
    local result = testList('enemiesByTypeAndInstallationAndBoss', { type = '9', boss = 'no', installation='yes'})
 +
    mw.log(EnemyShipListKai:Table(result))
 +
   
 +
    result = testList('enemiesByTypeAndInstallationAndBoss', { type = '2', boss = 'no' , listBase = 'true'})
 +
mw.log(EnemyShipListKai:Table(result))
 +
 +
    result = testList('enemiesByTypeAndInstallationAndBoss', { type = '-13', boss = 'yes' , installation = 'no'})
 +
mw.log(EnemyShipListKai:Table(result))
 +
end
 +
-- p.test()
  
 
return EnemyShipListKai
 
return EnemyShipListKai

Latest revision as of 17:17, 24 August 2024

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

local BaseTable = require('Module:BaseTable')
local EnemyColors = require('Module:EnemyColors')
local EnemyShip = require('Module:EnemyShip')
local Formatting = require('Module:Formatting')
local ShipBattleCardKai = require('Module:ShipBattleCardKai')
local ShipCapabilities = require('Module:ShipCapabilities')
local StatIcons = require('Module:Data/Asset')
local Iterator = require('Module:Iterator')
local EquipInfo = require('Module:EquipmentInfoKai')

local format = require('Module:Core').format

local EnemyShipListKai = BaseTable{
	_header_template = [[! style="min-width: 180px;" | Card
! style="min-width: 75px;" | Name
! Type
! style="width: 30px; text-align: center; vertical-align: middle; background-color: pink;" | ${hp}
! style="width: 30px; text-align: center; vertical-align: middle; background-color: lightcoral;" | ${firepower}
! style="width: 30px; text-align: center; vertical-align: middle; background-color: lightskyblue;" | ${torpedo}
! style="width: 30px; text-align: center; vertical-align: middle; background-color: sandybrown;" | ${aa}
! style="width: 30px; text-align: center; vertical-align: middle; background-color: #9C8FEE;" | ${asw}
! style="width: 30px; text-align: center; vertical-align: middle; background-color: #F2E279;" | ${armor}
! style="width: 30px; text-align: center; vertical-align: middle; background-color: violet;" | ${evasion}
! style="text-align: center; vertical-align: middle;" | Armament
! style="text-align:left;" | Notes
! OASW
! Opening Torpedo
! Night Bombing
! AACI]],
	_columns = {
		"card",
		"name",
		"type",
		"hp",
		"firepower",
		"torpedo",
		"aa",
		"asw",
		"armor",
		"evasion",
		"armament",
		"notes",
		"oasw",
		"otorp",
		"nightbombing",
		"aaci",
	},
	_cell = [[|style="text-align:${text_align};background-color:${bg_color}"|${value}]],
	_column_cell_templates = {
		card = [[|style="text-align:${text_align};background-color:${bg_color};background-image:${background_image}" |${value}]],
		--card = [[|style="text-align:${text_align}"|${value}]],
	},
	_item_class = function(item_key) return EnemyShip(item_key) end,
	_fragment_prefix = "enemyshiplistkai",
	_icon_caption_template = "${equipment} - ${equipment_type}",
	_installation_label = "Installation",
	_pillbox_label = "Pillbox",
	_opening_torpedo_label = "Opening Torpedo",
	_air_power_template = "${air_power} Air Power",
	_night_bombing_label = "Night Bombing",
	_asw_label = "ASW",
	_high_asw_label = "High ASW",
	_estimation_label = "Estimation",
}

function EnemyShipListKai:name(ship)
	local name = Formatting:format_link(ship:link())
	local value = {name}
	local japanese_name = ship:japanese_name()
	if japanese_name and name ~= japanese_name then
		local reading = ship:reading()
		if reading then
			japanese_name = Formatting:japanese_text(japanese_name, reading)
		end
		table.insert(value, Formatting:format_stat(japanese_name))
	end
	return {value = Formatting:id_span(tostring(ship:api_id() or mw.ustring.lower(mw.ustring.gsub(ship:name(), "%s+"))), self._fragment_prefix, table.concat(value, "<br />")), bg_color = self._transparent, text_align = self._start_align}
end

function EnemyShipListKai:card(ship)
	local value
	local bg_color, background_image = EnemyColors:rarity_colors(ship)
	background_image = EnemyColors:variant_background_image(ship, background_image)
	if ship == false then
		value = Formatting:format_image{self._blank, size = self._size}
	else
		value = ShipBattleCardKai:get{ship = ship, size = self._size, link = ship:link(), hd = true, size = '160px', caption = ship:name()}
	end
	return {
		value = value,
		bg_color = bg_color,
		background_image = background_image or self._none,
		text_align = self._center_align,
	}
end

function EnemyShipListKai:type(ship)
	return {value = Formatting:format_ship_code(ship:type()), bg_color = self._transparent, text_align = self._start_align}
end

function EnemyShipListKai:firepower(ship)
	return {value = Formatting:format_stat(ship:firepower()), bg_color = "#e6cfcf", text_align = self._center_align}
end

function EnemyShipListKai:torpedo(ship)
	return {value = Formatting:format_stat(ship:torpedo()), bg_color = "#cfdde6", text_align = self._center_align}
end

function EnemyShipListKai:aa(ship)
	return {value = Formatting:format_stat(ship:aa()), bg_color = "#e6d9cf", text_align = self._center_align}
end

function EnemyShipListKai:asw(ship)
	return {value = Formatting:format_stat(ship:asw()), bg_color = "#d2cee6", text_align = self._center_align}
end

function EnemyShipListKai:hp(ship)
	return {value = Formatting:format_stat(ship:hp()), bg_color = "#f0d9dd", text_align = self._center_align}
end

function EnemyShipListKai:armor(ship)
	return {value = Formatting:format_stat(ship:armor()), bg_color = "#e6e3cf", text_align = self._center_align}
end

function EnemyShipListKai:evasion(ship)
	return {value = Formatting:format_stat(ship:evasion()), bg_color = "#e6cee6", text_align = self._center_align}
end

function EnemyShipListKai:armament(ship)
	local icons, roles = {}, {}
	local sonar, dc, air_power, active_midget_submarine = false, false, false, false

	for i = 1, ship:slots_length() do
		local equipment, size, estimation = ship:slot(i)
		local icon, equipment_type, equipment_link
		if equipment then
			icon = equipment:icon()
			equipment_type = equipment:type()
			if ShipCapabilities:_is_air_power_plane(equipment) then
				air_power = true
			elseif ShipCapabilities:_is_sonar(equipment) then
				sonar = true
			elseif ShipCapabilities:_is_depth_charge(equipment) then
				dc = true
			end
			local real_equipment = equipment:link()
			equipment = real_equipment or equipment
			equipment_link = equipment
			--[[
			equipment_link, equipment = Formatting:format_link(equipment:link())
			equipment = equipment or equipment_link
			]]
		else
			icon = disabled and "" or false
			equipment = equipment == false and (disabled and "- Locked -" or "- Unequipped -") or Formatting:format_stat(equipment)
			equipment_link = false
			equipment_type = false
		end
		if icon ~= "" then
			icon = Formatting:format_image{Formatting:format_equipment_icon(icon), link = equipment_link, caption = format{self._icon_caption_template, equipment_type = Formatting:format_equipment_type(equipment_type), equipment = equipment}}
		end
		table.insert(icons, icon)
	end
	if air_power then
	    local ap_text = format{self._air_power_template, air_power = Formatting:format_stat(ship:air_power())}
	    if ship:air_power_estimation() then
	        ap_text = Formatting:tooltip(ap_text, self._estimation_label)
        end
		table.insert(roles, ap_text)
	end
	if sonar or dc then
		if sonar and dc then
			table.insert(roles, self._high_asw_label)
		else
			table.insert(roles, self._asw_label)
		end
	end

	return {value = table.concat(icons) .. '<br/>' .. table.concat(roles, ", "), bg_color = self._transparent, text_align = self._start_align}
end

function EnemyShipListKai:notes(ship)
	local note = self._notes[ship]
	local back = ship:back() or 0
	local value = {}
	if back < -1 then
		table.insert(value, tostring(mw.html.create('span'):css({color = Formatting:format_ship_back(back)}):tag('b'):wikitext(Formatting:format_ship_rarity(back)):allDone()))
	end
	if ship:speed() == 0 then
		table.insert(value, tostring(mw.html.create('b'):wikitext(ship:is_pillbox() and self._pillbox_label or self._installation_label)))
	end
	if note then
		table.insert(value, note.note or "")
	end
	return {value = table.concat(value, "<br/>"), bg_color = self._transparent, text_align = self._start_align}
end

function EnemyShipListKai:oasw(ship)
	local capabilities = ShipCapabilities{_ship = ship}
	local value = {}
	local attack_power, opening, day, night, uncertain = capabilities:asw_attack()
	local label = opening and "Yes" or "No"
	
	return {value = label, bg_color = opening and "green" or self._transparent, text_align = self._start_align}
end

function EnemyShipListKai:otorp(ship)
	local roles = {}
	local active_midget_submarine = false

	for i = 1, ship:slots_length() do
		local equipment, size, estimation = ship:slot(i)
		if equipment then
			if ShipCapabilities._is_active_midget_submarine(equipment) then
				active_midget_submarine = true
			end
		end
	end
	
	local can_otorp = false
	
	if ShipCapabilities:_is_submarine(ship) then
		if ship:suffix() and (ship:suffix():match("Elite") or ship:suffix():match("Flagship")) then
			can_otorp = true
		end
	elseif active_midget_submarine then
		can_otorp = true
	end
	local label = can_otorp and "Yes" or "No"

	return {value = label, bg_color = can_otorp and "green" or self._transparent, text_align = self._start_align}
end

function EnemyShipListKai:nightbombing(ship)
	local roles = {}
	local can_night = false

	if ShipCapabilities:_is_night_bombing(ship) then
		can_night = true
	end
	local label = can_night and "Yes" or "No"

	return {value = label, bg_color = can_night and "green" or self._transparent, text_align = self._start_align}
end

function EnemyShipListKai:aaci(ship)
	local ha_aafd, cd_mg, other_mg, air_radar = 0, 0, 0, 0

	for i = 1, ship:slots_length() do
		local equipment, size, estimation = ship:slot(i)
		local equipment_type
		if equipment then
			equipment_type = equipment:type()
			
			if ShipCapabilities:_is_main_gun(equipment) or ShipCapabilities:_is_secondary_gun(equipment) then
				if equipment:is_aafd() then
					ha_aafd = ha_aafd + 1
				end
			elseif ShipCapabilities:_is_radar(equipment) then
				if equipment:aa() and equipment:aa() > 2 then
					air_radar = air_radar + 1
				end
			elseif equipment_type == 21 then --AA guns
				if equipment:aa() >= 9 then
					cd_mg = cd_mg + 1
				elseif equipment:aa() >= 3 then
					other_mg = other_mg + 1
				end
			end
		end
	end
	
	local can_aaci = true
	local api = nil
	
	if ha_aafd >= 2 and air_radar >= 1 then
		api = 5
	elseif ha_aafd >= 1 and air_radar >= 1 then
		api = 8
	elseif cd_mg >= 1 and other_mg >= 1 and air_radar >= 1 then
		api = 12
	else
		can_aaci = false
	end
	local label = can_aaci and "API: " .. api or "No"

	return {value = label, bg_color = can_aaci and "green" or self._transparent, text_align = self._start_align}
end

EnemyShipListKai.process_item_key = EnemyShip.process_item_key

EnemyShipListKai.build_rows = EnemyShipListKai.build_rows_breaks_as_empty_rows

function EnemyShipListKai:create_header()
	local header_icons = {
		firepower = StatIcons.firepower, 
		torpedo = StatIcons.torpedo, 
		aa = StatIcons.aa, 
		asw = StatIcons.asw,  
		hp = StatIcons.hp, 
		armor = StatIcons.armor,
		evasion = StatIcons.evasion,
	}
	for key, value in pairs(header_icons) do
		header_icons[key] = Formatting:format_image{value, caption = Formatting:format_stat_name(key)}
	end
	self._header = format(self._header_template, header_icons)
end

function EnemyShipListKai.Invoke(frame)
	local args = require('Module:GetArgs'){frame = frame:getParent()}
	return EnemyShipListKai:Table(args)
end

-- * Tests.
function EnemyShipListKai.test()
    function testList(name, args)
    	local names = {}
        local iterator = Iterator[name](args)
        local i = 0
        while iterator.next() do
            names[i] = iterator.current() or '?'
            i = i + 1
        end
        return names
    end
    
    local result = testList('enemiesByTypeAndInstallationAndBoss', { type = '9', boss = 'no', installation='yes'})
    mw.log(EnemyShipListKai:Table(result))
    
    result = testList('enemiesByTypeAndInstallationAndBoss', { type = '2', boss = 'no' , listBase = 'true'})
	mw.log(EnemyShipListKai:Table(result))
	
    result = testList('enemiesByTypeAndInstallationAndBoss', { type = '-13', boss = 'yes' , installation = 'no'})
	mw.log(EnemyShipListKai:Table(result))
end
-- p.test()

return EnemyShipListKai