Пытаюсь сдвинуть артефакт(x 4, y 10) с дороги на клетку выше x 4, y 9.
Никак не получается. Если работать через RMGMapItems_00531D80_CantPlace, то исчезает и улик, и артефакт и охрана.
Отладчиком анализировал RMG_SetPosition_532370, вызываемую из RMG_SetTreasureObjectsGroup_546A10, ничего похожего на реальные координаты объектов, там нет.
Да и с типами, там какая-то беда. 53240E, я дизассемблировал так:
- Код: Выделить всё
MapItem = &v6->mapItems[v12 + v13 * (v10 + z * v6->mapHeight)];
Но в отладчике видно, что это не MapItem, т.к. id зоны всегда 255 и прочие поля тоже не похожи.
В 0x5407D3 я вижу реальные координаты объектов, но я не понимаю, как и откуда вызывается эта функция, и что точно она делает, кроме добавления объекта в RMG_MapItem->objects.
Мне нужно найти место в коде, где генератор решает на какую координату поставить объект.
В этом примере, он ставит улик на (x 3 y 10), дальше артефакт он может поставить на любую смежную клетку, но он ставит его на (x 4 y 10), вот в это место мне нужно попасть, чтобы проверить если на тайле есть дорога, то ставим объект на другую смежную клетку.
Пытался найти это место, через анализ изменения данных RMG_MapItem, но еще больше запутался.
Ставлю хук здесь 0x54A0FE, перед вызовом RMG_GenerateObjects_00547850:
- Код: Выделить всё
_PI->WriteLoHook(0x54A0FE, WriteInVector);//5358F5? 546ACE 0x546C92 5358F5
Запоминаю все тайлы имеющие объекты.
На этом этапе, это могут быть только - города, шахты, ресурсы возле шахт, монолиты, и охраны шахт, монолитов:
_
- Код: Выделить всё
LHF_(WriteInVector){
MapItemsHasObject.clear();
for (int x = 0; x < MapSize; x++)
{
for (int y = 0; y < MapSize; y++)
{
RMG_MapItem *xyz = rmg->map.GetMapItem(x, y, 0);
if (!xyz->tileData.hasObject) continue;
auto it = std::find(MapItemsHasObject.begin(), MapItemsHasObject.end(), xyz);
if (it != MapItemsHasObject.end()) continue;
MapItemsHasObject.push_back(xyz);
}
}
return EXEC_DEFAULT;
}
Ставлю хук 0x547872, практически в самое начало RMG_GenerateObjects_00547850:
- Код: Выделить всё
_PI->WriteLoHook(0x547872, GetTreasuryBlock);//0x546C81 0x546AD3 0x546A88 0x546A20 0x546BD6 0x5478CE
Анализирую изменившиеся тайлы так:
- Код: Выделить всё
_LHF_(GetTreasuryBlock){
for (int x = 0; x < MapSize; x++)
{
for (int y = 0; y < MapSize; y++)
{
RMG_MapItem *xyz = rmg->map.GetMapItem(x, y, 0);
if (!xyz->tileData.hasObject) continue;
auto it = std::find(MapItemsHasObject.begin(), MapItemsHasObject.end(), xyz);
if (it != MapItemsHasObject.end()) continue;
TreasuryBlock.push_back(xyz);
MapItemsHasObject.push_back(xyz);
}
}
for (size_t i = 0; i < TreasuryBlock.size(); ++i){
RMG_MapItem *xyz = TreasuryBlock[i];
H3Coordinates Coord = GetCoord(xyz);
}
TreasuryBlock.clear();
return EXEC_DEFAULT;
}
Ставлю точку остановы в VS, и в первом же вызове, вижу что TreasuryBlock уже содержит все объекты, расставленные на карте, как такое может быть?