星露谷物语吧 关注:515,450贴子:3,077,346
  • 18回复贴,共1

关于春季鱼王的代码分析

只看楼主收藏回复

新开档村鱼王钓得无聊就解包了文件看代码,不出意外的很容易就发现了春季鱼王的规律。
基于sv1.2.30版本,先前版本不负责任(1.2应该没差)。


IP属地:浙江1楼2017-06-10 21:01回复
    先上结论:
    1、不出其他bug,应该只有春雨王能无限钓,而且也没有什么第一年或者钓上来当天的谜之限制
    2、春季雨天6点到8点(网上盛传的10点是错的),山顶湖任意位置均可钓起(不需要金星钓点之类的)。
    3、鱼王上钩率与幸运无关,与水深无关,与抛竿力度无关,只与钓鱼等级有关。


    IP属地:浙江2楼2017-06-10 21:02
    回复
      代码我就只贴部分
      首先决定各鱼王钓起的代码其实是在
      StardewValley.Locations.Mountain.getFish()
      StardewValley.Locations.Beach.getFish()
      StardewValley.Locations.Town.getFish()
      StardewValley.Locations.Forest.getFish()
      这几个override里,拿山顶那个举例:

      光从这里看,其实我们应该只能钓起一次春雨王,钓起来一次后应该只能钓起普通鱼列表了。


      IP属地:浙江3楼2017-06-10 21:05
      回复
        然而我们跑去StardewValley.GameLocation.getFish() 这个virtual。
        里面有这么一段:

        它读取游戏目录\conten\Data\Locations.xnb里的数据,解包该文件我们得到一堆数据:

        是不是很乱?然后在getfish()里看到这么一条:

        按照这条,它取了这些数据中我们所在地图对应行中第(4+季节号(春季为0))个分隔符后的字符串。对应春季山顶地图,就是这串:

        黑框里163很眼熟吧?就是我们的春雨王了,这就是为什么春雨王可以随便钓,它和普通鱼是在一个列表里的。另外这个列表里没有其他鱼王的编号,悲剧。


        IP属地:浙江4楼2017-06-10 21:12
        回复
          后面还有一条代码:

          很好,解包\conten\Data\Fish.xnb,得到如下数据(为了好理解我用了zh-CN的文件):

          看到没,163,传说之鱼,开局好帮手,人见人爱的春雨王。从后面的代码来看,这里应该就是鱼王的难度、类型、时间等信息了。
          看到那个600 2000了么?根据后面的代码解析,这就是鱼王的待机时间,很不幸,wiki都是骗人的,其实它是早6点到晚8点待机...


          IP属地:浙江5楼2017-06-10 21:14
          回复
            跳过下面大段各种读取、循环、判断,我们来直接看肉戏,关于决定钓起几率这一段:

            很晕吧,然而对于春雨王:

            第11个数据是0,所以一直到第四步为止,num6的值都是0….然后加上钓鱼等级/50,必然小于0.89(修改到45级以上例外),所以钓鱼等级/50其实就是我们的最后值了。
            其他鱼的掉率还和水深相关,春雨王被乘以0给pass了,所以不管你在湖的哪里都是能钓起春雨王的,只是影响品质而已。
            另外getfish()从头到尾都没有出现幸运、抛竿相关的数值,可知就鱼出现的几率来说,这两项数据是无效的。


            IP属地:浙江6楼2017-06-10 21:16
            回复
              再说一次结论,钓春雨王不看年份,不需要看运气,不考虑品质的话也不需要考虑钓点和抛竿,钓鱼等级越高越好(修改的话45级以上就没掉率的区别了),只需要春季雨天山顶湖泊。


              IP属地:浙江7楼2017-06-10 21:16
              回复
                受益匪浅,谢。
                我见过一个mod,让所有顶级鱼都能反复出现,应该就是改动了这里的代码。


                IP属地:山东8楼2017-06-10 21:25
                回复
                  特别说明一下它出鱼的方法,代码太长我就不贴了。
                  首先我们不是获得过一串来自Locations的数据么?大概长这样:
                  136 142 153 702 700 163 (-1只是装饰而已,上面的大人物是不会明白的(大雾)
                  这里面每一个代号都代表一种鱼。然后系统会把这组数据随机打乱,举个例子变成这样:
                  142 163 702 136 700 153
                  接着系统就会从头开始查这组数据。
                  读到一种鱼,就查是否处于这种鱼的待机时间、是否处于适合天气,然后按照上面的掉率公式查是否通过。
                  一旦轮到一个全ok,这种鱼就是你这次钓起来的鱼了。
                  按照这个机制,是无论如何都不可能100%钓鱼王的。除非你把列表中的其他鱼都删掉,然后把掉率公式中那条0.89...的上限改掉。


                  IP属地:浙江9楼2017-06-10 22:31
                  收起回复
                    可以的


                    IP属地:北京来自Android客户端10楼2017-06-10 22:40
                    回复
                      6666


                      来自Android客户端11楼2017-06-11 02:35
                      回复
                        鲤鱼概率这么算下来是65%,为什么把熔岩鳗鱼的值改成和鲤鱼一样,上钩率还是那么低?


                        IP属地:山东来自Android客户端12楼2020-01-07 16:43
                        收起回复