Объявления

Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru.
Я оторву свою задницу от всех дел и обязательно Вас активирую! :smile10:
Добро пожаловать на геройский форум! :smile25:

Формат сейвов

Не запускается игра? Проблемы со звуком? Где, в конце концов, взять игру, скачать патчи, приложения и карты? Как установить все это? Все проблемы обсуждаем в этом разделе
offlinepahan  
 
Сообщения: 3
Зарегистрирован: 22 июл 2014, 19:06
Пол: Не указан
Поблагодарили: 6 раз.

Re: Формат сейвов

Сообщение pahan » 23 ноя 2014, 15:17

Дополню-ка я ещё немного информацию от уважаемого AlexSpl по структуре замка. Итак:
Цитата:
Замки получают номера от 0 до 47 (или до 35? уже не помню точно)

До 35 - в 1ых Героях 36 названий замков.
Цитата:
Структура данных, описывающая первый город (с номером 0) расположена по адресу E823. Первый байт этой структуры и есть порядковый номер города. За ним следует байт, хранящий цвет игрока, владеющего замком.

0 - красный
1 - жёлтый
2 - зелёный
3 - синий
FF - нейтральный замок
Но я бы скорее сформулировал его назначение как "цвет игрока, который может взаимодействовать с замком" и вот почему:
Это не единственное место, где хранится информация о принадлежности замка к игроку. Что же происходит при его изменении?
Ситуация 1: игрок теряет свой единственный замок. Перебиваем этот байт в сейве на цвет соего игрока. Результат - игрок (для примера красный) может войти в замок, строиться там и покупать войска, но на карте замок всё равно отмечен цветом захватившего его (пусть зелёный) и за 7 дней игрок всё равно должен захватить какой-нибудь замок нормальным способом,иначе будет выкинут из игры (и будет получать каждый ход соответствующие предупреждения).
Ситуация 2: отберём в hex-редакторе какой-нибудь замок у компьютерного игрока. Тут всё ещё веселее - вы не увидите замок на карте, если он находится на ещё неразведанной территории, но будете получать с него доход. Замок частично останется под контролем компа - он будет закупаться войсками (с которыми ничего не сможет сделать :D ) и строиться. При этом герои компьютерных игроков во время своего хода будут этот замок регулярно атаковать и во время битвы находящиеся в замке войска будут полностью под вашим контролем (классная картинка - вдруг чёрный экран перехода хода внезапно сменяется битвой за замок и после неё возвращается в черноту - даже после выигранного боя замок не отобразится на карте). Что произойдет с игроком, у которого так нагло отобрали замок? У меня происходило нечто странное - через 7 ход игра выкинула одного из компьютерных игроков, как не имеющего городов, но... не того, у кого я отбирал замок. При этом образовался "игрок-призрак" без замков и героев, который однако стабильно "висел" в Гильдии воров на своём последнем месте и карта не засчитывалась как пройденная.

Цитата:
Следом идёт порядковый номер названия замка* (1 байт), тип замка (1 байт)

Просто в целях документирования:
0 - рыцарь
1 - волшебница
2 - варвар
3 - варлок

Цитата:
Наверняка где-то здесь хранится и флаг наличия лодки у пристани.

А вот здесь вы похоже ошиблись. Нету такого флага в Героях 1 в структуре замка. Вообще в 1ых Героях купленная лодка не отображается на экране замке, это появилось во 2ых. Видимо, если в замке есть верфь, при покупке лодки просто создаётся объект соответствующего типа с координатами около замка. А вот как отслеживается, что лодка на этом ходу уже строилась (сообщение Cannot build another boat) - вопрос отдельный. Или есть какой-то глобальный флаг (кстати, кто может напомнить - ограничение 1 лодказа ход действует для всех игроков или у каждого по одной лодке?) или это хранится прямо в структуре описания объекта типа "лодка".

Цитата:
При особом желании можно выяснить, для чего нужны остальные байты в структуре замка.

А там почти ничего и не осталось:
Байт 21 - ID героя, сидящего в замке или FF, если героя нет. Менять не советую - портрет героя-то поменяется, только на переходе ходе игра вылетит.
Байт 38 - вот тут интересно. С одной стороны, тут лежит уникальный ID для каждого замка и на многих картах все замки пронумерованы подряд, хотя и не с 0/1, а с какого-то произвольного номера, например с 2A до 33 на карте Архипелаг в кампании. С другой, изменение его похоже, ни на что не влияет.
Байты 25, 39-43, 53-54 - пустые и похоже что не используются.

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

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5538
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2155 раз.

Re: Формат сейвов

Сообщение AlexSpl » 16 май 2015, 04:10

Решил задокументировать то, что мне известно о формате сейвов. WIP :smile1:

