Module:ShipData

Revision as of 02:04, 5 June 2015 by com>Ckwng (Move air_power down from EnemyShipData, add installation property)

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

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

local BaseData = require("Module:BaseData")
local ShipData = BaseData{
	_constructor_module = "Module:Ship",
}

function ShipData:name(raw)
	if self:suffix() and (raw or self:display_suffix() ~= false) then
		return self:base_name() .. " " .. (raw and self:suffix() or self:display_suffix())
	else
		return self:base_name()
	end
end

function ShipData:base_name()
	return self._name
end

function ShipData:suffix()
	return self._suffix
end

function ShipData:display_suffix()
	if self._display_suffix == false then
		return self._display_suffix
	end
	return self._display_suffix or self._suffix
end

function ShipData:link()
	if self._page then
		return self._page, self:name()
	elseif self:suffix() then
		return self:base_name(), self:name()
	else
		return self:name()
	end
end

function ShipData:localized_name()
	return self._localized_name
end

function ShipData:nick()
	return self._nick
end

function ShipData:japanese_name()
	return self._japanese_name
end

function ShipData:japanese_nick()
	return self._japanese_nick
end

function ShipData:reading()
	return self._reading
end

function ShipData:reading_nick()
	return self._reading_nick
end

function ShipData:id()
	return self._id
end

function ShipData:api_id()
	return self._api_id
end

function ShipData:true_id()
	return self._true_id
end

function ShipData:rarity()
	return self._rarity
end

function ShipData:back()
	return self._back or self:rarity()
end

function ShipData:class()
	return self._class
end

function ShipData:class_number()
	return self._class_number
end

function ShipData:type()
	return self._type
end

function ShipData:is_installation()
	return self._installation
end

function ShipData:card()
	if self._card then
		return self._card
	elseif self._card_reference then
		Ship = Ship or require(self._constructor_module)
		return Ship:create_from_reference(self._card_reference, self):card()
	end
	api_id = self:api_id()
	if api_id then
		return Formatting:ship_card(api_id, self:name(true), self:type(), self._card_extension)
	end
	return self._card
end

function ShipData:card_damaged()
	if self._card_damaged then
		return self._card_damaged
	elseif self._card_damaged_reference then
		Ship = Ship or require(self._constructor_module)
		return Ship:create_from_reference(self._card_damaged_reference, self):card_damaged()
	end
	api_id = self:api_id()
	if api_id then
		return Formatting:ship_card_damaged(api_id, self:name(true), self:type(), self._card_damaged_extension)
	end
	return self._card_damaged
end

function ShipData:battle_card()
	if self._battle_card then
		return self._battle_card
	elseif self._battle_card_reference then
		Ship = Ship or require(self._constructor_module)
		return Ship:create_from_reference(self._battle_card_reference, self):battle_card()
	end
	api_id = self:api_id()
	if api_id then
		return Formatting:ship_battle_card(api_id, self:name(true), self:type(), self._battle_card_extension)
	end
	return self._battle_card
end

function ShipData:battle_card_layers()
	return self._battle_card_layers
end

function ShipData:battle_card_damaged()
	if self._battle_card_damaged then
		return self._battle_card_damaged
	elseif self._battle_card_damaged_reference then
		Ship = Ship or require(self._constructor_module)
		return Ship:create_from_reference(self._battle_card_damaged_reference, self):battle_card_damaged()
	end
	api_id = self:api_id()
	if api_id then
		return Formatting:ship_battle_card_damaged(api_id, self:name(true), self:type(), self._battle_card_damaged_extension)
	end
	return self._battle_card_damaged
end

function ShipData:cg()
	if self._cg then
		return self._cg
	elseif self._cg_reference then
		Ship = Ship or require(self._constructor_module)
		return Ship:create_from_reference(self._cg_reference, self):cg()
	end
	api_id = self:api_id()
	if api_id then
		return Formatting:ship_cg(api_id, self:name(true), self:type(), self._cg_extension)
	end
	return self._cg
end

function ShipData:cg_damaged()
	if self._cg_damaged then
		return self._cg_damaged
	elseif self._cg_damaged_reference then
		Ship = Ship or require(self._constructor_module)
		return Ship:create_from_reference(self._cg_damaged_reference, self):cg_damaged()
	end
	api_id = self:api_id()
	if api_id then
		return Formatting:ship_cg_damaged(api_id, self:name(true), self:type(), self._cg_damaged_extension)
	end
	return self._cg_damaged
end

function ShipData:level()
	return self._level
end

function ShipData:hp()
	return self._hp
end

function ShipData:hp_max()
	return self._hp_max
end

function ShipData:hp_leveled()
	local hp = self:hp()
	if self._level and self._level > 100 then
		return math.floor((self:hp_max() - hp) * (self._level - 99) / 51 + hp)
	end
	return hp
end

function ShipData:firepower()
	return self._firepower
end

function ShipData:firepower_max()
	return self._firepower_max
end

function ShipData:firepower_leveled()
	if self._firepower_leveled then
		return self._firepower_leveled
	end
	return self:firepower_max()
end

function ShipData:torpedo()
	return self._torpedo
end

function ShipData:torpedo_max()
	return self._torpedo_max
end

