Объявления

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

RMG SOD

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineRoseKavalier  
Мастер
Мастер
 
Сообщения: 331
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 234 раз.

Re: RMG SOD

Сообщение RoseKavalier » 22 май 2020, 19:40

You cannot directly use std::vector on H3 stack or structures, they are not the same format, that's the issue in your first 3 snippets.

Show the hooking address and code please, I have no clue otherwise)
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: RMG SOD

Сообщение as239 » 23 май 2020, 06:07

Код: Выделить всё
_LHF_(ReplaceVector){
   std::vector<H3Coordinates> *vec = (std::vector<H3Coordinates>*)(c->ebp - 0x68);
   std::vector<H3Coordinates> vecNew;
   for (int i = 0; i < vec->size(); i++)
   {
      if (i%4==0)
      {
         vecNew.push_back(vec->at(i));
      }
   }   
   //THISCALL_1(int, 0x5BC5E0, h3Vec);
   vec->clear();
   *vec = vecNew;

   return EXEC_DEFAULT;
}
_PI->WriteLoHook(0x54192C, ReplaceVector);
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: RMG SOD

Сообщение as239 » 23 май 2020, 06:09

Вот разобранные параметры функции:
Код: Выделить всё
RMG_MonsterGenerationZoneBlocks_00541630(RMG_Main *this1, RMG_ZoneGenerator *GenZone1, RMG_ZoneConnection *a3, std::vector<RMG_MapItem*>  *a4, std::vector<H3Coordinates>  *a5)
Вернуться к началу

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

Re: RMG SOD

Сообщение RoseKavalier » 23 май 2020, 13:19

Code looks correct if you replace std::vector by H3Vector.
Game isn't crashing on me, just RMG is failing silently. That probably means this code is making things impossible to be generated according to some requirement somewhere, so more generations are needed.

This worked for me about half the time. There are some things not yet in H3API there but it's same logic... only difference is I remove fewer tiles.
Код: Выделить всё
_LHF_(RMG_54192C_ReplaceVector)
{
   auto& vec = c->local<H3Vector<RMG_Coordinates>>(0x68 / 4);
   auto vecCopy(std::move(vec));

   for (UINT i = 0; i < vecCopy.Size(); ++i)
   {
      if (i % 2 == 0)
         vec.Add(vecCopy[i]);
   }

   return EXEC_DEFAULT;
}
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: RMG SOD

Сообщение as239 » 19 июл 2020, 09:27

Никто не знает где делается это:
 
Изображение

Я так полагаю что здесь RMG_0053EB90, но нужно точнее.
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: RMG SOD

Сообщение as239 » 19 сен 2020, 07:09

Хочу сделать размещение указанных зон только в подземелье.
Функцию отвечающую за это нашел 0x53B250:
Код: Выделить всё
char __thiscall ZoneCanBePlacedUnderground_0053B250(_RMGStruct_ *this, _RMGGenZone_ *a2)


Делаю такой хук:
Код: Выделить всё
char __stdcall ZoneCanBePlacedUnderground(HiHook* h, RMG_Main *this1, RMG_ZoneGenerator *GenZone){
   if (GenZone->zoneInfo->id >= 9) return 1;
   return 0;
}

   _PI->WriteHiHook(0x53B250, SPLICE_, EXTENDED_, THISCALL_, ZoneCanBePlacedUnderground);

Т.е. первые 8 зон шаблона, хочу разместить на поверхности, а остальные в подземелье.
Получаю вылет вот здесь 0053C059 (деление на 0):
 
Изображение


Понимать бы что делает этот кусок кода.

Я понимаю, что этот хук не панацея т.к. он лишь разрешает ставить зону в подземелье, но где-то еще есть код, который именно решает ставить или нет, вот где он?
Вложения
HD_CRASH_LOG.TXT
(7.89 КБ) Скачиваний: 401
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: RMG SOD

Сообщение as239 » 20 сен 2020, 05:16

А что означает такой код, он довольно часто встречается, например в 0053BE85:
Код: Выделить всё
LOBYTE(a4) = HIBYTE(a2);

а2 = это аргумент с типом _RMGGenZone_, а4 - локальная переменна, которая судя по всему является адресом вектора.
Не понимаю смысла - берем старший байт от адреса _RMGGenZone_ и получаем адрес вектора, как?
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: RMG SOD

Сообщение as239 » 20 сен 2020, 11:41

Разобрался как управлять расположением зоны:

Код: Выделить всё
_LHF_(SetUnderground){
   if (rmg->map.numberLevels == 1) return EXEC_DEFAULT;

   RMG_ZoneGenerator* GenZone = (RMG_ZoneGenerator*)(c->ebx - 16);
   if (PlaceUnderGround) {
      c->esi = 1; //зона обязательно будет расположена в подземелье. c->esi = 0 - зона обязательно будет на поверхности.
   }
   return EXEC_DEFAULT;
}
_PI->WriteLoHook(0x53C074, SetUnderground);

Хочу теперь добавить возможность этой настройки в файле шаблона.
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

Re: RMG SOD

Сообщение as239 » 30 дек 2020, 18:17

Визуализация, упрощенной отрисовки границ зон.
https://youtu.be/S1FMGKqamP0
Вернуться к началу

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

Re: RMG SOD

Сообщение RoseKavalier » 31 дек 2020, 04:03

Wow, that's pretty awesome work!
Any intents to share your findings in the future?

Код: Выделить всё
LOBYTE(a4) = HIBYTE(a2);

This is compiler optimization which normally happens when (in this case, byte) variables are defined; compiler will decide what is no longer needed and temporarily use these to store other values.

If a4 is the start of a vector/string or other std:: container, then that is how they used to be coded back in the 90s.

Код: Выделить всё
template<class _E, class _Tr = char_traits<_E>,   class _A = allocator<_E> >
class basic_string {
...
    _A allocator;
    _E *_Ptr;
    size_type _Len, _Res;
}


The allocator is quite useless in h3's case, it just fills in a random value because of the constructors.
Вернуться к началу

Пред.След.

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

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

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