骑马与砍杀吧 关注:738,378贴子:14,865,535

骑砍2——坐镇指挥机制解析(基于游戏代码研究整理)

只看楼主收藏回复


拉盖亚女皇阵前演讲图镇楼
本篇完全由撒那拉施工队成员@Only灬少校 个人学习理解烤肉社相关代码独立整理完成,本人仅代发表。
理解难度较高,各位按需选择是否详细阅读,事后本帖会在撒那拉施工队后续相关攻略解析中作为参考资料。


IP属地:辽宁1楼2024-05-01 15:02回复
    坐镇模拟(玩家)
    一、战斗状态
    无:代表正在模拟中
    防守方胜利
    进攻方胜利
    防守方撤退


    IP属地:辽宁本楼含有高级字体2楼2024-05-01 15:03
    回复
      二、游戏刻
      若玩家方只剩玩家健康,或者战斗状态为进攻方胜利或防守方胜利,则模拟结束并结束此刻。
      若模拟状态为跳过,则除非进攻方胜利或防守方胜利,否则:
      {模拟战斗刻
      若玩家方剩余健康人数不超过1人,则结束此刻}
      若模拟状态为快速模拟,则模拟3战斗刻,否则模拟1战斗刻。


      IP属地:辽宁本楼含有高级字体3楼2024-05-01 15:04
      回复
        三、模拟战斗刻
        1. 获取双方战斗轮次
        1.1.防守方人数≤10
        防守方轮次 = min{进攻人数*3,防守人数*0.3} 随机舍入
        进攻方轮次 = min{防守人数*3,进攻人数*0.3} 随机舍入
        (随机舍入的含义是,以小数部分的概率入,(1-小数部分)的概率舍)
        1.2.攻城战(城镇防守人数>100或城堡防守人数>30)
        1.2.1.定居点优势(城镇/城堡)
        获取进攻方的所有攻城器械(包括未部署的)
        flag = 是否有攻城槌或改良攻城槌
        flag2 = 是否有改良攻城槌
        num = 攻城塔数量
        num2 = 配重式抛石机+投石车+弩砲的数量
        num3 = 火焰投石车+火焰弩炮的数量
        num4 = 3+城墙等级
        若城墙被攻破,则
        num4 = 0.75+0.25*城墙等级
        num5 = 1+num4
        num6 = 1 + (flag 或 num > 0 ? 0.12 : 0) + (flag2 ? 0.24 : (flag ? 0.16 : 0)) + ((num > 1) ? 0.24 : ((num == 1) ? 0.16 : 0)) + num2 * 0.08 + num3 * 0.12
        baseNumber = num5 / num6
        即按照以下逻辑:
        1.2.1.1. 防守方强度num5
        默认1.75
        +0.25*城墙等级
        1.2.1.2.进攻方强度num6
        默认1
        若有近战攻城器械(攻城槌或改良攻城槌或攻城塔),则 +0.12
        若有攻城槌,则 改良攻城槌+0.24;攻城槌+0.16
        若有攻城塔,则 多于2个攻城塔+0.24;1个攻城塔+0.16
        若有配重式抛石机或投石车或弩砲,则 +0.08*(配重式抛石机+投石车+弩砲的数量)
        若有火焰投石车或火焰弩砲,则 +0.12*(火焰投石车+火焰弩砲的数量)
        1.2.1.3.基础数baseNumber
        =num5/num6
        接下来计算perk带来的影响
        1.2.1.4.进攻方perk
        若进攻方的任一军团指挥官有战术的正步向前技能,则 -20%*baseNumber
        1.2.1.5.防守方perk
        若定居点的总督有战术的正步向前技能,则 +20%*baseNumber
        以上百分比之间加算
        得到最终的定居点优势
        1.2.2.计算战斗轮次
        num = 定居点优势*0.7
        num2 = 1 + 防守人数^0.3
        num3 = max{num2*num, (防守人数+1)/(进攻人数+1)}
        防守方轮次 = 0.5+num3 四舍五入
        进攻方轮次 = 0.5+num2 四舍五入
        1.3.其他情况
        防守方轮次 = min{进攻人数*2,防守人数^0.6} 随机舍入
        进攻方轮次 = min{防守人数*2,进攻人数^0.6} 随机舍入


        IP属地:辽宁本楼含有高级字体4楼2024-05-01 15:08
        收起回复
          2. 模拟战斗
          2.1.判断胜利
          若进攻方健康人数归零,则防守方获胜
          否则若防守方健康人数归零,则进攻方获胜
          2.2.战场优势(军团则取军团指挥官部队的优势)
          2.2.1.防守方优势
          默认1
          +部队指挥官战术技能等级*0.001
          若部队指挥官有侦察的巡逻队技能且进攻方为强盗部队,则 *1.1
          若部队指挥官有战术的战前演练技能且进攻方有部队指挥官且本方部队指挥官战术技能等级高于进攻方部队指挥官战术技能等级,则 +(本方部队指挥官战术技能等级 - 进攻方部队指挥官战术技能等级)*0.01
          以上加成依次进行
          2.2.2.进攻方优势
          默认1
          +部队指挥官战术技能等级*0.001
          若部队指挥官有侦察的巡逻队技能且防守方为强盗部队,则 *1.1
          若部队指挥官有战术的战前演练技能且防守方有部队指挥官且本方部队指挥官战术技能等级高于防守方部队指挥官战术技能等级,则 +(本方部队指挥官战术技能等级 - 防守方部队指挥官战术技能等级)*0.01
          若为攻城战,则 *0.9
          以上加成依次进行
          2.3.单轮进攻
          当双方尚有战斗轮次且胜负未分时,依据双方的剩余战斗轮次数量决定哪方作为本轮进攻方。
          进攻方有 进攻方剩余战斗轮次/双方剩余战斗轮次 的概率作为本轮进攻方;
          防守方有 防守方剩余战斗轮次/双方剩余战斗轮次 的概率作为本轮进攻方。
          2.4. 模拟单轮战斗
          先随机挑选本轮进攻方的一个兵种与本轮防守方的一个兵种,然后模拟进攻兵种对防守兵种的伤害
          2.4.1. 默认兵种战力
          英雄的级别 = 1 + 英雄等级/4
          战力 = (2 + 级别)*(10 + 级别)*0.02*(英雄1.5;骑兵类1.2;步兵类1)
          2.4.2. 战场地形优势
          若为野战/突围/进攻围城营地,则根据地形转化为战斗类型
          水/沼泽/桥/河流/涉水/湖 转化为 渡口
          草原/平原/沙漠/沙丘/森林 转化为 各自对应战斗类型
          若为掠夺/强迫要人征兵/强征给养,则转化为村庄
          攻城 转化为 攻城
          其他情形,若当地正在下雪/暴雪,则 转化为 雪地
          否则转化为默认
          随后参考表格转化为战场地形优势
          此处的进攻方与防守方为大地图进攻方与大地图防守方
          2.4.3. 指挥官加成
          默认0
          对于指挥官拥有的每一个第一加成是队长类型的perk:
          若这一技能的等级 <= 75,则 +0.01
          若这一技能的等级 (75, 150],则 +0.02
          若这一技能的等级 (150, 225],则 +0.03
          若这一技能的等级 >225,则 +0.06
          2.4.4. 战场兵种战力
          = 默认兵种战力*(1 + 战场地形优势 + 指挥官加成)
          模拟伤害 = (0.5 + 0.5*随机0-1小数)*40*(本轮进攻兵种战力/本轮防守兵种战力)^0.7*本轮进攻优势
          本轮进攻优势取决于本轮进攻方是大地图进攻方还是大地图防守方
          若双方部队都是大地图的可移动的部队,则计算技能对模拟伤害的影响
          2.4.5. 技能影响模拟伤害
          若本轮进攻方的部队指挥官有战术的密集阵型技能,且本轮进攻方是步兵(不含射手),本轮防守方是骑兵类(骑兵+骑射手),则 +10%
          若本轮防守方的部队指挥官有战术的松散阵型技能,且本轮防守方是步兵(不含射手),本轮进攻方是远程类(射手+骑射手),则 -10%
          若本轮进攻方的部队指挥官有战术的游击战线技能,且地形为雪地/森林,则 +10%
          若本轮进攻方的部队指挥官有战术的决战技能,且地形为平原/草原/沙漠,则 +5%
          若本轮进攻方的部队指挥官有战术的执法先锋技能,且本轮进攻方非强盗而本轮防守方为强盗,则 +10%
          若本轮进攻方的部队指挥官有战术的亲临指导技能,则 +3%
          若本轮防守方的部队指挥官有战术的后备精锐技能,且本轮防守兵种的级别>=3,则 -20%
          若本轮进攻方的部队指挥官有战术的围城战技能,且本轮进攻方部队的健康士兵数超过本轮防守方部队的健康士兵数,则 +5%
          若本轮进攻方的部队指挥官有战术的全面反攻技能,且本轮进攻方部队的健康士兵数少于本轮防守方部队的健康士兵数,则 +10%
          若本轮进攻方的部队指挥官有战术的笼中之鸟技能,且战斗类型是攻城,且本轮进攻方是大地图防守方,则 +10%
          若本轮进攻方的部队指挥官有侦察的先锋骑兵技能,且本轮进攻方是大地图进攻方,则 +5%
          若本轮进攻方的部队指挥官有侦察的后备军技能,且战斗类型是突击攻城营地/突围,且本轮进攻方是大地图防守方,则 +10%
          若本轮进攻方的部队指挥官有侦察的先锋骑兵技能,且战斗类型是突围,且本轮进攻方是大地图进攻方,则 +10%
          若本轮进攻方的部队指挥官有战术的全面反攻技能,且战斗类型是野战,且本轮进攻方是大地图防守方,则 +10%
          若本轮进攻方是军团指挥官的部队,且军团指挥官有战术的精通战术技能,则 +(战术技能等级-200)*0.5%
          以上加成相互之间加算
          2.4.6. 难度影响模拟伤害(仅限玩家模拟且本轮防守方为玩家部队)
          在上述计算结果的基础上,根据战役选项中的玩家部队承受的伤害
          非常简单 *0.5
          简单 *0.75
          真实 *1
          其它 *1
          2.4.7. 对单位施加伤害
          30%几率为钝伤,70%几率为砍伤
          若本轮防守方是英雄单位,则直接扣除生命值
          若英雄受伤(生命值<=20),则计算存活几率。
          若本轮防守方是士兵,且模拟伤害超过士兵的最大生命值,则计算存活几率。
          存活几率计算:
          若角色在部队中:
          若伤害类型为钝伤,或者战役选项中战死几率为非常简单,或者受伤英雄是玩家且战役选项中战死几率为简单,则存活几率为1
          外科医生的每点医术技能使存活几率 +0.01
          若敌军的外科医生有医术的救死扶伤技能,则敌军外科医生的每点医术技能使存活几率 +0.01,敌军外科医生的医术获得经验 5*受伤角色级别
          角色的每一等级使存活几率 +0.02
          若部队的外科医生有医术的民众医疗技能,且角色非英雄,级别小于3,则存活几率 +30%
          若角色为英雄,则全身的每一点护甲使存活几率 +0.01;每一年龄使存活几率 -0.01;默认存活几率 +50%
          以上加成中,凡是百分比(带百分号%的)加成相互加算;数值加成先于百分比加成。
          然后取存活几率的倒数,并称其为死亡率(代码里是这么算的,尽管不合理)
          若部队的外科医生有医术的嘲弄死神技能,且角色为英雄,则死亡率 -50%
          若战役选项中家族成员战死几率为
          非常简单 -100%
          简单 -50%
          真实 -0%
          其它 -0%
          存活率 = 1 - 死亡率
          若角色英雄是囚犯:
          存活率 = 1 - 年龄*0.0035
          随后结算技能经验和角色经验


          IP属地:辽宁本楼含有高级字体5楼2024-05-01 15:12
          收起回复
            附录:地形对坐镇指挥影响系数参考本表格


            IP属地:辽宁7楼2024-05-01 15:41
            回复
              坐镇这玩意太玄学了我305战术带着97人的可汗跟具装对上卢孔301人的混编军团白天平原坐镇都能输


              IP属地:辽宁来自Android客户端8楼2024-05-01 16:39
              收起回复
                别吓我,刚把她砍了没几个小时


                IP属地:贵州来自Android客户端9楼2024-05-01 18:12
                回复
                  坐等一个省流


                  IP属地:福建来自iPhone客户端10楼2024-05-01 19:30
                  收起回复
                    有没有测试一下,计算值是不是等于真实值


                    IP属地:吉林来自Android客户端11楼2024-05-01 19:34
                    回复
                      后期攻城就一直坐镇,保证把对方城墙和投石车全拆了+自己的所以攻城武器建好,通常只死十几个(还有一部分受伤)


                      IP属地:广东来自Android客户端12楼2024-05-01 22:01
                      回复
                        看不懂思密达,能不能来个概括


                        IP属地:江苏来自Android客户端13楼2024-05-02 00:48
                        收起回复
                          给大家举几个典型战斗的例子。这里基本都没考虑地形和技能因素,除非特殊说明。
                          典型战斗1:野战
                          防守方人数<=10的鏖战状态不考虑
                          玩家200人,敌军300人
                          玩家轮次 = 24,敌军轮次 = 31
                          假设玩家士兵平均级别为6,敌军士兵平均级别为3,不考虑战场优势,兵种战力比大约为2
                          因此玩家每轮进攻大约消耗敌军0.49个单位,敌军每轮进攻大约消耗玩家0.18个单位
                          每一组轮次敌军大约损失12个单位,玩家大约损失5.5个单位
                          战损比2.18
                          持续战斗将导致玩家轮次比例上升,损失继续减少,因此玩家期望上会剩余超过63人
                          若玩家有200战术而敌军有70战术,则
                          玩家每轮进攻大约消耗敌军0.58个单位,敌军每轮进攻大约消耗玩家0.2个单位
                          每一组轮次敌军大约损失14个单位,玩家大约损失6.2个单位
                          战损比2.26
                          而若有战前演练技能,则
                          玩家每轮进攻大约消耗敌军1.21个单位(实则必定消耗1个单位),敌军每轮进攻大约消耗玩家0.2个单位;
                          每一组轮次敌军大约损失24个单位,玩家大约损失6.2个单位
                          战损比3.87
                          典型战斗2:守城
                          守城考虑射手的地形修正
                          看初始进攻状态,假设玩家守城400人,敌军攻城1200人,城墙等级1,敌军有所有非远程攻城器械+4投石车
                          由于守军参杂大量民兵,按照平均3级,50%射手计算;敌军按平均4级,50%射手计算
                          假设城墙未被攻破
                          防守方强度 = 5
                          进攻方强度 = 1.92
                          定居点优势 = 2.6
                          玩家轮次 = 13.7
                          敌军轮次 = 7.5
                          假设双方无战术
                          战力比 = 0.99
                          玩家每轮进攻大约消耗敌军0.3个单位,敌军每轮进攻大约消耗玩家0.27个单位
                          每一组轮次敌军大约损失4.11个单位,玩家大约损失2.03个单位
                          战损比2.02
                          玩家将战败
                          假设玩家200战术,且有战前演练技能,敌军70战术
                          玩家每轮进攻大约消耗敌军0.75个单位,敌军每轮进攻大约消耗玩家0.29个单位
                          每一组轮次敌军大约损失10.28个单位,玩家大约损失2.17个单位
                          战损比4.74 > 3
                          玩家有几率获胜。但要注意到城镇最后150人、城堡最后30人算作野战,届时玩家优势将大打折扣
                          假设城墙被攻破
                          防守方强度 = 2
                          进攻方强度 = 1.92
                          定居点优势 = 1.02
                          玩家轮次 = 7.68
                          敌军轮次 = 7.53
                          假设双方无战术
                          战力比 = 0.99
                          玩家每轮进攻大约消耗敌军0.3个单位,敌军每轮进攻大约消耗玩家0.27个单位
                          每一组轮次敌军大约损失2.3个单位,玩家大约损失2.03个单位
                          战损比1.13
                          玩家将战败
                          假设玩家200战术,且有战前演练技能,敌军70战术
                          玩家每轮进攻大约消耗敌军0.75个单位,敌军每轮进攻大约消耗玩家0.29个单位
                          每一组轮次敌军大约损失5.76个单位,玩家大约损失2.18个单位
                          战损比2.64 < 3
                          玩家仍然战败


                          IP属地:上海14楼2024-05-02 09:42
                          回复
                            这里略微测试一下战术大招和战前演练perk的效果。


                            战斗地形是沙漠。实际上不需要考究其它的,因为控制变量下只有perk变化了。
                            我方设置的300战术,敌方战术55。由于都战败,所以只看杀敌数。

                            可以看到战前演练perk比战术大招强了太多。


                            IP属地:上海16楼2024-05-02 09:59
                            回复
                              有人想要省流,这里我总结一些。
                              1、坐镇攻城战时守城方的攻城器械没有加成。
                              2、攻城方的加成与攻城器械的数量有关,意味着理论上可以每种攻城器械造满4个提高坐镇优势。
                              3、战术大招只对军团指挥官生效。
                              4、一个典型的32级英雄的战力相当于2个可汗卫士。
                              5、防守方最后10人为鏖战,进攻方的进攻轮次锐减,所以防守方最后一个英雄往往能撑较长时间。
                              6、指挥官拥有的第一加成是队长类型的perk对坐镇指挥有加成。
                              7、在没有任何加成的情况下,士兵只有那30%几率受到钝伤时存活,70%几率受到砍伤时直接暴毙。
                              8、坐镇模拟吃不到任何加血技能,包括医术大招。
                              9、32级英雄,全身护甲100,50岁,战场中被击倒后死亡率大概是0.84%.
                              10、1级未被攻破的城墙也比3级被攻破的城墙优势高得多,甚至是2倍。
                              11、高级兵打低级兵伤害溢出,但并不会造成额外伤亡,因此坐镇加成(例如高战术、战术perk)实际上对于中低级兵的加成更大,而在高级兵打低级兵时甚至没有影响。
                              12、战术的战前演练技能是个bug,在描述是每100战术等级差异增加1%伤害,然而代码中写的是每点战术差异+1%伤害,这个perk相当于双倍战术大招且生效下限改成了敌军战术等级(除了加皇105其余领主普遍80以下),非常op。


                              IP属地:上海17楼2024-05-02 10:05
                              收起回复