.::Russian Blood Community Forum::. »Blood: The Game We Playing In » Editing Center » Структура MAP
Страниц (3): « 1 [2] 3 »
36. Slava - 12 Апреля, 2005 - 21:14:39
Цитата:
Вот что это за 0x38, 0x18, 0x3c
Зайди в Mapedit и нажми NumLock Улыбка

(Добавление)
Цитата:
Что это за unk0, unk1, unk2 и unk3 ?
Пока не знаю - они не важны. Самый простой метод: взять все карты, которые есть и собрать статистику. Если все эти значения одинаковые (=0), то и забить на них. Если где-то они будут не такие как у всех, то нужно разбираться в карте.

37. jm - 13 Апреля, 2005 - 05:08:46
Зайду, нажму Улыбка

На счет не важны, как можно говорить, важны они или нет, если мы не знаем что это ? Улыбка

Первые два точно меняются, то что байтовое возможно и нет. Кто возьмётся статистику будет собирать ? Улыбка Меня честно говоря реверсирование тормозит несколько, я так думаю пока пропущу это и доверюсь тебе Подмигивание А ты не молчи, поделись что ли, чего нашел.
Буду заниматься собственно рендером...

38. jm - 13 Апреля, 2005 - 07:47:35
Хы, Слав, а я знаю как правильно "выходить" на сектора и раскрывать информацию по sky offset'ам Подмигивание Или ты тоже ?

В смысле того, что я уже не гадаю как ребята из rebuild'а на кофейной гуще по закриптованным смещениям Улыбка

Кстати ты не прав на счет того, что та информация о которой мы не знаем (не знали то есть) не важна Подмигивание

39. Slava - 13 Апреля, 2005 - 08:09:45
Цитата:
Хы, Слав, а я знаю как правильно "выходить" на сектора и раскрывать информацию по sky offset'ам Или ты тоже ?
Ну я и говорю, что не гадаю. Теперь точно могу сказать:
По адресу 0xAB находится 0x02, 0x10 или 0x20 байт, что определяется соответственно значением байта по тому же адресу 0xAB (декриптованного конечно).
Насчет Unknown Info могу сказать только об адресе 0x20, и то только то, что там по моей статистике бывает байт 00, 01 или 02.
Чем так важны эти неизвестные места?

(Добавление)
Поделюсь обязательно. Максимум еще пара недель Улыбка

40. jm - 13 Апреля, 2005 - 09:39:50
Ты видимо не понял. Вот ты сейчас как выходишь на первый сектор ? А я на него выхожу используя информацию из заголовка. Unk0 упомянутый ранее как раз связан со Sky Offset'ами и их количеством. У тебя эта информация есть ? Или ты точно так же гадаешь как и rebuild'овцы. Судя по тому, что написал гадаешь Улыбка Потому что там ( по смещению 0xab) не всегда одно и то же.

А то, как расшифровать сами sky offset'ы про это ж ещё в email Matt'а написанно - тот же инкрементальный xor на размере буффера под сами sky offset'ы. А вот размер буффера можно расчитать Улыбка Вобщем приду с работы опишу подробно Улыбка Может ещё что интересного всплывет.

(Отредактировано автором: 13 Апреля, 2005 - 09:43:56)

41. jm - 13 Апреля, 2005 - 15:50:47
Вобщем первый заголовок разобрал полностью.

Код:

 typedef struct
 {
  int startx;
  int starty;
  int startz;      
  unsigned short startangle;
  unsigned short sectornum;    
  unsigned short skyoffsmagic; // реверсированное мной значение, используется для расчета количества sky offset'ов  
  unsigned int depthcl; // depth cueing level
  unsigned int key; // mapedit (1.10) всегда пишет значение 0x7474614d (Matt) !  
  unsigned char paralax; // реверсированное мной значение, тип паралакса
  unsigned int revisions;
  unsigned short numsectors;
  unsigned short numwalls;
  unsigned short numsprites;
 } mapinfo;


По порядку на счет бывших unknown'ов.

Skyoffsmagic - число на базе которого расчитывается количество sky offset значений. Делается это достаточно просто:

Код:

unsigned int skyoffsetnum = ( 1 << somagic );


