Объявления

Форум о Героях Меча и Магии и King's Bounty. Если Вы любите эти игры, мы будем рады видеть Вас в наших рядах. :smile2:

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

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

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

Сообщение pahan » 23 июл 2014, 19:19

Предлагаю вниманию читателей некоторые подробности относительно внутреннего устройства сейвов Heroes of Might & Magic I, полученные мною экспериментальным путём. Возможно, кому-то это всё давно известно, но лично мне ранее не встречалось в Сети чего-то подобного. Все эксперименты проводились на английской DOS версии 1.0(не думаю, что между версиями будут какие-либо различия). Конкретно меня интересовала следующая задача: имея сейв с выигранной миссией в кампании, поменять свою расу и миссию, которая будет следующей в кампании (а точнее, пройдя кампанию за рыцаря и учитывая то, что 7 из 8 миссий во всех кампаниях одинаковы и что я очень не люблю миссии на выкапывание клада, пройти последнюю карту Castle Ironfist). Для реализации подобной задачи оказалось достаточно понять значения всего нескольких байт в самом начале файла, которые я и опишу в данном посте вместе с некоторыми дополнительными наблюдениями.

Итак, общая информация. Как известно, игра разделяет карты (и соответственно сейвы) на стандартные (одиночные карты) и кампанию. Сейвы компании имеют расширение cgm, для стандартных в Интернете обычно указывают расширение как gm*, хотя лично на моей системе оно всегда gm1. Это различие в расширениях достаточно искусственное, поскольку на самом деле формат этих файлов один и тот же, различаются лишь значения некоторых байт в файле.
Поскольку меня интересовала только кампания, в дальнейшем я буду описывать только сейвы кампании и упоминать отличия "стандартных" сейвов, обнаруженные при беглом их просмотре.

Размер файла сейва первых героев всегда равен 77663 байт. Это важно - если размер файла будет меньше, игра загрузится со странными результатами (герой за пределами карты, полностью изменившиеся типы и численность войск у героя и т.п.) и вылетит при попытке совершить любое действие. С файлами большего размера не экспериментировал.

Первый байт файла (смещение 0x00 от его начала) - один из признаков того, является ли сейв "стандартным" или нет. Более того, он является признаком конца кампании, т.к. его значение равно 1 в последней миссии и 0 во всех остальных случаях.

Следующий байт (смещение 0x01) - собственно признак кампании. Для сейвов кампании он всегда равен 0x64, для стандартных карт - другим числам, зависящим от карты. Я не проверял подробно все стандартные карты, поэтому не могу сказать, насколько он уникально идентифицирует карту. Так для карт Around the Bay и Two If By Sea он равен 0x50, а для Claw и обучающей миссии (фактически проходящей на этой же карте) значения разные - 0x3C и 0x23 соответственно.

Байт по смещению 0x02 в моих сейвах всегда был равен 0. Возможно он относится к предыдущему параметру.

Байты 0x03-0x06 - признак начала миссии. Если игра только начата (и в первые несколько ходов) все они равны 0xFF. В дальнейшем их значения изменяются каждые несколько ходов, но я не смог увидеть в этом каких-либо закономерностей. Возможно, это что-то вроде информации из гильдии воров или какие-то другие параметры, которые учитываются для всех четырёх игроков.

Байт 0x07 - раса игрока.
1 - рыцарь
2 - варвар
3 - волшебница
4 - warlock

(Неупомянутые в посте байты либо не несут полезной информации, либо я не заметил в них какой-либо системы)

Байт 0x0B - вот тут и кодируется в сейвах кампании, на какой карте мы в данный момент играем.
0 - карта Gateway в кампании или любая из стандартных карт.
1 - Archipelago
2 - Wounded Land
3 - Free-for-all
4 - Castle Ironfist
5 - Castle Slayer
6 - Castle Lamanda
7 - Castle Alamar
8 - Dragon Island

Байты 0x0F-0x10 - счётчик игрового времени в кампании для расчёта рейтинга. Хранящееся здесь число соответствует количеству игровых дней, посчитанному по формуле (№ месяца-1)*28 + (№ недели-1)*7 + (№ дня).
Хотя здесь я не очень уверен, сохраняется ли эта закономерность для стандартных карт или нет. Возможно, эти байты - счётчик времени, потраченного на все предыдущие миссии в кампании, а время текущей миссии хранится в каком-то другом, неизвестном мне месте.

Байт 0x13 - номер текущей миссии в кампании-1. Т.е. 0 для первой миссии, 7 для последней.

