太阳神三国杀吧 关注:38,457贴子:469,584
  • 12回复贴,共1

【求姿势】学习lua中遇到的几个问题

取消只看楼主收藏回复



两个喜欢的歌手镇楼!


IP属地:安徽1楼2014-08-12 14:28回复
    先自我介绍一下:本小白的游戏版本是0224版,编程0基础,如果问了比较白痴的问题请勿反感。(虽然很想卖萌,但是这是严肃的求姿势贴,所以忍住了)
    下面求教几个学习自制lua中的问题,希望有人能帮帮我:
    问题一:关于自制技能御宝的编写
    技能:御宝:你装备八卦时,自动获得技能天妒,失去八卦时,你智商下线,流失一点体力,失去天妒。你装备仁王盾时,你的手牌上限加2,失去仁王盾时,你弃一张手牌并回复一点体力。
    楼主小白不知从何写起所以只好先分成两个部分,用高中学的算法知识写一下思路:
    1、你装备八卦时,自动获得技能天妒,失去八卦时,你智商下线,流失一点体力,失去天妒。
    2、你装备仁王盾时,你的手牌上限加2,失去仁王盾时,你弃一张手牌并回复一点体力。
    再细分1的内容:
    (1)装备八卦时(是否可以写成八卦牌打出的时机:CardResponsed?,另外求八卦、仁王的代码,吧内搜索也找不到
    ,获得技能:天妒。
    (2)失去 八卦时(知道应该是CardsMoveOneTime,但是后面两个控制头有点晕?),是否从装备区失去,如果是,是否失去的牌是八卦,是的话,房间说话:你的智商已下线。流失1点体力,失去技能:天妒
    其他则结束。
    再细分2:
    (1)时机为装备(打出?)仁王时(应该不是装备区有仁王,那样都不知道怎么写了),
    获得手牌上限技能“御宝2”。
    (2)时机为失去装备区的牌,且该牌为仁王时,弃一张手牌并回复一点血量(强制弃手牌怎么写??),其他结束
    再另外写一下技能:御宝2:(抄的绝境)
    yubao2= sgs.CreateMaxCardsSkill{
    name = "yubao2",
    extra_func = function(self, target)
    if target:hasSkill(self:objectName()) then
    return 2
    end
    end
    }
    造一个机器人:就叫机器人吧
    机器人获得技能(御宝2)
    jiqiren:addSkill(yubao2)
    具体该怎么写呢?


    IP属地:安徽3楼2014-08-12 14:37
    收起回复
      问题二:作死自制技能低调在游戏中可以显示,可以获得标记,但是无回复效果
      低调(gjdidiao):每受到一点伤害,你可获得一枚"乔"标记,每有一枚"乔",你的回复效果加一。
      以下是lua:
      --标记获得部分
      gjdidiaoGet = sgs.CreateTriggerSkill{
      name = "gjdidiaoGet",
      frequency = sgs.Skill_NotFrequent,
      events = {sgs.Damaged},
      on_trigger = function(self, event, player, data)
      local room = player:getRoom()
      if event == sgs.Damaged then
      local damage = data:toDamage()
      local count = damage.damage
      player:gainMark("@qiao", count) --获得标记
      end
      if event == sgs.EventLoseSkill then
      if data:toString() == self:objectName() then
      player:loseAllMarks("@qiao")
      end
      end
      return false
      end,
      priority = 2
      }
      --技能本体
      gjdidiao = sgs.CreateTriggerSkill{
      name = "gjdidiao",
      frequency = sgs.Skill_Compulsory,
      events = {sgs.HpRecover},
      on_trigger = function(self, event, player, data)
      local room = player:getRoom()
      local x = player:getMark("@qiao"):length()
      if x>3 then
      x=4
      end
      local recover = data:toRecover()
      recover.recover = recover.recover + x
      data:setValue(recover)
      end
      }
      求解该怎么纠正使技能正常起效。


      IP属地:安徽5楼2014-08-12 14:46
      收起回复
        问题三:技能“低调”原为:每受到一点伤害,你可获得一枚"乔"标记,每有两枚"乔",你的回复效果加一,每有三枚"乔",你造成的所有伤害加二。但是实施过程中有两个小问题我无法解决:
        (1)每有两枚“标记”与每有三枚“标记”的计数方法(和“每有一枚标记”的难度差好多
        (2)这个技能应该是两个小技能的合并,即回复加1和伤害加2,他们可以并列吗,怎么合并成一个?


        IP属地:安徽6楼2014-08-12 14:57
        收起回复
          问题五:隐藏技能的显示和起效问题
          之前的技能“低调”:每受到一点伤害,你可获得一枚"乔"标记,每有一枚"乔",你的回复效果加一。
          模仿屯田把它做成了两个技能 ,即获得标记的技能gjdidiaoGet 和技能本体 gjdidiao
          然后获得技能是这样写的:
          gjqiaozhenyu:addSkill(gjjinghong)
          gjqiaozhenyu:addSkill(gjdidiao)
          gjqiaozhenyu:addSkill(gjdidiaoGet)
          gjqiaozhenyu:addSkill(gjdidiao2)
          gjjiqiren1:addSkill("gjjinghong")
          gjjiqiren1:addSkill("gjdidiao")
          gjjiqiren1:addSkill("#gjdidiaoGet")
          gjjiqiren1:addSkill("gjdidiao2")
          gjjiqiren1就是之前说的机器人。
          但是游戏里发现武将 gjqiaozhenyu 的技能栏里出现了技能gjdidiaoGet(当然它只显示前几个字母啦)
          然后我就不停地乱改啊,改来改去,发现如果不显示该技能,那么武将就不能获得标记。
          所以怎么 能既隐藏这个技能的显示,又能让武将获得标记呢?


          IP属地:安徽10楼2014-08-12 16:49
          收起回复
            问题六:
            古韵:觉醒计:若你拥有的的乔标记不少于4,你须弃掉所有乔,摸三张牌并变身为少恭。
            这个是参考安河君的教程完成的(撒花感谢),验证了可以觉醒,但是我明明设置的是标记不少于4时觉醒(就是说到了4就应该觉醒,是咩?),游戏中却一直到标记数达到5才觉醒。。为什么会酱紫?
            lua如下:
            --古韵
            gjguyun = sgs.CreateTriggerSkill{
            name = "gjguyun",
            frequency = sgs.Skill_Wake,
            events = {sgs.CardFinished},
            on_trigger = function(self, event, player, data)
            if player then
            local room = player:getRoom()
            room:setPlayerMark(player, "guyun", 1) --这个标记用于防止重复觉醒
            player:loseAllMarks("@qiao")--失去标记
            player:drawCards(3)--摸三张牌
            room:changeHero(player, "xiaochi", true, true, false, true)--变身
            player:gainMark("@waked", 1) --获得1枚“觉醒”标记
            end
            end,
            can_trigger = function(self, target)
            if target then
            if target:getMark("guyun") == 0 then
            return target:getMark("@qiao") > 3--标记数不少于4时(求解这里,为什么游戏里不是
            --到了4就觉醒了)
            end
            end
            return false
            end
            }


            IP属地:安徽11楼2014-08-12 18:18
            收起回复
              借助热心肠的@b0020028 的帮助和指点(撒花),成功合并成了“低调”技能:
              低调:每受到一次伤害,你可获得与伤害数值等量的"乔"标记,你回复体力时,每有一枚"乔",你的回复效果加一,你造成伤害时,每有一枚"乔",你造成的伤害加一。
              不过这个技能貌似仍然只获得标记。。不能额外回血和伤害。
              怎么办。
              gjdidiao = sgs.CreateTriggerSkill{
              name = "gjdidiao",
              frequency = sgs.Skill_Compulsory,
              events = {sgs.HpRecover,sgs.DamageCaused},
              on_trigger = function(self, event, player, data)
              local room = player:getRoom()
              if event ==sgs.HpRecover then
              local x = player:getMark("@qiao")
              if x>3 then
              x=4
              end
              local recover = data:toRecover()
              recover.recover = recover.recover + x
              data:setValue(recover)
              elseif event == sgs.DamageCaused then
              local source = damage.from
              if source:hasSkill(self:objectName()) then
              local Y = player:getMark("@qiao")
              local damage = data:toDamage()
              damage.damage = damage.damage + Y
              data:setValue(damage)
              return
              end
              end
              end
              }


              IP属地:安徽15楼2014-08-12 22:32
              收起回复

                不开心。
                弄了很久之后还是无奈地把“低调”重新拆成两个技能了。。


                IP属地:安徽16楼2014-08-13 00:28
                回复
                  问题五已解决:关于隐藏技能
                  原来一直疏忽了一个问题:怎么创建隐藏技能。
                  a=xxxxxx
                  name="#a"
                  比正常技能在命名的时候多了一个#
                  接下来就好办了,A想要获得隐藏技能a,那么我们需要一个不用的B武将
                  A:addSkill(a)
                  B:addSkill("#a")
                  然后A就有拥有隐藏技能a了,游戏里我们是看不到这个技能的,成功!


                  IP属地:安徽20楼2014-08-13 05:06
                  收起回复
                    隐藏技能实例:
                    gjqiaozhenyu=sgs.General(extension, "gjqiaozhenyu", "wu", 3)--A武将
                    gjjiqiren1=sgs.General(extension, "gjjiqiren1", "wu", 3,false,true,true)--完全隐藏的B武将
                    gjdidiaoGet = sgs.CreateTriggerSkill{
                    name = "#gjdidiaoGet", --这里说明它是隐藏技能
                    xxxxxx--具体内容blablabla
                    }
                    gjqiaozhenyu:addSkill(gjdidiaoGet)
                    gjjiqiren1:addSkill("#gjdidiaoGet")
                    游戏中找到A武将就发现:A武将并没有这个技能,但是拥有其效果。


                    IP属地:安徽22楼2014-08-13 14:07
                    收起回复
                      经过@Fsu0413的指点,直接将手牌上限技能做成隐藏技能,御宝技能中将不会再获得/失去yubao2:
                      隐藏技能:你装备有仁王盾时,你的手牌上限加2
                      yubao2= sgs.CreateMaxCardsSkill{
                      name = "#yubao2",
                      extra_func = function(self, target)
                      if target:hasSkill(self:objectName()) then
                      if target:getArmor() then
                      if target:getArmor():objectName() == "RenwangShield" then
                      return 2
                      else
                      return 0
                      end
                      end
                      end
                      end
                      }
                      发现之前的一个小问题:失去仁王盾,你弃一张手牌并回复一点血量。没有考虑到满血和空城的情况,所以加了一段,现在效果是:
                      失去仁王盾时,你若受伤,你弃一张手牌(没有则不须弃牌)并恢复一点体力


                      IP属地:安徽23楼2014-08-13 16:03
                      回复
                        感谢热心的吧友们
                        问题三解决:
                        成功完成了对每有“两枚”标记
                        代码:
                        gjdidiao2 = sgs.CreateTriggerSkill{
                        name = "#gjdidiao2", --隐藏技能
                        frequency = sgs.Skill_Compulsory,
                        events = {sgs.ConfirmDamage},
                        on_trigger = function(self, event, player, data)
                        local damage = data:toDamage()
                        local source = damage.from
                        if player:getMark("@qiao")>0 then
                        local x = player:getMark("@qiao")--令标记数为x
                        local y = math.floor(x / 3)--取标记数的1/3为y,向下取整(math.floor)
                        --如果向上取整,那肯定是天花板啦:math.ceil
                        local hurt = damage.damage
                        damage.damage = damage.damage + y*2--伤害额外加2,所以乘以2
                        data:setValue(damage)
                        end
                        return false
                        end
                        }


                        IP属地:安徽24楼2014-08-13 16:16
                        回复
                          新问题:隐藏技能
                          问题八,御宝的完全实现是借用了隐藏技能的,那么就有两种特殊情况是超出控制的:
                          1、左慈获得御宝:经测试(0224,我只有这版),左慈使用化身御宝后,并没有获得隐藏技能。
                          2、杀死蔡文姬后:经测试(0224),杀死蔡文姬后,失去所有技能,但是隐藏技能仍然没有失去。
                          所以怎么将隐藏技能和御宝关联呢?
                          蔡文姬的情况还可以弥补:如果失去技能御宝,你也同时失去本技能。
                          但是左慈真的不知道怎么办。。
                          求大神@b0020028 @Fsu0413


                          IP属地:安徽26楼2014-08-13 16:53
                          收起回复