使用工具:
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 编辑 ]