From 6fdcc4defdd23a52ce0250d01a8366320d7a8619 Mon Sep 17 00:00:00 2001 From: Art_Sakura <1754798088@qq.com> Date: Fri, 15 Nov 2024 11:09:32 +0800 Subject: [PATCH 01/11] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=80=E4=B8=AAAI?= =?UTF-8?q?=E5=AF=B9=E5=BC=83=E7=89=8C=E7=9A=84=E6=9D=83=E9=87=8D=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E5=87=BD=E6=95=B0=EF=BC=8C=E6=A0=87=E5=A4=8F=E4=BE=AF?= =?UTF-8?q?=E6=83=87=E5=B7=B2=E7=BB=8F=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/server/ai/smart_ai.lua | 79 ++++++++++++++++++++++++++++++++++++++ standard/ai/init.lua | 3 +- 2 files changed, 81 insertions(+), 1 deletion(-) diff --git a/lua/server/ai/smart_ai.lua b/lua/server/ai/smart_ai.lua index 743bb1d..8606de8 100644 --- a/lua/server/ai/smart_ai.lua +++ b/lua/server/ai/smart_ai.lua @@ -6,6 +6,53 @@ --]] +fk.ai_card_keep_value = { + ["slash"] = 10, ---杀 + ["thunder__slash"] = 20, ---雷杀 + ["fire__slash"] = 30, ---火杀 + ["jink"] = 40, ---闪 + ["peach"] = 60, ---桃 + ["analeptic"] = 35, ---酒 + ["dismantlement"] = 40, ---过河拆桥 + ["snatch"] = 40, ---顺手牵羊 + ["duel"] = 30, ---决斗 + ["collateral"] = 20, ---借刀杀人 + ["ex_nihilo"] = 50, ---无中生有 + ["nullification"] = 60, ---无懈可击 + ["savage_assault"] = 20, ---南蛮入侵 + ["archery_attack"] = 20, ---万箭齐发 + ["god_salvation"] = 20, ---桃园结义 + ["amazing_grace"] = 20, ---五谷丰登 + ["lightning"] = -10, ---闪电 + ["indulgence"] = 50, ---乐不思蜀 + ["iron_chain"] = 30, ---铁索连环 + ["fire_attack"] = 30, ---火攻 + ["supply_shortage"] = 40, ---兵粮寸断 + ["crossbow"] = 30, ---AK + ["guding_blade"] = 20, ---古锭刀 + ["qinggang_sword"] = 20, ---青钢剑 + ["ice_sword"] = 20, ---寒冰剑 + ["double_swords"] = 20, ---雌雄双股剑 + ["blade"] = 30, ---青龙偃月刀 + ["spear"] = 20, ---丈八蛇矛 + ["axe"] = 40, ---贯石斧 + ["halberd"] = 10, ---方天画戟 + ["kylin_bow"] = 10, ---麒麟弓 + ["fan"] = 20, ---朱雀羽扇 + ["eight_diagram"] = 25, ---八卦阵 + ["nioh_shield"] = 20, ---仁王盾 + ["vine"] = 30, ---藤甲 + ["silver_lion"] = 20, ---白银狮子 + ["dilu"] = 20, ---的卢 + ["jueying"] = 20, ---绝影 + ["chitu"] = 20, ---赤兔 + ["dayuan"] = 20, ---大宛 + ["zixing"] = 20, ---紫骍 + ["hualiu"] = 20, ---骅骝 +} + +--- 不知道塞哪,先塞这里吧 + ---@class SmartAI: TrustAI, AIUtil ---@field private _memory table @ AI底层的空间换时间机制 ---@field public friends ServerPlayer[] @ 队友 @@ -371,4 +418,36 @@ function SmartAI:getBenefitOfEvents(fn) return logic.benefit end +--- 根据传入的牌ids 判断权重 +---@param cards integer[] 牌ids +---@param number integer 需要弃置几张 +---@return integer[] +function SmartAI:getChoiceDscardCards(cards, number) + if number <= 0 then number = 1 end + if number > #cards then number = #cards end + + local list = {} + + --- 根据每张牌的id 查找权重 + for i, id in ipairs(cards) do + local value = fk.ai_card_keep_value[Fk:getCardById(id).name] + + if value == nil then value = -50 end + + table.insert(list, {id, value}) + end + + --- 根据权重从低往高排序 + table.sort(list, function(a, b) return a[2] < b[2] end) + + --- 将排序后的card id返回 + local ret = {} + + for i = 1, number, 1 do + table.insert(ret, list[i][1]) + end + + return ret +end + return SmartAI diff --git a/standard/ai/init.lua b/standard/ai/init.lua index d574025..742a0be 100644 --- a/standard/ai/init.lua +++ b/standard/ai/init.lua @@ -8,7 +8,8 @@ SmartAI:setSkillAI("ganglie", { think = function(self, ai) local cards = ai:getEnabledCards() if #cards < 2 then return "" end - local to_discard = table.random(cards, 2) -- TODO: 用于选择最适合弃牌的ai函数 + + local to_discard = SmartAI:getChoiceDscardCards(cards, 2) local cancel_val = ai:getBenefitOfEvents(function(logic) logic:damage{ from = ai.room.logic:getCurrentEvent().data[2], -- Gitee From 4792923c09d96192aab650068d89500efd3f0fad Mon Sep 17 00:00:00 2001 From: Art_Sakura <1754798088@qq.com> Date: Fri, 15 Nov 2024 18:12:05 +0800 Subject: [PATCH 02/11] =?UTF-8?q?=E5=B0=86getChoiceDscardCards=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E8=BF=81=E7=A7=BB=E8=87=B3ai/util.lua=E4=B8=8B?= =?UTF-8?q?=EF=BC=8C=E5=B0=86cards=E6=9D=83=E9=87=8D=E5=88=86=E6=95=A3?= =?UTF-8?q?=E8=87=B3=E5=90=84=E4=B8=AAcards=20skill=E4=B8=8B=E6=96=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/server/ai/smart_ai.lua | 77 +------------------------------------- lua/server/ai/util.lua | 40 ++++++++++++++++++++ 2 files changed, 41 insertions(+), 76 deletions(-) diff --git a/lua/server/ai/smart_ai.lua b/lua/server/ai/smart_ai.lua index 8606de8..dbf8b5b 100644 --- a/lua/server/ai/smart_ai.lua +++ b/lua/server/ai/smart_ai.lua @@ -6,50 +6,7 @@ --]] -fk.ai_card_keep_value = { - ["slash"] = 10, ---杀 - ["thunder__slash"] = 20, ---雷杀 - ["fire__slash"] = 30, ---火杀 - ["jink"] = 40, ---闪 - ["peach"] = 60, ---桃 - ["analeptic"] = 35, ---酒 - ["dismantlement"] = 40, ---过河拆桥 - ["snatch"] = 40, ---顺手牵羊 - ["duel"] = 30, ---决斗 - ["collateral"] = 20, ---借刀杀人 - ["ex_nihilo"] = 50, ---无中生有 - ["nullification"] = 60, ---无懈可击 - ["savage_assault"] = 20, ---南蛮入侵 - ["archery_attack"] = 20, ---万箭齐发 - ["god_salvation"] = 20, ---桃园结义 - ["amazing_grace"] = 20, ---五谷丰登 - ["lightning"] = -10, ---闪电 - ["indulgence"] = 50, ---乐不思蜀 - ["iron_chain"] = 30, ---铁索连环 - ["fire_attack"] = 30, ---火攻 - ["supply_shortage"] = 40, ---兵粮寸断 - ["crossbow"] = 30, ---AK - ["guding_blade"] = 20, ---古锭刀 - ["qinggang_sword"] = 20, ---青钢剑 - ["ice_sword"] = 20, ---寒冰剑 - ["double_swords"] = 20, ---雌雄双股剑 - ["blade"] = 30, ---青龙偃月刀 - ["spear"] = 20, ---丈八蛇矛 - ["axe"] = 40, ---贯石斧 - ["halberd"] = 10, ---方天画戟 - ["kylin_bow"] = 10, ---麒麟弓 - ["fan"] = 20, ---朱雀羽扇 - ["eight_diagram"] = 25, ---八卦阵 - ["nioh_shield"] = 20, ---仁王盾 - ["vine"] = 30, ---藤甲 - ["silver_lion"] = 20, ---白银狮子 - ["dilu"] = 20, ---的卢 - ["jueying"] = 20, ---绝影 - ["chitu"] = 20, ---赤兔 - ["dayuan"] = 20, ---大宛 - ["zixing"] = 20, ---紫骍 - ["hualiu"] = 20, ---骅骝 -} +fk.ai_card_keep_value = {} --- 不知道塞哪,先塞这里吧 @@ -418,36 +375,4 @@ function SmartAI:getBenefitOfEvents(fn) return logic.benefit end ---- 根据传入的牌ids 判断权重 ----@param cards integer[] 牌ids ----@param number integer 需要弃置几张 ----@return integer[] -function SmartAI:getChoiceDscardCards(cards, number) - if number <= 0 then number = 1 end - if number > #cards then number = #cards end - - local list = {} - - --- 根据每张牌的id 查找权重 - for i, id in ipairs(cards) do - local value = fk.ai_card_keep_value[Fk:getCardById(id).name] - - if value == nil then value = -50 end - - table.insert(list, {id, value}) - end - - --- 根据权重从低往高排序 - table.sort(list, function(a, b) return a[2] < b[2] end) - - --- 将排序后的card id返回 - local ret = {} - - for i = 1, number, 1 do - table.insert(ret, list[i][1]) - end - - return ret -end - return SmartAI diff --git a/lua/server/ai/util.lua b/lua/server/ai/util.lua index 2f3c832..9c34bfe 100644 --- a/lua/server/ai/util.lua +++ b/lua/server/ai/util.lua @@ -2,4 +2,44 @@ ---@class AIUtil local AIUtil = {} -- mixin +--- 根据传入的牌ids 判断权重 +---@param cards integer[] @ 牌ids +---@param number integer @ 需要弃置几张 +---@param filter function @ 条件判断 判断权重大于 或 小于 n +---@return integer[] +function AIUtil:getChoiceDscardCards(cards, number, filter) + number = math.max(1, math.min(number, #cards)) + + --- 根据每张牌的id 查找权重 + local list = {} + for i, id in ipairs(cards) do + local card = Fk:getCardById(id) + local value = fk.ai_card_keep_value[card.name] or -50 + + list[#list + 1] = {id, value} + + if value == nil then value = -50 end + + if type(filter) == "function" then + if(filter(value)) then table.insert(list, {id, value}) end + else + table.insert(list, {id, value}) + end + end + + --- 根据权重从低往高排序 + table.sort(list, function(a, b) + return a[2] < b[2] + end) + + --- 将排序后的card id返回 + local ret = {} + for i = 1, number do + ret[#ret + 1] = list[i][1] -- 使用表构造器语法插入元素 + end + + return ret +end + + return AIUtil -- Gitee From eb51765493e129f473774699ed10391a5da19f91 Mon Sep 17 00:00:00 2001 From: Art_Sakura <1754798088@qq.com> Date: Sat, 16 Nov 2024 02:32:59 +0800 Subject: [PATCH 03/11] =?UTF-8?q?=E5=B0=86getChoiceDscardCards=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E5=88=B0AIUtil=E7=B1=BB=E4=B8=AD=E5=B9=B6=E6=94=B9?= =?UTF-8?q?=E5=90=8D=E4=B8=BAgetChoiceCardsByKeepValue=EF=BC=8C=E7=8E=B0?= =?UTF-8?q?=E5=9C=A8=E5=8F=AF=E4=BB=A5=E5=B8=A6=E4=B8=80=E4=B8=AA=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E8=BF=9B=E8=A1=8C=E7=AD=9B=E9=80=89=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/server/ai/init.lua | 1 + lua/server/ai/smart_ai.lua | 4 ---- lua/server/ai/util.lua | 16 +++++++-------- maneuvering/init.lua | 13 +++++++++++- standard/ai/init.lua | 6 +++++- standard_cards/init.lua | 41 ++++++++++++++++++++++++++++++++++---- 6 files changed, 62 insertions(+), 19 deletions(-) diff --git a/lua/server/ai/init.lua b/lua/server/ai/init.lua index 68a8a8d..52f9534 100644 --- a/lua/server/ai/init.lua +++ b/lua/server/ai/init.lua @@ -5,6 +5,7 @@ TrustAI = require "server.ai.trust_ai" -- RandomAI = require "server.ai.random_ai" SmartAI = require "server.ai.smart_ai" +AIUtil = require "server.ai.util" -- load ai module from packages local directories diff --git a/lua/server/ai/smart_ai.lua b/lua/server/ai/smart_ai.lua index dbf8b5b..743bb1d 100644 --- a/lua/server/ai/smart_ai.lua +++ b/lua/server/ai/smart_ai.lua @@ -6,10 +6,6 @@ --]] -fk.ai_card_keep_value = {} - ---- 不知道塞哪,先塞这里吧 - ---@class SmartAI: TrustAI, AIUtil ---@field private _memory table @ AI底层的空间换时间机制 ---@field public friends ServerPlayer[] @ 队友 diff --git a/lua/server/ai/util.lua b/lua/server/ai/util.lua index 9c34bfe..ab6b9bf 100644 --- a/lua/server/ai/util.lua +++ b/lua/server/ai/util.lua @@ -3,11 +3,11 @@ local AIUtil = {} -- mixin --- 根据传入的牌ids 判断权重 ----@param cards integer[] @ 牌ids ----@param number integer @ 需要弃置几张 ----@param filter function @ 条件判断 判断权重大于 或 小于 n ----@return integer[] -function AIUtil:getChoiceDscardCards(cards, number, filter) +---@param cards integer[] @ 牌ids +---@param number integer @ 需要弃置几张 +---@param filter fun(integer) @ 条件判断 判断权重大于 或 小于 n +---@return integer[] @ 牌ids +function AIUtil:getChoiceCardsByKeepValue(cards, number, filter) number = math.max(1, math.min(number, #cards)) --- 根据每张牌的id 查找权重 @@ -16,8 +16,6 @@ function AIUtil:getChoiceDscardCards(cards, number, filter) local card = Fk:getCardById(id) local value = fk.ai_card_keep_value[card.name] or -50 - list[#list + 1] = {id, value} - if value == nil then value = -50 end if type(filter) == "function" then @@ -34,8 +32,8 @@ function AIUtil:getChoiceDscardCards(cards, number, filter) --- 将排序后的card id返回 local ret = {} - for i = 1, number do - ret[#ret + 1] = list[i][1] -- 使用表构造器语法插入元素 + for i = 1, #list do + table.insert(ret, list[i][1]) end return ret diff --git a/maneuvering/init.lua b/maneuvering/init.lua index b083089..d5e3e9b 100644 --- a/maneuvering/init.lua +++ b/maneuvering/init.lua @@ -41,6 +41,7 @@ local thunderSlashSkill = fk.CreateActiveSkill{ }) end } +fk.ai_card_keep_value["thunder__slash"] = 20 local thunderSlash = fk.CreateBasicCard{ name = "thunder__slash", skill = thunderSlashSkill, @@ -93,6 +94,7 @@ local fireSlashSkill = fk.CreateActiveSkill{ }) end } +fk.ai_card_keep_value["fire__slash"] = 35 local fireSlash = fk.CreateBasicCard{ name = "fire__slash", skill = fireSlashSkill, @@ -144,7 +146,6 @@ local analepticSkill = fk.CreateActiveSkill{ end end } - local analepticEffect = fk.CreateTriggerSkill{ name = "analeptic_effect", global = true, @@ -179,7 +180,9 @@ local analepticEffect = fk.CreateTriggerSkill{ end end, } + Fk:addSkill(analepticEffect) +fk.ai_card_keep_value["analeptic"] = 30 local analeptic = fk.CreateBasicCard{ name = "analeptic", @@ -224,6 +227,7 @@ local ironChainCardSkill = fk.CreateActiveSkill{ end, } +fk.ai_card_keep_value["iron_chain"] = 25 local ironChain = fk.CreateTrickCard{ name = "iron_chain", skill = ironChainCardSkill, @@ -275,6 +279,7 @@ local fireAttackSkill = fk.CreateActiveSkill{ end end, } +fk.ai_card_keep_value["fire_attack"] = 30 local fireAttack = fk.CreateTrickCard{ name = "fire_attack", skill = fireAttackSkill, @@ -324,6 +329,7 @@ local supplyShortageSkill = fk.CreateActiveSkill{ } end, } +fk.ai_card_keep_value["supply_shortage"] = 45 local supplyShortage = fk.CreateDelayedTrickCard{ name = "supply_shortage", skill = supplyShortageSkill, @@ -350,6 +356,7 @@ local gudingSkill = fk.CreateTriggerSkill{ end, } Fk:addSkill(gudingSkill) +fk.ai_card_keep_value["guding_blade"] = 20 local gudingBlade = fk.CreateWeapon{ name = "guding_blade", suit = Card.Spade, @@ -385,6 +392,7 @@ local fanSkill = fk.CreateTriggerSkill{ end, } Fk:addSkill(fanSkill) +fk.ai_card_keep_value["fan"] = 20 local fan = fk.CreateWeapon{ name = "fan", suit = Card.Diamond, @@ -426,6 +434,7 @@ local vineSkill = fk.CreateTriggerSkill{ end, } Fk:addSkill(vineSkill) +fk.ai_card_keep_value["vine"] = 30 local vine = fk.CreateArmor{ name = "vine", equip_skill = vineSkill, @@ -448,6 +457,7 @@ local silverLionSkill = fk.CreateTriggerSkill{ end, } Fk:addSkill(silverLionSkill) +fk.ai_card_keep_value["silver_lion"] = 20 local silverLion = fk.CreateArmor{ name = "silver_lion", suit = Card.Club, @@ -478,6 +488,7 @@ local hualiuSkill = fk.CreateDistanceSkill{ end, } Fk:addSkill(hualiuSkill) +fk.ai_card_keep_value["hualiu"] = 20 local huaLiu = fk.CreateDefensiveRide{ name = "hualiu", suit = Card.Diamond, diff --git a/standard/ai/init.lua b/standard/ai/init.lua index 588080b..003a697 100644 --- a/standard/ai/init.lua +++ b/standard/ai/init.lua @@ -26,7 +26,7 @@ SmartAI:setSkillAI("ganglie", { local cards = ai:getEnabledCards() if #cards < 2 then return "" end - local to_discard = SmartAI:getChoiceDscardCards(cards, 2) + local to_discard = AIUtil:getChoiceCardsByKeepValue(cards, 2, nil) local cancel_val = ai:getBenefitOfEvents(function(logic) logic:damage{ from = ai.room.logic:getCurrentEvent().data[2], @@ -147,6 +147,10 @@ SmartAI:setSkillAI("zhiheng", { think = function(self, ai) local player = ai.player local cards = ai:getEnabledCards() + + --- TODO: getEnabledCard会返回装备区的牌,缺少对装备区的牌进行判断 + cards = AIUtil:getChoiceCardsByKeepValue(cards, #cards, function(value) return value < 45 end) + return { cards = cards }, ai:getBenefitOfEvents(function(logic) logic:throwCard(cards, self.skill.name, player, player) logic:drawCards(player, #cards, self.skill.name) diff --git a/standard_cards/init.lua b/standard_cards/init.lua index b0ea7fe..1eccef3 100644 --- a/standard_cards/init.lua +++ b/standard_cards/init.lua @@ -3,6 +3,8 @@ local extension = Package:new("standard_cards", Package.CardPack) extension.metadata = require "packages.standard_cards.metadata" +fk.ai_card_keep_value = {} + local slashSkill = fk.CreateActiveSkill{ name = "slash_skill", prompt = function(self, selected_cards) @@ -59,6 +61,7 @@ local slashSkill = fk.CreateActiveSkill{ end end } +fk.ai_card_keep_value["slash"] = 10 local slash = fk.CreateBasicCard{ name = "slash", number = 7, @@ -112,6 +115,7 @@ local jinkSkill = fk.CreateActiveSkill{ end end } +fk.ai_card_keep_value["jink"] = 40 local jink = fk.CreateBasicCard{ name = "jink", suit = Card.Heart, @@ -170,6 +174,7 @@ local peachSkill = fk.CreateActiveSkill{ end end } +fk.ai_card_keep_value["peach"] = 60 local peach = fk.CreateBasicCard{ name = "peach", suit = Card.Heart, @@ -209,6 +214,7 @@ local dismantlementSkill = fk.CreateActiveSkill{ room:throwCard({cid}, self.name, to, from) end } +fk.ai_card_keep_value["dismantlement"] = 45 local dismantlement = fk.CreateTrickCard{ name = "dismantlement", suit = Card.Spade, @@ -251,6 +257,7 @@ local snatchSkill = fk.CreateActiveSkill{ room:obtainCard(from, cid, false, fk.ReasonPrey) end } +fk.ai_card_keep_value["snatch"] = 45 local snatch = fk.CreateTrickCard{ name = "snatch", suit = Card.Spade, @@ -337,6 +344,7 @@ local duelSkill = fk.CreateActiveSkill{ end end } +fk.ai_card_keep_value["duel"] = 30 local duel = fk.CreateTrickCard{ name = "duel", suit = Card.Spade, @@ -417,6 +425,7 @@ local collateralSkill = fk.CreateActiveSkill{ end end } +fk.ai_card_keep_value["collateral"] = 10 local collateral = fk.CreateTrickCard{ name = "collateral", suit = Card.Club, @@ -447,6 +456,7 @@ local exNihiloSkill = fk.CreateActiveSkill{ target:drawCards(2, "ex_nihilo") end } +fk.ai_card_keep_value["ex_nihilo"] = 50 local exNihilo = fk.CreateTrickCard{ name = "ex_nihilo", suit = Card.Heart, @@ -470,6 +480,7 @@ local nullificationSkill = fk.CreateActiveSkill{ end end } +fk.ai_card_keep_value["nullification"] = 55 local nullification = fk.CreateTrickCard{ name = "nullification", suit = Card.Spade, @@ -516,6 +527,7 @@ local savageAssaultSkill = fk.CreateActiveSkill{ end end } +fk.ai_card_keep_value["savage_assault"] = 20 local savageAssault = fk.CreateTrickCard{ name = "savage_assault", suit = Card.Spade, @@ -560,6 +572,7 @@ local archeryAttackSkill = fk.CreateActiveSkill{ end end } +fk.ai_card_keep_value["archery_attack"] = 20 local archeryAttack = fk.CreateTrickCard{ name = "archery_attack", suit = Card.Heart, @@ -598,6 +611,7 @@ local godSalvationSkill = fk.CreateActiveSkill{ end end } +fk.ai_card_keep_value["god_salvation"] = 20 local godSalvation = fk.CreateTrickCard{ name = "god_salvation", suit = Card.Heart, @@ -668,7 +682,7 @@ local amazingGraceSkill = fk.CreateActiveSkill{ table.removeOne(effect.extra_data.AGFilled, chosen) end } - +fk.ai_card_keep_value["amazing_grace"] = 20 local amazingGrace = fk.CreateTrickCard{ name = "amazing_grace", suit = Card.Heart, @@ -753,6 +767,7 @@ local lightningSkill = fk.CreateActiveSkill{ } end, } +fk.ai_card_keep_value["lightning"] = -10 local lightning = fk.CreateDelayedTrickCard{ name = "lightning", suit = Card.Spade, @@ -799,6 +814,7 @@ local indulgenceSkill = fk.CreateActiveSkill{ } end, } +fk.ai_card_keep_value["indulgence"] = 50 local indulgence = fk.CreateDelayedTrickCard{ name = "indulgence", suit = Card.Spade, @@ -846,9 +862,10 @@ local crossbowSkill = fk.CreateTargetModSkill{ end end, } + crossbowSkill:addRelatedSkill(crossbowAudio) Fk:addSkill(crossbowSkill) - +fk.ai_card_keep_value["crossbow"] = 30 local crossbow = fk.CreateWeapon{ name = "crossbow", suit = Card.Club, @@ -899,8 +916,9 @@ local qingGangSkill = fk.CreateTriggerSkill{ end) end, } -Fk:addSkill(qingGangSkill) +Fk:addSkill(qingGangSkill) +fk.ai_card_keep_value["qinggang_sword"] = 20 local qingGang = fk.CreateWeapon{ name = "qinggang_sword", suit = Card.Spade, @@ -932,8 +950,9 @@ local iceSwordSkill = fk.CreateTriggerSkill{ return true end } -Fk:addSkill(iceSwordSkill) +Fk:addSkill(iceSwordSkill) +fk.ai_card_keep_value["ice_sword"] = 20 local iceSword = fk.CreateWeapon{ name = "ice_sword", suit = Card.Spade, @@ -971,6 +990,7 @@ local doubleSwordsSkill = fk.CreateTriggerSkill{ end, } Fk:addSkill(doubleSwordsSkill) +fk.ai_card_keep_value["double_swords"] = 20 local doubleSwords = fk.CreateWeapon{ name = "double_swords", suit = Card.Spade, @@ -1005,6 +1025,7 @@ local bladeSkill = fk.CreateTriggerSkill{ end, } Fk:addSkill(bladeSkill) +fk.ai_card_keep_value["blade"] = 25 local blade = fk.CreateWeapon{ name = "blade", suit = Card.Spade, @@ -1037,6 +1058,7 @@ local spearSkill = fk.CreateViewAsSkill{ end, } Fk:addSkill(spearSkill) +fk.ai_card_keep_value["spear"] = 25 local spear = fk.CreateWeapon{ name = "spear", suit = Card.Spade, @@ -1080,6 +1102,7 @@ local axeSkill = fk.CreateTriggerSkill{ end, } Fk:addSkill(axeSkill) +fk.ai_card_keep_value["axe"] = 45 local axe = fk.CreateWeapon{ name = "axe", suit = Card.Diamond, @@ -1120,6 +1143,7 @@ local halberdSkill = fk.CreateTargetModSkill{ } halberdSkill:addRelatedSkill(halberdAudio) Fk:addSkill(halberdSkill) +fk.ai_card_keep_value["halberd"] = 10 local halberd = fk.CreateWeapon{ name = "halberd", suit = Card.Diamond, @@ -1165,6 +1189,7 @@ local kylinBowSkill = fk.CreateTriggerSkill{ end } Fk:addSkill(kylinBowSkill) +fk.ai_card_keep_value["kylin_bow"] = 5 local kylinBow = fk.CreateWeapon{ name = "kylin_bow", suit = Card.Heart, @@ -1221,6 +1246,7 @@ local eightDiagramSkill = fk.CreateTriggerSkill{ end } Fk:addSkill(eightDiagramSkill) +fk.ai_card_keep_value["eight_diagram"] = 25 local eightDiagram = fk.CreateArmor{ name = "eight_diagram", suit = Card.Spade, @@ -1246,6 +1272,7 @@ local niohShieldSkill = fk.CreateTriggerSkill{ on_use = Util.TrueFunc, } Fk:addSkill(niohShieldSkill) +fk.ai_card_keep_value["nioh_shield"] = 20 local niohShield = fk.CreateArmor{ name = "nioh_shield", suit = Card.Club, @@ -1267,6 +1294,7 @@ local diluSkill = fk.CreateDistanceSkill{ end, } Fk:addSkill(diluSkill) +fk.ai_card_keep_value["dilu"] = 20 local diLu = fk.CreateDefensiveRide{ name = "dilu", suit = Card.Club, @@ -1288,6 +1316,7 @@ local jueyingSkill = fk.CreateDistanceSkill{ end, } Fk:addSkill(jueyingSkill) +fk.ai_card_keep_value["jueying"] = 20 local jueYing = fk.CreateDefensiveRide{ name = "jueying", suit = Card.Spade, @@ -1309,6 +1338,7 @@ local zhuahuangfeidianSkill = fk.CreateDistanceSkill{ end, } Fk:addSkill(zhuahuangfeidianSkill) +fk.ai_card_keep_value["zhuahuangfeidian"] = 20 local zhuaHuangFeiDian = fk.CreateDefensiveRide{ name = "zhuahuangfeidian", suit = Card.Heart, @@ -1330,6 +1360,7 @@ local chituSkill = fk.CreateDistanceSkill{ end, } Fk:addSkill(chituSkill) +fk.ai_card_keep_value["chitu"] = 20 local chiTu = fk.CreateOffensiveRide{ name = "chitu", suit = Card.Heart, @@ -1351,6 +1382,7 @@ local dayuanSkill = fk.CreateDistanceSkill{ end, } Fk:addSkill(dayuanSkill) +fk.ai_card_keep_value["dayuan"] = 20 local daYuan = fk.CreateOffensiveRide{ name = "dayuan", suit = Card.Spade, @@ -1372,6 +1404,7 @@ local zixingSkill = fk.CreateDistanceSkill{ end, } Fk:addSkill(zixingSkill) +fk.ai_card_keep_value["zixing"] = 20 local ziXing = fk.CreateOffensiveRide{ name = "zixing", suit = Card.Diamond, -- Gitee From f8d07011e0d568d1c9c0bb47a5d3a18ff01b0d29 Mon Sep 17 00:00:00 2001 From: Art_Sakura <1754798088@qq.com> Date: Sat, 16 Nov 2024 15:15:48 +0800 Subject: [PATCH 04/11] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=AF=B9AIUtil?= =?UTF-8?q?=E7=B1=BB=E7=9A=84require?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/server/ai/init.lua | 1 - standard/ai/init.lua | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lua/server/ai/init.lua b/lua/server/ai/init.lua index 52f9534..68a8a8d 100644 --- a/lua/server/ai/init.lua +++ b/lua/server/ai/init.lua @@ -5,7 +5,6 @@ TrustAI = require "server.ai.trust_ai" -- RandomAI = require "server.ai.random_ai" SmartAI = require "server.ai.smart_ai" -AIUtil = require "server.ai.util" -- load ai module from packages local directories diff --git a/standard/ai/init.lua b/standard/ai/init.lua index 003a697..d504362 100644 --- a/standard/ai/init.lua +++ b/standard/ai/init.lua @@ -26,7 +26,7 @@ SmartAI:setSkillAI("ganglie", { local cards = ai:getEnabledCards() if #cards < 2 then return "" end - local to_discard = AIUtil:getChoiceCardsByKeepValue(cards, 2, nil) + local to_discard = SmartAI:getChoiceCardsByKeepValue(cards, 2, nil) local cancel_val = ai:getBenefitOfEvents(function(logic) logic:damage{ from = ai.room.logic:getCurrentEvent().data[2], @@ -149,7 +149,7 @@ SmartAI:setSkillAI("zhiheng", { local cards = ai:getEnabledCards() --- TODO: getEnabledCard会返回装备区的牌,缺少对装备区的牌进行判断 - cards = AIUtil:getChoiceCardsByKeepValue(cards, #cards, function(value) return value < 45 end) + cards = SmartAI:getChoiceCardsByKeepValue(cards, #cards, function(value) return value < 45 end) return { cards = cards }, ai:getBenefitOfEvents(function(logic) logic:throwCard(cards, self.skill.name, player, player) -- Gitee From f8a3211c8eba4f72a2e87479dc806560a6dfa4ca Mon Sep 17 00:00:00 2001 From: Art_Sakura <1754798088@qq.com> Date: Sat, 16 Nov 2024 15:28:34 +0800 Subject: [PATCH 05/11] =?UTF-8?q?=E5=B0=86=E9=83=A8=E5=88=86=E6=9D=83?= =?UTF-8?q?=E9=87=8D=E8=B5=8B=E5=80=BC=E7=A7=BB=E5=8A=A8=E8=87=B3=E7=9B=B8?= =?UTF-8?q?=E5=AF=B9=E5=BA=94=E6=96=87=E4=BB=B6=E5=86=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/server/ai/util.lua | 44 ++++++++++++++++++++--------------------- maneuvering/ai/init.lua | 18 +++++++++++++++++ maneuvering/init.lua | 12 ----------- 3 files changed, 40 insertions(+), 34 deletions(-) diff --git a/lua/server/ai/util.lua b/lua/server/ai/util.lua index ab6b9bf..3a120e4 100644 --- a/lua/server/ai/util.lua +++ b/lua/server/ai/util.lua @@ -8,35 +8,35 @@ local AIUtil = {} -- mixin ---@param filter fun(integer) @ 条件判断 判断权重大于 或 小于 n ---@return integer[] @ 牌ids function AIUtil:getChoiceCardsByKeepValue(cards, number, filter) - number = math.max(1, math.min(number, #cards)) + number = math.max(1, math.min(number, #cards)) - --- 根据每张牌的id 查找权重 - local list = {} - for i, id in ipairs(cards) do - local card = Fk:getCardById(id) - local value = fk.ai_card_keep_value[card.name] or -50 +--- 根据每张牌的id 查找权重 + local list = {} + for i, id in ipairs(cards) do + local card = Fk:getCardById(id) + local value = fk.ai_card_keep_value[card.name] or -50 - if value == nil then value = -50 end + if value == nil then value = -50 end - if type(filter) == "function" then - if(filter(value)) then table.insert(list, {id, value}) end - else - table.insert(list, {id, value}) - end + if type(filter) == "function" then + if(filter(value)) then table.insert(list, {id, value}) end + else + table.insert(list, {id, value}) end + end - --- 根据权重从低往高排序 - table.sort(list, function(a, b) - return a[2] < b[2] - end) + --- 根据权重从低往高排序 + table.sort(list, function(a, b) + return a[2] < b[2] + end) - --- 将排序后的card id返回 - local ret = {} - for i = 1, #list do - table.insert(ret, list[i][1]) - end + --- 将排序后的card id返回 + local ret = {} + for i = 1, #list do + table.insert(ret, list[i][1]) + end - return ret + return ret end diff --git a/maneuvering/ai/init.lua b/maneuvering/ai/init.lua index fa8ac2f..05be7d0 100644 --- a/maneuvering/ai/init.lua +++ b/maneuvering/ai/init.lua @@ -1,4 +1,7 @@ +fk.ai_card_keep_value["thunder__slash"] = 20 SmartAI:setCardSkillAI("thunder__slash_skill", nil, "slash_skill") + +fk.ai_card_keep_value["fire__slash"] = 35 SmartAI:setCardSkillAI("fire__slash_skill", nil, "slash_skill") SmartAI:setCardSkillAI("iron_chain_skill", { @@ -31,7 +34,15 @@ SmartAI:setCardSkillAI("supply_shortage_skill") --[[ SmartAI:setSkillAI("analeptic_skill", just_use) --]] +fk.ai_card_keep_value["analeptic"] = 30 + +fk.ai_card_keep_value["iron_chain"] = 25 + +fk.ai_card_keep_value["fire_attack"] = 30 + +fk.ai_card_keep_value["supply_shortage"] = 45 +fk.ai_card_keep_value["guding_blade"] = 20 SmartAI:setTriggerSkillAI("#guding_blade_skill", { correct_func = function(self, logic, event, target, player, data) if self.skill:triggerable(event, target, player, data) then @@ -40,6 +51,7 @@ SmartAI:setTriggerSkillAI("#guding_blade_skill", { end, }) +fk.ai_card_keep_value["vine"] = 30 SmartAI:setTriggerSkillAI("#vine_skill", { correct_func = function(self, logic, event, target, player, data) local skill = self.skill @@ -52,3 +64,9 @@ SmartAI:setTriggerSkillAI("#vine_skill", { end end, }) + +fk.ai_card_keep_value["hualiu"] = 20 + +fk.ai_card_keep_value["silver_lion"] = 20 + +fk.ai_card_keep_value["fan"] = 20 \ No newline at end of file diff --git a/maneuvering/init.lua b/maneuvering/init.lua index d5e3e9b..e05e48e 100644 --- a/maneuvering/init.lua +++ b/maneuvering/init.lua @@ -41,7 +41,6 @@ local thunderSlashSkill = fk.CreateActiveSkill{ }) end } -fk.ai_card_keep_value["thunder__slash"] = 20 local thunderSlash = fk.CreateBasicCard{ name = "thunder__slash", skill = thunderSlashSkill, @@ -94,7 +93,6 @@ local fireSlashSkill = fk.CreateActiveSkill{ }) end } -fk.ai_card_keep_value["fire__slash"] = 35 local fireSlash = fk.CreateBasicCard{ name = "fire__slash", skill = fireSlashSkill, @@ -182,8 +180,6 @@ local analepticEffect = fk.CreateTriggerSkill{ } Fk:addSkill(analepticEffect) -fk.ai_card_keep_value["analeptic"] = 30 - local analeptic = fk.CreateBasicCard{ name = "analeptic", suit = Card.Spade, @@ -227,7 +223,6 @@ local ironChainCardSkill = fk.CreateActiveSkill{ end, } -fk.ai_card_keep_value["iron_chain"] = 25 local ironChain = fk.CreateTrickCard{ name = "iron_chain", skill = ironChainCardSkill, @@ -279,7 +274,6 @@ local fireAttackSkill = fk.CreateActiveSkill{ end end, } -fk.ai_card_keep_value["fire_attack"] = 30 local fireAttack = fk.CreateTrickCard{ name = "fire_attack", skill = fireAttackSkill, @@ -329,7 +323,6 @@ local supplyShortageSkill = fk.CreateActiveSkill{ } end, } -fk.ai_card_keep_value["supply_shortage"] = 45 local supplyShortage = fk.CreateDelayedTrickCard{ name = "supply_shortage", skill = supplyShortageSkill, @@ -356,7 +349,6 @@ local gudingSkill = fk.CreateTriggerSkill{ end, } Fk:addSkill(gudingSkill) -fk.ai_card_keep_value["guding_blade"] = 20 local gudingBlade = fk.CreateWeapon{ name = "guding_blade", suit = Card.Spade, @@ -392,7 +384,6 @@ local fanSkill = fk.CreateTriggerSkill{ end, } Fk:addSkill(fanSkill) -fk.ai_card_keep_value["fan"] = 20 local fan = fk.CreateWeapon{ name = "fan", suit = Card.Diamond, @@ -434,7 +425,6 @@ local vineSkill = fk.CreateTriggerSkill{ end, } Fk:addSkill(vineSkill) -fk.ai_card_keep_value["vine"] = 30 local vine = fk.CreateArmor{ name = "vine", equip_skill = vineSkill, @@ -457,7 +447,6 @@ local silverLionSkill = fk.CreateTriggerSkill{ end, } Fk:addSkill(silverLionSkill) -fk.ai_card_keep_value["silver_lion"] = 20 local silverLion = fk.CreateArmor{ name = "silver_lion", suit = Card.Club, @@ -488,7 +477,6 @@ local hualiuSkill = fk.CreateDistanceSkill{ end, } Fk:addSkill(hualiuSkill) -fk.ai_card_keep_value["hualiu"] = 20 local huaLiu = fk.CreateDefensiveRide{ name = "hualiu", suit = Card.Diamond, -- Gitee From 0a2334cef74cd7957c0a16e95ab28c94760d9614 Mon Sep 17 00:00:00 2001 From: Art_Sakura <1754798088@qq.com> Date: Mon, 18 Nov 2024 11:14:14 +0800 Subject: [PATCH 06/11] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=A0=87=E5=8C=85?= =?UTF-8?q?=E5=92=8C=E5=86=9B=E4=BA=89=E5=8C=85=E7=9A=84=E6=9D=83=E9=87=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/server/ai/smart_ai.lua | 2 ++ lua/server/ai/util.lua | 2 +- standard/ai/init.lua | 4 +-- standard_cards/ai/init.lua | 53 +++++++++++++++++++++++++++++++++++++- standard_cards/init.lua | 34 ------------------------ 5 files changed, 57 insertions(+), 38 deletions(-) diff --git a/lua/server/ai/smart_ai.lua b/lua/server/ai/smart_ai.lua index 743bb1d..705a8fa 100644 --- a/lua/server/ai/smart_ai.lua +++ b/lua/server/ai/smart_ai.lua @@ -6,6 +6,8 @@ --]] +fk.ai_card_keep_value = {} + ---@class SmartAI: TrustAI, AIUtil ---@field private _memory table @ AI底层的空间换时间机制 ---@field public friends ServerPlayer[] @ 队友 diff --git a/lua/server/ai/util.lua b/lua/server/ai/util.lua index 3a120e4..161c1d2 100644 --- a/lua/server/ai/util.lua +++ b/lua/server/ai/util.lua @@ -10,7 +10,7 @@ local AIUtil = {} -- mixin function AIUtil:getChoiceCardsByKeepValue(cards, number, filter) number = math.max(1, math.min(number, #cards)) ---- 根据每张牌的id 查找权重 + --- 根据每张牌的id 查找权重 local list = {} for i, id in ipairs(cards) do local card = Fk:getCardById(id) diff --git a/standard/ai/init.lua b/standard/ai/init.lua index d504362..72c904a 100644 --- a/standard/ai/init.lua +++ b/standard/ai/init.lua @@ -148,7 +148,7 @@ SmartAI:setSkillAI("zhiheng", { local player = ai.player local cards = ai:getEnabledCards() - --- TODO: getEnabledCard会返回装备区的牌,缺少对装备区的牌进行判断 + --- TODO: getEnabledCards会返回装备区的牌,缺少对装备区的牌进行判断 cards = SmartAI:getChoiceCardsByKeepValue(cards, #cards, function(value) return value < 45 end) return { cards = cards }, ai:getBenefitOfEvents(function(logic) @@ -201,4 +201,4 @@ SmartAI:setSkillAI("guose", nil, "spear_skill") SmartAI:setSkillAI("jijiu", nil, "spear_skill") -SmartAI:setSkillAI("qixi", nil, "spear_skill") \ No newline at end of file +SmartAI:setSkillAI("qixi", nil, "spear_skill") diff --git a/standard_cards/ai/init.lua b/standard_cards/ai/init.lua index 67acbe4..b5124f8 100644 --- a/standard_cards/ai/init.lua +++ b/standard_cards/ai/init.lua @@ -7,14 +7,18 @@ SmartAI:setCardSkillAI("default_card_skill", { end, }) +fk.ai_card_keep_value["slash"] = 10 SmartAI:setCardSkillAI("slash_skill", { estimated_benefit = 100, }, "default_card_skill") -- jink +fk.ai_card_keep_value["jink"] = 40 +fk.ai_card_keep_value["peach"] = 60 SmartAI:setCardSkillAI("peach_skill", nil, "default_card_skill") +fk.ai_card_keep_value["dismantlement"] = 45 SmartAI:setCardSkillAI("dismantlement_skill", { on_effect = function(self, logic, effect) local from = logic:getPlayerById(effect.from) @@ -39,6 +43,7 @@ SmartAI:setCardSkillAI("dismantlement_skill", { end, }) +fk.ai_card_keep_value["snatch"] = 45 SmartAI:setCardSkillAI("snatch_skill", { think_card_chosen = function(self, ai, target, _, __) local cards = target:getCardIds("hej") @@ -56,8 +61,12 @@ SmartAI:setCardSkillAI("snatch_skill", { }, "dismantlement_skill") -- duel +fk.ai_card_keep_value["duel"] = 30 + -- collateral_skill +fk.ai_card_keep_value["collateral"] = 10 +fk.ai_card_keep_value["ex_nihilo"] = 50 SmartAI:setCardSkillAI("ex_nihilo_skill", { on_use = function(self, logic, effect) self.skill:onUse(logic, effect) @@ -69,7 +78,9 @@ SmartAI:setCardSkillAI("ex_nihilo_skill", { }) -- nullification +fk.ai_card_keep_value["nullification"] = 55 +fk.ai_card_keep_value["savage_assault"] = 20 SmartAI:setCardSkillAI("savage_assault_skill", { on_use = function(self, logic, effect) self.skill:onUse(logic, effect) @@ -79,6 +90,7 @@ SmartAI:setCardSkillAI("savage_assault_skill", { end, }) +fk.ai_card_keep_value["archery_attack"] = 20 SmartAI:setCardSkillAI("archery_attack_skill", { on_use = function(self, logic, effect) self.skill:onUse(logic, effect) @@ -88,11 +100,16 @@ SmartAI:setCardSkillAI("archery_attack_skill", { end, }) +fk.ai_card_keep_value["god_salvation"] = 20 SmartAI:setCardSkillAI("god_salvation_skill", nil, "default_card_skill") -- amazing_grace_skill +fk.ai_card_keep_value["amazing_grace"] = 20 + -- lightning_skill +fk.ai_card_keep_value["lightning"] = -10 +fk.ai_card_keep_value["indulgence"] = 50 SmartAI:setCardSkillAI("indulgence_skill") SmartAI:setCardSkillAI("default_equip_skill", { @@ -131,6 +148,40 @@ SmartAI:setCardSkillAI("default_equip_skill", { end, }) +fk.ai_card_keep_value["crossbow"] = 30 + +fk.ai_card_keep_value["qinggang_sword"] = 20 + +fk.ai_card_keep_value["ice_sword"] = 20 + +fk.ai_card_keep_value["double_swords"] = 20 + +fk.ai_card_keep_value["blade"] = 25 + +fk.ai_card_keep_value["spear"] = 25 + +fk.ai_card_keep_value["axe"] = 45 + +fk.ai_card_keep_value["halberd"] = 10 + +fk.ai_card_keep_value["kylin_bow"] = 5 + +fk.ai_card_keep_value["eight_diagram"] = 25 + +fk.ai_card_keep_value["nioh_shield"] = 20 + +fk.ai_card_keep_value["dilu"] = 20 + +fk.ai_card_keep_value["jueying"] = 20 + +fk.ai_card_keep_value["zhuahuangfeidian"] = 20 + +fk.ai_card_keep_value["chitu"] = 20 + +fk.ai_card_keep_value["dayuan"] = 20 + +fk.ai_card_keep_value["zixing"] = 20 + SmartAI:setTriggerSkillAI("#nioh_shield_skill", { correct_func = function(self, logic, event, target, player, data) return self.skill:triggerable(event, target, player, data) @@ -187,4 +238,4 @@ SmartAI:setSkillAI("spear_skill", { return best_ret, best_val end, -}, "__card_skill") \ No newline at end of file +}, "__card_skill") diff --git a/standard_cards/init.lua b/standard_cards/init.lua index 1eccef3..77d5925 100644 --- a/standard_cards/init.lua +++ b/standard_cards/init.lua @@ -3,8 +3,6 @@ local extension = Package:new("standard_cards", Package.CardPack) extension.metadata = require "packages.standard_cards.metadata" -fk.ai_card_keep_value = {} - local slashSkill = fk.CreateActiveSkill{ name = "slash_skill", prompt = function(self, selected_cards) @@ -61,7 +59,6 @@ local slashSkill = fk.CreateActiveSkill{ end end } -fk.ai_card_keep_value["slash"] = 10 local slash = fk.CreateBasicCard{ name = "slash", number = 7, @@ -115,7 +112,6 @@ local jinkSkill = fk.CreateActiveSkill{ end end } -fk.ai_card_keep_value["jink"] = 40 local jink = fk.CreateBasicCard{ name = "jink", suit = Card.Heart, @@ -174,7 +170,6 @@ local peachSkill = fk.CreateActiveSkill{ end end } -fk.ai_card_keep_value["peach"] = 60 local peach = fk.CreateBasicCard{ name = "peach", suit = Card.Heart, @@ -214,7 +209,6 @@ local dismantlementSkill = fk.CreateActiveSkill{ room:throwCard({cid}, self.name, to, from) end } -fk.ai_card_keep_value["dismantlement"] = 45 local dismantlement = fk.CreateTrickCard{ name = "dismantlement", suit = Card.Spade, @@ -257,7 +251,6 @@ local snatchSkill = fk.CreateActiveSkill{ room:obtainCard(from, cid, false, fk.ReasonPrey) end } -fk.ai_card_keep_value["snatch"] = 45 local snatch = fk.CreateTrickCard{ name = "snatch", suit = Card.Spade, @@ -344,7 +337,6 @@ local duelSkill = fk.CreateActiveSkill{ end end } -fk.ai_card_keep_value["duel"] = 30 local duel = fk.CreateTrickCard{ name = "duel", suit = Card.Spade, @@ -425,7 +417,6 @@ local collateralSkill = fk.CreateActiveSkill{ end end } -fk.ai_card_keep_value["collateral"] = 10 local collateral = fk.CreateTrickCard{ name = "collateral", suit = Card.Club, @@ -456,7 +447,6 @@ local exNihiloSkill = fk.CreateActiveSkill{ target:drawCards(2, "ex_nihilo") end } -fk.ai_card_keep_value["ex_nihilo"] = 50 local exNihilo = fk.CreateTrickCard{ name = "ex_nihilo", suit = Card.Heart, @@ -480,7 +470,6 @@ local nullificationSkill = fk.CreateActiveSkill{ end end } -fk.ai_card_keep_value["nullification"] = 55 local nullification = fk.CreateTrickCard{ name = "nullification", suit = Card.Spade, @@ -527,7 +516,6 @@ local savageAssaultSkill = fk.CreateActiveSkill{ end end } -fk.ai_card_keep_value["savage_assault"] = 20 local savageAssault = fk.CreateTrickCard{ name = "savage_assault", suit = Card.Spade, @@ -572,7 +560,6 @@ local archeryAttackSkill = fk.CreateActiveSkill{ end end } -fk.ai_card_keep_value["archery_attack"] = 20 local archeryAttack = fk.CreateTrickCard{ name = "archery_attack", suit = Card.Heart, @@ -611,7 +598,6 @@ local godSalvationSkill = fk.CreateActiveSkill{ end end } -fk.ai_card_keep_value["god_salvation"] = 20 local godSalvation = fk.CreateTrickCard{ name = "god_salvation", suit = Card.Heart, @@ -682,7 +668,6 @@ local amazingGraceSkill = fk.CreateActiveSkill{ table.removeOne(effect.extra_data.AGFilled, chosen) end } -fk.ai_card_keep_value["amazing_grace"] = 20 local amazingGrace = fk.CreateTrickCard{ name = "amazing_grace", suit = Card.Heart, @@ -767,7 +752,6 @@ local lightningSkill = fk.CreateActiveSkill{ } end, } -fk.ai_card_keep_value["lightning"] = -10 local lightning = fk.CreateDelayedTrickCard{ name = "lightning", suit = Card.Spade, @@ -814,7 +798,6 @@ local indulgenceSkill = fk.CreateActiveSkill{ } end, } -fk.ai_card_keep_value["indulgence"] = 50 local indulgence = fk.CreateDelayedTrickCard{ name = "indulgence", suit = Card.Spade, @@ -865,7 +848,6 @@ local crossbowSkill = fk.CreateTargetModSkill{ crossbowSkill:addRelatedSkill(crossbowAudio) Fk:addSkill(crossbowSkill) -fk.ai_card_keep_value["crossbow"] = 30 local crossbow = fk.CreateWeapon{ name = "crossbow", suit = Card.Club, @@ -918,7 +900,6 @@ local qingGangSkill = fk.CreateTriggerSkill{ } Fk:addSkill(qingGangSkill) -fk.ai_card_keep_value["qinggang_sword"] = 20 local qingGang = fk.CreateWeapon{ name = "qinggang_sword", suit = Card.Spade, @@ -952,7 +933,6 @@ local iceSwordSkill = fk.CreateTriggerSkill{ } Fk:addSkill(iceSwordSkill) -fk.ai_card_keep_value["ice_sword"] = 20 local iceSword = fk.CreateWeapon{ name = "ice_sword", suit = Card.Spade, @@ -990,7 +970,6 @@ local doubleSwordsSkill = fk.CreateTriggerSkill{ end, } Fk:addSkill(doubleSwordsSkill) -fk.ai_card_keep_value["double_swords"] = 20 local doubleSwords = fk.CreateWeapon{ name = "double_swords", suit = Card.Spade, @@ -1025,7 +1004,6 @@ local bladeSkill = fk.CreateTriggerSkill{ end, } Fk:addSkill(bladeSkill) -fk.ai_card_keep_value["blade"] = 25 local blade = fk.CreateWeapon{ name = "blade", suit = Card.Spade, @@ -1058,7 +1036,6 @@ local spearSkill = fk.CreateViewAsSkill{ end, } Fk:addSkill(spearSkill) -fk.ai_card_keep_value["spear"] = 25 local spear = fk.CreateWeapon{ name = "spear", suit = Card.Spade, @@ -1102,7 +1079,6 @@ local axeSkill = fk.CreateTriggerSkill{ end, } Fk:addSkill(axeSkill) -fk.ai_card_keep_value["axe"] = 45 local axe = fk.CreateWeapon{ name = "axe", suit = Card.Diamond, @@ -1143,7 +1119,6 @@ local halberdSkill = fk.CreateTargetModSkill{ } halberdSkill:addRelatedSkill(halberdAudio) Fk:addSkill(halberdSkill) -fk.ai_card_keep_value["halberd"] = 10 local halberd = fk.CreateWeapon{ name = "halberd", suit = Card.Diamond, @@ -1189,7 +1164,6 @@ local kylinBowSkill = fk.CreateTriggerSkill{ end } Fk:addSkill(kylinBowSkill) -fk.ai_card_keep_value["kylin_bow"] = 5 local kylinBow = fk.CreateWeapon{ name = "kylin_bow", suit = Card.Heart, @@ -1246,7 +1220,6 @@ local eightDiagramSkill = fk.CreateTriggerSkill{ end } Fk:addSkill(eightDiagramSkill) -fk.ai_card_keep_value["eight_diagram"] = 25 local eightDiagram = fk.CreateArmor{ name = "eight_diagram", suit = Card.Spade, @@ -1272,7 +1245,6 @@ local niohShieldSkill = fk.CreateTriggerSkill{ on_use = Util.TrueFunc, } Fk:addSkill(niohShieldSkill) -fk.ai_card_keep_value["nioh_shield"] = 20 local niohShield = fk.CreateArmor{ name = "nioh_shield", suit = Card.Club, @@ -1294,7 +1266,6 @@ local diluSkill = fk.CreateDistanceSkill{ end, } Fk:addSkill(diluSkill) -fk.ai_card_keep_value["dilu"] = 20 local diLu = fk.CreateDefensiveRide{ name = "dilu", suit = Card.Club, @@ -1316,7 +1287,6 @@ local jueyingSkill = fk.CreateDistanceSkill{ end, } Fk:addSkill(jueyingSkill) -fk.ai_card_keep_value["jueying"] = 20 local jueYing = fk.CreateDefensiveRide{ name = "jueying", suit = Card.Spade, @@ -1338,7 +1308,6 @@ local zhuahuangfeidianSkill = fk.CreateDistanceSkill{ end, } Fk:addSkill(zhuahuangfeidianSkill) -fk.ai_card_keep_value["zhuahuangfeidian"] = 20 local zhuaHuangFeiDian = fk.CreateDefensiveRide{ name = "zhuahuangfeidian", suit = Card.Heart, @@ -1360,7 +1329,6 @@ local chituSkill = fk.CreateDistanceSkill{ end, } Fk:addSkill(chituSkill) -fk.ai_card_keep_value["chitu"] = 20 local chiTu = fk.CreateOffensiveRide{ name = "chitu", suit = Card.Heart, @@ -1382,7 +1350,6 @@ local dayuanSkill = fk.CreateDistanceSkill{ end, } Fk:addSkill(dayuanSkill) -fk.ai_card_keep_value["dayuan"] = 20 local daYuan = fk.CreateOffensiveRide{ name = "dayuan", suit = Card.Spade, @@ -1404,7 +1371,6 @@ local zixingSkill = fk.CreateDistanceSkill{ end, } Fk:addSkill(zixingSkill) -fk.ai_card_keep_value["zixing"] = 20 local ziXing = fk.CreateOffensiveRide{ name = "zixing", suit = Card.Diamond, -- Gitee From 52c4ddcdc438ba51f1ec8d14b52149417d1f78d4 Mon Sep 17 00:00:00 2001 From: Art_Sakura <1754798088@qq.com> Date: Tue, 19 Nov 2024 17:51:36 +0800 Subject: [PATCH 07/11] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=B8=80=E7=89=88?= =?UTF-8?q?=EF=BC=8C=E5=B8=A6=E5=9B=9E=E5=AE=B6=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/server/ai/skill.lua | 11 +++++ lua/server/ai/smart_ai.lua | 12 ++++++ maneuvering/ai/init.lua | 2 +- standard/ai/init.lua | 82 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 106 insertions(+), 1 deletion(-) diff --git a/lua/server/ai/skill.lua b/lua/server/ai/skill.lua index 6047c6a..c0160c1 100644 --- a/lua/server/ai/skill.lua +++ b/lua/server/ai/skill.lua @@ -59,6 +59,16 @@ end function SkillAI:thinkForSkillInvoke(ai, skill_name, prompt) end +---@param ai SmartAI +---@param choices string[] @ 可选选项列表 +---@param skill_name? string @ 技能名 +---@param prompt? string @ 提示信息 +---@param detailed? boolean @ 选项详细描述 +---@param all_choices? string[] @ 所有选项(不可选变灰) +---@return string, integer? +function SkillAI:thinkForSkillChoice(ai, choices, skill_name, prompt, detailed, all_choices) +end + -- 搜索类方法:怎么走下一步? -- choose系列的函数都是用作迭代算子的,因此它们需要能计算出所有的可选情况 -- (至少是需要所有的以及觉得可行的可选情况,如果另外写AI的话) @@ -194,6 +204,7 @@ function SkillAI:onEffect(logic, cardEffectEvent) end ---@field think? fun(self: SkillAI, ai: SmartAI): any?, integer? ---@field think_card_chosen? fun(self: SkillAI, ai: SmartAI, target: ServerPlayer, flag: string, prompt: string?): integer, integer? ---@field think_skill_invoke? fun(self: SkillAI, ai: SmartAI, skill_name: string, prompt: string?): boolean, integer? +---@field think_skill_choice? fun(self: SkillAI, ai: SmartAI, choices:string[], skill_name: string, prompt: string, detailed:string, all_choices: string[]): string, integer ---@field choose_interaction? fun(self: SkillAI, ai: SmartAI): boolean? ---@field choose_cards? fun(self: SkillAI, ai: SmartAI): boolean? ---@field choose_targets? fun(self: SkillAI, ai: SmartAI): any, integer? diff --git a/lua/server/ai/smart_ai.lua b/lua/server/ai/smart_ai.lua index 705a8fa..c2fb54f 100644 --- a/lua/server/ai/smart_ai.lua +++ b/lua/server/ai/smart_ai.lua @@ -76,6 +76,7 @@ function SmartAI.static:setSkillAI(key, spec, inherit) think = "think", think_card_chosen = "thinkForCardChosen", think_skill_invoke = "thinkForSkillInvoke", + think_skill_choice = "thinkForChoice", choose_interaction = "chooseInteraction", choose_cards = "chooseCards", choose_targets = "chooseTargets", @@ -332,6 +333,17 @@ function SmartAI:handleAskForSkillInvoke(data) end end +function SmartAI:handleAskForChoice(data) + local choices, skillName, prompt, detailed, allChoices = table.unpack(data) + local ai = fk.ai_skills[skillName] + if ai then + local ret = ai:thinkForSkillChoice(self, choices, prompt, detailed, allChoices) + return ret + else + return choices[1] + end +end + -- 敌友判断相关。 -- 目前才开始,做个明身份打牌的就行了。 --======================================== diff --git a/maneuvering/ai/init.lua b/maneuvering/ai/init.lua index 05be7d0..80fec18 100644 --- a/maneuvering/ai/init.lua +++ b/maneuvering/ai/init.lua @@ -69,4 +69,4 @@ fk.ai_card_keep_value["hualiu"] = 20 fk.ai_card_keep_value["silver_lion"] = 20 -fk.ai_card_keep_value["fan"] = 20 \ No newline at end of file +fk.ai_card_keep_value["fan"] = 20 diff --git a/standard/ai/init.lua b/standard/ai/init.lua index 72c904a..e9cadad 100644 --- a/standard/ai/init.lua +++ b/standard/ai/init.lua @@ -183,6 +183,63 @@ SmartAI:setSkillAI("yingzi", { think_skill_invoke = Util.TrueFunc, }) +SmartAI:setSkillAI("fanjian", { + think = function(self, ai) + local player = ai.player + local players = ai:getEnabledTargets() + + --- 对所有目标计算被拿走一张自己手牌的收益 + local card_value = table.map(players, function(p) + return { p, ai:getBenefitOfEvents(function(logic) + local c = player:getCardIds("h")[1] + logic:obtainCard(p, c, true, fk.ReasonGive) + end)} + end) + + --- 对所有目标计算对其造成一点伤害的收益 + local damage_value = table.map(players, function(p) + return { p, ai:getBenefitOfEvents(function(logic) + logic:damage{ + from = ai.player, + to = p, + damage = 1, + skillName = self.skill.name, + } + end)} + end) + + local benefits = {}; + + for key, value in pairs(card_value) do + if damage_value[key] == nil then + table.insert(benefits, {key, value}) + else + table.insert(benefits, {key, value[2] + damage_value[key][2]}) + end + end + + table.sort(benefits, function(a, b) return a[2] < b[2] end) + + if #benefits == 0 then return false, 0 end + + local target = ai.room:getPlayerById(benefits[1][1]) + + -- ai:selectSkill(self.skill.name, true) + ai:selectTarget(target, true) + + -- ai:doOKButton() + + -- dbg() + + return { }, benefits[1][2] + + end, + + -- think_card_chosen = function (self, ai, target, flag, prompt) + + -- end, +}) + SmartAI:setSkillAI("xiaoji", { think_skill_invoke = function(self, ai, skill_name, prompt) return ai:getBenefitOfEvents(function(logic) @@ -191,6 +248,31 @@ SmartAI:setSkillAI("xiaoji", { end, }) +SmartAI:setSkillAI("tieqi", { + think_skill_invoke = function(self, ai, skill_name, prompt) + ---@type CardUseStruct + local dmg = ai.room.logic:getCurrentEvent().data[1] + local targets = dmg.tos + if not targets then return false end + + --- TODO 能跑,但是返回是0 + --- TODO 需要注意targets的问题 例如:方天多个目标 + local use_val = ai:getBenefitOfEvents(function(logic) + logic:useCard{ + from = ai.player.id, + to = targets[1], + card = dmg.card + } + end) + + if use_val >= 0 then + return true + end + + return false + end, +}) + SmartAI:setSkillAI("biyue", nil, "jizhi") SmartAI:setSkillAI("wusheng", nil, "spear_skill") -- Gitee From fbdbc160fe4f1378c230af459f48c64332db7b5f Mon Sep 17 00:00:00 2001 From: Art_Sakura <1754798088@qq.com> Date: Wed, 20 Nov 2024 10:57:00 +0800 Subject: [PATCH 08/11] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AF=B9=E6=8A=80?= =?UTF-8?q?=E8=83=BD=E5=8F=8D=E9=97=B4=E7=9A=84ai=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- standard/ai/init.lua | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/standard/ai/init.lua b/standard/ai/init.lua index e9cadad..0239795 100644 --- a/standard/ai/init.lua +++ b/standard/ai/init.lua @@ -224,17 +224,10 @@ SmartAI:setSkillAI("fanjian", { local target = ai.room:getPlayerById(benefits[1][1]) - -- ai:selectSkill(self.skill.name, true) - ai:selectTarget(target, true) - - -- ai:doOKButton() - - -- dbg() - - return { }, benefits[1][2] - + return {targets = { target }}, benefits[1][2] end, + --- 似乎反间不需要这个 -- think_card_chosen = function (self, ai, target, flag, prompt) -- end, -- Gitee From 73d5cdb5107b9205a973b86e66d4e740b629aec5 Mon Sep 17 00:00:00 2001 From: Art_Sakura <1754798088@qq.com> Date: Wed, 20 Nov 2024 17:26:08 +0800 Subject: [PATCH 09/11] =?UTF-8?q?fix=F0=9F=90=9B:=20=E4=BF=AE=E5=A4=8DAI?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E7=89=8C=E6=9D=83=E9=87=8D=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E7=89=8C=E6=95=B0=E9=87=8F=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E7=9A=84BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/server/ai/smart_ai.lua | 2 +- lua/server/ai/util.lua | 13 ++--- standard/ai/init.lua | 99 +++++++++++++++++++++++--------------- 3 files changed, 67 insertions(+), 47 deletions(-) diff --git a/lua/server/ai/smart_ai.lua b/lua/server/ai/smart_ai.lua index c2fb54f..5084585 100644 --- a/lua/server/ai/smart_ai.lua +++ b/lua/server/ai/smart_ai.lua @@ -232,7 +232,7 @@ end --- 将spec中的键值保存到这个技能的ai中 ---@param key string ---@param spec TriggerSkillAISpec ----@diagnostic disable-next-line +---@diagnostic disable-next-line1 function SmartAI:setTriggerSkillAI(key, spec) error("This is a static method. Please use SmartAI:setTriggerSkillAI(...)") end diff --git a/lua/server/ai/util.lua b/lua/server/ai/util.lua index 161c1d2..2cc9799 100644 --- a/lua/server/ai/util.lua +++ b/lua/server/ai/util.lua @@ -5,7 +5,7 @@ local AIUtil = {} -- mixin --- 根据传入的牌ids 判断权重 ---@param cards integer[] @ 牌ids ---@param number integer @ 需要弃置几张 ----@param filter fun(integer) @ 条件判断 判断权重大于 或 小于 n +---@param filter? fun(integer) @ 条件判断 判断权重大于 或 小于 n ---@return integer[] @ 牌ids function AIUtil:getChoiceCardsByKeepValue(cards, number, filter) number = math.max(1, math.min(number, #cards)) @@ -16,11 +16,7 @@ function AIUtil:getChoiceCardsByKeepValue(cards, number, filter) local card = Fk:getCardById(id) local value = fk.ai_card_keep_value[card.name] or -50 - if value == nil then value = -50 end - - if type(filter) == "function" then - if(filter(value)) then table.insert(list, {id, value}) end - else + if (not filter) or filter(value) then table.insert(list, {id, value}) end end @@ -32,8 +28,9 @@ function AIUtil:getChoiceCardsByKeepValue(cards, number, filter) --- 将排序后的card id返回 local ret = {} - for i = 1, #list do - table.insert(ret, list[i][1]) + for _, entry in ipairs(list) do + table.insert(ret, entry[1]) + if #ret == number then break end --- 一旦收集到足够的牌,就停止循环 end return ret diff --git a/standard/ai/init.lua b/standard/ai/init.lua index 0239795..b860ed6 100644 --- a/standard/ai/init.lua +++ b/standard/ai/init.lua @@ -26,7 +26,7 @@ SmartAI:setSkillAI("ganglie", { local cards = ai:getEnabledCards() if #cards < 2 then return "" end - local to_discard = SmartAI:getChoiceCardsByKeepValue(cards, 2, nil) + local to_discard = SmartAI:getChoiceCardsByKeepValue(cards, 2) local cancel_val = ai:getBenefitOfEvents(function(logic) logic:damage{ from = ai.room.logic:getCurrentEvent().data[2], @@ -146,9 +146,8 @@ SmartAI:setSkillAI("jizhi", { SmartAI:setSkillAI("zhiheng", { think = function(self, ai) local player = ai.player - local cards = ai:getEnabledCards() + local cards = ai:getEnabledCards(".|.|.|hand|.|.|.") - --- TODO: getEnabledCards会返回装备区的牌,缺少对装备区的牌进行判断 cards = SmartAI:getChoiceCardsByKeepValue(cards, #cards, function(value) return value < 45 end) return { cards = cards }, ai:getBenefitOfEvents(function(logic) @@ -185,52 +184,47 @@ SmartAI:setSkillAI("yingzi", { SmartAI:setSkillAI("fanjian", { think = function(self, ai) - local player = ai.player + local cards = ai:getEnabledCards() local players = ai:getEnabledTargets() - --- 对所有目标计算被拿走一张自己手牌的收益 - local card_value = table.map(players, function(p) - return { p, ai:getBenefitOfEvents(function(logic) - local c = player:getCardIds("h")[1] - logic:obtainCard(p, c, true, fk.ReasonGive) - end)} - end) - - --- 对所有目标计算对其造成一点伤害的收益 - local damage_value = table.map(players, function(p) - return { p, ai:getBenefitOfEvents(function(logic) - logic:damage{ - from = ai.player, - to = p, - damage = 1, - skillName = self.skill.name, - } - end)} - end) - - local benefits = {}; - - for key, value in pairs(card_value) do - if damage_value[key] == nil then - table.insert(benefits, {key, value}) - else - table.insert(benefits, {key, value[2] + damage_value[key][2]}) - end + --- 获取手牌中权重偏大的牌 + local good_cards = SmartAI:getChoiceCardsByKeepValue(cards, #cards, function(value) return value >= 45 end) + if (#good_cards / #cards) <= 0.8 then return {}, -1000 end + + local benefits = {} + + --- 遍历所有玩家,计算收益 + for _, target in ipairs(players) do + --- 计算获得手牌的收益 + local card_benefit = ai:getBenefitOfEvents(function(logic) + local c = ai.player:getCardIds("h")[1] --- 假设总是取第一张手牌,这里可能需要更复杂的逻辑 + logic:obtainCard(target, c, true, fk.ReasonGive) + end) + + --- 计算造成伤害的收益 + local damage_benefit = ai:getBenefitOfEvents(function(logic) + logic:damage{ + from = ai.player, + to = target, + damage = 1, + skillName = self.skill.name, + } + end) + + benefits[#benefits + 1] = { target, card_benefit + damage_benefit } end table.sort(benefits, function(a, b) return a[2] < b[2] end) - if #benefits == 0 then return false, 0 end - - local target = ai.room:getPlayerById(benefits[1][1]) + if #benefits == 0 then return {}, -1000 end - return {targets = { target }}, benefits[1][2] + return { targets = { benefits[1][1] } }, benefits[1][2] end, --- 似乎反间不需要这个 - -- think_card_chosen = function (self, ai, target, flag, prompt) + --- think_card_chosen = function (self, ai, target, flag, prompt) - -- end, + --- end, }) SmartAI:setSkillAI("xiaoji", { @@ -266,6 +260,35 @@ SmartAI:setSkillAI("tieqi", { end, }) +SmartAI:setSkillAI("qingnang", { + think = function(self, ai) + local player = ai.player + local cards = ai:getEnabledCards(".|.|.|hand|.|.|.") + local players = ai:getEnabledTargets() + + --- 对所有目标计算回血的收益 + local benefits = table.map(players, function(p) + return { p, ai:getBenefitOfEvents(function(logic) + --- @type RecoverStruct + logic:recover{ + who = p, + num = 1, + recoverBy = player + } + end)} + end) + + table.sort(benefits, function(a, b) return a[2] > b[2] end) + + if #benefits == 0 then return {}, -1000 end + + --- 尽量选择权重占比小的牌 + cards = SmartAI:getChoiceCardsByKeepValue(cards, 1) + + return { targets = { benefits[1][1] }, cards = cards }, benefits[1][2] + end, +}) + SmartAI:setSkillAI("biyue", nil, "jizhi") SmartAI:setSkillAI("wusheng", nil, "spear_skill") -- Gitee From 9980573f48268f836350e3af62960c81a30b82e4 Mon Sep 17 00:00:00 2001 From: Art_Sakura <1754798088@qq.com> Date: Thu, 21 Nov 2024 16:26:12 +0800 Subject: [PATCH 10/11] =?UTF-8?q?=E8=AE=A9ai=E9=AC=BC=E6=89=8D=E5=AF=B9?= =?UTF-8?q?=E9=83=A8=E5=88=86=E5=88=A4=E5=AE=9A=E5=81=9A=E5=87=BA=E9=80=89?= =?UTF-8?q?=E6=8B=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/server/ai/smart_ai.lua | 2 +- standard/ai/init.lua | 72 ++++++++++++++++++++++++++++++++------ 2 files changed, 62 insertions(+), 12 deletions(-) diff --git a/lua/server/ai/smart_ai.lua b/lua/server/ai/smart_ai.lua index 5084585..c2fb54f 100644 --- a/lua/server/ai/smart_ai.lua +++ b/lua/server/ai/smart_ai.lua @@ -232,7 +232,7 @@ end --- 将spec中的键值保存到这个技能的ai中 ---@param key string ---@param spec TriggerSkillAISpec ----@diagnostic disable-next-line1 +---@diagnostic disable-next-line function SmartAI:setTriggerSkillAI(key, spec) error("This is a static method. Please use SmartAI:setTriggerSkillAI(...)") end diff --git a/standard/ai/init.lua b/standard/ai/init.lua index b860ed6..033b2a9 100644 --- a/standard/ai/init.lua +++ b/standard/ai/init.lua @@ -97,6 +97,54 @@ SmartAI:setSkillAI("fankui", { end, }) +SmartAI:setSkillAI("guicai", { + think = function(self, ai) + ---@type JudgeStruct + local dmg = ai.room.logic:getCurrentEvent().data[1] + local target = dmg.who + local isFriend = ai:isFriend(target) + + local function handleCardSelection(ai, cardPattern) + local cards = ai:getEnabledCards(cardPattern) + if #cards == 0 then + return {}, -1000 + elseif #cards == 1 then + return { cards = cards }, 100 + else + cards = SmartAI:getChoiceCardsByKeepValue(cards, 1) + return { cards = cards }, 100 + end + end + + local function getResponseForReason(ai, reason, dmgCard, isFriend) + local patterns = { + indulgence = { matchPattern = ".|.|heart", friendPattern = ".|.|heart", enemyPattern = ".|.|^heart" }, + supply_shortage = { matchPattern = ".|.|club", friendPattern = ".|.|club", enemyPattern = ".|.|^club" }, + lightning = { matchPattern = ".|2~9|spade", friendPattern = ".|^2~9|^spade", enemyPattern = ".|2~9|spade" } + } + + local patternInfo = patterns[reason] + if not patternInfo then return {}, -1000 end + + local matchFunction = isFriend and patternInfo.friendPattern or patternInfo.enemyPattern + local matchResult = Exppattern:Parse(matchFunction):match(dmgCard) + + if (isFriend and not matchResult) or (not isFriend and matchResult) then + --- 如果目标是友方且不匹配友方结果,或者目标是敌方且匹配敌方结果(需要改判) + return handleCardSelection(ai, matchFunction) + else + --- 其他情况(目标是友方且匹配友方结果,或者目标是敌方且不匹配敌方结果) + return {}, -1000 + end + end + + local dmgCard = dmg.card + local response, value = getResponseForReason(ai, dmg.reason, dmgCard, isFriend) + + return response, value + end, +}) + SmartAI:setSkillAI("tuxi", { think = function(self, ai) local player = ai.player @@ -244,19 +292,21 @@ SmartAI:setSkillAI("tieqi", { --- TODO 能跑,但是返回是0 --- TODO 需要注意targets的问题 例如:方天多个目标 - local use_val = ai:getBenefitOfEvents(function(logic) - logic:useCard{ - from = ai.player.id, - to = targets[1], - card = dmg.card - } - end) + -- local use_val = ai:getBenefitOfEvents(function(logic) + -- logic:useCard{ + -- from = ai.player.id, + -- to = targets[1], + -- card = dmg.card + -- } + -- end) - if use_val >= 0 then - return true - end + -- if use_val >= 0 then + -- return true + -- end - return false + -- return false + + return ai:isEnemy(targets[1]) end, }) -- Gitee From 0c02ab5746caa56a1e6eb887bd2cd2008939f9e5 Mon Sep 17 00:00:00 2001 From: Art_Sakura <1754798088@qq.com> Date: Fri, 22 Nov 2024 21:00:49 +0800 Subject: [PATCH 11/11] =?UTF-8?q?=E9=9D=92=E5=9B=8A=E7=8E=B0=E5=9C=A8?= =?UTF-8?q?=E4=BC=9A=E8=AE=A1=E7=AE=97=E5=BC=83=E7=89=8C=E6=94=B6=E7=9B=8A?= =?UTF-8?q?=E4=BA=86=EF=BC=9B=E5=AF=B9=E9=83=A8=E5=88=86=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E9=9D=99=E6=80=81=E6=96=B9=E6=B3=95=E5=BE=97?= =?UTF-8?q?=E5=88=B0=E8=A7=A3=E5=86=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/server/ai/skill.lua | 4 +-- lua/server/ai/smart_ai.lua | 4 +-- standard/ai/init.lua | 51 +++++++++++++++++++++----------------- 3 files changed, 32 insertions(+), 27 deletions(-) diff --git a/lua/server/ai/skill.lua b/lua/server/ai/skill.lua index c0160c1..24edf16 100644 --- a/lua/server/ai/skill.lua +++ b/lua/server/ai/skill.lua @@ -66,7 +66,7 @@ end ---@param detailed? boolean @ 选项详细描述 ---@param all_choices? string[] @ 所有选项(不可选变灰) ---@return string, integer? -function SkillAI:thinkForSkillChoice(ai, choices, skill_name, prompt, detailed, all_choices) +function SkillAI:thinkForChoice(ai, choices, skill_name, prompt, detailed, all_choices) end -- 搜索类方法:怎么走下一步? @@ -204,7 +204,7 @@ function SkillAI:onEffect(logic, cardEffectEvent) end ---@field think? fun(self: SkillAI, ai: SmartAI): any?, integer? ---@field think_card_chosen? fun(self: SkillAI, ai: SmartAI, target: ServerPlayer, flag: string, prompt: string?): integer, integer? ---@field think_skill_invoke? fun(self: SkillAI, ai: SmartAI, skill_name: string, prompt: string?): boolean, integer? ----@field think_skill_choice? fun(self: SkillAI, ai: SmartAI, choices:string[], skill_name: string, prompt: string, detailed:string, all_choices: string[]): string, integer +---@field think_choice? fun(self: SkillAI, ai: SmartAI, choices:string[], skill_name: string, prompt: string, detailed:string, all_choices: string[]): string, integer ---@field choose_interaction? fun(self: SkillAI, ai: SmartAI): boolean? ---@field choose_cards? fun(self: SkillAI, ai: SmartAI): boolean? ---@field choose_targets? fun(self: SkillAI, ai: SmartAI): any, integer? diff --git a/lua/server/ai/smart_ai.lua b/lua/server/ai/smart_ai.lua index c2fb54f..f537325 100644 --- a/lua/server/ai/smart_ai.lua +++ b/lua/server/ai/smart_ai.lua @@ -76,7 +76,7 @@ function SmartAI.static:setSkillAI(key, spec, inherit) think = "think", think_card_chosen = "thinkForCardChosen", think_skill_invoke = "thinkForSkillInvoke", - think_skill_choice = "thinkForChoice", + think_choice = "thinkForChoice", choose_interaction = "chooseInteraction", choose_cards = "chooseCards", choose_targets = "chooseTargets", @@ -337,7 +337,7 @@ function SmartAI:handleAskForChoice(data) local choices, skillName, prompt, detailed, allChoices = table.unpack(data) local ai = fk.ai_skills[skillName] if ai then - local ret = ai:thinkForSkillChoice(self, choices, prompt, detailed, allChoices) + local ret = ai:thinkForChoice(self, choices, prompt, detailed, allChoices) return ret else return choices[1] diff --git a/standard/ai/init.lua b/standard/ai/init.lua index 033b2a9..0e4605a 100644 --- a/standard/ai/init.lua +++ b/standard/ai/init.lua @@ -26,7 +26,7 @@ SmartAI:setSkillAI("ganglie", { local cards = ai:getEnabledCards() if #cards < 2 then return "" end - local to_discard = SmartAI:getChoiceCardsByKeepValue(cards, 2) + local to_discard = ai:getChoiceCardsByKeepValue(cards, 2) local cancel_val = ai:getBenefitOfEvents(function(logic) logic:damage{ from = ai.room.logic:getCurrentEvent().data[2], @@ -111,7 +111,7 @@ SmartAI:setSkillAI("guicai", { elseif #cards == 1 then return { cards = cards }, 100 else - cards = SmartAI:getChoiceCardsByKeepValue(cards, 1) + cards = ai:getChoiceCardsByKeepValue(cards, 1) return { cards = cards }, 100 end end @@ -196,7 +196,7 @@ SmartAI:setSkillAI("zhiheng", { local player = ai.player local cards = ai:getEnabledCards(".|.|.|hand|.|.|.") - cards = SmartAI:getChoiceCardsByKeepValue(cards, #cards, function(value) return value < 45 end) + cards = ai:getChoiceCardsByKeepValue(cards, #cards, function(value) return value < 45 end) return { cards = cards }, ai:getBenefitOfEvents(function(logic) logic:throwCard(cards, self.skill.name, player, player) @@ -236,30 +236,30 @@ SmartAI:setSkillAI("fanjian", { local players = ai:getEnabledTargets() --- 获取手牌中权重偏大的牌 - local good_cards = SmartAI:getChoiceCardsByKeepValue(cards, #cards, function(value) return value >= 45 end) + local good_cards = ai:getChoiceCardsByKeepValue(cards, #cards, function(value) return value >= 45 end) if (#good_cards / #cards) <= 0.8 then return {}, -1000 end local benefits = {} --- 遍历所有玩家,计算收益 for _, target in ipairs(players) do - --- 计算获得手牌的收益 - local card_benefit = ai:getBenefitOfEvents(function(logic) - local c = ai.player:getCardIds("h")[1] --- 假设总是取第一张手牌,这里可能需要更复杂的逻辑 - logic:obtainCard(target, c, true, fk.ReasonGive) - end) - - --- 计算造成伤害的收益 - local damage_benefit = ai:getBenefitOfEvents(function(logic) - logic:damage{ - from = ai.player, - to = target, - damage = 1, - skillName = self.skill.name, - } - end) - - benefits[#benefits + 1] = { target, card_benefit + damage_benefit } + --- 计算获得手牌的收益 + local card_benefit = ai:getBenefitOfEvents(function(logic) + local c = ai.player:getCardIds("h")[1] --- 假设总是取第一张手牌,这里可能需要更复杂的逻辑 + logic:obtainCard(target, c, true, fk.ReasonGive) + end) + + --- 计算造成伤害的收益 + local damage_benefit = ai:getBenefitOfEvents(function(logic) + logic:damage{ + from = ai.player, + to = target, + damage = 1, + skillName = self.skill.name, + } + end) + + benefits[#benefits + 1] = { target, card_benefit + damage_benefit } end table.sort(benefits, function(a, b) return a[2] < b[2] end) @@ -333,9 +333,14 @@ SmartAI:setSkillAI("qingnang", { if #benefits == 0 then return {}, -1000 end --- 尽量选择权重占比小的牌 - cards = SmartAI:getChoiceCardsByKeepValue(cards, 1) + cards = ai:getChoiceCardsByKeepValue(cards, 1) + + --- 计算弃牌收益 + local throw = ai:getBenefitOfEvents(function(logic) + logic:throwCard(cards, self.skill.name, player, player) + end) - return { targets = { benefits[1][1] }, cards = cards }, benefits[1][2] + return { targets = { benefits[1][1] }, cards = cards }, benefits[1][2] + throw end, }) -- Gitee