Board logo

标题: 三国孔明传物理伤害分析 [打印本页]

作者: ctermiii    时间: 2010-7-26 22:35     标题: 三国孔明传物理伤害分析

兵种以及地形等相关内容就不写了,这个老兄的帖子应该是比较详细的:
http://www.xycq.net/forum/thread-210344-1-1.html

按照攻击的视觉流程来写
Random标示随机数
%标示求余,比如A>1时,Random%A表示拿一个随机数去求除以A的余数,显然余数在0~(A-1)之间,A=1时显然%A=0
因为都是整数运算,所以除法等相关运算都是不包括小数部分的。

这个游戏是没有命中率的概念的,因为很多因素会导致伤害为0,显示xxx没有受到伤害。

1、判断攻击是物理攻击还是策略攻击;

具体位置:

QUOTE:
原帖由 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种伤害,后边说明

2、伤害A计算:
A、1 如果Random%(攻方攻击力x攻方所在地形因素/10)<防御方防御力x防御方地形因素/10/10
并且防御方没有混乱,那么伤害A=0,(猜测:攻击方如果是敌人,那敌人是不会来打的,他似乎会实现有个模拟运算攻击过程,见下边程序注释处)
A、2 如果Random%(攻方攻击力x攻方所在地形因素/10)>=防御方防御力x防御方地形因素/10/10
那么又分为:
A、2-1:如果(防御力x地形因素/10+1)/2>攻击方攻击力x攻击方所在地形因素/10
那么伤害A=1;
A、2-2:如果(防御力x地形因素/10+1)/2<攻击方攻击力x攻击方所在地形因素/10
那么伤害A=攻击力x地形因素/10-防御力x地形因素/10/2
B、判断防御方兵种:
B、1:如果兵种代号为09,0A、0B时,伤害A=Ax75%;
B、2:如果兵种代号为1B、1C、1D时,伤害A=Ax150%;
B、3:如果兵种代号1E、1F时,伤害A=Ax50%;
B、4:如果兵种代号为22时,伤害A=1;

结论是:
除了几个特殊兵种怕或者不怕物理攻击外,没有什么相克关系
具体代码见6楼:

QUOTE:
原帖由 ctermiii 于 2010-7-26 22:44 发表
http://www.xycq.net/forum/viewth ... page%3D1#pid2991476

3、判断是范围攻击类第一次攻击伤害还是反击,如果非第一次攻击,或者为反击,则上边计算的A=A/2;
注:如果到目前为止,伤害计算为0,则跳过下边5、6条过程

代码部分:

QUOTE:
原帖由 ctermiii 于 2010-7-26 22:44 发表
0042393C  |.  837D 08 01    CMP DWORD PTR SS:[EBP+8],1               ;  >=1为范围类伤害第一次之后的伤害
00423940  |.  0F83 11000000 JNB EKD2Win.00423957
00423946  |.  8B45 EC       MOV EAX,DWORD PTR SS:[EBP-14]
00423949  |.  33C9          XOR ECX,ECX
0042394B  |.  8A48 13       MOV CL,BYTE PTR DS:[EAX+13]              ;  1反击0攻击
0042394E  |.  83F9 01       CMP ECX,1
00423951  |.  0F85 0C000000 JNZ EKD2Win.00423963
00423957  |>  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
0042395A  |.  99            CDQ
0042395B  |.  2BC2          SUB EAX,EDX
0042395D  |.  C1F8 01       SAR EAX,1                                ;  原伤害变为50%
00423960  |.  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX

4、无论前边攻击计算是否造成伤害,特效都会进行判断;
象兵和蛇兵的兵种攻击特效(附加异常状态跟策略附加异常状态调用的计算函数一样)如下:
A、反击不会带特效

QUOTE:
原帖由 ctermiii 于 2010-7-26 22:44 发表
0042377A  |.  8A48 13       MOV CL,BYTE PTR DS:[EAX+13]              ;  是攻击还是反击?反击为1攻击为0
0042377D  |.  83F9 01       CMP ECX,1
00423780  |.  0F85 05000000 JNZ EKD2Win.0042378B

B、已经混乱的不能被象兵再次混乱,已经有减血状态的不能被蛇兵再次附加减血状态;
C、有减轻策略伤害的buffer在的话,被附加异常状态buffer的几率减少,算法是仅仅增加跟随机数比较的“赌博”机会而已
2次都成功才可附加状态,意思就是说,第一次计算如果附加了状态,没有buffer的话就算是附加异常状态了,但如果有减轻策略损伤的buffer在,会再计算一次
如果成功才能附加异常状态,如果失败将不附加异常状态
更详细的注释看这里:
http://www.xycq.net/forum/viewth ... page%3D1#pid2996066

QUOTE:
原帖由 ctermiii 于 2010-7-26 22:44 发表
0040227F  |.  C645 EC 01    MOV BYTE PTR SS:[EBP-14],1     ;普通状态给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 <EKD2Win.CheckIfSomeStatus>         ; \CheckIfSomeStatus
0040229F  |.  85C0          TEST EAX,EAX
004022A1  |.  0F84 04000000 JE EKD2Win.004022AB
004022A7  |.  C645 EC 02    MOV BYTE PTR SS:[EBP-14],2;如果有策略减伤buffer,给2次赌博机会

D、状态是否成功跟双方智力和随机数有关:
当Random%攻击方智力>=防御方智力/策略成功率基数时特效才能附加上
本次策略成功率基数=2
具体代码:

QUOTE:
原帖由 ctermiii 于 2010-7-26 22:44 发表
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                             ;  随机数%攻击方智力>=防御方智力/策略成功率基数

5、判断是否会全力一击
A、取得兵种攻击速度GSPD:
具体代码:

QUOTE:
原帖由 ctermiii 于 2010-7-26 22:44 发表
0042A3AE  |.  8A81 501F4500 MOV AL,BYTE PTR DS:[ECX+451F50]
0042A3B4  |.  8845 FC       MOV BYTE PTR SS:[EBP-4],AL
0042A3B7  |.  6A 02         PUSH 2                       ; /被减速
0042A3B9  |.  8B4D F8       MOV ECX,DWORD PTR SS:[EBP-8]             ; |
0042A3BC  |.  E8 8FEDFDFF   CALL <EKD2Win.CheckIfSomeStatus>      
0042A3C1  |.  85C0          TEST EAX,EAX
0042A3C3  |.  0F84 0B000000 JE EKD2Win.0042A3D4
0042A3C9  |.  33C0          XOR EAX,EAX
0042A3CB  |.  8A45 FC       MOV AL,BYTE PTR SS:[EBP-4]
0042A3CE  |.  C1F8 01       SAR EAX,1             ;速度/2

