Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Моддим HotA
DF2 :: ФОРУМЫ > Игровые форумы > Heroes of Might & Magic III > Моды
Страницы: 1, 2, 3, 4, 5
Haart of the Abyss
Цитата(Samail @ 19 Jan 2021, 19:03) *
Время суток добра и позитива (ну или наоборот)
Почему некоторые артефакты не появляются в продаже на "чёрном рынке", в спецификации карты они разрешены ._.

Артефакты, являющиеся целью квеста (хижина провидца, страж прохода, условие победы) там не появляются. Сборники, кажется, тоже, даже если разрешены. Оно?
Samail
Хспд вот оно чё Пихалыч... )
Little_Den
Доброго времени суток. Хочу добавить нового юниту в игру. Пока пробую путем правки exe файла, где незадействованно существо 122. Каким образом можно присвоить def-ки ?
hippocamus
Exe вообще не надо трогать.
Нужно добавить запись в hota.dat
Little_Den
Цитата(hippocamus @ 05 Feb 2021, 13:15) *
Exe вообще не надо трогать.
Нужно добавить запись в hota.dat

Что вы имеете ввиду ? Добавлять юнита через правки hota.dat, или def-ки ?
hippocamus
Цитата(Little_Den @ 05 Feb 2021, 18:35) *
Что вы имеете ввиду ? Добавлять юнита через правки hota.dat, или def-ки ?
Конечно. Дефки - в lod, описание - в dat. Покопайся в dat, поищи, например, как там описаны Корсары.
h3hota.exe - почти неизменный экзешник СОД. Его задача - запустить hota.dll, которая дальше уже всё делает, в том числе подгружает лоды и дат.
Хоботов
Цитата(hippocamus @ 05 Feb 2021, 19:02) *
Дефки - в lod, описание - в dat. Покопайся в dat, поищи, например, как там описаны Корсары.
h3hota.exe - почти неизменный экзешник СОД. Его задача - запустить hota.dll, которая дальше уже всё делает, в том числе подгружает лоды и дат.

Такой вопрос:
допустим, добавил человек новый юнит, все замечательно. Потом выходит долгожданная фабрика, все обновляется.. и новый юнит пропадет ведь и надо его снова добавлять, так ведь?
Если все так - было бы здорово, чтобы пользовательские изменения не затирались. Хотя бы некоторые, не критичные (по типу своих юнитов или портретов своих героев, словом все то, что может мирно сосуществовать с основной Хотой)
hippocamus
Нового юнита нужно будет добавлять снова.
Так что - да, мод должен делаться в виде инсталлятора. Не так уж трудно.
А пользовательские изменения затираться будут, потому что команда ХотЫ не приветствует моддинг.
Что касается лодов, то можно в принципе использовать неиспользуемый в релизах hota_ext.lod - но изменения dat-файла придётся производить время от времени. Правки в шаблонах также затрутся, поэтому нужно править дубликаты.
dat-файл по сути является TStream - потоком для любых записей, в любом порядке, причём, тип записи, похоже, определяется по его id. crbank25 - это Вертеп, crbank29 - Погост. art159 - Кольцо Забвения, art163 - Печать Заката.
Для банков, артефактов, юнитов, почв, городских построек, героев, классов - хранятся совершенно разные поля.
Хоботов
Цитата(hippocamus @ 05 Feb 2021, 20:43) *
Так что - да, мод должен делаться в виде инсталлятора. Не так уж трудно.

Ну то-есть практика будет такая: обновился - снова свой инсталлятор запустил?
А насчет того, что не трудно - нет ли какого-либо гайда на этот счет?
Я вот в исталляторах не силен и если бы стал что-то такое писать - то просто exe-шник,
который в лоб открывает файл с ресурсом и вписывает нужные данные по нужным смещениям.


Цитата(hippocamus @ 05 Feb 2021, 20:43) *
А пользовательские изменения затираться будут, потому что команда ХотЫ не приветствует моддинг.


