|
|
|
|
|
Профиль : |
|
Цитата:Вот что это за 0x38, 0x18, 0x3c | Зайди в Mapedit и нажми NumLock
(Добавление) Цитата:Что это за unk0, unk1, unk2 и unk3 ? | Пока не знаю - они не важны. Самый простой метод: взять все карты, которые есть и собрать статистику. Если все эти значения одинаковые (=0), то и забить на них. Если где-то они будут не такие как у всех, то нужно разбираться в карте. |
|
Всего записей: 888 : Дата рег-ции: Июнь 2004 : Отправлено: 12 Апреля, 2005 - 21:14:39 |
|
|
|
|
Профиль : |
|
Зайду, нажму
На счет не важны, как можно говорить, важны они или нет, если мы не знаем что это ?
Первые два точно меняются, то что байтовое возможно и нет. Кто возьмётся статистику будет собирать ? Меня честно говоря реверсирование тормозит несколько, я так думаю пока пропущу это и доверюсь тебе А ты не молчи, поделись что ли, чего нашел. Буду заниматься собственно рендером...
----- Shine on you crazy diamond WBR jm ( aka x-ray aka ведьМЫШ ) http://vedmysh.livejournal.com |
|
Всего записей: 528 : Дата рег-ции: Март 2005 : Отправлено: 13 Апреля, 2005 - 05:08:46 |
|
|
|
|
Профиль : |
|
Хы, Слав, а я знаю как правильно "выходить" на сектора и раскрывать информацию по sky offset'ам Или ты тоже ?
В смысле того, что я уже не гадаю как ребята из rebuild'а на кофейной гуще по закриптованным смещениям
Кстати ты не прав на счет того, что та информация о которой мы не знаем (не знали то есть) не важна
----- Shine on you crazy diamond WBR jm ( aka x-ray aka ведьМЫШ ) http://vedmysh.livejournal.com |
|
Всего записей: 528 : Дата рег-ции: Март 2005 : Отправлено: 13 Апреля, 2005 - 07:47:35 |
|
|
|
|
Профиль : |
|
Цитата:Хы, Слав, а я знаю как правильно "выходить" на сектора и раскрывать информацию по sky offset'ам Или ты тоже ? | Ну я и говорю, что не гадаю. Теперь точно могу сказать: По адресу 0xAB находится 0x02, 0x10 или 0x20 байт, что определяется соответственно значением байта по тому же адресу 0xAB (декриптованного конечно). Насчет Unknown Info могу сказать только об адресе 0x20, и то только то, что там по моей статистике бывает байт 00, 01 или 02. Чем так важны эти неизвестные места?
(Добавление) Поделюсь обязательно. Максимум еще пара недель |
|
Всего записей: 888 : Дата рег-ции: Июнь 2004 : Отправлено: 13 Апреля, 2005 - 08:09:45 |
|
|
|
|
Профиль : |
|
Ты видимо не понял. Вот ты сейчас как выходишь на первый сектор ? А я на него выхожу используя информацию из заголовка. Unk0 упомянутый ранее как раз связан со Sky Offset'ами и их количеством. У тебя эта информация есть ? Или ты точно так же гадаешь как и rebuild'овцы. Судя по тому, что написал гадаешь Потому что там ( по смещению 0xab) не всегда одно и то же.
А то, как расшифровать сами sky offset'ы про это ж ещё в email Matt'а написанно - тот же инкрементальный xor на размере буффера под сами sky offset'ы. А вот размер буффера можно расчитать Вобщем приду с работы опишу подробно Может ещё что интересного всплывет.
(Отредактировано автором: 13 Апреля, 2005 - 09:43:56)
----- Shine on you crazy diamond WBR jm ( aka x-ray aka ведьМЫШ ) http://vedmysh.livejournal.com |
|
Всего записей: 528 : Дата рег-ции: Март 2005 : Отправлено: 13 Апреля, 2005 - 09:39:50 |
|
|
|
|
Профиль : |
|
Вобщем первый заголовок разобрал полностью.
Код: 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
----- Shine on you crazy diamond WBR jm ( aka x-ray aka ведьМЫШ ) http://vedmysh.livejournal.com |
|
Всего записей: 528 : Дата рег-ции: Март 2005 : Отправлено: 13 Апреля, 2005 - 15:50:47 |
|
|
|
|
WWW : Профиль : |
|
Цитата:
А это, случайно, не уровень "тумана-затенения"? Он один на всей карте, и я думаю, он должен быть в начале.
Самое глупое - я не знаю, как менять его из карты... Видимо надо что-то писать в mapedit.ini перед созданием карты, но я это до сих пор не освоил... Так что вот.
----- Я убиваю не рукой; тот кто убивает рукой, забыл лицо своего отца. Я убиваю сердцем. |
|
Всего записей: 1694 : Дата рег-ции: Июль 2004 : Отправлено: 13 Апреля, 2005 - 18:02:25 |
|
|
|
|
Профиль : |
|
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?] |
|
Всего записей: 888 : Дата рег-ции: Июнь 2004 : Отправлено: 13 Апреля, 2005 - 18:21:19 |
|
|
|
|
Профиль : |
|
Да ладно, чего спорить то. Ты просто не разложил всё по полкам, во всяком случае я так понял, что ты всегда исходишь из одного и того же значения в offset'ах. Ну да ладно.
А что ещё осталось у нас ? Мне в принципе для рендера больше ничего не надо. Ты говори, я ещё гляну если что.
(Добавление) http://uo.anadyr.org/blood/mapedit.rar
Дизассемблированные "выкуски" - некоторые процедуры из mapedit - сохранение карты, криптование буффера, расчет CRC, etc. Может кому ещё пригодится. Особенно хорошо откоментировал функцию сохранения карты. Многие смещения заменил на символические по смыслу.
Кстати, LifeKILLED, а ты насколько серьезно занимаешься 3ds max'ом ?
----- Shine on you crazy diamond WBR jm ( aka x-ray aka ведьМЫШ ) http://vedmysh.livejournal.com |
|
Всего записей: 528 : Дата рег-ции: Март 2005 : Отправлено: 13 Апреля, 2005 - 18:46:27 |
|
|
|
|
Профиль : |
|
2jm Насчет skyoffsets. Извини - только сейчас спокойно перечитал твой пост и все понял. Поскольку там все время первый байт (декриптованный) = 0, то и получается, что ключем и является это самое число по адресу 0xAB (A xor 0 = A ). Это же число и является сдвигом на который надо перейти, чтобы попасть к секторам. Так я и делал. Но то, что раскопал ты - конечно же правильнее. Ну, во-первых, потому что это данные из mapedit.exe , а, во-вторых, кто знает, может быть этот байт и не обязан равняться нулю и мне просто везло, и тогда действительно нужно знать число skyoffsmagic из заголовка. Хотя я так и не пойму, что же там в этих skyoffset'ах хранится? Что это за возрастающие числа типа word? Еще скажи: ты в дебуггере можешь определять тип переменной? Я имею ввиду, не только сколько байт, но и знаковость? |
|
Всего записей: 888 : Дата рег-ции: Июнь 2004 : Отправлено: 14 Апреля, 2005 - 04:54:00 |
|
|
|
|
Профиль : |
|
Ничего, бывает Я ж исключительно ради общего блага. Вобщем не суть. Главное чтобы ты алгоритм уловил.
На счет оффсетов я так думаю это просто банальные смещения координат для подвижного неба. Вообще говоря надо просто проанализировать по картам - в e2m7 (кажется) количество этих смещений иное. Вот и надо сравнить будет. А вообще разве в blood есть подвижное небо ? Предположил бы, что это фишка 3dfx версии, но они читаются даже в случае если карта не седьмой версии. Можно попытаться порыться в Blood.exe, но это как я уже говорил достаточно комплексная задача.
На счет знаковости переменной, могу в принципе, но только теоретически - анализируя участок кода. В принципе вероятность ошибки при этом есть конечно, но она очень мала.
Кстати, до отладчиков я так и не дошел Пока хватает IDA. Ну так лениво стартовать ntice Хотя если бы пользовался им было бы наверное проще. А с другой стороны никогда из ntice не отлаживал dos4gw приложение, там ведь по сути дос среда эмулируется. Так что может на самом деле я и не много потерял что не лез в него.
(Добавление) Кстати, у меня там по тексту очепятка, где про байтик информации - не паракса а конечно же паралакса
----- Shine on you crazy diamond WBR jm ( aka x-ray aka ведьМЫШ ) http://vedmysh.livejournal.com |
|
Всего записей: 528 : Дата рег-ции: Март 2005 : Отправлено: 14 Апреля, 2005 - 09:33:20 |
|
|
|
|
WWW : Профиль : |
|
3ds-max'ом занимаюсь серьезно, хотя и не все освоил. Умею: создание моделей, скелетная анимация, разные там приемы, плагин для тканей использую... Даже разработал собственный реалистичный огонь. А что надо? Моделек наделать?
Что еще за подвижное небо?! Вращающееся, что ли? В 3dfx-патче небо то же самое. Выглядет даже хуже - несостыковки в местах "склеивания" кусков текстур. Или имеется ввиду вращение неба? (например, чтобы развернуть луну ) В Mapedit'е я такого не видел, там ничего не вращается, там одно положение неба.
----- Я убиваю не рукой; тот кто убивает рукой, забыл лицо своего отца. Я убиваю сердцем. |
|
Всего записей: 1694 : Дата рег-ции: Июль 2004 : Отправлено: 14 Апреля, 2005 - 19:01:51 |
|
|
|
|
Профиль : |
|
На счет 3d max'а - пока ничего не надо. Очень надеюсь, что скоро ситуация изменится и будет надо Просто мне нужно какое то время чтобы въехать в архитектуру самого Build'а, и понять, присоединюсь ли я к winblood, буду делать что-то свое или же параллельно оба варианта (хотя и дико звучит). Сейчас нужно выйти на Джастина ( лид и единственного кодера Winblood на данный момент ) и пообщаться с ним. Кое какие моменты выяснить...
На счет неба это только догадки-предположения. У меня мелькала мысль, что это смещения для неких подвижных деталей в небе. Видимо таки придется потрошить Blood.exe...
----- Shine on you crazy diamond WBR jm ( aka x-ray aka ведьМЫШ ) http://vedmysh.livejournal.com |
|
Всего записей: 528 : Дата рег-ции: Март 2005 : Отправлено: 14 Апреля, 2005 - 19:26:06 |
|
|
|
|
WWW : Профиль : |
|
А может, плюнуть на небо? (и отойти в сторону, а то вернется ) Мне кажется, следует сделать свое небо на основе того...
А можно узнать, что они уже сделали в winblood?
----- Я убиваю не рукой; тот кто убивает рукой, забыл лицо своего отца. Я убиваю сердцем. |
|
Всего записей: 1694 : Дата рег-ции: Июль 2004 : Отправлено: 15 Апреля, 2005 - 00:25:43 |
|
|
|
|
Профиль : |
|
На небо плюнем да Кстати возможно исходный текст polymost даст ответы на некоторые вопросы. О polymost ниже.
Можно Короче говоря, как выяснилось, Ken Silverman ждал себе, ждал пока кто нибудь сделает современный римейк билда и недождавшись написал свою реализацию рендерера по имени Polymost. Это ядро графической подсистемы Jonof портов и собственно winblood. То бишь рендеринг вполне полноценный. В самом winblood пока есть пара монстров, и возможность погулят по уровням на сколько я понял. Пока что его не смотрел, только исходники.
----- Shine on you crazy diamond WBR jm ( aka x-ray aka ведьМЫШ ) http://vedmysh.livejournal.com |
|
Всего записей: 528 : Дата рег-ции: Март 2005 : Отправлено: 15 Апреля, 2005 - 05:21:40 |
|
|
|
|
WWW : Профиль : |
|
А есть стронички, где можно посмотреть на него?
Похоже, мне все-таки придется осваивать C++... VB я уже освоил недавно, но без C++ я, похоже, все-таки остаюсь бессилен ко всему программированию... А это меня сильно бесит...
----- Я убиваю не рукой; тот кто убивает рукой, забыл лицо своего отца. Я убиваю сердцем. |
|
Всего записей: 1694 : Дата рег-ции: Июль 2004 : Отправлено: 15 Апреля, 2005 - 21:02:37 |
|
|
|
|
|
Всего записей: 528 : Дата рег-ции: Март 2005 : Отправлено: 16 Апреля, 2005 - 10:57:24 |
|
|
|
|
Профиль : |
|
Впереди выходные и есть возможность посидеть с форматом, но я помня про обещанное выложить все, что я накопал по формату MAP решил сделать это независимо от процента завершенности своей работы. В конце концов, подход jm гораздо правильнее, и возможно эти наработки ему помогут. Так что выкладываю то, что мне удалось раскрыть причем в очень сыром виде. http://www.bloodgame.ru/download/mapformat.rar Предлагаю jm внести коррективы, о которых он уже упоминал и добавить то, что он еще раскрыл. Можешь даже изменить вид самой спецификации. Хотя мне очень нравится табличный подход в Excel. |
|
Всего записей: 888 : Дата рег-ции: Июнь 2004 : Отправлено: 23 Апреля, 2005 - 07:15:47 |
|
|
|
|
Профиль : |
|
Гляну на неделе. В каком виде решать тебе я буду только корректором
Временно забил на реверсинг - пишу вспомогательные классы обертки для DirectX и прочего барахла. Нудновасто, а никуда не денешься.
----- Shine on you crazy diamond WBR jm ( aka x-ray aka ведьМЫШ ) http://vedmysh.livejournal.com |
|
Всего записей: 528 : Дата рег-ции: Март 2005 : Отправлено: 25 Апреля, 2005 - 13:15:48 |
|
|
|
|
|
Всего записей: 888 : Дата рег-ции: Июнь 2004 : Отправлено: 22 Июня, 2005 - 06:23:30 |
|
|
|
|
Профиль : |
|
Упс. Слав прошу прощения. Замотался не увидел пост. Собственно ещё раз дико извиняюсь, обещал ещё давно пересмотреть твои спецификации, но так и не дошли руки. На неделе разрешу этот вопрос. Файл выложу и сюда брошу пост. Лучше конечно если заберешь его к себе. Вот.
----- Shine on you crazy diamond WBR jm ( aka x-ray aka ведьМЫШ ) http://vedmysh.livejournal.com |
|
Всего записей: 528 : Дата рег-ции: Март 2005 : Отправлено: 29 Июня, 2005 - 04:20:53 |
|
|
|
|
Профиль : |
|
Да я, в принципе, сам тоже мог еще немного написать, но все руки не доходят |
|
Всего записей: 888 : Дата рег-ции: Июнь 2004 : Отправлено: 29 Июня, 2005 - 05:15:21 |
|
|
|
|
|
Всего записей: 528 : Дата рег-ции: Март 2005 : Отправлено: 03 Июля, 2005 - 16:08:37 |
|
|
|
|
|
Всего записей: 888 : Дата рег-ции: Июнь 2004 : Отправлено: 21 Декабря, 2006 - 16:08:34 |
|
|
|
|
WWW : Профиль : |
|
Круто!
Сказать честно, я решил уже делать 3д-проги. Всю литературу перестал, теорию досконально изучил, да и с ООП с недавнего времени дружу. Буду делать свой 3Д движок. Может, и формат МАР в него загоню... Не хочу никого питать надеждами, но в последнее время я свои обещания исполняю |
|
Всего записей: 1694 : Дата рег-ции: Июль 2004 : Отправлено: 22 Декабря, 2006 - 03:00:35 |
|
|
|
|
Профиль : |
|
LifeKILLED Так держать!Не забудишь выложить свою SUPER-UBER затею на форуме! |
|
Всего записей: 622 : Дата рег-ции: Нояб. 2006 : Отправлено: 22 Декабря, 2006 - 15:11:40 |
|
|
|
|
|
Всего записей: 208 : Дата рег-ции: Апр. 2009 : Отправлено: 29 Июня, 2014 - 17:35:34 |
|
|
|
|
|
Всего записей: 888 : Дата рег-ции: Июнь 2004 : Отправлено: 30 Июня, 2014 - 01:43:31 |
|
|
|
|
WWW : Профиль : |
|
Начал писать свой загрузчик карт 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) |
|
Всего записей: 946 : Дата рег-ции: Янв. 2008 : Отправлено: 04 Декабря, 2015 - 08:57:25 |
|
|
|