B、确认是否全力一击
当GSPD>Random%100是全力一击;
全力一击伤害A=Ax3/2=Ax150%
具体代码:

QUOTE:
原帖由 ctermiii 于 2010-7-26 22:44 发表
0042398C      6A 64         PUSH 64        ;100
0042398E  |.  E8 95390200   CALL <EKD2Win.Random%Arg1>               ; \Random%Arg1
00423993  |.  83C4 04       ADD ESP,4
00423996  |.  3BD8          CMP EBX,EAX
00423998  |.  0F86 16000000 JBE EKD2Win.004239B4                     ;  全力一击的概率
0042399E  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
004239A1  |.  8D0440        LEA EAX,DWORD PTR DS:[EAX+EAX*2]         ;  致命一击伤害x3/2
004239A4  |.  99            CDQ
004239A5  |.  2BC2          SUB EAX,EDX
004239A7  |.  C1F8 01       SAR EAX,1
004239AA  |.  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX
004239AD  |.  C745 F0 01000>MOV DWORD PTR SS:[EBP-10],1     ;  全力一击标示

6、等级相关的随机因素造成伤害变动:
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)

7、确认防御方是我军(15个部队)还是敌军;
如果是我军,那个会去确认游戏难度;
A、难度为初级的话,我军受伤害为Abase=Abasex80%;
B、难度为高级的话,我军受伤害为Abase=Abasex120%;
注:没有中级难度计算,那明显伤害为Abase=Abasex100%;
7部分的代码:

QUOTE:
原帖由 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

8、取得防御方当前耐久力,如果最终的ABase>=耐久力的话,伤害Abase=耐久力;
如果伤害<耐久力的哈,Abase不变,这个是为了防止打出比当前耐久力还大的数;


9、关于连击
A、主动攻击的连击,还是主动攻击,反击的连击,还是反击,伤害按照上边的再次套用就行;
B、速度低于防御方的兵种,不会连击,至少跟防御方速度相等;
C、已经连击过的话,不能再连击;
具体代码:

QUOTE:
原帖由 ctermiii 于 2010-7-26 22:44 发表
0042497F  |.  8A5C01 36     MOV BL,BYTE PTR DS:[ECX+EAX+36]          ;  守方速度
00424983  |.  3BD3          CMP EDX,EBX                              ;  速度小于对方不能双击
00424985  |.  0F8C A2000000 JL EKD2Win.00424A2D
0042498B  |.  833D 18184500>CMP DWORD PTR DS:[451818],0 ;是否连击过,连击过则为1,下边有
00424992  |.  0F85 95000000 JNZ EKD2Win.00424A2D

D、连击算法要求:
攻击速度见上边5-A条
(攻击方速度-防御方速度+1)>Random%15
可见同等速度的话,有1/15的概率连击
武术家速度A,有好几个兵种速度只有2,连击概率:(10-2+1)/15=60%,有点夸张
具体代码:

QUOTE:
原帖由 ctermiii 于 2010-7-26 22:44 发表
004249BA  |.  2BDA          SUB EBX,EDX                              ;  二者速度差+1
004249BC  |.  43            INC EBX
004249BD      6A 0F         PUSH 0F
004249BF  |.  E8 64290200   CALL <EKD2Win.Random%Arg1>  
004249C4  |.  83C4 04       ADD ESP,4
004249C7  |.  3BD8          CMP EBX,EAX                              ;  (速度差+1)>15以内随机数,则连击
004249C9  |.  0F86 5E000000 JBE EKD2Win.00424A2D

E、连击判定成功的话,写入连击标识,下次不能连击
可以改成0,无限随机连击噢,不必担心不能结束,一是有概率,二是看下一条
具体代码:

QUOTE:
原帖由 ctermiii 于 2010-7-26 22:44 发表
004249CF      C705 18184500>MOV DWORD PTR DS:[451818],1              ;  写入标示1

F、即便连击判定成功,如果对方耐久力为0,则不会发生连击
具体代码:

QUOTE:
原帖由 ctermiii 于 2010-7-26 22:44 发表
004249EC  |.  85C0          TEST EAX,EAX
004249EE  |.  0F84 39000000 JE EKD2Win.00424A2D

附加:
10、由于没有设置兵种相克,我写了一个来满足一部分改造者的需求,基本思路是:
从0x42A66C开始:
00~27这40个兵种,需要一一给他设定一个大类,编号00~07,一共8大类,默认00

相克系数是0~255直接的任意值,我设定的结果是:
实际伤害=基本伤害x相克系数/100
这样可以有75%,65%这种不是整十的系数存在,设定系数的时候也不用绕弯子了,方便一点
最大是255%,最小0,如果嫌系数范围不够,也可以把100这个数缩小一下。
当然实现方法很多,这里仅仅是一个例子
0x42A62C开始为相克系数表格结构:
每8个一组,分别是第00,第01……第07类克制其他大类的系数;默认00,需要自己设定;
很明显,自己克制自己系数为1,也就是100%,因为我这个例子是除以100的,所以对应设置应该为64H;
如果你改了除数,记得系数也要同步改一下;
藤甲兵22H作为防御方时候单独计算;
具体代码见5楼:

QUOTE:
原帖由 ctermiii 于 2010-7-26 22:44 发表
http://www.xycq.net/forum/viewth ... page%3D1#pid2991468

[ 本帖最后由 ctermiii 于 2010-8-2 15:21 编辑 ]
作者: ctermiii    时间: 2010-7-26 22:44

游戏内容不熟悉,第3种伤害不明白是哪个计策或者兵种或者道具造成的,它的特性是伤害比较固定有3个不同等级:
伤害为:
1、50+0~15的随机值
2、75+0~25的随机值
3、150+0~50的随机值
跟兵种、等级、智力完全无关,但对藤甲兵、南蛮骑兵等伤害加强,对军师系、幻术师伤害减弱。
类似于英杰传的炸弹?但威力明显不如

