这三个命令都类似,不同武将执行时的效果不同。
关键代码如下:
def calculate_cmd910_result_by_officer(officer_offset,gold,current_value):
inte = Data.DSBUF[officer_offset + 0x04] # 智力
war = Data.DSBUF[officer_offset + 0x05] # 战力
chm = Data.DSBUF[officer_offset+0x06] # 号召
var_2 = ((chm>>1)+inte)&0xFF # 00023E26
gold = Data.math_num1_multiple_num2_then_divide_by_100(gold,100-(current_value>>1)) # 00023E3C
cx = int(math.sqrt(var_2*gold)) # 00023E50
game_diff = Data.DSBUF[0x33B3]
var_2 = int(math.sqrt(cx // ((game_diff+1)>>1))) # 00023E6E
var_2 = var_2 - min(var_2,game_diff)
return var_2
意思就是,执行效果,与武将的智力、武将的号召,黄金的数量,当前地价/治水,游戏难度这几个变量有关。
对于命令12,提高民忠,则算法不同。
def calculate_cmd12_result_by_officer(province_offset,officer_offset, food):
governor_offset = Data.GetWordFromOffset(Data.DSBUF,province_offset+0x02)
governor_chm = Data.DSBUF[governor_offset+0x06]
chm = Data.DSBUF[officer_offset+0x06]
var_4 = (governor_chm+chm)>>1
var_2 = int(math.sqrt(food))
polution = Data.GetWordFromOffset(Data.DSBUF,province_offset+0x0E)
ax = int(math.sqrt(polution))
game_diff = Data.DSBUF[0x33B3]
ax *=(6+game_diff)
ret = Data.math_divice_to_int(var_4,var_2,ax)
return ret
太守的号召也会参与计算,粮食做开方,人口做开方,也结合游戏难度。最后的那个函数math_device_to_int意思是arg1*arg2除以arg3。而ax作为arg3,我们能看到,它和人口数、游戏难度有关。所以人口越多、游戏难度越大,它作为分母,被除后得到的新忠诚度就越小。
[ 本帖最后由 juqiang 于 2025-11-29 17:24 编辑 ]