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

Module:EquipmentListKai

From Kancolle Wiki
Revision as of 10:20, 21 March 2015 by com>Ckwng (Fix column display logic)
Jump to navigation Jump to search

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

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 = [[!No.
!Rarity
!Name
!Type
${stat_columns}
!Classes
!Craftable
! style="white-space:nowrap;width:130px;" |Notes]],
	_column_header_cell_template = "!${value}",
	_column_cell_templates = {
		name = [[| colspan="1" rowspan="${rowspan}" style="text-align: ${text_align}; background-color: ${bg_color};" |${values.name}<br />${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",
		"armor",
		"shelling_accuracy",
		"evasion",
		"speed",
		"range",
		"compatibility",
		"buildable",
		"notes",
	},
	_stat_columns = {
		"firepower",
		"torpedo",
		"bombing",
		"aa",
		"asw",
		"los",
		"luck",
		"armor",
		"shelling_accuracy",
		"evasion",
		"speed",
		"range",
	},
	_list_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 = [[| colspan="1" rowspan="${rowspan}" style="text-align: ${text_align}; background-color: ${bg_color};" |${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,
			}, "<br />"),
		}, 
		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: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._columns = self._comparison_columns
		self._shown_stats = {}

		for index, 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)
				end
				if index > 1 then
					for _, column in ipairs(self._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 = {}
		for stat_column, _ in pairs(self._shown_stats) do
			table.insert(stat_columns, format{self._column_header_cell_template, value = Formatting:format_image{StatIcons[stat_column], caption = Formatting:format_stat_name(stat_column)}})
		end
		for _, column in ipairs(self._stat_columns) do
			if not self._shown_stats[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
		self._columns = self._list_columns
		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