2010-6-14 01:11
阿尔法孝直
现在可以了,多谢。
战役的名字存在hexzmap.e2的末尾。(需要解压)
“[color=Red]玉[/color]溪峰战役” 错写成 “[color=Red]五[/color]溪峰战役” 的错误就可以从那里修正。
[color=Silver][[i] 本帖最后由 阿尔法孝直 于 2010-6-14 12:30 编辑 [/i]][/color]
2010-6-14 14:55
lewulezo
有解压过的hexzmap.e2文件吗
2010-6-16 22:19
lewulezo
修改器最近更新:
敌军出场设定增加了AI的设定
商店售卖道具修改
只要更新jar文件即可。
非常感谢阿尔法孝直的提供的解压HEXZMAP.rar文件。不过我暂时还没有采用读取其中的战役名称。
[color=Silver][[i] 本帖最后由 lewulezo 于 2010-6-16 22:22 编辑 [/i]][/color]
2010-6-16 22:58
阿尔法孝直
1、不知能不能增加修改存档文件里面的金钱、红心、孔明的位置(在大地图还是某城的议事厅等地点)、剧本的位置(就是运行到游戏的哪里了)
2、能不能共享源代码?
2010-6-16 23:58
lewulezo
[quote]原帖由 [i]阿尔法孝直[/i] 于 2010-6-16 22:58 发表
1、不知能不能增加修改存档文件里面的金钱、红心、孔明的位置(在大地图还是某城的议事厅等地点)、剧本的位置(就是运行到游戏的哪里了)
2、能不能共享源代码? [/quote]
1. 那几个位置具体在哪里我还没细看。如果有现成的结果,那我可以马上加进去。
2. 因为陆陆续续改的关系,目前的代码稍微有点乱,我想稍微重构一下再分享出来。
目前界面有些地方输入起来感觉不太顺手,易用性不好。我考虑调整一下。
2010-6-17 11:13
lewulezo
我现在最想改的是孔明传中的兵种相克设置。
我对孔明传中兵种相克的弱化感觉太不爽了,不知道有高手能分析一下吗。
2010-6-17 11:37
阿尔法孝直
回复 #127 lewulezo 的帖子
干脆就分析一下整个物理攻击伤害公式吧。
我一直找不到函数入口。
2010-6-18 20:30
阿尔法孝直
[url]http://www.xycq.net/forum/viewthread.php?tid=192374[/url]
孔明传的秘籍,偶尔发现的,但总是找不准触发的充要条件。麻烦分析一下。
2010-6-22 01:28
阿尔法孝直
既然攻击速度关系到命中率/回避率、双击率/被双击率,那么暴击率/被暴击率由什么决定呢?
2010-6-22 11:54
lewulezo
[quote]原帖由 [i]阿尔法孝直[/i] 于 2010-6-22 01:28 发表
既然攻击速度关系到命中率/回避率、双击率/被双击率,那么暴击率/被暴击率由什么决定呢? [/quote]
这个还真看不出。我没有实测过各种兵种互相攻击时的暴击率差异。目前凭感觉似乎是随机的。曹操传有士气的设定,但是孔明传里没有发现过。
关于兵种的攻击速度,虽然是隐藏的属性,但是有个策略叫“牵制”,是用来削弱攻击速度的。所以对玩家来说,并不是算是完全隐藏的。
但是暴击率还真没有任何其他地方有提示。我怀疑孔明传中尚未加入士气类的因素。
2010-6-22 12:10
阿尔法孝直
一般来说,练级时尽量减少暴击,使得
经验值/伤害 尽可能高。
在不考虑补给频率的情况下,一般反击出连击越多越好,但又要少暴击。
这时候“牵制”就很有用了。
---------------------------------------------------------------------
暴击相关的属性有没有可能隐藏在文件另一段数据中?
[color=Silver][[i] 本帖最后由 阿尔法孝直 于 2010-6-23 11:50 编辑 [/i]][/color]
2010-6-23 11:48
lewulezo
我还真没想过那么多。实际上我一般都不特意练级。为了保持难度,总是压制己方将领的等级不高于敌人2级以上。要想打压赵云还真难,除非从来不派他上场。
至于暴击率的问题,不同的兵种,暴击率真的不一样吗?
2010-6-23 11:50
阿尔法孝直
回复 #133 lewulezo 的帖子
同问
2010-6-23 12:46
lewulezo
恐怕只有等高人来做战斗函数分析才能得到结论了吧。
说实话,我以前从没想过能这么改孔明传。直到看见有大大破解的孔明传exe出现。
我喜爱孔明传主要是因为它的剧情。一直想自己把诸多不合理的设定修改一下,现在已经离实现迈进了许多了。
2010-7-16 11:36
acmilan3102
很强悍的技术贴,慢慢学习中。
2010-7-16 14:45
lewulezo
孔明传引擎的缺陷:
孔明传(PC版)这个游戏,和曹操传不同的是,他的将领之间的差距只有初始数值不同,而升级的得到的提升却没有任何差异。比如说同样是骑兵,用赵云对比一个无名骑兵队,升级时候提升的武力值,除去随机因素外就都一样。
也就是说,越到后面,名将和普通武将的差距就越小。而且因为随机波动,甚至会出现同等级下,名将的数值还不如一个平庸武将的结果。这个设定真是让人郁闷。PS/GBA版本为了改变这个问题把升级的随机因素去掉,改成固定值。但是这样一来就不得不完全抛弃那些武力果之类额外提升固定属性的设定。
而且由于初期初始数字差距比较大,所以名将砍杂毛小兵一刀一个。但是到了后期40级以上时候,通过升级得到的属性值已经占了主导地位,武将初期数字的差异已经显得非常不明显。
还有一个问题就是属性255封顶,导致50级之后光升级,除了血量还在上升以外别的数字满了没有任何提升。这样导致高等级后面练级就没啥意义了。
还有就是每关出场只能有30个敌人。比起曹操传的每关最多80个敌人的设定少多了。而且似乎也没有武将复活的设定。这样导致剧本增强受到了一定的限制。
[color=Silver][[i] 本帖最后由 lewulezo 于 2010-7-16 14:50 编辑 [/i]][/color]
2010-7-17 13:52
ctermiii
04 05 06 04 05 06 05 06 07 03 03 03 02 02 02 05
06 07 04 04 04 05 05 08 0A 06 08 03 03 03 05 07
07 07 05 05 02 05 04 05
exe里0x451F50的位置这40个数是什么?
台词:某某某全力一击的时候,会先取对应兵种的这个数,比如骑兵(代号06)取第7个数05
然后取100以内的随机数,如果随机数小于这个05,就发生:“某某某全力一击”。
某个状态下,这个值会被/2
0042397D |. 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14]
00423980 |. 8B0C88 MOV ECX,DWORD PTR DS:[EAX+ECX*4]
00423983 |. E8 0E6A0000 CALL 0042A396 ;[color=Red]这里就是取0x451F50表格里的某个兵种对应的数并查看武将状态[/color]
00423988 |. 33DB XOR EBX,EBX
0042398A |. 8AD8 MOV BL,AL ;[color=Red]这个就是上边提到的结果05[/color]
0042398C |. 6A 64 PUSH 64
0042398E |. E8 95390200 CALL 00447328 ;[color=Red]这两个是求100以内的随机数[/color]
00423993 |. 83C4 04 ADD ESP,4
00423996 |. 3BD8 CMP EBX,EAX
00423998 |. 0F86 16000000 JBE EKD2Win.004239B4 [color=Red] ; 全力一击的概率[/color]
0042399E |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004239A1 |. 8D0440 LEA EAX,DWORD PTR DS:[EAX+EAX*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
2010-7-17 13:57
阿尔法孝直
这么说,暴击的概率只与攻击方兵种有关?
[quote]原帖由 [i]ctermiii[/i] 于 2010-7-17 13:52 发表
某个状态下,这个值会被/2
[/quote]
这么说,“牵制”策略不仅影响攻击速度,还影响暴击率?
[color=Silver][[i] 本帖最后由 阿尔法孝直 于 2010-7-17 14:09 编辑 [/i]][/color]
2010-7-17 14:52
ctermiii
从代码来看只有这种情况,只跟兵种和随机数有关;你可以把哪个64H改成比表格里最小的数还小的,比如改为02,除了打不中之外,次次全力一击
2010-7-18 00:15
阿尔法孝直
计算随机数的函数:
sub_447328 proc near
arg_0= dword ptr 8
push ebp
mov eax, 0
mov ebp, esp
cmp [esp+arg_0], 2
jb short loc_447343
---------------------------------------------
unsigned int __cdecl sub_447328(unsigned int a1)
{
unsigned int result; // eax@1
result = 0;
if ( a1 >= 2 )
result = sub_4472FC() % a1;
return result;
}
---------------------------------------------------
显然采用求余算法,再看看调用的4472FC:
---------------------------------------------------
sub_4472FC proc near
mov eax, dword_453B20
imul eax, 41C64E6Dh
add eax, 3039h
mov dword_453B20, eax
and eax, 7FFF0000h
shr eax, 10h
retn
sub_4472FC endp
---------------------------------------------------
unsigned int __cdecl sub_4472FC()
{
dword_453B20 = 1103515245 * dword_453B20 + 12345;
return ((1103515245 * dword_453B20 + 12345) & 0x7FFF0000u) >> 16;
}
---------------------------------------------------
可见这是一个迭代算法,那么,知道了当前的随机数,就可以直接算出下一个随机数;
而0x453B20处在每一战开始时都恢复成 01 00,即双字节的0x00 01,那么每战随机序列都是相同的。
于是就可以解释为什么打法及结果可以百分之百重现的问题。
2010-7-18 01:06
阿尔法孝直
用IDA看了一下138楼的代码,发现这是其中的一小部分,其完整代码为:
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
char v6; // al@14
unsigned int v7; // ebx@14
char v8; // al@14
char v9; // al@16
char v10; // al@17
unsigned int v11; // eax@17
int v12; // [sp+Ch] [bp-14h]@1
int 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 = (int)((char *)&dword_4556E8 + 54 * sub_409130(*(_DWORD *)(this + 4 * *(_BYTE *)(this + 16))));
v14 = (int)((char *)&dword_4556E8 + 54 * sub_409130(*(_DWORD *)(v12 + 4 * *(_BYTE *)(v12 + 17))));
v15 = 0;
v16 = 0;
switch ( *(_BYTE *)(v12 + 18) )
{
case 1:
v15 = [color=Red][color=Blue]sub_42A4AD[/color](*(_DWORD *)(v12 + 4 * *(_BYTE *)(v12 + 16)), v14, 1); [/color][color=Green]//怀疑这个是攻击伤害函数!!![/color]
if ( a2 >= 1 || *(_BYTE *)(v12 + 19) == 1 ) [color=Green]//如果是反击[/color]
v15 /= 2; [color=Green]//反击伤害减半[/color]
sub_423769(v12);
if ( v15 > 0 )
{
v3 = (unsigned __int8)sub_42A396(*(_DWORD *)(v12 + 4 * *(_BYTE *)(v12 + 16)));
if ( v3 > sub_447328(0x64u) ) [color=Green]//如果是暴击[/color]
{
v15 = 3 * v15 / 2; [color=Green] //暴击伤害为150%[/color]
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(v14);
v7 = sub_447328((unsigned __int8)v6);
v8 = sub_409280(v13);
if ( v7 >= sub_447328((unsigned __int8)v8) && v16 != 1 )
{
v10 = sub_409280(v14);
v11 = sub_447328((unsigned __int8)v10);
v15 = sub_4472CB(v15, v11 % 6);
}
else
{
v9 = sub_409280(v13);
v15 += sub_447328((unsigned __int8)v9) % 6; [color=Green]//原来攻击伤害的随机加成是0~5的随机数[/color]
}
}
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;
}
------------------------------------------------------------------------------------
unsigned int __thiscall [color=Blue]sub_42A4AD[/color](int this, int a2, int a3)
{
unsigned int result; // eax@2
int v4; // eax@1
char v5; // al@1
int v6; // [sp+10h] [bp-24h]@1
char v7; // [sp+28h] [bp-Ch]@1
char *v8; // [sp+18h] [bp-1Ch]@3
char *v9; // [sp+1Ch] [bp-18h]@3
unsigned __int8 v10; // [sp+2Ch] [bp-8h]@3
unsigned __int8 v11; // [sp+20h] [bp-14h]@3
unsigned int v12; // [sp+24h] [bp-10h]@3
unsigned int v13; // [sp+30h] [bp-4h]@3
unsigned int v14; // [sp+14h] [bp-20h]@3
unsigned int v15; // [sp+Ch] [bp-28h]@10
v6 = this;
v4 = sub_41EF0C(a2);
v5 = sub_429061(v4);
v7 = v5;
if ( (unsigned __int8)v5 == 255 )
{
result = 0;
}
else
{
v8 = (char *)&dword_46C098 + 23 * (unsigned __int8)v7;
v9 = (char *)&dword_4556E8 + 54 * *(_DWORD *)v6;
v10 = sub_42A321();
v11 = sub_42A321();
v12 = 0;
v13 = (unsigned int)v10 * sub_42A137() / 0xA;
v14 = (unsigned int)v11 * sub_42A227() / 0xA;
if ( sub_447328(v13) >= v14 / 0xA || !a3 || sub_409150(16) )
{
if ( (v14 + 1) >> 1 < v13 )
v12 = v13 - (v14 >> 1);
else
v12 = 1;
v15 = (unsigned __int8)sub_4092A0();
v15 -= 9;
if ( v15 <= 0x1E )
{
switch ( *((_BYTE *)byte_42A66D + v15) ) [color=Green]//这个会不会是求兵种相克的修正?[/color]
{
case 0:
case 5:
v12 = 3 * v12 >> 2;
break;
case 1:
v12 = 3 * v12 >> 1;
break;
case 2:
case 4:
case 6:
v12 >>= 1;
break;
case 3:
v12 = 1; [color=Green]//藤甲兵??[/color]
break;
case 7:
break;
}
}
result = v12;
}
else
{
result = 0;
}
}
return result;
}
[color=Silver][[i] 本帖最后由 阿尔法孝直 于 2010-7-18 11:29 编辑 [/i]][/color]
2010-7-18 11:59
ctermiii
IDA真强大……
光荣的随机数,从三国志4~9(我只改过这些,其他不知道)以及英杰传系列,随机数都是差不多的算法;
肯定有41C64E6DH和3039H这两个数并且一前一后,所以我直接去搜索这两个数,先确认随机数函数是哪个,对它下断点,然后进游戏攻击一下,断下来就肯定是相关的函数了,剩下的就是分析程序了。
你说哪个随机数的问题,只能尽量多的让处理玩家动作的函数调用随机函数,才有现在经常说的改变行动顺序来改变随机结果的办法;但早期系统资源有限,如果调用太多会影响系统响应速度,所以只有某些情况下才调用;
你可以改啊,改成每战开始,随机数不复位就行。
不过据我所知,这个0001不是每战开始复位的,而是每次运行exe文件的时候才这样;
[color=Silver][[i] 本帖最后由 ctermiii 于 2010-7-18 12:10 编辑 [/i]][/color]
2010-7-18 12:01
阿尔法孝直
回复 #143 ctermiii 的帖子
你先看看0x0042A4AD开始的这段,我怀疑这儿是攻击伤害的算法
2010-7-18 12:21
阿尔法孝直
回复 #143 ctermiii 的帖子
试了第1战,第1回合(赵云不动,直接回合结束转到敌军行动,1骑兵攻击赵云-2血,被赵云反击连击剩4血;另一骑兵攻击赵云不中被赵云反击-23血)之后总撤退,再次执行第1回合,结果和前面的相同。证明总撤退后随机数复位。
[color=Silver][[i] 本帖最后由 阿尔法孝直 于 2010-7-18 12:23 编辑 [/i]][/color]
2010-7-18 12:40
ctermiii
嗯,那跟战旗类有关,其他界面都是剧情没有战斗,可能没有参与随机数;
像三国志类的,一般这个随机数会写入存档的
2010-7-18 14:27
ctermiii
截取一小部分:
这里应该只是物理攻击伤害吧,我的诸葛亮才1级,没策略,没试。
这个伤害算出来后,返回我之前贴的函数后边计算,
最最终的伤害是你已经写出来的那些:
1、致命一击
2、反击
3、加上或者减去等级因素的随机值
结论是:
除了几个特殊兵种怕或者不怕物理攻击外,没有什么相克关系
可能是用兵种成长特性和初始特性来决定所谓的相克了
....................................
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 ; [color=Red] 随机数%(攻击力x地形因素/10)大于等于防御力x地形因素/10/10则往下走[/color]
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 ;[color=Red] /这个不知道什么状态,如果满足前面条件,此状态下不会受伤[/color]
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 [color=Red];(防御力x地形因素/10+1)/2大于攻击方攻击力x攻击方所在地形因素/10,只受1点伤害[/color]
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 ; [color=Red]小于的话,伤害为:防御力x地形因素/10-攻击力x地形因素/10/2[/color]
0042A5DD > 8B4D E4 MOV ECX,DWORD PTR SS:[EBP-1C]
0042A5E0 . E8 BBECFDFF CALL <EKD2Win.GetBingZhong_> ; [color=Red]物理攻击只跟防御方兵种有关,除了下边特殊兵种,没有其他相克关系[/color]
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] ; [color=Red] 防御方兵种代号9、A、B的时候伤害为75%[/color]
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] ; [color=Red]防御方兵种代号1B、1C、1D伤害达150%[/color]
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 ; [color=Red]兵种代号1E、1F被攻击只有伤害50%[/color]
0042A617 . E9 70000000 JMP EKD2Win.0042A68C
0042A61C > C745 F0 01000>MOV DWORD PTR SS:[EBP-10],1 ; [color=Red]某个bt兵种,代号22H,只有1点伤害[/color]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
[color=Silver][[i] 本帖最后由 ctermiii 于 2010-7-18 14:36 编辑 [/i]][/color]
2010-7-18 21:34
lewulezo
抛砖引玉,沉寂几天,这帖子终于迎来分析高人。
我想如果在把伤害额外计算的代码修改一下,然后就像godtype自定义兵种对应装备那样搞个数据区,就可以自定义所有各种兵种之间的兵种相克关系了。真是功德无量啊。
2010-7-24 17:54
ctermiii
按照不增加区段、不占用其他位置的原则
从0x42A5E9~0x42A693这大概150+字节的位置可以重写一下
要给代码留点位置,大概能用的作为数据的区域在80字节;
如果能把表格限制在80字节以内,重写一下就好了,你也会写程序的就不说什么了。
有难度的是,要40个兵种全列在表格里的话,按相克能力1个字节,也要40x40字节;
但如果按照大类来算的话,倒是可以
比如把弓和弓骑、炮车合并一类等等,如果能商定一个都可以接受的原则出来,
缩减为8或者9大类兵种的话,还是可以写的。
合并大类倒也不用担心相克太单调,毕竟还有兵种各自的地形适应性在那里呢,一起做个修改就是了
这种相克和合并大类的数据,每个人看法都不一样,标准难定。
我看了一下,0x4813A0之后位置好像有3000个字节可以用,如果想占用这个地方的话,就不是什么大问题了。
2010-7-24 21:22
lewulezo
回复 #149 ctermiii 的帖子
我同意。我觉得没必要搞40*40这么大的矩阵数据,这样修订数据也会很麻烦。首先带3转,2转的兵种算是一个兵科,这样也就只有23种了。
合并大类的做法可以参照兵种地形效果,设定一个数据区,把所有兵种分别指定对应的一个大类ID(40个字节),然后再设定各大类之间的相克值即可。
我对汇编不怎么熟,如果有高人能帮忙编写一下,将不胜感激。
[color=Silver][[i] 本帖最后由 lewulezo 于 2010-7-24 21:26 编辑 [/i]][/color]
2010-7-25 12:07
ctermiii
这种还算简单..
我不想对原来的布局动太多地方,所以把表格插在代码中间了,程序返回位置所在的代码没有动;
这样前边的几个跳转指令位置不用改,省点麻烦;
但有这个位置:
0x42A68C这个位置被开辟来做兵种大类了
导致前边有个jmp指令:
0042A5AE . /E9 D9000000 JMP EKD2Win.0042A68C
这个代码od会认不出来;
不过这句代码完全没用上过,所以我虽然给的附件里改了,不改也一样
设定原则是这样:
[color=Red]从0x42A66C开始:
00~27这40个兵种,需要一一给他设定一个大类,编号00~07,一共8大类,默认00[/color]
相克系数是0~255直接的任意值,我设定的结果是:
[color=Blue]实际伤害=基本伤害x相克系数/100[/color],
这样可以有75%,65%这种不是整十的系数存在,设定系数的时候也不用绕弯子了,方便一点
最大是255%,最小0,如果嫌系数范围不够,也可以把100这个数缩小一下。
当然实现方法很多,这里仅仅是一个例子
[color=Red]0x42A62C开始为相克系数表格结构:
每8个一组,分别是第00,第01……第07类克制其他大类的系数;默认00,需要自己设定;
很明显,自己克制自己系数为1,也就是100%,因为我这个例子是除以100的,所以对应设置应该为64H;[/color]如果你改了除数,记得系数也要同步改一下;
藤甲兵22H作为防御方时候单独计算;
例子看附件:
下边是程序:
0042A5E9 . 83F9 22 CMP ECX,22 ; 是否藤甲兵
0042A5EC . 75 05 JNZ SHORT EKD2Win_.0042A5F3
0042A5EE . 2BC0 SUB EAX,EAX
0042A5F0 . 40 INC EAX ; [color=Red]藤甲兵伤害为1[/color]
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 ; [color=Red]0大类相克系数[/color]
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 ; [color=Red]00兵种开始,自定义大类0~7[/color]
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
[color=Silver][[i] 本帖最后由 ctermiii 于 2010-7-25 13:52 编辑 [/i]][/color]
2010-7-25 12:13
阿尔法孝直
回复 #151 ctermiii 的帖子
另外我还是没看懂147楼里面所谓的“加上或者减去等级因素的随机值”
具体是怎么算的?什么情况下要加上/减去?
2010-7-25 12:27
ctermiii
是这样的:
1、前边计算出基础伤害Abase;
2、取得防御方等级Flevel,然后取得0~FLevel-1的随机值Frnd1;
3、取得攻击方等级Glevel,然后取得0~Glelev-1的随机值Grnd1;
4、比较Frnd1与Grnd1的大小;
5、1如果Frnd1<Grnd1,或者产生了全力一击;
那么伤害会随机增加0~Glevel-1之间的随机值Grnd2,结果为Abase=Abase+Grnd2
5、2如果Frnd1>=Grnd1,
那么伤害随机减少0~Flevel-1的随机值Frnd2,如果伤害为1,减少了2,那只能取0和1-2的最大值,即保证伤害不能为负数,结果为Abase=Max(Abase-Frnd2,0)
6、确认防御方是我军(15个部队,不知道是否包括援军,游戏我实在没玩过)还是敌军;
如果是我军,那个会去确认游戏难度;
6、1难度为初级的话,我军受伤害为Abase=Abasex80%;
6、2难度为高级的话,我军受伤害为Abase=Abasex120%;
注:没有中级难度计算,那明显伤害为Abase=Abasex100%;
7、取得防御方当前耐久力,如果最终的ABase>=耐久力的话,伤害Abase=耐久力;
如果伤害<耐久力的哈,Abase不变,这个是为了防止打出比当前耐久力还大的数;
[color=Silver][[i] 本帖最后由 ctermiii 于 2010-7-25 13:21 编辑 [/i]][/color]
2010-7-25 14:20
阿尔法孝直
回复 #153 ctermiii 的帖子
第5步可以看出,低等级的去打藤甲兵,很容易杯具的:hz1014:
2010-7-26 11:16
lewulezo
非常感谢ctermiii 的贡献。
我的修改器已经更新。修复了多个bug,并且加入以下内容:
1. 在现成的exe上打上godtype的"兵种装备自由设定补丁"的功能。如果要修改兵种属性也会提示打上补丁。
2. 在现成的exe上打上ctermiii 的"兵种相克自由设定补丁"的功能。如果要修改兵种相克属性也会提示打上补丁。
3. 提供兵种相克设定的功能。
源代码我已经上传至共享目录中。
[color=Silver][[i] 本帖最后由 lewulezo 于 2010-7-27 08:41 编辑 [/i]][/color]
2010-7-27 13:06
ctermiii
其实我是挺喜欢屠电脑的,比如可以改造一下如果是我军,伤害永远为0,如果是敌人,次次连击、全力一击。
如果每战的敌人出来,兵种是剧本定死的,不会应为上一战的影响而变化的话,就好玩了
要增加游戏难度的话,可以改成如果是敌军,发生了致命一击或者连击或者某种条件吧,那么他是一个很优秀的敌人啊,可以给他增加一个加强攻或者防或者攻防的buffer,好好保护起来
如果他下次出现,兵种不变的话,可以考虑如果他表现优秀,给他兵种随机升级为一种更强大的,就好玩了。
2010-7-31 17:55
藏陋网友
有没有复刻版的三国志英杰传的修改器啊~~~
2010-8-2 16:11
lewulezo
[quote]原帖由 [i]藏陋网友[/i] 于 2010-7-31 17:55 发表
有没有复刻版的三国志英杰传的修改器啊~~~ [/quote]
鄙人对破解程序逻辑并不在行。
要是有强人对三国志英杰传的数据分析有成果的话,我也可以做修改器方便大家自由设定或者补丁。
2010-8-16 01:21
阿尔法孝直
刚刚看了一下,北狄兵的成长大约是
武/智/统
0/1/17
无语了………………
2010-8-16 12:55
lewulezo
是吗,我不知道北狄兵的兵种属性升级在哪里存放。我本以为是继承另一个兵种来的。
2010-8-21 13:29
669999
:hz1001::hz1001:偶是新手,看不懂啊
2010-8-24 16:36
阿尔法孝直
[quote]目前已知的AI代码:
00:防守模式。如果移动范围+攻击范围内有我军就出击,否则不动。
01:攻击模式。如果移动范围+攻击范围内有我军就出击,否则向我军最近的目标移动。
02:坚守模式。不会移动,如果攻击范围内有我军就攻击。很多关敌军主将的AI。
03:追击模式。如果移动范围+攻击范围内有我军就出击,否则向指定的我军目标移动。后两个字节是追击的目标武将ID。比如说麦城之战追击关羽
04:行军模式。如果移动范围+攻击范围内有我军就出击,否则就向指定坐标移动,到达目标后切换为防守模式。后两个字节是目的地的坐标。敌军攻打我方城池采用的AI。
05:追随模式。如果移动范围+攻击范围内有我军就出击,否则向目标的坐标移动。后两个字节是跟随目标武将的ID。比如赤壁之战II中,曹军将领的AI
06:逃跑模式。不会主动攻击,只会朝指定目的地移动,如果没有路径可以通向目的地则原地发呆。后两个字节是逃跑的目的地坐标。比如说赤壁之战II的曹操。[/quote]
05:追随模式,该AI是不会主动攻击的,只会跟着人走。
载入内存后就是04=XX 无攻击移动。
还有,04:行军模式,载入内存后是00=(X,Y) 移动。目前无法确定这种AI在移动范围+攻击范围内无目标,但是移动范围+策略范围内有目标时是否出击。
[color=Silver][[i] 本帖最后由 阿尔法孝直 于 2010-8-24 16:41 编辑 [/i]][/color]
2010-8-26 15:55
37610716
坐等像曹操传那样的深入研究成果。:hz1019:
2010-9-8 23:26
37610716
楼主能不能用用C,VB,C++等做成EXE的应用程序。
2011-5-25 10:49
lewulezo
回复 #164 37610716 的帖子
可以运行就好了。我是做java开发的,不太习惯使用编译成exe的语言,抱歉哦。
2012-12-29 16:37
wimmc
回复 #41 lewulezo 的帖子
这个修改器怎么下载啊?
2012-12-30 11:30
wimmc
exe格式不符,无法打上兵种装备自由指定补丁,无法修改。
这是什么意思?是我的版本不对吗?
2012-12-30 20:24
wimmc
我打不开BAKDATA.E2文件,一开就是乱码,要用什么工具打开?
2014-1-14 15:55
yinyusheng
猪猪复刻版的 孔明传 现在实在找不到哪里还有下载了。。。。而且下来的孔明传也不知道 是不是猪猪复刻的 烦恼西
2014-1-15 15:28
yinyusheng
奇怪的就是无法修改地方的兵种 修改后无效,但是只要对方变成我们的 就有效 不知道为什么
2014-1-29 00:48
後小來
请问修改剧本会闪退,该如何解决呢?:hz1024:
2021-5-31 11:38
wimmc
感谢共享的修改器,正在试试。
2021-6-4 00:07
wimmc
太感谢了
页:
1
2
[3]
Powered by Discuz! Archiver 5.0.0
© 2001-2006 Comsenz Inc.