Форум HeroesWorld-а - Показать сообщение отдельно - [ВОПРОС] Попытка модификации стандартного RMG
Показать сообщение отдельно
#1
Старый 27.03.2022, 22:44
  #1
^
Milnesium
 
Аватар для Milnesium
📖
Регистрация: 27.03.2022
Сообщения: 4
Milnesium#0232
Регистрация: 27.03.2022
Сообщения: 4
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 вне форума
Ответить с цитированием