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


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

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

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

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

Сообщение void_17 » 08 дек 2021, 14:39

Я смотрю, вы уже очень хорошо продвинулись. Скоро и я присоединюсь к работе.
Вернуться к началу

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 » 09 дек 2021, 05:52

Если Вы будете добавлять сигнатуры, то кидайте, как в прошлый раз, файлик, я добавлю. Просто сегодня собираюсь поработать над базой. В конце дня скину.
Вернуться к началу

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

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

Сообщение void_17 » 09 дек 2021, 06:55

Я буду делать дифференциальный файл. По скрипту RoseKavalier.
Вернуться к началу

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

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

Сообщение void_17 » 09 дек 2021, 15:38

AlexSpl, посмотрите в дискорде, я отправил дифференциальный файл.
Заодно, переименуйте:
Код: Выделить всё
Переменные и константы
694DB8 ?red_mask@Bitmap16Bit@@2IA
694DB4 ?blue_mask@Bitmap16Bit@@2IA
694DB0 ?green_mask@Bitmap16Bit@@2IA
698A24 ?gbInSmackMgr@@3HA
642D50 ??_7textEntryWidget@@6B@
63EB98 ??_7THighScoreWindow@@6B@
696A68 ?AdventureEventText@@3PBVTTextResource@@B

Названия типов
_DlgFrame_ -> coloredBorderFrame
_DlgEdit_ -> textEntryWidget
_DlgScroll_ -> slider
Вернуться к началу

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 » 09 дек 2021, 16:18

Имеет значение к какой версии применять дифференциальный файл? Т.е. если я внёс изменения сегодня, они не пропадут?
Вернуться к началу

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

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

Сообщение void_17 » 10 дек 2021, 03:25

Ну, поскольку я занимаюсь сигнатурами, а не вы, то если вы новые сигнатуры самим добавлять НЕ будете, а доверите мне, то "аварий" не будет.
Вернуться к началу

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

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

Сообщение void_17 » 10 дек 2021, 07:08

@AlexSpl, просьба, не надо писать темплейтные типы в стиле TSpellVector, это путает с толку и кажется, что это NWC-шный тип, а это просто std::vector<enum SpellID>.
Вернуться к началу

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 » 10 дек 2021, 07:44

Если IDA не поддерживает шаблоны, то для более читаемого листинга придётся писать по типу на каждый вектор. А иначе все будут безликими std::vector c void* указателями.
Вернуться к началу

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

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

Сообщение void_17 » 10 дек 2021, 07:47

Пишите std::vector_SpellID или просто vector_SpellID тогда уж, хорошо?
Вернуться к началу

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 » 10 дек 2021, 12:40

