欧陆风云4吧 关注:342,753贴子:10,585,945

反编译eu源码之AI围城不存在骰子作弊

只看楼主收藏回复

这个问题讨论了蛮久但始终没证据来表明极难AI是否在围城上老练地作弊了还是单纯的玩家幸存者偏差或者是某些主播确实运气太差了,所以也同样对eu源码检查了一番。
一楼放结论,AI并没有作弊,并且与难度无关,各种代码细节之后跟上。


IP属地:法国1楼2023-10-01 12:49回复
    首先简单来说围城的进行机制:
    游戏中每天会调用CSiegeCombat(围城战斗)Class中的DailyUpdate(每日更新)函数:

    如图,当围城天数大于一轮围城时间时,进行一次骰子判定,此时调用CSiegeCombat Class下的TickSiegePhace(一轮围城已满)函数。同时一轮围城所需时间由该class下的GetDaysPerSigePhase函数调用。
    如果调用TickSiegePhace后下城,则之后不再进行图中内容的判定和运行。


    IP属地:法国2楼2023-10-01 12:56
    回复
      dd


      IP属地:福建来自Android客户端3楼2023-10-01 12:58
      回复
        尊嘟假嘟


        IP属地:江苏来自Android客户端4楼2023-10-01 12:59
        回复
          其实就是自己7%下城转眼就忘了,哪个关键的堡让ai7%了过了几天还念念不忘


          IP属地:天津来自Android客户端5楼2023-10-01 13:01
          收起回复
            TickSiegePhace函数的总览,下面详细说。


            IP属地:法国6楼2023-10-01 13:02
            回复
              首先是最开始几处注释,这里调用了目前围城状态下,除了骰子点数以外的所有点数,也就是围城界面里中间那行(状态,封锁,将领,炮兵etc)的点数。


              IP属地:法国7楼2023-10-01 13:05
              回复
                其次最关键的就是这里的CRandom::GetIntegerForMacro函数,这是一个简单的随机数生成函数,之前自己发的另一个关于君主平均寿命修正对存活有什么影响的贴中也用的这个随机数函数(实际上正如我途中注释所言,eu里的大部分随机数都是这个函数生成的)。
                之后有一个关于param_1的判断,这个判断是用来区分围城满一轮后的骰子判定(此时为true)还是围城发生战斗后的骰子判定(此时为false)。
                换言之,用散兵去撞围城的部队来故意触发roll围城骰子并不可能让围城部队中毒。骰子结果为1(即中毒)时会被修改为2。


                IP属地:法国8楼2023-10-01 13:11
                回复
                  这块还是比较清楚的,能下城的时候即使投出1也下城,并且不会中毒,很基本的考虑。
                  下半的要塞过时修正会在之后计算是否破墙用到。


                  IP属地:法国9楼2023-10-01 13:17
                  回复
                    攻城方中毒判断,此时读取攻城军队列表,每支部队都损失其5%的人力。


                    IP属地:法国10楼2023-10-01 13:19
                    回复
                      骰子不为1的情况,这时候上面的要塞过时修正就有用了。值得注意的是wiki上对破墙概率表述是和源码不一致的,因为自己懒得把eu恢复到N个版本之前再看源码,所以不知道是否是p社对破墙条件做了修改还是wiki上确实搞错了。
                      下半部分的判断条件如果满足就进入僵持、补给不足、粮食短缺、饮水短缺、守军逃亡这几个状况的判定。否则就进入城墙破裂的判定。


                      IP属地:法国11楼2023-10-01 13:22
                      回复
                        各种情况也没啥好说的,就是计算此时增加的围城进度与损失的守军人数,就不细说了。


                        IP属地:法国12楼2023-10-01 13:23
                        回复
                          好,有结论了,走了
                          看见VsCode就犯恶心


                          IP属地:北京来自iPhone客户端13楼2023-10-01 13:26
                          回复
                            然后是其它几个提到的函数CalcSiege、CalcSiegeImpact、GetDaysPerSiegePhase




                            IP属地:法国14楼2023-10-01 13:28
                            回复
                              以及AffectSiege函数,这个函数在战斗结束后并且军队在围城时调用,如果要进一步说明白就要附上那史山长度的战斗判定函数,略去了。
                              注意这里TickSiegePhase的第二个参数是false,也就是之前说的永远不会中毒的情况。


                              IP属地:法国15楼2023-10-01 13:31
                              回复