Module:EquipmentListKai

local BaseData = require('Module:BaseData') local Equipment = require('Module:Equipment') local Formatting = require('Module:Formatting') local StatIcons = require('Module:StatIcons')

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

local EquipmentListKai = BaseData{ _table_start = {| class="wikitable", _row_starter = "|-", _header_template = Notes, _column_header_cell_template = "!${value}", _column_cell_templates = { name = ${values.name} ${values.icon} ${values.japanese_name} },	_icons = { firepower = "${stat_icons.firepower}", torpedo = "${stat_icons.torpedo}", bombing = "${stat_icons.bombing}", aa = "${stat_icons.aa}", asw = "${stat_icons.asw}", los = "${stat_icons.los}", armor = "${stat_icons.armor}", accuracy = "${stat_icons.accuracy}", evasion = "${stat_icons.evasion}", range = "${stat_icons.range}", },	_comparison_columns = { "id", "stars", "name", "equipment_type", "firepower", "torpedo", "bombing", "aa", "asw", "los", "luck", "hp", "armor", "accuracy", "evasion", "speed", "range", "compatibility", "buildable", "notes", },	_columns = { "id", "stars", "name", "equipment_type", "stats", "compatibility", "buildable", "notes", },	_cell_color = { firepower = "#F0C0C0", torpedo = "#C0E4FA", aa = "#F4CAA6", asw = "#C5BEEE", los = "#CCFFEE", luck = "#C9FBC9", hp = "#FFD9DF", armor = "#F2ECC2", evasion = "#EEBEEE", speed = "#B8E6E6", aircraft = "#D9D9D9", fuel = "#94E094", ammo = "palegoldenrod", },	_cell = ${values.value}, _transparent = "transparent", _start_align = "start", _center_align = "center", _notes_suffix = "_notes", _stats_column_label = "Stats", _table_end = |}, }

function EquipmentListKai:Table(args) return self{ _args = args, }:create_table end

function EquipmentListKai:id(equipment) return {values = {value = Formatting:format_stat(equipment:id)}, bg_color = self._transparent, text_align = self._center_align} end

function EquipmentListKai:stars(equipment) return {values = {value = Formatting:format_stars(equipment:stars)}, bg_color = self._transparent, text_align = self._center_align} end

function EquipmentListKai:name(equipment) return {values = {name = Formatting:format_link(equipment:link), icon = Formatting:format_image{Formatting:format_equipment_icon(equipment:icon)}, japanese_name = Formatting:format_stat(equipment:japanese_name) }, 		bg_color = self._transparent, text_align = self._start_align, } end

function EquipmentListKai:equipment_type(equipment) return {values = {value = Formatting:format_equipment_type(equipment:type)}, bg_color = self._transparent, text_align = self._start_align} end

function EquipmentListKai:stats(equipment) return {values = {value = Formatting:format_stat_bonuses({				firepower = equipment:firepower, 				bombing = equipment:bombing, 				torpedo = equipment:torpedo, 				aa = equipment:aa, 				armor = equipment:armor, 				asw = equipment:asw, 				shelling_accuracy = equipment:shelling_accuracy,				torpedo_accuracy = equipment:torpedo_accuracy,				evasion = equipment:evasion,				los = equipment:los,				speed = Formatting:format_speed(equipment:speed),				luck = equipment:luck,				range = Formatting:format_range(equipment:range),				special = false,			}, " "), }, 		bg_color = self._transparent, text_align = self._start_align, } end

function EquipmentListKai:firepower(equipment) local firepower = equipment:firepower if firepower ~= false then self._shown_stats.firepower = true end return {values = {value = Formatting:format_stat(firepower)}, bg_color = self._transparent, text_align = self._center_align} end

function EquipmentListKai:torpedo(equipment) local torpedo = equipment:torpedo if torpedo ~= false then self._shown_stats.torpedo = true end return {values = {value = Formatting:format_stat}, bg_color = self._transparent, text_align = self._center_align} end

function EquipmentListKai:bombing(equipment) local bombing = equipment:bombing if bombing ~= false then self._shown_stats.bombing = true end return {values = {value = Formatting:format_stat(bombing)}, bg_color = self._transparent, text_align = self._center_align} end

function EquipmentListKai:aa(equipment) local aa = equipment:aa if aa ~= false then self._shown_stats.aa = true end return {values = {value = Formatting:format_stat(aa)}, bg_color = self._transparent, text_align = self._center_align} end

function EquipmentListKai:asw(equipment) local asw = equipment:asw if asw ~= false then self._shown_stats.asw = true end return {values = {value = Formatting:format_stat(asw)}, bg_color = self._transparent, text_align = self._center_align} end

function EquipmentListKai:los(equipment) local los = equipment:los if los ~= false then self._shown_stats.los = true end return {values = {value = Formatting:format_stat(los)}, bg_color = self._transparent, text_align = self._center_align} end

function EquipmentListKai:luck(equipment) local luck = equipment:luck if luck ~= false then self._shown_stats.luck = true end return {values = {value = Formatting:format_stat(luck)}, bg_color = self._transparent, text_align = self._center_align} end