[ 本帖最后由 ctermiii 于 2010-7-27 00:53 编辑 ]
作者: 阿尔法孝直    时间: 2010-7-26 22:56

好像只字不提“攻击速度”这个属性。那么攻击速度只是用来决定连击率的?

-------------------------------------------------------------------------------------------------------

QUOTE:
2、伤害A计算:

A、如果Random%(攻方攻击力x攻方所在地形因素/10)<防御方防御力x防御方地形因素/10/10
并且防御方没有混乱,那么伤害A=0,(猜测:那敌人是不会来打的,他会实现有个模拟运算攻击工程,见下边程序注释处)
B、如果Random%(攻方攻击力x攻方所在地形因素/10)>=防御方防御力x防御方地形因素/10/10
又分为:

B、1:如果(防御力x地形因素/10+1)/2>攻击方攻击力x攻击方所在地形因素/10
那么伤害A=1;
B、2:如果(防御力x地形因素/10+1)/2<=攻击方攻击力x攻击方所在地形因素/10
那么伤害A=防御力x地形因素/10-攻击力x地形因素/10/2
C、判断防御方兵种:
C、1:如果兵种代号为09,0A、0B时,伤害A=Ax75%;
C、2:如果兵种代号为1B、1C、1D时,伤害A=Ax150%;
C、3:如果兵种代号1E、1F时,伤害A=Ax50%;
C、4:如果兵种代号为22时,伤害A=1;

红字部分有问题,最好是:

A、如果Random%(攻方攻击力x攻方所在地形因素/10)>=防御方防御力x防御方地形因素/10/10
或者对方混乱了,那么又分为:

[ 本帖最后由 阿尔法孝直 于 2010-7-26 23:05 编辑 ]
作者: ctermiii    时间: 2010-7-26 22:58

先占个楼吧找个流畅的时候编辑吧,出差住这个酒店太卡了,一个网络50多个电脑,页面刷新都难
2楼的其实是问题,我没明白是哪个引起的伤害,编辑不了
作者: ctermiii    时间: 2010-7-26 22:59

下边是程序:

0042A5E9   .  83F9 22       CMP ECX,22                               ;  是否藤甲兵
0042A5EC   .  75 05         JNZ SHORT EKD2Win_.0042A5F3
0042A5EE   .  2BC0          SUB EAX,EAX
0042A5F0   .  40            INC EAX                                  ;  藤甲兵伤害为1
0042A5F1   .  EB 37         JMP SHORT EKD2Win_.0042A62A
0042A5F3   >  894D D8       MOV DWORD PTR SS:[EBP-28],ECX
0042A5F6   .  8B4D DC       MOV ECX,DWORD PTR SS:[EBP-24]
0042A5F9   .  E8 A2ECFDFF   CALL EKD2Win_.004092A0                   ;  攻击方兵种
0042A5FE   .  2BC9          SUB ECX,ECX
0042A600   .  8AC8          MOV CL,AL
0042A602   .  0FB681 6CA642>MOVZX EAX,BYTE PTR DS:[ECX+42A66C]       ;  攻击方大类
0042A609   .  8B4D D8       MOV ECX,DWORD PTR SS:[EBP-28]
0042A60C   .  0FB689 6CA642>MOVZX ECX,BYTE PTR DS:[ECX+42A66C]       ;  防御方大类
0042A613   .  8D04C8        LEA EAX,DWORD PTR DS:[EAX+ECX*8]         ;  相克系数相对位置,也是选8大类的好处,计算相对位置只3个字节就够了
0042A616   .  0FB680 2CA642>MOVZX EAX,BYTE PTR DS:[EAX+42A62C]       ;  相克系数(0~255),同大类请设64H,可设8个档次
0042A61D   .  8B4D F0       MOV ECX,DWORD PTR SS:[EBP-10]
0042A620   .  F7E9          IMUL ECX
0042A622   .  2BC9          SUB ECX,ECX
0042A624   .  2BD2          SUB EDX,EDX
0042A626   .  B1 64         MOV CL,64                                ;  最终伤害=基本伤害x相克系数/100
0042A628   .  F7F9          IDIV ECX
0042A62A   >  EB 68         JMP SHORT EKD2Win_.0042A694
0042A62C      00            DB 00                                    ;  0大类相克系数
0042A62D      00            DB 00
0042A62E      00            DB 00
0042A62F      00            DB 00
0042A630      00            DB 00
0042A631      00            DB 00
0042A632      00            DB 00
0042A633      00            DB 00
0042A634      00            DB 00                                    ;  1
0042A635      00            DB 00
0042A636      00            DB 00
0042A637      00            DB 00
0042A638      00            DB 00
0042A639      00            DB 00
0042A63A      00            DB 00
0042A63B      00            DB 00
0042A63C      00            DB 00                                    ;  2
0042A63D      00            DB 00
0042A63E      00            DB 00
0042A63F      00            DB 00
0042A640      00            DB 00
0042A641      00            DB 00
0042A642      00            DB 00
0042A643      00            DB 00
0042A644      00            DB 00                                    ;  3
0042A645      00            DB 00
0042A646      00            DB 00
0042A647      00            DB 00
0042A648      00            DB 00
0042A649      00            DB 00
0042A64A      00            DB 00
0042A64B      00            DB 00
0042A64C      00            DB 00                                    ;  4
0042A64D      00            DB 00
0042A64E      00            DB 00
0042A64F      00            DB 00
0042A650      00            DB 00
0042A651      00            DB 00
0042A652      00            DB 00
0042A653      00            DB 00
0042A654      00            DB 00                                    ;  5
0042A655      00            DB 00
0042A656      00            DB 00
0042A657      00            DB 00
0042A658      00            DB 00
0042A659      00            DB 00
0042A65A      00            DB 00
0042A65B      00            DB 00
0042A65C      00            DB 00                                    ;  6
0042A65D      00            DB 00
0042A65E      00            DB 00
0042A65F      00            DB 00
0042A660      00            DB 00
0042A661      00            DB 00
0042A662      00            DB 00
0042A663      00            DB 00
0042A664      00            DB 00                                    ;  7
0042A665      00            DB 00
0042A666      00            DB 00
0042A667      00            DB 00
0042A668      00            DB 00
0042A669      00            DB 00
0042A66A      00            DB 00
0042A66B      00            DB 00
0042A66C      00            DB 00                                    ;  00兵种开始,自定义大类0~7
0042A66D      00            DB 00
0042A66E      00            DB 00
0042A66F      00            DB 00
0042A670      00            DB 00
0042A671      00            DB 00
0042A672      00            DB 00
0042A673      00            DB 00
0042A674      00            DB 00
0042A675      00            DB 00
0042A676      00            DB 00
0042A677      00            DB 00
0042A678      00            DB 00
0042A679      00            DB 00
0042A67A      00            DB 00
0042A67B      00            DB 00
0042A67C      00            DB 00
0042A67D      00            DB 00
0042A67E      00            DB 00
0042A67F      00            DB 00
0042A680      00            DB 00
0042A681      00            DB 00
0042A682      00            DB 00
0042A683      00            DB 00
0042A684      00            DB 00
0042A685      00            DB 00
0042A686      00            DB 00
0042A687      00            DB 00
0042A688      00            DB 00
0042A689      00            DB 00
0042A68A      00            DB 00
0042A68B      00            DB 00
0042A68C      00            DB 00
0042A68D      00            DB 00
0042A68E      00            DB 00
0042A68F      00            DB 00
0042A690      00            DB 00
0042A691      00            DB 00
0042A692      00            DB 00
0042A693      00            DB 00
0042A694   >  5F            POP EDI

