(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-функций сами знаете откуда вполне помогает ориентироваться в коде по сравнению с тем, что было в древней воговской базе.