(Следующее описание чисто информационное)
Байты 0x14-0xBB - в кампаниях равны 0, в стандартных картах здесь лежит текстовое описание карты (отображающееся справа внизу при выборе).

Байты 0xBC-0xBD - возможно ещё признак того, кампания это или нет. Во всяком случае, во всех сейвах кампании они равны 0x0101 (хотя и на стандартной карте Around the Bay равны этому же числу), а в большинстве стандартных карт в них нули (хотя иногда встречаются и другие значения без явной системы).

Байты 0xBE-0xCE - здесь находится имя карты для сейвов на стандартных картах или строка Unknown в кампании

Байты 0xCF-0xDC - имя файла под которым будет сохранена игра (т.е. по умолчанию здесь строка NEWGAME , если пользователь её изменял, то имя файла сейва). Что интересно, для кампании имя файла указывается без расширения.

С байта 0xF2 начинается запись параметров первого игрока. Формат этих записей давно опубликован, поэтому для целей полноты описания я скопирую информацию "как есть" , без дополнительных проверок, из http://www.maps4heroes.com/heroes1/hex_codes_eng.php и немного дополненную из http://www.celestialheavens.com/forums/viewtopic.php?p=184560#184560 (странно, здесь коды для юнитов, артефактов и заклинаний приведены на единицу меньшие. Возможно описаны разные версии игры?)
 Данные героев
PLAYERS:
========
There are 4 players in game. In order to find player data you must search for
following strings: 'Player 1','Player 2','Player 3','Player 4'.

PLAYER RECORD:
==============
Offs Name Type Description
=======================================================================
+00 Name C8
+08 117 Bytes
+7D Crystal LONG
+81 Gem LONG
+85 Lumber LONG
+89 Mercury LONG
+8D Ore LONG
+91 Sulfer LONG
+95 Gold LONG
+99 36 Bytes
=======================================================================

HEROES:
=======
You must know name of the hero you want to edit. Search for the name. Hero
records starts with name.

HERO RECORD:
============
Offs Name Type Description
=======================================================================
+00 Name C17
+11 Short C9
+1A No idea what's here
+1B HeroNum BYTE
+1C 7 bytes
+23 MaxMP WORD
+25 CurrMP WORD
+27 Experience LONG
+2B 3 bytes
+2E Attack BYTE
+2F Defence BYTE
+30 Spell BYTE
+31 Knowledge BYTE
+32 Unknown BYTE
+33 Morale BYTE
+34 Luck BYTE
+35 32 bytes
+55 Unit 1 Type BYTE
+56 Unit 2 Type BYTE
+57 Unit 3 Type BYTE
+58 Unit 4 Type BYTE
+59 Unit 5 Type BYTE
+5A Unit 1 Number INT
+5C Unit 2 Number INT
+5E Unit 3 Number INT
+60 Unit 4 Number INT
+62 Unit 5 Number INT
+64 Spell list Array 29 bytes representing spell type
+81 Spell Number Array 29 bytes represnting spell number
+82 SpellBook BYTE Spell book flag: 1-present, 0-absent
+83 Artifacts Array 13 bytes containing types of items
+90 10 byte
=======================================================================
                               
UNIT TYPES:
===========
00 None
01 Peasant
02 Archer
03 Pikeman
04 Swordsman
05 Cavalry
06 Paladin
07 Goblin
08 Orc
09 Wolf
0A Ogre
0B Troll
0C Cyclops
0D Sprite
0E Dwarf
0F Elf
10 Druid
11 Unicorn
12 Phoenix
13 Centaur
14 Gargoyle
15 Griffin
16 Minotaur
17 Hydra
18 Dragon
19 Rogue
1A Nomad
1B Ghost
1C Genie
FF Empty unit slot

ARTIFACTS:
==========
00 None
01 Ultimate Book
02 Ultimate Sword
03 Ultimate Cloak
04 Ultimate Wand
05 Arcane Necklace
06 Caster`s Bracelet
07 Mage`s Ring
08 Witches Broach
09 Medal (+1 Morale)
0A Medal (+1 Morale)
0B Medal (+1 Morale)
0C Medal (+1 Morale)
0D Fizbin Medal (-2 Morale)
0E Thunder Mace
0F Armored Gauntlets
10 Defender Helm
11 Giant Flail
12 Ballista
13 Stealth Shield
14 Dragon Sword
15 Power Axe
16 Divine Breastplate
17 Minor Scroll
18 Major Scroll
19 Superior Scroll
1A Foremost Scroll
1B Endless Sack
1C Endless Bag
1D Endless Purse
1E Nomad Boots
1F Traveler`s Boots
20 Rabbit`s Foot
21 Horseshoe
22 Coin
23 Clover
24 Compass
25 Astrolabe

