ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» Структура данных X-Tension | страница 1 |
|
|
|
Канал X-Tension/X-BTF: «Структура данных X-Tension» |
|
|
Shaddie
556 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Серебряная медаль SETI@Home, EG team (208976 credits)](/conference/images/ranks/medals/seti_silver_new.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Активист (+25 EGP)](/conference/images/ranks/medals/activist.gif) ![Автор программы под X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_prog.gif) ![Автор программы под Х2 (+25 EGP)](/conference/images/ranks/medals/x2_prog.gif) Рейтинг канала: 6(438) Репутация: 118 Сообщения: 261 Откуда: Томск Зарегистрирован: 09.09.2004
![Вы не можете голосовать](images/tool_cool.gif) |
|
Частично разобрался в структуре данных файла 001.obj отвечающих за наполнение секторов.
Далее я кратко напишу о моих действиях (чтоб был понятней результат).
Взяв за основу то, что при начале новой игры станции имеют одни и те же координаты XYZ, я сделал вывод, что координаты должны где-то храниться. Это где-то обнаружилось быстро. Переведя координаты из десятичной системы счисления (далее dec) в шестнадцатеричную (далее hex) и поискав соответствия в разных файлах, получил следующие: совпадение есть как в сейвах, так и в файле 001.obj. Сейвы само собой отпадают, остается 001.obj.
Начав новую игру, записал координаты и названия всех станций, фабрик и т.п. (для секторов Ringo Moon, Argon Prime и The Wall), определил для них адреса (смещения, далее offset). Анализируя данные, сделал следующие общие выводы:
1. Данные по сектору находятся в одном отдельном блоке (далее БДС);
2. БДС, для секторов находящихся по соседству на карте, не обязательно находятся рядом в файле (пример: The Wall, Cloudbase North West и только потом Argon Prime);
3. БДС разделены идентификаторами секторов (об это далее).
Теперь подробнее о БДС. В блоке данных сектора хранится следующая информация:
1. Координаты всех объектов (корабли, станции, астероиды, солнца, планеты), кроме ворот;
2. Типы всех объектов (корабли, станции, астероиды, солнца, планеты), кроме ворот;
3. Для станций: чем торгуют, что производится, что требуется для производства (разделение на первостепенные и второстепенные ресурсы);
4. Какие корабли приписаны к сектору, станции или носителю (разделяются на "Landed" и "In Space");
5. Хранится информация о виде космоса (тип текстуры космоса);
6. Есть и мне неизвестные фрагменты данных (небольшие).
7. В файле БДС заканчивается идентификатором сектора, он же и является разделителем м/у БДС.
Сразу скажу что, по-моему, для безошибочной работы алгоритма чтения данных, необходимо читать данные с конца БДС. Объясню: во первых ИС находится в конце БДС, а во вторых в качестве разделителя данных между объектами используется 2 байта 002F которые в большинстве случаев находятся в конце блока данных объекта (далее БДО), и в третьих метки определяющие начало разных блоков данных также находятся в конце этих блоков.
Идентификатор сектора (далее ИС). Содержит следующие данные: доступные направления (ворота), координаты сектора и еще какие-то неизвестные мне данные.
Обнаруженные мной ИС состоят из 12 или 14 байт: 00VV 00YY 00XX 000A [0001] 00ZZ 002F.
YY - положение сектора по оси Y. XX - положение по оси X. VV - задает доступные направления (наличие северных, восточных, южных и западных ворот). ZZ - неизвестно. [0001] - набор байт отсутствующий у некоторых ИС (скорее всего уточняет значение ZZ).
Координаты даны относительно сектора Kindom End (X=0, Y=0). Значения координат в hex + 9 (следует перевести из hex в dec и отнять 9). Пример для Argon Prime: 0018 000C 000A 000A 0022 002F, где 0018 - это все ворота; 000С переведем из hex в dec, получили 12, далее отнимем 9, значит Y=3; 000A переведем из hex в dec, получили 10, далее отнимем 9, значит X=1.
Для описания БДО введу следующие термины:
подчиненный объект - корабль принадлежащий станции (Homebase), товар покупаемый/продаваемый на станции, товар производимый на станции (продукция), товар необходимый для производства (ресурс);
идентификатор типа - идентификатор для определения типа БДО;
идентификатор подтипа - идентификатор для определения подтипа БДО;
метка - для определения начала и типа данных подчиненных объектов, а так же их количество.
Метка состоит из 6 байтов: 00XX 002F 00YY.
XX - количество подчиненных объектов (следует перевести из hex в dec и отнять 9, пример: 17 переведем из hex в dec, получили 23, далее отнимем 9, значит 14 объектов).
YY - тип подчиненных объектов, может принимать следующие значения: 11 - первичные ресурсы; 0A - вторичные ресурсы; 10 - продукция на фабриках или товары для покупки/продажи на торговых станция, доках и т.п.; 0B - корабли принадлежащие станции/носителю "In Space "; 12 - корабли принадлежащие станции/носителю "Landed".
Идентификатор типа состоит из 4 байт, определил следующие:
1. 000B 000B - Texture Space
2. 000D 000F - Planet
3. 000C 0010 - Sun
4. 001A 0010 - Asteroid
5. 00XX 000B - Товар группы XX, где XX принимает значения от 11 до 19
6. 000E 0014 - Trading Station, Equipment Dock
7. 000F 0014 - Shipyard
8. 000F 0018 - Forge, Shield Prod. Facility
9. 000F 0016 - Solar Power Station, Ore Mine
10. 0010 0010 - TS, M3, M4, M5
11. 0010 0012 - M2
12. 0010 0014 - TL, M1
Идентификатор подтипа.
1. Для текстур космоса состоит из 2 байтов: 00XX.
XX - определяет вид космоса. Принимает значения: 09, 0A, 0B, 0С, 0D, 0E, 0F, 10, 11, 12, 13, 14, 15.
Пример: 000D - текстура Argon Prime.
2. Для планет состоит из 4 байтов: 00XX 00YY.
Сочетание XX и YY дает вид планеты.
Пример: 000A 000D - Planet в The Wall.
3. Для солнца. Собственно не является идентификатором, это скорее три числовых значения, по методу записи похожие на координаты.
4. Для астероида состоит из 6 или 8 байтов: [0001] 00XX 000Y 000Z.
XX - количество руды (следует определять так же как количество подчиненных объектов). [0001] - признак того, что XX (количество руды) следует определять не отнимая 9 после перевода из hex в dec. Y - принимает значения 9 (Ore) или A (Silicon). Z - вид астероида (форма). Принимает значения 9, A, B.
Примеры: 0023 000A 0009 - Asteroid (Silicon 26); 0034 0009 000B - Asteroid (Ore 43).
5. Для товара может состоять из 2 или 4 байтов: 00XX или [0001] 00XX.
XX - в сочетании с идентификатором типа определяет товар. [0001] - дает дополнительные товары.
6. Для станций состоит из 8 байтов: 0001 XXXX 00YY 00ZZ.
XXXX - собственно идентификатор подтипа станции. YY - принадлежность станции определенной расе: 0A - Argon; 0B - Boron; 0C - Split; 0D - Paranid; 0E - Teladi; 0F - Xenon; 10 - Pirate; 11 - Goner; 12 - станция принадлежит вам. ZZ - точно сказать не могу но похоже на класс станции: 09 - Trading Station, Equipment Dock, Shipyard; 0A - Shield Prod.Facility, Forge, Satellite Factory; 0B - Wheat Farm, Cattle Ranch; 0C - Rimes Fact; Cahoona Bakery; 0D - Solar Power Station; 0E - Mine.
Примеры: 0001 013E 000A 0009 - Free Argon Trading Station; 0001 0176 0011 000A - Goner Temple.
7. Для кораблей состоит из 6 байтов: 00XX 00YY 00ZZ.
Сочетание XX и ZZ - класс корабля: 09…0A - TS; 09…0C - M1; 09…0D - M2; 09…0E - M3; 09…0F - M4; 09…10 - M5; 0A…09 - TL.
YY - принадлежность корабля определенной расе: 0A - Argon; 0B - Boron; 0C - Split; 0D - Paranid; 0E - Teladi; 0F - Xenon; 10 - Pirate; 11 - Goner (предположение).
Примеры: 0009 000A 000F - Argon Buster (M4); 000A 000B 0009 - Boron Orca (TL).
Повесил на тему знак "Важная". Perseus
|
|
|
Shaddie
556 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Серебряная медаль SETI@Home, EG team (208976 credits)](/conference/images/ranks/medals/seti_silver_new.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Активист (+25 EGP)](/conference/images/ranks/medals/activist.gif) ![Автор программы под X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_prog.gif) ![Автор программы под Х2 (+25 EGP)](/conference/images/ranks/medals/x2_prog.gif) Рейтинг канала: 6(438) Репутация: 118 Сообщения: 261 Откуда: Томск Зарегистрирован: 09.09.2004
![Вы не можете голосовать](images/tool_cool.gif) |
|
Структуры записей данных бъектов.
Буду использовать следующие сокращения: ИТ - идентификатор типа; ИПТ - идентификатор подтипа; К - блок координат (его структура описана ниже); Р - разделитель (2 байта 002F). Размер данных указан в байтах и находится в квадратных скобках (пример: ИТ[4]).
1. Для текстуры космоса: ИПТ[2] + ИТ[4] + Р.
2. Для планеты: ИПТ[4] + ИТ[4] + Р.
3. Для солнца: ?? + К + ИТ[4] + Р, ?? - обозначены данные с которыми я не разобрался, по структуре похожи на координаты. Может это значения углов.
4. Для астероида: ИПТ[6] + К + ИТ[4] + Р.
5. Для товаров, продукции и ресурсов: ИПТ[2 или 4] + ИТ[4] + Р.
6. Для станций типа Trading Station, Equipment Dock: Товары + Корабли (Landed) + Корабли (In Space) + ИПТ[8] + К + ИТ[4] + Р.
7. Для станций типа Shipyard: Продаваемые станции + Корабли (Landed) + Корабли (In Space) + ИПТ[8] + К+ ИТ[4] + Р.
8. Для остальных станций: Продукция + Ресурс 1 + Ресурс 2 + Корабли (Landed) + Корабли (In Space) + ИПТ[8] + К + ИТ[4] + Р.
9. Для кораблей класса TS, M3, M4, M5: ИПТ[6] + К + ИТ[4] + Р.
10. Для кораблей класса TL, M1, M2: Корабли (Landed) + Корабли (In Space) +ИПТ[6] + К + ИТ[4] + Р.
Структура записи координат.
Координаты объекта в игре однозначно определяются следующими параметрами: декартовыми координатами XYZ и в каком секторе находится объект.
В общем случае формат записи координат XYZ выглядит следующим образом:
0002 YYYY YYYY 0002 ZZZZ ZZZZ 0002 XXXX XXXX, где YYYY YYYY - 4 байта, координата по оси Y; ZZZZ ZZZZ - 4 байта, координата по оси Z; XXXX XXXX - 4 байта, координата по оси X.
Координаты записаны в шестнадцатеричном формате (hex).
Пример:
Координаты для Free Argon Trading Station в секторе Argon Prime 0002 FFF2 F8D8 0002 0005 8548 0002 FFEE 85C8. Переведя из hex в dec, получим X=-1145400, Y=-853800 и Z=361800.
В частных случаях встречается следующие форматы записи:
1. 0002 YYYY YYYY 0002 ZZZZ ZZZZ 0009, где координаты Y и Z - аналогичны общему случаю, а координата X=0. Причем нулевой координатой может быть любая другая (Y или Z для данного случая) и даже две координаты (0009 0002 0013 99F8 0009 - X=0, Y=0, Z=1284600).
Пример:
Координаты для Asteroid (Silicon 26) в секторе Ringo Moon:
0002 FFE7 0AF0 0002 000D 2A50 0009. Переведя из hex в dec, получим X=0, Y=-1635600 и Z=862800.
2. 0002 YYYY YYYY 0002 ZZZZ ZZZZ 0001 XXXX, где координаты Y и Z - аналогично общему случаю, а координата X записывается 2 байтами. Причем "короткой" координатой может быть любая другая (Y или Z для данного случая) и даже две координаты (0001 0960 0002 0015 CED0 0001 0708).
3. 0002 YYYY YYYY 0001 ZZZZ 0009, где Y - аналогично общему случаю, Z - "короткий" формат записи, а координата X=0.
|
|
|
Shaddie
556 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Серебряная медаль SETI@Home, EG team (208976 credits)](/conference/images/ranks/medals/seti_silver_new.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Активист (+25 EGP)](/conference/images/ranks/medals/activist.gif) ![Автор программы под X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_prog.gif) ![Автор программы под Х2 (+25 EGP)](/conference/images/ranks/medals/x2_prog.gif) Рейтинг канала: 6(438) Репутация: 118 Сообщения: 261 Откуда: Томск Зарегистрирован: 09.09.2004
![Вы не можете голосовать](images/tool_cool.gif) |
|
Рассмотрим БДО для Free Argon Trading Station из сектора Argon Prime.
Начало блока offset 58026, конец offset 582E9.
0012 0017 000B 002F //Nostrop Oil
000F 0017 000B 002F //Rastar Oil
0010 0019 000B 002F //Navigation Relay Satellite
0013 0019 000B 002F //Fighter Drone
0009 0017 000B 002F //Cloth Rimes
000A 0017 000B 002F //Meatsteak Cahoonas
0020 0019 000B 002F //Singularity Engine Time Accelerator
0019 0019 000B 002F //Cargobay Extension
001E 0019 000B 002F //Tactical Navigation System
0009 0019 000B 002F //Warheads
000B 0019 000B 002F //Quantum Tubes
001B 0019 000B 002F //Rudder-optimization
001A 0019 000B 002F //Engine Tuning
0023 0019 000B 002F //Argon Law Enfocement License
0017 002F 000A //Метка означает, что предыдущие данные относились к товарам, количество объектов (в данном случае товаров): переведем 0017 из hex в dec 23, далее отнимем 9, получили 14 объектов
0009 000A 000E 0002 FFF0 DB70 0002 0016 0968 0002 FFF0 DB70 0010 0010 002F //Первые 6 байт: идентификатор подтипа - Argon Elite; следующие 18 байт: координаты YZX; следующие 4 байта: идентификатор типа - корабль; последние 2 байта: разделитель.
0009 000A 000E 0002 FFF0 DB70 0002 0003 B790 0002 FFF0 DB70 0010 0010 002F //Argon Elite
0009 000A 000E 0002 FFF0 DB70 0002 000B 6D00 0002 FFF0 DB70 0010 0010 002F //Argon Elite
0009 000A 000E 0002 FFF0 DB70 0002 0014 8B60 0002 FFF0 DB70 0010 0010 002F //Argon Elite
0009 000A 000E 0002 FFF0 DB70 0002 FFF5 A088 0002 FFF0 DB70 0010 0010 002F //Argon Elite
0009 000A 000E 0002 FFF0 DB70 0002 000C 67C8 0002 FFF0 DB70 0010 0010 002F //Argon Elite
0009 000A 0010 0001 0BB8 0002 000B 8920 0001 04B0 0010 0010 002F //Argon Discoverer
0009 000A 0010 0001 0BB8 0002 FFFA 36C0 0001 0258 0010 0010 002F //Argon Discoverer
0009 000A 0010 0001 0BB8 0002 FFFD EE50 0001 0708 0010 0010 002F //Argon Discoverer
0009 000A 0010 0001 0960 0002 0015 CED0 0001 0708 0010 0010 002F //Argon Discoverer
0009 000A 0010 0001 0708 0002 FFFE A9D0 0001 04B0 0010 0010 002F //Argon Discoverer
0009 000A 000A 0009 0002 FFF7 CC00 0001 0258 0010 0010 002F //Argon Lifter
0009 000A 0010 0001 0960 0002 FFED A018 0001 0258 0010 0010 002F //Argon Discoverer
0009 000A 0010 0001 0708 0002 000D 2F00 0001 0708 0010 0010 002F //Argon Discoverer
0009 000A 0010 0001 0708 0002 000B DD80 0001 0258 0010 0010 002F //Argon Discoverer
0009 000A 000A 0009 0002 000E 3C88 0001 0258 0010 0010 002F //Argon Lifter
0009 000A 000A 0009 0002 FFFA 0A38 0001 0258 0010 0010 002F //Argon Lifter
0009 000A 000A 0009 0002 0011 F8C8 0001 0258 0010 0010 002F //Argon Lifter
0009 000A 000A 0009 0002 0002 F9B8 0001 0258 0010 0010 002F //Argon Lifter
0009 000A 000F 0009 0002 0013 99F8 0009 0010 0010 002F //Argon Buster
0009 000A 000F 0009 0002 FFFF 7F18 0009 0010 0010 002F //Argon Buster
001E 002F 000B //Метка означает, что предыдущие данные относились к кораблям принадлежащих к станции (Homebase), причем они приземлившиеся (Landed), количество кораблей: переведем 001E из hex в dec 30, далее отнимем 9, получили 21 объект
0001 013E 000A 0009 0002 FFF2 F8D8 0002 0005 8548 0002 FFEE 85C8 000E 0014 002F [i]//Первые 8 байт: идентификатор подтипа - Free Argon Trading Station; следующие 18 байт: координаты YZX; следующие 4 байта: идентификатор типа - Trading Station; последние 2 байта: разделитель.
|
|
|
Shaddie
556 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Серебряная медаль SETI@Home, EG team (208976 credits)](/conference/images/ranks/medals/seti_silver_new.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Активист (+25 EGP)](/conference/images/ranks/medals/activist.gif) ![Автор программы под X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_prog.gif) ![Автор программы под Х2 (+25 EGP)](/conference/images/ranks/medals/x2_prog.gif) Рейтинг канала: 6(438) Репутация: 118 Сообщения: 261 Откуда: Томск Зарегистрирован: 09.09.2004
![Вы не можете голосовать](images/tool_cool.gif) |
|
Алгоритм чтения данных в БДС.
Как я уже упоминал читать данные следует с конца блока данных.
1. Определим начало БДО по разделителю 002F.
2. По 4 байтам определяем тип объекта.
Замечание: дальнейший алгоритм зависит от типа объекта. Здесь приведен алгоритм для станций.
3. Определяем координаты этого объекта (алгоритм описывать не буду). От 9 до 18 байт.
4. В зависимости от типа объекта, определяем подтип объекта: 8 байт для станций.
5. Далее читаем метку: 4 байта.
6. Определяем тип блока и количество подчиненных объектов (товары, продукция, ресурсы 1, ресурсы 2, корабли "Landed" или корабли "In Space").
7. Устанавливаем счетчик подчиненных объектов равным 1.
8. Далее определим начало блока данных подчиненного объекта по разделителю 002F.
9. По 4 байтам определяем тип подчиненного объекта: товар или корабль.
10. В зависимости от типа подчиненного объекта, определяем подтип подчиненного объекта: 2 или 4 байта для товаров и 6 байт для кораблей.
11а. Если тип подчиненного объекта корабль, то определяем для него координаты и далее определяем подтип корабля. Увеличиваем счетчик подчиненных объектов. Далее если счетчик меньше количества подчиненных объектов (пункт 6), переходим в пункт 8, иначе пункт 12.
11б. Если тип подчиненного объекта товар, то определяем подтип товара. Увеличиваем счетчик подчиненных объектов. Далее если счетчик меньше количества подчиненных объектов (пункт 6), переходим на пункт 8, иначе пункт 12.
12. Далее проверяем следующие 2 байта и если это не разделитель 002F, то повторяем все с пункта 5. Иначе с пункта 1.
В заключение:
1. В файле блок данных отвечающих за наполнение секторов и структуру секторов размещается с offset 335F6 по 93B31.
2. Данные по секторам Getsu Fune [1,17] и Xenon Sector [0,17] берутся не из выше обозначенного блока данных (не нашел идентификаторов этих секторов).
Проверял следующие возможности:
1. Изменение координат объектов (работает) - позволяет изменять положение всех основных объектов.
2. Изменение подтипов объектов (работает) - позволяет изменять одну станцию на другую, один корабль на другой и т.д.
3. Изменение наличия ворот в секторе (работает) - позволяет изменить карту вселенной.
4. Замена одних товаров на другие (работает) - позволяет изменять списки доступных товаров для торговых станций и доков; для верфей изменять доступные для продажи фабрики; для фабрик изменять продукцию или необходимые ресурсы.
5. Изменение внешнего вида космоса - текстур (работает).
6. Изменение внешнего вида планет (работает).
7. Изменение принадлежности станции с одной расы на другую (работает)..
8. Вставка фрагментов данных в БДС с увеличением размера файла (не работает).
9. Перемещение блоков данных объектов из одного БДС в другой (работает).
10. Замена секторов (поменял местами координаты у двух ИС) (работает).
Из выше перечисленного следует: программа начинает и заканчивает чтение данных с заданных адресов (пункты 8, 9 и 10), скорее всего где-то с offset 93B31 и в сторону начала файла по offset 335F6. Значит в пределах этого блока можно изменять данные изменяя тем самым вселенную X-tension.
Имеющиеся данные: список идентификаторов подтипов для кораблей, товаров, станций, планет и т.д.; несколько расшифрованных БДС секторов; адреса БДС, а так же другую информацию, вышлю всем желающим, пишите на мыло Shaddie@rambler.ru.
|
|
|
Argonaut
260 EGP
![Серебряная звезда (+50 EGP)](/conference/images/ranks/medals/silver.gif) ![Ветеран Elite-Games (20 лет)](/conference/images/ranks/medals/veteran20.png) ![Член Клуба Пилотов](/conference/images/ranks/medals/club_member.gif) Рейтинг канала: 1(9) Репутация: 43 Сообщения: 185 Откуда: Челябинск Зарегистрирован: 27.04.2004
![Вы не можете голосовать](images/tool_cool.gif) |
|
Воо! Чувствуется реальный сдвиг! Shaddie - ты
Раз нельзя добавлять новые данные в БДС, значит, есть еще область, куда эти данные можно добавить (на примере секторов Getsu Fune [1,17] и Xenon Sector [0,17]). ИМХО, надо теперь найти эти сектора. Возможно, они не в файле 001.obj.
Все остальные данные по этим секторам (коортдинаты, объекты и т.п.) скорее всего, будут соответствовать выше перечисленным алгоритмам. Для поиска, как я понимаю, нужны координаты объектов, их названия.
To All: кто только что выполнил миссию Персея (или есть данная отгрузка), прошу откликнуться здесь.
_________________ Объявление
Отдам малыша Ксенона в хорошие руки. Денег не предлагать. |
|
|
Argonaut
260 EGP
![Серебряная звезда (+50 EGP)](/conference/images/ranks/medals/silver.gif) ![Ветеран Elite-Games (20 лет)](/conference/images/ranks/medals/veteran20.png) ![Член Клуба Пилотов](/conference/images/ranks/medals/club_member.gif) Рейтинг канала: 1(9) Репутация: 43 Сообщения: 185 Откуда: Челябинск Зарегистрирован: 27.04.2004
![Вы не можете голосовать](images/tool_cool.gif) |
|
Еще насчет координат:
наверное, должно храниться в БДС "направление" (угол наклона) объектов. Причем, не только кораблей - всех объектов.
_________________ Объявление
Отдам малыша Ксенона в хорошие руки. Денег не предлагать. |
|
|
Shaddie
556 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Серебряная медаль SETI@Home, EG team (208976 credits)](/conference/images/ranks/medals/seti_silver_new.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Активист (+25 EGP)](/conference/images/ranks/medals/activist.gif) ![Автор программы под X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_prog.gif) ![Автор программы под Х2 (+25 EGP)](/conference/images/ranks/medals/x2_prog.gif) Рейтинг канала: 6(438) Репутация: 118 Сообщения: 261 Откуда: Томск Зарегистрирован: 09.09.2004
![Вы не можете голосовать](images/tool_cool.gif) |
|
Argonaut : |
Для поиска, как я понимаю, нужны координаты объектов, их названия.
|
Если у кого есть эти данные - “подкиньте”.
Argonaut : |
Еще насчет координат:
наверное, должно храниться в БДС "направление" (угол наклона) объектов. Причем, не только кораблей - всех объектов.
|
Этих данных в БДС точно нет. Скорее всего, значения углов наклона (в игре ABC), генерятся программой в зависимости от типа объекта.
|
|
|
Argonaut
260 EGP
![Серебряная звезда (+50 EGP)](/conference/images/ranks/medals/silver.gif) ![Ветеран Elite-Games (20 лет)](/conference/images/ranks/medals/veteran20.png) ![Член Клуба Пилотов](/conference/images/ranks/medals/club_member.gif) Рейтинг канала: 1(9) Репутация: 43 Сообщения: 185 Откуда: Челябинск Зарегистрирован: 27.04.2004
![Вы не можете голосовать](images/tool_cool.gif) |
|
Shaddie : |
Этих данных в БДС точно нет. Скорее всего, значения углов наклона (в игре ABC), генерятся программой в зависимости от типа объекта.
|
Не факт. Как я понял, структура БДС в 001.obj и в сэйвах аналогична (тока в сэйве она с изменениями на текущий момент времени). Дык, если я стою на месте, при этом разворачиваюсь, XYZ не меняются, меняются ABC. Причем, если сохраниться и затем загрузиться, то видно, что "направление" не изменилось. Также сохраняется и угловая скорость (но это нам наверное не понадобиться).
_________________ Объявление
Отдам малыша Ксенона в хорошие руки. Денег не предлагать. |
|
|
Shaddie
556 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Серебряная медаль SETI@Home, EG team (208976 credits)](/conference/images/ranks/medals/seti_silver_new.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Активист (+25 EGP)](/conference/images/ranks/medals/activist.gif) ![Автор программы под X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_prog.gif) ![Автор программы под Х2 (+25 EGP)](/conference/images/ranks/medals/x2_prog.gif) Рейтинг канала: 6(438) Репутация: 118 Сообщения: 261 Откуда: Томск Зарегистрирован: 09.09.2004
![Вы не можете голосовать](images/tool_cool.gif) |
|
Конечно, может я и ошибаюсь, но назначение блока данных файла 001.obj в том чтоб создать новую игру, что отличается по смыслу от сейва: у сейва задача – полностью восстановить ситуацию на какой-то момент времени.
|
|
|
Grebomet
1460 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Золотая медаль SETI@Home, EG team (12183784 credits)](/conference/images/ranks/medals/seti_gold_new.gif) ![Ветеран Elite-Games (20 лет)](/conference/images/ranks/medals/veteran20.png) ![Спец по софту канала ЖК (+25 EGP)](/conference/images/ranks/medals/hw_soft.gif) ![Спец по железу канала ЖК (+25 EGP)](/conference/images/ranks/medals/hw_hard.gif) ![Модератор года 2017 (+50 EGP)](/conference/images/ranks/medals/moderator.gif) Рейтинг канала: 3(36) Репутация: 261 Сообщения: 4765 Откуда: Питербурх Зарегистрирован: 06.01.2003
![Вы не можете голосовать](images/tool_cool.gif) |
|
Цитата: |
Дык, если я стою на месте, при этом разворачиваюсь, XYZ не меняются, меняются ABC. Причем, если сохраниться и затем загрузиться, то видно, что "направление" не изменилось. Также сохраняется и угловая скорость (но это нам наверное не понадобиться).
|
Если вылететь из сектора и потом залететь обратно, все объекты развернутся "строго на север" (особенно заметно на неповоротливых транспортниках типа дельфинов).
Посему в углы наклонов в объектнике вряд ли хранятся. Они хранятся только в сейве для объектов, с которыми ты находишься в одном секторе (имхо).
Цитата: |
переведем 0017 из hex в dec 23, далее отнимем 9, получили 14 объектов
|
Мысль созрела: а не нужно ли эту цифру 9 отнять от каждого слова в obj-файле ДО ТОГО, как начать его разбирать?
Смутно вспоминается, что при "шифровании" запакованных файлов *.bod в *.pbd поверх обычных заzipованных данных тоже прибавляли девятку...
_________________ Классическая ошибка, которую совершают проектировщики абсолютно надежных систем, – недооценка изобретательности клинических идиотов. |
|
|
Argonaut
260 EGP
![Серебряная звезда (+50 EGP)](/conference/images/ranks/medals/silver.gif) ![Ветеран Elite-Games (20 лет)](/conference/images/ranks/medals/veteran20.png) ![Член Клуба Пилотов](/conference/images/ranks/medals/club_member.gif) Рейтинг канала: 1(9) Репутация: 43 Сообщения: 185 Откуда: Челябинск Зарегистрирован: 27.04.2004
![Вы не можете голосовать](images/tool_cool.gif) |
|
Согласен. Такое можно допустить.
А насчет поиска 2-х секторов: можно, наверное, сохраненку взять не обязательно сразу после завершения миссии.
Главное знать координаты каких-нибудь стационарных объектов.
P.S. А что это у нас пилоты молчат? Кто прошел миссию, дайте координаты! плизз...
_________________ Объявление
Отдам малыша Ксенона в хорошие руки. Денег не предлагать. |
|
|
Пассажир
|
|
2 Shaddie: Ну ты крут чувак Мне уже любопытно что будет дальше Продолжай в том же духе!
|
|
|
Laster
155 EGP
![Бронзовая звезда (+25 EGP)](/conference/images/ranks/medals/bronze.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) Репутация: 16 Сообщения: 133 Откуда: Нижний Новгород Зарегистрирован: 29.06.2004
![Вы не можете голосовать](images/tool_cool.gif) |
|
Цитата: |
8. Вставка фрагментов данных в БДС с увеличением размера файла (не работает).
|
не работает как? Игра вообще не запускается?
При вставке новых данных фактическая точка входа в байткод, естественно, меняется. Документально она может находиться в самом начале файла (001.obj) – если ее попробовать найти и подкоректировать?(я не нашел)
PS: еще может быть, что в байткоде стоит ограничитель на кол-во секторов.
|
|
|
Рыб
1242 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (20 лет)](/conference/images/ranks/medals/veteran20.png) ![Пилот ХТ года 2003 (+50 EGP)](/conference/images/ranks/medals/xt.gif) ![Меценат](/conference/images/ranks/medals/mecenat.gif) ![Знаток X3: Terran Conflict (+15 EGP)](/conference/images/ranks/medals/x3tc_expert.png) Рейтинг канала: 3(36) Репутация: 340 Сообщения: 7461
Зарегистрирован: 05.06.2001
![Вы не можете голосовать](images/tool_cool.gif) |
|
Насчёт угла наклона объектов по ABC - эти данные нигде и никогда не хранятся. Если влететь в сектор, оставить там, например, свой корабль, потом вылететь из сектора и вернуться обратно, то обнаружите, что корабль повёрнут строго модой на север. Точно так же и все остальные объекты сектора при влёте в него игрока изначально ориентированы на север тем, что считается у них передом и строго наверх тем, что считается у них верхом.
Насчёт "начала и конца блока данных". Можно предположить, что:
1. Начало блока определяется не жёстко, а где-то хранится адрес начала, но это не имеет большого значения.
2. Конец блока - жёстко не лимитирован, а определяется по какому то признаку конца.
P.S.: когда будет время подробно всё прочитать и потестить, тогда (по п.2.) смогу сказать наверняка.
P.P.S.: надо срочно где-то добывать отпуск ( ) на месяц и писать софтину для редактирования секторов, пускай даже пока что и без возможности добавления новых секторов.
|
|
|
YOGSAGOT off
|
|
Цитата: |
P.P.S.: надо срочно где-то добывать отпуск () на месяц и писать софтину для редактирования секторов, пускай даже пока что и без возможности добавления новых секторов.
|
BTW ya planiruju neboljshoj otpusk na blizhaishij GOD. Mogu poprobovatj
|
|
|
DF
300 EGP
![Серебряная звезда (+50 EGP)](/conference/images/ranks/medals/silver.gif) ![Ветеран Elite-Games (20 лет)](/conference/images/ranks/medals/veteran20.png) ![Создатель модов для Freelancer (+25 EGP)](/conference/images/ranks/medals/fl_mods_alt.gif) Рейтинг канала: 5(118) Репутация: 47 Сообщения: 478
Зарегистрирован: 06.09.2003
![Вы не можете голосовать](images/tool_cool.gif) |
|
Shaddie -
Я в свое время тоже ковырял 001.obj, правда несколько с другой стороны. У меня есть значения некоторых кодов команд скриптов, которые там записаны.
Все команды имеют длину, кратную 2 байтам, первые 2 байта - код команды, остальные - данные. Всего команд 80 с чем-то, несмотря на это для кода выделяется 2 байта.
004018B2 8B 55 F8 0F BF 02 83 C2 02 - Начало цикла интерпретатора скриптов - если надо узнать значение кода команды или отследить работу скрипта сюда надо ставить брейкпойнт.
[EBP-08] - PC - указатель на команду (блоки по 2 байта)
[EBP-3C] - SP - указатель стека (блоки по 4 байта)
PC и SP - фактически просто ячейки памяти, а не регистры процессора.
обозначения:
SP[n] - значение в стеке на глубине n
Команды:
01 P1 - push P1
05 P1 - push SP[P1-1]
09 - Запомнить в стеке значение 0 (push 0)
0А - Запомнить в стеке значение 1 (push 1)
...
27 - Запомнить в стеке значение 1E (push 1E)
28 - Запомнить в стеке значение 1F (push 1F)
2A P1 - SP[0]=SP[P1-1]
2C - очистка 1 уровня стека (pop)
2Е P1 - очистка P1 уровней стека (P1 раз) pop
31 - goto label
32 - pop var;if var=0 then goto label
33 - pop var;if var<>0 then goto label
35 - возврат из подпрограммы скрипта (ret)
51 - логически инвертировать значение в стеке
4A - сравнение 2-х чисел в стеке (pop r1; pop r2; if r1<r2 then push 0 else push 1)
57 P1 P2 - вызов подпрограммы скрипта (call)
5A P1 P2 - вызов ASM подпрограммы
Все. Надеюсь пригодиться.
_________________ По моему так. |
|
|
Laster
155 EGP
![Бронзовая звезда (+25 EGP)](/conference/images/ranks/medals/bronze.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) Репутация: 16 Сообщения: 133 Откуда: Нижний Новгород Зарегистрирован: 29.06.2004
![Вы не можете голосовать](images/tool_cool.gif) |
|
DF а откуда у тебя эта информация?(если не секрет)
PS а что раньше молчал?
|
|
|
Shaddie
556 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Серебряная медаль SETI@Home, EG team (208976 credits)](/conference/images/ranks/medals/seti_silver_new.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Активист (+25 EGP)](/conference/images/ranks/medals/activist.gif) ![Автор программы под X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_prog.gif) ![Автор программы под Х2 (+25 EGP)](/conference/images/ranks/medals/x2_prog.gif) Рейтинг канала: 6(438) Репутация: 118 Сообщения: 261 Откуда: Томск Зарегистрирован: 09.09.2004
![Вы не можете голосовать](images/tool_cool.gif) |
|
Laster : |
не работает как? Игра вообще не запускается?
При вставке новых данных фактическая точка входа в байткод, естественно, меняется. Документально она может находиться в самом начале файла (001.obj) – если ее попробовать найти и подкоректировать?(я не нашел)
PS: еще может быть, что в байткоде стоит ограничитель на кол-во секторов.
|
Игра запускается, но при начале новой игры вылетает в винду. Я тоже думаю, что точка входа в байткод, где то прописана, может быть 001.obj или в exe-шнике. Наскоком найти не удалось.
Рыб : |
1. Начало блока определяется не жёстко, а где-то хранится адрес начала, но это не имеет большого значения.
|
Согласен. Нужен только адрес начала блока данных (по-моему, это offset 93B31), дальше все данные легко читаются.
Рыб : |
2. Конец блока - жёстко не лимитирован, а определяется по какому то признаку конца.
|
Признака конца я думаю, нет просто идентификаторы начала и их длина каждого подблока данных известны, а следовательно если очередной прочитанный из блока данных идентификатор неизвестен то значит это конец блока данных.
Рыб : |
P.P.S.: надо срочно где-то добывать отпуск на месяц и писать софтину для редактирования секторов, пускай даже пока что и без возможности добавления новых секторов.
|
К сожалению у меня в ближайшие месяца 2-3 свободного времени точно не будет , а то сам бы написал. Рыб или другие желающие написать софтину – помогу, чем смогу (например, алгоритмом чтения данных).
Есть задумка, как можно добавлять сектора . Но для этого нужно до конца разобраться с идентификатором сектора, в частности с непонятными байтами перед разделителем. Так же надо определить идентификаторы подтипа для всех объектов (осталось в основном определить ИПТ для станций). Данные имеющиеся у меня можно скачать http://Ссылки на narod.ru запрещены! Используйте пожалуйста другие, более нормальные хостинги./X-Tension_Data.rar.
DF : |
Все. Надеюсь пригодиться.
|
DF - . А дальше в том месте не копал?
|
|
|
Perseus
888 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Ветеран Elite-Games (20 лет)](/conference/images/ranks/medals/veteran20.png) ![Член Клуба Пилотов](/conference/images/ranks/medals/club_member.gif) ![Пилот ХТ года 2004 (+50 EGP)](/conference/images/ranks/medals/xt.gif) ![Создатель модов для X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_mods.gif) ![Автор программы под X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_prog.gif) ![Создатель модов для X2 (+25 EGP)](/conference/images/ranks/medals/x2_mods.gif) Рейтинг канала: 4(87) Репутация: 158 Сообщения: 2122 Откуда: Челябинск Зарегистрирован: 13.02.2002
![Вы не можете голосовать](images/tool_cool.gif) |
|
Молодца, Shaddie! Может дело теперь сдвинется с мертвой точки...
DF, давай активнее тоже!
|
|
|
Shaddie
556 EGP
![Золотая звезда (+100 EGP)](/conference/images/ranks/medals/gold.gif) ![Серебряная медаль SETI@Home, EG team (208976 credits)](/conference/images/ranks/medals/seti_silver_new.gif) ![Ветеран Elite-Games (15 лет)](/conference/images/ranks/medals/veteran15.png) ![Активист (+25 EGP)](/conference/images/ranks/medals/activist.gif) ![Автор программы под X-Tension (+25 EGP)](/conference/images/ranks/medals/xt_prog.gif) ![Автор программы под Х2 (+25 EGP)](/conference/images/ranks/medals/x2_prog.gif) Рейтинг канала: 6(438) Репутация: 118 Сообщения: 261 Откуда: Томск Зарегистрирован: 09.09.2004
![Вы не можете голосовать](images/tool_cool.gif) |
|
Задумка по поводу создания нового сектора:
1. Создаем блок данных для нового сектора:
1а. ИС – здесь задаем координаты нового сектора. Например, если хотим создать южнее сектора Emperor Mines [7,0], что-то типа 000A 0010 0009 000A ZZZZ 002F (не знаю что должно быть вместо ZZZZ).
1б. Задаем текстуру космоса: 000C 000B 000B 002F.
1в. Добавляем данные по планете: 000A 000D 0002 0F36 0B00 0002 06B4 9D20 0002 EF04 C560 000D 000F 002F.
1г. Добавляем данные по солнцу: 0001 00D5 0001 0089 0001 009D 0002 D77B 1340 0002 09E8 29D0 0002 2013 0F40 000C 0010 002F.
1д. Добавляем данные, по какой ни будь станции: солярка из The Wall.
Получится следующий блок данных:
000A 0019 000B 002F 000A 002F 000A 0009 0014 000B 002F 000A 002F 0010 0009 000A 0010 0009 0002 0013 2BD0 0009 0010 0010 002F 0009 000A 0010 0009 0002 0001 0FE0 0009 0010 0010 002F 0009 000A 000F 0009 0002 0007 1F70 0009 0010 0010 002F 0009 000A 000A 0009 0002 FFED 0EC8 0009 0010 0010 002F 000D 002F 000B 0001 00C9 000A 000D 0002 000B D678 0002 FFF8 0B48 0002 FFCA D830 000F 0016 002F 0001 00D5 0001 0089 0001 009D 0002 D77B 1340 0002 09E8 29D0 0002 2013 0F40 000C 0010 002F 000A 000D 000D 000F 002F 000C 000B 000B 002F 000A 0010 0009 000A ZZZZ 002F
2. Рассчитываем размер этого блока.
3. Удаляем “ненужные” данные, из разных секторов, необходимым общим размером (из пункта 2). Это могут быть данные станции или кораблей в космосе.
4. Делаем наличие южных ворот для сектора Emperor Mines.
5. Добавляем блок нового сектора после блока данных любого сектора.
6. Добавляем в файл 44001.txt текстовые данные по новому сектору:
1010801 “Way to system: New sector”
1020801 “New sector”
1030801 “New sector … далее следует описание”
Проблемы могут вызвать пункты 1а (в части блока ZZZZ), 5 и 6.
Ну, вроде ни чего не упустил. Единственное что остается открытым вопрос об озвучке и еще непонятно как задается принадлежность сектора расе. Возможно, за это отвечает ZZZZ в идентификаторе сектора.
Дома попробую.
|
|
|
|
|
|
Канал X-Tension/X-BTF: «Структура данных X-Tension» |
|
|