Module:ShipBattleCardKai

Revision as of 07:30, 28 March 2019 by がか (talk | contribs)

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

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

local split = require("Module:Utils").split

local ShipBattleCardKai = ShipAsset{
	_battle_card_size = "160x40px",
	_battle_card_size_hd = "240x60px",
	_battle_card_layers = {
		attack_hawk_r = {image = "Abyssal_Patrolling_Attack_Hawk_574_Equipment.png", style = {top = "8px", left = "126px"}, size = "30x28px"},
		attack_hawk_r1 = {image = "Abyssal_Patrolling_Attack_Hawk_574_Equipment.png", style = {top = "13px", left = "106px"}, size = "30x28px"},
		attack_hawk_r2 = {image = "Abyssal_Patrolling_Attack_Hawk_574_Equipment.png", style = {top = "1px", left = "127px"}, size = "30x28px"},
		attack_seaplane_kai_r = {image = "Abyssal Attack Seaplane Kai.png", style = {top = "0px", left = "120px"}, size = "35x35px"},
		cat_night_r = {image = "Abyssal_Night_Cat_Fighter_581_Equipment.png", style = {top = "8px", left = "126px"}, size = "35x30px"},
		cat_night_r1 = {image = "Abyssal_Night_Cat_Fighter_581_Equipment.png", style = {top = "13px", left = "106px"}, size = "30x28px"},
		cat_night_r2 = {image = "Abyssal_Night_Cat_Fighter_581_Equipment.png", style = {top = "1px", left = "127px"}, size = "35x30px"},
		cat_r = {image = "Hell plane 1.png", style = {top = "8px", left = "126px"}, size = "25x30px"},
		cat_r1 = {image = "Hell plane 1.png", style = {top = "13px", left = "106px"}, size = "25x30px"},
		cat_r2 = {image = "Hell plane 1.png", style = {top = "1px", left = "127px"}, size = "25x30px"},
		dive_night_r = {image = "Abyssal_Night_Dive_Bomber_582_Equipment.png", style = {top = "8px", left = "126px"}, size = "35x30px"},
		dive_night_r1 = {image = "Abyssal_Night_Dive_Bomber_582_Equipment.png", style = {top = "13px", left = "106px"}, size = "26x26px"},
		dive_night_r2 = {image = "Abyssal_Night_Dive_Bomber_582_Equipment.png", style = {top = "1px", left = "127px"}, size = "35x30px"},
		flagship = { image = "Flagship battle card icon.png", top = 3, right = 3, width = 18 },
		hell = { image = "Hell plane 2.png", top = 5, left = 50, width = 30 },
		hell_cat_kai_r = {image = "Abyssal_Cat_Fighter_Kai_556_Equipment.png", style = {top = "8px", left = "126px"}, size = "35x30px"},
		hell_cat_kai_r1 = {image = "Abyssal_Cat_Fighter_Kai_556_Equipment.png", style = {top = "5px", left = "104px"}, size = "35x30px"},
		hell_cat_kai_r2 = {image = "Abyssal_Cat_Fighter_Kai_556_Equipment.png", style = {top = "1px", left = "127px"}, size = "35x30px"},
		hell_kai_l1 = {image = "Abyssal Hell Dive Bomber Kai.png", style = {top = "5px", left = "39px"}, size = "35x35px"},
		hell_kai_offset_l1 = {image = "Abyssal Hell Dive Bomber Kai.png", style = {top = "5px", left = "39px"}, size = "35x35px"},
		hell_kai_offset_r1 = {image = "Abyssal Hell Dive Bomber Kai.png", style = {top = "5px", left = "104px"}, size = "35x35px"},
		hell_kai_r1 = {image = "Abyssal Hell Dive Bomber Kai.png", style = {top = "5px", left = "104px"}, size = "35x35px"},
		hell_l1 = {image = "Hell plane 2.png", style = {top = "9px", left = "44px"}, size = "30x30px"},
		hell_offset_l1 = {image = "Hell plane 2.png", style = {top = "9px", left = "44px"}, size = "30x30px"},
		hell_offset_r1 = {image = "Hell plane 2.png", style = {top = "9px", left = "109px"}, size = "30x30px"},
		hell_r = {image = "Hell plane 2.png", style = {top = "5px", left = "120px"}, size = "30x30px"},
		hell_r1 = {image = "Hell plane 2.png", style = {top = "9px", left = "109px"}, size = "30x30px"},
		liberation_ace_r1 = {image = "Abyssal Liberation Land-based Dive Bomber Ace 562 Equipment.png", style = {top = "15px", left = "104px"}, size = "32x24px"},
		liberation_ace_r2 = {image = "Abyssal Liberation Land-based Dive Bomber Ace 562 Equipment.png", style = {top = "3px", left = "125px"}, size = "32x24px"},
		liberation_r = {image = "Abyssal Liberation Land-based Dive Bomber 561 Equipment.png", style = {top = "10px", left = "120px"}, size = "32x24px"},
		liberation_r1 = {image = "Abyssal Liberation Land-based Dive Bomber 561 Equipment.png", style = {top = "15px", left = "104px"}, size = "32x24px"},
		liberation_r2 = {image = "Abyssal Liberation Land-based Dive Bomber 561 Equipment.png", style = {top = "3px", left = "125px"}, size = "32x24px"},
		revenge_kai_l2 = {image = "Abyssal Revenge Torpedo Bomber Kai.png", style = {top = "0px", left = "60px"}, size = "35x44px"},
		revenge_kai_offset_l2 = {image = "Abyssal Revenge Torpedo Bomber Kai.png", style = {top = "0px", left = "60px"}, size = "35x44px"},
		revenge_kai_offset_r2 = {image = "Abyssal Revenge Torpedo Bomber Kai.png", style = {top = "0px", left = "125px"}, size = "35x44px"},
		revenge_kai_r1 = {image = "Abyssal Revenge Torpedo Bomber Kai.png", style = {top = "5px", left = "104px"}, size = "35x44px"},
		revenge_kai_r2 = {image = "Abyssal Revenge Torpedo Bomber Kai.png", style = {top = "0px", left = "125px"}, size = "35x44px"},
		revenge_night_r = {image = "Abyssal_Night_Revenge_Torpedo_Bomber_583_Equipment.png", style = {top = "8px", left = "126px"}, size = "35x30px"},
		revenge_night_r1 = {image = "Abyssal_Night_Revenge_Torpedo_Bomber_583_Equipment.png", style = {top = "5px", left = "104px"}, size = "35x30px"},
		revenge_night_r2 = {image = "Abyssal_Night_Revenge_Torpedo_Bomber_583_Equipment.png", style = {top = "2px", left = "128px"}, size = "30x30px"},
		revenge_r2 = {image = "Hell plane 3.png", style = {top = "3px", left = "130px"}, size = "30x33px"},
		ring = {image = "Battle Card Marriage Ring.png", style = {top = "19px", left = "138px"}},
		ring_glow = {image = "Battle Card Marriage Ring Glow.png", style = {top = "10px", left = "126px", opacity = "0.7"}},
		smudge_heavy = {image = "Battle Card Smudge Heavy.png", style = {top = "0px", left = "0px"}},
		smudge_light = {image = "Battle Card Smudge Light.png", style = {top = "0px", left = "0px"}},
		smudge_medium = {image = "Battle Card Smudge Medium.png", style = {top = "0px", left = "0px"}},
		status_expedition = {image = "Battle Card Status Expedition.png", top = 0, left = 0, width = 160, height = 40 },
		status_heavy_damage = {image = "Battle Card Status Heavy Damage.png", top = 0, left = 0, width = 160, height = 40 },
		status_heavy_damage_installation = {image = "Battle Card Status Heavy Damage Installation.png", top = 0, left = 0, width = 160, height = 40 },
		status_light_damage = {image = "Battle Card Status Light Damage.png", top = 0, left = 0, width = 160, height = 40 },
		status_light_damage_installation = {image = "Battle Card Status Light Damage Installation.png", top = 0, left = 0, width = 160, height = 40 },
		status_medium_damage = {image = "Battle Card Status Medium Damage.png", top = 0, left = 0, width = 160, height = 40 },
		status_medium_damage_installation = {image = "Battle Card Status Medium Damage Installation.png", top = 0, left = 0, width = 160, height = 40 },
		status_repair = {image = "Battle Card Status Repair.png", top = 0, left = 0, width = 160, height = 40 },
		status_retreat = {image = "Battle Card Status Retreat.png", top = 0, left = 0, width = 160, height = 40 },
		status_sunk = {image = "Battle Card Status Sunk.png", top = 0, left = 0, width = 160, height = 40 },
		status_sunk_installation = {image = "Battle Card Status Sunk Installation.png", top = 0, left = 0, width = 160, height = 40 },
		takoyaki = {image = "Hell plane 2.png", style = {top = "5px", left = "50px"}, size = "30x30px"},
	},
}