После сдвига получаем число sky offset word'ов ( по два байта ). А ключ, на котором sky offset'ы закриптованы как раз будет skyoffsetnum * 2.

Приведу пример, после считывания 128 байт экстра информации, к примеру, если somagic у нас равно 4, получаем:

1 << 4 = 16

То есть после экстра информации идет 16 word значений содержащих собственно sky offset'ы, и закриптованно это всё на числе 32 ( 16 * 2) Улыбка
И никаких допущений и выгадываний Улыбка Умник

Далее, depth cueing level - честно говоря не знаю, что это, но думаю дизайнеру активно работавшему с mapedit будет ясно Улыбка

Key - без комментариев.

Ну и байтик оказывается просто напросто тип используемого паракса для неба.

Вот Улыбка поддерживаю

Это программка, что я написал по ходу дела.

http://uo.anadyr.org/blood/dump.zip

Дампит информацию по Map файлу на stdout, плюс декриптует заголовок и пишет декриптованную копию в dump.out

42. LifeKILLED - 13 Апреля, 2005 - 18:02:25
Цитата:
depth cueing level


А это, случайно, не уровень "тумана-затенения"? Он один на всей карте, и я думаю, он должен быть в начале.

Самое глупое - я не знаю, как менять его из карты... Видимо надо что-то писать в mapedit.ini перед созданием карты, но я это до сих пор не освоил... Так что вот.

43. Slava - 13 Апреля, 2005 - 18:21:19
jm, повторяю третий раз - я не гадаю. Но это не важно, а то опять спор зетеется Улыбка
LifeKILLED, туман можно менять в mepedit какой-то хитрой комбинацией клавиш, как всегда, не помню какой.

(Добавление)
Вообще, замечательно, что ты тоже взялся за это дело, да еще к тому же с другой стороны, т.е. ковырянием самого mapedit.exe. Вместе мы добьемся более точных результатов. Потерпи немного, и я представлю ВСЕ что накопал. ВСЮ таблицу.

(Добавление)
3D EDIT MODE
D = Depth cueing. Hold 'D', then press +/- on keyboard. You can set the distance at which it gets darker. [norm = 768?]

44. jm - 13 Апреля, 2005 - 18:46:27
Да ладно, чего спорить то. Ты просто не разложил всё по полкам, во всяком случае я так понял, что ты всегда исходишь из одного и того же значения в offset'ах. Ну да ладно.

А что ещё осталось у нас ? Мне в принципе для рендера больше ничего не надо. Ты говори, я ещё гляну если что.


(Добавление)
http://uo.anadyr.org/blood/mapedit.rar

Дизассемблированные "выкуски" - некоторые процедуры из mapedit - сохранение карты, криптование буффера, расчет CRC, etc. Может кому ещё пригодится. Особенно хорошо откоментировал функцию сохранения карты. Многие смещения заменил на символические по смыслу.

Кстати, LifeKILLED, а ты насколько серьезно занимаешься 3ds max'ом ?

45. Slava - 14 Апреля, 2005 - 04:54:00
2jm
Насчет skyoffsets. Извини - только сейчас спокойно перечитал твой пост и все понял. Улыбка
Поскольку там все время первый байт (декриптованный) = 0, то и получается, что ключем и является это самое число по адресу 0xAB (A xor 0 = A Улыбка). Это же число и является сдвигом на который надо перейти, чтобы попасть к секторам. Так я и делал. Но то, что раскопал ты - конечно же правильнее. Ну, во-первых, потому что это данные из mapedit.exe Улыбка, а, во-вторых, кто знает, может быть этот байт и не обязан равняться нулю и мне просто везло, и тогда действительно нужно знать число skyoffsmagic из заголовка. Хотя я так и не пойму, что же там в этих skyoffset'ах хранится? Что это за возрастающие числа типа word?
Еще скажи: ты в дебуггере можешь определять тип переменной? Я имею ввиду, не только сколько байт, но и знаковость?

46. jm - 14 Апреля, 2005 - 09:33:20
Ничего, бывает Улыбка Я ж исключительно ради общего блага. Вобщем не суть. Главное чтобы ты алгоритм уловил.