Общий формат сохранений GM1, GM2, GM3, GM4, CGM (черновик с краткими комментариями, см. последний пост).

Структуры TTile, THero и TTown подробно опишу в отдельном документе как-нибудь.

Если Вам известно что-то о формате сейвов, делитесь :smile2:

* * *
Game.TownBuild, Game.ShipID[32]

120 Game.TownBuild dd 0F003
Здесь находится битовое поле BitField[32], в котором хранится информация о том, в каких городах/замках была возведена постройка на текущем ходу. Например, если имеем 10 городов, и что-то было построено в городах #1, #3 и #9, то
BitField[32] = 1000001010b = 0A 02 00 00 = 20Ah (522)
BitField[32] = 9876543210

Т.к. на карте может быть более 32 городов, то информация о том, строилось ли что-то в городах с номерами 32..35, не будет отражена в этом битовом поле. На практике это означает, что в городах с номерами 32..35 возвести постройку можно только лишь в первый день. Более того, хоть игра и позволяет поставить 36 городов/замков, при их количестве более 32 возможны баги (лишние герои в левом верхнем углу карты и т.п.).

125 Game.ShipID[32] db 0F24C
Здесь хранятся ID построенных кораблей. Например, если мы имеем два замка с верфью и строим 2 корабля, то Game.ShipID[0] = 0, Game.ShipID[1] = 1; Game.ShipID[n] = -1, если корабль #n отсутствует на карте.
Последний раз редактировалось AlexSpl 17 май 2015, 20:09, всего редактировалось 12 раз(а).
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5538
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2155 раз.

Re: Формат сейвов

Сообщение AlexSpl » 16 май 2015, 18:16

Game.ObjectVisitedByAI[72][72]

Что это за интересный массив ?[72][72] по адресу 11B1F, который в начале игры состоит только из нулей? Оказывается, в этом массиве искусственный интелект игры (AI) отмечает все интерактивные объекты, которые были посещены в течение игры героями под его руководством. В число интерактивных объектов входят такие объекты, как города, шахты, мельницы, ресурсы, сундуки с золотом, артефакты и т.д., т.е. объекты, с которыми можно взаимодействовать.

Итак, если герой игрока #N взаимодействует с объектом, расположенным на клетке с координатами (x, y), то этот факт фиксируется в упомянутом массиве. Назовём для определённости этот массив именем Game.ObjectVisitedByAI[72][72]. Если какой-либо герой игрока #N посетил объект с координатами (x, y), то в ячейку Game.ObjectVisitedByAI[x][y] запишется число 2 (10b) для N = 2, т.е. если объект поcещён игроком Player 2, 4 (100b) - для N = 3 и 8 - для N = 4. Другими словами, Game.ObjectVisitedByAI[72][72] - массив битовых полей.

Пример. Беседка с координатами (20, 15) посещена игроком #2 и игроком #4. Тогда по адресу 11B1Fh + 72 * x + y будет записано число 1010b = 0Ah.

Казалось бы, какая ерунда :smile1: Но если хорошенько подумать, то с помощью информации из этого массива можно очень многое сказать об игре компа в предыдущие ходы, что может быть полезно как ведущим турниров, так и игрокам.
Последний раз редактировалось AlexSpl 17 май 2015, 16:01, всего редактировалось 1 раз.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5538
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2155 раз.

Re: Формат сейвов

Сообщение AlexSpl » 16 май 2015, 21:31

Player[4].UA

Теперь поговорим о трёх вопросах после поля Dummy[50] в структуре игрока (TPlayer). Для игрока-человека эти три байта всегда равны 0, -1, -1, т.к. предназначены только для компьютерных игроков. Итак, какие секреты они хранят? :smile2:

После того, как компьютерный игрок откроет как минимум 12 частей паззла (из 48), он начинает охоту за Могущественным Артефактом (Ultimate Artifact). Как она происходит? Чем больше частей паззла игрок открыл, тем больше вероятность того, что он узнает точное место, где закопан артефакт.

1. В первый байт Player[N].UA.Probability отправляется числитель этой вероятности: 4 * (N - 11), где N - количество открытых фрагментов паззла. Знаменатель равен 100, т.е. P[UA] = min(100, 4 * (N - 11))/ 100. Например, вероятность того, что компьютерный игрок сразу угадает точное местоположение UA при 12 открытых фрагментах равна 4/100 или 4%. Т.о. компу необходимо открыть как минимум 36 фрагментов, чтобы сразу и наверняка угадать, где зарыт клад. В случае удачи координаты UA, x и y, отправляются во второй и третий байты соответственно: Player[N].UA.X, Player[N].UA.Y, N > 0.

