Объявления

Форум о Героях Меча и Магии и King's Bounty. Если Вы любите эти игры, мы будем рады видеть Вас в наших рядах. :smile2:

RMG SOD

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

Re: RMG SOD

Сообщение RoseKavalier » 02 ноя 2019, 21:36

If you keep the same seed and only disable HiHook at 0x531D80, you get normal treasure density?
Вернуться к началу

offlineas239  
Мастер
Мастер
 
Сообщения: 330
Зарегистрирован: 29 дек 2018, 14:17
Пол: Не указан
Поблагодарили: 14 раз.

Re: RMG SOD

Сообщение as239 » 03 ноя 2019, 05:34

Yes it is. The same result (normal treasure density) is if i am just disabling "return 1".
Код: Выделить всё
  for (int ix = -1; ix <= 1; ix++)
   {
      for (int iy = -1; iy <= 1; iy++)
      {
         int addx = x + ix;
         int addy = y + iy;

         if (MapSize == 0 || addx >= MapSize || addy >= MapSize || addx < 0 || addy < 0)  continue;
         RMG_MapItem *xyz = rmg->map.GetMapItem(addx, addy, z);
         if (xyz->GetRoad() != 0) {
            //return 1;
         }
      }
   }
Вернуться к началу

offlineas239  
Мастер
Мастер
 
Сообщения: 330
Зарегистрирован: 29 дек 2018, 14:17
Пол: Не указан
Поблагодарили: 14 раз.

Re: RMG SOD

Сообщение as239 » 03 ноя 2019, 08:18

Trying to change swapping algorithm.
Current algorithm is:
- PlaceObstacles (before Roads)
- PlaceRoads
- PlaceObjects
- PlaceObstacles second time (for drawing Obstacles around Objects).

But it having that problems:
- underground doesn't have abyss
- can't change Obstacles after roads placement

So better way is PlaceRoads, without PlaceObstacles.
I am doing it this way:
Код: Выделить всё
_LHF_(ChangeRMG_Order){
   if (IsChangeOrder) return EXEC_DEFAULT;
   int const MapSize = 144;
   int BackupMap[MapSize][MapSize];
   for (int x = 0; x < 144; x++)
   {
      for (int y = 0; y < 144; y++)
      {
         BackupMap[x][y] = 0;
      }
   }
   for (int x = 0; x < 144; x++)
   {
      for (int y = 0; y < 144; y++)
      {

         RMG_MapItem *xyz = rmg->map.GetMapItem(x, y, 0);
         if (xyz->tileData.isBlocked == 0 && xyz->tileData.mustBeBlocked == 1 && xyz->tileData.canBeBlocked == 1) {
            xyz->tileData.isBlocked = 0;
            xyz->tileData.mustBeBlocked = 0;
            xyz->tileData.canBeBlocked = 0;
            BackupMap[x][y] = 1;
         }
         else if (xyz->tileData.isBlocked == 0 && xyz->tileData.mustBeBlocked == 1 && xyz->tileData.canBeBlocked == 0) {
            xyz->tileData.isBlocked = 0;
            xyz->tileData.mustBeBlocked = 0;
            xyz->tileData.canBeBlocked = 0;
            BackupMap[x][y] = 2;
         }

      }
   }

   THISCALL_1(char, 0x548780,rmg);//PlaceRoads

   //Restore flags for drawing Obstacles
   for (int x = 0; x < 144; x++)
   {
      for (int y = 0; y < 144; y++)
      {
         if (BackupMap[x][y]==1)
         {
            RMG_MapItem *xyz = rmg->map.GetMapItem(x, y, 0);
            xyz->tileData.isBlocked = 0;
            xyz->tileData.mustBeBlocked = 1;
            xyz->tileData.canBeBlocked = 1;

         }
         else if (BackupMap[x][y] == 2)
         {
            RMG_MapItem *xyz = rmg->map.GetMapItem(x, y, 0);
            xyz->tileData.isBlocked = 0;
            xyz->tileData.mustBeBlocked = 1;
            xyz->tileData.canBeBlocked = 0;

         }

      }
   }
   IsChangeOrder = true;
   return EXEC_DEFAULT;
}
...
_PI->WriteLoHook(0x54A105, ChangeRMG_Order);


But having this problem with diagonal roads:
 
Изображение


It looks like some bits should also be changed, but which?