SPELLS:
=======
00 None
01 Fireball
02 Lighting Bolt
03 Teleport
04 Cure
05 Resurect
06 Haste
07 Slow
08 Blind
09 Bless
0A Protection
0B Curse
0C Turn Undead
0D Anti-Magic
0E Dispel Magic
0F Berzeker
10 Armageddon
11 Storm
12 Meteor Shower
13 Paralyze
14 View Mines
15 View Resources
16 View Artifacts
17 View Towns
18 View Heroes
19 View All
1A Identify Hero
1B Summon Boat
1C Dimension Door
1D Town Gate


Теперь собственно, к исходной задаче. Для того чтобы сыграть недоступную обычным способом карту в кампании (т.е. сыграть против замка той расы, за которую проходилась кампания) и при этом не переигрывать 4 первых миссии, достаточно иметь выигрышный сейв 4й миссии free-for-all и изменить в нём всего два байта: в 0x07 выставить расу, за которую хочется попробовать сыграть, а в 0x0B - нужную карту. После этого можно загружать игру, перезапускать сценарий для чистоты эксперимента и нормально играть, сменив собственную расу посередине кампании (как во вторых Героях, где перед 5й миссией в кампании можно дезертировать и продолжить за противника)! А вот если сценарий не перезапускать (хотя это я уже не проверял на работоспособность), можно добиться ещё более впечатляющего и даже несколько противоестественного для первых Героев эффекта - возможности сыграть например, рыцарем против рыцаря!

Что пока остаётся неисследованным (или неопубликованным - возможно, разработчики утилит поделятся информацией хотя бы из соображений документирования всего в одном месте :oops: ?):
1) Не до конца ясен вопрос с хранением игрового времени
2) Данные о замках - принадлежность игрокам, возведённые постройки, заклинания в гильдии магов, количество невыкупленных существ
3) Объекты на картах - принадлежность шахт, текущее количество войск в отрядах нейтралов, подобранные кучки ресурсов и т.п.
4) Информация из гильдии воров (если она вообще хранится отдельно, а не пересчитывается каждый раз при заходе в неё).
Вернуться к началу

offlineАватара пользователя
DR28  
Мастер
Мастер
 
Сообщения: 251
Зарегистрирован: 25 июн 2012, 18:59
Откуда: Санкт-Петербург
Пол: Не указан
Награды: 8
Победителю турнира по HMM2 (1) Победителю этапа по HMM2 (3) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) 3 место 2 этапа по HMM2 (1)
Поблагодарили: 91 раз.

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

Сообщение DR28 » 24 июл 2014, 03:50

Эх, сколько в нашем мире людей, которые занимаются/занимались подобными изысканиями. Сам двойку так же изучал, вручную, побайтно.
Вернуться к началу

offlineMagus Incognitus  
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 21 май 2014, 15:56
Пол: Не указан
Награды: 2
1 место 1 этапа по HMM1 (2)
Поблагодарили: 32 раз.

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

Сообщение Magus Incognitus » 24 июл 2014, 10:17

pahan писал(а):

Все эксперименты проводились на английской DOS версии 1.0(не думаю, что между версиями будут какие-либо различия).

Формат сэйвов от версии не зависит.
pahan писал(а):

Сейвы компании имеют расширение cgm, для стандартных в Интернете обычно указывают расширение как gm*, хотя лично на моей системе оно всегда gm1.

gm1 - это сэйвы одиночной игры. Сэйвы мультиплеера для 2, 3 и 4 игроков будут иметь расширения gm2, gm3 и gm4 соответственно.
pahan писал(а):

С байта 0xF2 начинается запись параметров первого игрока. Формат этих записей давно опубликован, поэтому для целей полноты описания я скопирую информацию "как есть" , без дополнительных проверок, из http://www.maps4heroes.com/heroes1/hex_codes_eng.php и немного дополненную из http://www.celestialheavens.com/forums/ ... 560#184560 (странно, здесь коды для юнитов, артефактов и заклинаний приведены на единицу меньшие. Возможно описаны разные версии игры?)

Информация по второй ссылке относится к Героям 2.
pahan писал(а):

можно добиться ещё более впечатляющего и даже несколько противоестественного для первых Героев эффекта - возможности сыграть например, рыцарем против рыцаря!

