Полная версия этой страницы:
Моддим HotA
Haart of the Abyss
19 Jan 2021, 18:44
Цитата(Samail @ 19 Jan 2021, 19:03)

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

Exe вообще не надо трогать.
Нужно добавить запись в hota.dat
Что вы имеете ввиду ? Добавлять юнита через правки hota.dat, или def-ки ?
hippocamus
05 Feb 2021, 19:02
Цитата(Little_Den @ 05 Feb 2021, 18:35)

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

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

Так что - да, мод должен делаться в виде инсталлятора. Не так уж трудно.
Ну то-есть практика будет такая: обновился - снова свой инсталлятор запустил?
А насчет того, что не трудно - нет ли какого-либо гайда на этот счет?
Я вот в исталляторах не силен и если бы стал что-то такое писать - то просто exe-шник,
который в лоб открывает файл с ресурсом и вписывает нужные данные по нужным смещениям.
Цитата(hippocamus @ 05 Feb 2021, 20:43)

А пользовательские изменения затираться будут, потому что команда ХотЫ не приветствует моддинг.
Да не такой уж это и моддинг, свои юниты и герои - это, так сказать, Аддонинг)
Небольшой шажек в направлении от простой карты.
Надеюсь, команда ХотЫ со временем станет помягче относиться к мыслям своих фанатов в этом направлении.
hippocamus
05 Feb 2021, 22:58
Цитата(Хоботов @ 05 Feb 2021, 20:52)

Я вот в исталляторах не силен и если бы стал что-то такое писать - то просто exe-шник,
который в лоб открывает файл с ресурсом и вписывает нужные данные по нужным смещениям.
Ну, чтобы заменить монстра #122 вам, возможно, и подойдёт моддинг экзешника, но тогда нечего и говорить о ХотА - это будет моддинг СОД в рамках ХотА.
А с инсталлятором - я не буду вам помогать, потому как я - бывший участник команды ХотА - и так дал вам достаточно намёков, чтобы вы могли за что зацепиться, если хотите моддить. Кто ищет - тот найдёт.
Little_Den
17 Feb 2021, 21:16
Не знаю как, но анимацию прицепил

Спасибо hippocamus. Теперь возник вопрос с портретом юнита. Я так понимаю хотовский файл TWCRPORT с хитринкой. Не подскажите как открыть ? MMArchive его не проигрывает, DefPreview не принимает, Reseditor выдает ошибку.
XEPOMAHT
17 Feb 2021, 22:36
Цитата(Little_Den @ 17 Feb 2021, 21:16)

Не подскажите как открыть ?
Открыть и распаковать не проблема (программа давным давно есть). Паковщик DEF-ов по-прежнему есть только у HotA Crew (мне заниматься этим лень).
hippocamus
18 Feb 2021, 01:11
Little_Den
Попробуйте загрузить копию нужного вам заменяемого кадра из TWCRPORT.DEF (то есть с тем же именем и расширением) непосредственно в hota.lod
Не уверен, что это сработает, но - вдруг?
Raistlin
20 Feb 2021, 23:46
Есть ли возможность без лишних танцев с бубном подгрузить плагин для хотовского НD-мода? Если да, то как? Подскажите пожалуйста
Хоботов
31 Mar 2021, 20:26
Прошу подсказать или хотя бы дать направление куда копать по следующему вопросу:
Добавляю в HotA.dat нового героя. Все вроде бы нормально - герой как и нужно предлагается в редакторе карт, если его выбрать - за него можно играть на созданной карте.
В редакторе шаблонов он тоже есть среди списка героев. Его даже можно из колонки "по умолчанию" в колонку "включенных" перенести.
Но при попытке начать игру на каком-то шаблоне его нет среди предлагаемых героев, даже не смотря на то, что согласно своему классу он должен принадлежать данному городу. Я в редакторе шаблонов отключил для этого города родных героев - вдруг новому просто места не хватило? - но это не помогло.
Такие же эффекты есть, если поменять класс у героя, который был в HotA.dat изначально. Например, сменить для Жизель класс с рейнджера на капитана, а потом в редакторе шаблонов отключить некоторых изначальных капитанов, чтобы дать ей место. Это тоже не срабатывает - Жизель пропадает из окна выбора Оплота, но в окне выбора Причала не появляется.
У меня стало складывать ощущение, что помимо класса героя, где-то еще прописывается его связь с городом.
Так ли это и где приблизительно такая связь могла бы быть?
Заранее спасибо за любую помощь!
hippocamus
01 Apr 2021, 00:49
Хоботов
Нет, у героя нет привязки к фракции, только к классу. А у класса есть привязка к фракции.
Но ведь где-то есть таблицы, содержащие по 16 героев для каждой фракции - ведь берутся не первые 16, а заданные.
И эти таблицы, очевидно, прописаны в hota.dll, а не в hota.dat
Хоботов
01 Apr 2021, 01:25
Цитата(hippocamus @ 01 Apr 2021, 00:49)