function ShipBattleCardKai:get_source(ship, args)
	return args.damaged and ship:battle_card_damaged(true) or ship:battle_card(true)
end

local function scaleLayer(hd, layer)
    local top, left, right, width, height = layer.top, layer.left, layer.right, layer.width, layer.height or layer.width
    layer.style = layer.style or {}
    if top then
        layer.style.top = top * (hd and 1.5 or 1) .. 'px'
    end
    if left then
        layer.style.left = left * (hd and 1.5 or 1) .. 'px'
    end
    if right then
        layer.style.right = right * (hd and 1.5 or 1) .. 'px'
    end
    if width then
        layer.size = width * (hd and 1.5 or 1) .. 'x' .. height * (hd and 1.5 or 1) .. 'px'
    end
    return layer
end

function ShipBattleCardKai:get_layer(hd, layer_name)
    return scaleLayer(hd, self._battle_card_layers[layer_name])
end

function ShipBattleCardKai:get(ship, args, link)
	if not args then
		args = ship
		ship = args.ship
		link = args.link
	end
	args[1] = self:get_source(ship, args)
	if not args.size then
		args.size = args.hd and self._battle_card_size_hd or self._battle_card_size
	end
	if not args.caption then
		ship:name()
	end
	args.link = link
	local image = Formatting:format_image(args)
	local ship_layers = ship:battle_card_layers()
	if ship_layers or args.flagship or args.layers or args.grayscale then
		local stack = self:_create_stack(image, args.grayscale)
		if ship_layers then
			for _, layer in ipairs(ship_layers) do
				self:_add_layer(stack, self:get_layer(args.hd, layer), ship, args, link)
			end
		end
		if args.flagship then
			self:_add_layer(stack, self:get_layer(args.hd, "flagship"), ship, args, link)
		end
		if args.layers then
			for _, layer in ipairs(split(args.layers)) do
				if self:get_layer(args.hd, layer) then
					self:_add_layer(stack, self:get_layer(args.hd, layer), ship, args, link)
				end
			end
		end
		image = tostring(stack)
	end
	return image
end

function ShipBattleCardKai.formatLayerTestTable()
    local _ = require('Module:Core')
    local parts = { '{|\n!Code!!SD!!HD' }
    for _, layer in ipairs(_.isort(_.keys(ShipBattleCardKai._battle_card_layers))) do
        table.insert(parts, string.format(
            '|-\n!%s\n|%s\n|%s',
            layer,
            ShipBattleCardKai:Asset({ 'Taihou/Kai', layers = layer }),
            ShipBattleCardKai:Asset({ 'Taihou/Kai', layers = layer, hd = 'true' })
        ))
    end
    table.insert(parts, '|}')
    return table.concat(parts, '\n')
end

return ShipBattleCardKai