[ 本帖最后由 ctermiii 于 2010-7-27 00:43 编辑 ]
作者: ctermiii    时间: 2010-7-26 23:10

....................................
0042A514   .  8B4D DC       MOV ECX,DWORD PTR SS:[EBP-24]
0042A517   .  E8 05FEFFFF   CALL <EKD2Win.GetBingZhongDiXingXiuZheng>
0042A51C   .  8845 F8       MOV BYTE PTR SS:[EBP-8],AL
0042A51F   .  8B4D E4       MOV ECX,DWORD PTR SS:[EBP-1C]
0042A522   .  E8 FAFDFFFF   CALL <EKD2Win.GetBingZhongDiXingXiuZheng>
0042A527   .  8845 EC       MOV BYTE PTR SS:[EBP-14],AL
0042A52A   .  C745 F0 00000>MOV DWORD PTR SS:[EBP-10],0
0042A531   .  8B4D DC       MOV ECX,DWORD PTR SS:[EBP-24]
0042A534   .  E8 FEFBFFFF   CALL <EKD2Win.GetGongJi_>                                  ;  攻击方攻击力
0042A539   .  33C9          XOR ECX,ECX
0042A53B   .  8A4D F8       MOV CL,BYTE PTR SS:[EBP-8]
0042A53E   .  0FAFC1        IMUL EAX,ECX
0042A541   .  B9 0A000000   MOV ECX,0A
0042A546   .  2BD2          SUB EDX,EDX
0042A548   .  F7F1          DIV ECX
0042A54A   .  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX                               ;  攻击方攻击力x攻击方所在地形因素/10
0042A54D   .  8B4D E4       MOV ECX,DWORD PTR SS:[EBP-1C]
0042A550   .  E8 D2FCFFFF   CALL <EKD2Win.GetFangYu_>                                  ;  防御方防御力
0042A555   .  33C9          XOR ECX,ECX
0042A557   .  8A4D EC       MOV CL,BYTE PTR SS:[EBP-14]
0042A55A   .  0FAFC1        IMUL EAX,ECX
0042A55D   .  B9 0A000000   MOV ECX,0A
0042A562   .  2BD2          SUB EDX,EDX
0042A564   .  F7F1          DIV ECX
0042A566   .  8945 E0       MOV DWORD PTR SS:[EBP-20],EAX                              ;  防御力x地形因素/10
0042A569   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]                               ;  攻击方攻击力x攻击方所在地形因素/10
0042A56C   .  50            PUSH EAX                                                   ; /Arg1
0042A56D   .  E8 B6CD0100   CALL <EKD2Win.Random%Arg1>                                 ; \Random%Arg1
0042A572   .  83C4 04       ADD ESP,4
0042A575   .  8BC8          MOV ECX,EAX
0042A577   .  BB 0A000000   MOV EBX,0A
0042A57C   .  8B45 E0       MOV EAX,DWORD PTR SS:[EBP-20]
0042A57F   .  2BD2          SUB EDX,EDX
0042A581   .  F7F3          DIV EBX
0042A583   .  3BC8          CMP ECX,EAX                                                ; 随机数%(攻击力x地形因素/10)大于等于防御力x地形因素/10/10
0042A585   .  0F83 28000000 JNB EKD2Win.0042A5B3
0042A58B   .  837D 0C 00    CMP DWORD PTR SS:[EBP+C],0                  ;猜测为模拟伤害计算标识位
0042A58F   .  0F84 1E000000 JE EKD2Win.0042A5B3
0042A595   .  6A 10         PUSH 10                                                   
0042A597   .  8B4D E4       MOV ECX,DWORD PTR SS:[EBP-1C]                              ; |
0042A59A   .  E8 B1EBFDFF   CALL <EKD2Win.CheckIfSomeStatus>                           ; \CheckIfSomeStatus
0042A59F   .  85C0          TEST EAX,EAX
0042A5A1   .  0F85 0C000000 JNZ EKD2Win.0042A5B3
0042A5A7   .  33C0          XOR EAX,EAX
0042A5A9   .  E9 E6000000   JMP EKD2Win.0042A694
0042A5AE   .  E9 D9000000   JMP EKD2Win.0042A68C
0042A5B3   >  8B45 E0       MOV EAX,DWORD PTR SS:[EBP-20]                              ;  防御力x地形因素/10
0042A5B6   .  40            INC EAX
0042A5B7   .  C1E8 01       SHR EAX,1                                                  ;  (防御力x地形因素/10+1)/2
0042A5BA   .  3B45 FC       CMP EAX,DWORD PTR SS:[EBP-4]
0042A5BD   .  0F82 0C000000 JB EKD2Win.0042A5CF
0042A5C3   .  C745 F0 01000>MOV DWORD PTR SS:[EBP-10],1         ;(防御力x地形因素/10+1)/2大于攻击方攻击力x攻击方所在地形因素/10,只受1点伤害
0042A5CA   .  E9 0E000000   JMP EKD2Win.0042A5DD
0042A5CF   >  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
0042A5D2   .  8B4D E0       MOV ECX,DWORD PTR SS:[EBP-20]
0042A5D5   .  C1E9 01       SHR ECX,1
0042A5D8   .  2BC1          SUB EAX,ECX                                                ;  
0042A5DA   .  8945 F0       MOV DWORD PTR SS:[EBP-10],EAX               ; 小于的话,伤害为:攻击力x地形因素/10-防御力x地形因素/10/2
0042A5DD   >  8B4D E4       MOV ECX,DWORD PTR SS:[EBP-1C]
0042A5E0   .  E8 BBECFDFF   CALL <EKD2Win.GetBingZhong_>               ;  物理攻击只跟防御方兵种有关,除了下边特殊兵种,没有其他相克关系
0042A5E5   .  33C9          XOR ECX,ECX
0042A5E7   .  8AC8          MOV CL,AL
0042A5E9   .  894D D8       MOV DWORD PTR SS:[EBP-28],ECX
0042A5EC   .  E9 3C000000   JMP EKD2Win.0042A62D
0042A5F1   >  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]                              ; 防御方兵种代号9、A、B的时候伤害为75%
0042A5F4   .  8D0440        LEA EAX,DWORD PTR DS:[EAX+EAX*2]
0042A5F7   .  C1E8 02       SHR EAX,2
0042A5FA   .  8945 F0       MOV DWORD PTR SS:[EBP-10],EAX
0042A5FD   .  E9 8A000000   JMP EKD2Win.0042A68C
0042A602   >  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]                              ;  防御方兵种代号1B、1C、1D伤害达150%
0042A605   .  8D0440        LEA EAX,DWORD PTR DS:[EAX+EAX*2]
0042A608   .  C1E8 01       SHR EAX,1
0042A60B   .  8945 F0       MOV DWORD PTR SS:[EBP-10],EAX
0042A60E   .  E9 79000000   JMP EKD2Win.0042A68C
0042A613   >  C16D F0 01    SHR DWORD PTR SS:[EBP-10],1                                ;  兵种代号1E、1F被攻击只有伤害50%
0042A617   .  E9 70000000   JMP EKD2Win.0042A68C
0042A61C   >  C745 F0 01000>MOV DWORD PTR SS:[EBP-10],1                          ;  某个bt兵种,代号22H,只有1点伤害
0042A623   .  E9 64000000   JMP EKD2Win.0042A68C                                       ;  其他没有另外加成伤害
0042A628   .  E9 5F000000   JMP EKD2Win.0042A68C
0042A62D   >  836D D8 09    SUB DWORD PTR SS:[EBP-28],9
0042A631   .  837D D8 1E    CMP DWORD PTR SS:[EBP-28],1E
0042A635   .  0F87 51000000 JA EKD2Win.0042A68C
0042A63B   .  8B45 D8       MOV EAX,DWORD PTR SS:[EBP-28]                              ;  兵种代号-9
0042A63E   .  33C9          XOR ECX,ECX
0042A640   .  8A88 6DA64200 MOV CL,BYTE PTR DS:[EAX+42A66D]
0042A646   .  FF248D 4DA642>JMP DWORD PTR DS:[ECX*4+42A64D]
0042A64D   .  F1A54200      DD EKD2Win.0042A5F1                                        ;  分支表 被用于 0042A646
0042A651   .  02A64200      DD EKD2Win.0042A602
0042A655   .  13A64200      DD EKD2Win.0042A613
0042A659   .  1CA64200      DD EKD2Win.0042A61C
0042A65D   .  13A64200      DD EKD2Win.0042A613
0042A661   .  F1A54200      DD EKD2Win.0042A5F1
0042A665   .  13A64200      DD EKD2Win.0042A613
0042A669   .  8CA64200      DD EKD2Win.0042A68C
0042A66D   .  00            DB 00                                                      ;  分支 0042A64D 索引表
0042A66E   .  00            DB 00
0042A66F   .  00            DB 00
0042A670   .  07            DB 07
0042A671   .  07            DB 07
0042A672   .  07            DB 07
0042A673   .  07            DB 07
0042A674   .  07            DB 07
0042A675   .  07            DB 07
0042A676   .  07            DB 07
0042A677   .  07            DB 07
0042A678   .  07            DB 07
0042A679   .  07            DB 07
0042A67A   .  07            DB 07
0042A67B   .  07            DB 07
0042A67C   .  07            DB 07
0042A67D   .  07            DB 07
0042A67E   .  07            DB 07
0042A67F   .  01            DB 01
0042A680   .  01            DB 01
0042A681   .  01            DB 01
0042A682   .  02            DB 02
0042A683   .  02            DB 02
0042A684   .  07            DB 07
0042A685   .  07            DB 07
0042A686   .  03            DB 03
0042A687   .  04            DB 04
0042A688   .  05            DB 05
0042A689   .  07            DB 07
0042A68A   .  07            DB 07
0042A68B   .  06            DB 06
0042A68C   >  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]                              ;  最终伤害
0042A68F   .  E9 00000000   JMP EKD2Win.0042A694
0042A694   >  5F            POP EDI
0042A695   .  5E            POP ESI
0042A696   .  5B            POP EBX
0042A697   .  C9            LEAVE
0042A698   .  C2 0800       RETN 8

