[ВОПРОС] Попытка модификации стандартного RMG - Форум HeroesWorld-а

Быстрая навигация по основным разделам форума:
Турниры
КАРТЫ
Heroes 6
Heroes 5
Heroes 4
Heroes 3
Heroes 2
Heroes 1
Might&Magic

Герои Меча и Магии 5 - Модостроительство В этом разделе можно обсуждать все что касается создания модов для Heroes of Might and Magic V.

Ответ
 
Опции темы
#1
Старый 27.03.2022, 22:44
  #1
^
Milnesium
 
Аватар для Milnesium
📖
Регистрация: 27.03.2022
Сообщения: 3
Milnesium#0232
Регистрация: 27.03.2022
Сообщения: 3
Milnesium#0232
Вопрос
[ВОПРОС] Попытка модификации стандартного RMG

Всем доброго времени суток.


В общем, довольно давно уже хочу сделать универсальный инструмент для генерации карт, на которых можно было бы удобно и балансно играть с друзьями. Пробовал создавать собственные шаблоны, как для стандартного RMG, так и для IRMG, однако у каждого из них есть как значительные плюсы, так и минусы. Например IRMG:



  1. Во-первых мне не нравится алгоритм генерации зон. Дело в том, что в 90% случаев соединение между зонами осуществляется при помощи портала, и это сильно не удобно. Когда открыто много зон, то в них легко потеряться и запутаться. А когда пробиваешься из одной зоны в другую – то пробиваться нужно дважды. Особенно проблемно – что вторую пробивку не видно, и узнать кто по ту сторону портала можно только когда пути назад уже нет.

  2. Во-вторых – генерация ресурсов. Мелочь, но на мой взгляд было бы интереснее и баланснее если бы ресурсы генерировались небольшими группами, которые бы охранялись. Сейчас они генерируются по-одному и без охраны. В принципе, добавить охрану к каждой кучке – не проблема, но это уже перебор, учитывая их общее количество на карте.

  3. В-третьих – генерация артефактов. Сейчас логика для шаблона такова, что вручную задается шанс генерации каждого отдельного артефакта для конкретной зоны. Отсюда может возникнуть дисбаланс. Например, для стартовой зоны 1-го и 2-го игроков, если выбрать 25 минорных артефактов с вероятностью генерации ~0,08, в расчете что каждый игрок получит по 3 минорных арта – вполне может возникнуть ситуация что у игрока 1 сгенерится этих артефактов 5, в то время как у игрока 2 – только 1. Должен отметить, что этот недочет мне и удалось пофиксить, хотя и достаточно колхозно.


Теперь же, если посмотреть алгоритм генерации карт стандартного RMG, то можно увидеть, что 1 и 2 минусы IRMG здесь решены. Расположение зон на карте как правило таково, что использование порталов сведено к минимуму, а ресурсы зачастую расположены в охраняемых кучках.


Тем не менее, у RMG есть и свои минусы, основным из которых я считаю то, что нельзя задать генерацию конкретного объекта на карте, в большинстве случаев. Для шаблона задается сумма стоимостей объектов, которые относятся к определенной группе. Например, если в шаблоне задать общую сумму ShopPoints = 30, то из нее может сгенериться любой набор строений из списка NewShopBuildings


Например, Black Market + Hill Fort + Trading Post. Однако, хотелось бы иметь возможность задавать конкретную генерацию конкретного объекта в определенной зоне. Например, мне нужна лавка артефактов. Но если задать ShopPoints равной 15 я вполне могу получить в зоне форт на холме и элементалятню.


Конечно, можно сказать, что все эти минусы – незначительные. Те же кучки ресурсов можно заменить трежарками, например. Но, тут я не соглашусь. Не все трежарки равнозначно защищены. Например, пробить чащу энтов ради дерева и хранилище горгулий ради камня – равных, вроде бы, ресурсов – совсем не равная задача.


Поэтому я решил попробовать модифицировать генераторы. Модифицировать IRMG очевидно сложнее, потому что нужно менять сами алгоритмы генерации. Так уж проще свой генератор написать – а для этого опыта мне гарантированно не хватит. Лучше уж обойтись малой кровью.


Таким образом, начал копаться в том, как устроен стандартный генератор. Нашел что для каждой конкретной зоны строения, которые могут в ней генерироваться определяются в файле data.pak\GameMechanics\RefTables.xdb. Например, если из группы:


→ RACE_HEAVEN → NewShopBuildings


