diff --git a/lua/fk_ex.lua b/lua/fk_ex.lua index a9086cbd8b694f026138d46ebad68dffba9508ed..40a1e08237fe9c1efe65461541b20d637c9b0842 100644 --- a/lua/fk_ex.lua +++ b/lua/fk_ex.lua @@ -26,7 +26,7 @@ TrickCard, DelayedTrickCard = table.unpack(Trick) local Equip = require "core.card_type.equip" _, Weapon, Armor, DefensiveRide, OffensiveRide, Treasure = table.unpack(Equip) -local function readCommonSpecToSkill(skill, spec) +function fk.readCommonSpecToSkill(skill, spec) skill.mute = spec.mute skill.no_indicate = spec.no_indicate skill.anim_type = spec.anim_type @@ -57,8 +57,8 @@ local function readCommonSpecToSkill(skill, spec) end end -local function readUsableSpecToSkill(skill, spec) - readCommonSpecToSkill(skill, spec) +function fk.readUsableSpecToSkill(skill, spec) + fk.readCommonSpecToSkill(skill, spec) assert(spec.main_skill == nil or spec.main_skill:isInstanceOf(UsableSkill)) if type(spec.derived_piles) == "string" then skill.derived_piles = {spec.derived_piles} @@ -85,8 +85,8 @@ local function readUsableSpecToSkill(skill, spec) skill.times = spec.times or skill.times end -local function readStatusSpecToSkill(skill, spec) - readCommonSpecToSkill(skill, spec) +function fk.readStatusSpecToSkill(skill, spec) + fk.readCommonSpecToSkill(skill, spec) if spec.global then skill.global = spec.global end @@ -126,7 +126,7 @@ function fk.CreateTriggerSkill(spec) local frequency = spec.frequency or Skill.NotFrequent local skill = TriggerSkill:new(spec.name, frequency) - readUsableSpecToSkill(skill, spec) + fk.readUsableSpecToSkill(skill, spec) if type(spec.events) == "number" then table.insert(skill.events, spec.events) @@ -210,7 +210,7 @@ end function fk.CreateActiveSkill(spec) assert(type(spec.name) == "string") local skill = ActiveSkill:new(spec.name, spec.frequency or Skill.NotFrequent) - readUsableSpecToSkill(skill, spec) + fk.readUsableSpecToSkill(skill, spec) if spec.can_use then skill.canUse = function(curSkill, player, card, extra_data) @@ -263,7 +263,7 @@ function fk.CreateViewAsSkill(spec) assert(type(spec.view_as) == "function") local skill = ViewAsSkill:new(spec.name, spec.frequency or Skill.NotFrequent) - readUsableSpecToSkill(skill, spec) + fk.readUsableSpecToSkill(skill, spec) skill.viewAs = spec.view_as if spec.card_filter then @@ -318,7 +318,7 @@ function fk.CreateDistanceSkill(spec) assert(type(spec.correct_func) == "function" or type(spec.fixed_func) == "function") local skill = DistanceSkill:new(spec.name) - readStatusSpecToSkill(skill, spec) + fk.readStatusSpecToSkill(skill, spec) skill.getCorrect = spec.correct_func skill.getFixed = spec.fixed_func @@ -338,7 +338,7 @@ function fk.CreateProhibitSkill(spec) assert(type(spec.name) == "string") local skill = ProhibitSkill:new(spec.name) - readStatusSpecToSkill(skill, spec) + fk.readStatusSpecToSkill(skill, spec) skill.isProhibited = spec.is_prohibited or skill.isProhibited skill.prohibitUse = spec.prohibit_use or skill.prohibitUse skill.prohibitResponse = spec.prohibit_response or skill.prohibitResponse @@ -362,7 +362,7 @@ function fk.CreateAttackRangeSkill(spec) type(spec.within_func) == "function" or type(spec.without_func) == "function") local skill = AttackRangeSkill:new(spec.name) - readStatusSpecToSkill(skill, spec) + fk.readStatusSpecToSkill(skill, spec) if spec.correct_func then skill.getCorrect = spec.correct_func end @@ -391,7 +391,7 @@ function fk.CreateMaxCardsSkill(spec) assert(type(spec.correct_func) == "function" or type(spec.fixed_func) == "function" or type(spec.exclude_from) == "function") local skill = MaxCardsSkill:new(spec.name) - readStatusSpecToSkill(skill, spec) + fk.readStatusSpecToSkill(skill, spec) if spec.correct_func then skill.getCorrect = spec.correct_func end @@ -417,7 +417,7 @@ function fk.CreateTargetModSkill(spec) assert(type(spec.name) == "string") local skill = TargetModSkill:new(spec.name) - readStatusSpecToSkill(skill, spec) + fk.readStatusSpecToSkill(skill, spec) if spec.bypass_times then skill.bypassTimesCheck = spec.bypass_times end @@ -451,7 +451,7 @@ function fk.CreateFilterSkill(spec) assert(type(spec.name) == "string") local skill = FilterSkill:new(spec.name) - readStatusSpecToSkill(skill, spec) + fk.readStatusSpecToSkill(skill, spec) skill.cardFilter = spec.card_filter skill.viewAs = spec.view_as skill.equipSkillFilter = spec.equip_skill_filter @@ -468,7 +468,7 @@ function fk.CreateInvaliditySkill(spec) assert(type(spec.name) == "string") local skill = InvaliditySkill:new(spec.name) - readStatusSpecToSkill(skill, spec) + fk.readStatusSpecToSkill(skill, spec) skill.getInvalidity = spec.invalidity_func return skill @@ -483,7 +483,7 @@ function fk.CreateVisibilitySkill(spec) assert(type(spec.name) == "string") local skill = VisibilitySkill:new(spec.name) - readStatusSpecToSkill(skill, spec) + fk.readStatusSpecToSkill(skill, spec) if spec.card_visible then skill.cardVisible = spec.card_visible end if spec.role_visible then skill.roleVisible = spec.role_visible end diff --git a/standard/ai/init.lua b/standard/ai/init.lua index d574025bab73cdc032a890cbc61af117c440433a..0c6c1f1c2fba94a7d7b98f59d834cc89b51e549b 100644 --- a/standard/ai/init.lua +++ b/standard/ai/init.lua @@ -4,6 +4,23 @@ else require "packages.standard.ai.aux_skills" end +SmartAI:setSkillAI("jianxiong", { + think_skill_invoke = function(self, ai, skill_name, prompt) + ---@type DamageStruct + local dmg = ai.room.logic:getCurrentEvent().data[1] + local player = ai.player + local card = dmg.card + if not card or player.room:getCardArea(card) ~= Card.Processing then return false end + local val = ai:getBenefitOfEvents(function(logic) + logic:obtainCard(player, card, true, fk.ReasonJustMove) + end) + if val > 0 then + return true + end + return false + end, +}) + SmartAI:setSkillAI("ganglie", { think = function(self, ai) local cards = ai:getEnabledCards() @@ -56,6 +73,29 @@ SmartAI:setSkillAI("ganglie", { end, }) +SmartAI:setSkillAI("fankui", { + think_skill_invoke = function(self, ai, skill_name, prompt) + ---@type DamageStruct + local dmg = ai.room.logic:getCurrentEvent().data[1] + local player = ai.player + local from = dmg.from + if not from then return false end + local val = ai:getBenefitOfEvents(function(logic) + local flag = from == player and "e" or "he" + local cards = from:getCardIds(flag) + if #cards < 1 then + logic.benefit = -1 + return + end + logic:obtainCard(player, cards[1], false, fk.ReasonPrey) + end) + if val > 0 then + return true + end + return false + end, +}) + SmartAI:setSkillAI("tuxi", { think = function(self, ai) local player = ai.player