Мир MapCraft - WoW Slippy Maps

  1. MPQ файлы
  2. BLP Textures
  3. Мир (из Warcraft)
  4. Веб-приложение
  5. Инстансы
  6. Объекты карты мира
  7. Краевые Чехлы
  8. барахло
  9. Внутри снаружи
  10. Многослойные Карты
  11. оптимизация
  12. Случайные факты
  13. Запрос
  14. Обновления: 20 июня 2011
  15. Post-Script

От Кэл Хендерсон 16 июня 2012 г.

TL; DR версия: проверить Мир MapCraft

Несколько лет назад я наткнулся MapWoW отличное использование API Карт Google для отображения карты World of Warcraft. Карта состоит из изображений миникарты WoW, сшитых вместе, чтобы визуализировать мир. Это дает намного лучшее разрешение по сравнению с основной картой в игре и действительно интересно осматриваться. Неприятная реклама и невозможность использовать мышь для масштабирования раздражают, но не нарушают условия сделки.

Неприятная реклама и невозможность использовать мышь для масштабирования раздражают, но не нарушают условия сделки

Перенесемся в декабрь 2011 года, и карта не была обновлена ​​с учетом изменений в расширении Cataclysm - старый мир значительно изменился, и были добавлены новые зоны. Я думал, что я хотел бы создать свою собственную версию.

Когда я впервые наткнулся на MapWoW, я предположил, что изображения были скриншотами из игрового клиента, а затем тщательно склеены вручную. Это явно безумие. За прошедшее время я написал куча аддонов для WoW и немного разбирался в том, как работают текстуры внутри игры - очевидно, должна быть возможность извлечь текстуры миникарты из игрового клиента, чтобы как-то построить карту.

Первое, что я нашел, было эта отличная статья с некоторого времени во время расширения Burning Crusade. Цель автора состояла в том, чтобы измерить некоторые аспекты игрового мира, но он включил обширную информацию по извлечению текстур миникарты. Приложение 2 здесь можно найти все мясные вещи, но все это стоит прочитать. Давай, я подожду.

Давай, я подожду

Хотя технические детали были очень полезными и подтвердили, что я направляюсь по верному пути, многие детали изменились по мере выпуска новых расширений; мы скоро займемся этим. Два больших преимущества заключались в том, что все текстуры были сохранены в файлах MPQ игрового клиента и были закодированы как файлы BLP. В далеком прошлом я баловался с BLP Охотничья добыча , но MPQ были новыми для меня.

MPQ файлы

MPQ файлы Сокращенно от Mike O'Brien Pack, это архивы, используемые Blizzard для хранения игрового контента - графики, звука, строк, фильмов - всего, что нужно игровому клиенту. В играх Blizzard уже давно используются файлы MPQ (начиная с, по крайней мере, Warcraft II в 1995 году), и формат не сильно изменился. Первоначально доступ к этим файлам осуществлялся с помощью файла storm.dll, поставляемого с играми. Ранее разработчики разобрались с API-интерфейсом storm.dll и использовали его для чтения данных из файлов MPQ для своих собственных приложений. Но storm.dll мог только читать из MPQ, но не писать в них. Если вы хотите изменить текстуру в Diablo, вам нужно было иметь возможность писать в MPQ. LMPQAPI была первой библиотекой, которая смогла сделать это (использовалась StarEdit), а затем в 2000 году Stormless MPQ Editor ,

Примерно в это время StormLib был создан как библиотека C ++ для чтения, записи и изменения файлов MPQ. Это все еще поддерживается сегодня и является основой для многих текущих зрителей и редакторов MPQ.

Сами файлы MPQ довольно сложны - они содержат некоторые заголовки, специальные файлы, хеш-таблицу, таблицу блоков и данные файла. Чтобы найти файл, вам нужно хешировать имя, чтобы найти запись в хеш-таблице, затем записи в таблице блоков, затем фактические данные. На практике это очень быстро (намного быстрее, чем обход файловой системы) и допускает различные виды сжатия.

В старых играх файлы MPQ не содержали листинга файлов - доступ к файлам можно получить только в том случае, если вы уже знаете их имя (поскольку они хранятся в хеш-таблице только как хэш). Это изменилось до появления World of Warcraft, и файлы MPQ содержат специальный файл со списком, в котором перечислены все пути содержащихся файлов.

