太阳神三国杀吧 关注:38,454贴子:469,562

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

只看楼主收藏回复



两个喜欢的歌手镇楼!


IP属地:安徽1楼2014-08-12 14:28回复
    - -5分钟无下文就删帖


    IP属地:浙江2楼2014-08-12 14:37
    收起回复
      先自我介绍一下:本小白的游戏版本是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
              收起回复
                坐等大神


                来自手机贴吧12楼2014-08-12 19:55
                收起回复
                  坐等大神,另外虫妹要删是因为以为是广告什么的,事实上也放了一马,不过可能大神看到没东西就不看这个帖子了。


                  IP属地:湖北13楼2014-08-12 20:16
                  收起回复
                    借助热心肠的@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
                              回复