Перейти к содержанию

Reverse Engineering функции выстрела в Darksiders 2


Рекомендуемые сообщения

Надеюсь кому-нибудь это поможет. Несколько лет назад я делал RapidFire для Darksiders 2. и выкладывал таблицу под ником Alexander-mx. Но искал я очень долго значение, отвечающее за время между выстрелами, искал способом изменилось/не изменилось и тогда мне очень повезло, потому что повторить это я не смог.  :-D  Сегодня решил восстановить функцию выстрела для этой игры.Не полностью восстановленная функция, но для создания RapidFire этого хватит. Остается только найти WeaponBase через патроны.
 



 


int *__thiscall m_Shoot(void *this, float Shot_Time){  int WeaponBase; // esi@1  int ReturnIdWeapon; // edi@1  DWORD IDKBase; // ecx@4  int ShootingState; // eax@6  unsigned int Recoil; // eax@9  int *result; // eax@12  bool BulletCountEqual_0; // zf@20  bool BulletCountLess_0; // sf@20  int v10; // eax@20  void *IDWeapon; // [sp+10h] [bp-14h]@1  int SetShootingState; // [sp+17h] [bp-Dh]@17  int v13; // [sp+20h] [bp-4h]@16  WeaponBase = this;  ReturnIdWeapon = *sub_460D85(&IDWeapon);  if ( IDWeapon )    sub_1017(IDWeapon);  // //Проверка кончился выстрел или нет. Если кончился предыдущий выстрел (значение WeaponBase + 0x420 будет равно 0), то можно делать следующий  if ( *(WeaponBase + 0x420) > 0.0    // IDKBase + 0xD8 типа bool, при значении 1 стрельба немного быстрее, чем при 0. Возможно при значении 1 функция игнорирует остальные проверки    || (IDKBase = *(WeaponBase + 0x438), !*(IDKBase + 0xD8)) && flt_1177D60 < *(WeaponBase + 0x41C)    || (ShootingState = *(IDKBase + 0xD4), ShootingState != -1) && *(WeaponBase + 0x418) >= ShootingState    || *(IDKBase + 0x2C) > *(WeaponBase + 0x43C)    // v6 не понятно что делает,значение типа int которое меняется при стрельбе побитовым сдвигом вправо на 6, максимальное значение которого 31 с включенным rapidfire и 27 при стандартной стрельбе    || (Recoil = *(WeaponBase + 0x444), (*(WeaponBase + 0x444) >> 6) & 1) )  {    result = *(WeaponBase + 0x438);    if ( *(result + 0x30) && *(WeaponBase + 0x3F4) > -1 )      result = sub_35C641(*(*(WeaponBase + 0x400) + 32));  }  else  {    *(WeaponBase + 0x43C) = 0.0;    if ( *(ReturnIdWeapon + 0x384) && *(WeaponBase + 0x340) <= 0 )    {      result = (Recoil >> 9);      if ( result & 1 )      {        if ( *(WeaponBase + 0x3F4) > -1 )          result = sub_35C641(*(*(WeaponBase + 0x400) + 0x54));      }    }    else    {      if ( !(v157A220 & 1) )      {        v157A220 |= 1u;        v13 = 0;        sub_96CB1(&unk_121C4D4, 0);        sub_9B886C(&unk_114544D);        v13 = -1;      }      // Result Возможно зашифрованное значние      result = sub_35BD87(WeaponBase, 0x157A218, &Shot_Time, &SetShootingState, 0);      if ( !result )        LOBYTE(SetShootingState) = 1;      if ( SetShootingState )      {        BulletCountEqual_0 = *(WeaponBase + 0x418) == 0;        BulletCountLess_0 = *(WeaponBase + 0x418) < 0;        v10 = *(WeaponBase + 0x438);        Shot_Time = *(v10 + 36);        *(WeaponBase + 0x420) = Shot_Time;        if ( !BulletCountLess_0 && !BulletCountEqual_0 )          // Установить значение 0 для времени между выстрелами [WeaponBase + 0x420]          // v10 + 40 количество выстрелов          *(WeaponBase + 0x420) = *(v10 + 40) * Shot_Time;        (*(*WeaponBase + 0x30C))(WeaponBase);        result = sub_361811(WeaponBase);      }    }  }  return result;} 
  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

Простите если что, но не путайте людей, это НЕ Darkness 2 , a Darksiders 2. 

Упс...спасибо надо будет исправить

Изменено пользователем partoftheworlD
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.