[ 本帖最后由 ctermiii 于 2010-7-27 15:34 编辑 ]
作者: ctermiii    时间: 2010-7-26 23:23

你标那条我改了,这样是清楚点,2个A不好看,我改成A-2了,呵呵
作者: 阿尔法孝直    时间: 2010-7-26 23:48



QUOTE:
3、判断是炮车类中心伤害还是反击,如果不是炮车类中心,或者为反击,则上边计算的A=A/2;

还有虎兵的直线攻击以及蛇兵的四面和象兵的八面攻击?

QUOTE:
2;如果有策略减伤buffer,给2次赌博机会

两次赌博全部附加上的时候才附加上?

[ 本帖最后由 阿尔法孝直 于 2010-7-26 23:59 编辑 ]
作者: ctermiii    时间: 2010-7-27 00:10

挑的好,我改一下,没写清楚,不过赌博那个,刚才意思表达错了,是第2次成功才算成功
不然没优势了

[ 本帖最后由 ctermiii 于 2010-7-27 00:56 编辑 ]
作者: 阿尔法孝直    时间: 2010-7-27 00:17

暴击出来了,现在就差连击判定了
作者: ctermiii    时间: 2010-7-27 00:19

嗯,还有上次的时候忘记等级因素造成的伤害里一个随机数%6的6了,这次加上
作者: ctermiii    时间: 2010-7-27 01:00

