Объявления
Поздравляем
Roman2211


Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru.
Я оторву свою задницу от всех дел и обязательно Вас активирую! :smile10:
Добро пожаловать на геройский форум! :smile25:

База данных IDA от void17

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: База данных IDA от void17

Сообщение AlexSpl » 28 ноя 2021, 20:26

Короче, сами смотрите. Чувствую себя дураком оттого, что не знал этой фишки:

Heroes3f.zip
(14.03 МБ) Скачиваний: 151

Надеюсь, она не сломалась :smile4:
Вернуться к началу

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

Re: База данных IDA от void17

Сообщение void_17 » 29 ноя 2021, 00:43

Цитата:
А Вы неподъёмную задачу, на первый взгляд, себе поставили. Декомпилировать вообще всё...


DirectPlay я наоборот выпилить хочу, для этого нужно изучить то, где он вообще есть, чтобы безболезненно убрать.

Плюс не будет RMG. Мне кажется даже если Sav был октрытым и дружелюбным человеком, которому было бы ценно его же коммьюнити, частью которого он является, он бы все равно особо сильно не пролил свет на RMG.

Проще реально с нуля свой написать.

А все остальное, впринципе, попроще будет. В некоторых функциях порой следует просто принцип понять и все.
Вернуться к началу

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

Re: База данных IDA от void17

Сообщение void_17 » 29 ноя 2021, 00:43

И да, я не советую использовать сборщик мусора в IDA, у меня так однажды полгода работы сгорело, а я до этого резервных копий не делал.... :smile1:
Вернуться к началу

offlineRoseKavalier  
Мастер
Мастер
 
Сообщения: 331
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 234 раз.

Re: База данных IDA от void17

Сообщение RoseKavalier » 29 ноя 2021, 00:49

Yes it works fine. I've been deflating (7z) my own databases manually before making backups, it also speeds up re-opening the database ever so slightly, and ofc closing it.

Maybe type_spell_choice is in fact like this:
Код: Выделить всё
struct type_spell_choice : type_enchant_data
{
...
};


I'd have to look around a bit to get a better idea, but it doesn't seem too far-fetched.
Good show so far!
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: База данных IDA от void17

Сообщение AlexSpl » 29 ноя 2021, 10:30

Хочу предостеречь от использования функции "Force new variable", при попытке создать новую переменную произошла внутренняя ошибка IDA и дальнейшая декомпиляция стала невозможной. Починил с помощью Undefine и пересоздал функцию. С обычными переменными функция работает исправно, а со структурами не хочет (сейчас специально проверил на переменной типа struct, стабильно внутренняя ошибка).

Кто-нибудь может объяснить, что декомпилятор подразумевает под OVERLAPPED здесь:

Код: Выделить всё
army *allyArmy; // esi
army *targetArmy; // edi
int speed; // eax
int targetArmyHealth_tmp; // eax
INT32 allyUnitHealth; // ecx
char canShoot; // bl
int avgDamageAfterAttack; // eax
bool canShoot_1; // al
int adjAvgDamage; // ebx
int targetArmyHealth_1; // eax
type_AI_spellcaster *spellCaster_1; // ecx
__int64 zero; // rax
signed int numberAlive; // [esp-Ch] [ebp-44h]
double avgDamage_1; // [esp+Ch] [ebp-2Ch]
double healthDamageRatio; // [esp+14h] [ebp-24h]
type_AI_combat_parameters *p_combatParams; // [esp+1Ch] [ebp-1Ch]
int targetArmyHealth; // [esp+20h] [ebp-18h] BYREF
type_AI_combat_parameters *err; // [esp+24h] [ebp-14h] OVERLAPPED
type_AI_spellcaster *spellCaster; // [esp+28h] [ebp-10h]
int dangerRating; // [esp+28h] [ebp-10h] FORCED
int avgDamage; // [esp+2Ch] [ebp-Ch]
char shoot[8]; // [esp+30h] [ebp-8h]
int allyArmyHealth; // [esp+40h] [ebp+8h] FORCED BYREF

