孔明传攻击性策略和攻击性道具伤害分析
相关求余随机数算法情况请看这个帖子:
http://www.xycq.net/forum/thread-213636-1-1.html
直接写结论吧:
策略攻击不存在致命一击和连击,也没有天气和除了兵种地形适应性以外的地形的额外加成。
策略只有火计和石计
初级:焦热,大焦热,落石,大落石
中级:火龙,大火龙,山崩,大山崩
高级:猛火,大猛火,山洪,大山洪
策略和道具基本威力系数跟策略范围是一个位置:
原帖由 lewulezo 于 2010-5-28 13:53 发表
策略施放范围:0x4D2B0~0x4d2df
00 表示焦热范围
01 表示火龙范围
02 表示猛火范围
03 表示小补给范围 一、策略伤害
1、判断攻击是物理攻击还是策略攻击;
具体位置:
原帖由 ctermiii 于 2010-7-26 22:44 发表
00423914 |. 8A48 12 MOV CL,BYTE PTR DS:[EAX+12]
00423917 |. 83F9 01 CMP ECX,1 ;; 物理攻击1策略伤害2道具伤害3
.....
004239C1 |. 83F9 02 CMP ECX,2 ;2,策略攻击
004239C4 |. 0F85 26000000 JNZ EKD2Win.004239F0 2、策略是否成功,策略倒是可以称为是否命中,可以计算一个命中率出来;
命中要求:
Random%攻击方智力>=防御方智力/5
注:如果没有命中,伤害为0,则直接跳到第8步执行;
原帖由 ctermiii 于 2010-7-26 22:44 发表
00408827 |. E8 E4080000 CALL <EKD2Win.GetZhiLi> ; 攻击方智力
0040882C |. 33C9 XOR ECX,ECX
0040882E |. 8AC8 MOV CL,AL
00408830 |. 51 PUSH ECX ; /Arg1
00408831 |. E8 F2EA0300 CALL <EKD2Win.Random%Arg1> ; \Random%Arg1
00408836 |. 83C4 04 ADD ESP,4
00408839 |. 8BC8 MOV ECX,EAX
0040883B |. 33C0 XOR EAX,EAX
0040883D |. 8A45 F4 MOV AL,BYTE PTR SS:[EBP-C] ; 防御方智力
00408840 |. BB 05000000 MOV EBX,5
00408845 |. 99 CDQ
00408846 |. F7FB IDIV EBX
00408848 |. 3BC8 CMP ECX,EAX ; 攻击方智力随机数与防御方智力/5
0040884A |. 0F83 0F000000 JNB EKD2Win.0040885F
00408850 |. C745 FC 00000>MOV DWORD PTR SS:[EBP-4],0 ;不满足条件伤害为0,直接跳出本函数计算,显示策略失败。
00408857 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0040885A |. E9 A1000000 JMP EKD2Win.00408900 3、计算策略伤害:
伤害公式为分3个:
初级策略伤害=武将智力x2/5+策略基础伤害/2
中级策略伤害=武将智力x3/7+策略基础伤害/2
高级策略伤害=武将智力x4/5+策略基础伤害/2
——————策略基础伤害————————
火计 落石
初级 50 75
中级 100 125
高级 200 250
代码具体见:
4、buffer、地形、兵种伤害修正
A、有减伤buffer的话伤害减半
原帖由 ctermiii 于 2010-7-26 22:44 发表
004086BB |. 6A 08 PUSH 8 ; /策略伤害减状态
004086BD |. 8B4D F0 MOV ECX,DWORD PTR SS:[EBP-10]
004086C0 |. E8 8B0A0000 CALL <EKD2Win.CheckIfSomeStatus>
004086C5 |. 85C0 TEST EAX,EAX
004086C7 |. 0F84 04000000 JE EKD2Win.004086D1
004086CD |. C16D 10 01 SHR DWORD PTR SS:[EBP+10],1 ;除以2 B、防御方所在地形修正
a、防御方地形适应性DX<10
伤害=伤害x(10-DX)/10+伤害
【因为是整数除法,没有化简如果化简合并的话伤害结果会变化,下同】
b、防御方地形适应性DX>10
伤害=伤害-伤害x(DX-10)/10
C、兵种修正:
a、如果是藤甲兵,并且是火计伤害
伤害=(策略威力基数/3+2)x伤害
火计和石计的策略威力基数从低级到高级都是00,01,02
b、如果是南蛮兵和南蛮骑兵
伤害=伤害x3/2
c、如果是军师、大军师、名军师、幻术师
伤害=伤害x2/3
B和C部分具体代码:
5、防御方智力修正:
伤害=伤害-防御方智力/2
具体代码:
原帖由 ctermiii 于 2010-7-26 22:44 发表
00408894 |. 8A45 F4 MOV AL,BYTE PTR SS:[EBP-C]
00408897 |. C1F8 01 SAR EAX,1
0040889A |. 50 PUSH EAX ; /Arg2
0040889B |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; |
0040889E |. 50 PUSH EAX ; |Arg1
0040889F |. E8 27EA0300 CALL 004472CB ; \伤害-防御方智力/2
004088A4 |. 83C4 08 ADD ESP,8 6、攻击方兵种修正:
军师、大军师、名军师、运粮队、物资队、军乐队的伤害会另外算上武器伤害
如果目前为止,伤害为0,则跳过第7条进入第8条判断
7、下边就跟物理攻击一样了,但没有全力一击和连击就是了;
以下为复制:
等级相关的随机因素造成伤害变动:
A、前边计算出基础伤害Abase;
B、取得防御方等级Flevel,然后取得0~FLevel-1的随机值Frnd1;
C、取得攻击方等级Glevel,然后取得0~Glelev-1的随机值Grnd1;
D、比较Frnd1与Grnd1的大小;
D、1如果Frnd1<Grnd1,或者产生了全力一击;
那么伤害会随机增加(0~Glevel-1)%6之间的随机值Grnd2,结果为Abase=Abase+Grnd2
D、2如果Frnd1>=Grnd1,
那么伤害随机减少(0~Flevel-1)%6的随机值Frnd2,如果伤害为1,减少了2,那只能取0和1-2的最大值,即保证伤害不能为负数,结果为Abase=Max(Abase-Frnd2,0)
8、确认防御方是我军(15个部队)还是敌军;
如果是我军,那个会去确认游戏难度;
难度为初级的话,我军受伤害为Abase=Abasex80%;
难度为高级的话,我军受伤害为Abase=Abasex120%;
注:没有中级难度计算,那明显伤害为Abase=Abasex100%;
8部分的代码:
原帖由 ctermiii 于 2010-7-26 22:44 发表
00423AC9 |. 8B0C88 MOV ECX,DWORD PTR DS:[EAX+ECX*4]
00423ACC |. E8 4F57FEFF CALL <EKD2Win.CheckIfWoJun> ; 防御方是我军还是敌军
00423AD1 |. 83F8 01 CMP EAX,1
00423AD4 |. 0F85 4A000000 JNZ EKD2Win.00423B24
00423ADA |. B9 D0A64600 MOV ECX,EKD2Win.0046A6D0
00423ADF |. E8 CC7FFEFF CALL <EKD2Win.GetDifficultLevel> ; 游戏难度00~02
00423AE4 |. 85C0 TEST EAX,EAX
00423AE6 |. 0F85 11000000 JNZ EKD2Win.00423AFD
00423AEC |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 难度为初级00的时候敌军对我伤害只有80%
00423AEF |. C1E0 03 SHL EAX,3
00423AF2 |. B9 0A000000 MOV ECX,0A
00423AF7 |. 99 CDQ
00423AF8 |. F7F9 IDIV ECX
00423AFA |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
00423AFD |> B9 D0A64600 MOV ECX,EKD2Win.0046A6D0
00423B02 |. E8 A97FFEFF CALL <EKD2Win.GetDifficultLevel>
00423B07 |. 83F8 02 CMP EAX,2
00423B0A |. 0F85 14000000 JNZ EKD2Win.00423B24
00423B10 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 游戏难度为高级的时候对我军伤害为120%
00423B13 |. 8D0440 LEA EAX,DWORD PTR DS:[EAX+EAX*2] ; 没有计算中级难度,明显为100%,不加不减
00423B16 |. C1E0 02 SHL EAX,2
00423B19 |. B9 0A000000 MOV ECX,0A
00423B1E |. 99 CDQ
00423B1F |. F7F9 IDIV ECX
00423B21 |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX 9、取得防御方当前耐久力,如果最终的ABase>=耐久力的话,伤害Abase=耐久力;
如果伤害<耐久力的哈,Abase不变,这个是为了防止打出比当前耐久力还大的数;
二、道具伤害,其实就是策略伤害的翻版,表现为伤害比较固定
1、基本伤害:初级:50+0~15的随机值
中级75+0~25的随机值
高级:150+0~50的随机值
跟兵种、等级、智力完全无关
代码:
原帖由 ctermiii 于 2010-7-26 22:44 发表
0040897C > /6A 10 PUSH 10
0040897E . |E8 A5E90300 CALL <EKD2Win.Random%Arg1>
00408983 . |83C4 04 ADD ESP,4
00408986 . |83C0 32 ADD EAX,32
00408989 . |8945 FC MOV DWORD PTR SS:[EBP-4],EAX
0040898C . |E9 54000000 JMP EKD2Win.004089E5
00408991 > |6A 1A PUSH 1A
00408993 . |E8 90E90300 CALL <EKD2Win.Random%Arg1>
00408998 . |83C4 04 ADD ESP,4
0040899B . |83C0 4B ADD EAX,4B
0040899E . |8945 FC MOV DWORD PTR SS:[EBP-4],EAX
004089A1 . |E9 3F000000 JMP EKD2Win.004089E5
004089A6 > |6A 33 PUSH 33
004089A8 . |E8 7BE90300 CALL <EKD2Win.Random%Arg1>
004089AD . |83C4 04 ADD ESP,4
004089B0 . |05 96000000 ADD EAX,96 2、兵种加成,跟上边策略类伤害的兵种与地形修正一样:
A、防御方所在地形修正
a、防御方地形适应性DX<10
伤害=伤害x(10-DX)/10+伤害
【因为是整数除法,没有化简如果化简合并的话伤害结果会变化,下同】
b、防御方地形适应性DX>10
伤害=伤害-伤害x(DX-10)/10
B、兵种修正:
a、如果是藤甲兵,并且是火计伤害
伤害=(策略威力基数/3+2)x伤害
火计和石计的策略威力基数从低级到高级都是00,01,02
b、如果是南蛮兵和南蛮骑兵
伤害=伤害x3/2
c、如果是军师、大军师、名军师、幻术师
伤害=伤害x2/3
3、道具一定可以造成伤害,等级因素与策略、物理攻击类一致,见上边第7条开始往下,不再重复。
[ 本帖最后由 ctermiii 于 2010-8-1 13:04 编辑 ] |