На счет оффсетов я так думаю это просто банальные смещения координат для подвижного неба. Вообще говоря надо просто проанализировать по картам - в e2m7 (кажется) количество этих смещений иное. Вот и надо сравнить будет. А вообще разве в blood есть подвижное небо ? Предположил бы, что это фишка 3dfx версии, но они читаются даже в случае если карта не седьмой версии. Можно попытаться порыться в Blood.exe, но это как я уже говорил достаточно комплексная задача.

На счет знаковости переменной, могу в принципе, но только теоретически - анализируя участок кода. В принципе вероятность ошибки при этом есть конечно, но она очень мала.

Кстати, до отладчиков я так и не дошел Улыбка Пока хватает IDA. Ну так лениво стартовать ntice Улыбка Хотя если бы пользовался им было бы наверное проще. А с другой стороны никогда из ntice не отлаживал dos4gw приложение, там ведь по сути дос среда эмулируется. Так что может на самом деле я и не много потерял что не лез в него.

(Добавление)
Кстати, у меня там по тексту очепятка, где про байтик информации - не паракса а конечно же паралакса Улыбка

47. LifeKILLED - 14 Апреля, 2005 - 19:01:51
3ds-max'ом занимаюсь серьезно, хотя и не все освоил. Умею: создание моделей, скелетная анимация, разные там приемы, плагин для тканей использую... Даже разработал собственный реалистичный огонь. А что надо? Моделек наделать?

Что еще за подвижное небо?! Вращающееся, что ли? В 3dfx-патче небо то же самое. Выглядет даже хуже - несостыковки в местах "склеивания" кусков текстур. Или имеется ввиду вращение неба? (например, чтобы развернуть луну Подмигивание) В Mapedit'е я такого не видел, там ничего не вращается, там одно положение неба.

48. jm - 14 Апреля, 2005 - 19:26:06
На счет 3d max'а - пока ничего не надо. Очень надеюсь, что скоро ситуация изменится и будет надо Улыбка Просто мне нужно какое то время чтобы въехать в архитектуру самого Build'а, и понять, присоединюсь ли я к winblood, буду делать что-то свое или же параллельно оба варианта (хотя и дико звучит). Сейчас нужно выйти на Джастина ( лид и единственного кодера Winblood на данный момент ) и пообщаться с ним. Кое какие моменты выяснить...

На счет неба это только догадки-предположения. У меня мелькала мысль, что это смещения для неких подвижных деталей в небе. Видимо таки придется потрошить Blood.exe...

49. LifeKILLED - 15 Апреля, 2005 - 00:25:43
А может, плюнуть на небо? (и отойти в сторону, а то вернется гы-гы! ) Мне кажется, следует сделать свое небо на основе того...

А можно узнать, что они уже сделали в winblood?

50. jm - 15 Апреля, 2005 - 05:21:40
На небо плюнем да Улыбка Кстати возможно исходный текст polymost даст ответы на некоторые вопросы. О polymost ниже.

Можно Улыбка Короче говоря, как выяснилось, Ken Silverman ждал себе, ждал пока кто нибудь сделает современный римейк билда и недождавшись написал свою реализацию рендерера по имени Polymost. Это ядро графической подсистемы Jonof портов и собственно winblood. То бишь рендеринг вполне полноценный. В самом winblood пока есть пара монстров, и возможность погулят по уровням на сколько я понял. Пока что его не смотрел, только исходники.

51. LifeKILLED - 15 Апреля, 2005 - 21:02:37
А есть стронички, где можно посмотреть на него?

Похоже, мне все-таки придется осваивать C++... VB я уже освоил недавно, но без C++ я, похоже, все-таки остаюсь бессилен ко всему программированию... А это меня сильно бесит...

52. jm - 16 Апреля, 2005 - 10:57:24
http://blood32.sourceforge.net/phpbb2

Там в разделе анонсов ссылка на закачку четвертой альфы.