Update: Fixed this problem.

Сейчас думаю как лучше поступить с наложением объектов на дороги.
Стандартный алгоритм не учитывает наличие дорог и ставит объекты прямо на них.
Если всем дорогам присвоить флаг mustBeBlocked = 0.
То проблема с наложением объектов решается, не один объект не закрывает дороги.
Однако возникает проблема с открытыми объектами т.к. алгоритм размещения объектов считает теперь дорогу закрытым тайлом.
Вернуться к началу

offlineas239  
Мастер
Мастер
 
Сообщения: 330
Зарегистрирован: 29 дек 2018, 14:17
Пол: Не указан
Поблагодарили: 14 раз.

Re: RMG SOD

Сообщение as239 » 09 ноя 2019, 06:28

Есть проблема с перестановкой дорог в подземелье.
В момент создания дорог 0x54A105, маска клеток (isBlocked,mustBeBlocked,canBeBlocked) и земля (6) пропасти и обычных клеток не отличаются.
И дороги идут напрямик по пропасти.
Я думал что установка земли пропасти (9) происходит в RMG_00543ED0.
Но нет, это происходит где-то RMG_GenerateObjects_00547850.
Где это место? Никак не могу найти.
Вернуться к началу

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

Re: RMG SOD

Сообщение RoseKavalier » 10 ноя 2019, 18:46

Maybe rock terrain is considered as obstacle ?
Ultimately we need more reversing of RMG to properly identify what is what and which sub does what.
I'm working on something else for now and the foreseeable future but I still want to look at RMG at some point :smile5:
Вернуться к началу

offlineas239  
Мастер
Мастер
 
Сообщения: 330
Зарегистрирован: 29 дек 2018, 14:17
Пол: Не указан
Поблагодарили: 14 раз.

Re: RMG SOD

Сообщение as239 » 11 ноя 2019, 06:19

The problem is that the usual underground tile (road allowed) and a tile that will become an abyss(road is not allowed), have same mask isBlocked=1,mustBeBlocked=1,canBeBlocked=0, land =6.

Looks like its not so extremely hard to fix most of the RMG problems. But yes, definitely more reversing of RMG is needed.
The problem is I can do nothing when I see something like this:
Изображение

So I will wait for that happy day when you find time to look at RMG.
Вернуться к началу

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

Re: RMG SOD

Сообщение RoseKavalier » 11 ноя 2019, 15:05

What helps a lot is to set known structures to their type (right-click variable or press y).
Then when you see a subroutine use this structure as argument, modify the subroutine declaration (press y when cursor is on it).

It takes a while but in the end it's the best way to move forward))
Вернуться к началу

offlineigrik  
Посвященный
Посвященный
 
Сообщения: 69
Зарегистрирован: 14 сен 2017, 12:35
Пол: Не указан
Поблагодарили: 53 раз.

Re: RMG SOD

Сообщение igrik » 12 ноя 2019, 07:39

Вот частично разобраный конкретно этот участок кода.
Изображение

Но место создания пропасти, которое ты ищешь находится где-то тут 0x544028
Вернуться к началу

offlineas239  
Мастер
Мастер
 
Сообщения: 330
Зарегистрирован: 29 дек 2018, 14:17
Пол: Не указан
Поблагодарили: 14 раз.

Re: RMG SOD

Сообщение as239 » 12 ноя 2019, 15:43

igrik писал(а):

Вот частично разобраный конкретно этот участок кода.

Ого! Круто!
А есть еще что-нибудь подобное по RMG?

Например, было бы очень полезно понять алгоритм расстановки объектов.
Как это детально происходит?
Как происходит генерация списка объектов?
Как потом этот список объектов расставляется - общей маской или по отдельности?
Где именно происходит определение координат размещения объекта?
и т.д. и т.п.
Вернуться к началу

offlineigrik  
Посвященный
Посвященный
 
Сообщения: 69
Зарегистрирован: 14 сен 2017, 12:35
Пол: Не указан
Поблагодарили: 53 раз.

Re: RMG SOD

Сообщение igrik » 13 ноя 2019, 06:26

Нет, настолько детально разобраного RMG у меня нет.
Я бы может и занялся этой частью, но даже на банальные вещи для героев выкроить времени я совсем не могу.
Вернуться к началу

Пред.След.

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

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

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