Quote:Например ERA+ забирает себе _GameMgr_, _AdvMgr_, а так же все таблицы городов/героев/монстров/артефактов/двеллингов.
Мне видится правильным такой подход к разработке платформ, при котором обеспечивается максимально широкий доступ к модификациям, богатый формат описания объектов и отсутствие привязки к фиксированным значениям. То есть правильный плагин на новых монстров — это плагин, парсящий json из VCMI и предоставляющий API для получения адреса таблицы с монстрами, размера одной записи, максимального числа монстров, актуального числа монстров. Завязывать же всю игровую структуру, а то и все структуры на конкретном разработчике нельзя.
Вероятно, разумным будет предложить библиотеку с методами получения/установки адресов и пределов для всех основных игровых структур.
ПолучитьМаксимальныйИДМонстра, ПолучитьЧислоМонстров, ПолучитьТаблицуМонстров. Установить первое, втрое и третье.
Поскольку правильное расширение структур, на мой взгляд, должно иметь динамическую природу (монолитов 8, 50 или 100 зависит от содержимого json-конфигов), то и переносить подструктуры по методу Хероманта или Игрика не вариант. Исходный код gameManager->twoWayTeleports всё время генерирует команду доступа от базового адреса, который можно пропатчить смело, не боясь нарушить остальной код, поскольку далее будет всё тот же gameManager->другоеПоле, который компилятор не имел права оптимизировать. Доступ по указателю — это такая штука, которая предполагает, что значение указателя может измениться даже из соседнего потока. Потому чаще всего можно подструктуру перенести на массив динамического размера без последствий. Если найдёте в патче Хероманта доказательство обратного, сообщите, пожалуйста.
После переноса остаётся несколько вопросов:
-) Какой теперь новый адрес подструктуры?
-) Размер её элемента?
-) Количество элементов?
Вопрос, схожий с обсуждением RedirectMemoryBlock/GetAddr и решаемый на уровне АПИ и соглашений, а не на уровне «никто не имеет права расширять ни одну структуру кроме автора мода ХХХ». Стоит ещё раз подумать, какого АПИ хватило бы всем.
Для начала можно попробовать сделать 26 монолитов отдельным модом. Можно не вносить пока изменений в движок.
igrik, у меня в моде Mixed Neutrals всё есть: регистрация монстров, автоматическое их индексирование, функция генерации монстров по фракциям, включая союзные фракции, учёт ограничений по уровням и т.д. На текущий момент не вижу проблемы в том, чтобы используя мощь мода в пять строк написать скрипт, который пройдётся и заменит всех монстров на карте на случайные. Непринуждённо так и с сохранением уровня существ. В будущем плагин на новых монстров должен предоставлять схожее АПИ и да, подменять указанную функцию.
Была идея вычленить из Mixed Neutrals по сути подмод Monsters Framework, который и нужен всем скриптам для генерации монстров.