53. Slava - 23 Апреля, 2005 - 07:15:47
Впереди выходные и есть возможность посидеть с форматом, но я помня про обещанное выложить все, что я накопал по формату MAP решил сделать это независимо от процента завершенности своей работы. Чайник
В конце концов, подход jm гораздо правильнее, и возможно эти наработки ему помогут. Так что выкладываю то, что мне удалось раскрыть причем в очень сыром виде.
http://www.bloodgame.ru/download/mapformat.rar
Предлагаю jm внести коррективы, о которых он уже упоминал и добавить то, что он еще раскрыл. Можешь даже изменить вид самой спецификации. Хотя мне очень нравится табличный подход в Excel.

54. jm - 25 Апреля, 2005 - 13:15:48
Гляну на неделе. В каком виде решать тебе я буду только корректором Улыбка

Временно забил на реверсинг - пишу вспомогательные классы обертки для DirectX и прочего барахла. Нудновасто, а никуда не денешься.

55. Slava - 22 Июня, 2005 - 06:23:30
jm, а что со ссылкой http://uo.anadyr.org/blood/mapedit.rar ?
Мне она нужна для страницы http://www.bloodgame.ru/deepcoldgrave/workshop/mapformat.php
Или тогда давай я это выложу на DeepColdGrave.

56. jm - 29 Июня, 2005 - 04:20:53
Упс. Слав прошу прощения. Замотался не увидел пост.
Собственно ещё раз дико извиняюсь, обещал ещё давно пересмотреть твои спецификации, но так и не дошли руки. На неделе разрешу этот вопрос. Файл выложу и сюда брошу пост. Лучше конечно если заберешь его к себе. Вот.

57. Slava - 29 Июня, 2005 - 05:15:21
Да я, в принципе, сам тоже мог еще немного написать, но все руки не доходят Улыбка

58. jm - 03 Июля, 2005 - 16:08:37
http://uo.anadyr.org/blood/mapedit.zip

Оно.

59. Slava - 21 Декабря, 2006 - 16:08:34
Решил выложить-таки наконец свою программу на Delphi, которую я использовал для составления спецификаций формата *.MAP.
http://www.bloodgame.ru/download/map_inside.rar
См. также раздел на сайте Мастерская - Формат MAP.

60. LifeKILLED - 22 Декабря, 2006 - 03:00:35
Круто!

Сказать честно, я решил уже делать 3д-проги. Всю литературу перестал, теорию досконально изучил, да и с ООП с недавнего времени дружу. Буду делать свой 3Д движок. Может, и формат МАР в него загоню... Не хочу никого питать надеждами, но в последнее время я свои обещания исполняю Улыбка

61. Zik - 22 Декабря, 2006 - 15:11:40
LifeKILLED
Так держать!Не забудишь выложить свою SUPER-UBER затею на форуме!Бензопила

62. flanker - 29 Июня, 2014 - 17:35:34
не удобно поднимать столь древнюю тему, но выложенный в свое время на сайте файл:
http://bloodgame.ru/download/mapformat.rar

мне здорово помог. в свою очередь, я дописал недостающую секцию со структурой
extraSprite:

http://i.imgur.com/IDJzwso.png

полная табличка:
https://yadi.sk/d/g4PXX2cNVMMbg



(Отредактировано автором: 29 Июня, 2014 - 17:42:15)

63. Slava - 30 Июня, 2014 - 01:43:31
Здорово!
Спасибо, flanker!
Обновил файл на сайте.
http://www.bloodgame.ru/deepcoldgrave/workshop/mapformat.php

64. [M210®] - 04 Декабря, 2015 - 08:57:25
Начал писать свой загрузчик карт Blood и мне не очень нравится запись ключа для дешифровки данных - 0x7474614d, ведь программисты не используют в исходном коде hex значения...поэтому у себя написал более красивый способ ключа (по моему мнению)

public static final byte[] crypt = { 'M', 'a', 't', 't' };
int key = LittleEndian.getInt(crypt);

А далее использую одну и туже строку в коде

decryptBuffer(buf, buf.length, key);

Как вам такое решение? Улыбка

Ну и тоже самое сделал с заголовком файла
Вместо hex значений версии и заголовка написал "BLM" и версия = 7...я думаю имеено так выглядит оригинальный исходный код.

