太阳神三国杀lua吧 关注:2,633贴子:73,361
  • 13回复贴,共1

【求教】将两个视为技合并成一个技能会不会有冲突

只看楼主收藏回复

举个栗子,如果将双雄和龙胆合并起来,在同一个技能里既可以将红色牌当决斗使用,也可以将闪当杀使用,这是不是不可行,如果可行的话,view_filter要怎么设计


IP属地:福建1楼2016-08-18 23:03回复
    可以
    on_validate里写选项


    IP属地:广西2楼2016-08-18 23:18
    收起回复
      @棺材还没买 view_filter部分我已经写好了,但是setGuhuoDialog该怎么修改才能不用那么多选项


      IP属地:福建3楼2016-08-19 21:27
      收起回复
        其实如果是我的话,我大概会这样写:
        视为技
        enabled_at_play:克隆一个空杀一个空决斗,如果两个有至少一个availale就返回true
        enabled_at_response:判断pattern是否能match杀或者match决斗(要用matchExpPattern,因为曹仁双将),有一个可以就返回true
        view_filter:如果是出牌(REASON_PLAY),克隆一个杀一个决斗,如果杀可用且选择的是闪返回true,如果决斗可用且选择的是红牌返回true;如果不是,像在enabled_at_response写的那样判断pattern是否符合,然后处理方法同上
        view_as:如果是出牌,再克隆一个杀一个决斗,设两个bool变量分别为:杀可用 and 选择的牌是闪;决斗可用 and 选择的牌是红牌。如果只有一个为真,直接返回那个视为的牌,否则返回一个技能卡(在技能卡里选择);如果不是,像在enabled_at_response写的那样判断pattern是否符合,然后处理方法同上
        技能卡
        filter:如果是出牌,克隆一个杀一个决斗(注意加subcard),分别判断两张牌的targetFilter是否可行,有一个可行的话就返回true;如果不是,像在enabled_at_response写的那样判断pattern是否符合,然后处理方法同上
        feasible:和filter差不多
        on_validate:克隆一个杀一个决斗,分别判断两个是否可以使用且targetsFeasible是否为真,如果只有一个的话返回这张卡就是,如果两个都可以的话用askForChoice选一个然后返回
        on_validate_in_response:类似on_validate,注意判断pattern
        但是既然楼主想用蛊惑框,那么贴一下核心代码
        room:setPlayerProperty(player, "allowed_guhuo_dialog_buttons", sgs.QVariant("slash+duel"))
        在游戏开始和EventAcquireSkill加上这个,这段能把蛊惑框除了杀和决斗以外的全暗掉,技能卡就不用写了,剩下的视为技部分参考奇策蛊惑就行了(注意判断enabled_at_response)。
        但是这样写的话和于吉荀攸之类的双将会有bug


        IP属地:美国5楼2016-08-19 22:41
        收起回复
          qiyaoCard = sgs.CreateSkillCard{
          name = "qiyaoCard",
          will_throw = false,
          filter = function(self, targets, to_select, player)
          local players = sgs.PlayerList()
          for i = 1 , #targets do
          players:append(targets[i])
          end
          if sgs.Sanguosha:getCurrentCardUseReason() == sgs.CardUseStruct_CARD_USE_REASON_RESPONSE_USE then
          local card = nil
          if self:getUserString() and self:getUserString() ~= "" then
          card = sgs.Sanguosha:cloneCard(self:getUserString():split("+")[1])
          return card and card:targetFilter(players, to_select, sgs.Self) and not sgs.Self:isProhibited(to_select, card, players)
          end
          elseif sgs.Sanguosha:getCurrentCardUseReason() == sgs.CardUseStruct_CARD_USE_REASON_RESPONSE then
          return false
          end
          local _card = sgs.Self:getTag("qiyao"):toCard()
          if _card == nil then return false end
          local card = sgs.Sanguosha:cloneCard(_card)
          card:deleteLater()
          return card and card:targetFilter(players, to_select, sgs.Self) and not sgs.Self:isProhibited(to_select, card, players)
          end,
          target_fixed = function(self)
          if sgs.Sanguosha:getCurrentCardUseReason() == sgs.CardUseStruct_CARD_USE_REASON_RESPONSE_USE then
          local card = nil
          if self:getUserString() and self:getUserString() ~= "" then
          card = sgs.Sanguosha:cloneCard(self:getUserString():split("+")[1])
          return card and card:targetFixed()
          end
          elseif sgs.Sanguosha:getCurrentCardUseReason() == sgs.CardUseStruct_CARD_USE_REASON_RESPONSE then
          return true
          end
          local _card = sgs.Self:getTag("qiyao"):toCard()
          if _card == nil then return false end
          local card = sgs.Sanguosha:cloneCard(_card)
          card:deleteLater()
          return card and card:targetFixed()
          end,
          feasible = function(self, targets, player)
          local players = sgs.PlayerList()
          for i = 1 , #targets do
          players:append(targets[i])
          end
          if sgs.Sanguosha:getCurrentCardUseReason() == sgs.CardUseStruct_CARD_USE_REASON_RESPONSE_USE then
          local card = nil
          if self:getUserString() and self:getUserString() ~= "" then
          card = sgs.Sanguosha:cloneCard(self:getUserString():split("+")[1])
          return card and card:targetsFeasible(players, sgs.Self)
          end
          elseif sgs.Sanguosha:getCurrentCardUseReason() == sgs.CardUseStruct_CARD_USE_REASON_RESPONSE then
          return true
          end
          local _card = sgs.Self:getTag("qiyao"):toCard()
          if _card == nil then return false end
          local card = sgs.Sanguosha:cloneCard(_card)
          card:deleteLater()
          return card and card:targetsFeasible(players, sgs.Self)
          end,
          on_validate = function(self, card_use)
          local room = card_use.from:getRoom()
          local to_qiyao = self:getUserString()
          if to_qiyao == "slash" and sgs.Sanguosha:getCurrentCardUseReason() == sgs.CardUseStruct_CARD_USE_REASON_RESPONSE_USE then
          local qiyao_list = {}
          table.insert(qiyao_list, "slash")
          if not (Set(sgs.Sanguosha:getBanPackages()))["maneuvering"] then
          table.insert(qiyao_list, "normal_slash")
          table.insert(qiyao_list, "thunder_slash")
          table.insert(qiyao_list, "fire_slash")
          end
          to_qiyao = room:askForChoice(card_use.from, "qiyao_slash", table.concat(qiyao_list, "+"))
          end
          room:setPlayerFlag(card_use.from, "qiyaoUsed")
          local card = sgs.Sanguosha:getCard(self:getSubcards():first())
          local user_str = ""
          if to_qiyao == "slash" then
          if card:isKindOf("Slash") then
          user_str = card:objectName()
          else
          user_str = "slash"
          end
          elseif to_qiyao == "normal_slash" then
          user_str = "slash"
          else
          user_str = to_qiyao
          end
          local use_card = sgs.Sanguosha:cloneCard(user_str, card:getSuit(), card:getNumber())
          use_card:setSkillName("qiyao")
          use_card:addSubcard(self:getSubcards():first())
          return use_card
          end,
          on_validate_in_response = function(self, user)
          local room = user:getRoom()
          local to_qiyao = ""
          if self:getUserString() == "peach+analeptic" then
          local qiyao_list = {}
          table.insert(qiyao_list, "peach")
          if not (Set(sgs.Sanguosha:getBanPackages()))["maneuvering"] then
          table.insert(qiyao_list, "analeptic")
          end
          to_qiyao = room:askForChoice(user, "qiyao_saveself", table.concat(qiyao_list, "+"))
          elseif self:getUserString() == "slash" then
          local qiyao_list = {}
          table.insert(qiyao_list, "slash")
          if not (Set(sgs.Sanguosha:getBanPackages()))["maneuvering"] then
          table.insert(qiyao_list, "normal_slash")
          table.insert(qiyao_list, "thunder_slash")
          table.insert(qiyao_list, "fire_slash")
          end
          to_qiyao = room:askForChoice(user, "qiyao_slash", table.concat(qiyao_list, "+"))
          else
          to_qiyao = self:getUserString()
          end
          room:setPlayerFlag(user, "qiyaoUsed")
          local card = sgs.Sanguosha:getCard(self:getSubcards():first())
          local user_str = ""
          if to_qiyao == "slash" then
          if card:isKindOf("Slash") then
          user_str = card:objectName()
          else
          user_str = "slash"
          end
          elseif to_qiyao == "normal_slash" then
          user_str = "slash"
          else
          user_str = to_qiyao
          end
          local use_card = sgs.Sanguosha:cloneCard(user_str, card:getSuit(), card:getNumber())
          use_card:setSkillName("qiyao")
          use_card:addSubcard(self:getSubcards():first())
          return use_card
          end
          }
          qiyao = sgs.CreateOneCardViewAsSkill{
          name = "qiyao",
          response_or_use = true,
          view_filter = function(self, to_select)
          if to_select:isEquipped() then return false end
          if sgs.Sanguosha:getCurrentCardUseReason() == sgs.CardUseStruct_CARD_USE_REASON_PLAY then
          local c = sgs.Self:getTag("qiyao"):toCard()
          if c then
          if c:objectName() == "duel" then
          return to_select:isRed()
          else
          return to_select:isKindOf("BasicCard")
          end
          end
          elseif sgs.Sanguosha:getCurrentCardUseReason() == sgs.CardUseStruct_CARD_USE_REASON_RESPONSE or sgs.Sanguosha:getCurrentCardUseReason() == sgs.CardUseStruct_CARD_USE_REASON_RESPONSE_USE then
          if sgs.Sanguosha:getCurrentCardUsePattern() == "nullification" then
          return to_select:isBlack()
          else
          return to_select:isKindOf("BasicCard")
          end
          else
          return false
          end
          end,
          view_as = function(self, cards)
          if sgs.Sanguosha:getCurrentCardUseReason() == sgs.CardUseStruct_CARD_USE_REASON_RESPONSE or sgs.Sanguosha:getCurrentCardUseReason() == sgs.CardUseStruct_CARD_USE_REASON_RESPONSE_USE then
          local card = qiyaoCard:clone()
          card:setUserString(sgs.Sanguosha:getCurrentCardUsePattern())
          card:addSubcard(cards)
          return card
          end
          local c = sgs.Self:getTag("qiyao"):toCard()
          if c then
          local card = qiyaoCard:clone()
          card:setUserString(c:objectName())
          card:addSubcard(cards)
          return card
          else
          return nil
          end
          end,
          enabled_at_play = function(self, player)
          local current = false
          local players = player:getAliveSiblings()
          players:append(player)
          for _, p in sgs.qlist(players) do
          if p:getPhase() ~= sgs.Player_NotActive then
          current = true
          break
          end
          end
          if not current then return false end
          return not player:isKongcheng() and not player:hasFlag("qiyaoUsed")
          end,
          enabled_at_response = function(self, player, pattern)
          local current = false
          local players = player:getAliveSiblings()
          players:append(player)
          for _, p in sgs.qlist(players) do
          if p:getPhase() ~= sgs.Player_NotActive then
          current = true
          break
          end
          end
          if not current then return false end
          if player:isKongcheng() or player:hasFlag("qiyaoUsed") or string.sub(pattern, 1, 1) == "." or string.sub(pattern, 1, 1) == "@" then return false end
          if pattern == "peach" and player:getMark("Global_PreventPeach") > 0 then return false end
          if string.find(pattern, "[%u%d]") then return false end
          return true
          end,
          enabled_at_nullification = function(self, player)
          local current = false
          local players = player:getAliveSiblings()
          players:append(player)
          for _, p in sgs.qlist(players) do
          if p:getPhase() ~= sgs.Player_NotActive then
          current = true
          break
          end
          end
          if not current then return false end
          return not player:isKongcheng() and not player:hasFlag("qiyaoUsed")
          end
          }
          qiyao:setGuhuoDialog("lr")
          qiyaoClear = sgs.CreateTriggerSkill{
          name = "#qiyaoClear",
          events = {sgs.EventPhaseChanging},
          on_trigger = function(self, event, player, data)
          local room = player:getRoom()
          local change = data:toPhaseChange()
          if change.to == sgs.Player_NotActive then
          for _, p in sgs.qlist(room:getAlivePlayers()) do
          if p:hasFlag("qiyaoUsed") then
          room:setPlayerFlag(p, "-qiyaoUsed")
          end
          end
          end
          return false
          end,
          can_trigger = function(self, target)
          return target
          end
          }
          @array88 这是我目前写的lua(每名角色的回合限一次,你可以将一张基本牌当任意一张基本牌使用或打出,或将一张红色手牌当决斗使用,或将一张黑色手牌当黑色无懈可击使用),要怎么避开蛊惑框换成选择框(没有设置蛊惑框的话手牌会全部暗掉),还有如果要让新曹仁的解围也能响应的话该怎么改,请大神帮忙修改一下


          IP属地:福建7楼2016-08-20 10:10
          回复
            http://tieba.baidu.com/p/4186274993
            参考张让


            ------我是新人youko1316


            IP属地:北京8楼2016-08-21 16:04
            回复