Module:ShipData

local 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", }

--Return the full name of the ship. function ShipData:name local suffix = self:display_suffix if suffix then return self:base_name .. " " .. suffix else return self:base_name end end

--Return the unique name of the ship. --Differs from name for some boss enemies that have a legacy role suffix, --which isn't shown for unique_name. function ShipData:unique_name local suffix = self:suffix if suffix then return self:base_name .. " " .. self:suffix else return self:base_name end end

--Return the name of the module containing this ship. --Note: This is pretty iffy. Try not to use it, it's badly defined. function ShipData:module_name if self._module_name then return self._module_name end return self:base_name end

--The base name of the ship. function ShipData:base_name return self._name end

--The suffix of the ship. Does not include legacy role suffixes. function ShipData:suffix return self._suffix end

--The suffix of the ship. Includes legacy role suffixes. function ShipData:display_suffix if self._display_suffix ~= nil then return self._display_suffix end return self._suffix end

--A group of values passable to Formatting:format_link to create a wikitext link to this ship. function ShipData:link if self._page then return self._page, self:unique_name else return self:unique_name end end

--A group of values passable to Formatting:format_link to create a wikitext link to the base page of this ship. --E.g. Shigure instead of Shigure Kai Ni. function ShipData:base_link if self._page then return self._page, self:name else return self:base_name, 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:overlay return self._overlay 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:is_pillbox return self._pillbox end

function ShipData:card if self._card ~= nil 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:unique_name, self:type, self._card_extension) end return self._card end

function ShipData:card_damaged if self._card_damaged ~= nil 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:unique_name, self:type, self._card_damaged_extension) end return self._card_damaged end

function ShipData:battle_card if self._battle_card ~= nil 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:unique_name, 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 ~= nil 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:unique_name, self:type, self._battle_card_damaged_extension) end return self._battle_card_damaged end

function ShipData:cg if self._cg ~= nil 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:unique_name, self:type, self._cg_extension) end return self._cg end

function ShipData:cg_damaged if self._cg_damaged ~= nil 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:unique_name, 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_married local bonuses = { [0] = 4,		[1] = 4,		[2] = 4,		[3] = 5,		[4] = 6,		[5] = 7,		[6] = 7,		[7] = 8,		[8] = 8,		[9] = 9,	}       local exceptions = { [131] = true, -- Yamato [143] = true, -- Musashi [163] = true, -- Maruyu -- [402] = true, -- Maruyu Kai (is +4, 7 -> 11) [171] = true, -- Bismarck [172] = true, -- Bismarck Kai [173] = true, -- Bismarck zwei [178] = true, -- Bismarck drei [275] = true, -- Nagato Kai [276] = true, -- Mutsu Kai [352] = true, -- Hayasui Kai [441] = true, -- Littorio [442] = true, -- Roma [446] = true, -- Italia [447] = true, -- Roma Kai }	local hp = self:hp if not hp then return nil end local api_id = self:api_id if exceptions[api_id] then return self:hp_max else local hp_digit = math.floor(hp / 10) local bonus = bonuses[hp_digit] if bonus then return hp + bonus else return nil end end 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:torpedo_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:aa_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(level) if not level and self._level then level = self._level end if level then local asw = self:asw if asw then return math.floor(((self:asw_max or asw) - asw) * level / 99 + asw) end 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(level) if not level and self._level then level = self._level end if level then local evasion = self:evasion if evasion then return math.floor(((self:evasion_max or evasion) - evasion) * level / 99 + evasion) end 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(level) if not level and self._level then level = self._level end if level then local los = self:los if los then return math.floor(((self:los_max or los) - los) * level / 99 + los) end 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, devmat = self._remodel_development_material, screw = false} end

function ShipData:remodel_blueprint return self._remodel_blueprint end

function ShipData:remodel_catapult return self._remodel_catapult end

function ShipData:remodel_to_level return self._remodel_to_level end

function ShipData:remodel_to_cost return {fuel = false, ammo = self._remodel_to_ammo, steel = self._remodel_to_steel, bauxite = false, devmat = self._remodel_to_development_material, screw = false} end

function ShipData:remodel_to_blueprint return self._remodel_to_blueprint end

function ShipData:remodel_to_catapult return self._remodel_to_catapult 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, devmat = false, screw = false} 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, equipment_slot.estimation 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 self:_prepare_Equipment equipment_slot.equipment = Equipment(equipment_slot.equipment) end return equipment_slot.equipment, equipment_slot.size, equipment_slot.estimation end end return nil end

function ShipData:slots return self._slots or self:slots_length end

function ShipData:slots_length 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(count_recons) local air_power = 0 for i = 1, self:slots_length 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 or                count_recons and slot_equipment_type == 10) 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:gun_fit_properties(fit_group) if not self._gun_fit_properties then return nil else return self._gun_fit_properties[fit_group] end 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:seasonal return self._seasonal end

--The voice actor for this ship. A string, or nil if unknown. --EXPERIMENTAL, DO NOT USE. Spec for this feature may rapidly change. function ShipData:voice_actor if self._voice_actor ~= nil then return self._voice_actor elseif self._voice_actor_reference or self:remodel_from then Ship = Ship or require(self._constructor_module) return Ship:create_from_reference(self._voice_actor_reference or self:remodel_from, self):voice_actor end return self._voice_actor end

--The artist for this ship. A string, or nil if unknown. --EXPERIMENTAL, DO NOT USE. Spec for this feature may rapidly change. function ShipData:artist if self._artist ~= nil then return self._artist elseif self._artist_reference or self:remodel_from then Ship = Ship or require(self._constructor_module) return Ship:create_from_reference(self._artist_reference or self:remodel_from, self):artist end return self._artist end

--The availability for this ship. --false = not available. --nil = unknown. --Otherwise a table with obtainment methods under numeric keys and optional detailed data under the obtainment method key. --E.g. {"drop", "event_reward", "event_drop", --     drop = {{1/*world*/, 4/*map*/, "B"/*node*/, 3/*formation (optional)*/}, {3, 2, "A"}}, --     event_reward = , --     event_drop = } --EXPERIMENTAL, DO NOT USE. Spec for this feature may rapidly change. function ShipData:availability if self:remodel_from then Ship = Ship or require(self._constructor_module) return Ship:create_from_reference(self:remodel_from, self):availability else return self._availability end end

--The implementation date for this ship. A 3-tuple of year, month, day (JST) as a table, or nil if unknown. --EXPERIMENTAL, DO NOT USE. Spec for this feature may rapidly change. function ShipData:implementation_date if self._implementation_date ~= nil then return self._implementation_date elseif self._implementation_date_reference or self:remodel_from then Ship = Ship or require(self._constructor_module) return Ship:create_from_reference(self._implementation_date_reference or self:remodel_from, self):implementation_date end return self._implementation_date end

function ShipData:_prepare_Equipment if not Equipment then Equipment = require('Module:Equipment') end 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