2. Но это не всё. Если комп не угадывает сразу, где находится UA, он старается определить приблизительное местонахождение артефакта. Происходит это случайным образом. В качестве приближения берутся координаты клетки, на которой потенциально мог бы быть зарыт клад, из квадрата 7х7 с центром в клетке реального нахождения UA, исключая, естественно, центральную клетку этого квадрата. Однако, если за 200 попыток комп так и не сможет выбрать приближение (например, если квадрат 7х7 вокруг UA вдруг оказался окружён водой, сундуками и кучками ресурсов), то он автоматически узнает точные координаты клада. В любом случае координаты UA, приблизительные или точные, записываются в Player[N].UA.X и Player[N].UA.Y.

3. Каждый раз, когда герой посещает новый обелиск или копает ямку, появляется очередная возможность угадать точные координаты клада или выбрать другое приближение.

4. В Героях 1 есть баг, связанный с поиком могущественного артефакта. Дело в том, что когда комп открывает достаточно много фрагментов паззла, числитель вероятности превышает число 127 и вероятность становится отрицательной. Поэтому, даже посетив все обелиски, комп может не узнать точного расположения артефакта. Более того, если комп откроет более 42 фрагментов паззла, он никогда не выкопает клад.
Последний раз редактировалось AlexSpl 18 май 2015, 07:35, всего редактировалось 4 раз(а).
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5538
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2155 раз.

Re: Формат сейвов

Сообщение AlexSpl » 17 май 2015, 13:47

Map.TileExtraInfo[72][72]

Итак, в структуре TPlayer остались только два неопознанных байта (см. позиции 45 и 46 в документе). Но кое-что мне о них всё же удалось узнать. Во-первых, они всегда одинаковы. Т.е. какое бы значение ни принял первый байт, второй будет иметь то же значение, и наоборот. Во-вторых, мне так и не удалось обнаружить, чтобы эти байты были чем-то, кроме 0. Назвал их пока Player[N].UnknownByte :)

Теперь о массиве по адресу 0F29F. Назвал его Map.TileExtraInfo[72][72], т.к. в этом массиве отмечается информация о различных объектах на карте, кроме таких, как города/замки, монстры, жилища монстров, ресурсы, сундуки, артефакты, обелиски и т.п. Точно такой же массив присутствует в файле карты (MAP, CMP).

Вот полный список: буй (0), кораблекрушение (1), водоворот (2), оракул (3), менгир (4), гейзер (5), большое озеро лавы (6), маленькое озеро лавы (7), горшочек с ртутью на огне (8), колесо водяной мельницы (9), костёр (0Ah), мельница (0Bh), фонтан (0Сh), большое озеро (0Dh), река (0Eh), вход в любую шахту (0Fh), лесопилка (10h), пещера демона (11h), святилище (12h), большой камень с чайками (13h), клетки у берега, т.е. прибрежные воды (14h). Какой-либо закономерности я не нашёл.

Все остальные клетки суши и моря получают Map.TileExtraInfo[x][y] = -1 (0FFh, или FF).

Game.ArtifactTable[37]

Здесь всё просто. Если артефакта нет в игре (не поставил картостроитель, не сгенерировали шарики ART, не получен в качестве награды), Game.ArtifactTable[ArtID] = -1, где ArtID - внутриигровой порядковый номер артефакта (его ID). Если артефакт присутствует в игре, но ни один герой им не обладает, то это значение равно 24h, иначе - номер героя-хозяина.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5538
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2155 раз.

Re: Формат сейвов

Сообщение AlexSpl » 20 май 2015, 23:31

Обновил документ. Добавил описание формата карт (*.MAP, *.CMP), а также структур сейва TPlayer, THero и TTown.

Heroes 1 Savegame and Map File Format (v0.92).pdf
Последний раз редактировалось AlexSpl 02 май 2019, 20:32, всего редактировалось 1 раз.
Вернуться к началу

offlineАватара пользователя
t800  
Ветеран
Ветеран
 
Сообщения: 982
Зарегистрирован: 22 июл 2015, 11:36
Пол: Не указан
Награды: 4
Наградной знак (1) Деревянный Щит (1) Золотой Меч (1) Серебряные Сапоги (1)
Поблагодарили: 191 раз.

Re: Формат сейвов

Сообщение t800 » 03 ноя 2015, 13:36

AlexSpl писал(а):

Обновил документ. Добавил описание формата карт (*.MAP, *.CMP), а также структур сейва TPlayer, THero и TTown.

Heroes 1 Savegame and Map Files Format (Draft).zip


Я посмотрел у Вас в файлике есть такие команды

Сampain.Days
Campain.Scenario

Правильно я понял что оригинальные герои когда идет игра компании сохраняет в сейве текущей игры число дней сыгранных на предыдущих картах и число уже сыгранных карт в течении кампании?
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5538
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2155 раз.

Re: Формат сейвов

Сообщение AlexSpl » 03 ноя 2015, 13:50