Не вижу здесь ничего впечатляющего и противоестественного, редактор карт позволяет раздать одинаковые замки разным игрокам. А вот добиться такого "эффекта" по предложенному описанию, если я правильно его понял, как раз не получится.
pahan писал(а):

4) Информация из гильдии воров (если она вообще хранится отдельно, а не пересчитывается каждый раз при заходе в неё).

Должна пересчитываться, т.к. почти любое действие игрока потенциально способно изменить её.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 3236
Зарегистрирован: 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)
Поблагодарили: 1482 раз.

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

Сообщение AlexSpl » 24 июл 2014, 16:37

Я сейвами особо не интересовался. Гораздо удобнее редактировать всё "на лету", т.е. прямо в оперативной памяти. Структуры данных, естественно, используются одни и те же. Данные выборочно выгружаются на диск в определённом порядке при сохранении игры, так что при желании можно отследить весь процесс сохранения от начала и до конца и разобраться, какие структуры и по какому адресу выгружаются. Проблемы могут возникнуть разве что с идентификацией специфических служебных данных, не относящихся напрямую к игровому процессу. Разбирать сейв по байтам не хочется, ибо долго и уже не так интересно, поэтому опишу лишь те структуры, которые используются программой LM Oracle (тут глянуть в исходники только надо).
Вернуться к началу

offlineАватара пользователя
Orzie  
Ветеран
Ветеран
 
Сообщения: 676
Зарегистрирован: 12 сен 2013, 15:17
Откуда: Томск
Пол: Не указан
Награды: 3
Высшая медаль (1) 3 место 1 этапа по HMM1 (1) Бонусный шлем (1)
Поблагодарили: 439 раз.

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

Сообщение Orzie » 24 июл 2014, 17:25

DR28 писал(а):

Эх, сколько в нашем мире людей, которые занимаются/занимались подобными изысканиями. Сам двойку так же изучал, вручную, побайтно.

Читаю тут ваши комментарии и забиваюсь в угол со своей двойкографикой :)
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 3236
Зарегистрирован: 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)
Поблагодарили: 1482 раз.

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

Сообщение AlexSpl » 24 июл 2014, 18:34

Судя по тому, что размер сохранения не меняется и всегда равен 77663 байтам, можно предположить, что структуры данных расположены по фиксированным адресам, т.е. не "плавают" по сейву. Постоянный размер файла сохранения есть следствие того, что в сейв записываются одна за другой структуры данных, чьи размеры строго фиксированы, причём записываются даже пустые структуры. Так, например, информация о замках расположена сразу же за информацией о героях. Структура, описывающая замок, занимает 55 байт. Замки получают номера от 0 до 47 (или до 35? уже не помню точно): полагаю, последовательно, слева направо и сверху вниз, в порядке расположения их интерактивных клеток (ворот) на карте приключений, как и все остальные объекты.

Структура данных, описывающая первый город (с номером 0) расположена по адресу E823. Первый байт этой структуры и есть порядковый номер города. За ним следует байт, хранящий цвет игрока, владеющего замком. Следом идёт порядковый номер названия замка* (1 байт), тип замка (1 байт) и пара его координат: X и Y.

*) Уникальные названия замков в кампаниях (такие, например, как Предвратье) всего лишь замещают стандартные названия. Список стандартных названий замков можно посмотреть в исполняемом файле игры (первым идёт "Блэкбридж").

Гарнизон начинается со смещения 6: сначала идут однобайтовые ID монстров, а затем, начиная со смещения 11, - двухбайтовые размеры отрядов. По смещению 22 находится двухбайтовый битовый массив, в котором хранится информация о возведённых в замке постройках. Каждый бит отвечает за одно из следующих зданий (в скобках указаны номера битов):

Common Buildings
Mage Guild (0), Thieves' Guild (1), Tavern (2), Shipyard (3), Well (4), Town (5), Castle (6);

Dwellings
Knight:
Thatched Hut (7), Archery Range (8), Blacksmith (9), Armory (10), Jousting Arena (11), Cathedral (12)

Sorceress:
Treehouse (7), Cottage (8), Archery Range (9), Stonehenge (10), Fenced Meadow (11), Red Tower (12)

Barbarian:
Hut (7), Stick Hut (8), Den (9), Adobe (10), Bridge (11), Pyramid (12)

Warlock:
Cave (7), Crypt (8), Nest (9), Maze (10), Swamp (11), Black Tower (12)

