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

Module:ShipCardKai

From Kancolle Wiki
Revision as of 06:05, 7 September 2015 by com>Ckwng (Add support for adding layers via call, more layers, layers for full cards)
Jump to navigation Jump to search

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

local Ship = require('Module:Ship')
local Formatting = require('Module:Formatting')

local format = require("Module:StringOperations").format
local split = require("Module:StringOperations").split

local ShipCardKai = {
	_card_size = "218x300px",
	_battle_card_size = "160x40px",
	_card_layers = {
		status_expedition = {image = "Card Status Expedition.png", top = "229px", left = "133px"},
		status_repair = {image = "Card Status Repair.png", top = "229px", left = "133px"},
		status_light_damage = {image = "Card Status Light Damage.png", top = "229px", left = "133px"},
		status_medium_damage = {image = "Card Status Medium Damage.png", top = "229px", left = "133px"},
		status_heavy_damage = {image = "Card Status Heavy Damage.png", top = "229px", left = "133px"},
		status_sunk = {image = "Card Status Sunk.png", top = "229px", left = "133px"},
	},
	_battle_card_layers = {
		takoyaki = {image = "Hell plane 2.png", top = "5px", left = "50px", size = "30x30px"},
		hell = {image = "Hell plane 2.png", top = "5px", left = "50px", size = "30x30px"},
		hell_r = {image = "Hell plane 2.png", top = "5px", left = "120px", size = "30x30px"},
		hell_l1 = {image = "Hell plane 2.png", top = "9px", left = "44px", size = "30x30px"},
		hell_r1 = {image = "Hell plane 2.png", top = "9px", left = "109px", size = "30x30px"},
		hell_offset_l1 = {image = "Hell plane 2.png", top = "9px", left = "44px", size = "30x30px"},
		hell_offset_r1 = {image = "Hell plane 2.png", top = "9px", left = "109px", size = "30x30px"},
		flagship = {image = "Flagship battle card icon.png", top = "3px", left = "139px"},
		revenge_kai_l2 = {image = "Abyssal Revenge Torpedo Bomber Kai.png", top = "0px", left = "60px", size = "35x44px"},
		revenge_kai_r2 = {image = "Abyssal Revenge Torpedo Bomber Kai.png", top = "0px", left = "125px", size = "35x44px"},
		revenge_kai_offset_l2 = {image = "Abyssal Revenge Torpedo Bomber Kai.png", top = "0px", left = "60px", size = "35x44px"},
		revenge_kai_offset_r2 = {image = "Abyssal Revenge Torpedo Bomber Kai.png", top = "0px", left = "125px", size = "35x44px"},
		hell_kai_l1 = {image = "Abyssal Hell Dive Bomber Kai.png", top = "5px", left = "39px", size = "35x35px"},
		hell_kai_r1 = {image = "Abyssal Hell Dive Bomber Kai.png", top = "5px", left = "104px", size = "35x35px"},
		hell_kai_offset_l1 = {image = "Abyssal Hell Dive Bomber Kai.png", top = "5px", left = "39px", size = "35x35px"},
		hell_kai_offset_r1 = {image = "Abyssal Hell Dive Bomber Kai.png", top = "5px", left = "104px", size = "35x35px"},
		attack_seaplane_kai_r = {image = "Abyssal Attack Seaplane Kai.png", top = "0px", left = "120px", size = "35x35px"},
		status_expedition = {image = "Battle Card Status Expedition.png", top = "0px", left = "0px"},
		status_repair = {image = "Battle Card Status Repair.png", top = "0px", left = "0px"},
		status_light_damage = {image = "Battle Card Status Light Damage.png", top = "0px", left = "0px"},
		status_medium_damage = {image = "Battle Card Status Medium Damage.png", top = "0px", left = "0px"},
		status_heavy_damage = {image = "Battle Card Status Heavy Damage.png", top = "0px", left = "0px"},
		status_light_damage_installation = {image = "Battle Card Status Light Damage Installation.png", top = "0px", left = "0px"},
		status_medium_damage_installation = {image = "Battle Card Status Medium Damage Installation.png", top = "0px", left = "0px"},
		status_heavy_damage_installation = {image = "Battle Card Status Heavy Damage Installation.png", top = "0px", left = "0px"},
		status_sunk_installation = {image = "Battle Card Status Sunk Installation.png", top = "0px", left = "0px"},
		smudge_light = {image = "Battle Card Smudge Light.png", top = "0px", left = "0px"},
		smudge_medium = {image = "Battle Card Smudge Medium.png", top = "0px", left = "0px"},
		smudge_heavy = {image = "Battle Card Smudge Heavy.png", top = "0px", left = "0px"},
	},
	_image_wrapper = [[<span class="image-stack" style="display: inline-block; position: relative;">${layers}</span>]],
	_image_layer = [[<span class="image-layer" style="position: absolute; top: ${top}; left: ${left}; line-height: 0px;">${image}</span>]],
}

function ShipCardKai:card(ship, args)
	if not args then
		args = ship
		ship = args.ship
	end
	local image = Formatting:format_image{args.damaged and ship:card_damaged() or ship:card(), size = args.size or self._card_size, link = args.link, caption = args.caption}
	if args.layers then
		local layers = {image}
		for _, layer in ipairs(split(args.layers)) do
			if self._card_layers[layer] then
				self:_add_layer(layers, self._card_layers[layer])
			end
		end
		image = format{self._image_wrapper, layers = table.concat(layers)}
	end
	return image
end

function ShipCardKai:Card(args)
	local ship = self:create_ship(args)
	return self:card(ship, args)
end

function ShipCardKai:battle_card(ship, args)
	if not args then
		args = ship
		ship = args.ship
	end
	local image = Formatting:format_image{args.damaged and ship:battle_card_damaged() or ship:battle_card(), size = args.size or self._battle_card_size, link = args.link, caption = args.caption}
	local ship_layers = ship:battle_card_layers()
	if ship_layers or args.flagship or args.layers then
		local layers = {image}
		if ship_layers then
			for _, layer in ipairs(ship_layers) do
				self:_add_layer(layers, self._battle_card_layers[layer])
			end
		end
		if args.flagship then
			self:_add_layer(layers, self._battle_card_layers.flagship)
		end
		if args.layers then
			for _, layer in ipairs(split(args.layers)) do
				if self._battle_card_layers[layer] then
					self:_add_layer(layers, self._battle_card_layers[layer])
				end
			end
		end
		image = format{self._image_wrapper, layers = table.concat(layers)}
	end
	return image
end

function ShipCardKai:_add_layer(layers, layer)
	table.insert(layers, format{self._image_layer, image = Formatting:format_image{layer.image, caption = layer.caption, size = layer.size}, top = layer.top, left = layer.left})
end

function ShipCardKai:BattleCard(args)
	local ship = self:create_ship(args)
	return self:battle_card(ship, args)
end

function ShipCardKai:create_ship(args)
	if args.name then
		return Ship(args.name, args.model)
	else
		return Ship(args[1])
	end
end

return ShipCardKai