Удалить все строения, кроме, например, Trading_post, то в человеческой зоне кроме фактории на очки магазина больше ничего генериться не будет. Получается, известно где определяется список возможных генераций для каждой зоны, теперь нужно найти, где RMG хранит список всех используемых групп. Пошарился в Data.pak, нашел что судя по всему, список хранится в types.xml. конкретно, начиная с 46505 строки начинается категория


<TypeName>RMGPreset</TypeName>

В которой, в частности есть такие подкатегории, как:


<Item>   
   <Type>490d4cdf</Type>
   <Name>NewShopBuildings</Name>
   <ChunkID>19</ChunkID>
   <Description/>
   <Constraints/>
   <Attributes/>
   <DefaultValue>
      <Type>00000000</Type>
   </DefaultValue>
   <ComplexDefaultValue>
      <Type>00000000</Type>
   </ComplexDefaultValue>
</Item>

Всего 26 подкатегорий. У каждой уникальный Type и ChunkID. Остальные атрибуты одинаковые. Дальше по файлу также есть категория, которая также содержит в себе данные подкатегории в следующем виде:


<Item>
     <__ClassTypeID>270082827</__ClassTypeID>
     <__ServerPtr>490d4cdf</__ServerPtr>
     <Type>TYPE_TYPE_ARRAY</Type>
     <EnclosingNamespace>5903800f</EnclosingNamespace>
     <BoundTo>NewShopBuildings</BoundTo>
     <Field>
          <Type>5a065235</Type>
          <Name/>
          <ChunkID>-1</ChunkID>
          <Description/>
          <Constraints/>
          <Attributes/>
          <DefaultValue>
                <Type>00000000</Type>
          </DefaultValue>
          <ComplexDefaultValue>
                <Type>00000000</Type>
          </ComplexDefaultValue>
     </Field>
</Item>

В которой для каждого из «объектов» отличается только ServerPtr, который равен Type в предыдущей категории. Все остальные значения, такие как ClasssTypeID, EnclosingNamespace и Type – одинаковы для всех. Я попробовал добавить новую категорию в оба этих места, поменяв только имя. Очевидно, нужно каким-то образом назначить также уникальный ServerPtr и Type, но как – я пока не знаю. Пока что попробовал добавить с повторяющимся – и, ожидаемо, герои перестали запускаться.


Начал читать форумы здесь, в частности тот тред, где люди обсуждали добавление новых спеллов – выяснилось что помимо изменений в types.xml нужно также внести изменения в .exe через hex-редактор. Я с таким до этого не сталкивался, только вот сел изучать hex редакторы, но решил что может быть будет профитнее также завести здесь отдельную тему.


В общем, господа мододелы, и все интересующиеся. Если задача кажется не сложной, и стоящей внимания – то я бы не отказался от помощи. В любом случаем я буду продолжать копать, но люди с опытом однозначно разберутся быстрее. К тому же, может быть то, что я нашел – совсем не то что нужно. В обозримом будущем хотелось бы завести несколько отдельных категорий для шаблонов, в которые вынести ментора, лавку артефактов и т.д. По одному объекту на шаблон, как сейчас уже реализованы тюрьма и картограф. На мой взгляд это уже добавит значительную долю гибкости в генерируемые карты. Также в будущем, хотелось бы вынести артефакты в отдельные категории – minor/major/relic, а от сейчас они в одной сумме с  ресурсами, где им не место.


Заранее извиняюсь за обилие тафталогии и, может быть, местами непонятное изложение, старался как мог. Такие дела. Всем спасибо за внимание.

Milnesium вне форума
Ответить с цитированием
#2
Старый 28.03.2022, 08:05
  #2
