标题: 孔明传攻击性策略和攻击性道具伤害分析 [打印本页]
作者:
ctermiii 时间: 2010-7-28 12:08 标题: 孔明传攻击性策略和攻击性道具伤害分析
相关求余随机数算法情况请看这个帖子:
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 编辑 ]
作者:
ctermiii 时间: 2010-7-28 12:21
00408544 $ 55 PUSH EBP
00408545 . 8BEC MOV EBP,ESP
00408547 . 83EC 14 SUB ESP,14
0040854A . 53 PUSH EBX
0040854B . 56 PUSH ESI
0040854C . 57 PUSH EDI
0040854D . C745 FC 00000>MOV DWORD PTR SS:[EBP-4],0
00408554 . 33C0 XOR EAX,EAX
00408556 . 8A45 0C MOV AL,BYTE PTR SS:[EBP+C]
00408559 . 85C0 TEST EAX,EAX
0040855B . 0F84 0C000000 JE EKD2Win.0040856D
00408561 . C745 F8 4B000>MOV DWORD PTR SS:[EBP-8],4B ; 落石类
00408568 . E9 07000000 JMP EKD2Win.00408574
0040856D > C745 F8 32000>MOV DWORD PTR SS:[EBP-8],32 ; 火攻类
00408574 > 33C0 XOR EAX,EAX
00408576 . 8A45 0C MOV AL,BYTE PTR SS:[EBP+C]
00408579 . 85C0 TEST EAX,EAX
0040857B . 0F84 0C000000 JE EKD2Win.0040858D
00408581 . C745 F4 7D000>MOV DWORD PTR SS:[EBP-C],7D
00408588 . E9 07000000 JMP EKD2Win.00408594
0040858D > C745 F4 64000>MOV DWORD PTR SS:[EBP-C],64
00408594 > 33C0 XOR EAX,EAX
00408596 . 8A45 0C MOV AL,BYTE PTR SS:[EBP+C]
00408599 . 85C0 TEST EAX,EAX
0040859B . 0F84 0C000000 JE EKD2Win.004085AD
004085A1 . C745 F0 FA000>MOV DWORD PTR SS:[EBP-10],0FA
004085A8 . E9 07000000 JMP EKD2Win.004085B4
004085AD > C745 F0 C8000>MOV DWORD PTR SS:[EBP-10],0C8
004085B4 > 33C0 XOR EAX,EAX
004085B6 . 8A45 10 MOV AL,BYTE PTR SS:[EBP+10] ; 策略伤害基数
004085B9 . 8945 EC MOV DWORD PTR SS:[EBP-14],EAX
004085BC . E9 64000000 JMP EKD2Win.00408625
004085C1 > 33C0 XOR EAX,EAX
004085C3 . 8A45 08 MOV AL,BYTE PTR SS:[EBP+8] ; 智力x2/5+ABase/2
004085C6 . 03C0 ADD EAX,EAX
004085C8 . B9 05000000 MOV ECX,5
004085CD . 99 CDQ
004085CE . F7F9 IDIV ECX
004085D0 . 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
004085D3 . C1E9 01 SHR ECX,1
004085D6 . 03C1 ADD EAX,ECX
004085D8 . 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
004085DB . E9 68000000 JMP EKD2Win.00408648
004085E0 > 33C0 XOR EAX,EAX
004085E2 . 8A45 08 MOV AL,BYTE PTR SS:[EBP+8] ; 智力x3/7+Abase/2
004085E5 . 8D0440 LEA EAX,DWORD PTR DS:[EAX+EAX*2]
004085E8 . B9 07000000 MOV ECX,7
004085ED . 99 CDQ
004085EE . F7F9 IDIV ECX
004085F0 . 8B4D F4 MOV ECX,DWORD PTR SS:[EBP-C]
004085F3 . C1E9 01 SHR ECX,1
004085F6 . 03C1 ADD EAX,ECX
004085F8 . 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
004085FB . E9 48000000 JMP EKD2Win.00408648
00408600 > 33C0 XOR EAX,EAX
00408602 . 8A45 08 MOV AL,BYTE PTR SS:[EBP+8] ; 攻击者智力x4/5+ABase/2
00408605 . C1E0 02 SHL EAX,2
00408608 . B9 05000000 MOV ECX,5
0040860D . 99 CDQ
0040860E . F7F9 IDIV ECX
00408610 . 8B4D F0 MOV ECX,DWORD PTR SS:[EBP-10]
00408613 . C1E9 01 SHR ECX,1
00408616 . 03C1 ADD EAX,ECX
00408618 . 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
0040861B . E9 28000000 JMP EKD2Win.00408648
00408620 . E9 23000000 JMP EKD2Win.00408648
00408625 > 837D EC 00 CMP DWORD PTR SS:[EBP-14],0 ;初级
00408629 .^ 0F84 92FFFFFF JE EKD2Win.004085C1
0040862F . 837D EC 01 CMP DWORD PTR SS:[EBP-14],1 ;中级
00408633 .^ 0F84 A7FFFFFF JE EKD2Win.004085E0
00408639 . 837D EC 02 CMP DWORD PTR SS:[EBP-14],2 ;高级
0040863D .^ 0F84 BDFFFFFF JE EKD2Win.00408600
00408643 . E9 00000000 JMP EKD2Win.00408648
00408648 > 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 策略伤害
0040864B . E9 00000000 JMP EKD2Win.00408650
00408650 > 5F POP EDI
00408651 . 5E POP ESI
00408652 . 5B POP EBX
00408653 . C9 LEAVE
00408654 . C3 RETN
[ 本帖最后由 ctermiii 于 2010-7-28 12:23 编辑 ]
作者:
阿尔法孝直 时间: 2010-7-28 12:23
在英杰传里面,树林里用火计或雨天用水计有25%的伤害加成。不知孔明传里面有没有类似的加成。
作者:
ctermiii 时间: 2010-7-28 12:26
孔明传有水计吗?我没发现啊,我改了孔明出来,没发现水计
作者:
阿尔法孝直 时间: 2010-7-28 12:46 标题: 回复 #4 ctermiii 的帖子
我说的是类似的加成,不是类似的计策类型。
作者:
ctermiii 时间: 2010-7-28 12:50
004086D3 |. 8A45 FC MOV AL,BYTE PTR SS:[EBP-4]
004086D6 |. 83F8 0A CMP EAX,0A
004086D9 |. 0F8D 21000000 JGE EKD2Win.00408700
004086DF |. B8 0A000000 MOV EAX,0A
004086E4 |. 33C9 XOR ECX,ECX
004086E6 |. 8A4D FC MOV CL,BYTE PTR SS:[EBP-4] ; 兵种地形修正
004086E9 |. 2BC1 SUB EAX,ECX
004086EB |. 0FAF45 10 IMUL EAX,DWORD PTR SS:[EBP+10]
004086EF |. B9 0A000000 MOV ECX,0A
004086F4 |. 2BD2 SUB EDX,EDX
004086F6 |. F7F1 DIV ECX
004086F8 |. 0145 10 ADD DWORD PTR SS:[EBP+10],EAX
004086FB |. E9 2C000000 JMP EKD2Win.0040872C
00408700 |> 33C0 XOR EAX,EAX
00408702 |. 8A45 FC MOV AL,BYTE PTR SS:[EBP-4]
00408705 |. 83F8 0A CMP EAX,0A
00408708 |. 0F8E 1E000000 JLE EKD2Win.0040872C
0040870E |. 33C9 XOR ECX,ECX
00408710 |. 33C0 XOR EAX,EAX
00408712 |. 8A45 FC MOV AL,BYTE PTR SS:[EBP-4]
00408715 |. 83E8 0A SUB EAX,0A
00408718 |. 0FAF45 10 IMUL EAX,DWORD PTR SS:[EBP+10]
0040871C |. BB 0A000000 MOV EBX,0A
00408721 |. 2BD2 SUB EDX,EDX
00408723 |. F7F3 DIV EBX
00408725 |. 2BC8 SUB ECX,EAX
00408727 |. F7D9 NEG ECX
00408729 |. 294D 10 SUB DWORD PTR SS:[EBP+10],ECX
0040872C |> 33C0 XOR EAX,EAX
0040872E |. 8A45 F4 MOV AL,BYTE PTR SS:[EBP-C] ; 兵种
00408731 |. 83F8 22 CMP EAX,22 ; 藤甲兵
00408734 |. 0F85 32000000 JNZ EKD2Win.0040876C
0040873A |. 33C0 XOR EAX,EAX
0040873C |. 8A45 0C MOV AL,BYTE PTR SS:[EBP+C] ; 威力基数
0040873F |. 83F8 06 CMP EAX,6
00408742 |. 0F8D 24000000 JGE EKD2Win.0040876C
00408748 |. 33C0 XOR EAX,EAX ; 藤甲兵伤害至少2倍
0040874A |. 8A45 0C MOV AL,BYTE PTR SS:[EBP+C]
0040874D |. B9 03000000 MOV ECX,3
00408752 |. 99 CDQ
00408753 |. F7F9 IDIV ECX
00408755 |. 8845 EC MOV BYTE PTR SS:[EBP-14],AL
00408758 |. 33C0 XOR EAX,EAX
0040875A |. 8A45 EC MOV AL,BYTE PTR SS:[EBP-14]
0040875D |. 83C0 02 ADD EAX,2
00408760 |. 0FAF45 10 IMUL EAX,DWORD PTR SS:[EBP+10]
00408764 |. 8945 10 MOV DWORD PTR SS:[EBP+10],EAX
00408767 |. E9 68000000 JMP EKD2Win.004087D4
0040876C |> 33C0 XOR EAX,EAX
0040876E |. 8A45 F4 MOV AL,BYTE PTR SS:[EBP-C]
00408771 |. 83F8 1E CMP EAX,1E
00408774 |. 0F8C 1F000000 JL EKD2Win.00408799
0040877A |. 33C0 XOR EAX,EAX
0040877C |. 8A45 F4 MOV AL,BYTE PTR SS:[EBP-C]
0040877F |. 83F8 1F CMP EAX,1F
00408782 |. 0F8F 11000000 JG EKD2Win.00408799
00408788 |. 8B45 10 MOV EAX,DWORD PTR SS:[EBP+10] ; 南蛮兵和南蛮骑兵伤害为150%
0040878B |. 8D0440 LEA EAX,DWORD PTR DS:[EAX+EAX*2]
0040878E |. C1E8 01 SHR EAX,1
00408791 |. 8945 10 MOV DWORD PTR SS:[EBP+10],EAX
00408794 |. E9 3B000000 JMP EKD2Win.004087D4
00408799 |> 33C0 XOR EAX,EAX
0040879B |. 8A45 F4 MOV AL,BYTE PTR SS:[EBP-C]
0040879E |. 83F8 12 CMP EAX,12 ; 军师
004087A1 |. 0F8C 0E000000 JL EKD2Win.004087B5
004087A7 |. 33C0 XOR EAX,EAX
004087A9 |. 8A45 F4 MOV AL,BYTE PTR SS:[EBP-C]
004087AC |. 83F8 14 CMP EAX,14
004087AF |. 0F8E 0E000000 JLE EKD2Win.004087C3
004087B5 |> 33C0 XOR EAX,EAX
004087B7 |. 8A45 F4 MOV AL,BYTE PTR SS:[EBP-C]
004087BA |. 83F8 26 CMP EAX,26 ; 幻术师
004087BD |. 0F85 11000000 JNZ EKD2Win.004087D4
004087C3 |> 8B45 10 MOV EAX,DWORD PTR SS:[EBP+10]
004087C6 |. 03C0 ADD EAX,EAX
004087C8 |. B9 03000000 MOV ECX,3 ; 军师、幻术师伤害2/3
004087CD |. 2BD2 SUB EDX,EDX
004087CF |. F7F1 DIV ECX
004087D1 |. 8945 10 MOV DWORD PTR SS:[EBP+10],EAX
[ 本帖最后由 ctermiii 于 2010-7-30 14:12 编辑 ]
作者:
ctermiii 时间: 2010-7-28 13:12
我先闪,晚上回来
作者:
阿尔法孝直 时间: 2010-7-30 03:27
原帖由 ctermiii 于 2010-7-28 12:08 发表
B、兵种修正:
a、如果是藤甲兵,并且是火计伤害
伤害=(策略威力基数/3+2)x伤害
火计和石计的策略威力基数从低级到高级都是00,01,02
就这句没看懂,既然是00~02,那么策略威力基数/3不都是零吗?
伤害=(策略威力基数/3+2)x伤害
就是
伤害=2x伤害 ?
作者:
dimeterio 时间: 2010-7-30 07:57 标题: 回复 #8 阿尔法孝直 的帖子
当威力基数=01时,伤害=2.33333*伤害
当威力基数=02时,伤害=2.66666*伤害
我的理解。
作者:
阿尔法孝直 时间: 2010-7-30 10:48
原帖由 dimeterio 于 2010-7-30 07:57 发表
当威力基数=01时,伤害=2.33333*伤害
当威力基数=02时,伤害=2.66666*伤害
我的理解。
不对。
int __cdecl sub_408655(int a1, char a2, int a3)
{
int result; // eax@2
int v4; // eax@1
unsigned __int8 v5; // al@1
unsigned __int8 v6; // [sp+18h] [bp-8h]@1
int v7; // [sp+10h] [bp-10h]@3
unsigned __int8 v8; // [sp+14h] [bp-Ch]@3
unsigned __int8 v9; // [sp+1Ch] [bp-4h]@3
v4 = sub_41EF0C(a1);
v5 = sub_429061(v4);
v6 = v5;
if ( v5 == 255 )
{
result = a3;
}
else
{
v7 = (int)((char *)&dword_46C098 + 23 * v6);
v8 = sub_4092A0();
v9 = sub_42A321();
if ( sub_409150(v7, 8) )
a3 = (unsigned int)a3 >> 1;
if ( (signed int)v9 >= 10 )
{
if ( (signed int)v9 > 10 )
a3 -= a3 * ((unsigned int)v9 - 10) / 0xA;
}
else
{
a3 += a3 * (10 - (unsigned int)v9) / 0xA;
}
if ( v8 != 34 || (signed int)(unsigned __int8)a2 >= 6 )
{
if ( (signed int)v8 < 30 || (signed int)v8 > 31 )
{
if ( (signed int)v8 >= 18 && (signed int)v8 <= 20 || v8 == 38 )
a3 = 2 * a3 / 3u;
}
else
{
a3 = (unsigned int)(3 * a3) >> 1;
}
}
else
{
a3 *= (unsigned __int8)a2 / 3 + 2;
}
result = a3;
}
return result;
}
这里是整数除法,不是小数除法。
作者:
godtype 时间: 2010-7-30 10:58
就是指这段代码:
0040873A |. 33C0 XOR EAX,EAX
0040873C |. 8A45 0C MOV AL,BYTE PTR SS:[EBP+C] ; 策略代号
0040873F |. 83F8 06 CMP EAX,6
00408742 |. 0F8D 24000000 JGE EKD2Win.0040876C
00408748 |. 33C0 XOR EAX,EAX ; 藤甲兵伤害至少2倍
0040874A |. 8A45 0C MOV AL,BYTE PTR SS:[EBP+C]
0040874D |. B9 03000000 MOV ECX,3
00408752 |. 99 CDQ
00408753 |. F7F9 IDIV ECX
00408755 |. 8845 EC MOV BYTE PTR SS:[EBP-14],AL
00408758 |. 33C0 XOR EAX,EAX
0040875A |. 8A45 EC MOV AL,BYTE PTR SS:[EBP-14]
0040875D |. 83C0 02 ADD EAX,2
00408760 |. 0FAF45 10 IMUL EAX,DWORD PTR SS:[EBP+10]
00408764 |. 8945 10 MOV DWORD PTR SS:[EBP+10],EAX
也就是说,前三个火系策略(0、1、2)攻击的时候,藤甲兵伤害为2*伤害,后三个大火系策略(3、4、5)攻击的时候,藤甲兵伤害(1+2)*伤害。
作者:
ctermiii 时间: 2010-7-30 12:30
这个地方6楼的注释那里有点问题,我之前调试的时候只用了焦热、猛火等测试,原来以为这样刚好合理;
后来发现大焦热跟焦热伤害一样,所以1楼的公式没错,但6楼的注释错误了;
0040873C |. 8A45 0C MOV AL,BYTE PTR SS:[EBP+C] ; 策略代号
这个地方应该不是策略代号,而的确是威力基数00,01,02
所以,我在想是不是原来程序的bug,因为按照这样的算法,伤害都是2倍,有点画蛇添足(不过这个游戏画蛇添足的地方还真多,很多计算都是做无用功,可能是复刻时候搞的,要么是游戏发布的时候编译器的问题吗?晕)
如果把
0040874D |. B9 03000000 MOV ECX,3
00408752 |. 99 CDQ
00408753 |. F7F9 IDIV ECX
00408755 |. 8845 EC MOV BYTE PTR SS:[EBP-14],AL
这里边的AL改成DL行了,这样求的是除以3的余数,从而焦热2倍,火龙3倍,猛火4倍。
但这样的话,除以3的计算就多余了;
godtype也请看看是不是这样。
[ 本帖最后由 ctermiii 于 2010-7-30 14:23 编辑 ]
作者:
阿尔法孝直 时间: 2010-7-30 13:05
我一会儿看看光盘版的。
作者:
ctermiii 时间: 2010-7-30 14:10
现在可以确定那个地方是威力了:
00404360 /$ 55 PUSH EBP
00404361 |. 8BEC MOV EBP,ESP
00404363 |. 83EC 28 SUB ESP,28
00404366 |. 53 PUSH EBX
00404367 |. 56 PUSH ESI
00404368 |. 57 PUSH EDI
00404369 |. C645 F0 FF MOV BYTE PTR SS:[EBP-10],0FF
0040436D |. B9 06000000 MOV ECX,6
00404372 |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] ; 策略代号0~5火计6~B落石
00404375 |. 2BD2 SUB EDX,EDX
00404377 |. F7F1 DIV ECX
00404379 |. 8845 F4 MOV BYTE PTR SS:[EBP-C],AL ; 0火计1落石
这个是判断到底是火计还是落石的;这里的[ebp+8]是策略代号
代号除以6,刚好把火计和落石分开,火计0落石1,送入[ebp-C]
0040439E |> \8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
004043A1 |. 8A80 B0D24400 MOV AL,BYTE PTR DS:[EAX+44D2B0]
004043A7 |. 8845 FC MOV BYTE PTR SS:[EBP-4],AL ; 策略范围
落石和火计的策略范围和威力是同一个参数;送入[ebp-4]
004045FB |. 8A45 F4 MOV AL,BYTE PTR SS:[EBP-C]
004045FE |. C1E0 04 SHL EAX,4
00404601 |. 33C9 XOR ECX,ECX
00404603 |. 8A4D FC MOV CL,BYTE PTR SS:[EBP-4]
00404606 |. 0BC1 OR EAX,ECX ; 火计0x,落石1x
然后这个地方:
计算的结果导致火计为0X,落石为1X
这个数值最终送入BYTE [46bcd8+13H]
然后到计算策略伤害的时候被还原:
0040880F |. 8A45 0C MOV AL,BYTE PTR SS:[EBP+C] ;
00408812 |. C1E8 04 SHR EAX,4
00408815 |. 24 01 AND AL,1 ;还原类型:0火计1落石
00408817 |. 8845 F0 MOV BYTE PTR SS:[EBP-10],AL
0040881A |. 33C0 XOR EAX,EAX
0040881C |. 8A45 0C MOV AL,BYTE PTR SS:[EBP+C]
0040881F |. 24 0F AND AL,0F ;还原威力基数
所以6楼原来注释策略代号的地方,应该注释为策略威力基数
可以改一个999血的藤甲兵出来烧烧测试一下,伤害应该都是这个武将做其他兵种时候2倍;
[ 本帖最后由 ctermiii 于 2010-7-30 14:19 编辑 ]
作者:
阿尔法孝直 时间: 2010-7-30 14:29
原帖由 ctermiii 于 2010-7-30 12:30 发表
这个地方6楼的注释那里有点问题,我之前调试的时候只用了焦热、猛火等测试,原来以为这样刚好合理;
后来发现大焦热跟焦热伤害一样,所以1楼的公式没错,但6楼的注释错误了;
0040873C |. 8A45 0C MO ...
再看了一下光盘版,灰色语句是0x40874D处:
图片附件:
40874D.jpg (2010-7-30 14:29, 81.7 K) / 该附件被下载次数 214
http://xycq.org.cn/forum/attachment.php?aid=100092
作者:
lewulezo 时间: 2010-7-30 15:34
落石和火计的策略范围和威力是同一个参数....
这个问题我在游戏中发现了...很烂的设定。
但是补给类技能就没有这个问题,我一直都很纳闷。如果能改的话就好了。
[ 本帖最后由 lewulezo 于 2010-7-30 15:37 编辑 ]
作者:
lewulezo 时间: 2010-7-30 15:42
还有一个想知道的问题,究竟在什么地方存放着策略是否可以使用的条件?
比如说火计只能在 平原 草原 丛林 城内使用,天气必须不是雨天
石计只能在 荒地 山地使用
作者:
godtype 时间: 2010-7-30 16:01
之前只是直接看注解来看代码,刚刚调试了一下,的确应该是威力基数:
0040873A |. 33C0 XOR EAX,EAX
0040873C |. 8A45 0C MOV AL,BYTE PTR SS:[EBP+C] ; 威力基数
0040873F |. 83F8 06 CMP EAX,6
实际调试结果,石系的威力基数应该是10、11、12,所以顶楼最后面的部分还要再更正一下。
作者:
godtype 时间: 2010-7-30 16:09 标题: 回复 #17 lewulezo 的帖子
地型限制在4D310H开始,共8个字节,前面的00 01 02 05是火系的,后面的03 04 FF FF是石系的。
[ 本帖最后由 godtype 于 2010-7-30 16:18 编辑 ]
作者:
阿尔法孝直 时间: 2010-7-30 16:33 标题: 回复 #19 godtype 的帖子
也就是说,每种策略最多只能有4种可用地形。那么如果想扩充怎么办?
作者:
阿尔法孝直 时间: 2010-7-30 16:42
原帖由 ctermiii 于 2010-7-28 12:08 发表
、计算策略伤害:
伤害公式为分3个:
初级策略伤害=武将智力x3/7+策略基础伤害/2
中级策略伤害=武将智力x2/5+策略基础伤害/2
高级策略伤害=武将智力x4/5+策略基础伤害/2
——————策略基础伤害————————
火计 落石
初级 50 75
中级 100 125
高级 200 250
1、比较奇怪的是,为什么中级策略里面武将智力的系数最小呢?
再看了一下,原来你把2/5和3/7写颠倒了。
2、程序又是多此一举,明明
25,37
50,62
100,125
就完了,干嘛还要
50,75
100,125
200,250
再除以2
难道说这几个数字后面还有用?
[ 本帖最后由 阿尔法孝直 于 2010-7-30 16:45 编辑 ]
作者:
godtype 时间: 2010-7-30 16:43 标题: 回复 #20 阿尔法孝直 的帖子
还是老办法,压缩多余代码,腾出一定的空间。
作者:
lewulezo 时间: 2010-7-30 17:03
看来孔明传中代码自由度真是很差。大段罗里啰嗦的代码,估计都是if else之类的hardcode判断,要想调整一下只能直接改逻辑。
简单的运算的写很冗长,比如说乘上几分之几系数的就要写好几行。如果是用数据区的,直接就从内存(exe)里面读个数字相乘不就好了么。
事实上很多地方全部都可以改用数据区来写,不用这样jmp来jmp去的,自由度也高。像上次ctermiii改的兵种相克,代码比原来的短小,而且原来的所有代码逻辑都可以原封不动重现,自定义起来也方便多了。
[ 本帖最后由 lewulezo 于 2010-7-30 17:09 编辑 ]
作者:
ctermiii 时间: 2010-7-30 17:54
今天回来的早,接着看一会儿。
原帖由 阿尔法孝直 于 2010-7-30 16:42 发表
1、比较奇怪的是,为什么中级策略里面武将智力的系数最小呢?
再看了一下,原来你把2/5和3/7写颠倒了。
抱歉,的确写反了。
原帖由 godtype 于 2010-7-30 16:01 发表
之前只是直接看注解来看代码,刚刚调试了一下,的确应该是威力基数:
0040873A |. 33C0 XOR EAX,EAX
0040873C |. 8A45 0C MOV AL,BYTE PTR SS: ; 威力基数 ...
公式没错的,你看我14楼的分析
这个1X的1是为了标识落石与火计的区别,火计为0X;
二者基本杀伤力不一样的。
作者:
ctermiii 时间: 2010-7-30 18:01
原帖由 lewulezo 于 2010-7-30 15:34 发表
落石和火计的策略范围和威力是同一个参数....
这个问题我在游戏中发现了...很烂的设定。
但是补给类技能就没有这个问题,我一直都很纳闷。如果能改的话就好了。
这个里边很多都是想办法用同一个函数的,改的话肯定是可以的,但要花时间弄清楚,然后重新自己写了替换;
原帖由 阿尔法孝直 于 2010-7-30 14:29 发表
再看了一下光盘版,灰色语句是0x40874D处:
好像是没有区别?
那估计就是一个代码规范的问题,别人写的比较严谨
按道理说,设定所有火计对藤甲兵的伤害都是其他兵种的2倍,也是合理的,是不是我们太多心了。
再说,垃圾代码又不是这个地方才有;
我真正不理解的是第6条
6、攻击方兵种修正:
军师、大军师、名军师、运粮队、物资队、军乐队的伤害会另外算上武器伤害
运粮队、物资队、军乐队有可以伤人的计策吗?
作者:
ctermiii 时间: 2010-7-30 18:12
原帖由 阿尔法孝直 于 2010-7-30 16:42 发表
2、程序又是多此一举,明明
25,37
50,62
100,125
就完了,干嘛还要
50,75
100,125
200 ...
我觉得这个倒不是问题
比如你写程序的时候定义一些常量
#Define AAbase 25
#Define BBBase 2xAABase
那你写程序的时候,可能会用
[tempAddr1]=BBBase
在某个计算的时候这样写:
[tempAddr1]/2+random%AAbase这些的写法
编译的时候,自然会转成相应的格式,而不是计算实际值
这两个常量可能用在很多地方,不仅仅是这里
作者:
shps940114 时间: 2010-7-30 19:45
弓兵不是有水計嗎
作者:
阿尔法孝直 时间: 2010-7-30 19:58
原帖由 shps940114 于 2010-7-30 19:45 发表
弓兵不是有水計嗎
弓兵也是火计
作者:
lewulezo 时间: 2010-7-30 20:08
原帖由 ctermiii 于 2010-7-30 18:12 发表
6、攻击方兵种修正:
军师、大军师、名军师、运粮队、物资队、军乐队的伤害会另外算上武器伤害
运粮队、物资队、军乐队有可以伤人的计策吗?
后勤三兵种貌似是没有攻击型策略的。但是,补给类策略的效果,依然和武器的加成有关。
作者:
阿尔法孝直 时间: 2010-7-30 23:41
原帖由 lewulezo 于 2010-7-30 17:03 发表
看来孔明传中代码自由度真是很差。大段罗里啰嗦的代码,估计都是if else之类的hardcode判断,要想调整一下只能直接改逻辑。
简单的运算的写很冗长,比如说乘上几分之几系数的就要写好几行。如果是用数据区的, ...
但是你看看,兵种问题,不仅仅是几分之几就了事,再看看藤甲兵,直接果断了事=1。也就是说,光光数据区的方法,只能是类似式子结构的才能使用,例如相克修正
伤害=伤害*a/b,都是同一种结构的才行,不同的只是a、b的值。
作者:
ctermiii 时间: 2010-7-31 18:09
原帖由 lewulezo 于 2010-7-30 20:08 发表
后勤三兵种貌似是没有攻击型策略的。但是,补给类策略的效果,依然和武器的加成有关。
可是这个地方只有伤害计算,补给类的不在这个函数里
作者:
lewulezo 时间: 2010-7-31 20:49 标题: 回复 #30 阿尔法孝直 的帖子
藤甲兵直接=1,其实只要把伤害修正为1%,效果几乎是类似的。而且我看ctermiii的修改代码中保留着这段呢
相克值设定为75,就是3/4
设定为50,就是1/2
设定为150,就是3/2
实际上,他的条件判断默认也就这几种情况。
但是,想要设定相克修正是120%就做不到了,从这点来看,明显还是数据区的写法灵活啊。
作者:
lewulezo 时间: 2010-7-31 20:51 标题: 回复 #31 ctermiii 的帖子
那会不会是计算策略防御力的需要呢?
作者:
ctermiii 时间: 2010-8-1 12:48
但这个地方只被伤害函数调用了,所以才奇怪呢
作者:
阿尔法孝直 时间: 2010-8-2 00:08
非攻击性策略成功,要求
随机数%攻击方智力>=防御方智力/x
压迫类、骂声来、假情报类、反间类、封策,x=3
查看类:x=4
止步、牵制,x=5
有策略减伤buff的再算一次,两次都成功了才附加状态上去。
此类函数由0x40221B进入。与蛇兵象兵攻击附加状态(那时x=2)用的是同一个函数。
0040221B /$ 55 PUSH EBP
0040221C |. 8BEC MOV EBP,ESP
0040221E |. 83EC 18 SUB ESP,18
00402221 |. 53 PUSH EBX
00402222 |. 56 PUSH ESI
00402223 |. 57 PUSH EDI
00402224 |. 33C0 XOR EAX,EAX
00402226 |. 8A45 08 MOV AL,BYTE PTR SS:[EBP+8]
00402229 |. 8BC8 MOV ECX,EAX
0040222B |. 8D0440 LEA EAX,DWORD PTR DS:[EAX+EAX*2]
0040222E |. C1E0 03 SHL EAX,3
00402231 |. 2BC1 SUB EAX,ECX
00402233 |. 8D88 98C04600 LEA ECX,DWORD PTR DS:[EAX+46C098]
00402239 |. E8 F26E0000 CALL EKD2W95.00409130
0040223E |. 8D0440 LEA EAX,DWORD PTR DS:[EAX+EAX*2]
00402241 |. 03C0 ADD EAX,EAX
00402243 |. 8D04C0 LEA EAX,DWORD PTR DS:[EAX+EAX*8]
00402246 |. 05 E8564500 ADD EAX,EKD2W95.004556E8
0040224B |. 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX
0040224E |. 33C0 XOR EAX,EAX
00402250 |. 8A45 0C MOV AL,BYTE PTR SS:[EBP+C]
00402253 |. 8BC8 MOV ECX,EAX
00402255 |. 8D0440 LEA EAX,DWORD PTR DS:[EAX+EAX*2]
00402258 |. C1E0 03 SHL EAX,3
0040225B |. 2BC1 SUB EAX,ECX
0040225D |. 8D88 98C04600 LEA ECX,DWORD PTR DS:[EAX+46C098]
00402263 |. E8 C86E0000 CALL EKD2W95.00409130
00402268 |. 8D0440 LEA EAX,DWORD PTR DS:[EAX+EAX*2]
0040226B |. 03C0 ADD EAX,EAX
0040226D |. 8D04C0 LEA EAX,DWORD PTR DS:[EAX+EAX*8]
00402270 |. 05 E8564500 ADD EAX,EKD2W95.004556E8
00402275 |. 8945 F4 MOV DWORD PTR SS:[EBP-C],EAX
00402278 |. C745 F8 01000>MOV DWORD PTR SS:[EBP-8],1
0040227F |. C645 EC 01 MOV BYTE PTR SS:[EBP-14],1
00402283 |. 6A 08 PUSH 8 ; /Arg1 = 00000008
00402285 |. 33C0 XOR EAX,EAX ; |
00402287 |. 8A45 0C MOV AL,BYTE PTR SS:[EBP+C] ; |
0040228A |. 8BC8 MOV ECX,EAX ; |
0040228C |. 8D0440 LEA EAX,DWORD PTR DS:[EAX+EAX*2] ; |
0040228F |. C1E0 03 SHL EAX,3 ; |
00402292 |. 2BC1 SUB EAX,ECX ; |
00402294 |. 8D88 98C04600 LEA ECX,DWORD PTR DS:[EAX+46C098] ; |
0040229A |. E8 B16E0000 CALL EKD2W95.00409150 ; \EKD2W95.00409150
0040229F |. 85C0 TEST EAX,EAX
004022A1 |. 0F84 04000000 JE EKD2W95.004022AB
004022A7 |. C645 EC 02 MOV BYTE PTR SS:[EBP-14],2
004022AB |> C645 FC 00 MOV BYTE PTR SS:[EBP-4],0
004022AF |. E9 03000000 JMP EKD2W95.004022B7
004022B4 |> FE45 FC /INC BYTE PTR SS:[EBP-4]
004022B7 |> 33C0 XOR EAX,EAX
004022B9 |. 8A45 FC |MOV AL,BYTE PTR SS:[EBP-4]
004022BC |. 33C9 |XOR ECX,ECX
004022BE |. 8A4D EC |MOV CL,BYTE PTR SS:[EBP-14]
004022C1 |. 3BC1 |CMP EAX,ECX
004022C3 |. 0F8D 7B000000 |JGE EKD2W95.00402344
004022C9 |. 837D F8 00 |CMP DWORD PTR SS:[EBP-8],0
004022CD |. 0F84 71000000 |JE EKD2W95.00402344
004022D3 |. 33C0 |XOR EAX,EAX
004022D5 |. 8A45 14 |MOV AL,BYTE PTR SS:[EBP+14]
004022D8 |. 83F8 02 |CMP EAX,2
004022DB |. 0F85 5E000000 |JNZ EKD2W95.0040233F
004022E1 |. 8B4D F0 |MOV ECX,DWORD PTR SS:[EBP-10]
004022E4 |. E8 276E0000 |CALL EKD2W95.00409110
004022E9 |. 33C9 |XOR ECX,ECX
004022EB |. 8AC8 |MOV CL,AL
004022ED |. 51 |PUSH ECX ; /Arg1
004022EE |. E8 35500400 |CALL EKD2W95.00447328 ; \EKD2W95.00447328
004022F3 |. 83C4 04 |ADD ESP,4
004022F6 |. 8BD8 |MOV EBX,EAX
004022F8 |. 895D E8 |MOV DWORD PTR SS:[EBP-18],EBX
004022FB |. 8B4D F4 |MOV ECX,DWORD PTR SS:[EBP-C]
004022FE |. E8 0D6E0000 |CALL EKD2W95.00409110
00402303 |. 33C9 |XOR ECX,ECX
00402305 |. 8AC8 |MOV CL,AL
00402307 |. 33DB |XOR EBX,EBX
00402309 |. 8A5D 10 |MOV BL,BYTE PTR SS:[EBP+10]
0040230C |. 8BC1 |MOV EAX,ECX
0040230E |. 99 |CDQ
0040230F |. F7FB |IDIV EBX
00402311 |. 8B4D E8 |MOV ECX,DWORD PTR SS:[EBP-18]
00402314 |. 3BC8 |CMP ECX,EAX
00402316 |. 0F83 23000000 |JNB EKD2W95.0040233F
0040231C |. 33C0 |XOR EAX,EAX
0040231E |. 8A45 18 |MOV AL,BYTE PTR SS:[EBP+18]
00402321 |. 85C0 |TEST EAX,EAX
00402323 |. 0F84 0F000000 |JE EKD2W95.00402338
00402329 |. 68 00DD4400 |PUSH EKD2W95.0044DD00
0040232E |. 6A 00 |PUSH 0
00402330 |. E8 006C0300 |CALL EKD2W95.00438F35
00402335 |. 83C4 08 |ADD ESP,8
00402338 |> C745 F8 00000>|MOV DWORD PTR SS:[EBP-8],0
0040233F |>^ E9 70FFFFFF \JMP EKD2W95.004022B4
00402344 |> 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
00402347 |. E9 00000000 JMP EKD2W95.0040234C
0040234C |> 5F POP EDI
0040234D |. 5E POP ESI
0040234E |. 5B POP EBX
0040234F |. C9 LEAVE
00402350 \. C3 RETN
[ 本帖最后由 阿尔法孝直 于 2010-8-2 01:56 编辑 ]
作者:
阿尔法孝直 时间: 2010-8-2 01:35
0x405235开始是查看类策略和道具的伤害算法:
unsigned __int8 __cdecl sub_405235(char a1, unsigned __int8 a2, unsigned __int8 a3)
{
unsigned __int8 v4; // [sp+14h] [bp-8h]@1
char v5; // [sp+10h] [bp-Ch]@1
int v6; // [sp+Ch] [bp-10h]@1
unsigned __int8 v7; // [sp+18h] [bp-4h]@23
v4 = 0;
v5 = 0;
v6 = a2;
switch ( v6 ) //判断策略代码:v6==0xC是查看,0xD是侦察,0xE是谍报;a3==2使用策略,a3==3使用道具
{
case 0xC:
if ( a3 == 2 )
v5 = 8;
else
v5 = 5;
if ( a3 == 2 )
v4 = 5;
else
v4 = 4;
break;
case 0xD:
if ( a3 == 2 )
v5 = 15;
else
v5 = 10;
if ( a3 == 2 )
v4 = 11;
else
v4 = 6;
break;
case 0xE:
if ( a3 == 2 )
v5 = 30;
else
v5 = 20;
v4 = 11;
break;
}
v7 = v5 + (unsigned __int8)sub_447328(v4);//伤害=基本值v5+随机数%v4
//若有减轻策略损伤Buff,伤害/2
if ( sub_409150((int)((char *)&dword_46C098 + 23 * (unsigned __int8)a1), 8) )
v7 = (signed int)v7 >> 1;
//伤害不能超过剩余策略值
if ( (unsigned __int8)sub_409260((int)((char *)&dword_46C098 + 23 * (unsigned __int8)a1)) < (signed int)v7 )
v7 = sub_409260((int)((char *)&dword_46C098 + 23 * (unsigned __int8)a1));
return v7;//返回查看类的伤害值
}
[ 本帖最后由 阿尔法孝直 于 2010-8-7 17:47 编辑 ]
作者:
ctermiii 时间: 2010-8-2 11:59
嗯
00403918 $ 55 PUSH EBP
00403919 . 8BEC MOV EBP,ESP
0040391B . 83EC 78 SUB ESP,78
这个是处理道具使用的总函数;
00407E2B $ 55 PUSH EBP
00407E2C . 8BEC MOV EBP,ESP
00407E2E . 83EC 0C SUB ESP,0C
00407E31 . 53 PUSH EBX
这个是使用策略的总函数
我写伤害显示的时候,就是在处理耐久力伤害的道具和策略公用的函数里增加了一个开关。
道具和策略有相同功能的话,函数也是同一个。
作者:
ctermiii 时间: 2010-8-2 12:08
除以2那个地方:
sub_409150((int)((char *)&dword_46C098 + 23 * (unsigned __int8)a1), 8)
注意这个参数8,是检查是否有策略减伤buffer的,如果有,上面计算结果/2
这个函数:
00409150 >/$ 55 PUSH EBP ; 10混乱20某个下降01移动力下降02攻击力下降04封策08减轻策略损伤
00409151 |. 8BEC MOV EBP,ESP
00409153 |. 83EC 04 SUB ESP,4
00409156 |. 53 PUSH EBX
00409157 |. 56 PUSH ESI
00409158 |. 57 PUSH EDI
00409159 |. 894D FC MOV DWORD PTR SS:[EBP-4],ECX
0040915C |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0040915F |. 33C9 XOR ECX,ECX
00409161 |. 8A48 16 MOV CL,BYTE PTR DS:[EAX+16]
00409164 |. 33C0 XOR EAX,EAX
00409166 |. 8A45 08 MOV AL,BYTE PTR SS:[EBP+8]
00409169 |. 23C8 AND ECX,EAX
0040916B |. 8BC1 MOV EAX,ECX
0040916D |. E9 00000000 JMP EKD2Win.00409172
00409172 |> 5F POP EDI
00409173 |. 5E POP ESI
00409174 |. 5B POP EBX
00409175 |. C9 LEAVE
00409176 \. C2 0400 RETN 4
就是检测有没有异常状态buffer的,一共6种不良状态
良性状态2种,加攻加防,而且都有2次叠加效果
加攻(防)2次的话,攻击(防御)增加到150%;
作者:
ctermiii 时间: 2010-8-2 15:17
原帖由 阿尔法孝直 于 2010-8-2 00:08 发表
非攻击性策略成功,要求
随机数%攻击方智力>=防御方智力/x
压迫类、骂声来、假情报类、反间类、封策,x=3
查看类:x=4
止步、牵制,x=5
有策略减伤buff的再算一次,两次都成功了才附加状态上去。
...
我来注释一下:
0040221B /$ 55 PUSH EBP
0040221C |. 8BEC MOV EBP,ESP
0040221E |. 83EC 18 SUB ESP,18
00402221 |. 53 PUSH EBX
00402222 |. 56 PUSH ESI
00402223 |. 57 PUSH EDI
00402224 |. 33C0 XOR EAX,EAX
00402226 |. 8A45 08 MOV AL,BYTE PTR SS:[EBP+8] ;攻击方战场ID,就是秘籍图片里显示的ID,就是部队序号
00402229 |. 8BC8 MOV ECX,EAX
0040222B |. 8D0440 LEA EAX,DWORD PTR DS:[EAX+EAX*2]
0040222E |. C1E0 03 SHL EAX,3
00402231 |. 2BC1 SUB EAX,ECX
00402233 |. 8D88 98C04600 LEA ECX,DWORD PTR DS:[EAX+46C098]
00402239 |. E8 F26E0000 CALL EKD2W95.00409130
0040223E |. 8D0440 LEA EAX,DWORD PTR DS:[EAX+EAX*2]
00402241 |. 03C0 ADD EAX,EAX
00402243 |. 8D04C0 LEA EAX,DWORD PTR DS:[EAX+EAX*8]
00402246 |. 05 E8564500 ADD EAX,EKD2W95.004556E8
0040224B |. 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX ;攻击方基本能力数据地址
0040224E |. 33C0 XOR EAX,EAX
00402250 |. 8A45 0C MOV AL,BYTE PTR SS:[EBP+C] ;防御方战场ID
00402253 |. 8BC8 MOV ECX,EAX
00402255 |. 8D0440 LEA EAX,DWORD PTR DS:[EAX+EAX*2]
00402258 |. C1E0 03 SHL EAX,3
0040225B |. 2BC1 SUB EAX,ECX
0040225D |. 8D88 98C04600 LEA ECX,DWORD PTR DS:[EAX+46C098]
00402263 |. E8 C86E0000 CALL EKD2W95.00409130
00402268 |. 8D0440 LEA EAX,DWORD PTR DS:[EAX+EAX*2]
0040226B |. 03C0 ADD EAX,EAX
0040226D |. 8D04C0 LEA EAX,DWORD PTR DS:[EAX+EAX*8]
00402270 |. 05 E8564500 ADD EAX,EKD2W95.004556E8
00402275 |. 8945 F4 MOV DWORD PTR SS:[EBP-C],EAX ;防御方能力地址
00402278 |. C745 F8 01000>MOV DWORD PTR SS:[EBP-8],1 ;初始化默认计策效果,1成功0失败,方便道具的计算
0040227F |. C645 EC 01 MOV BYTE PTR SS:[EBP-14],1 ;普通武将1次赌博机会
00402283 |. 6A 08 PUSH 8 ; /Arg1 = 00000008;确认是否有减伤buffer
00402285 |. 33C0 XOR EAX,EAX ; |
00402287 |. 8A45 0C MOV AL,BYTE PTR SS:[EBP+C] ; |
0040228A |. 8BC8 MOV ECX,EAX ; |
0040228C |. 8D0440 LEA EAX,DWORD PTR DS:[EAX+EAX*2] ; |
0040228F |. C1E0 03 SHL EAX,3 ; |
00402292 |. 2BC1 SUB EAX,ECX ; |
00402294 |. 8D88 98C04600 LEA ECX,DWORD PTR DS:[EAX+46C098] ; |
0040229A |. E8 B16E0000 CALL EKD2W95.00409150 ; \EKD2W95.00409150
0040229F |. 85C0 TEST EAX,EAX
004022A1 |. 0F84 04000000 JE EKD2W95.004022AB
004022A7 |. C645 EC 02 MOV BYTE PTR SS:[EBP-14],2 ;有减伤buffer两次赌博机会
004022AB |> C645 FC 00 MOV BYTE PTR SS:[EBP-4],0
004022AF |. E9 03000000 JMP EKD2W95.004022B7
004022B4 |> FE45 FC /INC BYTE PTR SS:[EBP-4]
004022B7 |> 33C0 XOR EAX,EAX
004022B9 |. 8A45 FC |MOV AL,BYTE PTR SS:[EBP-4]
004022BC |. 33C9 |XOR ECX,ECX
004022BE |. 8A4D EC |MOV CL,BYTE PTR SS:[EBP-14]
004022C1 |. 3BC1 |CMP EAX,ECX
004022C3 |. 0F8D 7B000000 |JGE EKD2W95.00402344
004022C9 |. 837D F8 00 |CMP DWORD PTR SS:[EBP-8],0
004022CD |. 0F84 71000000 |JE EKD2W95.00402344
004022D3 |. 33C0 |XOR EAX,EAX
004022D5 |. 8A45 14 |MOV AL,BYTE PTR SS:[EBP+14]
004022D8 |. 83F8 02 |CMP EAX,2 ;道具3策略2,道具一定成功的;
004022DB |. 0F85 5E000000 |JNZ EKD2W95.0040233F
004022E1 |. 8B4D F0 |MOV ECX,DWORD PTR SS:[EBP-10]
004022E4 |. E8 276E0000 |CALL EKD2W95.00409110 ;攻智力
004022E9 |. 33C9 |XOR ECX,ECX
004022EB |. 8AC8 |MOV CL,AL
004022ED |. 51 |PUSH ECX ; /Arg1
004022EE |. E8 35500400 |CALL EKD2W95.00447328 ; \随机数
004022F3 |. 83C4 04 |ADD ESP,4
004022F6 |. 8BD8 |MOV EBX,EAX
004022F8 |. 895D E8 |MOV DWORD PTR SS:[EBP-18],EBX
004022FB |. 8B4D F4 |MOV ECX,DWORD PTR SS:[EBP-C]
004022FE |. E8 0D6E0000 |CALL EKD2W95.00409110 ;防智力
00402303 |. 33C9 |XOR ECX,ECX
00402305 |. 8AC8 |MOV CL,AL
00402307 |. 33DB |XOR EBX,EBX
00402309 |. 8A5D 10 |MOV BL,BYTE PTR SS:[EBP+10] ;策略成功率基数,越大计策越容易成功。
0040230C |. 8BC1 |MOV EAX,ECX
0040230E |. 99 |CDQ
0040230F |. F7FB |IDIV EBX
00402311 |. 8B4D E8 |MOV ECX,DWORD PTR SS:[EBP-18]
00402314 |. 3BC8 |CMP ECX,EAX
00402316 |. 0F83 23000000 |JNB EKD2W95.0040233F
0040231C |. 33C0 |XOR EAX,EAX
0040231E |. 8A45 18 |MOV AL,BYTE PTR SS:[EBP+18] ;0兵种附带攻击特效,1策略,兵种特效不会显示下边的策略失败字样
00402321 |. 85C0 |TEST EAX,EAX
00402323 |. 0F84 0F000000 |JE EKD2W95.00402338
00402329 |. 68 00DD4400 |PUSH EKD2W95.0044DD00 ;策略失败字样
0040232E |. 6A 00 |PUSH 0 ;对话框风格,多个样式
00402330 |. E8 006C0300 |CALL EKD2W95.00438F35
00402335 |. 83C4 08 |ADD ESP,8
00402338 |> C745 F8 00000>|MOV DWORD PTR SS:[EBP-8],0 ;失败标识0
0040233F |>^ E9 70FFFFFF \JMP EKD2W95.004022B4
00402344 |> 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
00402347 |. E9 00000000 JMP EKD2W95.0040234C
0040234C |> 5F POP EDI
0040234D |. 5E POP ESI
0040234E |. 5B POP EBX
0040234F |. C9 LEAVE
00402350 \. C3 RETN
[ 本帖最后由 ctermiii 于 2010-8-2 15:19 编辑 ]
作者:
lewulezo 时间: 2010-8-2 15:36
代码都看明白了,我是不是可以对原有的逻辑进行改造,定义自己的孔明传逻辑。
目前比较关心的问题是
1. 策略的威力和它的范围定义怎样才能分离。我想让焦热术范围大但是威力小,就没法实现
2. 如何扩展策略对应地形的限制。突破火计,石计各自只能有4种地形的限制
3. 是否能像英杰传那样拥有地形伤害加成。火计在丛林中应该有额外的伤害加成。
伤害类策略似乎只有火和石。需要准备一个地形数量*2字节的数据区。
4. 能否自由设定兵种对应的策略伤害加成,而不是固定写死藤甲兵*2之类。
需要一个兵种数量*2字节的数据区。
这恐怕要修改好多地方。
[ 本帖最后由 lewulezo 于 2010-8-2 15:52 编辑 ]
作者:
ctermiii 时间: 2010-8-2 15:56
实现起来都不难的,不过你说对了,要改的地方不少呢
精简一下代码未必能写的下,那就要像我写伤害预测的地方一样,另占空白区
而且还要看一下,AI判断的时候是否也采用同样的函数:不然你扩展了,AI不知道,也没多大意思了。
可以找时间看看
我之前曾经欺骗了电脑一次,让它以为草地上可以落石,结果它用了落石,画面显示草地不能用-_-
作者:
阿尔法孝直 时间: 2010-8-2 15:59
原帖由 ctermiii 于 2010-8-2 15:56 发表
我之前曾经欺骗了电脑一次,让它以为草地上可以落石,结果它用了落石,画面显示草地不能用-_-
是在没修改的情况下搞出来的吗?求截图。
作者:
ctermiii 时间: 2010-8-2 16:23
原帖由 阿尔法孝直 于 2010-8-2 15:59 发表
是在没修改的情况下搞出来的吗?求截图。
肯定要修改,是调试的时候改了寄存器试着玩的;
策略和攻击的范围,简单的是通过查表来算的:
位置在:
0x44BFA8:
01 00 00 00 FF FF FF FF 01 00 00 00 01 00 00 00 FF FF FF FF 01 00 00 00 FF FF FF FF FF FF FF FF
01 00 00 00 00 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 FF FF FF FF
00 00 00 01 02 00 00 00 00 00 00 00 FF FF FF FF 01 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00
FF FF FF FF 00 00 00 00 01 00 00 00 FF FF FF FF 01 00 00 00 01 00 00 00 FF FF FF FF 01 00 00 00
比如策略范围0和攻击类型0是一样的,都是从
0x44FBF0开始:00 00 00 00 FF FF FF FF 01 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 FF FF FF FF 00 00 00 00
以当前坐标(X,Y)为基准
每8个字节一组,分别是(X,Y)的增量
四个数据:
A=X,Y-1
B=X+1,Y
C=X,Y+1
D=X-1,Y
图示@为当前坐标的话:
0A0
B@D
0C0
这个跟三国志5里边算范围的方法基本一致,可能差别在于+1-1的时候的地图方向而已。
最根本的范围计算函数在这个函数里:
004197D1 >/$ 55 PUSH EBP
004197D2 |. 8BEC MOV EBP,ESP
004197D4 |. 83EC 18 SUB ESP,18
004197D7 |. 53 PUSH EBX
004197D8 |. 56 PUSH ESI
004197D9 |. 57 PUSH EDI
004197DA |. 894D E8 MOV DWORD PTR SS:[EBP-18],ECX
004197DD |. C645 FC FF MOV BYTE PTR SS:[EBP-4],0FF
004197E1 |. 68 FF000000 PUSH 0FF ; /Arg2 = 000000FF
004197E6 |. 68 FF000000 PUSH 0FF ; |Arg1 = 000000FF
004197EB |. 8D4D F4 LEA ECX,DWORD PTR SS:[EBP-C] ; |
004197EE |. E8 5D4A0000 CALL EKD2Win.0041E250 ; \EKD2Win.0041E250
004197F3 |. 33C0 XOR EAX,EAX
004197F5 |. 8A45 14 MOV AL,BYTE PTR SS:[EBP+14]
004197F8 |. 85C0 TEST EAX,EAX
004197FA |. 0F85 0A000000 JNZ EKD2Win.0041980A
00419800 |. C705 A8A64600>MOV DWORD PTR DS:[46A6A8],EKD2Win.004549>
0041980A |> 33C0 XOR EAX,EAX
0041980C |. 8A45 0C MOV AL,BYTE PTR SS:[EBP+C]
0041980F |. 3D FF000000 CMP EAX,0FF
作者:
阿尔法孝直 时间: 2010-8-2 16:29
一个坐标的增量居然要4个字节表示这也太浪费了……空出来写其他东西吧
作者:
ctermiii 时间: 2010-8-2 16:36
这个是32位数据导致的,eax用起来总比al方便一点嘛
而且这个是在数据区,可以大大增加范围倒是没问题
孔明传复刻的时候,不知道为什么数据和代码区都加了可写可执行的属性
不过这样导致代码和数据可以混写,这样对方便改编来说,倒挺好
作者:
阿尔法孝直 时间: 2010-8-7 18:04
原帖由 ctermiii 于 2010-8-2 12:08 发表
除以2那个地方:
sub_409150((int)((char *)&dword_46C098 + 23 * (unsigned __int8)a1), 8)
注意这个参数8,是检查是否有策略减伤buffer的,如果有,上面计算结果/2
这个函数:
00409150 >/$ 55 PUSH EBP ; 10混乱20某个下降01移动力下降02攻击力下降04封策08减轻策略损伤
02是攻击速度下降的状态。
20是耐久力每回合减少状态。
40一直怀疑是行动结束的状态,但不敢肯定。
[ 本帖最后由 阿尔法孝直 于 2010-8-7 18:16 编辑 ]
欢迎光临 轩辕春秋文化论坛 (http://xycq.org.cn/forum/) |
Powered by Discuz! 5.0.0 |