好了,这次应该没有错误了,在线编辑就是不好,没思考机会
作者: 阿尔法孝直    时间: 2010-7-27 01:04     标题: 回复 #12 ctermiii 的帖子

嗯,按照流程,攻击完了之后就是计算经验值了。
作者: 阿尔法孝直    时间: 2010-7-27 02:51



QUOTE:
原帖由 ctermiii 于 2010-7-26 22:44 发表
游戏内容不熟悉,第3种伤害不明白是哪个计策或者兵种或者道具造成的,它的特性是伤害比较固定有3个不同等级:
伤害为:
1、50+0~15的随机值
2、75+0~25的随机值
3、150+0~50的随机值
跟兵种、等级、智力完 ...

应该是是焦热书(落石书)/火龙书(山崩书)/猛火书(山洪书)
作者: lewulezo    时间: 2010-7-27 07:28

太强了,分析的好完整啊。

可见连击率和双方的攻击速度差有关,当双方攻击速度相差14时可以100%连击。

而暴击率只和攻击方的攻击速度有关,由于兵种攻击速度为2~10,因此其数值目前也就是在2%~10%之间。

还缺一个命中率的判定。是不是和攻击速度也有关系呢。
作者: ctermiii    时间: 2010-7-27 12:54



QUOTE:
原帖由 阿尔法孝直 于 2010-7-27 02:51 发表


应该是是焦热书(落石书)/火龙书(山崩书)/猛火书(山洪书)

原来是道具,这下明白了

经验值牵涉的东西比较少,我找时间看下。

QUOTE:
原帖由 lewulezo 于 2010-7-27 07:28 发表
太强了,分析的好完整啊。

可见连击率和双方的攻击速度差有关,当双方攻击速度相差14时可以100%连击。

而暴击率只和攻击方的攻击速度有关,由于兵种攻击速度为2~10,因此其数值目前也就是在2%~10%之间。
...

我前边写了,这个游戏似乎是没有命中率的,所以,物理伤害为0的时候会显示“某某没有收到伤害”,
策略伤害为0会显示“某某的策略失败了”,其实还是没有收到伤害的意思,只是把显示的字符串变化了一下而已,函数是同一个。
如果你的确遇到某某某攻击失败或者没有打中的字样的话,能提供一下相关文字字样吗?我可以再分析一下看看

[ 本帖最后由 ctermiii 于 2010-7-27 12:59 编辑 ]
作者: lewulezo    时间: 2010-7-27 14:41

原来如此,看来命中率是完全随机的东西,竟然全是RP,汗。。
作者: lewulezo    时间: 2010-7-27 14:56

仔细看了一下发现一个问题

QUOTE:
A、2-2:如果(防御力x地形因素/10+1)/2<=攻击方攻击力x攻击方所在地形因素/10
那么伤害A=防御力x地形因素/10-攻击力x地形因素/10/2

刨开地形因素不管,
伤害值最终是防御力-(1/2攻击力)?

这样说来,难道是防御力越高,则伤害值越高?有点奇怪啊。
作者: 阿尔法孝直    时间: 2010-7-27 15:01     标题: 回复 #18 lewulezo 的帖子

应该是笔误,把攻击力和防御力对调一下。
作者: lewulezo    时间: 2010-7-27 15:09

上面那么大段的,我大概理解了一下。
======================================
就是说,命中率由攻击力和对方防御力共同决定。(假定已经把攻防地形修正过了)

命中率是拿防御力除以10来和攻击力作比较的。换句话说:

当攻击力和对方防御力差不多时,命中率是90%
当攻击力两倍于对方防御力时,命中率是95%
当攻击力只有对方防御力一半时,命中率是80%
当攻击力只有对方防御力的十分之一时,命中率=0%
======================================
如果命中,伤害数值的基本值,是由攻击力和对方防御力共同决定的。但是实际上防御力是除以二以后和攻击力去比较的。

如果攻击力还不到对方防御力的一半,那么随你怎么打吧,伤害都只有1。

大部分的情况,是用攻击力减去防御力的一半,得到最终的伤害值。

[ 本帖最后由 lewulezo 于 2010-7-27 15:11 编辑 ]
作者: godtype    时间: 2010-7-27 15:12

路过一下强帖。
经验值的话,以前我找能力成长的时候是找到过一些不确定的位置,只是因为讨厌孔明传不能在战场中存档,所以没再看下去了。
作者: lewulezo    时间: 2010-7-27 15:16

有没有办法把孔明传的随机成长改成固定成长。或者把随机因素减为0。
作者: 阿尔法孝直    时间: 2010-7-27 15:18     标题: 回复 #21 godtype 的帖子

孔明传里面,当伤害>0时,经验值算法和英杰传完全一样。但是攻击不中时的经验值算法还未知。

注:敌人不能获得经验值。
作者: ctermiii    时间: 2010-7-27 15:37

啊,抱歉,伤害那个攻击和防御的确反了,我一般有现场的字段就去复制,结果放错位置了而没发现,也没核实这样防御越高越受伤的不可能状态。
已经改了,兵种特效那里也增加了一句说明,无论攻击成功与否,特性都会照样进行判断;
所以这两个兵种可真霸道。
作者: lewulezo    时间: 2010-7-28 11:05

能不能顺便分析一下,关于策略对于地形和天气依赖关系呢?
作者: ctermiii    时间: 2010-7-28 11:56

那要分情况了,是攻击性策略还是补给性策略还是什么。我干脆贴个策略分析吧,慢慢完善。
作者: 阿尔法孝直    时间: 2010-7-29 00:52

个人觉得,算出物理攻击命中率并不是一件不可能的事,每一步都能得到各个结果自有的发生概率,之后把所有可能枚举出来即可。
作者: ctermiii    时间: 2010-7-29 13:13

嗯,主要是个分段函数
要列表的话,可以像20楼lewulezo那样把攻G防F和各自的地形因素考虑起来算一个综合值。
G<F/10,伤害为0,不命中
F/10=<G<(F+1)/2,伤害1,命中
G>=(F+1)/2,伤害G-F/2,命中
作者: 阿尔法孝直    时间: 2010-7-29 13:14     标题: 回复 #28 ctermiii 的帖子