function ShipData:firepower_leveled()
	if self._torpedo_leveled then
		return self._torpedo_leveled
	end
	return self:torpedo_max()
end

function ShipData:aa()
	return self._aa
end

function ShipData:aa_max()
	return self._aa_max
end

function ShipData:firepower_leveled()
	if self._aa_leveled then
		return self._aa_leveled
	end
	return self:aa_max()
end

function ShipData:armor()
	return self._armor
end

function ShipData:armor_max()
	return self._armor_max
end

function ShipData:armor_leveled()
	if self._armor_leveled then
		return self._armor_leveled
	end
	return self:armor_max()
end

function ShipData:asw()
	return self._asw
end

function ShipData:asw_max()
	return self._asw_max
end

function ShipData:asw_leveled()
	if self._level then
		local asw = self:asw()
		return math.floor((self:asw_max() - asw) * self._level / 99 + asw)
	end
	return self:asw_max()
end

function ShipData:evasion()
	return self._evasion
end

function ShipData:evasion_max()
	return self._evasion_max
end

function ShipData:evasion_leveled()
	if self._level then
		local evasion = self:evasion()
		return math.floor((self:evasion_max() - evasion) * self._level / 99 + evasion)
	end
	return self:evasion_max()
end

function ShipData:los()
	return self._los
end

function ShipData:los_max()
	return self._los_max
end

function ShipData:los_leveled()
	if self._level then
		local los = self:los()
		return math.floor((self:los_max() - los) * self._level / 99 + los)
	end
	return self:los_max()
end

function ShipData:luck()
	return self._luck
end

function ShipData:luck_max()
	return self._luck_max
end

function ShipData:luck_leveled()
	if self._luck_leveled then
		return self._luck_leveled
	end
	return self:luck()
end

function ShipData:buildable()
	return self._buildable
end

function ShipData:buildable_lsc()
	return self._buildable_lsc
end

function ShipData:build_time()
	return self._build_time
end

function ShipData:remodel_from()
	return self._remodel_from
end

function ShipData:remodel_to()
	return self._remodel_to
end

function ShipData:remodel_level()
	return self._remodel_level
end

function ShipData:remodel_cost()
	return {fuel = false, ammo = self._remodel_ammo, steel = self._remodel_steel, bauxite = false}
end

function ShipData:remodel_blueprint()
	return self._remodel_blueprint
end

function ShipData:modernization()
	return {firepower = self._firepower_mod, torpedo = self._torpedo_mod, aa = self._aa_mod, armor = self._armor_mod, luck = self._luck_mod}
end

function ShipData:scrap()
	return {fuel = self._scrap_fuel, ammo = self._scrap_ammo, steel = self._scrap_steel, bauxite = self._scrap_baux}
end

function ShipData:fuel()
	return self._fuel
end

function ShipData:ammo()
	return self._ammo
end

function ShipData:slot_space(slot)
	if self._equipment then
		local equipment_slot = self._equipment[slot]
		if equipment_slot then
			return equipment_slot.size
		end
	end
	return nil
end

function ShipData:slot(slot)
	if self._equipment then
		local equipment_slot = self._equipment[slot]
		if equipment_slot then
			if type(equipment_slot.equipment) == "string" then
				equipment_slot.equipment = Equipment(equipment_slot.equipment)
			end
			return equipment_slot.equipment, equipment_slot.size
		end
	end
	return nil
end

function ShipData:slots()
	if self._equipment then
		return #self._equipment
	end
	return nil
end

function ShipData:total_space()
	if not self._equipment then
		return nil
	end
	local total_space = 0
	local size
	for _, v in ipairs(self._equipment) do
		size = v["size"]
		if size == nil then
			total_space = nil
			break
		elseif size == false then
		else
			total_space = total_space + size
		end
	end
	return total_space
end

function ShipData:speed()
	return self._speed
end

function ShipData:range()
	return self._range
end

function ShipData:air_power()
    local air_power = 0
    for i = 1, self:slots() or 0 do
        local slot_equipment, slot_space = self:slot(i)
        if slot_equipment == nil or slot_space == nil then
            --we have missing information, fall back to hard-coded air power
            air_power = self._as_rating
            break
        elseif slot_equipment ~= false then
            --if there is an equipment
            local slot_equipment_type = slot_equipment:type()
            local slot_equipment_aa = slot_equipment:aa()
            if slot_equipment_aa and
               (slot_equipment_type == 6 or 
                slot_equipment_type == 7 or 
                slot_equipment_type == 8 or 
                slot_equipment_type == 11) then
                air_power = air_power + 
                   math.floor(math.sqrt(slot_space) * slot_equipment_aa)
            elseif slot_equipment_aa == nil then
            --we have missing information, fall back to hard-coded air power
                air_power = self._as_rating
                break
            end
        end
    end
    return air_power
end
 
function ShipData:night_bombing()
	return self._night_bombing
end

function ShipData:opening_torpedo()
	return self._opening_torpedo
end

function ShipData:asw_attack()
	return self._asw_attack
end

function ShipData:create(ship)
	ship = ship or {}
	if ship._class then
		ship._class = ShipClass(ship._class)
	end
	setmetatable(ship, ship)
	ship.__index = self
	ship.__call = self.__call
	return ship
end

return ShipData