Объявления

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

RMG SOD

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineas239  
Мастер
Мастер
 
Сообщения: 323
Зарегистрирован: 29 дек 2018, 14:17
Пол: Не указан
Поблагодарили: 13 раз.

Re: RMG SOD

Сообщение as239 » 14 дек 2019, 05:52

I saw this, but thought that this code just returns a random number from 1 to 3.
But in the debugger, this code really returns the selected value of the type road, how it works?
I completely replace RMG_PlaceRoads_00548780 so I need to get the road type myself.
I try so:
Код: Выделить всё
int RoadType = (signed int)THISCALL_0(unsigned int, 0x61842C) % 3 + 1;

And get a random number from 1 to 3.
How to do it right?
Вернуться к началу

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

Re: RMG SOD

Сообщение RoseKavalier » 14 дек 2019, 12:23

The road selection buttons are an HDmod addition, I'd suggest just calling the function at 0x54878B, should work for both HDmod and without.

Код: Выделить всё
STDCALL_0(DWORD, FuncAt(0x54878B)) % 3 + 1;
Вернуться к началу

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

Re: RMG SOD

Сообщение as239 » 17 дек 2019, 16:54

А как получить координаты x,y,z объекта RMG_MapItem?
Вернуться к началу

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

Re: RMG SOD

Сообщение RoseKavalier » 17 дек 2019, 20:36

You have to perform the "reverse logic" of obtaining RMG_MapItem when given x,y,z

Obtaining:
Код: Выделить всё
RMG_MapItem* Get(RMG_Map* map, int x, int y, int z)
{
   int w = map->mapWidth;
   int h = map->mapHeight;

   //return &map->mapItems[z * (w + h) + y * w + x];
        // refactors to
   return &map->mapItems[(z * h + y) * w + x];
}


Reversing:
Код: Выделить всё
RMG_Coordinates GetCoord(RMG_Map* map, RMG_MapItem* it)
{
   RMG_Coordinates coord;

   UINT delta = it - map->mapItems;
   UINT sz = map->mapWidth;

   coord.x = int(delta % map->mapWidth);
   delta /= map->mapWidth;
   coord.y = int(delta % map->mapHeight);
   coord.z = int(delta / map->mapHeight);
   return coord;
}


Same thing with H3MapItems and other similarly allocated arrays.
Вернуться к началу

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

Re: RMG SOD

Сообщение as239 » 20 дек 2019, 07:21

I need to know which zone is human player zone.
RMG_Zone has "type":
// * +4
// * 0 human
// * 1 computer
// * 2 treasure
// * 3 junction
But it never has "1" value, only "0" for humans and computers zones, and "2" for treasures.
Вернуться к началу

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

Re: RMG SOD

Сообщение as239 » 05 янв 2020, 13:32

С изменением порядка формирования дорог все получилось.
Также я научился отправлять дороги из точки А в точку B.

Теперь главная проблема: найти место где RMG размещает объекты на карту.
Это позволит избавиться от блоков вдоль дорог.
Прошло уже наверно полгода, а я все никак не могу найти это место.

Ну и по-прежнему есть проблема с RMGMapItems_00531D80_CantPlace, если в ней сдвигать объекты, неважно через HiHook или LowHook, иногда в центре на JC заметно уменьшается плотность объектов.
Почему это происходит совершенно не понятно.
В каком месте правильно сдвигать объекты, чтобы это не влияло на плотность наполнения зоны?
Вернуться к началу

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

Re: RMG SOD

Сообщение as239 » 25 янв 2020, 07:43

Может кто знает, что делают следующие функции:
sub_00535E60
sub_00535AD0
sub_0054D4E0
sub_00532370
sub_005362E0
sub_00535600
sub_005363D0
RMG_005475C0
sub_00547160
sub_00546EA0
?
Вернуться к началу

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

Re: RMG SOD

Сообщение RoseKavalier » 25 янв 2020, 13:16

Vector12_Insert_54D4E0
RMG_SetPosition_532370(RMG_Map *this, _RMGObject_ *a2, int x, int y, int z)
Вернуться к началу

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

Re: RMG SOD

Сообщение as239 » 28 янв 2020, 11:04

Thanks!

But I have 6 parametrs in this function:
Код: Выделить всё
int __userpurge RMG_SetPosition_532370@<eax>(_RMGMap_ *a1@<ecx>, int a2@<ebx>, _RMGObject_ *a3, int a4, int a5, int a6)


Also, the monster and object calls of this function, have 6-th parameter = 0:
Код: Выделить всё
RMG_SetPosition_532370(RMG_Map, value, item, v12, v13, 0);//546AC9
......
RMG_SetPosition_532370(v2, (int)v3, (_RMGObject_ *)NewMonster, v47, v80, 0);//5358F0
Its strange, “z” coordinate couldn’t be always = 0.

I need to manage the monster position in the treasury block (5358F0).
Looks like, it`s here (5358F0):
Код: Выделить всё
  sub_0051B3A0((int)&v2[1].mapHeight, (DWORD *)v2[2].VMT, (_RMGObjMonster_ *)&NewMonster);
  RMG_SetPosition_532370(v2, (int)v3, (_RMGObject_ *)NewMonster, v47, v80, 0);

How can I get here all objects in the treasury block?
There must be a vector that stores these values.
Looks like, here is the place where object is adding to that vector RMG_SetTreasureObjectsGroup_546A10:
Код: Выделить всё
AddItemToList(&RMG_Map[1].mapHeight, (void **)RMG_Map[2].VMT, 1u, (void **)&item);
RMG_SetPosition_532370(RMG_Map, value, item, v12, v13, 0);

But how can I get this vector? Decompilation looks wrong , &RMG_Map[1].mapHeight – isn’t vector (list).
Вернуться к началу

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

Re: RMG SOD

Сообщение RoseKavalier » 28 янв 2020, 14:37

IDA disassembler isn't perfect, you have to verify what it shows you.
Изображение
There's is no parameter sent through ebx (your a2@<ebx>) in MSVC.

this (ecx or a1) seems to be a derived class from _RMGMap_ and seems to have at least 1 vector at its end.
So something like...
struct _RMGLocalMap_ : _RMGMap_
{
vector<> something;
// maybe more
}
Вернуться к началу

Пред.След.

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

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

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

cron