Наверняка где-то здесь хранится и флаг наличия лодки у пристани. Уровень магической гильдии имеет смещение 24 и занимает 1 байт.

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

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

offlinepahan  
 
Сообщения: 3
Зарегистрирован: 22 июл 2014, 19:06
Пол: Не указан
Поблагодарили: 6 раз.

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

Сообщение pahan » 24 июл 2014, 19:04

Цитата:
Не вижу здесь ничего впечатляющего и противоестественного, редактор карт позволяет раздать одинаковые замки разным игрокам.

В моей версии нет редактора, поэтому я с ним не знаком, а в картах, идущих в комплекте с игрой, я такой ситуации не помню. Штатный редактор позволяет редактировать карты, идущие в комплекте с игрой или нет?

Цитата:
Судя по тому, что размер сохранения не меняется и всегда равен 77663 байтам, можно предположить, что структуры данных расположены по фиксированным адресам, т.е. не "плавают" по сейву. Постоянный размер файла сохранения есть следствие того, что в сейв записываются одна за другой структуры данных, чьи размеры строго фиксированы, причём записываются даже пустые структуры.

Да, получается именно так - это можно увидеть уже на примере поля, в котором лежит имя файла, под которым сохраняется игра - если задать его покороче, в сейве после него будет видна строка " Data " или её конец, а начало затирается заданным игроком значением.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 3236
Зарегистрирован: 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)
Поблагодарили: 1482 раз.

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

Сообщение AlexSpl » 24 июл 2014, 19:22

Список заклинаний магической гильдии города находится по смещению 44. Сначала идут ID заклинаний первого уровня (3 байта), а затем второго-четвёртого (по 2 байта).

Код: Выделить всё
00  |  Fireball
01  |  Lightning Bolt
02  |  Teleport
03  |  Cure
04  |  Resurrect
05  |  Haste
06  |  Slow
07  |  Blind
08  |  Bless
09  |  Protection
0A  |  Curse
0B  |  Turn Undead
0C  |  Anti-Magic
0D  |  Dispel Magic
0E  |  Berzerker
0F  |  Armageddon
10  |  Storm
11  |  Meteor Shower
12  |  Paralyze
13  |  View Mines
14  |  View Resources
15  |  View Artifacts
16  |  View Towns
17  |  View Heroes
18  |  View All
19  |  Identify Hero
1A  |  Summon Boat
1B  |  Dimension Door
1C  |  Town Gate


Цитата:
3) Объекты на картах - принадлежность шахт, текущее количество войск в отрядах нейтралов, подобранные кучки ресурсов и т.п.

Здесь та же ситуация. Необходимо найти, по какому адресу начинается массив структур, содержащих информацию о клетках карты приключений. Размер такой структуры равен 10 байтам. Смещение клетки с координатами (x; y) можно найти по формуле: Offset(x, y) = 720 * x + 10 * y.

ID объекта в структуре находится по смещению 8 и занимает 1 байт, количественная характеристика (N, 1 байт) - по смещению 9, тип объекта (T) имеет смещение 2. Например, для монстров ID = 26, T (тип) есть идентификатор отряда (0 - крестьяне, 1 - лучники и т.д.), N - информация о количестве и лояльности монстров в отряде (старший бит этого байта равен 1, если отряд является лояльным, т.е. количество монстров в отряде равно N & 0x7F). С объектом, расположенным на клетке, можно взаимодействовать (объект является интерактивным), если установлен старший бит ID: ID & 0x80 != 0.

Предлагаю Вам провести исследование :). Поставьте на клетку с координатами (0; 0) нейтральный отряд с каким-нибудь ненулевым количеством (например, 111; этим Вы также гарантируете его враждебность), а потом поищите в сейве последовательность байт: 9A NN, где NN - количество существ в отряде (в нашем случае 111 или 6F):

Проверить то, что найден именно отряд на клетке (0; 0), можно, посмотрев на значение, находящееся на 6 байт левее ID: оно должно быть равным типу монстра (см. таблицу ниже). Разумеется, следует исключить наличие других отрядов с таким же количеством и типом на карте приключений, а также проверить уникальность найденной комбинации байт. Т.е. найтись должно будет что-то вроде xx xx 17 xx xx xx xx xx 9A 6F * (для отряда, состоящего из 111 драконов) и нужно убедиться, что другой такой последовательности во всём сейве не встречается, тогда Вы будете уверены в том, что нашли структуру данных, хранящую информацию о клетке с координатами (0; 0).

