diff --git a/standard/pkg/skills/fanjian.lua b/standard/pkg/skills/fanjian.lua index a95ed187f4f79be2937f95ac49986067c88bad61..e5cdd8683d3c38bcf0512ecfddf8b0c2d14342fe 100644 --- a/standard/pkg/skills/fanjian.lua +++ b/standard/pkg/skills/fanjian.lua @@ -15,7 +15,7 @@ fanjian:addEffect("active", { local player = effect.from local target = effect.tos[1] local choice = room:askToChoice(target, { - choices = {"log_spade", "log_heart", "log_club", "log_diamond"}, + choices = { "log_spade", "log_heart", "log_club", "log_diamond" }, skill_name = fanjian.name, }) local card = room:askToChooseCard(target, { @@ -25,7 +25,7 @@ fanjian:addEffect("active", { }) room:obtainCard(target, card, true, fk.ReasonPrey, target, fanjian.name) if Fk:getCardById(card):getSuitString(true) ~= choice and target:isAlive() then - room:damage{ + room:damage { from = player, to = target, damage = 1, @@ -37,27 +37,31 @@ fanjian:addEffect("active", { fanjian:addAI({ think = function(self, ai) - local cards = ai:getEnabledCards() + local cards = ai.player:getCardIds("h") local players = ai:getEnabledTargets() if #cards == 0 then return {}, -1000 end --- 获取手牌中权重偏大的牌 local good_cards = ai:getChoiceCardsByKeepValue(cards, #cards, function(value) return value >= 45 end) - if (#good_cards / #cards) <= 0.8 then return {}, -1000 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) + local card_benefit, all_benefits=-1,0 + local benefits_all = table.map(cards, function(cid) + local card_benefit_local = ai:getBenefitOfEvents(function(logic) + logic:obtainCard(target, cid, true, fk.ReasonGive) + end) + all_benefits = all_benefits + card_benefit_local + return card_benefit_local end) - + card_benefit = all_benefits / #benefits_all --- 计算造成伤害的收益 local damage_benefit = ai:getBenefitOfEvents(function(logic) - logic:damage{ + logic:damage { from = ai.player, to = target, damage = 1, @@ -68,7 +72,7 @@ fanjian:addAI({ benefits[#benefits + 1] = { target, card_benefit + damage_benefit } end - table.sort(benefits, function(a, b) return a[2] < b[2] end) + table.sort(benefits, function(a, b) return a[2] > b[2] end) if #benefits == 0 then return {}, -1000 end diff --git a/standard/pkg/skills/ganglie.lua b/standard/pkg/skills/ganglie.lua index 57088bca5c14911f51effbf342dc1a57e6a4e8b1..a0c6671e852f4a0765a36e9c89dbfc686a02d9fc 100644 --- a/standard/pkg/skills/ganglie.lua +++ b/standard/pkg/skills/ganglie.lua @@ -63,7 +63,7 @@ ganglie:addAI({ ---@type DamageData local dmg = ai.room.logic:getCurrentEvent().data local from = dmg.from - if not from then return false end + if not from or ai:isFriend(dmg.from) then return false end local dmg_val = ai:getBenefitOfEvents(function(logic) logic:damage{ from = ai.player, diff --git a/standard/pkg/skills/hujia.lua b/standard/pkg/skills/hujia.lua index b0dab8ae32146bb9d306ca22813da21edd279f57..4d1b41cdf7e4820e8efb80ff7a9dcf9a105b522d 100644 --- a/standard/pkg/skills/hujia.lua +++ b/standard/pkg/skills/hujia.lua @@ -7,11 +7,11 @@ local hujia_spec = { anim_type = "defensive", can_trigger = function(self, event, target, player, data) return target == player and player:hasSkill(hujia.name) and - Exppattern:Parse(data.pattern):matchExp("jink") and - (data.extraData == nil or data.extraData.hujia_ask == nil) and - not table.every(player.room.alive_players, function(p) - return p == player or p.kingdom ~= "wei" - end) + Exppattern:Parse(data.pattern):matchExp("jink") and + (data.extraData == nil or data.extraData.hujia_ask == nil) and + not table.every(player.room.alive_players, function(p) + return p == player or p.kingdom ~= "wei" + end) end, on_use = function(self, event, target, player, data) local room = player.room @@ -22,7 +22,7 @@ local hujia_spec = { pattern = "jink", prompt = "#hujia-ask:" .. player.id, cancelable = true, - extra_data = {hujia_ask = true} + extra_data = { hujia_ask = true } } local respond = room:askToResponse(p, params) if respond then @@ -50,4 +50,18 @@ local hujia_spec = { hujia:addEffect(fk.AskForCardUse, hujia_spec) hujia:addEffect(fk.AskForCardResponse, hujia_spec) +hujia:addAI({ + think_skill_invoke = function(self, ai, skill_name, prompt) + for _, p in ipairs(ai.player.room.alive_players) do + if ai:isFriend(p) and p.kingdom == "wei" and #table.filter(ai.player:getHandlyIds(), function(cid) + return Fk:getCardById(cid).trueName == "jink" + end) <= 1 then + return true + end + end + return false + end, +}) + + return hujia diff --git a/standard/pkg/skills/jieyin.lua b/standard/pkg/skills/jieyin.lua index 0e09553ce6c769a2a8798f69437cf3b86fbf8599..b525d4dc3bf9491d9e850332eee93d20766054ef 100644 --- a/standard/pkg/skills/jieyin.lua +++ b/standard/pkg/skills/jieyin.lua @@ -37,4 +37,52 @@ jieyin:addEffect("active", { end, }) + +jieyin:addAI({ + think = function(self, ai) + local cards = ai:getEnabledCards(".|.|.|hand|.|.|.") + local players = table.filter(ai.room.alive_players,function (p) + return p:isWounded() and p~=ai.player + end) + if #cards <= 1 then return {}, -1000 end + + --- 获取手牌中权重偏小的牌 + local get_cards = ai:getChoiceCardsByKeepValue(cards, 2, function(value) return value <= 45 end) + local throw_cards = { get_cards[1], get_cards[2] } + local benefits = {} + + --- 遍历所有玩家,计算收益 + for _, target in ipairs(players) do + local throw_cards_benefit, recover_benefit = 0, 0 + --- 计算弃置手牌的收益 + throw_cards_benefit = ai:getBenefitOfEvents(function(logic) + logic:throwCard(throw_cards, jieyin.name, ai.player, ai.player) + end) + --- 计算回复血量的收益 + recover_benefit = ai:getBenefitOfEvents(function(logic) + logic:recover { + who = target, + num = 1, + recoverBy = ai.player, + skillName = jieyin.name, + } + if ai.player:isWounded() then + logic:recover { + who = ai.player, + num = 1, + recoverBy = ai.player, + skillName = jieyin.name, + } + end + end) + benefits[#benefits + 1] = { target, throw_cards_benefit + recover_benefit } + end + + table.sort(benefits, function(a, b) return a[2] > b[2] end) + if #benefits == 0 then return {}, -1000 end + + return { targets = { benefits[1][1] }, cards = throw_cards }, benefits[1][2] + end, +}) + return jieyin