IPB

Здравствуйте, гость ( Вход | Регистрация )

12 страниц V  « < 10 11 12  
Reply to this topicStart new topic
> Моддим HotA, а заодно и SoD
Хоботов
сообщение 17 Sep 2021, 23:39
Сообщение #221

God
Сообщений: 285
Спасибо сказали: 344 раза




Всем доброго времени суток! Хочу посоветоваться насчет не совсем моддинга Хоты, но в чем-то смежной темы - структуры её файла .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 ?
Как-то это странно.

Может кто в курсе или у кого какие еще есть мысли?
Не то чтобы это было критически важно знать, но мне крайне любопытно стало.
Go to the top of the pageAdd Nick
 
+Quote Post
XEPOMAHT
сообщение 18 Sep 2021, 11:28
Сообщение #222

---------------------- New_Life_of_Heroes ----------------------
Сообщений: 274
Спасибо сказали: 400 раз




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


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


--------------------
WoG + MoP + HoA + Forge + Bastion = ERA+


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
hippocamus
сообщение 19 Sep 2021, 00:24
Сообщение #223

допустим, мяў
Сообщений: 24 123
Спасибо сказали: 13434 раза




У меня было вот так:
Код
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) создавались под будущие изменения, мой редактор умел читать и (теоретические) многослойные карты и прямоугольные.


--------------------
Вокруг столько фильмов, книг, музыки - а природа какая невероятная!
Если тебе скучно жить - ты совсем дурак. (Татьяна Черниговская)


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Хоботов
сообщение 06 Jul 2024, 23:08 (Сообщение отредактировал Хоботов - 06 Jul 2024, 23:09)
Сообщение #224

God
Сообщений: 285
Спасибо сказали: 344 раза




Цитата(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 байт.
есть у кого мысли, почему так?
Go to the top of the pageAdd Nick
 
+Quote Post
hippocamus
сообщение 06 Jul 2024, 23:50
Сообщение #225

допустим, мяў
Сообщений: 24 123
Спасибо сказали: 13434 раза




Так не надо умножать на 2. В прошлый раз просто повезло что совпало. Надо читать каждое поле последовательно.
Вам написали:
Цитата
никто эти данные не разбирал, возможно, какой-то внутренний индентификатор версии карты или что-то ещё...
Вот, возможно уже разобрали.

ЗЫ. Ты бы хоть адрес дал, чтобы понимать - о чём ты...


--------------------
Вокруг столько фильмов, книг, музыки - а природа какая невероятная!
Если тебе скучно жить - ты совсем дурак. (Татьяна Черниговская)
Go to the top of the pageAdd Nick
 
+Quote Post
Хоботов
сообщение 07 Jul 2024, 00:04
Сообщение #226

God
Сообщений: 285
Спасибо сказали: 344 раза




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 - не известно.
вообще каждое поле мне знать не надо. возможно в будущих версиях они добавятся новые еще.
хотелось бы получить надежный алгоритм получения смещения поля с размером карты, алгоритма, который бы не отваливался при обновлении.

Go to the top of the pageAdd Nick
 
+Quote Post
XEPOMAHT
сообщение 07 Jul 2024, 13:28
Сообщение #227

---------------------- New_Life_of_Heroes ----------------------
Сообщений: 274
Спасибо сказали: 400 раз




Цитата(Хоботов @ 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)


--------------------
WoG + MoP + HoA + Forge + Bastion = ERA+


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Хоботов
сообщение 07 Jul 2024, 16:06
Сообщение #228

God
Сообщений: 285
Спасибо сказали: 344 раза




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

Там же еще особое условие для подверсии 3 должно быть?
Go to the top of the pageAdd Nick
 
+Quote Post
XEPOMAHT
сообщение 07 Jul 2024, 17:13
Сообщение #229

---------------------- New_Life_of_Heroes ----------------------
Сообщений: 274
Спасибо сказали: 400 раз




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


Да, исходя из того, что там записано. У меня заголовка подверсии 3 нету.


--------------------
WoG + MoP + HoA + Forge + Bastion = ERA+
Go to the top of the pageAdd Nick
 
+Quote Post
tolich
сообщение 07 Jul 2024, 19:24
Сообщение #230

😸🧡✊✌️
Сообщений: 16 479
Спасибо сказали: 3376 раз




Может, так:
Код
if (subversion < 2) then (readbyte; readbyte)
else if (subversion < 7) then (readdword; readdword)


--------------------
Я слежу за тобой!
* tolic.narod.ru

Цитата
Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел.
Борис "Бонус" Репетур, "От винта!", выпуск 38.
Go to the top of the pageAdd Nick
 
+Quote Post
XEPOMAHT
сообщение 07 Jul 2024, 22:17 (Сообщение отредактировал XEPOMAHT - 07 Jul 2024, 22:24)
Сообщение #231

---------------------- New_Life_of_Heroes ----------------------
Сообщений: 274
Спасибо сказали: 400 раз




Цитата(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


--------------------
WoG + MoP + HoA + Forge + Bastion = ERA+
Go to the top of the pageAdd Nick
 
+Quote Post
tolich
сообщение 07 Jul 2024, 22:28
Сообщение #232

😸🧡✊✌️
Сообщений: 16 479
Спасибо сказали: 3376 раз




Да, с > это выглядит понятнее — 10 байт читается для подверсии 6, а не 1.


--------------------
Я слежу за тобой!
* tolic.narod.ru

Цитата
Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел.
Борис "Бонус" Репетур, "От винта!", выпуск 38.
Go to the top of the pageAdd Nick
 
+Quote Post

12 страниц V  « < 10 11 12
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 14 November 2025 - 11:00
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика