(22.01.2020 17:23)feanor Wrote:  Конфиги на объекты (ценности, частоты, бла, бла, бла)
Вот пример от одного типа пандорки, по сути там эта табличка потом загоняется в стек при вызове функции, заполняющей зону объектами:
mov     dword ptr [eax+4], 6 - тип объекта
mov     [eax+8], edi - возможно поддтип, обычно там ноль
mov     dword ptr [eax+0Ch], 1770h - ценность максим.
mov     [eax+10h], ebx - частота
mov     dword ptr [eax], offset RMGObjGenPandoraExp_VTable - адрес функции, ставящей объект
mov     dword ptr [eax+14h], 1388h - ценность мин.
Соответственно, если хотим ставить новый объект на карту, то табличку нужно будет дополнять новыми строками (т.е. ставить перехват в самый конец функции). Значения стандартных объектов можно менять обычным бинарным патчем.
 (22.01.2020 17:39)igrik Wrote:  И еще один момент: он пишет через заголовочники RoseKavalier
Чем плохи те, что утекли в сеть давным давно?
// 12 bytes. Сокровище зоны генератора случйных карт.
NOALIGN struct _ZoneTreasure_
{
    // +0. Минимальная ценность.
    _int32_ min_value;
    
    // +4. Минимальная ценность.
    _int32_ max_value;
    
    // +8. Частота появления.
    _int32_ density;
};
// 28 bytes. Связь зоны  генератора случйных карт с другой.
NOALIGN struct _ZoneConnection_
{
    // +0. Настройки зоны, с которой связана текущая.
    _ZoneSettings_ *another_zone_settings;
    
    // +4. Ценность прохода.
    _int32_ value;
    
    // +8. Широкий ли проход.
    _bool8_ is_wide;
    
    // +9. Охраняется ли стражем границы.
    _bool8_ has_border_guard;
    
    // +10. Была ли уже создана на заготовке карты.
    _bool8_ is_created;
    
    // +11. Результат выравнивания, не используется.
    _byte_ dummy_f11[1];
    
    // +12. Минимальное количество зон человека, необходимое для появления связи.
    _int32_ min_human_pos;
    
    // +16. Максимальное количество зон человека, подходящее для появления связи.
    _int32_ max_human_pos;
    
    // +20. Минимальное количество зон игроков, необходимое для появления связи.
    _int32_ min_total_pos;
    
    // +24. Максимальное количество зон игроков, подходящее для появления связи.
    _int32_ max_total_pos;
};
// 212 bytes. Настройки зоны генератора случйных карт.
NOALIGN struct _ZoneSettings_
{
    // +0. Номер зоны.
    _int32_ id;
    
    // +4. Тип зоны (0 - зона человека, 1 - зона ИИ, 2 - сокровищницы, 3 - пустая).
    _int32_ type;
    
    // +8. Базовый размер зоны.
    _int32_ base_size;
    
    // +12. Минимальное количество зон человека, необходимое для появления зоны.
    _int32_ min_human_pos;
    
    // +16. Максимальное количество зон человека, подходящее для появления зоны.
    _int32_ max_human_pos;
    
    // +20. Минимальное количество зон игроков, необходимое для появления зоны
    _int32_ min_ai_pos;
    
    // +24. Максимальное количество зон игроков, подходящее для появления зоны.
    _int32_ max_ai_pos;
    
    // +28. Игрок - владелец зоны.
    _int32_ owner;
    
    // +32. Минимальное количество городов без форта игрока.
    _int32_ min_player_towns;
    
    // +36. Минимальное количество городов с фортом игрока.
    _int32_ min_player_castles;
    
    // +40. Частота появления городов без форта игрока.
    _int32_ player_towns_density;
    
    // +44. Частота появления городов с фортом игрока.
    _int32_ player_castles_density;
    
    // +48. Минимальное количество нейтральных городов без форта.
    _int32_ min_neutral_towns;
    
    // +52. Минимальное количество нейтральных городов с фортом.
    _int32_ min_neutral_castles;
    
    // +56. Частота появления нейтральных городов без форта.
    _int32_ neutral_towns_density;
    
    // +60. Частота появления нейтральных городов с фортом.
    _int32_ neutral_castles_density;
    
    // +64. Должны ли все города зоны принадлежать одному типу.
    _bool8_ towns_are_the_same_type;
    
    // +65. Доступность городов.
    _bool8_ towns_aval[9];
    
    // +74. Результат выравнивания, не используется.
    _byte_ dummy_f4A[2];
    
    // +76. Минимальное количество шахт каждого типа.
    _int32_ min_mines[7];
    
    // +104. Частота появления шахт каждого типа.
    _int32_ mines_density[7];
    
    // +132. Соответствует ли тип территории родной земле города.
    _bool8_ terr_match_to_town;
    
    // +133. Доступности типов территорий.
    _bool8_ terrs_aval[8];
    
    // +141. Результат выравнивания, не используется.
    _byte_ dummy_f8D[3];
    
    // +144. Сила монстров (0 - нет монстров, 1 - слабые, 2 - средние, 3 - сильные).
    _int32_ monsters_strength;
    
    // +148. Соответствуют ли типы монстров типу города.
    _bool8_ monsters_match_to_town;
    
    // +149. Доступности монстров из городов.
    _bool8_ monsters_towns_aval[9];
    
    // +158. Результат выравнивания, не используется.
    _byte_ dummy_f9E[2];
    
    // +160. Сокровища зоны.
    _ZoneTreasure_ treasure[3];
    
    // +196. Связи с другими зонами.
    _List_<_ZoneConnection_> connections;
};
 
И добрая половина утекших имён RMG-функций сами знаете откуда вполне помогает ориентироваться в коде по сравнению с тем, что было в древней воговской базе.