Я так и делаю. Это, наверное, старый тип, когда ещё к единому стандарту именования не пришёл :smile1: std::vector<elemType> => std::vector_elemType_, т.е ставлю нижние подчёркивания вместо <>, как делает это сама IDA для ::, `, ' и других неподдерживаемых символов.

Сигнатуры добавляю тоже потихоньку, но связанные с AI и для небольших функций (типа ?get_speed_value@type_AI_spellcaster@@IBAJPBVarmy@@JJ@Z). Две сигнатуры поменял местами (мораль/удача), добавил пропущенную value_of_luck_and_morale. Ещё часто попадаются функции, где сигнатура есть, а параметры функции остались от старой базы:

Код: Выделить всё
; signed int __userpurge armyGroup::GetMorale@<eax>(armyGroup *this@<ecx>, const hero *Hero@<ebx>, const town *Town@<edi>, const hero *Hero2, const armyGroup *Armyarray, bool b1, bool b2)
.text:0044AB30     public: int armyGroup::GetMorale(hero const *,town const *,hero const *,armyGroup const *,bool,bool)const proc near

Такую ерунду тоже стараюсь исправлять. Ведь понятно, что в Героях 3 не может быть никакого __userpurge.

Также добавляю const, где пропущено. Например,

Код: Выделить всё
protected: long type_AI_spellcaster::get_haste_value(army const *,type_enchant_data)const =>
=> int __thiscall type_AI_spellcaster::get_haste_value(type_AI_spellcaster *const this, army *const army, type_enchant_data data)


* * *
Код: Выделить всё
int __thiscall type_AI_spellcaster::get_speed_value(
        type_AI_spellcaster *const this,
        army *const army,
        int effect,
        int spellDuration)
{
  int result; // eax
  int exchangeEffect; // edi
  int armySpeed_1; // eax
  int targetTime_1; // eax
  army *AI_target_1; // eax
  int total_combat_value; // eax
  army *AI_target; // [esp+Ch] [ebp-8h]
  int exchange_effect; // [esp+Ch] [ebp-8h]
  int armySpeed; // [esp+10h] [ebp-4h]
  int targetTime; // [esp+1Ch] [ebp+8h]
  int targetTime_2; // [esp+20h] [ebp+Ch]
  int speed; // [esp+24h] [ebp+10h]
  army *AI_target_2; // [esp+24h] [ebp+10h]

  if ( !army->AI_target )
    return 0;
  if ( this->weakEnemy )
    return 0;
  result = spellDuration;
  if ( (army->creature.flags & CF_DONE) != 0 )
    result = spellDuration - 1;
  if ( result )
  {
    exchangeEffect = 0;
    armySpeed = army::GetSpeed(army);
    speed = effect + army->baseSpeed;
    armySpeed_1 = army::GetSpeed(army);
    targetTime = army::get_AI_target_time(army, armySpeed_1);
    targetTime_1 = army::get_AI_target_time(army, speed);
    targetTime_2 = targetTime_1;
    if ( targetTime_1 <= this->combatParams.expectedBattleDuration )
    {
      if ( targetTime_1 == 1 )
      {
        AI_target = army->AI_target;
        if ( army::GetSpeed(AI_target) >= armySpeed && army::GetSpeed(AI_target) < speed )
        {
          AI_target_1 = army->AI_target;
          AI_target_2 = AI_target_1;
          if ( !AI_target_1
            || (exchange_effect = type_AI_combat_parameters::get_exchange_effect(
                                    &this->combatParams,
                                    army,
                                    AI_target_1,
                                    0),
                exchangeEffect = exchange_effect
                               + type_AI_combat_parameters::get_exchange_effect(
                                   &this->combatParams,
                                   AI_target_2,
                                   army,
                                   0),
                exchangeEffect < 0) )
          {
            exchangeEffect = 0;
          }
        }
      }
      if ( targetTime_2 < targetTime )
      {
        if ( targetTime > this->combatParams.expectedBattleDuration + 1 )
          targetTime = this->combatParams.expectedBattleDuration + 1;
        total_combat_value = army::get_total_combat_value(
                               army,
                               this->combatParams.attackMod,
                               this->combatParams.defenseMod);
        exchangeEffect += total_combat_value
                        * (this->combatParams.expectedBattleDuration - targetTime_2 + 1)
                        / this->combatParams.expectedBattleDuration
                        - total_combat_value
                        * (this->combatParams.expectedBattleDuration - targetTime + 1)
                        / this->combatParams.expectedBattleDuration;
      }
      return exchangeEffect;
    }
    else
    {
      return 0;
    }
  }
  return result;
}

Есть подозрение, что поле bool type_AI_spellcaster::weakEnemy = true означает отказ AI от траты маны (устанавливается в true, если все отряды противника уходят от одного удара AI_target). Что интересно, алгоритм не проверяет боевые машины. Интересно, если дать AI кучу заклинаний и запустить бой 1 грейженой феечки (+баллиста) против 100 гномов в одном стеке, можно будет развести? Или всё-таки догадается ударным снять (я заметил, что не во всех функциях взвешивания это поле, установленное в true, автоматически означает нулевой вес заклинания).
Вернуться к началу

Пред.След.

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

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

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