Файлы MPQ также могут быть исправлены большим количеством MPQ. Вы можете загрузить базовый MPQ, который определяет файлы «a», «b» и «c». Загрузка патча MPQ сверху может изменить «b», удалить «c» и добавить файл с именем «d». StormLib делает все это прозрачным для вызывающей стороны - после загрузки базового MPQ и патча он просто видит «a», «b» (новая версия) и «d». Патчи могут быть сохранены как BSDDiffs или полная замена. На практике MPQ загружаются слиянием, то есть все базовые (не исправленные) MPQ загружаются в одно и то же «пространство имен», что касается вызывающей стороны. Внутри StormLib поддерживает упорядоченную «цепочку исправлений» архивов. Когда вы запрашиваете "world / maps / AhnQiraj / AhnQiraj.tex", проверяется первый MPQ в цепочке. Если файл не найден, проверяется следующий архив в цепочке. Как только файл найден, следующий архив проверяется на наличие патча к нему. Если в патче обнаружен флаг удаления, процесс начинается заново с этой точки в цепочке.

Для текущего уровня патча World of Warcraft (в Windows) имеет следующие MPQ-файлы:

  • art.MPQ - художественные активы
  • base-Win.MPQ - исполняемые файлы Windows (клиент, средство запуска, средство обновления и т. д.)
  • расширение [1-3] .MPQ - художественные и мировые файлы из расширений
  • sound.MPQ - звук
  • world.MPQ - геометрия мира (в основном ВМО и АТД)
  • wow-update-nnnnn.MPQ - патчи с базовым префиксом
  • wow-update-base-nnnnn.MPQ - патчи без базового префикса
  • enUS / locale-enUS.MPQ - строки и текстуры интерфейса
  • enUS / speech-enUS.MPQ - речевые mp3
  • enUS / extension [1-3] -locale-enUS.MPQ - строки из расширений
  • enUS / extension [1-3] -speech-enUS.MPQ - речь из расширений
  • enUS / wow-update-enUS-nnnnn.MPQ - патчи для информации о локали

Все файлы разделены на две части - общие (art, world и sound) и специфичные для локали (строки, речь). Если вы не играете на американском и английском языках, ваши клиентские файлы не будут называться enUS.

Некоторые файлы патчей имеют «базовый префикс», что означает, что все файлы в патче имеют префикс своего пути. Например, если art.MPQ определяет «Textures / Moon02.blp», тогда патч может содержать изменения, называемые «base / Textures / Moon02.blp». Похоже, что это использовалось, чтобы разрешить исправление специфичных для локали и не специфичных для локали данных в одном патче, но не используется для более новых патчей (начиная с версии 13914). Вам нужно сообщить StormLib о префиксе патча при его открытии, чтобы он знал, как объединить файловые индексы.

Когда я начал, я нашел Ладик MPQ редактор для Windows, что позволило мне копаться в моих архивах MPQ. Я знал, что мне понадобится массовое извлечение, поэтому я искал решение для командной строки. Я впервые нашел MPQ-инструменты который использовал libmpq , К сожалению, libmpq основной сайт был вниз некоторое время. После некоторого спора с pkgconfig, чтобы его собрать, все заработало.

Если вы следуете дома, мне нужно установить некоторые переменные среды, чтобы настроить его, а затем запустить:

PKG_CONFIG_PATH = / usr / local / lib / pkgconfig ./configure make LD_LIBRARY_PATH = / usr / local / lib / usr / local / bin / mpq-extract

К сожалению, эта утилита не смогла извлечь файлы по их правильному имени файла - только по их хешу. Это будет тяжелая битва.

После того, как я покопался в кишечнике libmpq, я наткнулся на MPQ Extractor (поиск в github - замечательная вещь), совершенно другая утилита MPQ. Он использует StormLib, который включен в источник. Единственным дополнительным обручем было то, что требовалось CMake строить. MPQ Extractor сделал именно то, что я хотел.

После загрузки необходимых мне MPQ на сервер (всего 12,3 ГБ) я начал их распаковывать. Базовая распаковка выглядит так:

MPQExtractor -e "World \ Minimaps \ *" -f -p wow-update-1 * .MPQ wow-update-base-1 * .MPQ -o out art.MPQ

Это извлекает файлы, соответствующие спецификации пути «World \ Minimaps \ *», сохраняет структуру пути после извлечения (-f), применяет некоторые исправления (-p) и помещает извлеченные файлы в подпапку. Легко.