Цитата:
437220: variables would overlap: lvar "err" ^3C.4(user-defined) and stkvar "spellCaster" ^3C.8(has user info)

Они же ровно на 4 байта друг от друга :smile5:

Edit: А, теперь вижу, после того, как поменял тип на int :smile2: Хотя нет... Всё равно OVERLAPPED :smile5:
Edit2: А теперь понял. Это из-за приведения типов:

Код: Выделить всё
*(_QWORD *)&err = *(_QWORD *)&data.spellDuration;

И размер не 4, а 8 байт.

 Полный код функции get_frenzy_value()
Код: Выделить всё
// local variable allocation has failed, the output may be wrong!
int __thiscall type_AI_spellcaster::get_frenzy_value(type_AI_spellcaster *this, army *army, type_enchant_data data)
{
  army *allyArmy; // esi
  army *targetArmy; // edi
  int speed; // eax
  int targetArmyHealth_tmp; // eax
  INT32 allyUnitHealth; // ecx
  char canShoot; // bl
  int avgDamageAfterAttack; // eax
  bool canShoot_1; // al
  int adjAvgDamage; // ebx
  int targetArmyHealth_1; // eax
  type_AI_spellcaster *spellCaster_1; // ecx
  __int64 zero; // rax
  signed int numberAlive; // [esp-Ch] [ebp-44h]
  double avgDamage_1; // [esp+Ch] [ebp-2Ch]
  double healthDamageRatio; // [esp+14h] [ebp-24h]
  type_AI_combat_parameters *p_combatParams; // [esp+1Ch] [ebp-1Ch]
  int targetArmyHealth; // [esp+20h] [ebp-18h] BYREF
  type_AI_combat_parameters *err; // [esp+24h] [ebp-14h] OVERLAPPED
  type_AI_spellcaster *spellCaster; // [esp+28h] [ebp-10h]
  type_AI_spellcaster *dangerRating; // [esp+28h] [ebp-10h] FORCED
  int avgDamage; // [esp+2Ch] [ebp-Ch]
  char shoot[8]; // [esp+30h] [ebp-8h]
  int allyArmyHealth; // [esp+40h] [ebp+8h] FORCED BYREF

  allyArmy = army;
  spellCaster = this;
  targetArmy = army->spellsData.targetArmy;
  if ( !targetArmy )
    goto SPELL_VALUE_0;
  speed = army::GetSpeed(army);
  if ( army::get_AI_target_time(allyArmy, speed) > 1 )
    goto SPELL_VALUE_0;
  shoot[4] = army::can_shoot(allyArmy, 0);
  allyArmyHealth = army::get_total_hit_points(allyArmy, 0);
  targetArmyHealth_tmp = army::get_total_hit_points(targetArmy, 0);
  allyUnitHealth = allyArmy->info.hitPoints;
  targetArmyHealth = targetArmyHealth_tmp;
  canShoot = shoot[4];
  avgDamage = army::get_average_damage(
                allyArmy,
                targetArmy,
                shoot[4],
                (allyUnitHealth + allyArmyHealth - 1) / allyUnitHealth,
                1,
                0);
  p_combatParams = &spellCaster->combatParams;
  type_AI_combat_parameters::simulate_attack(
    &spellCaster->combatParams,
    allyArmy,
    &allyArmyHealth,
    targetArmy,
    &targetArmyHealth,
    shoot[4],
    0);
  if ( !allyArmyHealth )
    goto SPELL_VALUE_0;
  avgDamageAfterAttack = army::get_average_damage(
                           allyArmy,
                           targetArmy,
                           canShoot,
                           (allyArmy->info.hitPoints + allyArmyHealth - 1) / allyArmy->info.hitPoints,
                           1,
                           0);
  if ( canShoot && (allyArmy->info.flags & CF_TWO_ATTACKS) != 0 )
    avgDamageAfterAttack /= 2;
  *&shoot[4] = avgDamage + avgDamageAfterAttack;
  numberAlive = allyArmy->numberAlive;
  *shoot = (avgDamage + avgDamageAfterAttack) / avgDamage;
  canShoot_1 = army::can_shoot(allyArmy, 0);
  avgDamage = army::get_average_damage(allyArmy, targetArmy, canShoot_1, numberAlive, 1, 0);
  healthDamageRatio = *shoot;
  avgDamage_1 = avgDamage;
  adjAvgDamage = (avgDamage_1 * *shoot);
  targetArmyHealth_1 = army::get_total_hit_points(targetArmy, 0);
  *&shoot[4] = targetArmyHealth_1;
  if ( adjAvgDamage > targetArmyHealth_1 )
  {
    adjAvgDamage = targetArmyHealth_1;
    healthDamageRatio = *&shoot[4] / avgDamage_1;
  }
  if ( adjAvgDamage > avgDamage )
  {
    spellCaster_1 = spellCaster;
    dangerRating = spellCaster->combatParams.dangerRating;
    if ( data.spellDuration < dangerRating )
    {
      *&data.spellDuration = data.spellDuration;
      // data.spellDuration теперь есть отношение длительности заклинания к уровню опасности вражеской армии
      *&data.spellDuration = *&data.spellDuration / dangerRating;
    }
    else
    {
      *&data.spellDuration = 0x3FF0000000000000i64;
    }
    if ( (allyArmy->info.flags & CF_DONE) != 0
      && (*&data.spellDuration = *&data.spellDuration - 1.0 / dangerRating, *&data.spellDuration < 0.0) )
    {
      err = 0;
      dangerRating = 0;
    }
    else
    {
      *&err = *&data.spellDuration;
    }
    // // data.spellDuration теперь есть эффективная боевая ценность отряда allyArmy
    *&data.spellDuration = army::get_total_combat_value(
                             allyArmy,
                             p_combatParams->heroAttack,
                             spellCaster_1->combatParams.heroDefense);
    return ((sqrt(healthDamageRatio) - 1.0) * *&data.spellDuration * *&err);
  }
  else
  {
SPELL_VALUE_0:
    LODWORD(zero) = 0;
  }
  return zero;
}
Вернуться к началу

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

