Module:ShipData

local ShipData = {}

function ShipData:name(type, raw) return self.format_stat(self._name, raw) end

function ShipData:japanese_name(raw) return self.format_stat(self._japanese_name, raw) end

function ShipData:id(raw) return self.format_stat(self._id, raw) end

function ShipData:true_id(raw) return self.format_stat(self._true_id, raw) end

function ShipData:has_true_id return self._true_id == false end

function ShipData:rarity(raw) return self.format_rarity(self._rarity, raw) end

function ShipData:class(raw) return self.format_stat(self._class, raw) end

function ShipData:type(raw) return self.format_type(self._type, raw) end

function ShipData:card(type) return self._card end

function ShipData:firepower(raw) return self.format_stat(self._firepower, raw) end

function ShipData:firepower_max(raw) return self.format_stat(self._firepower_max, raw) end

function ShipData:has_firepower_max return self._firepower_max ~= false end

function ShipData:torpedo(raw) return self.format_stat(self._torpedo, raw) end

function ShipData:torpedo_max(raw) return self.format_stat(self._torpedo_max, raw) end

function ShipData:has_torpedo_max return self._torpedo_max ~= false end

function ShipData:aa(raw) return self.format_stat(self._aa, raw) end

function ShipData:aa_max(raw) return self.format_stat(self._aa_max, raw) end

function ShipData:has_aa_max return self._aa_max ~= false end

function ShipData:armor(raw) return self.format_stat(self._armor, raw) end

function ShipData:armor_max(raw) return self.format_stat(self._armor_max, raw) end

function ShipData:has_armor_max return self._armor_max ~= false end

function ShipData:asw(raw) return self.format_stat(self._asw, raw) end

function ShipData:asw_max(raw) return self.format_stat(self._asw_max, raw) end

function ShipData:has_asw_max return self._asw_max ~= false end

function ShipData:evasion(raw) return self.format_stat(self._evasion, raw) end

function ShipData:evasion_max(raw) return self.format_stat(self._evasion_max, raw) end

function ShipData:has_evasion_max return self._evasion_max ~= false end

function ShipData:los(raw) return self.format_stat(self._los, raw) end

function ShipData:los_max(raw) return self.format_stat(self._los_max, raw) end

function ShipData:has_los_max return self._los_max ~= false end

function ShipData:luck(raw) return self.format_stat(self._luck, raw) end

function ShipData:luck_max(raw) return self.format_stat(self._luck_max, raw) end

function ShipData:has_luck_max return self._luck_max ~= false end

function ShipData:buildable return self._buildable end

function ShipData.build_time(raw) if raw then return self._build_time elseif self._build_time then return os.date(self._build_time * 60) else return "??" end end

function ShipData:equipment(slot, raw) local equipment_slot = self._equipment[slot] if not equipment_slot then return not raw and "- Locked -" or nil end local equipment = equipment_slot["equipment"] if raw then return equipment elseif equipment == nil then return "??" elseif equipment == false then return "- Unequipped -" else return equipment end end

function ShipData:space(slot, raw) local equipment_slot = self._equipment[slot] if not equipment_slot then return not raw and "-" or nil end local space = equipment_slot["space"] if space == nil then return "??" elseif space == false then return "-" else return space end end

function ShipData:slots return #self._equipment end

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

function ShipData.speed return self.format_speed(self._speed) end

function ShipData.range return self.format_range(self._speed) end

function ShipData.create_formatter(lookup) return function(stat, raw) if raw then return stat elseif stat == nil then return "??" end local result = lookup[stat] if result == nil then return stat else return result end end end

ShipData.format_stat = ShipData.create_formatter({	[false] = "",	})

ShipData.format_speed = ShipData.create_formatter({	[5] = "Slow",	[10] = "Fast",	})

ShipData.format_range = ShipData.create_formatter({	[1] = "Short",	[2] = "Medium",	[3] = "Long",	[0] = "Very Short",	[4] = "Very Long",	})

ShipData.format_rarity = ShipData.create_formatter({	[0] = "??",	[1] = "Very Common",	[2] = "Common",	[3] = "Uncommon",	[4] = "Rare",	[5] = "Very Rare",	[6] = "Holo",	[7] = "S Holo",	[8] = "SS Holo",	[-1] = "Abyssal",	[-2] = "Elite",	[-3] = "Flagship",	[-4] = "Kai",	[-5] = "Kai Elite",	[-6] = "Kai Flagship",	[-7] = "Late Model",	float = "Floating Fortress",	demon = "Demon",	princess = "Princess",	war_demon = "War Demon",	war_princess = "War Princess",	})

ShipData.format_type = ShipData.create_formatter({	[0] = "??",	[1] = "Coastal Defence ShipData",	[2] = "Destroyer",	[3] = "Light Cruiser",	[4] = "Torpedo Cruiser",	[5] = "Heavy Cruiser",	[6] = "Aviation Cruiser",	[7] = "Light Carrier",	[8] = "Battleship",	[9] = "Battleship",	[10] = "Aviation Battleship",	[11] = "Standard Carrier",	[12] = "Super Dreadnought",	[13] = "Submarine",	[14] = "Aircraft Carrying Submarine",	[15] = "Replenishment Oiler",	[16] = "Seaplane Tender",	[17] = "Amphibious Assault Ship",	[18] = "Armored Carrier",	[19] = "Repair Ship",	[20] = "Submarine Tender",	})

function ShipData:create(ship) ship = ship or {} setmetatable(ship, self) self.__index = self return ship end

ShipData.__call = ShipData.create

return ShipData