В основном это сработало. Во время извлечения я получаю кучу ошибок о файлах, которые не могут быть извлечены. Некоторые файлы, которые я мог видеть в приложении Windows, не извлекались. Некоторые извлеченные файлы были повреждены.

Во многом это было вызвано применением патчей и упорядочением. Патчи должны быть применены в правильном порядке, чтобы убедиться, что различия применяются к правой базе. Явная передача каждого патча по порядку устраняет проблему упорядочения:

MPQExtractor \ -e "World \ Minimaps \ *" -f -p \ mpqs / wow-update-13164.MPQ \ mpqs / wow-update-13205.MPQ \ mpqs / wow-update-13287.MPQ \ mpqs / wow- update-13329.MPQ \ mpqs / wow-update-13596.MPQ \ mpqs / wow-update-13623.MPQ \ mpqs / wow-update-base-13914.MPQ \ mpqs / wow-update-base-14007.MPQ \ mpqs / wow-update-base-14333.MPQ \ mpqs / wow-update-base-14480.MPQ \ mpqs / wow-update-base-14545.MPQ \ mpqs / wow-update-base-14946.MPQ \ mpqs / wow-update-base-15005.MPQ \ mpqs / wow-update-base-15050.MPQ \ -o out mpqs / art.MPQ

Но это тоже не совсем работало. Есть опция, позволяющая передавать префикс патча (--prefix xxx), который сообщает StormLib, какой базовый префикс используется для патчей. Прохождение этого заставляет старые исправления применяться правильно, но не новые. Не прохождение это вызывает обратное. Внутри StormLib есть код, который пытается проявить смекалку, но он не работает. я заплата код, разрешающий префиксы для каждого исправления, что позволяет корректно применять все исправления:

MPQExtractor \ -e "World \ Minimaps \ *" -f -p \ mpqs / wow-update-13164.MPQ, base \ mpqs / wow-update-13205.MPQ, base \ mpqs / wow-update-13287.MPQ, base \ mpqs / wow-update-13329.MPQ, base \ mpqs / wow-update-13596.MPQ, base \ mpqs / wow-update-13623.MPQ, base \ mpqs / wow-update-base-13914.MPQ \ mpqs / wow-update-base-14007.MPQ \ mpqs / wow-update-base-14333.MPQ \ mpqs / wow-update-base-14480.MPQ \ mpqs / wow-update-base-14545.MPQ \ mpqs / wow-update-base-14946.MPQ \ mpqs / wow-update-base-15005.MPQ \ mpqs / wow-update-base-15050.MPQ \ -o out mpqs / art.MPQ

Патчи будут корректно применяться, и файлы больше не будут повреждены. Но мне все еще не хватало некоторых файлов, которые я ожидал там найти. Я отследил его до файлов, которые были добавлены в патче с префиксом - функция поиска в StormLib (SFileFindFirstFile () / SFileFindNextFile ()) не правильно находила файлы, добавленные в патче префикса, потому что он не удалял префикс. После исправляя это Все файлы были извлечены правильно.

Ну, почти. Существует также другая проблема с файловыми системами, отличными от Windows. Алгоритм хеширования, используемый в MPQ ( Дженкин-х ) нечувствителен к регистру, поэтому все файлы в архиве по существу не регистр. foo.blp и FoO.bLp - это один и тот же файл. Однако, поскольку мы получаем имена из файла списка, регистр зависит от записей в нем. По какой-то причине (я бы предположил неряшливость), случай меняется в зависимости от патчей и даже в пределах одного MPQ. Два файла, которые должны находиться в одной и той же «папке», могут иметь совершенно разные пути:

мир / мини-карты / AhnQiraj / map27_46.blp мир / мини-карты / ahnqiraj / map27_46.blp

Это вызывает проблемы при попытке найти, какие текстуры принадлежат друг другу. Я добавил новую опцию в MPQExtractor, чтобы все пути могли быть преобразованы в нижний регистр. Вы можете взять моя версия из GitHub. Наконец-то мы можем извлечь нужные нам файлы. Onwards!

BLP Textures

Игры Blizzard хранят текстуры в формате BLP, который является частной оболочкой для данных текстуры S3 / DirectX Texture Compression (также известной как DXT). BLP - это растровый формат со сжатием с потерями, который WoW использует для хранения всех изображений интерфейса - каждая кнопка, диалог и элемент пользовательского интерфейса сделаны из сотен текстур BLP.

