Перейти к содержанию

Старая, неактуальная ммо 3


roma912

1 595 просмотров

Вот и настало время когда я вернулся снова к этой игре
Только теперь уже для нее есть исходный код, который позволит находить всякие функции в разы быстрее и проще

На этот раз будем делать карту ресурсов, рисовать ее и загружать прямо в игру
Этапы которые этому способствуют
1. Распаковать саму карту из surfaces.pck
2. Достать саму карту, посмотреть каким образом она примерно отображается
3. Узнать координаты респа ресурсов Vec3 на карте
4. Перевести Vec3 игровые в Vec2 картовые
5. Нанести по Vec2 соответствующие иконки
6. Привести все в читаемый формат для игры
7. Запаковать все обратно

1. Распаковка pck этой игры уже не представляется сложностью, и есть довольно много софтов делающее это (Собственно как и упаковка обратно)
А значит пункты 1 и 7 не сложны совсем
2. Карта в игре отображается довольно специфическим образом (Незнаю как до этого додумались разработчики, или же это движок сам режет так интересно)
В целом картина такая
NwrsTAn.png

 

Мировая карта состоит из 88 частей - т.е. 8 столбцов и 11 строк (В свою очередь каждый квадрат тут 1024*1024 пикселя)
Из всех этих кусков собирается единая карта, которую можно будет увидеть в игре
Формат файла dds, т.е. в итоге мы должны получить карту в 88 dds файлов как в оригинале

3. Координаты респа найти довольно легко, опять же распаковав configs.pck
Внутри будет coords_data.txt в котором некоторым списком указаны Vec3 координаты нахождения ресурса / моба и т.п.
Структура примерно такая
wxW5cfZ.png

Парсим нужные координаты по ID (Пишем вспомогательный парсер который выдаст c++ массив с Vec3)
3091 - ID, world - фильтрация только для основной карты
Ну и достаем Vec3 - x y z координаты
aRAOPop.png

4. Когда есть массив всех этих ресурсов, нужно перевести Vec3 (Т.е. внутриигровое положение в мире, на карту, которая 2D)
Тут поможет исходник клиента PW, и метод который рисует стрелочку игрока на карте
Df1E0zc.png
Вот та самая функция в исходном коде, далее надо ее найти и заменить координаты (т.е. оригинально передаются Vec3 игрока, и вычисляется Х-У для рисования на карте)
Ничто не помешает нам подменить эти координаты на те, где находятся ресурсы Vec3

Далее дело техники, и создания хука (Учитывания calling conventions, определения аргументов и т.д.)
Имея исходный код не так сложно найти функцию (Правда версия игры немного старее чем этот исходный код)
Собственно вот и хук. В цикле перебираем массив который сделали на шарпе путем парсинга файла

aJEPlP6.png
Выдаем результаты в виде массива (Далее пригодится)

Таким образом я получил координаты для 4х видов ресурсов (Больше мне и не нужно. Vec2 координаты) ~320 штук

5. Далее необходимо нанести все это дело на карту.
Дабы не скреплять все 88 кусков в каком-нибудь редакторе мне удалось найти (Не без помощи) карту 8*1024 х 11*1024 пикселей. Т.е. точно такую как и нужна

Для добавления иконок на общую картину была написана еще одна вспомогательная программа на шарпе, которая грузит общую карту, а потом по координатам ставит маленькую иконку 16х16 по координатам из массива
(Скрин выше)
Ну соответственно наносим сами иконки на общую карту и сохраняем в jpg. Получаем на выходе карту в 113мб с нанесенными иконками

Остается всего 2 пункта, один из которых пустяковый
6. Режем эту общую карту в фотошопе (Качаем фотошоп, да да у меня его не было на этой машине) с помощью инструмента "раскройка"
N8I8kto.png

И как раз получаем 88 изображений; 8 столбцов и 11 строк, где каждая картинка по 1024*1024 пикселя. Идеально
Остается нерешенным только вопрос конвертации из jpg в dds. Но тут придется только ручками все делать.
А также ручками приводить потом названия этих кусочков в вид который на скриншоте №1. (Не смертельно, но долго)
Заменяем 88 dds файлов на новые в папке maps

7. Запаковываем все обратно в единый pck файл программой из п1. и проверяем в игре.
Ji0RZ7E.png


Все работает. Отлично..
Сама по себе идея не новая, но вот реализации именно внутри игры пока что не видел нигде

  • Спасибо 1
  • Плюс 4

2 Комментария


Рекомендуемые комментарии

Цитата

Для добавления иконок на общую картину была написана еще одна вспомогательная программа на шарпе, которая грузит общую карту, а потом по координатам ставит маленькую иконку 16х16 по координатам из массива
(Скрин выше)

 

Не нашел кода, который рисует 16x16 иконки. Может я проглядел.

 

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

Спойлер

Тут поможет исходник клиента PW, и метод который рисует стрелочку игрока на карте
Df1E0zc.png

 

Куски по 1024x1024 разбиваются,  скорее всего,  из-за dds -формата, большой текстуры и оптимизации. Возможно, поддержка старых видео карт, на которых большие текстуры не залезут.

 

p.s. Картинки не залиты на форум. Будет очень жаль, если пропадут со временем.

Ссылка на комментарий
16 минут назад, MasterGH сказал:

Не нашел кода, который рисует 16x16 иконки. Может я проглядел.

Ну тут я не стал его прикреплять т.к. там довольно много не совсем нужного. Допустим 4 массива по 80 элементов а потом перебор каждого и отрисовка просто в Canvas wpf.
Все это выкладывать смысла особо нет. Это довольно простая вещь, которую не так и тяжело написать вместе с последующим сохранением в файл

 

19 минут назад, MasterGH сказал:

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

Тоже так думал, но когда рядом с одной стрелочкой игрока будет еще десяток, легко же запутаться

 



 

Ссылка на комментарий

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
×
×
  • Создать...

Важная информация

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