Правила, действующие в этом форуме и всех его подфорумах:
1) Запрещена реклама в любых её проявлениях (сразу бан без предупреждения)! 2) Мат тоже не приветствуется на форуме, но иногда можно выразить свои чувства ( лучше заменяйте матные слова точками, пробелами, другими буквами)! 3) Категорически запрещается унижать, посылать, издеваться над участниками форума! Мы здесь все - одна большая и дружная семья! Поэтому за нарушение этого правила автоматически будем банить! 4) Разрешены ссылки на информацию, которые относятся к тому или иному разделу форума! 5) Ссылки не в тему будут удаляться и пользователь получит предупреждение или будет забанен! 6) Пользователям разрешено задавать любые вопросы относящиеся к теме, а мы все дружно ответим на эти вопросы. А также отвечать на вопросы и высказывать своё мнение. 7) Повторные темы, которые будут создаваться, будут удалены! Создавайте темы, удостоверившись, что такой темы нет на форуме! 8) Запрещён флуд во всех его проявлениях, сообщения не по теме, сообщения состоящие из одного или нескольких смайликов без текста, сообщения типа - Вах!, Рулез!, Круто! и т.п. Пользуйтесь пожалуйста кнопкой [EDIT], не плодите бессодержательные сообщения. 9) Использование смайликов разрешается не более 3-х подряд!
Я что-то совсем в афиге... Тестирую прогу на спрайтах с префиксами в указателях. Из 9 выбранных (все враги, главный герой и ракета) 3 не работают! Формат спрайтов rSPR_DEMON, rSPR_OURHERO, rSPR_MISL и, может, еще чего-то, ДРУГОЙ? Пытаюсь распаковать первый кадр своей прогой, 6 отрабатывают корректно, а с 3-мя ничего не выходит... Разрешение определяется, но прямоугольник почти черный, т.е. пикселями не заполняется. Во вложении исходники моей недоделанной проги, проблемные файлы спрайтов и просмотрщик 3doresexplorer.exe. Гляньте, кто может, а? Ниже те же исходники проги, но текстом, кому как удобно читать. (Во вложении весь проект Visual Studio)
static void PrintError(char *Error) { printf("# Error in Line %d, %s\n",LineNum,Error); }
static void LoadSprites(FILE* fp) { char *TextPtr; /* Pointer to string token */ Word i; /* Index */
while (fgets(InputLine,sizeof(InputLine),fp)) { /* Get a string */ ++LineNum; /* Adjust the line # */ TextPtr = strtok(InputLine,Delimiters); /* Get the first token */ if (!TextPtr) { continue; } i = 0; /* Check for the first command */ if (isalnum(TextPtr[0])) { /* Comment? */ do { if (!strcmp(TextPtr,Commands[i])) { /* Match? */ switch (i) { /* Execute the command */ case 0: // SetType(); /* Target machine */ break; case 1: RestoreSprite(0); break; } break; /* Don't parse anymore! */ } } while (++i<CommandCount); /* Keep checking */ } if (i==CommandCount) { /* Didn't find it? */ printf("# Command %s not implemented\n",TextPtr); } } }
static void RestoreSprite(Word Config) { FILE *infile, *outfile; char *TextPtr; Count++; char *FinName, *tmpName, *tmpName2; Word temp, temp2; int FileSize, i, Off2Entry, Count; int start_offset, RealStartOffset, offset; int Width, Height, PRE0, PRE1, PDAT_length;
int Prefix40 = 0x40; int Prefix80 = 0x80;
struct { Word CCB; Word Head_50; Word Blank; } CCB;
struct { Word temp; Word PLUT; Word PLUT_size; Word PLUT_value; } PLUT;
struct { Word temp; Word PDAT; } PDAT;
TextPtr = strtok(0,NumDelimiters); if (!TextPtr) { PrintError("Not enough parms for LOAD"); return; }
TextPtr = strtok(0,NumDelimiters); if (!TextPtr) { PrintError("Not enough parms for LOAD"); return; }
// Делаем цикл чтения кадров. // Сначала читаем 2 байта и определяем префикс. В зависимости от этого по-разному определяется смещение // к урезанному заголовку кадра.
// Если префикс =40, то к прочитанному далее указателю плюсуем то смещение, куда оно указывает. // По тем указателям читаем подряд n-кадров. n=??????????
// Если префикса нет (==0), то просто переходим по данному указателю.
// Установим позицию на начало PLUT. rewind(infile); fseek(infile,Off2Entry+4,SEEK_SET); // +4, потому что нужно еще пропустить 4 байта. // Эти 4 байта, видимо, попали из PC версии, где означали размещение спрайта по X,Y.
// Читаем и пишем урезанный заголовок CCB в outfile for (i=0; i<60/4; i++) { fread(&PLUT.temp,4,1,infile); temp = PLUT.temp; fwrite(&temp, 4, 1, outfile); }
// Определим размеры кадра и поменяем их местами, потому что спрайт повернут на 90 градусов // против часовой стрелки. rewind(infile); fseek(infile,Off2Entry+56,SEEK_SET);
// Запишем высоту temp = Swap4Bytes(Height); fwrite(&Height, 4, 1, outfile);
// Теперь запишем PLUT. Она в исходном файле спрайта идет без заголовка. // Ориентируемся на размер 4C. Пока так. // Заголовок: PLUT.PLUT = 0x504C5554; temp = Swap4Bytes(PLUT.PLUT); fwrite(&temp, 4, 1, outfile);
// Вычисляем длину PDAT. PDAT_length = 0; for (i=0; i<FileSize/4; i++) { fread(&PDAT.temp,4,1,infile); temp = PDAT.temp; PDAT_length += 4; //Находим следующий PDAT. Это будут флаги 47 E6 42 10 как 10 42 - E6 47 if (temp == 0x1042E647) { // Следующий PDAT найден. // PDAT_length += 4; cout << "\nNext CCB flags found"; cout << "\nPDAT_length= " << PDAT_length; temp = Swap4Bytes(PDAT_length); fwrite(&temp, 4, 1, outfile); temp = Swap4Bytes(PDAT_length); // Теперь запишем весь PDAT в выходной файл. rewind(infile); fseek(infile,Off2Entry+64+64,SEEK_SET); // 64 - длина обрезанного заголовка // второе 64 - длина PLUT в исходном файле без заголовка (4C) cout << "\nOFFSET to PDAT = " << Off2Entry+64+64; for (i=0; i<PDAT_length/4-2; i++) { // -2, потому что заголовок PDAT и ее и размер мы уже записали fread(&PDAT.temp,4,1,infile); temp = PDAT.temp; fwrite(&temp, 4, 1, outfile); } //// ЗДЕСЬ ПРОПИСАТЬ, ЕСЛИ КАДР ОДИН И ДОСТИГНУТ КОНЕЦ ФАЙЛА! ////////////
Пока тут затык, починил текстуру cratiny. В Rezfile она была засунута некорректно, из-за чего в игре было непонятное месиво. Помню, что мы с соседом безуспешно пытались понять, что же это за выступ в углу? Ну и в других местах тоже отображалось непонятное, но на это мы внимания не обращали:
Теперь текстура отображается корректно. Найти эти маленькие ящики можно только на 10 уровне здесь:
_______________________________________ There are 10 types of people in the world: those who understand binary, and those who don't.
Доброго времени суток! Я сюда попал из Emu-Land'а благодаря юзеру с ником Yaranga.
Я буквально несколько часов назад релизнул свой хак для GBA Doom'а (который тоже работает на основе Jaguar движка), и Yaranga предложил мне глянуть на "подобную" работу для 3DO версии.
Так вот, у меня есть наработки карт, которые были только в ПК релизе + несколько карт из Playstation релиза + E1M8b от Джона Ромеро, которыми с удовольствием поделюсь.
Архив включает в себя карты, работающие именно под ПК движком (т.е. их надо будет переводить в 3ДО формат), файлы для распознавания в Дум Билдерах, НО НЕ включает в себя текстурпак ГБА Дума, поэтому при открытии в редакторе большинство текстур будут считаться "неизвестными". Надеюсь, эти файлы будут полезны, и пригодятся в деле.
DeXiaZ О! Приветствую! Спасибо за карты, пока бегло глянул, все текстуры и объекты на месте. GBA версия (если основана на Jaguar версии) использует те же самые текстуры. Поэтому эти карты можно брать и конвертировать "вчистую". Карты другие, и это радует! Не нужно будет заниматься подгонкой и подбором текстур. Сборку положил в кубышку. Эти уровни буду использовать, когда будет собираться пак для релиза. Спасибо большое!
Добавлено спустя 1 минуту 43 секунды: Yaranga Гляну обязательно! DeXiaZ Спасибо за GBA работу! Заценю на досуге!
_______________________________________ There are 10 types of people in the world: those who understand binary, and those who don't.
DeXiaZ, и тоже маленький вопрос: когда в новых уровнях падаешь с высоты более метра, слышится звук боли, повреждения, хотя повреждений на самом деле нет... В ГБАшной версии так изначально было или это уже вы сами прикрутили?
Первый: rom Jaguar пересобирался или как-то еще? Сорри, может не туда спросил, т.к. платформу GBA совсем не знаю.
Первоначально я пытался пересобирать (это была самая первая доступная методика), но ничего не получалось, так как этот метод достаточно кривой, и им владел, по сути, только тот, кто этот метод и придумал
Какое-то время спустя, некий чешский фанат и хакер сделал куда более удобную прогу, с помощью которой я просто заменял файлы внутри уже готового рома.
Цитата:
и тоже маленький вопрос: когда в новых уровнях падаешь с высоты более метра, слышится звук боли, повреждения, хотя повреждений на самом деле нет... В ГБАшной версии так изначально было или это уже вы сами прикрутили?
Это так сделали в ГБА версии. Видимо, экономили вес игры.
DeXiaZ А как при этом исполняемый файл видит изменившееся количество уровней? Или автоматом подхватывает?
Не понял вопроса. Я не знаю, как именно устроена 3DO версия, но GBA версия - это типичный IWAD архив, сформированный в виде .gba рома, а не .wad файла. Это сопряжено с трудностями в редактировании (всякими слэйдами и xwe не откроешь).
Правда, по системе организации .gba похож на .pk3 - внутри архива находятся уровни, которые сами запакованы в .wad архивы. Поэтому, для замены оригинальных карт надо пихать свою собственную в виде .wad файла (заменяя старую, оригинальную версию). Предварительно, надо сконвертировать готовую карту в GBA формат путем проги от Kaiser'а - в данных карты меняется файл SEGS (сегменты лайнов), и любая карта стабильно тяжелеет на 30-40 килобайт.
Вес играет важную роль - вес рома не должен быть выше первоначального. Меньше - можно. Поэтому, карты пришлось упрощать. Но было так, что два раза пришлось упрощать карты еще сильнее, чем я рассчитывал - во время бета тестинга FPS падал до 0 и вообще игра превращалась в месиво в определенных местах. То есть данные упрощения были направлены в сторону не уменьшения веса карты, а в сторону стабилизации FPS.
Собственно, у 3DO железо явно мощнее, поэтому все мои готовые карты должны работать еще лучше. Вдобавок, вы могли заметить, что иногда встречаются несколько версий одной и той же карты - самая "старая" версия - самая цельная по сравнению с ПК версией. Поэтому вы можете использовать ранние версии карт, чтобы геймплей был полноценнее.
DeXiaZ Понятно, в GBA с добавлением уровней проще. Подпихнул ему новые уровни и игра их подхватила. В 3DO так не прокатывает. Нужно перекомпилировать exe файл, чтобы игра поняла, что уровней сейчас другое количество. Да еще и логику их следования тоже прописывать нужно, ну там, сначала секретный, затем такой-то... А GBA в этом смысле действует также, как и PC, ну, если не считать технических ограничений.
_______________________________________ There are 10 types of people in the world: those who understand binary, and those who don't.
DeXiaZ Понятно, в GBA с добавлением уровней проще. Подпихнул ему новые уровни и игра их подхватила. В 3DO так не прокатывает. Нужно перекомпилировать exe файл, чтобы игра поняла, что уровней сейчас другое количество. Да еще и логику их следования тоже прописывать нужно, ну там, сначала секретный, затем такой-то... А GBA в этом смысле действует также, как и PC, ну, если не считать технических ограничений.
А, ну так вы изменяете количество уровней. А я нет, поэтому мне не пришлось играться с такими вещами. Я просто заменял все 24 карты. И, как видно, мне хватило 19 карт с головой (1-18, 24). Оставшиеся (19-23) просто уровни из Дума 2 по хронологическому порядку.
Если вы специально меняете количество уровней, то конечно, это требует такие вот манипуляции. Что поделать, хардкодинг - зло :)
Здравствуйте. Посмотрел на форуме http://forum.zdoom.org/viewtopic.php?f=19&t=51919 Хочу спросить можно ли реализовать эту идею в 3DO DooM? Считаю что данная задумка будет смотреться шикарно. Хотя вы и скажете что это отклонение от оригинала, но раз вы имеете на руках исходники, то это уже нарушение.
Добавлено спустя 3 минуты 4 секунды: Пользуясь случаем поздравлю всех с майскими праздниками
Здравствуйте. Вообще, спрайты редактировать можно в любом Doom'е, вроде как. Я, правда, рискую с таким ответом касательно 3DO, так как с его аспектами моддинга знаком весьма поверхностно, но вообще-то можно сделать. Только анимация такой плавной не будет.
Спасибо за разъяснения. Мне вообще фиолетово что вы с думом на 3до собираетесь сделать. Просто увидел вот это и решил что будет очень неплохо смотреться, мне кажется это подошло бы к думу. Смотриться как-то по новому и в тоже время оно и не выходит за рамки. А вот анимацию можно любую сделать. Пример Smooth Doom. Или я не прав?
Хочу спросить можно ли реализовать эту идею в 3DO DooM?
RomanKursant писал(а):
Мне вообще фиолетово что вы с думом на 3до собираетесь сделать
Так определитесь сначала, что вам нужно и зачем вам нужно это знать, если вы обращаетесь сюда, к нам, но при этом вам фиолетово.
Я уже сказал, что спрайты тут меняются как в ванильном думе - оригинальный набор как он есть. Можно просто придать новый вид благодаря новым спрайтам. Но их количество ограничено, поэтому плавной анимации не будет. Какие еще могут быть вопросы?
Когда я сказал фиолетово то подразумевал что "я предлагаю идею, а вы хотите делайте и хотите не делайте". Я тут не могу указывать как вам тут поступать. Мне интересно почему такая реакция на слово фиолетово? Я вроде ее не адресовывал какому-то конкретному лицу или группе лиц.
RomanKursant Такие нововведения уместно делать, когда есть полноценный Ultimate Doom и Doom 2. После этого можно баловаться с новыми неоригинальными и самодельными текстурами. Мое мнение такое.
RomanKursant писал(а):
Мне интересно почему такая реакция на слово фиолетово? Я вроде ее не адресовывал какому-то конкретному лицу или группе лиц.
Попахивает пренебрежением. А так да, никого не задел. DeXiaZ Спрайты мы пока раскурили не полностью. Как поймем полностью их формат, можно будет добавлять/менять.
RomanKursant писал(а):
А вот анимацию можно любую сделать. Пример Smooth Doom. Или я не прав?
Слишком много кадров не пойдет на пользу движку. И так скоростью 3DO Doom не блещет. Если удастся переписать отрисовку пола и потолка под cel-engine, то об этом можно начать говорить, хотя первостепенной задачей я бы это не ставил.
DeXiaZ писал(а):
Но их количество ограничено, поэтому плавной анимации не будет.
Ну, как сказать... В исходниках прописывается время до переключения следующего кадра и их количество. Так что в теории можно оружие и более плавным сделать. Но этого не нужно делать, выше написал почему.
_______________________________________ There are 10 types of people in the world: those who understand binary, and those who don't.
Когда я сказал фиолетово то подразумевал что "я предлагаю идею, а вы хотите делайте и хотите не делайте".
Я это воспринял как "я просто спросил, но мне все равно на то, чем вы занимаетесь, меня просто заволновал этот вопрос и я решил спросить здесь". Косноязычие-с.
Versus писал(а):
Спрайты мы пока раскурили не полностью. Как поймем полностью их формат, можно будет добавлять/менять.
Формат у спрайтов в ПК Думе всегда отсутствовал. Некоторые редакторы его определили как .lmp (lump), так как картинки без форматов в Винде обычно не бывают. Но мододелы обычно определяют для редактирования как .bmp, самолично.
Предполагаю, что и в 3DO такая же фигня - спрайты не имеют файлового формата как такового.
DeXiaZ Ну, примерно так. У этих спрайтов есть формат (cel), но оставлено только само тело файла без всех заголовков. И восстанавливать их - жопное дело. На этой и предыдущей странице выжимки из этого опыта.
_______________________________________ There are 10 types of people in the world: those who understand binary, and those who don't.
Помню когда главный герой погибает возле двери или его придавливает после смерти чтобы начать уровень заново нужно нажать использовать когда нажимаешь использовать сначала приоткрывается дверь а потом окно загрузки
Versus, у меня не было пока возможности даже попытаться вникнуть. Ты в отладчике своей проги пробовал пошагово смотреть почему отрисовка не происходит? Это же самый простой способ понять. Сразу увидишь на каком байте проблема при разборе файла. Либо алгоритм декодирования где-то падает и поэтому получаешь черный квадрат т.к. заполнение данных не произошло.
Мы о том говорим? Я разбираю уже скомпилированный (из REZFILE) файл спрайта. Там зашито несколько кадров. Пока пытаюсь достать только первый. При этом нужно дописать заголовок CCB, выдернуть PLUT и PDAT. В нескольких файлах спрайтов все происходит корректно. А вот с тремя обнаружилась проблема. То ли там размер PLUT другой, то ли хрен его знает, что еще.
Author писал(а):
Ты в отладчике своей проги пробовал пошагово смотреть почему отрисовка не происходит?
В том-то и дело, что алгоритм мой простейший и ошибок никаких нет. Мы просто выдираем определенное количество байт на PLUT, определенное количество байт на PDAT, читаем разрешение и все.
_______________________________________ There are 10 types of people in the world: those who understand binary, and those who don't.
Я говорю об исходниках твоей проги для восстановления спрайта.
Versus писал(а):
Мы просто выдираем определенное количество байт на PLUT, определенное количество байт на PDAT, читаем разрешение и все.
Допустим ты всё сделал правильно. А чем ты просматриваешь результат? CelViewer не полностью поддерживает CEL'ы. Там есть заглушки недоработанные, если по какому-то флагу туда попадёт декодер, то как раз будет чёрный экран. Так же в процессе декодирования может быть ошибка в данных приводящая к такому же результату.
Сейчас этот форум просматривают: Trendiction [Bot] и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения