Module:EquipmentData

local BaseData = require("Module:BaseData") local Equipment local EquipmentCompatibility --lazily loaded when equippable is called local Formatting = require('Module:Formatting')

local EquipmentData = BaseData({	_strict_translation_class = "strict-translation",	_common_translation_class = "common-translation",	_mobile_hide_class = "hidden",	_display_none_css = {display = "none"},	_constructor_module = "Module:Equipment", })

function EquipmentData:name return self._name end

function EquipmentData:strict_name return self._strict_name end

function EquipmentData:common_name return self._common_name or self:name end

function EquipmentData:asset_name return self._asset_name or self:common_name end

function EquipmentData:link if self._page then return self._page, self:name end return self:name end

function EquipmentData:id return self._id end

EquipmentData.api_id = EquipmentData.id

function EquipmentData:localized_name return self._localized_name end

function EquipmentData:reading return self._reading end

function EquipmentData:list_name return self._list_name end

function EquipmentData:list_japanese_name return self._list_japanese_name end

function EquipmentData:list_localized_name return self._list_localized_name end

function EquipmentData:list_reading return self._list_reading end

function EquipmentData:comparison_name return self._comparison_name end

function EquipmentData:comparison_japanese_name return self._comparison_japanese_name end

function EquipmentData:comparison_localized_name return self._comparison_localized_name end

function EquipmentData:comparison_reading return self._comparison_reading end

function EquipmentData:battle_name return self._battle_name end

function EquipmentData:battle_japanese_name return self._battle_japanese_name end

function EquipmentData:battle_localized_name return self._battle_localized_name end

function EquipmentData:battle_reading return self._battle_reading end

function EquipmentData:library_name return self._library_name end

function EquipmentData:library_japanese_name return self._library_japanese_name end

function EquipmentData:library_localized_name return self._library_localized_name end

function EquipmentData:library_reading return self._library_reading end

function EquipmentData:card_name return self._card_name end

function EquipmentData:card_japanese_name return self._card_japanese_name end

function EquipmentData:card_localized_name return self._card_localized_name end

function EquipmentData:card_reading return self._card_reading end

function EquipmentData:japanese_name return self._japanese_name end

function EquipmentData:type return self._type end

function EquipmentData:rarity return self._rarity end

function EquipmentData:stars return self._stars or self:back end

function EquipmentData:back return self._back or self:rarity end

function EquipmentData:card if self._card then return self._card elseif self._card_reference then Equipment = Equipment or require(self._constructor_module) return Equipment(self._card_reference):card end api_id = self:api_id if api_id then return Formatting:equipment_card(api_id, self:asset_name) end return self._card end

function EquipmentData:fairy if self._fairy then return self._fairy elseif self._fairy_reference then Equipment = Equipment or require(self._constructor_module) return Equipment(self._fairy_reference):fairy end api_id = self:api_id if api_id then return Formatting:equipment_fairy(api_id, self:asset_name) end return self._fairy end

function EquipmentData:cg if self._cg then return self._cg elseif self._cg_reference then Equipment = Equipment or require(self._constructor_module) return Equipment(self._cg_reference):cg end api_id = self:api_id if api_id then return Formatting:equipment_cg(api_id, self:asset_name) end return self._cg end

function EquipmentData:cg_fairy if self._cg_fairy then return self._cg_fairy elseif self._cg_fairy_reference then Equipment = Equipment or require(self._constructor_module) return Equipment(self._cg_fairy_reference):cg_fairy end api_id = self:api_id if api_id then return Formatting:equipment_full(api_id, self:asset_name) end return self._cg_fairy end

--for enemy aircraft function EquipmentData:cg_flying return self._cg_flying end

function EquipmentData:icon return self._icon end

function EquipmentData:firepower return self._firepower end

function EquipmentData:firepower_leveled(night_battle) local night_battle_coeffs = { [1] = 1, [2] = 1, [3] = 1, [4] = 1, [19] = 1, [29] = 1, [36] = 1 } local day_battle_coeffs = { [1] = 1, [2] = 1, [3] = 1.5, [4] = 1, [14] = 0.75, [15] = 0.75, [19] = 1, [21] = 1, [29] = 1, [36] = 1 } local coeff = (night_battle and night_battle_coeffs[self._type] or 0) or day_battle_coeffs[self._type] return coeff and self._level and self._level > 0 and (self._firepower or 0) + coeff * math.sqrt(self._level) or self._firepower end

