From 78111cbe03d3360041cee11dccb2eb3457d7afe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E5=A6=96=E6=A2=A6=E5=8E=A8?= <12796194+youmuKon-supreme@user.noreply.gitee.com> Date: Mon, 22 Jul 2024 16:05:26 +0800 Subject: [PATCH 01/11] fix --- lua/core/engine.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/core/engine.lua b/lua/core/engine.lua index e6356a3..aa2c650 100644 --- a/lua/core/engine.lua +++ b/lua/core/engine.lua @@ -367,7 +367,7 @@ end --- 为所有武将加载主公技和主公判定 function Engine:setLords() for _, general in pairs(self.generals) do - if table.find(general.skills, function(s) return s.lordSkill end) then + if table.find(general:getSkillNameList(true), function(s) return s.lordSkill end) then table.insert(self.lords, general.name) end end -- Gitee From 527c3fece5a4b0d20bc9df8d11254fe04984327b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E5=A6=96=E6=A2=A6=E5=8E=A8?= <12796194+youmuKon-supreme@user.noreply.gitee.com> Date: Mon, 22 Jul 2024 16:18:21 +0800 Subject: [PATCH 02/11] chain_table --- lua/server/events/hp.lua | 24 ++++++++++++++---------- lua/server/system_enum.lua | 1 + 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/lua/server/events/hp.lua b/lua/server/events/hp.lua index 1552300..748b18e 100644 --- a/lua/server/events/hp.lua +++ b/lua/server/events/hp.lua @@ -51,6 +51,15 @@ function ChangeHp:main() } if reason == "damage" then + if damageStruct then + if damageStruct.damageType ~= fk.NormalDamage and damageStruct.to.chained then + if not damageStruct.chain then damageStruct.beginnerOfTheDamage = true end + damageStruct.to:setChainState(false) + damageStruct.chain_table = table.filter(room:getOtherPlayers(damageStruct.to), function(p) + return p.chained + end) + end + end data.shield_lost = math.min(-num, player.shield) data.num = num + data.shield_lost end @@ -178,11 +187,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,11 +217,11 @@ 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 - end) - for _, p in ipairs(targets) do + if damageStruct.chain_table and #damageStruct.chain_table > 0 then + -- local targets = table.filter(room:getOtherPlayers(damageStruct.to), function(p) + -- return p.chained + -- end) + for _, p in ipairs(damageStruct.chain_table) do room:sendLog{ type = "#ChainDamage", from = p.id diff --git a/lua/server/system_enum.lua b/lua/server/system_enum.lua index 7974390..cb9d3bc 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 -- Gitee From 0c80a45a6e5d51f9f3110d7681cd19de6b2e25ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E5=A6=96=E6=A2=A6=E5=8E=A8?= <12796194+youmuKon-supreme@user.noreply.gitee.com> Date: Tue, 23 Jul 2024 18:16:46 +0800 Subject: [PATCH 03/11] fix --- lua/server/events/hp.lua | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lua/server/events/hp.lua b/lua/server/events/hp.lua index 748b18e..a8ff4ea 100644 --- a/lua/server/events/hp.lua +++ b/lua/server/events/hp.lua @@ -53,11 +53,13 @@ function ChangeHp:main() if reason == "damage" then if damageStruct then if damageStruct.damageType ~= fk.NormalDamage and damageStruct.to.chained then - if not damageStruct.chain then damageStruct.beginnerOfTheDamage = true end damageStruct.to:setChainState(false) - damageStruct.chain_table = table.filter(room:getOtherPlayers(damageStruct.to), function(p) - return p.chained - end) + 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) -- Gitee From 91334fa7a4e3e1dee7ce4270ae4b6cf3d8ad3186 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E5=A6=96=E6=A2=A6=E5=8E=A8?= <12796194+youmuKon-supreme@user.noreply.gitee.com> Date: Fri, 26 Jul 2024 03:39:52 +0800 Subject: [PATCH 04/11] =?UTF-8?q?=E6=9A=B4=E5=8A=9B=E9=99=A4hidden?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/client/client.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/client/client.lua b/lua/client/client.lua index 590130f..444ab16 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) -- Gitee From ed39ce0962dd61936af2b7b0e0cd7f08dc466c44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E5=A6=96=E6=A2=A6=E5=8E=A8?= <12796194+youmuKon-supreme@user.noreply.gitee.com> Date: Fri, 26 Jul 2024 03:56:25 +0800 Subject: [PATCH 05/11] fix --- lua/server/events/hp.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/server/events/hp.lua b/lua/server/events/hp.lua index a8ff4ea..5003d0c 100644 --- a/lua/server/events/hp.lua +++ b/lua/server/events/hp.lua @@ -55,10 +55,10 @@ function ChangeHp:main() if damageStruct.damageType ~= fk.NormalDamage 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) + if #damageStruct.chain_table > 0 then damageStruct.beginnerOfTheDamage = true end end end end -- Gitee From 7bd25c2fafa6a62044c0d3a3de1c9db9ff9f45f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E5=A6=96=E6=A2=A6=E5=8E=A8?= <12796194+youmuKon-supreme@user.noreply.gitee.com> Date: Fri, 26 Jul 2024 04:04:38 +0800 Subject: [PATCH 06/11] addDamageNature --- lua/core/engine.lua | 46 ++++++++++++++++++++++++++++++++++++++++ lua/server/events/hp.lua | 21 +++++++++--------- maneuvering/init.lua | 3 +++ 3 files changed, 60 insertions(+), 10 deletions(-) diff --git a/lua/core/engine.lua b/lua/core/engine.lua index aa2c650..e5cf5e8 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 = {} @@ -397,6 +399,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 5003d0c..00fa86e 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 @@ -52,7 +53,7 @@ function ChangeHp:main() if reason == "damage" then if damageStruct then - if damageStruct.damageType ~= fk.NormalDamage and damageStruct.to.chained then + if Fk:canChain(damageStruct.damageType) and damageStruct.to.chained then damageStruct.to:setChainState(false) if not damageStruct.chain then damageStruct.chain_table = table.filter(room:getOtherPlayers(damageStruct.to), function(p) diff --git a/maneuvering/init.lua b/maneuvering/init.lua index 0bcce49..1c39304 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) -- Gitee From 035d97763dfacb6a14c22fc2d2f980eb9524da7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E5=A6=96=E6=A2=A6=E5=8E=A8?= <12796194+youmuKon-supreme@user.noreply.gitee.com> Date: Fri, 26 Jul 2024 18:12:23 +0800 Subject: [PATCH 07/11] fix --- standard_cards/init.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/standard_cards/init.lua b/standard_cards/init.lua index 72f6a8f..19b2261 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, } -- Gitee From 761c351ef27aa8f3226fea55ba2f11c1ed37c086 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E5=A6=96=E6=A2=A6=E5=8E=A8?= <12796194+youmuKon-supreme@user.noreply.gitee.com> Date: Sat, 27 Jul 2024 02:21:34 +0800 Subject: [PATCH 08/11] Revert "fix" This reverts commit ed39ce0962dd61936af2b7b0e0cd7f08dc466c44. --- lua/server/events/hp.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/server/events/hp.lua b/lua/server/events/hp.lua index 00fa86e..8510d61 100644 --- a/lua/server/events/hp.lua +++ b/lua/server/events/hp.lua @@ -56,10 +56,10 @@ function ChangeHp:main() 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) - if #damageStruct.chain_table > 0 then damageStruct.beginnerOfTheDamage = true end end end end -- Gitee From 8b67b3a0218c39e4ad8ddeb2be117a10977a2d40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E5=A6=96=E6=A2=A6=E5=8E=A8?= <12796194+youmuKon-supreme@user.noreply.gitee.com> Date: Mon, 29 Jul 2024 19:54:30 +0800 Subject: [PATCH 09/11] fix --- lua/core/engine.lua | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lua/core/engine.lua b/lua/core/engine.lua index e5cf5e8..40f6f90 100644 --- a/lua/core/engine.lua +++ b/lua/core/engine.lua @@ -369,8 +369,13 @@ end --- 为所有武将加载主公技和主公判定 function Engine:setLords() for _, general in pairs(self.generals) do - if table.find(general:getSkillNameList(true), 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 + p(skill.name) + table.insert(self.lords, general.name) + end end end end -- Gitee From 4795650dae7385d30346d59cc5e5aa7720bc5277 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E5=A6=96=E6=A2=A6=E5=8E=A8?= <12796194+youmuKon-supreme@user.noreply.gitee.com> Date: Mon, 29 Jul 2024 19:54:34 +0800 Subject: [PATCH 10/11] fix --- lua/core/engine.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/lua/core/engine.lua b/lua/core/engine.lua index 40f6f90..8038246 100644 --- a/lua/core/engine.lua +++ b/lua/core/engine.lua @@ -373,7 +373,6 @@ function Engine:setLords() local skills = table.connect(general.skills, other_skills) for _, skill in ipairs(skills) do if skill.lordSkill then - p(skill.name) table.insert(self.lords, general.name) end end -- Gitee From 6fc8e885421293a6726ac85f7ca0ce20bb5dd142 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E5=A6=96=E6=A2=A6=E5=8E=A8?= <12796194+youmuKon-supreme@user.noreply.gitee.com> Date: Mon, 29 Jul 2024 20:12:07 +0800 Subject: [PATCH 11/11] fix --- lua/server/events/hp.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lua/server/events/hp.lua b/lua/server/events/hp.lua index 8510d61..86fde2b 100644 --- a/lua/server/events/hp.lua +++ b/lua/server/events/hp.lua @@ -221,10 +221,10 @@ function Damage:exit() logic:trigger(fk.DamageFinished, damageStruct.to, damageStruct) if damageStruct.chain_table and #damageStruct.chain_table > 0 then - -- local targets = table.filter(room:getOtherPlayers(damageStruct.to), function(p) - -- return p.chained - -- end) - for _, p in ipairs(damageStruct.chain_table) do + local targets = table.filter(damageStruct.chain_table, function(p) + return p:isAlive() + end) + for _, p in ipairs(targets) do room:sendLog{ type = "#ChainDamage", from = p.id -- Gitee