Да не такой уж это и моддинг, свои юниты и герои - это, так сказать, Аддонинг)
Небольшой шажек в направлении от простой карты.
Надеюсь, команда ХотЫ со временем станет помягче относиться к мыслям своих фанатов в этом направлении.
hippocamus
Цитата(Хоботов @ 05 Feb 2021, 20:52) *
Я вот в исталляторах не силен и если бы стал что-то такое писать - то просто exe-шник,
который в лоб открывает файл с ресурсом и вписывает нужные данные по нужным смещениям.
Ну, чтобы заменить монстра #122 вам, возможно, и подойдёт моддинг экзешника, но тогда нечего и говорить о ХотА - это будет моддинг СОД в рамках ХотА.
А с инсталлятором - я не буду вам помогать, потому как я - бывший участник команды ХотА - и так дал вам достаточно намёков, чтобы вы могли за что зацепиться, если хотите моддить. Кто ищет - тот найдёт.
Little_Den
Не знаю как, но анимацию прицепил smile.gif Спасибо hippocamus. Теперь возник вопрос с портретом юнита. Я так понимаю хотовский файл TWCRPORT с хитринкой. Не подскажите как открыть ? MMArchive его не проигрывает, DefPreview не принимает, Reseditor выдает ошибку.
XEPOMAHT
Цитата(Little_Den @ 17 Feb 2021, 21:16) *
Не подскажите как открыть ?


Открыть и распаковать не проблема (программа давным давно есть). Паковщик DEF-ов по-прежнему есть только у HotA Crew (мне заниматься этим лень).
hippocamus
Little_Den
Попробуйте загрузить копию нужного вам заменяемого кадра из TWCRPORT.DEF (то есть с тем же именем и расширением) непосредственно в hota.lod
Не уверен, что это сработает, но - вдруг?
Raistlin
Есть ли возможность без лишних танцев с бубном подгрузить плагин для хотовского НD-мода? Если да, то как? Подскажите пожалуйста smile2.gif
Хоботов
Прошу подсказать или хотя бы дать направление куда копать по следующему вопросу:

Добавляю в HotA.dat нового героя. Все вроде бы нормально - герой как и нужно предлагается в редакторе карт, если его выбрать - за него можно играть на созданной карте.
В редакторе шаблонов он тоже есть среди списка героев. Его даже можно из колонки "по умолчанию" в колонку "включенных" перенести.
Но при попытке начать игру на каком-то шаблоне его нет среди предлагаемых героев, даже не смотря на то, что согласно своему классу он должен принадлежать данному городу. Я в редакторе шаблонов отключил для этого города родных героев - вдруг новому просто места не хватило? - но это не помогло.

Такие же эффекты есть, если поменять класс у героя, который был в HotA.dat изначально. Например, сменить для Жизель класс с рейнджера на капитана, а потом в редакторе шаблонов отключить некоторых изначальных капитанов, чтобы дать ей место. Это тоже не срабатывает - Жизель пропадает из окна выбора Оплота, но в окне выбора Причала не появляется.

У меня стало складывать ощущение, что помимо класса героя, где-то еще прописывается его связь с городом.
Так ли это и где приблизительно такая связь могла бы быть?

Заранее спасибо за любую помощь!
hippocamus
Хоботов
Нет, у героя нет привязки к фракции, только к классу. А у класса есть привязка к фракции.
Но ведь где-то есть таблицы, содержащие по 16 героев для каждой фракции - ведь берутся не первые 16, а заданные.
И эти таблицы, очевидно, прописаны в hota.dll, а не в hota.dat
Хоботов
Цитата(hippocamus @ 01 Apr 2021, 00:49) *
Но ведь где-то есть таблицы, содержащие по 16 героев для каждой фракции - ведь берутся не первые 16, а заданные.
И эти таблицы, очевидно, прописаны в hota.dll, а не в hota.dat

Но героев все-таки больше 16-ти.
Для причала я могу на джебусе разрешить, например, Тарка и запретить кого-то из стандартных причальских героев - и увижу Тарка в окне выбора.

Однако какая-то таблица похоже что и правда где-то есть скорее всего. Теоретически, она могла бы и в hota.dat находиться - это же статические данные, почему нет?
feanor
Цитата
Но ведь где-то есть таблицы, содержащие по 16 героев для каждой фракции - ведь берутся не первые 16, а заданные.

В ванилле берутся именно что первые 16 не запрещенных (например, флагами доступности только в кампании).
Хоботов
Всем доброго дня!

С работой окошка выбора героя разобраться не удалось.
Но если сделать шаблон, на котором оставлены только мои новые герои, и начать игру на нем - то они будут все же выданы игрокам (по всей видимости, случайным образом, так как выбрать самому ничего нельзя и остается только пункт "рандом").
Также новые герои могут быть куплены в таверне. То есть они довольно полноценные - просто логика работы окошка выбора задана особым программным образом где-то в hota.dll.