Re: База данных IDA от void17

Сообщение void_17 » 29 ноя 2021, 11:52

Обновление базы 1.2
к enum добавлены префиксы
(что-то еще)
TODO: убрать типы из H3API
Вернуться к началу

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

Re: База данных IDA от void17

Сообщение void_17 » 29 ноя 2021, 11:59

ЧТО СЛУЧИЛОСЬ С КЛАССОМ army? :smile8:
И combatManager... Надо срочно это дело исправлять
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

Re: База данных IDA от void17

Сообщение AlexSpl » 29 ноя 2021, 12:04

Цитата:
ЧТО СЛУЧИЛОСЬ С КЛАССОМ army? :smile8:
И combatManager... Надо срочно это дело исправлять

Вы про типы из H3API? Мне понравилось, что в H3API информация о заклинаниях вынесена в отдельную структуру. Вполне логично, что в оригинальном коде так и было, иначе бы эти поля шли вразброс. В любом случае удобнее, когда поля объединены в структуры по их назначению.
Вернуться к началу

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

Re: База данных IDA от void17

Сообщение void_17 » 29 ноя 2021, 12:08

Поправил чутка
Вернуться к началу

offlineАватара пользователя
void_17  
имя: имя
Ветеран
Ветеран
 
Сообщения: 548
Зарегистрирован: 25 апр 2021, 15:05
Откуда: Оттуда
Пол: Мужчина
Поблагодарили: 132 раз.

Re: База данных IDA от void17

Сообщение void_17 » 29 ноя 2021, 12:08

AlexSpl, может давайте я займусь сигнатурами и мы "добьем" интерфейс вместе с combatManager-ом?
Вернуться к началу

Пред.След.

Вернуться в Общий раздел

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

cron