通过反编译分析骑砍2俘虏招募机制

通过反编译查看了骑砍2源码,使用的工具为:dnspy

首先:俘虏招募机制的代码在TaleWorlds.CampaignSystem.dll中,类为:RecruitPrisonersCampaignBehavior

其中的 HourlyTickMainParty方法和DailyTickAIMobileParty方法是和招募相关的计算方法 ,计算了部队每天需要增加的服从度

我将对这两个方法做较详细的介绍

HourlyTickMainParty方法

它的功能简单来讲:随机抽取玩家现有俘虏中的随机一种未达可俘虏上限的俘虏(即可招募人数未达到该种俘虏总人数),然后调用方法计算该俘虏的服从值并加到该种俘虏上。

HourlyTickMainParty方法

这段代码的核心在CalculateRecruitableNumber方法和GenerateConformityForTroop方法上,起到的作用分别是:计算当前可招募俘虏数、计算服从度并加到俘虏中

先看第二个方法:GenerateConformityForTroop

服从度生成方法

 可以看到,这里先调用了PrisonerRecruitmentCalculationModel类中的.GetConformityChangePerHour方法,获取到了计算的服从度,然后加入到了玩家部队中的对应俘虏中。结合上面的CalculateRecruitableNumber方法(用于获取俘虏可招募人数),可以发现二者调用的都是PrisonerRecruitmentCalculationModel这个类中的方法

因此,可以推测出,骑砍2服从度计算的核心代码应该就在PrisonerRecruitmentCalculationModel这个类或是其子类中。通过反编译搜索可以发现

PrisonerRecruitmentCalculationModel只是一个接口,DefaultPrisonerRecruitmentCalculationModel才是骑砍2实际执行的方法,它实现了PrisonerRecruitmentCalculationModel

DefaultPrisonerRecruitmentCalculationModel:骑砍2俘虏招募核心代码

先看其中的CalculateRecruitableNumber方法

 如果当前角色是英雄、或部队的总俘虏种类为空、或部队的俘虏总数为空,那么就返回0。

接着,代码调用了PrisonerRecruitmentCalculationModel的GetConformityNeededToRecruitPrisoner方法,这里其实调用的就是DefaultPrisonerRecruitmentCalculationModel内部的方法,作用是获取当前俘虏的服从度阈值,即需要多少服从值才可招募的那个值。

这里可以找到这个阈值的计算公式,注意,这里的等级不是兵种等级,是兵种角色的角色等级,兵种等级是Tier 

获取到这个阈值后,就是获取俘虏当前的XP(就是服从度)以及俘虏人数,通过简单的数学公式,判断当前的可俘虏人数。

CalculateRecruitableNumber方法就此结束。

然后继续查看GenerateConformityForTroop方法,这个是计算服从度的

服从度的计算和Perk(游戏技能)有关

先看其ResultNumber的计算方式

这里的ResultNumber,是基础招降点*(1+额外增益),最大最小值是float的上下限

然后看后续的计算方式

招降值基础为10点

其余计算顺序为(按照if顺序排列,技能都是是统御和流氓习气的技能点,就不讲是哪个,只写技能名字)

  1. 计算统御技能:加上部队领袖的统御值*0.05,这里的add,是将这里面计算的结果加入到了BaseNumber中
  2. 所向披靡,3级以下兵种增加(文本上是增加50%几率),这里的数据是0.01*50,即0.5,后面的可以以此类推
  3. 固若金汤,4级以上兵种增加(文本上是50%几率)
  4. 碧血丹心,非强盗更快30%
  5. 大众领袖,近战兵更快50%
  6. 广受信赖,远程兵更快50%
  7. 承诺,强盗兵更快30%

这里explainNumber调用的方法不同,一个是Add,一个是AddFactor

统御的计算调用Add,增加基础数据值

其他的增加倍率,增加乘数的数值

总结、招降值的计算方程为:

(10+统御*0.05)*(1+额外增益和)

HourlyTickMainParty内的服从度的计算就是这些,接下来查看RecruitPrisonersCampaignBehavior类内的另一个方法DailyTickAIMobileParty

DailyTickAIMobileParty

可以发现,这里的方法和HourlyTickMainParty大同小异,这个方法的一个特点是,只作用于非玩家的部队,所以其实AI部队也会招降俘虏。还有就是,它是24小时触发一次,所以它的.GenerateConformityForTroop方法内的hours传参为24,就是把一次计算的服从度*24加给了俘虏。

以及这里有几个在PrisonerRecruitmentCalculationModel里的方法,用于ai部队招募俘虏,因为不像玩家可以自己操作,ai部队招募有自己的一套机制

ShouldPartyRecruitPrisoners:判断ai部队是否该招募

判断部队士气是否高于30或部队领袖有风度翩翩技能(该技能允许部队不损耗士气招募俘虏),同时部队当前人数未达上限。

IsPrisonerRecruitable:俘虏是否可招募

 先判断是否为英雄或是俘虏的兵种等级未超过限制等级,如果符合判断,返回false表示不可招募

如果是可招募类型,再判断当前的服从度是否超过需要的服从度阈值(通过上面讲解的服从度计算公式获得)

RecruitPrisonersAi:

 通过上面的两个判断,当前的俘虏处与可招募状态并且部队未达上限,通过判断获取现在可以招募的俘虏数,调用RecruitPrisonersAi方法,改变部队人数,并产生对部队的士气影响

至此,骑砍2的俘虏招募机制大致讲完了

 

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值