Я уже и не помню точно. Campaign.Scenario - это порядковый номер текущего сценария (он может отличаться от номера карты, т.к. в кампании мы против самих себя не играем). Campaign.Days - это количество дней, потраченных на прохождение сценариев кампании. Если я правильно припоминаю, это число не меняется в течение игры на карте. Скорее всего, дни, затраченные на прохождение сценария, после выполнения условия победы приплюсовываются к этому значению, и далее оно используется для определения месяца, недели и дня начала следующего сценария (в кампании Героев 1 "сквозное" время, т.е. любой сценарий, кроме первого, может начаться в произвольный день недели).
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5538
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2155 раз.

Re: Формат сейвов

Сообщение AlexSpl » 29 фев 2016, 12:51

Строку 27 на стр. 7 читать как
"27 | GazeboVisited[4] | db | 039 | 4 | BitField[4][8]"

Запись BitField[4][8] означает, что это битовое поле размером 4 * 8 = 32 бита (4 байта по 8 используемых бит в каждом).

Что находится по смещениям 037 и 038, не знаю. Но судя по тому, что там всегда нули, это просто неиспользуемые байты (Dummy[2]).

* * *
Heroes 1 Savegame and Map File Format (v0.92).pdf
Последний раз редактировалось AlexSpl 02 май 2019, 20:32, всего редактировалось 1 раз.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5538
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2155 раз.

Re: Формат сейвов

Сообщение AlexSpl » 27 апр 2019, 04:41

Заметил ошибку в формате карт (строка 11 на стр. 5):

"11 | Map.HeroInfo[36] | THeroInfo(3) | 0D046 | 108 | Array of THeroInfo structures" читать как "11 | Map.MineInfo[36] | TMineInfo(3) | 0D046 | 108 | Array of TMineInfo structures"

Это информация о шахтах, а также о Dragon City и Lighthouse:

Код: Выделить всё
struct TMineInfo {
    char X;
    char Y;
    char ID;
};

X, Y - координаты, ID - идентификатор объекта (0..6 - шахты, 16h - Dragon City, 17h - Lighthouse).

Аналогичная структура для городов и замков:

Код: Выделить всё
struct TTownInfo {
    char X;
    char Y;
    char ID;
};

ID - тип города/замка: 0 - Knight, 1 - Sorceress, 2 - Barbarian, 3 - Warlock, 4 - Random; or 80h, если замок (80h, 81h, 82h, 83h, 84h соответственно).

Map.ArtifactTable[37]. 24h, если артефакт присутствует на карте, иначе -1. Используется для запрета генерации дубликатов в объектах, дающих случайный арт. Можно использовать как таблицу запрещённых артефактов.

Map.ObeliskCount = 1, даже если на карте нет обелисков (иначе - кол-во обелисков). Логично, если учесть, что UA генерится всегда.

* * *
Map.ObjectInfo - это на самом деле последовательность структур TTownObjInfo и THeroObjInfo:

Код: Выделить всё
struct TTownObjInfo {           // sizeof(TTownObjInfo) = 0x4A
    int     Type;               // 0x46 - Town
    char    InitFlag            // 0..1
    char    Owner;              // -1..3
    short   BuildingsBitField;  // 000xxxxx x00xxxxx*
    char    MageGuildLevel;     // 0..3
    TArmy   Garrison;
    char    Padding[50];
};

* 00065432 100edcba
Цифры (синий цвет) - биты жилищ монстров соответствующего уровня, буквы (красный цвет): a - Гильдия магов, b - Гильдия воров, c - Таверна, d - Верфь, e - Колодец.
В случайном замке всегда отстроено жилище монстров 1-го уровня, даже если в этом поле не установлен соответствующий бит.

Код: Выделить всё
struct THeroObjInfo {           // sizeof(THeroObjInfo) = 0x4F
    int     Type;               // 0x4B - Hero
    char    Owner;              // 0..3
    TArmy   Army;
    char    ID;                 // Hero's ID: 0..35
    char    StartArtifact[4];   // -1..37;
    int     Experience;         
    char    Padding[50];
};

В файле карты сохраняются даже удалённые в процессе создания герои и города/замки со всеми их свойствами. Так что можно частично отследить мысль картостроителя при желании. PresetObjN - это увеличенное на 1 кол-во героев и городов/замков, поставленных на карту в процессе её создания. При PresetObjN = 1 блок Map.ObjectInfo отсутствует. Изменённое кол-во монстров попадает напрямую в структуру TTile, т.е. информация о монстрах в блоке Map.ObjectInfo не отражается.
Последний раз редактировалось AlexSpl 02 май 2019, 20:33, всего редактировалось 2 раз(а).
Вернуться к началу

Пред.След.

Вернуться в Техническая часть

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2