Documentation for this module may be created at Module:Char Stat/doc
---@type Util
local util = require("Module:Util")
---@class Stat
local Stat = {}
function Stat:new(action_token, trion, attack, defense, mobility, skill, range, mechanical_operation, data_analysis,
parallel_processing, tactics, command, special_tactics, position, listname, args)
---@class Stat
local res = {}
setmetatable(res, self)
self.__index = self
res.action_token = tonumber(action_token) or 0
res.trion = tonumber(trion) or 0
res.attack = tonumber(attack) or 0
res.defense = tonumber(defense) or 0
res.mobility = tonumber(mobility) or 0
res.skill = tonumber(skill) or 0
res.range = tonumber(range) or 0
res.mechanical_operation = tonumber(mechanical_operation) or 0
res.data_analysis = tonumber(data_analysis) or 0
res.parallel_processing = tonumber(parallel_processing) or 0
res.tactics = tonumber(tactics) or 0
res.command = tonumber(command) or 0
res.special_tactics = tonumber(special_tactics) or 0
res.position = position
res.listname = tonumber(listname) or 0
res.args = args or {db = "bbf"}
return res
end
function Stat.from_table(table)
return Stat.new(unpack(table, 1, 13))
end
function Stat.from_data()
---@type CS_Stat
local data = require("Module:Char Stat/data")
local ret = {}
for k, t in pairs(data) do
ret[k] = Stat:new(t.action_token, t.trion, t.attack, t.defense, t.mobility, t.skill,
t.range, t.mechanical_operation, t.data_analysis, t.parallel_processing, t.tactics, t.command,
t.special_tactics, t.position, t.listname)
end
return ret
end
function Stat.total(self)
local total = 0
for k, v in pairs(self) do
if type(v) == "number" then
if self.position == "Operator" and k ~= "trion" and k ~= "listname" then
total = total + v
elseif self.position ~= "Operator" and k ~= "listname" then
total = total + v
end
end
end
return total
end
local data = Stat.from_data()
---@param frame frame
function Stat.GetStat(frame)
local args, pargs = util.get_args_and_pargs(frame)
local name = args[1] or pargs[1] or ""
name = name:gsub(" ", "_")
local key = args[2] or pargs[2] or "total"
---@type Stat
local entry = data[name]
local res = {}
for k, v in pairs(entry) do
if type(v) == "number" or type(v) == "string" then
res[k] = v
end
end
res.total = entry:total()
return res[key]
end
---@param frame frame
function Stat.calcListName(self, frame)
local p = tostring(self.listname)
local args = self.args
local name = ""
if args.db then name = "bbf" .. p elseif args.c then name = "c" .. p end
args.name = name
args.p = p
return frame:expandTemplate{title = "ref", args = args}
end
---@param frame frame
function Stat.calcChartName(self, frame)
return "[[Border Briefing File]] Page " .. self.listname .. self:calcListName(frame)
end
---@param frame frame
function Stat.GetListName(frame)
local args, pargs = util.get_args_and_pargs(frame)
local name = args[1] or pargs[1] or ""
---@type Stat
local entry = data[name]
return "[[" .. name .. "]]" .. entry:calcListName(frame)
end
---@param frame frame
function Stat.GetChartName(frame)
local args, pargs = util.get_args_and_pargs(frame)
local name = args[1] or pargs[1] or ""
---@type Stat
local entry = data[name]
return entry:calcChartName(frame)
end
return Stat