Но ведь где-то есть таблицы, содержащие по 16 героев для каждой фракции - ведь берутся не первые 16, а заданные.
И эти таблицы, очевидно, прописаны в hota.dll, а не в hota.dat
Но героев все-таки больше 16-ти.
Для причала я могу на джебусе разрешить, например, Тарка и запретить кого-то из стандартных причальских героев - и увижу Тарка в окне выбора.
Однако какая-то таблица похоже что и правда где-то есть скорее всего. Теоретически, она могла бы и в hota.dat находиться - это же статические данные, почему нет?
feanor
01 Apr 2021, 09:44
Цитата
Но ведь где-то есть таблицы, содержащие по 16 героев для каждой фракции - ведь берутся не первые 16, а заданные.
В ванилле берутся именно что первые 16 не запрещенных (например, флагами доступности только в кампании).
Хоботов
03 Apr 2021, 14:55
Всем доброго дня!
С работой окошка выбора героя разобраться не удалось.
Но если сделать шаблон, на котором оставлены только мои новые герои, и начать игру на нем - то они будут все же выданы игрокам (по всей видимости, случайным образом, так как выбрать самому ничего нельзя и остается только пункт "рандом").
Также новые герои могут быть куплены в таверне. То есть они довольно полноценные - просто логика работы окошка выбора задана особым программным образом где-то в hota.dll.
Также обнаружил некоторые сложности с указанием специализации героя. А именно - похоже, что блок в hota.dat, который описывает героя, не задает его специализацию.
Первый новый добавленный герой (hero179) получил специальность стрельба - как у Оррина.
Второй (hero180) - стрелки, как у Валески.
Будто бы произошло какое-то переполнение, взятие по модулю от нормального числа героев, и выдача специльностей началась с начала.
Как думаете - эта логика тоже задается в hota.dll, или я просто чего-то не нашел в hota.dat?
Есть вообще возможность редактируя hota.dat добавить новую специальность?
Не какую-то оригинальную, а примитивную - вроде специалиста по заклинанию Взрыв или специалиста по юнитам Крестьяне?
hippocamus
03 Apr 2021, 22:34
Цитата(feanor @ 01 Apr 2021, 09:44)

В ванилле берутся именно что первые 16 не запрещенных (например, флагами доступности только в кампании).
Если в СОД разрешить Лорда Хаарта в карте - то он будет, а Мюллиха не будет?
Цитата(Хоботов @ 01 Apr 2021, 01:25)

Однако какая-то таблица похоже что и правда где-то есть скорее всего. Теоретически, она могла бы и в hota.dat находиться - это же статические данные, почему нет?
Теоретически - могла бы, но её там нету, я знаю структуру hota.dat
Хоботов
17 Sep 2021, 23:39
Всем доброго времени суток! Хочу посоветоваться насчет не совсем моддинга Хоты, но в чем-то смежной темы - структуры её файла .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
18 Sep 2021, 11:28
Цитата(Хоботов @ 17 Sep 2021, 23:39)

Может кто в курсе или у кого какие еще есть мысли?
Не то чтобы это было критически важно знать, но мне крайне любопытно стало.
считывается dword, умножается на 2, полученное количество байт пропускается, т.к. никто эти данные не разбирал, возможно, какой-то внутренний индентификатор версии карты или что-то ещё...
hippocamus
19 Sep 2021, 00:24
У меня было вот так:
Код
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) создавались под будущие изменения, мой редактор умел читать и (теоретические) многослойные карты и прямоугольные.
Хоботов
06 Jul 2024, 23:08
Цитата(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
06 Jul 2024, 23:50
Так не надо умножать на 2. В прошлый раз просто повезло что совпало. Надо читать каждое поле последовательно.
Вам написали:
Цитата
никто эти данные не разбирал, возможно, какой-то внутренний индентификатор версии карты или что-то ещё...
Вот, возможно уже разобрали.
ЗЫ. Ты бы хоть адрес дал, чтобы понимать - о чём ты...
Хоботов
07 Jul 2024, 00:04
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, 13:28
Цитата(Хоботов @ 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)
Хоботов
07 Jul 2024, 16:06
Цитата(XEPOMAHT @ 07 Jul 2024, 13:28)

Код
if (subversion < 2) then (readbyte; readbyte)
if (subversion < 7) then (readdword; readdword)
Там же еще особое условие для подверсии 3 должно быть?
XEPOMAHT
07 Jul 2024, 17:13
Цитата(Хоботов @ 07 Jul 2024, 16:06)

Там же еще особое условие для подверсии 3 должно быть?
Да, исходя из того, что там записано. У меня заголовка подверсии 3 нету.
tolich
07 Jul 2024, 19:24
Может, так:
Код
if (subversion < 2) then (readbyte; readbyte)
else if (subversion < 7) then (readdword; readdword)
XEPOMAHT
07 Jul 2024, 22:17
Цитата(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
07 Jul 2024, 22:28
Да, с > это выглядит понятнее — 10 байт читается для подверсии 6, а не 1.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.