-- SPDX-License-Identifier: GPL-3.0-or-later --- General用来描述一个武将。 --- --- 所谓武将,就是所属包、武将基础信息的集合。 --- --- 也许···类似于身份证? --- ---@class General : Object ---@field public package Package @ 武将所属包 ---@field public name string @ 武将名字 ---@field public trueName string @ 武将真名,也许可以分辨标界? ---@field public kingdom string @ 武将所属势力 ---@field public subkingdom string @ 武将副势力 ---@field public hp integer @ 武将初始体力 ---@field public maxHp integer @ 武将初始最大体力 ---@field public mainMaxHpAdjustedValue integer @ 主将体力上限调整 ---@field public deputyMaxHpAdjustedValue integer @ 副将体力上限调整 ---@field public shield integer @ 初始护甲 ---@field public gender Gender @ 武将性别 ---@field public skills Skill[] @ 武将技能 ---@field public other_skills string[] @ 武将身上属于其他武将的技能,通过字符串调用 ---@field public related_skills Skill[] @ 武将相关的不属于其他武将的技能,例如邓艾的急袭 ---@field public related_other_skills string [] @ 武将相关的属于其他武将的技能,例如孙策的英姿 ---@field public companions string [] @ 有珠联璧合关系的武将 ---@field public hidden boolean @ 不在选将框里出现,可以点将,可以在武将一览里查询到 ---@field public total_hidden boolean @ 完全隐藏 General = class("General") ---@alias Gender integer General.Male = 1 General.Female = 2 General.Bigender = 3 General.Agender = 4 --- 构造函数,不可随意调用。 ---@param package Package @ 武将所属包 ---@param name string @ 武将名字 ---@param kingdom string @ 武将所属势力 ---@param hp integer @ 武将初始体力 ---@param maxHp integer @ 武将初始最大体力 ---@param gender Gender @ 武将性别 function General:initialize(package, name, kingdom, hp, maxHp, gender) self.package = package self.name = name local name_splited = name:split("__") self.trueName = name_splited[#name_splited] self.kingdom = kingdom self.hp = hp self.maxHp = maxHp or hp self.gender = gender or General.Male self.mainMaxHpAdjustedValue = 0 self.deputyMaxHpAdjustedValue = 0 self.shield = 0 self.subkingdom = nil self.skills = {} -- skills first added to this general self.other_skills = {} -- skill belongs other general, e.g. "mashu" of pangde self.related_skills = {} -- skills related to this general, but not first added to it, e.g. "jixi" of dengai self.related_other_skills = {} -- skills related to this general and belong to other generals, e.g. "yingzi" of sunce self.companions = {} package:addGeneral(self) end function General:__tostring() return string.format("", self.name) end --- 为武将增加技能,需要注意增加其他武将技能时的处理方式。 ---@param skill Skill|string @ (单个)武将技能 function General:addSkill(skill) if (type(skill) == "string") then table.insert(self.other_skills, skill) elseif (skill.class and skill.class:isSubclassOf(Skill)) then table.insert(self.skills, skill) skill.package = self.package end end --- 为武将增加相关技能,需要注意增加其他武将技能时的处理方式。 ---@param skill Skill|string @ (单个)武将技能 function General:addRelatedSkill(skill) if (type(skill) == "string") then table.insert(self.related_other_skills, skill) elseif (skill.class and skill.class:isSubclassOf(Skill)) then table.insert(self.related_skills, skill) Fk:addSkill(skill) skill.package = self.package end end --- 获取武将所有技能。 ---@param include_lord? boolean ---@return string[] function General:getSkillNameList(include_lord) local ret = {} local other_skills = table.map(self.other_skills, Util.Name2SkillMapper) local skills = table.connect(self.skills, other_skills) for _, skill in ipairs(skills) do if include_lord or not skill.lordSkill then table.insert(ret, skill.name) end end -- table.insertTable(ret, self.other_skills) return ret end --- 为武将增加珠联璧合关系武将(1个或多个)。 ---@param name string|string[] @ 武将名(表) function General:addCompanions(name) if type(name) == "table" then table.insertTable(self.companions, name) elseif type(name) == "string" then table.insert(self.companions, name) end end --- 是否与另一武将构成珠联璧合关系。 ---@param other General @ 另一武将 function General:isCompanionWith(other) return table.contains(self.companions, other.name) or table.contains(other.companions, self.name) or (string.find(self.name, "lord") and (other.kingdom == self.kingdom or other.subkingdom == self.kingdom)) or (string.find(other.name, "lord") and (self.kingdom == other.kingdom or self.subkingdom == other.kingdom)) end return General