diff --git a/lua/core/request_type/active_skill.lua b/lua/core/request_type/active_skill.lua index f91b560531a35ab6485543f31a6d069aca3fd1f6..d3eebd4e76d96cdbf518cef2d8e06a62f7cc6d68 100644 --- a/lua/core/request_type/active_skill.lua +++ b/lua/core/request_type/active_skill.lua @@ -62,6 +62,7 @@ function ReqActiveSkill:setup(ignoreInteraction) self:updateUnselectedTargets() self:updateButtons() + self:updatePrompt() end function ReqActiveSkill:finish() @@ -80,6 +81,15 @@ function ReqActiveSkill:setSkillPrompt(skill, cid) end end +function ReqActiveSkill:updatePrompt() + local skill = Fk.skills[self.skill_name] + if skill then + self:setSkillPrompt(skill) + else + self:setPrompt(self.original_prompt or "") + end +end + function ReqActiveSkill:setupInteraction() local skill = Fk.skills[self.skill_name] if skill and skill.interaction then @@ -380,6 +390,7 @@ function ReqActiveSkill:update(elemType, id, action, data) elseif elemType == "Interaction" then self:updateInteraction(data) end + self:updatePrompt() end return ReqActiveSkill diff --git a/lua/core/request_type/play_card.lua b/lua/core/request_type/play_card.lua index 9ca16c660afa9f8ae2e55292ba6cba6d5b3d5db4..812ba0d5eaf2dcc0d1b3092009f895cb9db8ca00 100644 --- a/lua/core/request_type/play_card.lua +++ b/lua/core/request_type/play_card.lua @@ -19,7 +19,6 @@ end function ReqPlayCard:setup() ReqUseCard.setup(self) - self:setPrompt(self.original_prompt) self.scene:update("Button", "End", { enabled = true }) end @@ -115,11 +114,11 @@ function ReqPlayCard:selectSpecialUse(data) if not data or data == "_normal_use" then self.skill_name = nil self.pendings = nil - self:setSkillPrompt(self.selected_card.skill, self.selected_card:getEffectiveId()) + -- self:setSkillPrompt(self.selected_card.skill, self.selected_card:getEffectiveId()) else self.skill_name = data self.pendings = Card:getIdList(self.selected_card) - self:setSkillPrompt(Fk.skills[data], self.pendings) + -- self:setSkillPrompt(Fk.skills[data], self.pendings) end self:initiateTargets() end @@ -158,7 +157,7 @@ function ReqPlayCard:selectCard(cid, data) self.skill_name = nil self.selected_card = Fk:getCardById(cid) scene:unselectOtherCards(cid) - self:setSkillPrompt(self.selected_card.skill, self.selected_card:getEffectiveId()) + -- self:setSkillPrompt(self.selected_card.skill, self.selected_card:getEffectiveId()) local sp_skills = {} if self.selected_card.special_skills then sp_skills = table.simpleClone(self.selected_card.special_skills) diff --git a/lua/core/request_type/response_card.lua b/lua/core/request_type/response_card.lua index c70969bcccec7a9656ce9241f715a0d2e87f169f..779bdfd63edd0839fd8478ee2440b1de8c3bf7c0 100644 --- a/lua/core/request_type/response_card.lua +++ b/lua/core/request_type/response_card.lua @@ -38,6 +38,7 @@ function ReqResponseCard:setup() ReqActiveSkill.setup(self) self.selected_card = nil self:updateSkillButtons() + self:updatePrompt() end -- FIXME: 关于&牌堆的可使用打出瞎jb写了点 来个懂哥优化一下 @@ -133,7 +134,7 @@ function ReqResponseCard:selectSkill(skill, data) ReqActiveSkill.setup(self) - self:setSkillPrompt(Fk.skills[skill]) + -- self:setSkillPrompt(Fk.skills[skill]) else self.skill_name = nil self.prompt = self.original_prompt diff --git a/lua/core/request_type/use_card.lua b/lua/core/request_type/use_card.lua index cad2b3de6476052bbfa003eabdbefc18d7c73f55..6bbee28b02e842484e3264c8a75d3e363492599a 100644 --- a/lua/core/request_type/use_card.lua +++ b/lua/core/request_type/use_card.lua @@ -4,6 +4,18 @@ local ReqResponseCard = require 'core.request_type.response_card' ---@class ReqUseCard: ReqResponseCard local ReqUseCard = ReqResponseCard:subclass("ReqUseCard") +function ReqUseCard:updatePrompt() + if self.skill_name then + return ReqActiveSkill.updatePrompt(self) + end + local card = self.selected_card + if card and card.skill then + self:setSkillPrompt(card.skill, self.selected_card.id) + else + self:setPrompt(self.original_prompt or "") + end +end + function ReqUseCard:skillButtonValidity(name) local player = self.player local skill = Fk.skills[name] diff --git a/lua/core/skill.lua b/lua/core/skill.lua index cc81fe250b16fad00e1e02a501c410270fbaf96f..1b6d7e82ef3cca3681d7d165ae145f74c6430267 100644 --- a/lua/core/skill.lua +++ b/lua/core/skill.lua @@ -156,4 +156,16 @@ function Skill:getTimes() return ret end +-- 获得此技能时,触发此函数 +---@param player ServerPlayer +---@param is_start bool +function Skill:onAcquire(player, is_start) +end + +-- 失去此技能时,触发此函数 +---@param player ServerPlayer +---@param is_death bool +function Skill:onLose(player, is_death) +end + return Skill diff --git a/lua/core/skill_type/usable_skill.lua b/lua/core/skill_type/usable_skill.lua index 58e544ff1fe3620a19fbbbc1c521f454dacef754..0c48510a1d01874eb615d3243012408efb03fd0d 100644 --- a/lua/core/skill_type/usable_skill.lua +++ b/lua/core/skill_type/usable_skill.lua @@ -92,4 +92,25 @@ function UsableSkill:withinTimesLimit(player, scope, card, card_name, to) -- end))) end +-- 失去此技能时,触发此函数 +---@param player ServerPlayer +---@param is_death bool +function UsableSkill:onLose(player, is_death) + local lost_piles = {} + if self.derived_piles then + for _, pile_name in ipairs(self.derived_piles) do + table.insertTableIfNeed(lost_piles, player:getPile(pile_name)) + end + end + + if #lost_piles > 0 then + player.room:moveCards({ + ids = lost_piles, + from = player.id, + toArea = Card.DiscardPile, + moveReason = fk.ReasonPutIntoDiscardPile, + }) + end +end + return UsableSkill diff --git a/lua/fk_ex.lua b/lua/fk_ex.lua index c52c8fde600e3642bff0c527e95dea10820e0490..1995c09ec843ffde71b9275aa276b63e474c68b9 100644 --- a/lua/fk_ex.lua +++ b/lua/fk_ex.lua @@ -45,6 +45,16 @@ local function readCommonSpecToSkill(skill, spec) assert(type(spec.relate_to_place) == "string") skill.relate_to_place = spec.relate_to_place end + + if spec.on_acquire then + assert(type(spec.on_acquire) == "function") + skill.onAcquire = spec.on_acquire + end + + if spec.on_lose then + assert(type(spec.on_lose) == "function") + skill.onLose = spec.on_lose + end end local function readUsableSpecToSkill(skill, spec) diff --git a/lua/server/events/gameflow.lua b/lua/server/events/gameflow.lua index 3c36e6b15a820ad58f3cd6ce2111483ba1f3e524..71f089cc642733cf0608d34ed6400f022b57bb76 100644 --- a/lua/server/events/gameflow.lua +++ b/lua/server/events/gameflow.lua @@ -322,7 +322,7 @@ function Phase:main() } room.logic:trigger(fk.DrawNCards, player, data) if not player._phase_end then - room:drawCards(player, data.n, "game_rule") + room:drawCards(player, data.n, "phase_draw") end room.logic:trigger(fk.AfterDrawNCards, player, data) end, diff --git a/lua/server/events/skill.lua b/lua/server/events/skill.lua index be30874f2dc97998cfe83e15411e5ae28a5804bd..95ce3a8dd155ffdeedb251a80e8e6b85f870ed2f 100644 --- a/lua/server/events/skill.lua +++ b/lua/server/events/skill.lua @@ -110,7 +110,7 @@ function SkillEventWrappers:handleAddLoseSkills(player, skill_names, source_skil if #skill_names == 0 then return end local losts = {} ---@type boolean[] local triggers = {} ---@type Skill[] - local lost_piles = {} ---@type integer[] + -- local lost_piles = {} ---@type integer[] for _, skill in ipairs(skill_names) do if string.sub(skill, 1, 1) == "-" then local actual_skill = string.sub(skill, 2, #skill) @@ -132,11 +132,11 @@ function SkillEventWrappers:handleAddLoseSkills(player, skill_names, source_skil table.insert(losts, true) table.insert(triggers, s) - if s.derived_piles then - for _, pile_name in ipairs(s.derived_piles) do - table.insertTableIfNeed(lost_piles, player:getPile(pile_name)) - end - end + -- if s.derived_piles then + -- for _, pile_name in ipairs(s.derived_piles) do + -- table.insertTableIfNeed(lost_piles, player:getPile(pile_name)) + -- end + -- end end end else @@ -169,19 +169,26 @@ function SkillEventWrappers:handleAddLoseSkills(player, skill_names, source_skil if (not no_trigger) and #triggers > 0 then for i = 1, #triggers do - local event = losts[i] and fk.EventLoseSkill or fk.EventAcquireSkill - self.logic:trigger(event, player, triggers[i]) + if losts[i] then + local skill = triggers[i] + skill:onLose(player) + self.logic:trigger(fk.EventLoseSkill, player, skill) + else + local skill = triggers[i] + self.logic:trigger(fk.EventAcquireSkill, player, skill) + skill:onAcquire(player) + end end end - if #lost_piles > 0 then - self:moveCards({ - ids = lost_piles, - from = player.id, - toArea = Card.DiscardPile, - moveReason = fk.ReasonPutIntoDiscardPile, - }) - end + -- if #lost_piles > 0 then + -- self:moveCards({ + -- ids = lost_piles, + -- from = player.id, + -- toArea = Card.DiscardPile, + -- moveReason = fk.ReasonPutIntoDiscardPile, + -- }) + -- end end return { SkillEffect, SkillEventWrappers } diff --git a/lua/server/gamelogic.lua b/lua/server/gamelogic.lua index 17f9919f4dffbd781e5695d161b2592eb323e22b..dd2c70aa6e62fad9d3d866b3613526263b0cb186 100644 --- a/lua/server/gamelogic.lua +++ b/lua/server/gamelogic.lua @@ -224,7 +224,9 @@ function GameLogic:attachSkillToPlayers() return end - room:handleAddLoseSkills(player, skillName, nil, false) + room:handleAddLoseSkills(player, skillName, nil, false, true) + self:trigger(fk.EventAcquireSkill, player, skill) + skill:onAcquire(player, true) end for _, p in ipairs(room.alive_players) do local skills = Fk.generals[p.general].skills diff --git a/lua/server/serverplayer.lua b/lua/server/serverplayer.lua index 67a1b94c85d5054cddab7d3f2000ad4bc0b77822..adca68c76789ac7a727649cd03337e5b75fdb314 100644 --- a/lua/server/serverplayer.lua +++ b/lua/server/serverplayer.lua @@ -454,6 +454,7 @@ function ServerPlayer:bury() self:throwAllCards() self:throwAllMarks() self:clearPiles() + self:onAllSkillLose() self:reset() end @@ -475,6 +476,12 @@ function ServerPlayer:throwAllCards(flag) self.room:throwCard(cardIds, "", self) end +function ServerPlayer:onAllSkillLose() + for _, skill in ipairs(self:getAllSkills()) do + skill:onLose(self, true) + end +end + function ServerPlayer:throwAllMarks() for name, _ in pairs(self.mark) do self.room:setPlayerMark(self, name, 0) diff --git a/standard/aux_skills.lua b/standard/aux_skills.lua index c57369eb36ae75f7d1e1fe4f9bd56d67caf5b5d8..ebb2d74aca07d98dcc7104ccc83fc2fbb81da6a4 100644 --- a/standard/aux_skills.lua +++ b/standard/aux_skills.lua @@ -27,7 +27,7 @@ local discardSkill = fk.CreateActiveSkill{ return false end end - if Fk.currentResponseReason == "game_rule" then + if Fk.currentResponseReason == "phase_discard" then status_skills = Fk:currentRoom().status_skills[MaxCardsSkill] or Util.DummyTable for _, skill in ipairs(status_skills) do if skill:excludeFrom(Self, card) then