Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
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 ? Как-то это странно. Может кто в курсе или у кого какие еще есть мысли? Не то чтобы это было критически важно знать, но мне крайне любопытно стало. |
|
|
|
18 Sep 2021, 11:28
Сообщение
#222
|
|
![]() ---------------------- New_Life_of_Heroes ---------------------- Сообщений: 274 Спасибо сказали: 400 раз |
Может кто в курсе или у кого какие еще есть мысли? Не то чтобы это было критически важно знать, но мне крайне любопытно стало. считывается dword, умножается на 2, полученное количество байт пропускается, т.к. никто эти данные не разбирал, возможно, какой-то внутренний индентификатор версии карты или что-то ещё... -------------------- WoG + MoP + HoA + Forge + Bastion = ERA+
|
|
|
|
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) создавались под будущие изменения, мой редактор умел читать и (теоретические) многослойные карты и прямоугольные. -------------------- Вокруг столько фильмов, книг, музыки - а природа какая невероятная!
Если тебе скучно жить - ты совсем дурак. (Татьяна Черниговская) |
|
|
|
06 Jul 2024, 23:08
(Сообщение отредактировал Хоботов - 06 Jul 2024, 23:09)
Сообщение
#224
|
|
|
God Сообщений: 285 Спасибо сказали: 344 раза |
Может кто в курсе или у кого какие еще есть мысли? Не то чтобы это было критически важно знать, но мне крайне любопытно стало. считывается dword, умножается на 2, полученное количество байт пропускается, т.к. никто эти данные не разбирал, возможно, какой-то внутренний индентификатор версии карты или что-то ещё... На HotA 1.7.1 - алгоритм дает сбой. (на 1.7.0 не смотрел) считываем dword - там это значение 6. умножаем на 2 - получаем 12. а пропускать надо 11 байт. есть у кого мысли, почему так? |
|
|
|
06 Jul 2024, 23:50
Сообщение
#225
|
|
![]() допустим, мяў Сообщений: 24 123 Спасибо сказали: 13434 раза |
Так не надо умножать на 2. В прошлый раз просто повезло что совпало. Надо читать каждое поле последовательно.
Вам написали: Цитата никто эти данные не разбирал, возможно, какой-то внутренний индентификатор версии карты или что-то ещё... Вот, возможно уже разобрали.ЗЫ. Ты бы хоть адрес дал, чтобы понимать - о чём ты... -------------------- Вокруг столько фильмов, книг, музыки - а природа какая невероятная!
Если тебе скучно жить - ты совсем дурак. (Татьяна Черниговская) |
|
|
|
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 - не известно. вообще каждое поле мне знать не надо. возможно в будущих версиях они добавятся новые еще. хотелось бы получить надежный алгоритм получения смещения поля с размером карты, алгоритма, который бы не отваливался при обновлении. |
|
|
|
07 Jul 2024, 13:28
Сообщение
#227
|
|
![]() ---------------------- New_Life_of_Heroes ---------------------- Сообщений: 274 Спасибо сказали: 400 раз |
хотелось бы получить надежный алгоритм получения смещения поля с размером карты, алгоритма, который бы не отваливался при обновлении. Ну если договоришься с разработчиками хотовского формата.... Т.к. хотовцы могут делать с форматом карт то, то им нужно, п не то, что нужно тебе. 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+
|
|
|
|
07 Jul 2024, 16:06
Сообщение
#228
|
|
|
God Сообщений: 285 Спасибо сказали: 344 раза |
|
|
|
|
07 Jul 2024, 17:13
Сообщение
#229
|
|
![]() ---------------------- New_Life_of_Heroes ---------------------- Сообщений: 274 Спасибо сказали: 400 раз |
Там же еще особое условие для подверсии 3 должно быть? Да, исходя из того, что там записано. У меня заголовка подверсии 3 нету. -------------------- WoG + MoP + HoA + Forge + Bastion = ERA+
|
|
|
|
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. |
|
|
|
07 Jul 2024, 22:17
(Сообщение отредактировал XEPOMAHT - 07 Jul 2024, 22:24)
Сообщение
#231
|
|
![]() ---------------------- New_Life_of_Heroes ---------------------- Сообщений: 274 Спасибо сказали: 400 раз |
Может, так: Код 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+
|
|
|
|
07 Jul 2024, 22:28
Сообщение
#232
|
|
![]() 😸🧡✊✌️ Сообщений: 16 479 Спасибо сказали: 3376 раз |
Да, с > это выглядит понятнее — 10 байт читается для подверсии 6, а не 1.
-------------------- Я слежу за тобой!
tolic.narod.ru![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
|
![]() ![]() |
| Текстовая версия | Сейчас: 14 November 2025 - 11:00 |
|
Copyright by Алексей Крючков
Programming by Degtyarev Dmitry |
|