Также обнаружил некоторые сложности с указанием специализации героя. А именно - похоже, что блок в hota.dat, который описывает героя, не задает его специализацию.
Первый новый добавленный герой (hero179) получил специальность стрельба - как у Оррина.
Второй (hero180) - стрелки, как у Валески.
Будто бы произошло какое-то переполнение, взятие по модулю от нормального числа героев, и выдача специльностей началась с начала.

Как думаете - эта логика тоже задается в hota.dll, или я просто чего-то не нашел в hota.dat?
Есть вообще возможность редактируя hota.dat добавить новую специальность?
Не какую-то оригинальную, а примитивную - вроде специалиста по заклинанию Взрыв или специалиста по юнитам Крестьяне?
hippocamus
Цитата(feanor @ 01 Apr 2021, 09:44) *
В ванилле берутся именно что первые 16 не запрещенных (например, флагами доступности только в кампании).
Если в СОД разрешить Лорда Хаарта в карте - то он будет, а Мюллиха не будет?

Цитата(Хоботов @ 01 Apr 2021, 01:25) *
Однако какая-то таблица похоже что и правда где-то есть скорее всего. Теоретически, она могла бы и в hota.dat находиться - это же статические данные, почему нет?
Теоретически - могла бы, но её там нету, я знаю структуру hota.dat
Хоботов
Всем доброго времени суток! Хочу посоветоваться насчет не совсем моддинга Хоты, но в чем-то смежной темы - структуры её файла .h3m.
После распаковки из gzip'а карты, например [HotA] A Cold Day in Hell.h3m, в первых 16 байтах вижу следующее:

00000000: 20 00 00 00-01 00 00 00-00 00 01 48-00 00 00 00

где 20 00 00 00 == 0x20 - версия homm3 HotA.
01 00 00 00-00 00 - байты неопределенного назначения.
01 - наличие игроков на карте
48-00 00 00 == 0x48 == 72 - размер карты.

ну и далее, не в этом уже суть.

Вопрос по байтам неопределенного назначения - что это может быть?

У более новой карты - [HotA] With Sword and Fire.h3m - их кажется что больше и они там такие:
03 00 00 00-00 00 0C 00-00 00

Вроде бы это дополнительный локальный номер версии Хоты.
Но почему размер разный и так много байт под это?

Пока что кажется что у 01 00 00 00-00 00
01 00 00 00 == 0x01 - это размер. И последние два нуля - это два байта каких-то данных.
(размер в 16-битных машинных словах)

А у 03 00 00 00-00 00 0C 00-00 00
размер 03 00 00 00 == 0x3 и 00 00 0C 00-00 00 - это 6 байт данных.

Если это версия - то у старой карты это 0 и у новой - 0.12.0 ?
Как-то это странно.

Может кто в курсе или у кого какие еще есть мысли?
Не то чтобы это было критически важно знать, но мне крайне любопытно стало.
XEPOMAHT
Цитата(Хоботов @ 17 Sep 2021, 23:39) *
Может кто в курсе или у кого какие еще есть мысли?
Не то чтобы это было критически важно знать, но мне крайне любопытно стало.


считывается dword, умножается на 2, полученное количество байт пропускается, т.к. никто эти данные не разбирал, возможно, какой-то внутренний индентификатор версии карты или что-то ещё...
hippocamus
У меня было вот так:
Код
procedure TH3MFile.HeaderRead;
var
  Buffer: TRSByteArray;
  SizeBuffer, L: LongWord;
  PackedMap: GZFile;
  FN: AnsiString;
begin
  Stream.Read(Version, 4);
  if Version mod $1000000 = $088B1F then
    try
      Stream.Seek(-4, soFromEnd);
      Stream.Read(SizeBuffer, 4);
      Buffer := nil;
      SetLength(Buffer, SizeBuffer);
      FN := Stream.FileName;
      Stream.Free;
      PackedMap := GZOpen((FN), 'r');
      GZRead(PackedMap, Buffer, SizeBuffer);
      UnpackFileName := 'temp.h3mu';
      RSSaveFile(UnpackFileName, Buffer);
      GZClose(PackedMap);
      Stream := TFileStream.Create(UnpackFileName, fmOpenRead);
      Stream.Read(Version, 4);
    except
      ErrorMessage(s_error, 'Этот файл не является корректным запакованным файлом карты!');
      raise;
    end;
  if Version = HotA then Stream.Read(Subversion, 4)
    else Subversion := 0;
  Stream.Read(IsPlayable, 1);
  Stream.Read(SizeX, 4);
  SizeBuffer := 0;
  SizeY := SizeX;
  Stream.Read(SizeBuffer, 1);
  SetLength(Layers, SizeBuffer + 1);
  H3MStringRead(Title);
  H3MStringRead(Description);
  Stream.Read(Hardness, 1);
  if Version >= AB then
    Stream.Read(MaxLevel, 1);
end;

Не уверен, что новые Хота-файлы откроются, я писал это ещё очень давно, но все старые форматы читались корректно.
Некоторые вещи (различные SizeX и SizeY) создавались под будущие изменения, мой редактор умел читать и (теоретические) многослойные карты и прямоугольные.
Хоботов
Цитата(XEPOMAHT @ 18 Sep 2021, 11:28) *
Цитата(Хоботов @ 17 Sep 2021, 23:39) *
Может кто в курсе или у кого какие еще есть мысли?
Не то чтобы это было критически важно знать, но мне крайне любопытно стало.

считывается dword, умножается на 2, полученное количество байт пропускается, т.к. никто эти данные не разбирал, возможно, какой-то внутренний индентификатор версии карты или что-то ещё...

На HotA 1.7.1 - алгоритм дает сбой. (на 1.7.0 не смотрел)
считываем dword - там это значение 6.
умножаем на 2 - получаем 12.
а пропускать надо 11 байт.
есть у кого мысли, почему так?
hippocamus
Так не надо умножать на 2. В прошлый раз просто повезло что совпало. Надо читать каждое поле последовательно.
Вам написали:
Цитата
никто эти данные не разбирал, возможно, какой-то внутренний индентификатор версии карты или что-то ещё...
Вот, возможно уже разобрали.

ЗЫ. Ты бы хоть адрес дал, чтобы понимать - о чём ты...
Хоботов
00000000: 20 00 00 00-06 00 00 00-00 00 0C 00-00 00 0B 00
00000010: 00 00 1F 00-FC 00 00 00-01 00 00 00-00 00 00 00

20 00 00 00 в начале - признак хоты.
06 00 00 00 - это тот dword о котором я пишу.
FC 00 00 00 - это размер карты. ноль перед FC - это значит что на карте не выставили ни одного игрока.
в вот то что перед этим и до 06 - не известно.
вообще каждое поле мне знать не надо. возможно в будущих версиях они добавятся новые еще.
хотелось бы получить надежный алгоритм получения смещения поля с размером карты, алгоритма, который бы не отваливался при обновлении.

XEPOMAHT
Цитата(Хоботов @ 07 Jul 2024, 00:04) *
хотелось бы получить надежный алгоритм получения смещения поля с размером карты, алгоритма, который бы не отваливался при обновлении.


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

Цитата(Хоботов @ 07 Jul 2024, 00:04) *
06 00 00 00 - это тот dword о котором я пишу.


Подверсия 6 добавила 2 дворда.

Код
if (subversion < 2) then (readbyte; readbyte)
if (subversion < 7) then (readdword; readdword)
Хоботов
Цитата(XEPOMAHT @ 07 Jul 2024, 13:28) *
Код
if (subversion < 2) then (readbyte; readbyte)
if (subversion < 7) then (readdword; readdword)

Там же еще особое условие для подверсии 3 должно быть?
XEPOMAHT
Цитата(Хоботов @ 07 Jul 2024, 16:06) *
Там же еще особое условие для подверсии 3 должно быть?


Да, исходя из того, что там записано. У меня заголовка подверсии 3 нету.
tolich
Может, так:
Код
if (subversion < 2) then (readbyte; readbyte)
else if (subversion < 7) then (readdword; readdword)
XEPOMAHT
Цитата(tolich @ 07 Jul 2024, 19:24) *
Может, так:
Код
if (subversion < 2) then (readbyte; readbyte)
else if (subversion < 7) then (readdword; readdword)


Нет, else лишнее. Скорее так, если учитывать подверсию 3:

Код
if (subversion > 0) then (readbyte f; readbyte f) -- проверка на подверсию 1
if (subversion > 2) then (ReadLong f) -- проверка на подверсию 3
if (subversion > 5) then (ReadLong f) -- проверка на подверсию 6
tolich
Да, с > это выглядит понятнее — 10 байт читается для подверсии 6, а не 1.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.