骑马与砍杀吧 关注:738,568贴子:14,869,387
  • 5回复贴,共1

骑砍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
            回复