使用工具:
1、OllyDbg(设置断点来探查算法在程序里的位置)
2、IDA Pro with Hex-Rays(查看每个函数的C语言代码)
一、物理攻击全分析
原作者:ctermiii
http://www.xycq.net/forum/thread-213636-1-1.html
// 基本攻击伤害函数(thiscall类成员函数)
// 入口地址:0x0042A4AD
// 参数1:this=攻击方类指针
// 参数2:a2=防御方类指针
// 参数3:a3=是否执行攻击,为0表示计算行动价值时使用
unsigned int __thiscall sub_42A4AD(structADD *this, int a2, int a3)
{
int Def_BASNo; // eax@1
unsigned int result; // eax@2
unsigned __int8 v5; // ST30_1@3
unsigned __int8 v6; // ST24_1@3
int v7; // [sp+Ch] [bp-28h]@10
structADD *pAttack; // [sp+10h] [bp-24h]@1
unsigned int fixedD; // [sp+14h] [bp-20h]@3
structADD *pDefense; // [sp+18h] [bp-1Ch]@3
unsigned int Hurt; // [sp+24h] [bp-10h]@8
unsigned __int8 Def_ADDNo; // [sp+28h] [bp-Ch]@1
unsigned int fixedA; // [sp+30h] [bp-4h]@3
pAttack = this;
Def_BASNo = sub_41EF0C(a2); // 防御方人物编号
Def_ADDNo = sub_429061(Def_BASNo); // 防御方战场编号
if ( Def_ADDNo == 255 )
{
result = 0;
}
else
{
pDefense = &dword_46C098[Def_ADDNo]; // 防御方战场类指针
v5 = Get_Element_onCell(pAttack); // 攻击方地形因素
v6 = Get_Element_onCell(pDefense); // 防御方地形因素
fixedA = v5 * Get_AVal(pAttack) / 10; // 攻击力修正值
fixedD = v6 * Get_DVal(pDefense) / 10; // 防御力修正值
// a3为1表示执行攻击时,为0表示计算行动价值时
if ( random(fixedA) >= fixedD / 10 || !a3 || Get_statusADD(pDefense, statusChaos) )
{
// 基本伤害=攻击力修正-防御力修正/2
if ( (fixedD + 1) >> 1 < fixedA )
Hurt = fixedA - (fixedD >> 1);
else
Hurt = 1;
// 根据防御方兵种来修正基本伤害
// 如果修正后基本伤害为0,则判为攻击未命中
v7 = Get_Arms(pDefense) - 9;
switch ( v7 )
{
case 0: // 战车系
case 1:
case 2:
case 27: // 象兵团
Hurt = 3 * Hurt >> 2; // 修正为75%
break;
case 18: // 运粮队
case 19: // 物资队
case 20: // 军乐队
Hurt = 3 * Hurt >> 1; // 修正为150%
break;
case 21: // 南蛮兵
case 22: // 南蛮骑兵
case 26: // 羌族兵
case 30: // 北狄兵
Hurt >>= 1; // 修正为50%
break;
case 25: // 藤甲兵
Hurt = 1; // 基本伤害强判为1
break;
default: // 其他兵种无修正
break;
}
result = Hurt;
}
else
{
result = 0; // 判定命中失败,攻击未命中
}
}
return result;
}
[ 本帖最后由 阿尔法孝直 于 2016-2-1 03:20 编辑 ]