伤害为0远不止以上几种可能,例如伤害为1,但是反击/2,也会变0;再如伤害为1,但是战车系衰减为75%,也会变0。

目前正在写一个计算器,计算一次攻击所有可能的结果出现的概率。

[ 本帖最后由 阿尔法孝直 于 2010-7-29 13:16 编辑 ]
作者: ctermiii    时间: 2010-7-29 13:27

噢,那你说的是综合因素,我以为是只算攻击伤害这一部分呢;
那要考虑等级因素了,等级因素的话,伤害增加的不提,伤害减少这个就比较麻烦
是Random%(防御方等级-1)%6
当伤害小于5的时候,只能拼人品了,这个随机性太大了点。
作者: 阿尔法孝直    时间: 2010-7-29 18:02

写了一个,发现算法不好,如果攻方双方等级都很高,那么计算一次消耗的时间可能要半个甚至一个小时甚至还要多。
每次计算随机数时都做成循环,为了计算随机数取任何一个值时的结果,那么循环次数最高为:


(255+32)*3\2*13\10*99^4=53,697,316,959
这个……
作者: 阿尔法孝直    时间: 2010-7-29 18:16

刚刚发现有逻辑错误:

QUOTE:
2、伤害A计算:
A、1 如果Random%(攻方攻击力x攻方所在地形因素/10)<防御方防御力x防御方地形因素/10/10
并且防御方没有混乱,那么伤害A=0,(猜测:攻击方如果是敌人,那敌人是不会来打的,他似乎会实现有个模拟运算攻击过程,见下边程序注释处)

A、2 如果Random%(攻方攻击力x攻方所在地形因素/10)>=防御方防御力x防御方地形因素/10/10
那么又分为:
A、2-1:如果(防御力x地形因素/10+1)/2>攻击方攻击力x攻击方所在地形因素/10
那么伤害A=1;
A、2-2:如果(防御力x地形因素/10+1)/2<=攻击方攻击力x攻击方所在地形因素/10
那么伤害A=攻击力x地形因素/10-防御力x地形因素/10/2
B、判断防御方兵种:
B、1:如果兵种代号为09,0A、0B时,伤害A=Ax75%;
B、2:如果兵种代号为1B、1C、1D时,伤害A=Ax150%;
B、3:如果兵种代号1E、1F时,伤害A=Ax50%;
B、4:如果兵种代号为22时,伤害A=1;

一旦红字部分判定成功,伤害=0,那么后面的 第2-B步 和 第6步 应该不再计算(其他步骤因为只乘系数不做加减法,所以不会动摇0伤害)。否则就会出现本应该有很大伤害的攻击,结果出现只扣1~5的HP。

[ 本帖最后由 阿尔法孝直 于 2010-7-29 18:17 编辑 ]
作者: ctermiii    时间: 2010-7-29 21:51

噢,是这样的,如果基本伤害为0的话,直接退出基本伤害计算函数,也不再进行全力一击和等级因素的判断。
其他判断还是照旧进行。
对于计算伤害,我有另外一个想法,我看看能不能实现先。
好像比较难。

[ 本帖最后由 ctermiii 于 2010-7-29 22:10 编辑 ]
作者: 阿尔法孝直    时间: 2010-7-29 23:17



QUOTE:
A、2-1:如果(防御力x地形因素/10+1)/2>攻击方攻击力x攻击方所在地形因素/10
那么伤害A=1;
A、2-2:如果(防御力x地形因素/10+1)/2<=攻击方攻击力x攻击方所在地形因素/10
那么伤害A=攻击力x地形因素/10-防御力x地形因素/10/2

又发现算法的一个问题:

当(防御力x地形因素/10+1)/2 与 攻击方攻击力x攻击方所在地形因素/10 恰好相等时,伤害=攻击力x地形因素/10-防御力x地形因素/10/2,等于0
本来这步应该是为了保证伤害至少为1,结果……

QUOTE:
0042A5B7   .  C1E8 01       SHR EAX,1                                                  ;  (防御力x地形因素/10+1)/2
0042A5BA   .  3B45 FC       CMP EAX,DWORD PTR SS:[EBP-4]
0042A5BD   .  0F82 0C000000 JB EKD2Win.0042A5CF
0042A5C3   .  C745 F0 01000>MOV DWORD PTR SS:[EBP-10],1         ;(防御力x地形因素/10+1)/2大于攻击方攻击力x攻击方所在地形因素/10,只受1点伤害
0042A5CA   .  E9 0E000000   JMP EKD2Win.0042A5DD
0042A5CF   >  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
0042A5D2   .  8B4D E0       MOV ECX,DWORD PTR SS:[EBP-20]
0042A5D5   .  C1E9 01       SHR ECX,1
0042A5D8   .  2BC1          SUB EAX,ECX                                                ;  
0042A5DA   .  8945 F0       MOV DWORD PTR SS:[EBP-10],EAX               ; 小于的话,伤害为:攻击力x地形因素/10-防御力x地形因素/10/2
0042A5DD   >  8B4D E4       MOV ECX,DWORD PTR SS:[EBP-1C]

原来你把JB看成JBE了……

---------------------------------------------------------------------------------------

另外还有一个需要确认一下,就是间接攻击(反击、炮车虎兵等的非第一人攻击)对0x22号兵种(就是藤甲兵)的伤害是否永远为0,无论攻击力多少。

关于这个,我仔细看了一下IDA:

