diff --git a/lua/client/client.lua b/lua/client/client.lua index 590130f31f9fd18c2d4e63b74ddc57d0faf5e5c8..444ab1605b6f0a9ec9b6acb150d532409766a60a 100644 --- a/lua/client/client.lua +++ b/lua/client/client.lua @@ -894,7 +894,7 @@ fk.client_callback["SetPlayerMark"] = function(data) local spec = Fk.qml_marks[mtype] if spec then local text = spec.how_to_show(mark, value, p) - if text == "#hidden" then return end + if text == "#hidden" then data[3] = 0 end end end ClientInstance:notifyUI("SetPlayerMark", data) diff --git a/lua/core/engine.lua b/lua/core/engine.lua index e6356a37677212a1dc0ab8608f0dc3b8b64895d1..8038246c064257c6ab77f31655dca230b6a760ed 100644 --- a/lua/core/engine.lua +++ b/lua/core/engine.lua @@ -29,6 +29,7 @@ ---@field public printed_cards table @ 被某些房间现场打印的卡牌,id都是负数且从-2开始 ---@field private kingdoms string[] @ 总势力 ---@field private kingdom_map table @ 势力映射表 +---@field private damage_nature table @ 伤害映射表 ---@field private _custom_events any[] @ 自定义事件列表 ---@field public poxi_methods table @ “魄袭”框操作方法表 ---@field public qml_marks table @ 自定义Qml标记的表 @@ -69,6 +70,7 @@ function Engine:initialize() self.game_mode_disabled = {} self.kingdoms = {} self.kingdom_map = {} + self.damage_nature = { [fk.NormalDamage] = { "normal_damage", false } } self._custom_events = {} self.poxi_methods = {} self.qml_marks = {} @@ -367,8 +369,12 @@ end --- 为所有武将加载主公技和主公判定 function Engine:setLords() for _, general in pairs(self.generals) do - if table.find(general.skills, function(s) return s.lordSkill end) then - table.insert(self.lords, general.name) + local other_skills = table.map(general.other_skills, Util.Name2SkillMapper) + local skills = table.connect(general.skills, other_skills) + for _, skill in ipairs(skills) do + if skill.lordSkill then + table.insert(self.lords, general.name) + end end end end @@ -397,6 +403,50 @@ function Engine:getKingdomMap(kingdom) return ret end +--- 注册一个伤害 +---@param nature string | number @ 伤害ID +---@param name string @ 属性伤害名 +---@param can_chain bool @ 是否可传导 +function Engine:addDamageNature(nature, name, can_chain) + assert(table.contains({ "string", "number" }, type(nature)), "Must use string or number as nature!") + assert(type(name) == "string", "Must use string as this damage nature's name!") + if can_chain == nil then can_chain = true end + self.damage_nature[nature] = { name, can_chain } +end + +--- 返回伤害列表 +---@return table @ 具体信息(伤害ID => {伤害名,是否可传导}) +function Engine:getDamageNatures() + local ret = {} + for k, v in pairs(self.damage_nature) do + ret[k] = v + end + return ret +end + +--- 由伤害ID获得伤害属性 +---@param nature string | number @ 伤害ID +---@return table @ 具体信息({伤害名,是否可传导}),若不存在则为空 +function Engine:getDamageNature(nature) + return self.damage_nature[nature] +end + +--- 由伤害ID获得伤害名 +---@param nature string | number @ 伤害ID +---@return string @ 伤害名 +function Engine:getDamageNatureName(nature) + local ret = self:getDamageNature(nature) + return ret and ret[1] or "" +end + +--- 判断一种伤害是否可传导 +---@param nature string | number @ 伤害ID +---@return bool +function Engine:canChain(nature) + local ret = self:getDamageNature(nature) + return ret and ret[2] +end + --- 判断一个武将是否在本房间可用。 ---@param g string @ 武将名 function Engine:canUseGeneral(g) diff --git a/lua/server/events/hp.lua b/lua/server/events/hp.lua index 15523009fbdd92df4dedfc1932904c598e5d802e..86fde2ba0f852dab0c70099b1c11b78da3910fb9 100644 --- a/lua/server/events/hp.lua +++ b/lua/server/events/hp.lua @@ -1,32 +1,33 @@ -- SPDX-License-Identifier: GPL-3.0-or-later -local damage_nature_table = { - [fk.NormalDamage] = "normal_damage", - [fk.FireDamage] = "fire_damage", - [fk.ThunderDamage] = "thunder_damage", - [fk.IceDamage] = "ice_damage", -} +-- local damage_nature_table = { +-- [fk.NormalDamage] = "normal_damage", +-- [fk.FireDamage] = "fire_damage", +-- [fk.ThunderDamage] = "thunder_damage", +-- [fk.IceDamage] = "ice_damage", +-- } local function sendDamageLog(room, damageStruct) + local damageName = Fk:getDamageNatureName(damageStruct.damageType) if damageStruct.from then room:sendLog{ type = "#Damage", to = {damageStruct.from.id}, from = damageStruct.to.id, arg = damageStruct.damage, - arg2 = damage_nature_table[damageStruct.damageType], + arg2 = damageName, } else room:sendLog{ type = "#DamageWithNoFrom", from = damageStruct.to.id, arg = damageStruct.damage, - arg2 = damage_nature_table[damageStruct.damageType], + arg2 = damageName, } end room:sendLogEvent("Damage", { to = damageStruct.to.id, - damageType = damage_nature_table[damageStruct.damageType], + damageType = damageName, damageNum = damageStruct.damage, }) end @@ -51,6 +52,17 @@ function ChangeHp:main() } if reason == "damage" then + if damageStruct then + if Fk:canChain(damageStruct.damageType) and damageStruct.to.chained then + damageStruct.to:setChainState(false) + if not damageStruct.chain then + damageStruct.beginnerOfTheDamage = true + damageStruct.chain_table = table.filter(room:getOtherPlayers(damageStruct.to), function(p) + return p.chained + end) + end + end + end data.shield_lost = math.min(-num, player.shield) data.num = num + data.shield_lost end @@ -178,11 +190,6 @@ function Damage:main() end end - if damageStruct.damageType ~= fk.NormalDamage and damageStruct.to.chained then - if not damageStruct.chain then damageStruct.beginnerOfTheDamage = true end - damageStruct.to:setChainState(false) - end - if not room:changeHp( damageStruct.to, -damageStruct.damage, @@ -213,9 +220,9 @@ function Damage:exit() logic:trigger(fk.DamageFinished, damageStruct.to, damageStruct) - if damageStruct.beginnerOfTheDamage and not damageStruct.chain then - local targets = table.filter(room:getOtherPlayers(damageStruct.to), function(p) - return p.chained + if damageStruct.chain_table and #damageStruct.chain_table > 0 then + local targets = table.filter(damageStruct.chain_table, function(p) + return p:isAlive() end) for _, p in ipairs(targets) do room:sendLog{ diff --git a/lua/server/system_enum.lua b/lua/server/system_enum.lua index 797439096314a741b5da47da63234ae940beb895..cb9d3bc3d44ba90d73590e4e3818a91aaf499e1a 100644 --- a/lua/server/system_enum.lua +++ b/lua/server/system_enum.lua @@ -82,6 +82,7 @@ fk.IceDamage = 4 ---@field public skillName? string @ 造成本次伤害的技能名 ---@field public beginnerOfTheDamage? boolean @ 是否是本次铁索传导的起点 ---@field public by_user? boolean @ 是否由卡牌直接生效造成的伤害 +---@field public chain_table? ServerPlayer[] @ 铁索连环表 --- RecoverStruct 描述和回复体力有关的数据。 ---@class RecoverStruct diff --git a/maneuvering/init.lua b/maneuvering/init.lua index 0bcce498ab52242d610ea36b5c032af399623663..1c393041487bb092b6be2d7c5e9fa0ad6723537a 100644 --- a/maneuvering/init.lua +++ b/maneuvering/init.lua @@ -4,6 +4,9 @@ local extension = Package:new("maneuvering", Package.CardPack) local slash = Fk:cloneCard("slash") +Fk:addDamageNature(fk.FireDamage, "fire_damage") +Fk:addDamageNature(fk.ThunderDamage, "thunder_damage") + local thunderSlashSkill = fk.CreateActiveSkill{ name = "thunder__slash_skill", prompt = function(self, selected_cards) diff --git a/standard_cards/init.lua b/standard_cards/init.lua index 72f6a8f408d74241f7b55bab53ae103b6966c380..19b226151c05410c6c45490818905d471a34e1f9 100644 --- a/standard_cards/init.lua +++ b/standard_cards/init.lua @@ -705,7 +705,8 @@ local lightningSkill = fk.CreateActiveSkill{ to = to, damage = 3, card = effect.card, - damageType = fk.ThunderDamage, + -- damageType = fk.ThunderDamage, + damageType = Fk:getDamageNature(fk.ThunderDamage) and fk.ThunderDamage or fk.NormalDamage, skillName = self.name, }