^
}{0TT@6bI4
 
Аватар для }{0TT@6bI4
📖
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1604
Выставка наград
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1604
Выставка наград
По умолчанию
Re: [ВОПРОС] Попытка модификации стандартного RMG

Вы проделали большую работу, но я вас разочарую. То, что вы нашли в types.xml, это есть просто определение полей редактора. То есть, если вы удалите строчку с NewShopBuilding, у вас просто пропадёт в редакторе вкладка с возможностью изменения этой строчки.
Собственно, все свойства, указываемые под такими графами, нужны только для того, чтобы редактор карт понимал, какой файл/элемент он должен содержать в этом поле и какой элемент он должен создавать при нажатии New.

Я как-то развлекался с ними, получалось добавлять новые поля (например, 3X3SizeCreatureTexture smile), но вот биндить их к функционалу (как в коде в вашем втором примере) я не сумел.
__________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
}{0TT@6bI4 сейчас на форуме
Ответить с цитированием
#3
Старый 28.03.2022, 14:38
  #3
^
Milnesium
 
Аватар для Milnesium
📖
Регистрация: 27.03.2022
Сообщения: 3
Milnesium#0232
Регистрация: 27.03.2022
Сообщения: 3
Milnesium#0232
По умолчанию
Re: [ВОПРОС] Попытка модификации стандартного RMG

Хм, конечно, обидно если все действительно так. Но тогда возникает вопрос.Если я правильно понимаю, то под определением полей редактора вы имеете ввиду их отображение в UI интерфейсе пользователя? Просто, насколько я зннаю, ни в exe-шке Героев, ни в exe-шке Редактора карт по умолчанию нет возможности редактировать шаблоны, а вся эта мишура, (ShopPoints, TreasuryPoints и т.д.) встречается только в шаблонах. В настройках генератора доступна только возможность выбора города, наличия воды и т.д. То есть получается, что нет такого интерфейса, где были бы поля с названиями ShopPoints и т.д., может быть, эти поля в types.xml все-таки отвечают за что-то другое? (Было б идеально если за то что надо, конечно)
Вообще, я вроде бы прошарил во всех файлах .xml .xdb, и решил что в types.xml именно то что надо вот почему: в таблице RefTables.xdb, которая определяет набор объектов в категории, категория называется NewShopBuildings, а в шаблонах очки категории называются ShopPoints, значит должно было быть место, которое бы выставляло для RMG однозначное соответсвие, что ShopPoints - относятся именно к NewShopBuildings, а не к NewShrines, например. Я думаю, вряд-ли эта инфа зашита в exe-шнике (Хотя кто его знает), и других место, где бы можно было проследить это соответствие не нашел. Только types.xml
Milnesium вне форума
Ответить с цитированием
#4
Старый 28.03.2022, 18:52
  #4
^
}{0TT@6bI4
 
Аватар для }{0TT@6bI4
📖
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1604
Выставка наград
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1604
Выставка наград
По умолчанию
Re: [ВОПРОС] Попытка модификации стандартного RMG

Первый приведённый вами код отвечает именно за отображение этого графа в UI редактора карт. Если вы в поле Description тэг раскроете и впишете List of shops which could be used, то в редакторе карт напротив этой графы в столбце Description будет... эта самая фраза.

И связь между элементами в xdb и игровыми механиками очень часто осушествляется через exe и в этом ничего нет удивительного. В exe прописано читать общий список NewShopBuildings, который лежит в RefTables, через него случайным образом набирать, учитывая значение ShopPoints, случайные здания.

Анализирую второй код:
Привязать к графе NewShopBuildings поле <Настройки поля>, тип графа TYPE_TYPE_ARRAY (массив, или же, по-русски, список)
__________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
}{0TT@6bI4 сейчас на форуме
Ответить с цитированием
#5
Старый 28.03.2022, 18:53
  #5
^
}{0TT@6bI4
 
Аватар для }{0TT@6bI4
📖
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1604
Выставка наград
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 1604
Выставка наград
По умолчанию
Re: [ВОПРОС] Попытка модификации стандартного RMG

Вероятно, второй код отвечает за привязку типа поля к конкретному графу...

Но возможность настройки списка зданий генерации для конкретных щаблонов через types.xml маловероятно. Как минимум, это всё нужно будет еще организовать в exe или dll, которые привязку осуществляют
__________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
_________________
}{0TT@6bI4 сейчас на форуме
Ответить с цитированием
#6
Старый 28.03.2022, 20:52
  #6
^
Milnesium
 
Аватар для Milnesium
📖
Регистрация: 27.03.2022
Сообщения: 3
Milnesium#0232
Регистрация: 27.03.2022
Сообщения: 3
Milnesium#0232
По умолчанию
Re: [ВОПРОС] Попытка модификации стандартного RMG

Понял. Жаль что так, пока что получается слишком сложная задача, чтобы ее реализовать, если нужны кастомные ехе или dllки. Ладно, сделаю для себя тогда настройку в RefTables через невзаимозаменяемые суммы для объектов - чтобы получать нужные мне объекты в конкретных зонах, напишу под них шаблоны, посмотрим что из этого выйдет.
Большое спасибо за помощь.
Milnesium вне форума
Ответить с цитированием
Ответ


Опции темы



Часовой пояс GMT +4, время: 22:13.


vBulletin v3.5.0, Copyright ©2000-2022, Jelsoft Enterprises Ltd. (Русский)

Яндекс цитирование    Top.Mail.Ru