Есть несколько приложений для Windows для преобразования BLP в формат TGA и PNG, но выбор в командной строке немного невелик. Поскольку мне нужно будет конвертировать многие тысячи текстур, делать их одну за другой - не лучший вариант. К счастью, автор MPQExtractor также создал BLPConverter , маленькая обертка вокруг libsquish , что делает массовое преобразование тривиальным. Просто укажите его на ваши файлы BLP и отпустите.

BLPConverter -o output_folder -f png input_file.blp

Параметры по умолчанию (уровень mip ноль) в порядке.

После извлечения у нас осталось около 22 500 PNG для сортировки. Понимание того, как они организованы, является сложной задачей.

Мир (из Warcraft)

Найти основные части света довольно просто. Просто открыв / world / minimaps / azeroth / находит 1000 файлов PNG. Игнорируя те, которые начинаются с noliquid_, они все имеют формат mapXX_YY.png. Разложите их в сетке, игнорируя отсутствующие изображения, и вы увидите Восточные королевства (добавлены пробелы, чтобы показать, насколько велико каждое изображение).

Однако это не весь Азерот. Просматривая другие папки верхнего уровня, можно найти несколько хороших кандидатов, которые содержат сотни PNG - Kalimdor, Northrend и таинственный Expansion01. Размещая изображения из последних в сетке, вы получаете немного зрелища.

Эта карта содержит все, что было добавлено в расширении Burning Crusade, все объединено в одну карту; Острова Запределья, Лазурной Дымки и Кровавой Дымки и новые зоны на севере Восточных Королевств. Они должны были бы быть склеены вручную с существующими плитками, чтобы сформировать карту мира.

Оказывается, что смещения этих кусков на главную карту мира хранятся в файлах DBC. Я подробно расскажу об этом позже, но в основном они действуют как простая клиентская база данных, содержащая всевозможную информацию о карте слов и миллионе других вещей.

