饥荒代码吧 关注:713贴子:5,933
  • 59回复贴,共1

【提问】关于象仙人掌

只看楼主收藏回复

如题


1楼2016-08-24 17:15回复

    5,6行字面理解不是生成一个激活的仙人掌吗?但是整个函数应该是使作物无法收集啊,矛盾了!


    2楼2016-08-24 17:16
    回复
      顶~~


      3楼2016-08-25 10:50
      回复
        上游戏看了下,elephantcactus和elephantcactus_active是两种东西,这段代码的意思大概是在同一个位置生成一个活跃的仙人掌,非活跃的删掉,下边那几句才是设置为不能采集状态(长刺中),最后这个是猜测的,还没验证


        IP属地:海南来自手机贴吧5楼2016-08-26 22:31
        收起回复
          好像有点不严谨,我再看一下


          IP属地:海南来自手机贴吧7楼2016-08-27 12:42
          收起回复
            5楼中还提到一个if语句后“枯萎”和“长刺”的问题。这个还没验证(懒得去弄了),猜测是makeempty有两种情况elephantcactus和elephantcactus_stump,到了夏季他们都会转换成elephantcactus_active,如果转换前(inst)是枯萎的(即elephantcactus,因为只有它有pickable和withered属性),则让转换后的active播放一个长出尖刺的动画(这个动画只有约1秒,感觉意义不是很大啊)


            IP属地:海南来自手机贴吧9楼2016-08-28 12:43
            收起回复
              我又看了一下makeemptyfn在pickable中只有MakeEmpty会调用,而MakeEmpty调用的情况为:
              1.Rejuvenate(施肥复活),此时要求:protected_cycles >= 1
              2.rejuvenateHandler(季节温度复活),此时要求:self.cycles_left > 0
              这两者的区别是,1先运行MakeEmpty(),再运行self.withered = false(不枯萎),2恰恰相反(不赘述了)。
              这就导致在施肥复活后,active.sg:GoToState("grow_spike")这行判断有效会运行,而季节性复活后active.sg:GoToState("grow_spike")判断失败不运行。
              这说明施肥复活和季节复活有区别,具体区别如何,目前还不清楚。


              10楼2016-08-29 20:23
              回复

                我找到一个一个符合我经验的代码段,火山内部仙人掌枯萎以后有时会显示跟正常一样的状态,但是挖掉是一个刺而不是两个小树枝。


                11楼2016-08-29 20:28
                收起回复
                  第一步,先找到影响canbepicked的函数
                  赋值canbepicked的函数有:
                  1.Pickable:SetUp --true
                  2.Pickable:OnLoad --true
                  3.Pickable:Regen --false
                  4.Pickable:MakeBarren --false
                  5.Pickable:Pick --false


                  12楼2016-08-30 22:44
                  收起回复
                    接着上面,先看看Pickable:OnLoad
                    data.picked 和 data.time都不为空的时候 canbepicked=true,相反canbepicked=false
                    1.先看picked:只有在存档(Onsave)的时候会修改picked,具体为:picked = not self.canbepicked and true or nil,也就是说picked要为空,必须是not self.canbepicked and true=false【逻辑是这样吗?我真是不懂lua】,即self.canbepicked=true。
                    2再看data.time,这是上次存档时计算出来的:
                    ----------------------------------------------------------------------------------------------------------------------------------------------
                    if self.targettime then
                    local time = GetTime()
                    if self.targettime > time then
                    data.time = math.floor(self.targettime - time)
                    end
                    end
                    ----------------------------------------------------------------------------------------------------------------------------------------------
                    self.targettime我看了一下就是游戏时间+距离下次可收集的时间(time_to_pickable),这里再减去一个游戏时间,那data.time就刚刚好=距离下次可收集的时间,他不用time_to_pickable的原因是因为那是局部变量。
                    也就是说上次存档时候self.canbepicked=true并且距离下次可收集时间不为空的时候canbepicked=true。这里好像不是简单的吧上次存档时候的状态复制过来,因为象仙人掌好像没有targettime(象仙人掌的文件里并没有定义targettime ),所以只要小退一下,canbepicked=false。我这么理解有问题吗?
                    如果没错,每次读档枯萎的就会变成小树枝(canbepicked=false),如果不没经过读档,枯萎的像仙人掌还能保持一段时间(canbepicked=true),而获得小树枝?


                    14楼2016-08-30 23:18
                    收起回复