function EquipmentData:bombing return self._bombing end

function EquipmentData:torpedo return self._torpedo end

function EquipmentData:torpedo_leveled(night_battle) local night_battle_coeffs = { [5] = 1 } local day_battle_coeffs = { [5] = 1.2, [21] = 1.2 } local coeff = (night_battle and night_battle_coeffs[self._type] or 0) or day_battle_coeffs[self._type] return coeff and self._level and self._level > 0 and (self._torpedo or 0) + coeff * math.sqrt(self._level) or self._torpedo end

function EquipmentData:aa return self._aa end

function EquipmentData:armor return self._armor end

function EquipmentData:asw return self._asw end

function EquipmentData:asw_leveled local coeffs = { [14] = 0.75, [15] = 0.75 } local coeff = coeffs[self._type] return coeff and self._level and self._level > 0 and (self._asw or 0) + coeff * math.sqrt(self._level) or self._asw end

function EquipmentData:shelling_accuracy return self._shelling_accuracy end

function EquipmentData:torpedo_accuracy return self._torpedo_accuracy end

function EquipmentData:evasion return self._evasion end

function EquipmentData:los return self._los end

function EquipmentData:speed return self._speed end

function EquipmentData:luck return self._luck end

function EquipmentData:range return self._range end

function EquipmentData:scrap return {fuel = self._scrap_fuel, ammo = self._scrap_ammo, steel = self._scrap_steel, bauxite = self._scrap_bauxite, devmat = false, screw = false} end

function EquipmentData:buildable return self._buildable end

function EquipmentData:improvement_products if self._products_keys ~= nil then return self._products_keys end if self._improvements and self._improvements._products then self._products_keys = {} for key, _ in pairs(self._improvements._products) do			table.insert(self._products_keys, key) end table.sort(self._products_keys) return self._products_keys else self._products_keys = false end end

function EquipmentData:improvement_product_initial_level(product) if self._improvements and self._improvements._products and self._improvements._products[product] then return self._improvements._products[product]._stars end end

function EquipmentData:improvement_ships(product) if self._improvements and self._improvements._products then if self._ships_keys == nil then self._ships_keys = {} end if not self._ships_keys[product] and self._improvements._products[product] then self._ships_keys[product] = {} for ship, _ in pairs(self._improvements._products[product]._ships) do				if type(ship) == "string" then table.insert(self._ships_keys[product], ship) end end table.sort(self._ships_keys[product]) if self._improvements._products[product]._ships[true] then table.insert(self._ships_keys[product], 1, true) end end return self._ships_keys[product] end end

function EquipmentData:improvement_resources(slider, product, stars) if self._improvements then if not stars then return { fuel = self._improvements._fuel, ammo = self._improvements._ammo, steel = self._improvements._steel, bauxite = self._improvements._bauxite, devmat = false, screw = false, }		end if self._improvements._products and self._improvements._products[product] then local product_info = self._improvements._products[product] if product_info[stars] then return { devmat = slider and product_info[stars]._development_material_x or product_info[stars]._development_material, screw = slider and product_info[stars]._improvement_material_x or product_info[stars]._improvement_material, equipment = product_info[stars]._equipment, }			end end end end

function EquipmentData:improvement_availability(product, ship) if self._improvements and self._improvements._products and self._improvements._products[product] then return self._improvements._products[product]._ships[ship] end end

function EquipmentData:improvement_from return self._improvement_from end

function EquipmentData:special return self._special end

function EquipmentData:equippable(ship_type) self:_load_compatibility local equipment_type = self:type if not ship_type then local result = {} for ship_type, compatibility_table in pairs(EquipmentCompatibility) do			result[ship_type] = compatibility_table[equipment_type] end return result else local compatibility_table = EquipmentCompatibility[ship_type] if compatibility_table then local compatibility = compatibility_table[equipment_type] if type(compatibility) ~= "table" then return compatibility else return compatibility.value, compatibility.note end end end end

function EquipmentData:_load_compatibility if not EquipmentCompatibility then EquipmentCompatibility = mw.loadData('Module:EquipmentCompatibility') end end