Также есть несколько кусков карты, добавленных для Cataclysm, которые работают аналогичным образом - Затерянные острова, Тол Барад и Водоворот (кратко замеченные во время вступительного квеста в Ваш'джир).

Вооружившись списком изображений и их позициями на главной карте, я занялся созданием набора плиток для использования с API Карт Google. К счастью, у меня было здесь большое преимущество - наборы плиток Google Maps состоят из изображений 256x256 пикселей, и это именно то, чем были PNG WoW - мне нужно было только назвать их разумной схемой (объединение всех различных наборов изображений карты в один набор с последовательное именование на основе позиции) и приклеить их к API.

Различные уровни масштабирования (так что вы можете уменьшить масштаб) также довольно просты в этой настройке. Поскольку каждый уровень масштабирования является двойным / половиной следующего, для создания уменьшенной версии достаточно взять квадрат из 4 плиток (2x2), склеить их вместе и изменить размер до 50%. Я использовал швейцарский армейский нож, ImageMagick , чтобы сделать это с помощью небольшого клея PHP.

Помимо главной карты мира, Катаклизм представил некоторые новые части мира, которые «в другом месте» - Deepholm и Vash'jir. Последняя сохранялась немного иначе, чем любая другая карта (тема, которая постоянно появлялась - внутренности WoW имеют очень мощное ощущение), причем плитки были найдены как /world/minimaps/azeroth/noliquid_mapXX_YY.blp. Вероятно, это связано с тем, что Ваш'джир действительно находится в Азероте, прямо под океаном (вы можете увидеть это на главной карте - местах, где вы можете выйти из воды).

Я подумал о том, чтобы поместить эти два (и Outlands) на основную карту, как это делал MapWoW, но они имели разные цвета фона и на самом деле не принадлежали друг другу. В этот момент я решил, что несколько наборов плиток - это, вероятно, путь.

Конечно, нет ничего проще. Даже с этими прямыми картами нужно было поиграть. Вот набор необработанных плиток для Deepholm.

Области миникарты за пределами судоходного пространства содержат много шума и мусора. В некоторых случаях они содержат текст, оставленный разработчиками, или даже другие (неиспользованные) карты. Чтобы очистить их, я выбрал цвет фона для каждой карты (серый, в случае Deepholm) и вырезал куски снаружи, пока изображение не выглядело чистым. Финальная версия Deepholm выглядит намного лучше.

Веб-приложение

У меня был некоторый опыт использования API Карт Google, когда я заново создавал карту Лондонского транспорта для Лондонские блоггеры , Если у вас есть разумно названный набор плиток, вам просто нужно немного клея JS, чтобы загрузить правильные изображения в нужном месте. Google позаботится обо всем остальном волшебным образом. Полный JavaScript, приводящий карты в действие, может быть видел здесь ,

После добавления еще нескольких карт (о которых мы поговорим чуть позже), я решил, что мне нужно добавить несколько выпадающих меню, чтобы сделать вещи более управляемыми. Я не уверен, что потерял свои способности в Google, но почти все, что я мог найти, было ужасно. Я искал что-то вроде меню этой власти Wowhead , но не повезло. В конце концов, я выбрал чистое CSS-решение, которое работает достаточно хорошо, но я бы хотел добавить некоторую задержку, чтобы подменю не перепрыгивали, если ваша мышь на секунду выходит за пределы их области. Если у вас есть какие-либо указатели, пожалуйста, дайте мне знать в комментариях.

Инстансы

Итак, у меня были основные карты мира, но там было намного больше папок с изображениями. Наряду с картами, которые я уже нашел, было несколько полей битвы, подземелий и набегов, но не почти все. Из тех, что были там, некоторые были довольно странными, как эта карта Черного Храма.

Я вошел в БТ и осмотрелся; это действительно не полная миникарта. Что касается дальнейшего изучения PNG, то в каталоге path / world / minimaps / wmo / dungeon / blacktemple хранятся некоторые другие вероятные кандидаты BT. Однако они представляли собой кучу разных маленьких карт, на некоторых из которых было только одно изображение. Они также сохранялись снизу вверх, при этом значения Y уменьшались, а не увеличивались, поэтому мои инструменты предварительного просмотра показывали их неправильно.

Мне потребовалось некоторое время, чтобы выяснить, что здесь происходит, но в основном каждый раз, когда вы уходили «в закрытое помещение», карты сохранялись в папке «wmo», все разрезанные на части. Это объяснило, почему у меня было несколько полных экземпляров и площадок батель, некоторые только частично, а некоторые полностью отсутствовали - рейд на Маунт-Хиджал проходит снаружи, как и в основных файлах, в то время как многие экземпляры на 100% «закрыты» и отображаются только как перемешанные ломти. Смешанные экземпляры, такие как Black Temple, имели кусочки «карты мира» и отдельные «закрытые» куски.

Мой первый план состоял в том, чтобы просто собрать куски вручную в карты. Я начал с Ragefire Chasm, так как это самый простой пример в игре. Карта состоит из 12 отдельных кусков, два из которых имели более одного PNG, который их составил.

Карта состоит из 12 отдельных кусков, два из которых имели более одного PNG, который их составил

После нескольких часов выравнивания пикселей (многие биты выглядят очень похожими, и я поставил их не в том месте), я поднял руки. Если клиент WoW может правильно отображать миникарты, где-то должна храниться некоторая информация, которая описывает, как они сочетаются друг с другом.

Объекты карты мира

Ранее я упоминал файлы DBC - это сокращение от Data Base Client, и они содержат информацию обо всех видах вещей. Вы можете просмотреть список всех файлов DBC на WoWDev вики , В нем было много вероятных кандидатов, таких как DungeonMap и AreaTable, которые я искал в течение нескольких дней. Я многое узнал о внутренностях WoW, но не нашел ничего, что описывало бы миникарту.

Лучшая ставка была сохранена в файле Map.dbc, который содержал информацию о местах на карте мира. Каждая запись указывала на группу файлов в MPQ. Для записи Ragefire Chasm (ID 389) оно имеет значение OrgrimmarInstance. Внутри MPQ были следующие файлы:

  • мир / карты / OrgrimmarInstance / OrgrimmarInstance.tex
  • мир / карты / OrgrimmarInstance / OrgrimmarInstance.wdl
  • мир / карты / OrgrimmarInstance / OrgrimmarInstance.wdt

Файлы TEX появились в Cataclysm и являются мало понятный ; наверное не то что я искал. Файл WDL описывает карту высот с низким разрешением для области игрового мира и намного лучше понимать , Сторонние инструменты, которые просматривают географию мира, используют файлы WDL. Просмотр файла для RFC показал, что он был в основном пустым. Вероятно, не наш кандидат тоже.

Файл WDT описывает как стандартные плитки карты (такие как на основной карте Азерота) вписываются в эту область карты. Опять же, файл RFC был в основном пустым. Однако они также могут указывать на ВМО, которая появляется на карте, вместе с информацией о ее местонахождении. В файле RFC он указал на файл ВМО со знакомым именем.

Мир \ WMO \ Dungeon \ KL_OrgrimmarLavaDungeon \ LavaDungeon.wmo

Наконец, подсказка! Глядя в эту папку показывает ряд похожих файлов.

  • Мир \ WMO \ Dungeon \ KL_OrgrimmarLavaDungeon \ LavaDungeon.wmo
  • Мир \ WMO \ Dungeon \ KL_OrgrimmarLavaDungeon \ LavaDungeon_000.wmo
  • Мир \ WMO \ Dungeon \ KL_OrgrimmarLavaDungeon \ LavaDungeon_001.wmo
  • ...
  • Мир \ WMO \ Dungeon \ KL_OrgrimmarLavaDungeon \ LavaDungeon_011.wmo

12 пронумерованных файлов соответствуют 12 фрагментам карты из изображений тайлов RFC. Файлы ВМО содержат определение для объектов карты мира, которые являются структурами в мире, такими как статуи, здания и целые экземпляры. Каждая ВМО состоит из «корневого файла», описывающего весь объект, и серии «групповых файлов», которые описывают куски объекта. Небольшой дом может содержать только один файл группы, в то время как сложный рейд может содержать сотни. Каждый групповой файл описывает трехмерный блок данных - вершины, текстуры, освещение и так далее.

Если вам интересно, как Blizzard строит мир, это видео дает немного понимания их инструментария.

Интересная часть информации здесь хранится в блоке MOGI корневого файла - она ​​описывает положение группы во всей ВМО, используя две трехмерные координаты для противоположных углов ограничительной рамки. К счастью для меня, группы вообще не вращаются и располагаются в квадрате к самой ВМО (даже если ВМО вращается при размещении в мире). В то время как ВМО представляют собой двоичный формат, разбитая на куски структура была довольно хорошо задокументирована людьми, выбирающими файлы. Разбор это простой случай чтения байтов и преобразования их во что-то, что мы можем использовать. Соответствующий код находится в wmo_build.php в функции extract_mogi ().

Извлекая ограничивающий прямоугольник для каждой группы, отбрасывая координаты высоты и затем сопоставляя их с PNG, найденными в папках wmo ранее, я смог объединить PNG в связную карту. Вот объединенная карта для RFC, где указаны и пронумерованы границы для каждой группы в рамках ВМО.

Вот объединенная карта для RFC, где указаны и пронумерованы границы для каждой группы в рамках ВМО

Вы можете видеть, что размер и форма каждой группы сильно различаются - некоторые содержат четыре плитки размером 256x256 пикселей, а некоторые крошечные. На других картах некоторые группы вообще не содержат изображений миникарты - кусочки мира, которые никогда не представлены на миникарте.

С одним объединенным изображением для экземпляра (в моем источнике оно называется «плоским»), создание набора листов было простым. Я разрезал изображение на квадраты 256x256, а затем создал несколько уровней масштабирования, объединив группы из 4 плиток. Легко! Мы почти там.

Краевые Чехлы

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

барахло

Как и в случае с мирами, тайлы ВМО иногда содержат случайный мусор. Основное отличие заключалось в том, что некоторые из этих «мусорных» кусков были огромными, и на их рендеринг плоских изображений уходило много минут. Вот сплющенное изображение для Каражана.

Понятия не имею, что это за гигантский бардак - он не показан в игре, и при этом в главном зале нет ни синего мусора (несколько человек написали, чтобы указать, что это Netherspace видел во время боя Принц малчезаар , Тем не менее, в игре вы видите только маленький квадрат на самом нижнем краю). Несколько других экземпляров были прикреплены к подобным барахлам. Иногда очистка была такой же простой, как удаление одной группы ВМО, но часто это включало обрезку фрагментов из одной группы ВМО, во многом как карты мира.

Чтобы помочь ему справиться с короной самого раздражающего экземпляра, Каражан также страдает от опечаток. Некоторые файлы помечены как Каражан, некоторые Харазан и некоторые Каразан. Трахни это место.

Внутри снаружи

Некоторые случаи и рейды включают как внутренние, так и наружные сегменты. Чтобы справиться с этим, я сплющил часть карты мира, которая представляла наружную часть, а затем соединил их с внутренними сегментами. К сожалению, внутренние и наружные мини-карты используют совершенно разные масштабы. Все карты на открытом воздухе имеют одинаковый масштаб, а внутренние мини-карты варьируются от ВМО до ВМО. В случае с Magister's Terrace разница составляет примерно 4 к 1. Вместо того, чтобы подбирать интерьеры, которые были бы отстойными, так как они так хорошо детализированы, я просто показал две части рядом друг с другом. Эффект немного странный, но, вероятно, лучшее, на что я могу надеяться.

Это наиболее заметно в карта для Ульдуара где первые 4 босса находятся на открытом воздухе, вы направляетесь внутрь для отдыха, кроме Фрейи, которая снова снаружи.

Многослойные Карты

Когда я собирал карту для Черного храма, это заняло много времени, а затем выглядело так.

Есть уже знакомая нам внутренняя / наша внутренняя проблема, но есть и нечто новое. Главный интерьер храма состоит из множества перекрывающихся этажей, и изображение показывает их друг на друге. Я хотел, чтобы карты были действительно полезными (и бог знает, что я терялся в BT достаточно раз), так что это не сработало.

Я начал создавать собранные изображения со всеми группами ВМО, помеченными их номерами, чтобы я мог выбрать, какие части принадлежат каким слоям.

Я начал создавать собранные изображения со всеми группами ВМО, помеченными их номерами, чтобы я мог выбрать, какие части принадлежат каким слоям

Пещеры времени в основном просты, но вы можете увидеть множество перекрывающихся частей в левом нижнем углу, где скат идет вверх. Это позволило мне точно определить, какую из групп я хотел включить или выключить для рендеринга данного «этажа». Для Черного Храма я затем создал семь отдельных плоских изображений для разных этажей. Когда у меня были разные этажи (и внешний двор для BT), я выложил их в одно большое плоское изображение и использовал его в качестве основы для набора плиток.

Это включало массу проб и ошибок, выясняя, какие группы были необходимы. В некоторых случаях группа отображается на нескольких уровнях, чтобы помочь показать, как уровни сочетаются друг с другом. Мне немного помогло, вернувшись к фрагменту MOGI корневого файла ВМО - отсортировав фрагменты по их вертикальному положению, я смог легко отбирать фрагменты, которые были явно выше / ниже пола, с которым я имел дело. Вы можете видеть, что окончательная карта довольно понятна по сравнению с одним сжатым изображением.

оптимизация

Карты были все готовы и работали, но они чувствовали себя вялыми. Беглый взгляд показал, что основным набором плиток для Азерота было колоссальные 709 МБ. Ни один пользователь никогда не загрузит весь набор тайлов (это будет означать увеличение масштаба, затем бесконечное панорамирование - мир велик ), но это все еще огромно.

Я сделал несколько экспериментирование со сжатием PNG в прошлом, поэтому я обратился к PNGOUT сбрить несколько байтов. Первый слой основной карты прошел хорошо, работает несколько часов. Однако когда сценарий преобразования достиг первого уровня масштабирования, он остановился. Из-за того, как я собрал увеличенные слои, у многих PNG есть альфа-канал. Код PNGStore содержит скрипт с именем peek.pl, который позволяет быстро проверить, какой из 14 подтипов является PNG. Те, что я продюсировал, были 6-го типа с 8-битными каналами.

В случае, когда в увеличенной плитке не было 4 изображений на нижнем слое (у пустых частей карты не было изображений, поэтому это происходило по краям острова), я оставил четверть (или больше) плитки прозрачной. Собранные ВМО наборы плиток полностью потерпели неудачу, так как процесс сборки изначально позволил создать прозрачные квартиры, поскольку отдельные группы внутри ВМО были, конечно, прозрачными (они во многом совпадают). PNGOUT по какой-либо причине не может работать с изображениями альфа-каналов, но это также указывает на простую оптимизацию - альфа-каналы занимают много места, которое мы могли бы сэкономить, просто заменив эти пиксели сплошным цветом цвета фона карты (океан, в случае основной карты).

Просто удаление альфа-канала принесло огромную экономию, без разницы во внешнем виде. После этого запуск PNGOUT побрил еще на 10% от общего размера основной карты.

Outland Azeroth Tile Count 608 10 991 Оригинал 49 МБ 709 МБ Непрозрачный 29 МБ 391 МБ Сокрушенный 27 МБ 353 МБ

Разрушение главной карты заняло около 5 часов, а другие случаи и рейды заняли еще 5 или около того - задача, выполняемая в одночасье.

Последняя часть головоломки заключалась в том, чтобы наклеить все плитки на CDN и использовать их с разумными заголовками для кэширования. К счастью, у меня уже был S3 и CloudFront настроен, так что это был просто случай загрузки нескольких десятков тысяч изображений.

После создания всех наборов плиток сайт был готов. По крайней мере до тех пор, пока не выйдет Туман Пандарии.

Проверьте это сами на worldofmapcraft.com или просмотрите исходный код на GitHub.

Случайные факты

В процессе изучения файлов MPQ и чтения базы данных DBC я узнал много вещей о том, как изначально был устроен мир WoW. Это указывает на некоторые интересные факты, о которых я не видел, о которых много говорили. Если вы поклонник WoW, вы можете найти это интересным.

  • У Каражана было несколько разных вариантов написания.
  • Некрасивость изначально называлась «Школа некромантии» (или «Склеп руин»).
  • Deepholm первоначально назывался Deephome.
  • Ragefire Chasm, по-видимому, один из первых построенных экземпляров, просто называется "Orgrimmar Lava Dungeon" в мировых файлах.
  • Восточные королевства изначально назывались Азерот.
  • В Восточных Королевствах файлы разбиты на 3 региона: Лордерон вверху (префикс LD_), Хаз Модан в середине (префикс KZ_) и Азерот внизу (префикс AZ_).
  • Залы Камня и Залы Молнии внутренне называются Ульдуар: Гном и Ульдуар: Железный Гигант.
  • Utgarde Pinnacle называется Valgarde в мировой модели.
  • Первоначально подземелья Tempest Keep представляли собой крылья Фабрики, Атриума и Арканов.
  • Подземелья Аукиндона обозначены как Эфирный, Теневой Совет, Крылья Демона и Дренеи.
  • Яма Сарона первоначально называлась Карьером Слез.

Больше этих нечетных / измененных имен можно найти, просматривая индекс ВМО BLP.

Запрос

После многих часов просмотра PNG я так и не нашел плитки для канализации Даларана. Если вы посещаете их в игре, то в канализационных каналах появляются совершенно разные изображения мини-карт, а не только обычные даларанские плитки. Я подумал написать аддон, чтобы попытаться получить путь к текстурам от клиента, но пока не совсем укушен.

Если вы можете найти их, пожалуйста, дайте мне знать, чтобы я мог включить их в список «Разное»!

Обновления: 20 июня 2011

Некоторые люди отметили, что это было доступно в течение некоторого времени в игре через аддоны, такие как естественный кокс а также Картограф , Я хорошо это знаю! Намного проще использовать игровые текстуры в игре. Вы также можете посетить каждую часть мира и прогуляться.

Другие указали на другие карты WoW в стиле Google-карт, которые существовали некоторое время, например: mapwow ( wyrimaps & Marlamin мои любимые). Ни у кого из остальных нет карт поля битвы, подземелья, рейда или города. Они также имеют тенденцию быть неуклюжими и довольно медленными. Я хотел бы взять некоторые из приличных функций (например, метки зон и достопримечательности) и объединить их в mapcraft.

Самая большая запрошенная особенность - просмотр улиц. Это серьезная проблема, но, вероятно, возможно. Это потребует копаться в трехмерных моделях местности и рендеринга некоторых панорамных изображений (многие тысячи из них). Хотя интересная задача!

Post-Script

Если вы заметите какие-либо явные ошибки или упущения, напишите мне по электронной почте и научите меня: cal [at] iamcal.com

Исходный код для карт можно найти Вот , Карты можно просматривать онлайн Вот ,

Я играю в охотника на ночных эльфов Пчелы , который в настоящее время имеет коллекцию из 196 домашних животных. Я создатель Охотничья добыча , написал и поддержал модуль Hunter для Rawr во время нашей эры и помог переписать WarcraftPets ,

Copyright © 2012 Кэл Хендерсон.

Текст этой статьи все права защищены. Никакая часть этих публикаций не может быть воспроизведена, сохранена в поисковой системе или передана каким-либо образом - электронным, механическим, фотокопированием, записью или иным образом - без письменного разрешения издателя, за исключением включения кратких цитат в обзор или академическую информацию. Работа.

Весь исходный код в этой статье распространяется под Лицензия Creative Commons Attribution-ShareAlike 3.0 Это означает, что вы можете скопировать его и использовать (даже коммерчески), но вы не можете продать его и должны использовать атрибуцию.

Комментарии были отключены