Ну и очень удивился, что никого не интересует последние 4 байта в файле...где то прочитал, что это контрольная сумма, но проверить ее пока не могу, может кто разъяснит?

Дальше буду писать чтение extra части.
Ну и у меня получился вот такой код для чтения карты:
По-моему по-лучше будет всяких абстрактных таблиц Улыбка
Код:

public int loadBloodmap(BinaryFile file) {
  byte[] header = new byte[6];
  header = file.readBytes(header.length);
  String signature = new String(header, 0, 3);
  int version = header[5];
  if(signature.equals("BLM") && version == 7) {
   System.out.println("blood map");
  }
  int key = LittleEndian.getInt(crypt);
   
  byte[] buf = file.readBytes(37);
  decryptBuffer(buf, buf.length, key);
   
  int startX = LittleEndian.getInt(buf, 0);
  int startY = LittleEndian.getInt(buf, 4);
  int startZ = LittleEndian.getInt(buf, 8);
  int startAng = LittleEndian.getUShort(buf, 12);
  int startSect = LittleEndian.getUShort(buf, 14);
   
  int skyoffsmagic = LittleEndian.getUShort(buf, 16);
  long depthcl = LittleEndian.getUInt(buf, 18);
  long matt = LittleEndian.getUInt(buf, 22); //key
  int paralax = buf[26] & 0xFF;
   
  //System.out.println(paralax);
   
  long mapRevision = LittleEndian.getUInt(buf, 27);
  int numSectors = LittleEndian.getUShort(buf, 31);
  int numWalls = LittleEndian.getUShort(buf, 33);
  int numSprites = LittleEndian.getUShort(buf, 35);
 
  buf = file.readBytes(128);
  decryptBuffer(buf, buf.length, numWalls);
  String copyright = new String(buf, 0, 64);
   
  int xsprite = LittleEndian.getInt(buf, 64);
  int xwall = LittleEndian.getInt(buf, 68);
  int xsector = LittleEndian.getInt(buf, 72);
   
  //76 - 128 bytes = zeros
   
  for(int a = 76; a < 128; a++)
   if(buf[a] > 0) System.out.println("unknown " + buf[a]);
   
  int skyoffsetnum = ( 1 << skyoffsmagic );
  buf = file.readBytes(skyoffsetnum * 2);
  decryptBuffer(buf, buf.length, buf.length);
   
  for(int a = 0; a < buf.length; a+=2) {
   int skys = LittleEndian.getShort(buf, a);
  }
   
  long dec = mapRevision * sectortype.sizeof;
  byte[] sectorReader;
  for (int i = 0; i < numSectors; i++) {
   sectorReader = file.readBytes(sectortype.sizeof);
   decryptBuffer(sectorReader, sectorReader.length, dec);
   
   sectortype sector = new sectortype(sectorReader);
   sector.sectorid = i;
   Build.sector[i] = sector;  
   
   if(sector.extra > 0) {
    file.seek(file.offset() + xsector);
   }
  }
   
  dec |= key;
  byte[] wallReader;  
  for (int i = 0; i < numWalls; i++) {
   wallReader = file.readBytes(walltype.sizeof);
   decryptBuffer(wallReader, wallReader.length, dec);
   
   walltype wall = new walltype(wallReader);
   wall.wallid = i;
   Build.wall[i] = wall;    
   
   if(wall.extra > 0) {
    file.seek(file.offset() + xwall);
   }
  }
   
  dec = mapRevision * spritetype.sizeof | key;
   
  byte[] spriteReader;  
  for (int i = 0; i < numSprites; i++) {
   spriteReader = file.readBytes(spritetype.sizeof);
   decryptBuffer(spriteReader, spriteReader.length, dec);
 
   spritetype spr = new spritetype(spriteReader);
   spr.spriteid = i;
   Build.sprite[i] = spr;  
   
   if(spr.extra > 0) {
    file.seek(file.offset() + xsprite);
   }
  }
   
  buf = file.readBytes(4);
  int CRC = LittleEndian.getInt(buf);
 
  return 0;
 }


(Отредактировано автором: 04 Декабря, 2015 - 11:32:21)


Powered by ExBB 1.9.1
Original Style v1.5a2 created by Daemon.XP