function EquipmentListKai:hp(equipment) local hp = equipment:hp if hp ~= false then self._shown_stats.hp = true end return {values = {value = Formatting:format_stat(hp)}, bg_color = self._transparent, text_align = self._center_align} end

function EquipmentListKai:armor(equipment) local armor = equipment:armor if armor ~= false then self._shown_stats.armor = true end return {values = {value = Formatting:format_stat(armor)}, bg_color = self._transparent, text_align = self._center_align} end

function EquipmentListKai:shelling_accuracy(equipment) local shelling_accuracy = equipment:shelling_accuracy if shelling_accuracy ~= false then self._shown_stats.shelling_accuracy = true end return {values = {value = Formatting:format_stat(shelling_accuracy)}, bg_color = self._transparent, text_align = self._center_align} end

function EquipmentListKai:evasion(equipment) local evasion = equipment:evasion if evasion ~= false then self._shown_stats.evasion = true end return {values = {value = Formatting:format_stat(evasion)}, bg_color = self._transparent, text_align = self._center_align} end

function EquipmentListKai:speed(equipment) local speed = equipment:speed if speed ~= false then self._shown_stats.speed = true end return {values = {value = Formatting:format_speed(speed)}, bg_color = self._transparent, text_align = self._center_align} end

function EquipmentListKai:range(equipment) local range = equipment:range if range ~= false then self._shown_stats.range = true end return {values = {value = Formatting:format_range(range)}, bg_color = self._transparent, text_align = self._center_align} end

function EquipmentListKai:compatibility(equipment) return {values = {value = Formatting:format_ship_compatibility(equipment:equippable)}, bg_color = self._transparent, text_align = self._start_align} end

function EquipmentListKai:buildable(equipment) return {values = {value = Formatting:format_boolean(equipment:buildable)}, bg_color = self._transparent, text_align = self._start_align} end

function EquipmentListKai:notes(equipment) return {values = {value = ""}, bg_color = self._transparent, text_align = self._start_align} end

function EquipmentListKai.compare_values(val1, val2) if #val1 == #val2 then for value_type, value in pairs(val1) do			if value ~= val2[value_type] then return false end end else return false end return true end

function EquipmentListKai:create_table local equipment_list = {} self._notes = {} for index, equipment_name in ipairs(self._args) do		if equipment_name == "-" then table.insert(equipment_list, "break") elseif equipment_name == "#" then table.insert(equipment_list, "header") else table.insert(equipment_list, Equipment(equipment_name)) local note = self._args[equipment_name .. self._notes_suffix] if note then self._notes[equipment_name] = note end end end

local rows = {self._table_start} local header local data_rows = {}

if self._args.comparison == "true" then self._shown_stats = {}

for _, equipment in ipairs(equipment_list) do			local row_values if type(equipment) == "string" then row_values = equipment else row_values = {} for _, column in ipairs(self._stat_columns) do					row_values[column] = self[column](self, equipment) end if index > 1 then for _, column in ipairs(self._stat_columns) do						for i=index-1,1,-1 do							local previous_row = data_rows[i] local previous_row_type = type(previous_row) ~= "string" local previous_cell = previous_row_type and previous_row[column] or false if previous_cell then if self.compare_values(row_values[column].values, previous_cell.values) then previous_cell.rowspan = previous_cell.rowspan + 1 row_values[column] = nil else row_values[column].rowspan = 1 end break elseif not previous_row_type then row_values[column].rowspan = 1 break end end end else for _, column in ipairs(self._columns) do						row_values[column].rowspan = 1 end end end table.insert(data_rows, row_values) end

local stat_columns = {} local stat_columns_set = {} for _, stat_column in pairs(self._shown_stats) do			table.insert(stat_columns, Formatting:format_image(StatIcons[stat_column])) stat_columns_set[stat_column] = true end for _, column in ipairs(self._stat_columns) do			if not stat_columns_set[column] then for _, row_values in ipairs(data_rows) do					row_values[column] = nil end end end header = format{self._header_template, stat_columns = table.concat(stat_columns, "\n")} else header = format{self._header_template, stat_columns = format{self._column_header_cell_template, value = self._stats_column_label}} for _, equipment in ipairs(equipment_list) do			local row_values if type(equipment) == "string" then row_values = equipment else row_values = {} for _, column in ipairs(self._columns) do					row_values[column] = self[column](self, equipment) row_values[column].rowspan = 1 end end table.insert(data_rows, row_values) end end table.insert(rows, header) for index, row_values in ipairs(data_rows) do		if row_values ~= "break" then table.insert(rows, self._row_starter) if row_values == "header" then table.insert(rows, header) else for _, column in ipairs(self._columns) do					if row_values[column] then table.insert(rows, format(self._column_cell_templates[column] or self._cell, row_values[column])) end end end end end table.insert(rows, self._row_starter) table.insert(rows, header) table.insert(rows, self._table_end) return table.concat(rows, "\n") end

function EquipmentListKai.test(frame) local getArgs = require('Module:GetArgs') local args = getArgs{frame = frame} return EquipmentListKai:Table(args) end

return EquipmentListKai