signed int __thiscall sub_4238AF(int this, unsigned int a2)
{
  signed int result; // eax@26
  unsigned int v3; // ebx@6
  int v4; // eax@10
  int v5; // eax@12
  unsigned __int8 v6; // al@14
  unsigned int v7; // ebx@14
  unsigned __int8 v8; // al@14
  unsigned __int8 v9; // al@16
  unsigned __int8 v10; // al@17
  unsigned int v11; // eax@17
  int v12; // [sp+Ch] [bp-14h]@1
  char *v13; // [sp+14h] [bp-Ch]@1
  int v14; // [sp+18h] [bp-8h]@1
  signed int v15; // [sp+1Ch] [bp-4h]@1
  signed int v16; // [sp+10h] [bp-10h]@1

  v12 = this;
  v13 = (char *)&dword_4556E8 + 54 * sub_409130();
  v14 = (int)((char *)&dword_4556E8 + 54 * sub_409130());
  v15 = 0;
  v16 = 0;
  switch ( *(_BYTE *)(v12 + 18) )
  {
    case 1:
      v15 = sub_42A4AD(*(_DWORD *)(v12 + 4 * *(_BYTE *)(v12 + 16)), v14, 1);
      if ( a2 >= 1 || *(_BYTE *)(v12 + 19) == 1 )
        v15 /= 2;
      sub_423769(v12);
      if ( v15 > 0 )
      {
        v3 = (unsigned __int8)sub_42A396(*(_DWORD *)(v12 + 4 * *(_BYTE *)(v12 + 16)));
        if ( v3 > sub_447328(100) )
        {
          v15 = 3 * v15 / 2;
          v16 = 1;
        }
      }
      break;
    case 2:
      v4 = v12;
      LOBYTE(v4) = *(_BYTE *)(v12 + 19);
      v15 = sub_4087E1(v14, v4);
      break;
    case 3:
      v5 = v12;
      LOBYTE(v5) = *(_BYTE *)(v12 + 19);
      v15 = sub_408907(v14, v5);
      break;
  }
  if ( v15 > 0 )
  {
    v6 = sub_409280();
    v7 = sub_447328(v6);
    v8 = sub_409280();
    if ( v7 >= sub_447328(v8) && v16 != 1 )
    {
      v10 = sub_409280();
      v11 = sub_447328(v10);
      v15 = sub_4472CB(v15, v11 % 6);
    }
    else
    {
      v9 = sub_409280();
      v15 += sub_447328(v9) % 6u;
    }
  }
  if ( sub_409220() == 1 )
  {
    if ( !sub_40BAB0() )
      v15 = 8 * v15 / 10;
    if ( sub_40BAB0() == 2 )
      v15 = 12 * v15 / 10;
  }
  if ( v16 == 1 )
  {
    if ( v15 > 0 )
    {
      sub_409580();
      sub_438F35(0, (char)(char *)dword_45181C);
    }
  }
  result = *(_DWORD *)(v12 + 4 * *(_BYTE *)(v12 + 17) + 26);
  if ( result >= v15 )
    result = v15;
  *(_DWORD *)(v12 + 42) = result;
  return result;
}

就是说,要等反击除以2算完之后才判断是否为零,若等于零则不再算下面的。

[ 本帖最后由 阿尔法孝直 于 2010-7-29 23:51 编辑 ]
作者: ctermiii    时间: 2010-7-30 13:18

你对数字真的很敏感啊,哈哈
伤害为0的地方还真多,等我出差回去再看看,现在有时间没时间的不定。
作者: 阿尔法孝直    时间: 2010-7-30 17:04

写了一个计算工具,大家看看有没问题。

[ 本帖最后由 阿尔法孝直 于 2010-8-1 19:08 编辑 ]

附件: 物理伤害计算.rar (2010-8-1 19:08, 585.48 K) / 该附件被下载次数 187
http://xycq.org.cn/forum/attachment.php?aid=100139
作者: ctermiii    时间: 2010-7-30 18:27

你这个程序注册了也打不开。
---------------------------
孔明传物理伤害计算器
---------------------------
Run-time error '76':

Path not found
---------------------------
确定   
---------------------------
我放到游戏目录下也不行。
作者: 阿尔法孝直    时间: 2010-7-30 18:58

我的错,缺了一个文件,已经在原帖换好了。

[ 本帖最后由 阿尔法孝直 于 2010-7-30 20:58 编辑 ]
作者: ctermiii    时间: 2010-8-1 15:18

伤害为0的话,会越过等级相关的计算,但对是否我军还是敌军,是不会越过的,第一帖已经改了;

但你这个文件还是打不开。

我直接模拟了一次伤害计算来显示,

其他因素都是不变的,只有随机数变化,所以模拟前把随机数保存起来,模拟后再恢复。

可保证伤害一定跟模拟相同。

全力一击也可以模拟到,会直接以伤害加强的形式反映在伤害结果里。
作者: 阿尔法孝直    时间: 2010-8-1 15:35

再度泪奔,又改了一下,如果还不行那我要跳楼了。
作者: 阿尔法孝直    时间: 2010-8-1 15:39



QUOTE:
原帖由 ctermiii 于 2010-8-1 15:18 发表
伤害为0的话,会越过等级相关的计算,但对是否我军还是敌军,是不会越过的,第一帖已经改了;

但你这个文件还是打不开。

我直接模拟了一次伤害计算来显示,

其他因素都是不变的,只有随机数变化,所以 ...

是否会越过我军还是敌军对结果无任何影响,反正结果都是0,判定敌我也就是乘个系数,0乘任何数都是0。
作者: ctermiii    时间: 2010-8-1 18:17

恭喜,这下不用跳楼了
不过连击只跟速度有关,你的计算器算出来,比如88大武术家级对5运粮队级,竟然100%连击
奇怪,就算速度最慢的武将被减速,最高也只有(10-2/2+1)/15=67%的概率啊
判断是否我军跟伤害没关系,只是把运算过程还原一下

我发现攻击之后,除非人物升级能力变化过程取随机数,不然随机数A一直到连击判定都保持不变;
如果连击导致随机数为B,造成伤害之前B还是不变。

那这个模拟过程除了模拟暴击,连击也能算出来了,我看看是否要在补丁里加入本次攻击是否连击的判断,那连击伤害也很容易算出来了。

[ 本帖最后由 ctermiii 于 2010-8-1 18:20 编辑 ]
作者: 阿尔法孝直    时间: 2010-8-1 19:08



QUOTE:
原帖由 ctermiii 于 2010-8-1 18:17 发表
恭喜,这下不用跳楼了
不过连击只跟速度有关,你的计算器算出来,比如88大武术家级对5运粮队级,竟然100%连击
奇怪,就算速度最慢的武将被减速,最高也只有(10-2/2+1)/15=67%的概率啊
判断是否我军跟伤害没关 ...

重新改了一下,再看看行不行了。
作者: ctermiii    时间: 2010-8-2 17:02

没有我的用起来方便,还要输数据进去




欢迎光临 轩辕春秋文化论坛 (http://xycq.org.cn/forum/) Powered by Discuz! 5.0.0