From 35477c0ea19163a7db053232701a685014f1132d Mon Sep 17 00:00:00 2001 From: Nyutanislavsky Date: Wed, 2 Aug 2023 21:50:47 +0800 Subject: [PATCH] Enchance Mouxusheng (#235) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 谋徐盛增加大离间、复活,可以变更副将 2. 修改CardEffecting等时机的承载者 3. 修复changeHero 4. 给moveCardTo堆一个proposer 5. 修复一些标准版武将和装备 --- lua/server/events/usecard.lua | 6 ++- lua/server/room.lua | 40 +++++++-------- packages/standard/aux_skills.lua | 8 +++ packages/standard/init.lua | 40 ++++++++------- packages/standard_cards/init.lua | 25 +++++----- packages/test/init.lua | 85 ++++++++++++++++++++++---------- 6 files changed, 123 insertions(+), 81 deletions(-) diff --git a/lua/server/events/usecard.lua b/lua/server/events/usecard.lua index 31cd5190..beeb6aa1 100644 --- a/lua/server/events/usecard.lua +++ b/lua/server/events/usecard.lua @@ -337,7 +337,11 @@ GameEvent.functions[GameEvent.CardEffect] = function(self) self.logic:breakEvent() end - if cardEffectEvent.from and self.logic:trigger(event, self:getPlayerById(cardEffectEvent.from), cardEffectEvent) then + if event == fk.PreCardEffect then + if cardEffectEvent.from and self.logic:trigger(event, self:getPlayerById(cardEffectEvent.from), cardEffectEvent) then + self.logic:breakEvent() + end + elseif cardEffectEvent.to and self.logic:trigger(event, self:getPlayerById(cardEffectEvent.to), cardEffectEvent) then self.logic:breakEvent() end diff --git a/lua/server/room.lua b/lua/server/room.lua index 0ff2c524..38404264 100644 --- a/lua/server/room.lua +++ b/lua/server/room.lua @@ -570,7 +570,7 @@ function Room:setDeputyGeneral(player, general) end ---@param player ServerPlayer @ 要换将的玩家 ----@param new_general string @ 要变更的武将,若不存在则变身为孙策,孙策也不存在则nil错 +---@param new_general string @ 要变更的武将,若不存在则变身为孙策,孙策不存在变身为士兵 ---@param full boolean|nil @ 是否血量满状态变身 ---@param isDeputy boolean|nil @ 是否变的是副将 ---@param sendLog boolean|nil @ 是否发Log @@ -580,7 +580,7 @@ function Room:changeHero(player, new_general, full, isDeputy, sendLog) orig = Fk.generals[orig] local orig_skills = orig and orig:getSkillNameList() or Util.DummyTable - local new = Fk.generals[new_general] or Fk.generals["sunce"] + local new = Fk.generals[new_general] or Fk.generals["sunce"] or Fk.generals["blank_shibing"] local new_skills = table.map(orig_skills, function(e) return "-" .. e end) @@ -590,24 +590,16 @@ function Room:changeHero(player, new_general, full, isDeputy, sendLog) self:handleAddLoseSkills(player, table.concat(new_skills, "|"), nil, false) if isDeputy then - player.deputyGeneral = new_general - self:broadcastProperty(player, "deputyGeneral") + self:setPlayerProperty(player, "deputyGeneral", new_general) else - player.general = new_general - self:broadcastProperty(player, "general") + self:setPlayerProperty(player, "general", new_general) + self:setPlayerProperty(player, "gender", new.gender) + self:setPlayerProperty(player, "kingdom", new.kingdom) end - player.gender = new.gender - self:broadcastProperty(player, "gender") - - player.kingdom = new.kingdom - self:broadcastProperty(player, "kingdom") - - player.maxHp = player:getGeneralMaxHp() - self:broadcastProperty(player, "maxHp") + self:setPlayerProperty(player, "maxHp", player:getGeneralMaxHp()) if full or player.hp > player.maxHp then - player.hp = player.maxHp - self:broadcastProperty(player, "hp") + self:setPlayerProperty(player, "hp", player.maxHp) end end @@ -1080,7 +1072,7 @@ Room.askForUseViewAsSkill = Room.askForUseActiveSkill function Room:askForDiscard(player, minNum, maxNum, includeEquip, skillName, cancelable, pattern, prompt, skipDiscard, no_indicate) cancelable = (cancelable == nil) and true or cancelable no_indicate = no_indicate or false - pattern = pattern or "" + pattern = pattern or "." local canDiscards = table.filter( player:getCardIds{ Player.Hand, includeEquip and Player.Equip or nil }, function(id) @@ -1200,7 +1192,7 @@ function Room:askForCard(player, minNum, maxNum, includeEquip, skillName, cancel end cancelable = (cancelable == nil) and true or cancelable no_indicate = no_indicate or false - pattern = pattern or "" + pattern = pattern or "." local chosenCards = {} local data = { @@ -1305,7 +1297,7 @@ function Room:askForGeneral(player, generals, n) end --- 询问玩家若为神将、双势力需选择一个势力。 ----@param player ServerPlayer[]|nil @ 询问目标 +---@param players ServerPlayer[]|nil @ 询问目标 function Room:askForChooseKingdom(players) players = players or self.alive_players local specialKingdomPlayers = table.filter(players, function(p) @@ -2023,7 +2015,8 @@ function Room:askForMoveCardInBoard(player, targetOne, targetTwo, skillName, fla fk.ReasonPut, skillName, nil, - true + true, + player.id ) return { card = cardToMove, from = from.id, to = to.id } @@ -2615,16 +2608,18 @@ end ---@param skill_name string|nil @ 技能名 ---@param special_name string|nil @ 私人牌堆名 ---@param visible boolean|nil @ 是否明置 -function Room:moveCardTo(card, to_place, target, reason, skill_name, special_name, visible) +---@param proposer integer +function Room:moveCardTo(card, to_place, target, reason, skill_name, special_name, visible, proposer) reason = reason or fk.ReasonJustMove skill_name = skill_name or "" special_name = special_name or "" + proposer = proposer or nil local ids = Card:getIdList(card) local to if table.contains( {Card.PlayerEquip, Card.PlayerHand, - Card.PlayerJudge, Card.PlayerSpecial}, to_place) then + Card.PlayerJudge, Card.PlayerSpecial}, to_place) then to = target.id end @@ -2637,6 +2632,7 @@ function Room:moveCardTo(card, to_place, target, reason, skill_name, special_nam skillName = skill_name, specialName = special_name, moveVisible = visible, + proposer = proposer, } end diff --git a/packages/standard/aux_skills.lua b/packages/standard/aux_skills.lua index a85d6592..eafa4838 100644 --- a/packages/standard/aux_skills.lua +++ b/packages/standard/aux_skills.lua @@ -7,6 +7,10 @@ local discardSkill = fk.CreateActiveSkill{ return false end + if Fk:currentRoom():getCardArea(to_select) == Player.Special then + return false + end + local checkpoint = true local card = Fk:getCardById(to_select) @@ -46,6 +50,10 @@ local chooseCardsSkill = fk.CreateActiveSkill{ return false end + if Fk:currentRoom():getCardArea(to_select) == Player.Special then + return false + end + local checkpoint = true local card = Fk:getCardById(to_select) diff --git a/packages/standard/init.lua b/packages/standard/init.lua index ad20ea53..4f8c314c 100644 --- a/packages/standard/init.lua +++ b/packages/standard/init.lua @@ -12,13 +12,10 @@ local jianxiong = fk.CreateTriggerSkill{ can_trigger = function(self, event, target, player, data) local room = target.room return target == player and player:hasSkill(self.name) and data.card and - table.find(data.card:isVirtual() and data.card.subcards or {data.card.id}, function(id) return room:getCardArea(id) == Card.Processing end) + table.every(data.card:isVirtual() and data.card.subcards or {data.card.id}, function(id) return room:getCardArea(id) == Card.Processing end) end, on_use = function(self, event, target, player, data) - local room = player.room - local dummy = Fk:cloneCard("jueying") - dummy:addSubcards(table.filter(data.card:isVirtual() and data.card.subcards or {data.card.id}, function(id) return room:getCardArea(id) == Card.Processing end)) - room:obtainCard(player.id, dummy, false, fk.ReasonJustMove) + player.room:obtainCard(player.id, data.card, true, fk.ReasonJustMove) end, } @@ -386,7 +383,7 @@ local qingguo = fk.CreateViewAsSkill{ card_filter = function(self, to_select, selected) if #selected == 1 then return false end return Fk:getCardById(to_select).color == Card.Black - and Fk:currentRoom():getCardArea(to_select) ~= Player.Equip + and Fk:currentRoom():getCardArea(to_select) ~= Player.Hand end, view_as = function(self, cards) if #cards ~= 1 then @@ -406,7 +403,7 @@ local rende = fk.CreateActiveSkill{ name = "rende", anim_type = "support", card_filter = function(self, to_select, selected) - return Fk:currentRoom():getCardArea(to_select) ~= Card.PlayerEquip + return Fk:currentRoom():getCardArea(to_select) == Card.PlayerHand end, target_filter = function(self, to_select, selected) return #selected == 0 and to_select ~= Self.id @@ -418,9 +415,7 @@ local rende = fk.CreateActiveSkill{ local player = room:getPlayerById(effect.from) local cards = effect.cards local marks = player:getMark("_rende_cards-phase") - local dummy = Fk:cloneCard'slash' - dummy:addSubcards(cards) - room:obtainCard(target.id, dummy, false, fk.ReasonGive) + room:moveCardTo(cards, Player.Hand, target, fk.ReasonGive, self.name, nil, false, player.id) room:addPlayerMark(player, "_rende_cards-phase", #cards) if marks < 2 and marks + #cards >= 2 and player:isWounded() then room:recover{ @@ -877,20 +872,27 @@ local liuli = fk.CreateTriggerSkill{ local ret = target == player and player:hasSkill(self.name) and data.card.trueName == "slash" if ret then - self.target_list = {} local room = player.room - for _, p in ipairs(room:getOtherPlayers(player)) do - if p.id ~= data.from and player:inMyAttackRange(p) then - table.insert(self.target_list, p.id) + local from = room:getPlayerById(data.from) + for _, p in ipairs(room.alive_players) do + if p ~= player and p.id ~= data.from and player:inMyAttackRange(p) and not from:isProhibited(p, data.card) then + return true end end - return #self.target_list > 0 end end, on_cost = function(self, event, target, player, data) local room = player.room local prompt = "#liuli-target" - local plist, cid = room:askForChooseCardAndPlayers(player, self.target_list, 1, 1, nil, prompt, self.name, true) + local targets = {} + local from = room:getPlayerById(data.from) + for _, p in ipairs(room.alive_players) do + if p ~= player and p.id ~= data.from and player:inMyAttackRange(p) and not from:isProhibited(p, data.card) then + table.insert(targets, p.id) + end + end + if #targets == 0 then return false end + local plist, cid = room:askForChooseCardAndPlayers(player, targets, 1, 1, nil, prompt, self.name, true) if #plist > 0 then self.cost_data = {plist[1], cid} return true @@ -979,7 +981,7 @@ local jieyin = fk.CreateActiveSkill{ return player:usedSkillTimes(self.name, Player.HistoryPhase) == 0 end, card_filter = function(self, to_select, selected) - return #selected < 2 and Fk:currentRoom():getCardArea(to_select) ~= Player.Equip + return #selected < 2 and Fk:currentRoom():getCardArea(to_select) == Player.Hand end, target_filter = function(self, to_select, selected) local target = Fk:currentRoom():getPlayerById(to_select) @@ -1006,7 +1008,7 @@ local jieyin = fk.CreateActiveSkill{ skillName = self.name }) end - end + end } local sunshangxiang = General:new(extension, "sunshangxiang", "wu", 3, 3, General.Female) sunshangxiang:addSkill(xiaoji) @@ -1019,7 +1021,7 @@ local qingnang = fk.CreateActiveSkill{ return player:usedSkillTimes(self.name, Player.HistoryPhase) == 0 end, card_filter = function(self, to_select, selected, targets) - return #selected == 0 and Fk:currentRoom():getCardArea(to_select) ~= Player.Equip + return #selected == 0 and Fk:currentRoom():getCardArea(to_select) == Player.Hand end, target_filter = function(self, to_select, selected, cards) return #selected == 0 and Fk:currentRoom():getPlayerById(to_select):isWounded() diff --git a/packages/standard_cards/init.lua b/packages/standard_cards/init.lua index 8e2aa7cb..20d25796 100644 --- a/packages/standard_cards/init.lua +++ b/packages/standard_cards/init.lua @@ -936,19 +936,14 @@ extension:addCards({ local bladeSkill = fk.CreateTriggerSkill{ name = "#blade_skill", attached_equip = "blade", - events = {fk.CardUseFinished}, + events = {fk.CardEffectCancelledOut}, can_trigger = function(self, event, target, player, data) - if not player:hasSkill(self.name) then return end - local use = data ---@type CardUseStruct - if use.card.name == "jink" and use.toCard and use.toCard.trueName == "slash" then - local effect = use.responseToEvent - return effect.from == player.id - end + return player:hasSkill(self.name) and data.from == player.id and data.card.trueName == "slash" and not player.room:getPlayerById(data.to).dead end, on_cost = function(self, event, target, player, data) local room = player.room - local use = room:askForUseCard(player, "slash", nil, "#blade_slash:" .. target.id, - true, { must_targets = {target.id}, exclusive_targets = {target.id}, bypass_distances = true, bypass_times = true }) + local use = room:askForUseCard(player, "slash", nil, "#blade_slash:" .. data.to, + true, { must_targets = {data.to}, exclusive_targets = {data.to}, bypass_distances = true, bypass_times = true }) if use then use.extraUse = true self.cost_data = use @@ -1008,7 +1003,7 @@ local axeSkill = fk.CreateTriggerSkill{ attached_equip = "axe", events = {fk.CardEffectCancelledOut}, can_trigger = function(self, event, target, player, data) - return player:hasSkill(self.name) and data.from == player.id and data.card.trueName == "slash" + return player:hasSkill(self.name) and data.from == player.id and data.card.trueName == "slash" and not player.room:getPlayerById(data.to).dead end, on_cost = function(self, event, target, player, data) local room = player.room @@ -1060,10 +1055,12 @@ local halberdSkill = fk.CreateTargetModSkill{ name = "#halberd_skill", attached_equip = "halberd", extra_target_func = function(self, player, skill, card) - if player:hasSkill(self.name) and skill.trueName == "slash_skill" - and #player:getCardIds(Player.Hand) == 1 - and player:getCardIds(Player.Hand)[1] == card.id then - return 2 + if player:hasSkill(self.name) and skill.trueName == "slash_skill" then + local cards = card:isVirtual() and card.subcards or {card.id} + local handcards = player:getCardIds(Player.Hand) + if #cards == #handcards and table.every(cards, function(id) return table.contains(handcards, id) end) then + return 2 + end end end, } diff --git a/packages/test/init.lua b/packages/test/init.lua index 8b53d67a..7361d6e5 100644 --- a/packages/test/init.lua +++ b/packages/test/init.lua @@ -10,15 +10,16 @@ local cheat = fk.CreateActiveSkill{ can_use = function(self, player) return true end, + card_filter = function(self, card) + return false + end, + target_num = 0, on_use = function(self, room, effect) local from = room:getPlayerById(effect.from) - local cardTypeName = room:askForChoice(from, { 'BasicCard', 'TrickCard', 'Equip' }, "cheat") - local cardType = Card.TypeBasic - if cardTypeName == 'TrickCard' then - cardType = Card.TypeTrick - elseif cardTypeName == 'Equip' then - cardType = Card.TypeEquip - end + local cardType = { 'basic', 'trick', 'equip' } + local cardTypeName = room:askForChoice(from, cardType, "cheat") + local card_types = {Card.TypeBasic, Card.TypeTrick, Card.TypeEquip} + cardType = card_types[table.indexOf(cardType, cardTypeName)] local allCardIds = Fk:getAllCardIds() local allCardMapper = {} @@ -176,6 +177,7 @@ local test_trig = fk.CreateTriggerSkill{ local damage_maker = fk.CreateActiveSkill{ name = "damage_maker", anim_type = "offensive", + prompt = "#damage_maker", can_use = function(self, player) return true end, @@ -183,40 +185,65 @@ local damage_maker = fk.CreateActiveSkill{ return false end, card_num = 0, - target_filter = function(self) - return true + target_filter = function(self, to_select, selected) + if self.interaction.data == "revive" then return false end + return #selected < 2 end, - target_num = 1, - interaction = function()return UI.ComboBox { - choices = {"normal_damage", "thunder_damage", "fire_damage", "ice_damage", "lose_hp", "heal_hp", "lose_max_hp", "heal_max_hp"} - }end, + min_target_num = function(self) + return self.interaction.data == "revive" and 0 or 1 + end, + max_target_num = function(self) + return self.interaction.data == "revive" and 0 or 2 + end, + interaction = function() return UI.ComboBox { + choices = {"normal_damage", "thunder_damage", "fire_damage", "ice_damage", "lose_hp", "heal_hp", "lose_max_hp", "heal_max_hp", "revive"} + } end, on_use = function(self, room, effect) local from = room:getPlayerById(effect.from) - local target = room:getPlayerById(effect.tos[1]) + local victim = #effect.tos > 0 and room:getPlayerById(effect.tos[1]) + local target = #effect.tos > 1 and room:getPlayerById(effect.tos[2]) local choice = self.interaction.data - local choices = {} - for i = 1, 99 do - table.insert(choices, tostring(i)) + local number + if choice ~= "revive" then + local choices = {} + for i = 1, 99 do + table.insert(choices, tostring(i)) + end + number = tonumber(room:askForChoice(from, choices, self.name, nil)) end - local number = tonumber(room:askForChoice(from, choices, self.name, nil)) + if target then from = target end if choice == "heal_hp" then room:recover{ - who = target, + who = victim, num = number, recoverBy = from, skillName = self.name } elseif choice == "heal_max_hp" then - room:changeMaxHp(target, number) + room:changeMaxHp(victim, number) elseif choice == "lose_max_hp" then - room:changeMaxHp(target, -number) + room:changeMaxHp(victim, -number) elseif choice == "lose_hp" then - room:loseHp(target, number, self.name) + room:loseHp(victim, number, self.name) + elseif choice == "revive" then + local targets = table.map(table.filter(room.players, function(p) return p.dead end), function(p) return "seat#" .. tostring(p.seat) end) + if #targets > 0 then + targets = room:askForChoice(from, targets, self.name, "#revive-ask") + if targets then + target = tonumber(string.sub(targets, 6)) + for _, p in ipairs(room.players) do + if p.seat == target then + room:revivePlayer(p, true) + break + end + end + end + end else - choices = {"normal_damage", "thunder_damage", "fire_damage", "ice_damage"} + local choices = {"normal_damage", "thunder_damage", "fire_damage", "ice_damage"} room:damage({ from = from, - to = target, + to = victim, damage = number, damageType = table.indexOf(choices, choice), skillName = self.name @@ -237,15 +264,21 @@ local change_hero = fk.CreateActiveSkill{ return #selected < 1 end, target_num = 1, + interaction = function(self) + return UI.ComboBox { + choices = { "mainGeneral", "deputyGeneral"}, + } + end, on_use = function(self, room, effect) local from = room:getPlayerById(effect.from) local target = room:getPlayerById(effect.tos[1]) + local choice = self.interaction.data local generals = table.map(Fk:getGeneralsRandomly(8, Fk:getAllGenerals()), function(p) return p.name end) local general = room:askForGeneral(from, generals, 1) if general == nil then general = table.random(generals) end - room:changeHero(target, general, false, false, true) + room:changeHero(target, general, false, choice == "deputyGeneral", true) end, } local test_zhenggong = fk.CreateTriggerSkill{ @@ -304,6 +337,8 @@ Fk:loadTranslationTable{ ["damage_maker"] = "制伤", [":damage_maker"] = "出牌阶段,你可以进行一次伤害制造器。", + ["#damage_maker"] = "制伤:选择一名小白鼠,可选另一名角色做伤害来源(默认谋徐盛)", + ["#revive-ask"] = "复活一名角色!", ["change_hero"] = "变更", [":change_hero"] = "出牌阶段,你可以变更一名角色武将牌。",