Итак, лицензионная копия Windows 7 вместо одного XP на два компьютера, бесплатная среда разработки Lazarus на замену Delphi, новый псевдоним вместо набора букв. Если смогу сделать больше, чем пара программ для работы с файлами Diablo 1, может, даже свой сайт появится. А пока - вот что:
Ну не знаю. Мне очень помогли исходники от Ulmo... А так, разумеется, мои коды будут известны всем только после декомпиляции. Боюсь, что Лазарус позволяет. Хотя мне бы самому не запутаться. Надо бы всё откомментировать.
Добавлено (2011-12-23, 21:00) --------------------------------------------- Для тех, кто не разобрался, что делать с CELMgr, и готов качать FLV в 25 МБ из Google docs, даю видеосписок того, что делать с CELMgr. Это мой первый видеоурок, поэтому не удивляйтесь, если опять ничего не поймёте. Забивайте шурупы молотком, а не микроскопом!
По поводу дун файлов вопрос. Сейчас копаю код с ними связанный. Первый учар - размер по row третий учар - размер по col А дальше с пятого чара через чар какие то значения на счёт стен и пола идут. Вопрос - а почему каждый 2й чар нулевой и какие ещё данные в дун пишутся?
Добавлено (2011-12-24, 00:35) --------------------------------------------- Вопрос про нулевые байты снимается. Просто там двухбайтовые значения. short а не uchar
Надо бы мне разобраться в сишных типах данных, для взаимопонимания. А с файлом DUN всё, скорее всего, проще некуда. А вот чтобы его в полной мере отрисовать... Вся сложность в соотношениях между CEL, MIN, SOL, TIL и AMP. Кое-что ещё захардкодено. Близзард это любит...
DUN Первые два word - ширина и высота. Далее следует двумерный массив из word (Width x Height). Это индексы тайлов, начиная с 1. 0 - нет тайла. Для каждого типа уровней (город, церковь...) свой набор тайлов в CEL (кстати, CELMgr здесь сливает. За такую стандартизацию типов файлов я бы на месте Близзарда перечислил разработчикам все их заслуги...). Художники в свою очередь не уложились в 255 тайлов только в случае города, с чем я их опять же поздравляю. После массива тайлов идут двумерные массивы объектов (Width*2 x Height*2 каждый массив. Тип данных - тоже word). Во втором из этих массивов - монстры, остальное не знаю.
CEL Список кадров в файле - как в обычном CEL. А сами кадры - фейспалм. Каждый кадр - квадрат 32x32. 6 способов кодировки (строки снизу вверх. Могу где-то ошибиться, ориентировался на исходники от Ulmo): 0 - просто 1024 пикселя в ряд. 1 - обычный кадр CEL. 2 - треугольник влево. Пикселей в строках: 0, 2, 4, ..., 30, 32, 30, ..., 4, 2. И ещё каждая строка выравнивается на 4 байта, если ничего не путаю. 3 - треугольник вправо. Остальное - как в №2. 4 - трапеция со скосом слева внизу (2, 4, ..., 32, 32, ..., 32). Строки выравниваются на 4 байта. 5 - трапеция со скосом справа внизу.
MIN Каждый тайл состоит из 4 блоков: 0 2 1 3 В пикселях (+/- const, сейчас не соображу): (0;16) (-32;0) (32;0) (0;-16)
Здесь находится информация о блоках. Смысл такой: один кадр из CEL может содержаться в нескольких блоках, один блок - в нескольких тайлах. Данный файл - массив из блоков, блок - массив из word. Если не ошибаюсь, кадры в блоке рисуются в таком порядке: n-1 n n-3 n-2 ... 3 4 1 2 (n - количество кадров в блоке). Содержимое word - тип кодировки кадра, сдвинутый влево на 12 бит, плюс номер кадра в CEL, начиная с 1. Если кадра нет, то 0. Теперь внимание: вы бы додумались дать разные типы кодировки одному кадру, участвующему в разных блоках?
SOL Свойства блоков. Массив из byte. Смысл битов от младшего к старшему: блокировка ходьбы, обзора, всяких там стрел, прозрачность, хз, хз, хз, хз.
TIL Массив из тайлов, каждый тайл - 4 word, являющихся индексами блоков, начиная с 0.
AMP Свойства тайлов. На каждый тайл по 2 байта. Первый байт (названия стянуты из TDG): 00: Flat 01: Pillar 02: West Wall 03: North Wall 04: NorthWest Corner 05: West Edge 06: North Edge 07: SouthEast Edge 08: SouthWest Corner 09: SouthEast Corner 0A: South Wall 0B: East Wall 0C: SouthEast Roof Какой смысл от этой информации для эксешника - не знаю. Второй байт - биты от младшего к старшему (названия стянуты оттуда же): WestDoor, NorthDoor, WestArch, NorthArch, WestGrate, NorthGrate, Roof, Stairs Здесь по крайней мере что-то отвечает за отрисовку.
Стороны света: WN SE
Если тайл имеет бит WestArch или NorthArch, относительно этого тайла рисуется арка (или обе арки). Также арки рисуются для определённых тайлов (именно это я имел в виду, говоря о хардкоде. А также то, что и для стандартных арок свой код для каждого типа уровня). По исходникам dun_edit я плохо понял, как рисовать арки. Я подгонял их положение. Изображения арок берутся из обычного CEL: если, например, CEL для тайлов - "l1.cel", то CEL с арками - "l1s.cel". Сейчас я пошёл спать (блин, уже полчетвёртого), а потом могу привести код рисования арок от Ulmo.
Бесценная информация. В тх2 сбилась загрузка монстров из дун файла и я всё не могу подобрать с какого ворда начинается карта монстров. Надеюсь эта информация поможет в этом нелёгком деле.
Добавлено (2011-12-24, 02:24) --------------------------------------------- чар - он же байт. Полуслово short - он же слово. 2 байта инт - двойное слово 4 байта
Добавлено (2011-12-24, 02:56) --------------------------------------------- Чего то у меня не клеится. Захожу в склеп леорика. Брыкаю после загрузки дуна. ширину и высоту читаю. А дальше странность. идёт массив вордов размером ширина на высоту. И всё. Дальше область размером ширина на высоту нулевая (объекты или монстры там должны быть не знаю) и ещё дальше такого же размера нулевая область. Или в этом дуне кроме значений стен и полов ничего нет или куда то всё хитро спрятано...
Добавлено (2011-12-24, 03:17) --------------------------------------------- 31454 байта размер дун файла томба леорика -4 байта на ширину и высоту = 31450 Размеры 37 * 25 = 925 31450 / 925 = 17 - столько однобайтовых карт можно сохранить - 2 - карта стен и полов. 15 Вот среди этих 15 байтовых карт или 7.5 двухбайтовых предстоит найти где же монстры спрятаны...
Добавлено (2011-12-24, 03:48) --------------------------------------------- Кажется нашёл в чём проблема. Мордор расширил дун файл для различий в зависимости от уровня сложности. Получаем следующую картину 4 байта - размеры 1) 2 байта * площадьКарты - данные о стенах и поле 2) 2 байта * площадьКарты пусто 3) 2 байта * площадьКарты пусто 4) 2 байта * площадьКарты пусто 5) 2 байта * площадьКарты какие то данные 6) 2 байта * площадьКарты какие то данные 7) 2 байта * площадьКарты какие то данные 8) 2 байта * площадьКарты какие то данные 9) 1 байт * площадьКарты - единственное значение [894] = 108 что сей код значит без понятия
Сейчас отфильтрую данные которые относятся к карте объектов и тогда останутся лишь данные монстров.
Кхм... Работать по ночам вредно, тк 31450 / 925 = 34 В каждый тайл умещается по 4 объекта (по 1 в блоке). На всякий случай: объекты в файле DUN сгруппированы не по тайлам, а как обычный массив, по строкам. Но в любом случае:
Quote (Kozel)
После массива тайлов идут двумерные массивы объектов (Width*2 x Height*2 каждый массив. Тип данных - тоже word).
- размеры удвоенные. (17-1)/(2*2)=4 массива объектов. ЗЫ При разборе реального положения дел учтите, что я тоже умею глючить. Забивайте шурупы молотком, а не микроскопом!
Вот вам и примитивнейший дун)) На счёт вреда работы по ночам согласен. Я тоже на калькуляторе 34 получил а потом тут же разделил на 2 (вордовые 2х байтные карты всё таки) и тут же забыл про это деление разделив ещё на 2...
Просмотрел оригинальный дун в дьябло дате. Один в один. Всё таки мор тут не при чём. Но тогда всё равно непонятно значение кучи карт в дуне. Очень большая часть из них нулевые.
Добавлено (2011-12-24, 17:48) --------------------------------------------- Поподбирав карты получил заполнение монстрами части подземелий где обитает сам леорик и то не полностью. Отсюда ещё одна мысль. Что тот дун с которым я разбирался - только часть с леориком. А остальная часть грузится раньше или позже. Блин. Такие проблемы с этими дюнами. Пойду лучше глюк крит в подземельях ловить.
В "видеоуроке" я (наверное, из-за желания спать) написал следующее: "для каждого пикселя выбирается случайный цвет из палитры" Вместо "случайный" читайте "ближайший" "... все неименованные файлы сохраняются ..." Не все, а только те, в которых есть хотя бы 1 кадр.
И ещё кое-что: если в окне View Frame открыт какой-нибудь кадр, оно лагает при перерисовке кнопок, напр. при изменении размеров окна (при перерисовке кадра почему-то всё в порядке). Ещё совсем недавно этого не было, но я не знаю, какие махинации к этому привели. Есть догадки? В смысле, бывает ли такое с программой, написанной не на Лазарусе. Помню только, что обновлял антивирус (Avira). Это действие уже приводило к глюку отладчика Delphi, потом исправили. ... Оказывается, кадр перерисовывался при необходимости перерисовать окно. Перекинул событие Paint куда нужно, теперь лагает только при перерисовке кадра, причём почти незаметно. Всё же вопрос остался. Забыл написать: рисую в OpenGL. Забивайте шурупы молотком, а не микроскопом!
Сейчас обнаружил, что забыл вот это: Item drop specials. 0040 = No item drops possible...just gold **80 = Unique item drops in SP only. The first byte determines the unique that gets dropped. In MP, this drops random magic items or books. Any other vlues here are unknown. **A0 = Same as above...don't know the difference Можно просто написать цифру, но всё-таки информация поподробнее уже есть? И к чему относится "Any other vlues here are unknown"? Забивайте шурупы молотком, а не микроскопом!
MIN Каждый тайл состоит из 4 блоков: 0 2 1 3 В пикселях (+/- const, сейчас не соображу): (0;16) (-32;0) (32;0) (0;-16)
Здесь находится информация о блоках. Смысл такой: один кадр из CEL может содержаться в нескольких блоках, один блок - в нескольких тайлах. Данный файл - массив из блоков, блок - массив из word. Если не ошибаюсь, кадры в блоке рисуются в таком порядке: n-1 n n-3 n-2 ... 3 4 1 2 (n - количество кадров в блоке). Содержимое word - тип кодировки кадра, сдвинутый влево на 12 бит, плюс номер кадра в CEL, начиная с 1. Если кадра нет, то 0.
Добавлено (2012-03-18, 15:24) --------------------------------------------- А дальше хитрые вычисления uint dungeonMapIndex = dungeonMapNumber - 1; ushort* minPtr = (ushort*)CurrentLevelMINFile; for ( int i = 0; i < someCount; i++) { int decodedNumber = someCount + (i & 1) - (i & 14) - 2; // big end decode ? TileLightMap[cell].tile[i] = minPtr[someCount * dungeonMapIndex + decodedNumber]; }
Добавлено (2012-03-18, 15:28) --------------------------------------------- Что это за числа 16 и 10? по какому принципу производится дешифровка или что это за процесс? По каким смещениям в мин файле находятся значения и какие?
Предметы, уники, монстры, боссы, с картинками. https://drive.google.com/uc?id=0....ownload Выбираем папку с The Hell, папку для результата (создаются или перезаписываются файл "index.htm" и куча файлов в папке "data"), жмём Start, ждём (на нашем компьютере программа думает 11 секунд), открываем index.htm и ищем ошибки. Забивайте шурупы молотком, а не микроскопом!
Зачем так заумно делали не понимаю, но думаю будет ясно
Добавлено (2012-11-12, 18:59) --------------------------------------------- Формулы могли немного поменяться мордором. Смотреть актуальные формулы как то пока неохота
Добавлено (2012-11-12, 19:01) --------------------------------------------- Если кодом неясно, то напишу русским по белому. Если будут просьбы это сделать.
Вышла первая версия THDE, делающая всё, что планировалось изначально. - Аффиксы (некоторые из которых начинаются с маленькой буквы ) - Долой SFmpq, он глючный. В общем, окраска монстров теперь нормальная.
Старые читалки можно удалять? Забивайте шурупы молотком, а не микроскопом!
Файл -> Загрузить Если вдруг по-английски - когда-то было "File -> Download original", как сейчас - не знаю. Забивайте шурупы молотком, а не микроскопом!
Hi ! I have some questions & suggestions about Database (http://diablothehell.narod.ru/Kozel/index.htm) : 1) Possibility to download the whole DB instead of saving each page ? 2) Informations about Dlvls, even if some are available on monsters themselves : Which monsters & bosses can be encountered at X level (new research category) 3) About uniques : Which monsters can drop them, at X difficult, for lazy collecters like me )))
Добавлено (2013-01-05, 04:49) --------------------------------------------- Как на счёт сделать примерочную для тх? Грузишь сейв, файлы стеша. И тебе показываются абсолютно все параметры даже скрытые при надетом шмоте. Можно надевать любой шмот из имеющегося, а также создавать на лету все уники и синьку для примерки. Сейчас посмотрим я могу только пальцами по клаве болтать или всё таки сделаю...
Вышло маленькое обновление для THDE. - В списке букв алфавита перед буквой и после неё добавлены пробелы. - Над этим списком пишется, к чему он относится (Items, Uniques итд). - Списки объектов, название которых начинается с одной буквы, сортируются по алфавиту. Забивайте шурупы молотком, а не микроскопом!
Ага, сижу тут, скрываюсь... Ну наверняка бы отреагировал на вопрос "почему аккаунт YouTube удалил?" А подписью ввожу в заблуждение. Забивайте шурупы молотком, а не микроскопом!
Вышло немаленькое обновление для THDE. - "The Butcher attack type" -> "continuous melee attack" (надеюсь, я правильно понял). - Классификация не только по алфавиту. - Картинки монстров (не боссов) кликабельны. - Да и вообще чуть больше интерактива. - При закрытии окна THDE создаётся файл Settings.ini, содержащий пути к папкам и состояние флажка "Technical information". При следующем запуске
эти данные загоняются в окно.
Также предлагаю попробовать ссылку на скачивание, тб не открывая Google Drive. Очень надеюсь, что Гугл не надумает прикрывать такую возможность. Ссылка, как всегда, в первом сообщении. Забивайте шурупы молотком, а не микроскопом!
Добавлено (2013-02-08, 01:38) --------------------------------------------- Сраное новое окно ввода. Нормально ничего не ввести, вставляет текст только в конец, при вставке цвет схраняется да ещё и так, что фиг его обратно на черный поменяешь...
- Это разные Winged Demon. - Файлы CL2 для них тоже разные. Похожая история с зомби и их разной анимацией смерти. - Окно ввода чертовски непривычное. А что вставляет текст только в конец - это действительно гадость.
Добавлено (2013-02-11, 02:19) --------------------------------------------- THDE 1.1.3 "Мне-не-спится Edition" - Графический интерфейс переписан на WinAPI, поэтому правильную работу программы теперь не гарантирую. Возможна проблема с кириллицей (у меня, вроде бы, всё работает). Зато размер THDE.exe стал в разы меньше (для тех, кому это надо). - Немного изменён StormLib. Теперь MSVC++ 2010 Redistributable и zlib1.dll не нужны. - Вернулось упорядочение по номеру, упорядочение по алфавиту осталось. - Номера DLvl монстра выписаны явно и кликабельны. - В иммунитетах и сопротивлениях проще ориентироваться. - Кнопка "About" (тоже для тех, кому это надо).
- Кириллица в именах папок. - На самом деле мне не нравится, когда в бинарниках слишком много лишнего. В StormLib в этом плане тоже есть чем заняться, хотя не знаю, насколько поможет и смогу ли. Забивайте шурупы молотком, а не микроскопом!
Лишний код. Стоит только создать одну форму, и Lazarus даже при включенной оптимизации кладёт в бинарник мегабайт кода, который так и не будет задействован. Забивайте шурупы молотком, а не микроскопом!
Аааа… Ну это самособой. Я вот пробую (плюсы + winapi) + кросскомпиляция для win платформы через gcc-mingw (у меня линукс) так простенькие проги весят по 30-50кб без UPX, а с UPX — 15-20кб, а если вырезать еще всю графику из ресурсов то и в 5-7кб вкладываюсь)
Следующий шаг - сортировка вещей по типам и в сортировке по типам подсортировка по алфавиту и по уровню. Чтобы можно было как посмотреть все мечи к примеру как по алфавиту, так и по возрастанию крутости. У аффиксов и монстро-боссов тоже подсортировку по уровням.
Добавлено (2013-02-13, 09:23) --------------------------------------------- А может и вовсе лучше сделать комбобоксы у ключа фильтра и ключа сортировки, в котором человек сам выберет как ему сортировать надо.
Kozel, могу сделать более "интерактивную" версию веб версии со всякими сортировками и выборками. Делай экспорт данных, например, в json формат (о структуре договоримся), все остальное я накидаю на coffee script + css фреймворк какойто втулю…
Ещё. Информация о резистах не нужна, только об имунах. Тх так сделан, что у монста если нет к чему то имуна то 100% к этому резист. Так что хватит списка имунов. У монстров не указан тип (тварь, демон, нежить). Сортировка по ним есть, а в данных не указан.
Добавлено (2013-02-21, 23:48) --------------------------------------------- Сортировку по предметам в идеале такую хотелось бы. http://www.diablowiki.com/Base_items_(The_Hell) Но хотя бы фильтрацию по надеваемым слотам с сортировкой по возрастанию qlvl и то неплохо было бы.
Добавлено (2013-02-25, 08:15) --------------------------------------------- Unknown (32): 4000 это FIREBALL DAMAGE
Добавлено (2013-02-25, 08:22) --------------------------------------------- +% Damage, -% Durability: 90...95 +% Damage считается как (2 * effectValue + 140) -% Durability как просто (effectValue) Где effectValue это число между минимумом и максимумом эффекта.
Добавлено (2013-02-25, 08:42) --------------------------------------------- Вообще можешь сверить всё по исходникам, я уже обновил там инфу до актуальной.