Line 1: |
Line 1: |
− | local Ship = {} | + | local U = require("Module:Core") |
− | local ships = {} | + | local BaseData = require('Module:BaseData') |
| | | |
− | local ShipData | + | local Ship = BaseData{ |
| + | _ships = {}, |
| + | _data_class = false, |
| + | } |
| | | |
| function Ship:_prepareShipData() | | function Ship:_prepareShipData() |
− | ShipData = ShipData or require('Module:ShipData')
| + | self._data_class = self._data_class or require('Module:ShipData') |
| end | | end |
| | | |
| function Ship:get(stat, name, model) | | function Ship:get(stat, name, model) |
− | return self:create(name, model)[stat]()
| + | return self:create(name, model)[stat]() |
| end | | end |
| | | |
| function Ship:create(name, model) | | function Ship:create(name, model) |
− | self:_prepareShipData()
| + | self:_prepareShipData() |
− | if name == nil then
| + | if name == nil then |
− | return ShipData()
| + | return self._data_class() |
− | end
| + | end |
− | if model == nil then
| + | if model == nil then |
− | name, model = self:process_ship_key(name)
| + | name, model = self:process_ship_key(name) |
− | end
| + | end |
− | if not model then
| + | if not model then |
− | model = ""
| + | model = "" |
− | end
| + | end |
− | --check if we already have it
| + | -- check if we already have it |
− | if ships[name] and ships[name][model] then
| + | if self._ships[name] and self._ships[name][model] then |
− | return ships[name][model]
| + | return self._ships[name][model] |
− | else
| + | else |
− | local ship = ShipData(self:get_table(name, model))
| + | local ship = self._data_class(self:get_table(name, model)) |
− | if not ships[name] then
| + | if not self._ships[name] then |
− | ships[name] = {}
| + | self._ships[name] = {} |
− | end
| + | end |
− | ships[name][model] = ship
| + | self._ships[name][model] = ship |
− | return ship
| + | return ship |
− | end
| + | end |
| + | end |
| + | |
| + | function Ship:process_ship_key_as_reference(reference, base) |
| + | name, model = self:process_ship_key(reference) |
| + | if #name == 0 then |
| + | name = base |
| + | end |
| + | return name, model |
| end | | end |
| | | |
| function Ship:create_from_reference(reference, base) | | function Ship:create_from_reference(reference, base) |
− | name, model = self:process_ship_key(reference)
| + | name, model = self:process_ship_key(reference) |
− | if not name then
| + | if #name == 0 then |
− | name = base:base_name()
| + | name = base:base_name() |
− | end
| + | end |
− | return self(name, model)
| + | return self(name, model) |
| end | | end |
| | | |
| function Ship:get_table(name, model) | | function Ship:get_table(name, model) |
− | --Catch a failed require
| + | local success, ship_table = Ship.requireModule(name, self._enemy) |
− | local success, ship_table = pcall(function () return require(mw.ustring.format('Module:%s', name)) end)
| + | local ship_form_table |
− | --require succeeded
| + | if success then |
− | if success then
| + | ship_form_table = ship_table[model] |
− | ship_table = ship_table[model]
| + | if not ship_form_table and ship_table.seasonals then |
− | if not ship_table then
| + | ship_form_table = ship_table.seasonals[model] or U.ifindBy( |
− | --create a ShipData with what we have
| + | ship_table.seasonals, |
− | ship_table = {_name = name, _suffix = model}
| + | function(data) |
− | elseif type(ship_table) == "string" then
| + | return data._suffix == model and (not data._name or data._name == name) |
− | ship_table = self:get_table(self:process_ship_key(ship_table))
| + | end |
− | end
| + | ) |
− | --require failed
| + | if ship_form_table and type(ship_form_table) ~= "string" then |
− | else
| + | ship_form_table._seasonal = true |
− | --create a ShipData with what we have
| + | end |
− | ship_table = {_name = name, _suffix = model}
| + | end |
− | end
| + | if type(ship_form_table) == "string" then |
− | return ship_table
| + | ship_form_table = self:get_table(self:process_ship_key_as_reference(ship_form_table, name)) |
| + | end |
| + | end |
| + | local id = tonumber(name) |
| + | if not ship_form_table then |
| + | ship_form_table = { |
| + | _name = not id and name or nil, |
| + | _suffix = not id and model or nil, |
| + | _api_id = id or nil, |
| + | _dummy = true |
| + | } |
| + | end |
| + | if ship_form_table._name == nil then |
| + | ship_form_table._name = name |
| + | end |
| + | if ship_form_table._suffix == nil then |
| + | ship_form_table._suffix = model |
| + | end |
| + | ship_form_table._key = model |
| + | if not id and name:sub(1, 5) == 'Vita:' then |
| + | ship_form_table._vita = true |
| + | end |
| + | return ship_form_table |
| end | | end |
| | | |
| function Ship:process_ship_key(ship_key) | | function Ship:process_ship_key(ship_key) |
− | local split = mw.ustring.find(ship_key, '/')
| + | local split = string.find(ship_key, '/') |
− | local ship_base_name, ship_suffix
| + | local ship_base_name, ship_suffix |
− | if split == nil then
| + | if split == nil then |
− | ship_base_name = ship_key
| + | ship_base_name = ship_key |
− | else
| + | else |
− | ship_base_name = mw.ustring.sub(ship_key, 1, split - 1)
| + | ship_base_name = split - 1 > 0 and string.sub(ship_key, 1, split - 1) or '' |
− | ship_suffix = mw.ustring.sub(ship_key, split + 1, -1)
| + | ship_suffix = string.sub(ship_key, split + 1, -1) |
− | end
| + | end |
− | return ship_base_name, ship_suffix
| + | return ship_base_name, ship_suffix |
| + | end |
| + | |
| + | function Ship:get_module(name, isEnemy) |
| + | if not name then |
| + | return nil |
| + | end |
| + | name = self:process_ship_key(name) |
| + | return string.format('Module:Data/%s/%s', isEnemy and 'Enemy' or 'Ship', name) |
| + | end |
| + | |
| + | function Ship.requireModule(name, is_enemy) |
| + | local success, ship_table |
| + | if not is_enemy then |
| + | success, ship_table = U.requireModule('Data/Ship/' .. name) |
| + | end |
| + | if not success then |
| + | success, ship_table = U.requireModule('Data/Enemy/' .. name) |
| + | end |
| + | return success, ship_table |
| end | | end |
| | | |
− | function Ship:get_module(name) | + | function Ship:extend(data) |
− | if name == nil then
| + | data = data or {} |
− | return nil
| + | setmetatable(data, data) |
− | end
| + | data.__index = self |
− | return mw.ustring.format('Module:%s', name)
| + | data.__call = self.__call |
| + | return data |
| end | | end |
| | | |