*) 0x17 = 23 - идентификатор драконов, 0x9A = 10011010b (интерактивный объект с ID = 0x9A & 0x7F = 0x1A = 26, т.е. монстр), 0x6F = 111 - количество враждебных драконов (старший бит не установлен).

 
Забавно, наверное, сделать монстра, на которого нельзя напасть. Интересная фишка для картостроителей...


Код: Выделить всё
LM Oracle [Version 3.18.0.2 XE]
AlexSpl, 2008-2013

>> MON
10 | 16 | Creature
===|====|==========
00 | 00 | Peasant..
01 | 01 | Archer...
02 | 02 | Pikeman..
03 | 03 | Swordsman
04 | 04 | Cavalry..
05 | 05 | Paladin..
06 | 06 | Goblin...
07 | 07 | Orc......
08 | 08 | Wolf.....
09 | 09 | Ogre.....
10 | 0A | Troll....
11 | 0B | Cyclops..
12 | 0C | Sprite...
13 | 0D | Dwarf....
14 | 0E | Elf......
15 | 0F | Druid....
16 | 10 | Unicorn..
17 | 11 | Phoenix..
18 | 12 | Centaur..
19 | 13 | Gargoyle.
20 | 14 | Griffin..
21 | 15 | Minotaur.
22 | 16 | Hydra....
23 | 17 | Dragon...
24 | 18 | Rogue....
25 | 19 | Nomad....
26 | 1A | Ghost....
27 | 1B | Genie....


 Несколько других ID (десятичная система счисления):
4 - Skeleton
5 - Daemon Cave
6 - Treasure Chest
8 - Campfire
10 - Gazebo
11 - Ancient Lamp
12 - Graveyard
13 - Straw Hut
14 - House
15 - Cabin
16 - Log Cabin [Dwarf]
17 - Log Cabin [Peasant]
24 - Waterwheel
27 - Obelisk
29 - Resource (Wood, Mercury, Ore...)
34 - Shrine
35 - Shipwreck
39 - Desert Tent
42 - Wagon Camp
45 - Windmill
48 - Artifact
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 3236
Зарегистрирован: 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)
Поблагодарили: 1482 раз.

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

Сообщение AlexSpl » 25 июл 2014, 18:36

Решил провести эксперимент самостоятельно. Указанная выше комбинация байт отыскалась сразу же, причём она оказалась уникальной. Информация о клетках карты начинается по адресу 3E6. Учитывая, что структура, описывающая одну клетку карты, занимает 10 байт, можно посчитать, что двумерный массив таких структур занимает диапазон адресов [3E6; CE65]*. И действительно, по адресу CE66 начинается массив структур, хранящий информацию о 36 героях, а за ним следует информация о замках. Т.о. информация о клетках карты занимает примерно две трети всего сейва.

*) Первый байт этой структуры, скорее всего, есть ID тайла. Некоторые другие байты этой структуры описаны выше.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 3236
Зарегистрирован: 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)
Поблагодарили: 1482 раз.

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

Сообщение AlexSpl » 28 июл 2014, 18:32

В общем, поигрался ещё немного со структурой, описывающей клетку карты. Нулевой байт, как я и предполагал (исходя из моего скромного опыта разработки редактора карт для Героев 2 :oops: ), есть ID тайла: "вода" начинается с 0, дальше - трава и т.д. Назовём этот слой "нулевым" (Layer 0). Следующий байт - номер графического ресурса (предположительно ICN), в котором хранится картинка того, что непосредственно "лежит" на этом тайле, а следующий байт, похоже, есть собственно номер графического файла внутри ICN (Layer 1). Например, 0C 17 - драконы: 0С - файл, в котором "лежат" монстры, 17 - номер монстра; для артов первый байт (смещение 1 от начала структуры) равен 0D и т.д. Следующие два байта, походу, описывают Layer 2, т.е. то, что рисуется поверх Layer 1 (например, здесь может быть указан двухбайтный "адрес" кроны дерева, что "закрывает" сундучок с золотом). Про последние два байта я уже писал. А вот что находится между ними понять уже сложнее. По опыту Героев 2 скажу, что где-то здесь находится "зеркальный" флаг, отвечающий за отражение тайла по горизонтали и/или вертикали и ещё что-то (возможно, тени?). Впрочем, люди, которым тема интересна, давно уже разобрались или разберутся, если захотят. Внёс свой посильный вклад :oops: , чтобы тема обрела хоть какое-то содержание, а не была очередным вопросом, на который нет ответа (по опыту аналогичных тем на других геройских ресурсах).
Вернуться к началу

След.

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

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

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

cron