function EquipmentData:create(equip) equip = equip or {} setmetatable(equip, equip) equip.__index = self equip.__call = self.__call if equip._strict_name then equip._common_name = equip._name equip._name = tostring(mw.html.create('span'):addClass(self._mobile_hide_class):addClass(self._strict_translation_class):css(self._display_none_css):wikitext(equip._strict_name)) .. tostring(mw.html.create('span'):addClass(self._common_translation_class):wikitext(equip._common_name)) if not equip._page then equip._page = equip._common_name end end if equip._localized_strict_name and equip._localized_name then equip._localized_common_name = equip._localized_name equip._localized_name = tostring(mw.html.create('span'):addClass(self._mobile_hide_class):addClass(self._strict_translation_class):css(self._display_none_css):wikitext(equip._localized_strict_name)) .. tostring(mw.html.create('span'):addClass(self._common_translation_class):wikitext(equip._localized_common_name)) end if equip._list_strict_name and equip._list_name then equip._list_common_name = equip._list_name equip._list_name = tostring(mw.html.create('span'):addClass(self._mobile_hide_class):addClass(self._strict_translation_class):css(self._display_none_css):wikitext(equip._list_strict_name)) .. tostring(mw.html.create('span'):addClass(self._common_translation_class):wikitext(equip._list_common_name)) end if equip._list_localized_strict_name and equip._list_localized_name then equip._list_localized_common_name = equip._list_localized_name equip._list_localized_name = tostring(mw.html.create('span'):addClass(self._mobile_hide_class):addClass(self._strict_translation_class):css(self._display_none_css):wikitext(equip._list_localized_strict_name)) .. tostring(mw.html.create('span'):addClass(self._common_translation_class):wikitext(equip._list_localized_common_name)) end if equip._comparison_strict_name and equip._comparison_name then equip._comparison_common_name = equip._comparison_name equip._comparison_name = tostring(mw.html.create('span'):addClass(self._mobile_hide_class):addClass(self._strict_translation_class):css(self._display_none_css):wikitext(equip._comparison_strict_name)) .. tostring(mw.html.create('span'):addClass(self._common_translation_class):wikitext(equip._comparison_common_name)) end if equip._comparison_localized_strict_name and equip._comparison_localized_name then equip._comparison_localized_common_name = equip._comparison_localized_name equip._comparison_localized_name = tostring(mw.html.create('span'):addClass(self._mobile_hide_class):addClass(self._strict_translation_class):css(self._display_none_css):wikitext(equip._comparison_localized_strict_name)) .. tostring(mw.html.create('span'):addClass(self._common_translation_class):wikitext(equip._comparison_localized_common_name)) end if equip._library_strict_name and equip._library_name then equip._library_common_name = equip._library_name equip._library_name = tostring(mw.html.create('span'):addClass(self._mobile_hide_class):addClass(self._strict_translation_class):css(self._display_none_css):wikitext(equip._library_strict_name)) .. tostring(mw.html.create('span'):addClass(self._common_translation_class):wikitext(equip._library_common_name)) end if equip._library_localized_strict_name and equip._library_localized_name then equip._library_localized_common_name = equip._library_localized_name equip._library_localized_name = tostring(mw.html.create('span'):addClass(self._mobile_hide_class):addClass(self._strict_translation_class):css(self._display_none_css):wikitext(equip._library_localized_strict_name)) .. tostring(mw.html.create('span'):addClass(self._common_translation_class):wikitext(equip._library_localized_common_name)) end if equip._card_strict_name and equip._card_name then equip._card_common_name = equip._card_name equip._card_name = tostring(mw.html.create('span'):addClass(self._mobile_hide_class):addClass(self._strict_translation_class):css(self._display_none_css):wikitext(equip._card_strict_name)) .. tostring(mw.html.create('span'):addClass(self._common_translation_class):wikitext(equip._card_common_name)) end if equip._card_localized_strict_name and equip._card_localized_name then equip._card_localized_common_name = equip._card_localized_name equip._card_localized_name = tostring(mw.html.create('span'):addClass(self._mobile_hide_class):addClass(self._strict_translation_class):css(self._display_none_css):wikitext(equip._card_localized_strict_name)) .. tostring(mw.html.create('span'):addClass(self._common_translation_class):wikitext(equip._card_localized_common_name)) end return equip end

EquipmentData.__call = EquipmentData.create

return EquipmentData