Вводный курс в моддинг игры.
В теме «Вводный курс в моддинг игры» мы постарались собрать всю доступную информацию, необходимую для начала освоения модостроения. Хотя информация и носит лишь поверхностный характер, но позволяет понять, что же из себя представляет функционал самой игры и модов к ней. Тема разбита на главы достаточно условно, так как некоторые аспекты неразрывно связаны друг с другом, они объединены в одну главу. Пособие актуально для версии игры Mount&Blade Warband 1.153.Оглавление:
1. Полезные ссылки.
2. Введение.
3. Файлы игры.
4. Модульная система.
5. Модели и текстуры.
6. Сцены.
7. Глобальная карта.
8. Авторы и источники информации.
1 Полезные ссылки
]]> - Раздел Обмен опытом]]> - В разделе хранится много необходимой информации по моддингу. Которая, в свою очередь, поделена определённой квалификацией на подразделы.
]]> - Инструментарий]]> - Подраздел, содержащий информацию по программам, используемым в моддинге игры.
]]> - Инструкции и уроки по созданию модификаций]]> - Подраздел, в котором находятся различные уроки и пособия.
]]> - Вопросы и ответы по модостроению]]> - Подраздел для вопросов по различным аспектам моддинга. Все вопросы, связанные с моддингом, стоит задавать именно в нём. Обратите внимание, что в разделе есть прикреплённые темы «Общие вопросы по ....», я вам советую задавать вопросы именно в них, там ваш вопрос тоже увидят, прочтут и дадут ответ. Не стоит ради одного своего вопроса создавать отдельную тему.
]]> - OSP ресурсы: модели, текстуры, скрипты]]> - Подраздел, содержащий различные ресурсы, которые можно использовать в моддинге игры.
]]> - Раздел Мозговой штурм]]> - Если у вас есть просто общая интересная идея для мода - вам в тему «Идеи для модов». Если у вас есть полностью сформировавшаяся идея мода, разработана определённая концепция и план работ, имеются наработки для проекта, но вам не хватает идей или советов по вашему моду, вам стоит создать свою тему в этом разделе.
]]> - Разработка модов]]> - Раздел, в котором собраны разрабатываемые сообществом моды. В этом разделе вы можете понаблюдать за ходом работ по созданию мода, помочь советом или предложить идею. А самое главное - вы можете присоединиться к одной из команд, разрабатывающих моды.
]]> - Форум TaleWorlds]]> (язык английский) Официальный форум игры Mount&Blade.
]]> - The Forge - Mod Development]]> – Раздел, посвящённый моддингу. Структура раздела схожа с разделом Обмен опытом форума Всадники Кальрадии.
]]> - The Pioneer's Guild - Mods Under Construction]]> – Раздел, в котором собраны разрабатываемые сообществом моды. В этом разделе вы можете понаблюдать за ходом работ по созданию мода, помочь советом или предложить идею. А самое главное - вы можете присоединиться к одной из команд, разрабатывающих моды.
]]> - Форум 骑马与砍杀中文站论坛]]> (язык китайский) - Самый крупный сайт на китайском языке, посвящённый игре Mount&Blade. Для нормального и полноценного использования сайта, требуется регистрация.
]]> - 专业制作大区]]> - Раздел Обмен опытом. Моддинг. Классификация подразделов и тем несколько отличная от раздела Обмен опытом на Всадниках Кальрадии.
]]>MOD制作技术区]]> – Подраздел, в котором собраны ответы на вопросы, готовые скрипты, пакеты скриптов (с другими ресурсами) и презентаций, уроки по моддингу.
]]>- 模型贴图制作与交流区]]> – Подраздел, в котором собраны OSP ресурсы для моддинга (в основном модели для игры с текстурами и без), инструменты (программы, утилиты), применяемые в моддинге игры Mount&Blade. Обратите внимание - в верхней части раздела прикреплены темы, в которых есть достаточно актуальные ссылки на ресурсы раздела.
]]>- Форум Tawerna "Four Ways"]]> (язык польский) - Польский сайт игры Mount&Blade.
]]> - Modding]]> - Раздел по моддингу игры. Структура раздела схожа с разделом Обмен опытом форума Всадники Кальрадии.
]]>- Сайт Mount&Blade Modding Wiki]]> (язык английский) - Сайт, созданный силами комьюнити мододелов. В нем собраны уроки, ресурсы скриптов, пояснены некоторые аспекты моддинга, описаны инструменты (программы) для работы с файлами игры.
]]>- Форум MBX]]> (язык английский) – Форум, полностью посвящённый моддингу Mount&Blade - как самому процессу, так и разработкам конкретных модификаций. Множество разделов, все разделы носят понятные названия, в которых отображено их содержание.
]]>- Сайт mbcommands.ollclan]]> (язык английский) - Сайт созданный программистами, работающими с модульной системой. На сайте собрана некоторая полезная информация по ней: неполный список команд header_operations.py и некоторые пояснения по ним, кое-какие файлы, полезные для работы с модульной системой.
]]>- Mount&Blade Repository]]> (язык английский) - Репозиторий (хранилище - место, где хранятся и поддерживаются какие-либо данные) для неофициальных файлов для Mount&Blade. Самое большое хранилище файлов, связанных с игрой Mount&Blade. Удобная сортировка файлов по категориям, быстрый поиск по файлам.
]]>- M&B Nexus]]> (язык английский) - Улучшенная версия репозитория, приведенного выше. Для скачивания файлов размером более 2 Мб требуется регистрация. На сайте есть форум, чат и другие полезные разделы. Удобная сортировка файлов по категориям, быстрый поиск по файлам и сайту.
]]>- Demiart Форум]]>? (язык русский) - крупный форум, посвещённый 2D, 3D и смежным понятиям. Большое количество уроков, советов, возможность получить квалифицированную помощь.
]]>render.ru]]> (язык русский) - самый большой русскоязычный форум обо всём что связано с 3D графикой, море уроков море знаний
Объяснение построим на описаниях файлов игры. Самую значительную связь между ними мы поясним, но не всё, ибо просто нереально указать все взаимосвязи и хитросплетение их взаимоотношений, не копнув в них очень глубоко.
Начнём с того, что поймём, что же такое игра и как она функционирует. Сама игра (её движок) - это, так сказать, проигрыватель дисков, а диски - это моды. Все текстовые файлы - это, в основном, циферки, которые удобно читать самой игре.
Есть ещё модульная система, она позволяет нам писать какие-то команды, а файл .bat преобразует их в циферки в текстовых файлах, которые и читает игра.
Модульная система (модулька) - это набор отдельных файлов, которые не имеют отношения к функционированию самой игры, а лишь позволяют нам её редактировать и потом преобразовать (перевести) нашу работу на язык игры.
В моддинге есть несколько направлений:
- Модульная система и её редактирование с последующим преобразованием. Это направление работы над сценарием всего нашего мода. Под словом ”сценарий” здесь надо понимать не только какие-либо действия в игре, но и правильное функционирование самих ресурсов. Как в организме всё состоит из клеток, так и тут, а вот сценарий заставляет действовать их по определённым законам.
- Моделирование и текстурирование.Тут мы создаем ресурсы игры, а именно то, что будет использовать сценарий при отображении на экране.
- Сцены - это как раз сами наши "коробочки", внутри которых всё и происходит.
- Глобальная карта - это тоже, можно сказать, сцена, со ссылками, на те или иные локации (сцены) или действия.
Файлы корневой папки игры:
По умолчанию ~C:\Program Files\Mount&Blade Warband\.
Примечание: в корневой папке игры находятся файлы, которые являются общими для игры и всех модов! То есть эти файлы можно использовать в любом моде, и их редактирование приведет к изменениям во всех модах, которые используют их!
LOD - расшифровывается как Level Of Detail, что в переводе с английского означает «уровень детализации». Технология использования LOD-ов состоит в упрощении 3D-моделей путем подмены их на более примитивные и менее детализированные по мере удаления виртуальной камеры от них. Это позволяет меньше нагружать систему, ведь она работает над отображением не всех деталей, а только тех, что могут быть видны персонажу.
Принимаемые форматы ресурсов:
.trf – Текстовые файлы — При загрузке игры автоматически конвертируются в бинарные
.brf – Бинарные файлы — Не требуют конвертации, более быстрая загрузка игры, меньше сжатие (по сравнению с текстовыми файлами)
Data - эта папка хранит в себе несколько файлов, содержащих некоторые данные, используемые игрой.
Перечень файлов:
font_data - это файл с настройками отображения шрифтов, тут можно проявить фантазию и менять его на своё усмотрение.
flora_kinds - здесь прописана растительность, используемая в игре. А именно - прописаны названия каждого условно растения, которое может появиться на сгенерированной карте, или поставлено на сцене с помощью ВРС, и для каждого из этих растений прописана одна или несколько моделей - так это растение будет выглядеть на сцене. Если для одного растения прописано несколько моделей - будет случайно выбрана одна из них, таким образом получается более разнообразная растительность.
ground_specs - Файл, содержащий названия текстур, материалов и некоторые их настройки, которые могут использоваться при создании местности (terrain) на сцене.
item_modifiers- текстовый файл, в котором заданы некоторые настройки для модификаторов предметов.
skeleton_bodies -файл, содержащий хитбоксы и их настройки, используемые для персонажей игры.
Хитбоксы - 3D - примитивы, которые присоединяются к костям скелета, и используются в игре для проверки попадания оружием по персонажу, и также как его физическая модель.
skyboxes - текстовый файл, определяющий набор текстур, которые могут использоваться в качестве скайбоксов, и некоторые настройки для них.
Skyboxes (небесный куб, в народе просто скайбокс) - задний фон в изображениях трёхмерной компьютерной графики, имитирующий небо.
languages - Папка с языковыми текстовыми файлами, а именно теми, что являются общими для всех модов. Если определенного языка нет в этой папке, в лаунчере для игры мы его не сможем выбрать.
Modules - Тут хранятся моды и ресурсы, используемые ими - это, так сказать, список воспроизведения нашего проигрывателя.
music - ресурсы (файлы) музыки, которые используются в игре. Сама же механика воспроизведения находится в одноименном текстовом файле.
Skins - Файлы Simple Mesh Format. Файлы отображения главной заставки, для разных языков.
Sounds - ресурсы (файлы) звуков (стуки, бряки, крики... ), которые используются в игре, сама механика воспроизведения в текстовом файле.
Принимаемые форматы звука: .mp3, .ogg, .wav.
Textures - Текстуры, или же кожа, всего, что есть в игре. Всё это плоские картинки, в которые потом "заворачиваются" 3D - модели. Формат файлов - .dds, это специальный формат графических файлов. Чтобы его открыть, например, Photoshop'ом, нужен специальный плагин.
Принимаемые форматы текстур: .dds, .tga, .jpg
binkplay.exe - BinkPlayer, проигрыватель, используемый игрой для воспроизведения intro-роликов (paradox и taleworlds) и видео во время игры (последнее только при помощи ]]>WSE]]>).
bump_shader, myshader, faceshader.pp; earlyz, mb_2a, mb_2в.fxo; fx_configuration.h - Шейдеры и их конфигурации. Используются в трёхмерной графике для задания дополнительных характеристик объектам и особенностей их отображения на экране.
postfx.fx - Этот файл используется для эффектов пост-обработки (например DoF и HDR).
paradox, taleworlds_intro.bik - Начальные видео-заставки игры в формате bik - популярный формат, используемый в основном, в видео играх.
SkinMagic, fmodex.dll - Динамически подключаемые библиотеки для воспроизведения главного меню
rgl_log.txt - Файл регистрации, протокол, журнал или лог (англ. log) — файл с записями о событиях в хронологическом порядке. Ведение протокола, или протоколирование, — хронологическая запись с различной (настраиваемой) степенью детализации сведений о происходящих в системе событиях (ошибки, предупреждения, сообщения), обычно в файл. В абсолютном большинстве современных программ используются текстовые файлы протоколов (одно событие — одна строка), они легко генерируются программой и анализируются человеком. Исследование содержимого файла регистрации ошибок после возникновения неполадок часто позволяет понять их причины.
main - заставка модуля, здесь она представляет собой пустое окошко, с серым фоном, но в каждом модуле может стоять своя картинка, которая отображается при выборе его в лаунчере игры. Также этот файл может использоваться как фон при создании изображения мода.
warband_compatibility - Некое дополнение к module.ini, в которое вносятся ресурсы для совместимости ИГ и Варбанда (на деле эта совместимость работает плохо)
rgl_config - Ещё один файл, который относится ко всей игре, но он не находится в папке игры. Его местонахождение обычно: C:\Users\<Имя пользователя>\Documents\Mount&Blade Warband\ - это папка, автоматически создаваемая при инсталляции игры, в папке Документов пользователя, под чьим именем производилась установка. Там же находятся папки, куда сохраняются скриншоты из игры, файлы импортированных персонажей... Как таковые параметры не могут, конечно, повлиять только на конкретный мод, они влияют на всю игру, но иногда бывают полезными именно во время разработки модификаций и редактирования этих параметров у себя в игре для удобства разработки. Тут используются как определенные числовые значения для параметра, так и просто значения работы или нет этого параметра: 1- включен, 0 - отключен. В данном файле хранятся установленные параметры игры, т. е если вы выставите в настройках игры с помощью меню, кнопок и слайдеров какое-то значение, оно будет храниться в этом файле.
texture_detail = 100 - Детализация текстур, по умолчанию 100% размер деления шкалы, но соответственно можно увеличить до какого надо.
render_buffer_size= 15 - Предположительно стартовый размер буфера видеопамяти.
max_framerate = 65 - Обозначение максимального количества кадров видеоряда за единицу времени, кадров в секунду, если учесть что 24 это то, что нужно для создания движения, то увеличение приводит к уменьшению производительности, но визуально делает движение более реалистичным. Тут надо учесть, что вам более комфортно, для меня например 65, вполне подходит.
start_windowed = 1 - Оконный режим.
use_pixel_shaders = 1 - Использование пиксельных шейдеров
use_vertex_shaders = 1 - Использование вертексных шейдеров
fake_reflections = 0 - Динамическое отражение, эффект enviro
show_framerate = 0 - Отображает частоту кадров- ФПС - Frames Per Second — количество кадров в секунду на экране монитора или телевизора, выдаваемых программным обеспечением видеокарты. Характеризует производительность видеосистемы компьютера. Так же и доп. возможности, если необходимо чтобы координаты местности выводились, то отображение должно быть включено.
use_ondemand_textures = 1 - Загрузка материалов и текстур по требованию игры, текcтуры постоянно подгружаются.
use_ondemand_textures_mt = 0 - Предварительная загрузка материалов и текстур.
disable_music = 1 - Отключение музыки
disable_sound = 1 - Отключение звуков
disable_frequency_variation = 1 - Звуковая настройка из лаунчера (и опций?). Как работает? Должна менять частоты воспроизводимого звука, создавая эффект разных голосов у разных агентов.
cheat_mode = 1 - Чит режим
enable_blood = 1 - Разрешить отображать кровь
enable_edit_mode = 1 - Режим редактирования
force_single_threading = 0 - Вкл-выкл параллельность процессов. 1- Принудительное отключение ипользования многопототочности процессов обработки информации.
debug_mode = 0 - Включить встроенный режим отладки
display_width = 0 - Размер дисплея отображения - по горизонтали
display_height = 0 - Размер дисплея отображения - по вертикале. Оба параметра настраиваются из лунчера или в игре в меню видео, уже из готовых параметров.
display_bits = 32 - Битность дисплея
antialiasing = 0 - Степень сглаживания графики
sample_quality = 0 - Multisample сглаживание (MSAA) представляет собой тип сглаживания , метод, используемый в компьютерной графике для улучшения качества изображения
alpha2coverage = 0 - Alpha to coverage - техника компьютерной графики мультиосуществления выборки, полезная для ситуаций, где плотная листва или трава должны быть предоставлены в видеоигре. Эта техника использует альфа-канал текстуры, как coverage mask для сглаживания.
alpha2coverage появилась в DX10, поэтому в игре почти не работает.
force_vsync = 0 - Использовать вертикальную синхронизацию
shadowmap_quality = 2 - Качество теней
shader_quality = 2 - Качество шейдеров (текстур)
postfx_dof = 1 - Эффект глубины (настойка графики, use depth effects), размазывает картинку при нажатии shift. При включённом HDR, скорей всего, даёт какие-то дополнительные эффекты.
postfx_hdr = 2 - Настройки режима HDR, судя по всему это интенсивность свечения.
postfx_autoexp = 1 - В настойках графики auto-exposure. Опять же основной эффект должен быть при включённом HDR. Уменьшает возможную чрезмерную яркость или темноту картинки.
flora_degrade_distance = 150.0000 - Расстояние до ухудшения вида флоры
flora_lod_detail = 0 - Использование лодов для флоры
use_instancing = 1 - Использовать Instancing
use_secure_connection = 0 - Использовать защищенное соединение с сервером
max_number_of_connections = 16 - Количество соединений
look_for_server_on_this_machine = 0 - По названию должна запрещает искать серверы в сети, только на localhost
music_volume = 0.0005 - Громкость музыки
sound_volume = 0.0000 - Громкость звуков
mouse_sensitivity = 0.8055 - Чувствительность мыши
invert_mouse = 0 - Включить инвертирование движения мыши
enable_lighting = 1 - Отображать освещение
enable_particles = 1 - Отображать эффекты, дождь, снег, ... дым ...
enable_blood = 1 - Отображать кровь
enable_character_shadows = 1 - Включение теней персонажей
enable_accurate_shadows = 1 - Включение реалистичных теней
number_of_corpses = 5 - Количество трупов сохраняемых на поле боя
grass_density = 100 - Детализация ростительности
combat_speed = 2 - Скорость битвы
friend_combat_difficulty = 0 - Настройки повреждения союзников (damage to friends).
0, 1, 2 - четверть, половина или полный.
adapter_format = 0 - В DX есть понятие adapter format, но что оно делает среди игровых опций, не понимаю.
reduce_combat_ai = 2 - Уровень AI в сражении
reduce_campaign_ai = 2 - Уровень AI на глобальной карте
combat_difficulty = 0 - Сложность сражений
display_labels = 1 - Кружки над головами союзников, показывающие их стяг.
display_targeting_reticule = 1 - Отображать прицел
display_attack_direction = 0 - Отображать направление аттаки
turn_camera_with_horse_in_first_person = 2 - Поворачивать камеру за игроком на коне
verbose_damage = 1 - Отображать сообщения о нанесенном уроне
verbose_shot_difficulty = 1 - Отображать сообщения о сложности выстрела
battle_size = 0.3422 - Размер сражения. 1.000 = 150 "человек"
attack_direction_control = 0 - Отображать направление атаки
defend_direction_control = 0 - Отображать направление блока
lance_control = 0 - Включение автоматического прицеливания копьем во время "рыцарского удаоа"
anisotropic_filtering = 1 - Анизотропное фильтрование
enable_environment_shadows = 1 - Динамическое отображение теней на объектах
verbose_casualties = 1 - Отображать сообщения о полученных потерях
verbose_experience = 1 - Отображать сообщения о полученном опыте
realistic_shadows_on_plants = 2 - Степень детализации (реалистичности) теней растений
number_of_ragdolls = 5 - Кол- во регдолов (агентов, использовали заранее созданную анимацию для отображения смерти персонажей) количество таких вот умирающих на поле боя
gamma = 3.0000 Гамма монитора
character_detail = 1.0000 - Детализация персонажа
character_shadow_detail = 1.0000 - Детализация тени персонажа
control_mouse_movement_y_scale = 1.5000
blood_stains = 2 - Количество крови на объектах
use_winmm_audio = 0 - Включить WinMM.Net можете прочесть подробно в интернете, библиотека звука.
enable_version_check = 1 - Включение проверки версии при запуске игры и вывода уведомления при наличии новой версии
enable_aspect_ratio_control = 1 - Думаю, какая-то спец настройка для широкоформатов.
realistic_headshots = 0 - Включение "реалистичного" эффекта попадания в голову: при попадании в голову убитый агент отлетает на значительное расстояние назад
auto_gfx_quality = 4 - Автоматическая подстройка графики под FPS. Пара топовых движков умеет это делать. Думаю, что в WB это просто не работает.
По умолчанию - C:\Program Files\Mount&Blade Warband\Modules\Native
Давайте сразу уясним, что игра читает файлы и сортирует их выбор из разных источников по "правилам", указанным в файле module.ini в папке мода. Не забываем, что в моде загружаются оба источника информации (мод и сам корень игры). Выбор регламентируется выше указанным файлом. Для всех файлов, не имеющих описания, оно идентично файлам корня игры. Кроме того, если в моде имеются идентичные по названию файлы и папки с файлами из корня игры (например skyboxes.txt в папке Data модуля), то при загрузке файлов игра будет использовать те которые находятся в модуле, а не в корне игры.
Data - Все те же файлы, в Native эта папка пуста, используются файлы из папки игры.
languages - Папка с языковыми файлами, которые используются в моде.
Music- Музыкальные файлы, которые используются в моде.
Resource-Ресурсы мода, которые будут загружаться именно в этом моде. Описание ресурсов идентично папке CommonRes игры. По ресурсам будет более подробно написано в части вводного курса по моделированию.
SceneObj- Тут находятся сгенерированные в редакторе, встроенном в игру, сцены. Уточню: вид сцен. Сам функционал сцен прописан в текстовом файле. На самом деле там много того, что нам не видно. Это тоже модели, просто они прозрачные. Например, препятствия и пути движения, в виде невидимой разметки. Но это всё модели, поэтому они и тут. Тут находится и координатная привязка объектов внутри нашей "коробочки" сцены.
Sounds- Звуковые файлы, используемые в моде.
Textures- Текстуры объектов, используемые только в этом моде.
Вот мы и добрались до сценария мода. Именно в этих файлах и содержится всё, что запрограммировано в игре.
Текстовые файлы ( *.txt ) - из этих файлов игра узнаёт, что от неё требуется в той или иной ситуации. Они написаны на языке, максимально понятном для движка игры, и лишь местами содержат слова, понятные человеку. Для работы и творчества человека предназначены файлы модульной системы (см. ниже), производными от которых и являются текстовые файлы.
Итак, давайте сразу договоримся, что описывать большинство этих файлов мы не будем в виду того, что это не актуально, да и практически нереально. Описание будет только для необходимых для моддинга файлов. И вот почему - они написаны самой игрой и для неё же. Вот она то этот язык знает. Китайский я не учил, но, думаю, тут разобраться нам будет стоить тех же усилий. Теоретически, если править эти файлы, то мы добьёмся результата, так как как раз их-то и читает игра. А не ту ужаснострашнонепонятнуюпорусскиненаписаную модульную систему. Но на самом деле это не так, проще в 100 раз понять модульку, чем понять язык текстовика. В общем, поверьте тем, кто вам говорит, что глупо править текстовики. Для некоторых правок текстовых файлов есть так сказать переводчики - специальные твиковые программы, которые позволяют довольно просто изменять некоторые параметры напрямую через текстовые файлы. Вот ими и пользуйтесь. Не стоит спрашивать: "а какую мне поправить циферку, чтобы у меня...." Возьмите словарь, если не знаете английский, поскольку большинство таких программ имеет нерусифицированный интерфейс, и воспользуйтесь программами перевода циферек в букавки. Итак, надеюсь, мы договорились! Как править эти циферки более серьёзно, используя модульную систему, мы поговорим и научим это делать, чуть позже.
game_variables - На самом деле этот файл относится ко всей игре. И его функционал недоступен для моддинга. В нем находится презентация игровых окон, которые недоступны из модульной и забиты в движок . По идее, можно изменить внешний вид и расположение кнопок в таких окнах, как окно партии, окно итема, стартовая страница игры, окно загрузки сейвов и т. д.
module. ini- Initialization file. Как мы видим из названия, это файл инициализации (от англ. initialization, инициирование) — создание, активация, подготовка к работе, определение параметров. По другому, это файл конфигурации. В этом файле задаются параметры загрузки ресурсов игры и определяются некоторые общие параметры (переменные), которые задают определённые числовые переменные - определяющие характеристику действия. В некоторых параметрах указаны конкретные числовые значения, где-то указаны переменные, используемые при вычислении, а где-то просто включение или отключение этого параметра путём указания значения: или 0 - выключено, или 1 - включено. Сейчас мы разберёмся, что там внутри этого файла. Сразу замечу что вот этот знак # - знак комментария, определяет игнорирование этой строки ( просто пояснение для нас). Основной частью этого файла являются записи различных параметров вида «имя_параметра = значение».
Внимание! Для передачи более точного содержания файла и во избежание путаницы введены следующие обозначения:
- Выделенный текст - название самой функции (параметра)- Обычный текст - наше пояснение функции (параметра)
- Цветной текст - Коментарии, их исходный текст и дословный перевод. Не удивляйтесь, если текст будет повторён и как наше пояснение, и как переведенный комментарий. Это означает, что этого достаточно, и нет смысла изменять пояснение.
- Цветной текст - Наш комментарий или дословный перевод, параметра, который нам не известен, или мы не уверены на 100% в его пояснении
module_name = Calradia - Название модуля, на игру никак не влияет, и нигде не отображается кроме файла rgl_log.txt
compatible_with_warband = 1 - Используется для совместимости с ИГ (напомню что на деле совместимость работает очень плохо). Если в этом параметре поставить 0, или вообще его удалить, то тогда игра будет загружать ресурсы указанные в warband_compatibility.ini
num_hints = 12 - Количество подсказок присутствующих в моде (те подсказки которые отображаются во время старта новой, или загрузки сохраненной игры)
auto_create_note_indices = 0#Do not automatically search through all troops/factions/towns to check if they have note - #Не проверять автоматически сразу все классы/фракции/города на предмет особых примечаний (флагов) - Параметр отвечает за проверку в самом начале всех класов, предметов и фракций на предмет флагов и особых параметров. Пре-индексация, то есть проверяться свойства объектов будут не по мере надобности, а в самом начале и всех сразу. Включение ускорит процесс во время игры, но замедлит начальную загрузку.
Ниже размер отображения глобальной карты, учтите, что это абстрактно, т. е при первом взгляде на карту условно распределяем её, как географическую.
map_min_x = -180 - Размер карты от 0 на "запад"
map_max_x = 180 - Размер карты от 0 на "восток"
map_min_y = -145 - Размер карты от 0 на "юг"
map_max_y = 145 - Размер карты от 0 на "север"
map_sea_direction = -40 #wave foam direction - #морская пена направление - -40 угол в градусах. Или 320, если хотите. В WB нельзя сделать нормальный остров. Можно только побережье. И вот это угол, под которым на это побережье накатываются волны. Посмотрите внимательно на внутреннюю часть полуострова, на котором расположен Верчег, всё поймёте.
map_sea_wave_rotation = 300#This is where the tear artefact is visible on the sea. - #Тут бугор артефакта виден на море - Вообще артефакт - это некий шов плохо смотрящийся на поверхности моря, возникновение точно не известно, как и его физиология, но его можно сдвигать, убирая в более не заметное место. Если взять за пример, часы, то центр циферблата - это центр карты, минутная стрелка- это 0, а часовая- это артефакт, так вот угол между ними в Нативе 300, но его можно поменять, соответственно сдвинув артефакт, на оси по кругу, на нужное место
map_sea_speed_x = 0.02 - Скорость движения волн на море по оси x
map_sea_speed_y = -0.02 - Скорость движения волн на море по оси y
map_river_direction = 140 - Направление движения волн на реках
map_river_speed_x = 0.01 - Скорость движения волн на реках по оси x
map_river_speed_y = -0.01 - Скорость движения волн на реках по оси y
air_friction_arrow = 0.002 - Сопротивление воздуха для стрел (этот параметр влияет на траекторию движения летящих снарядов, и наносимый ими урон, детальнее об этом рассказывается в разделе "Боевая система"- В будущем, вы сможите наглядно увидеть все известные расчётные системы игры, в новом готовивщемся пособии, по расчётам вычислений игры)
air_friction_bullet = 0.002 - Сопротивление воздуха для пуль (этот параметр влияет на траекторию движения летящих снарядов, и наносимый ими урон, детальнее об этом рассказывается в разделе "Боевая система"- В будущем, вы сможите наглядно увидеть все известные расчётные системы игры, в новом готовивщемся пособии, по расчётам вычислений игры)
# use meshes map_tree_a through map_tree_r on for map trees - # используются меши в промежутке map_tree_a до map_tree_r на глобальной карте для растительности
map_tree_types = 17 - Количество моделей деревьев доступных для терраина типа snow
map_snow_tree_types = 3 - Количество моделей деревьев доступных для терраина типа snow
map_steppe_tree_types = 5 - Количество моделей деревьев доступных для терраина типа steppe
map_desert_tree_types = 4 - Количество моделей деревьев доступных для терраина типа desert
map_max_distance = 175.0 - Максимальное удаление камеры, для отображения, т. е., чем больше показатель, тем "выше" можно поднять камеру над картой и одновременно увидеть большую площадь.
has_tutorial = 1 - Показывать всплывающие обучающие подсказки.
time_multiplier = 0.25 - Множитель времени на глобальной карте (замедляет или ускоряет время на глоб. карте, меняется не только течение время, это влияет на все полностью что происходит на карте.
seeing_range = 6.5 - Расстояние до объекта, на глоб. карте, когда он становится видимым.
track_spotting_multiplier = 0.8
# heroes with health below this will not appear in battles and will not contribute to party skills - # Герои со здоровьем ниже этих, не появится в боях и не будет влиять навыки отряда
player_wounded_treshold = 5 - Минимальный уровень здоровья, при котором ГГ может участвовать в битвах и влиять на навыки отряда.
hero_wounded_treshold = 15 - Минимальный уровень здоровья, при котором NPC могут участвовать в битвах и влиять на навыки отряда.
skill_prisoner_management_bonus = 5 - Количество пленных за одну единицу уровня скила "содержание пленных"
skill_leadership_bonus = 3 - бонус к размеру отряда игрока за единицу уровня скила "лидерство"
base_companion_limit = 20 - Базовый размер отряда игрока
player_xp_multiplier = 2.0 - Множитель получения опыта для игрока
hero_xp_multiplier = 2.0 - Множитель получения опыта для героев(НПС)
regulars_xp_multiplier = 3.0 - Множитель получения опыта для регулярных солдат
display_wp_firearms = 0 - Включает/выключает отображение навыка владения огнестрельным оружием, в меню персонажей.
# damage below this will not interrupt melee attacks - # повреждение ниже этого не будет прерывать атаки в ближнем бою
damage_interrupt_attack_threshold = 3.0 - Минимальный урон, необходимый для прерывания атаки в ближнем бою, одиночная игра. Если вы натянули тетиву и вам нанесли это количество урона, то ваше действие сорвётся.
# Same thing for multiplayer - # То же самое для мультиплеера
damage_interrupt_attack_threshold_mp = 1.0 - Минимальный урон, необходимый для прерывания атаки в ближнем бою, мультиплеер
# No extra penetration flags are set, so keep them ineffective - # Дополнительные флаги пробивания не устанавливаются, поэтому они неэффективны
extra_penetration_factor_soak = 1.0 - Множитель для armor_soak_factor_against при включённом itp_extra_penetration
extra_penetration_factor_reduction = 1.0 - Множитель для armor_reduction_factor_against, при включённом itp_extra_penetration
# You can modify the damage system by editing the following values: - # Система повреждений может быть отредактирована с помощью этих параметров:
# The first three values determine the amount which will be directly subtracted from damage due to armor. - # Первые три значения соответствуют урону, который будет полностью поглощен броней при рубящем, колющем и дробящем ударе соответственно
# The next three values determine the percentage reduction from the damage. - # Следующие три значения - процент, на который будет снижен нанесенный урон при рубящем, колющем и дробящем ударе соответственно
armor_soak_factor_against_cut = 0.8 - Урон, который будет полностью поглощен броней при рубящем ударе
armor_soak_factor_against_pierce = 0.65 - Урону, который будет полностью поглощен броней при колющем ударе
armor_soak_factor_against_blunt = 0.5 - Урону, который будет полностью поглощен броней при оглушающем\ дробящем
armor_reduction_factor_against_cut = 1.0 - Процент, на который будет снижен нанесенный урон при рубящем ударе
armor_reduction_factor_against_pierce = 0.5 - Процент, на который будет снижен нанесенный урон при колющем ударе
armor_reduction_factor_against_blunt = 0.75 - Процент, на который будет снижен нанесенный урон при оглушающем\ дробящем
horse_charge_damage_multiplier = 1.0 - Множитель урона получаемого при атаке лошадью
couched_lance_damage_multiplier = 0.65 - Множитель урона получаемого от рыцарского удара
fall_damage_multiplier = 1.0 - Множитель урона получаемого от падения с высоты
#missiles with damage > shield_penetration_offset + shield_penetration_factor * shield
#will penetrate. - #Снаряды, наносящие больше урона чем shield_penetration_offset + shield_penetration_factor * shield - будут пробивать щит и наносить урон
shield_penetration_offset = 30.0 - Уровень повреждения необходимый для пробивания щита с нулевым сопротивлением снарядом
shield_penetration_factor = 3.0 - Множитель показателя защиты щита.
#setting speed_power to 2.0 makes damage scale with the square of missile's speed. - #Если установить speed_power = 2.0, то размер нанесенного урона будет равен скорости снаряда или оружия, возведенной в квадрат
# you can set it to 1.0 to make it scale linearly as it was before. - # Вы можете установить 1.0, чтобы сделать его зависимость линейно, как это было раньше
missile_damage_speed_power = 1.9 - Cтепень, в которую возводится скорость снаряда, чтобы получить значение урона, для "снарядов"
melee_damage_speed_power = 2.0 - Степень, в которую возводится скорость снаряда, чтобы получить значение урона, для самого оружия
multiplayer_walk_enabled = 0 - Включает/выключает возможность ходьбы в мультиплеере (ходьба включается при удерживании клавиши shift)
mission_object_prune_time = 180 - Время через которое оружие валяющееся на земле перестанет отображаться
#change this to 0 if you want to keep the food slot in inventory window.
disable_food_slot = 1 - Отключение отображение специального слота для еды в окне инвентаря
# Change this to 1 if you want to load - #Поставьте здесь 1, если хотите, чтобы загрузка бала
# textures from Modules/<Module_Dir>/Textures / - # Текстуры из Modules/<Module_Dir>/Textures/
scan_module_textures = 1 - Включает/выключает загрузку текстур из папки Textures модуля
scan_module_sounds = 0 - включает/выключает загрузку звуков из папки Sounds модуля
#edit mode should be enabled - #Режим редактирования должен быть включен
#give_performance_warnings = 1 - отображать сообщения о производительности
#You can also use load_mod_resource instead of load_resource to make sure you are reading files from module directory. - Вы можете использовать load_mod_resource вместо load_resource чтобы быть уверенными, что читаются файлы из директории модуля.
Для чтения из корня игры имя параметра load_resource, а для чтения файлов из папки мода load_mod_resource , так же тут могут быть и комментарии, которые указывают на принадлежность (характеристику) ресурсов.
#animations- вот это например комментарий, что далее следуют ресурсы, относящиеся к анимации.
load_resource = ............. - чтение из корня игры
load_mod_resource = .............. - чтение из ресурсов мода
#works_with_version_min = 1000 #deprecated, use module_version and compatible_savegame_module_version instead - #не используется, используйте module_version и compatible_savegame_module_version вместо этого
#works_with_version_max = 1011 #deprecated, use module_version and compatible_savegame_module_version instead - #не используется, используйте module_version и compatible_savegame_module_version вместо этого.
#module_version = 0 #can be used for multiplayer and single player (saved game) module versioning - #версия модуля (мода), используется для мультиплеера (для проверки совместимости версии сервера и клиента) и одиночной игры (проверка совместимости сохранений с текущей версией).
#compatible_module_version = 0 #can be used for multiplayer module versioning - #совместимая версия модуля (используется для мультиплеера, для проверки совместимости версии сервера и клиента)
#compatible_savegame_module_version = 0 #can be used for single player (saved game) module versioning - #совместимая с сохранениями версия модуля (используется для одиночной игры, для проверки совместимости сохранений с текущей версией модуля).
limit_hair_colors = 1 - Включает/отключает ограничение на количество цветов для волос
show_faction_color = 1 - Включает/отключает отображения цветов фракции
show_quest_notes = 1 - Включает/отключает отображения заметок по квестам
dont_load_regular_troop_inventories = 1 - включает/отключает хранение в сейвах инвентаря регулярных солдат (юнитов), то есть тех что без флага tf_hero
#assign '1' for moveable physics on all scene props; no sokf_moveable flag will be needed - #Установите "1" для включения физики движения для всех scene props; не нужен флаг sokf_moveable
disable_moveable_flag_optimization = 0 - включает/отключает оптимизацию движения для всех сценовых объектов; если поставить 1 - то не нужно будет использовать флаг sokf_moveable, так как это будет доступно для любого объекта на сцене, если 0 - то тогда нужно будет прописывать флаг sokf_moveable для нужных сцен пропсов. В теории, при значении 0 игра будет давать большую производительность.
#You can change the following to 1 for ease in module development - #Вы можете выбрать 1 ниже , что облегчит разработку мода
show_party_ids_instead_of_names = 0 - включает/отключает отображение идентификаторов партий вместо их имен (может упростить разработку мода)
crush_through_treshold = 2.4 - Отвечает за пробивание блоков и щитов, для ближнего, для которого стоит флаг itp_crush_through. Чем больше значение тем, трудней пробить.
can_crouch = 0 - Включает/отключает возможность приседать
can_objects_make_sound = 0 - Включает/отключает возможность воспроизведения звуков обьектами
disable_zoom = 0 - Включает/отключает зум (приближение камеры при нажатии определенной кнопки)
use_advanced_formation = 0 - Включает/отключает возможность использования продвинутых формаций.
use_crossbow_as_firearm = 0 - Дословно: использование арбалета, как огнестрела
can_reload_while_moving = 0 - Включает/отключает возможность перезарядки в движении
can_run_faster_with_skills = 0 - Дословно: может работать быстрее со скиллом, что и как не понятно
use_phased_reload = 0 - Дословно: использование поэтапной перезарядки. Домысел: если человек (юнит) закончил одну фазу (этап) перезарядки (например, он засыпал порох в ствол и на полку) и потом отменил её (например, начал двигаться), то, когда он снова начнет перезаряжаться, процесс начнется не с начала, а со следующей фазы (например, он достанет пулю и будет заталкивать её в ствол)
horses_try_running_away = 0 - Включает/отключает скрипт, который заставляет лошадей убегать
lance_pike_effect_speed = 3.0 - Модификатор влияющий на урон, от скорости разгона, для рыцарского удара
no_friendly_fire_for_bots = 0 - Включает/отключает урон по "своим" для ботов из огнестрела
can_adjust_camera_distance = 1 - Включает/отключает возможность настроить высоту камеры над головой
sync_ragdoll_effects = 0 - Включает/отключает синхронизацию рэгдолл-эффектов.
has_forced_particles = 0 - Включает/отключает отображения систем частиц в обязательном порядке (дым, дождь, туман).
can_use_scene_props_in_single_player = 0 - Включает/отключает возможность использования сцен пропсов в одиночной игре (в мультиплеере их можно использовать по-умолчанию, и это не отключаемо)
disable_attack_while_jumping = 0 - Включает/отключает возможность наносить удары во время прыжка
disable_high_hdr = 0 - Включает/отключает High HDR.
has_accessories_for_female = 0 - Дословно: наличие аксессуара для женского пола. Скорее всего, использование каких то моделей, определяющихся полом
variables - список глобальных переменных, используемых в моде.
Переменные бывают двух видов - локальные и глобальные:
Локальные - это временные переменные, которые используются в пределах одного скрипта или триггера. Локальная переменная создается в одном скрипте, может использоваться только из этого скрипта, и при завершении скрипта она автоматически удаляется. Таким образом, локальные - это временные, служебные переменные.
Глобальные переменные - это переменные, которые создаются в самом начале игры вне каких-либо скриптов или триггеров. Они существуют все время, пока запущена игра, они доступны из любого скрипта или триггера, но - они не могут динамически создаваться и удаляться в процессе игры. Только изменять свое значение. Таким образом, глобальные - это основные переменные, на которых основаны ключевые моменты игры, или же просто параметры, которые должны существовать всегда.
variable_uses- числовые значения переменных.
Модульная система - это только одна из частей полноценного мода. Она является кодовым «скелетом» мода, без которого невозможно обойтись, именно он и является полноценным сценарием всего, что происходит в игре, и задаёт почти все характеристики объектов в игре.
Python - активно развивающийся язык программирования, новые версии (с добавлением/изменением языковых свойств) выходят примерно раз в два с половиной года. Вследствие этого и некоторых других причин на Python отсутствуют ANSI, ISO или другие официальные стандарты, их роль выполняет Python, который используется в МС только для перевода кода, написанного на специальном языке МС, в формат текстовых файлов, которые уже используются в игре, то есть Python выполняет роль только компилятора. Вследствие этого, функции которые написаны на Питоне, могут использоваться и работать только во время выполнения процесса компиляции, и в движок игры он не внедрен. Скрипты МС не используются игрой напрямую — это лишь средство для создания текстовых файлов. Эти текстовые файлы, в которые переводятся скрипты МС, представляют собой текстовые документы, заполненные в основном цифрами и иногда — текстовыми строками. Ещё важно понять, что в МС в качестве языка программирования используется вовсе не Python, а собственный самостоятельный язык, созданный и предназначенный только для моддинга Mount&Blade.
Компоненты МС. Файлы МС делятся на нескольких видов:
module_ файлы - файлы, описывающие все объекты, данные и взаимодействия между ними в моде - собственно то, что будет переведено в текстовые файлы.
header_ файлы - файлы, в которых содержатся списки и описания всех операций, констант и других объектов, которые могут использоваться в module_ файлах
process_ файлы - служебные Python'овские скрипты, предназначенные для «компиляции» МС — перевода кода, написанного в module_ файлах в текстовые файлы мода.
ID_ файлы - упорядоченные списки всех объектов, содержащихся в module_ файлах.
variables.txt - текстовый документ, содержащий список всех глобальных переменных, использованных в коде. О нём упомянуто выше, но по умолчанию он находится в папке МС. Так как МС может использоваться для формирования заново путём компиляции мода. А этот файл не компилируется на пустом месте, поэтому он включен в паку модульной системы, чтобы не нарушать этот принцип.
build_module.bat – исполняемый файл, предназначенный для компиляции МС.
Основная часть МС - то, с чем приходится иметь дело любому модульщику - это module_ файлы. Именно они полностью описывают мод и являются его тем самым «скелетом», и именно в них и пишется весь код. Остальные файлы МС предназначены для правильной компиляции и создания текстовых файлов, а также для использования движком игры. Они не предназначены для редактирования и изменения, поэтому изменять их содержимое строго не рекомендуется.
В модульной системе существует возможность обращаться из одного файла к объектам из другого с помощью специальных приставок, добавляемых перед названием нужного объекта. Таким образом, если нужно, например, в module_mission_templates использовать какую-либо анимацию, то название этой анимации пишется следующим образом: anim_<название анимации из module_animations>.
Сокращения для ссылок на объект модульной системы
- module_animations: "anim_" - Анимации
- module_factions: "fac_" - Фракции
- module_info_pages: "ip_" - Описания
- module_items: "itm_" - Предметы
- module_map_icons: "icon_" - Иконки глобальной карты
- module_game_menus: "menu_" - игровые меню (все текстовые меню в игре со своими сценариями дальнейших действий)
- module_meshes: "mesh_" - 3д модели для использования в оформлении игровых окон(заставки, фоны)
- module_mission_templates: "mst_" - сценарии того, что происходит в сценах
- module_particle_systems: "psys_" - Визуальные эффекты системы частиц в игре (огонь, дым, кровь)
- module_parties: "p_" - Отряды, партии
- module_party_templates: "pt_" - Шаблоны отрядов, партий
- module_postfx: "pfx_" - Параметры эффектов пост-обработки
- module_presentations: "prsnt_" - специализированные интерактивные окна, для предоставления информации.
- module_quests: "qst_" - Квесты
- module_scene_props: "spr_" – Объекты сцен
- module_scenes: "scn_" - Сцены
- module_scripts: "script_" - Скрипты
- module_skills: "skl_" - Умения, навыки
- module_sounds: "snd_" - Звуки
- module_strings: "str_" - Тексты игры
- module_tableau_materials: "tableau_" - Скрипты, обрабатывающие текстуры (например геральдика на щитах, доспехах)
- module_troops: "trp_" - Юниты
Формат файлов:
Каждый из module_ файлов на самом деле представляет собой скрипт на языке Python, содержащий только один большой массив, состоящий из огромного количества чисел, констант и строк. Код, написанный на языке МС, является массивом операций, следующих одна за другой, которые при компиляции переводятся в вид числовых кодов. Точно так же все остальные объекты МС также переводятся в числовой вид.
Python сам по себе является просто средством перевода кода на языке МС в текстовые числовые файлы. Также перед компиляцией он проверяет код на ошибки и сообщает о них. Если в коде нет явных синтаксических и логических ошибок, он переводится в числовой вид и записывается в текстовые файлы мода.
Итак, мы уже прочитали, что модульная система - это набор "фраз" на чуждом, новом и непонятном для нас языке. Не стоит расстраиваться. Раз это язык - его просто надо выучить. А как любой язык, он имеет достаточно отличий от другого, т.е , и это вам скажет любой программист, если вы знаете программирование и владеете Питоном, это не говорит, что модулька для вас открытая книга. А коли так, это означает, что вовсе нам и не надо быть гениями программирования - будем "ботанами" и просто вызубрим и выучим основные правила грамматики и синтаксиса этого языка. В идеале нам нужно научиться ещё и писать на этом языке, а не только читать. Для понимания всего что написано, давайте просто смотреть на коды (в игре) с такого ракурса, что они написаны для глупой машины, которой так же, как и нам, нужно всё показывать на пальцах. На самом деле, именно в таком духе и написан код. Всё расписано и разложено по полочкам, везде есть точная взаимосвязь и простая, очевидная логика.
Не надо прыгать с места в карьер, начать стоит просто с небольшого освоении файлов и записей. Это равносильно тому, как если бы вы поехали учить английский в Англию, не понимая ни одного слова. Стоит сначала освоить хоть пару основных фраз и выучить алфавит.
Поэтому если мы хотим, чтобы в игре произошло какое-то действие - это модулька. Модулька - это, к тому же, и единственный путь увидеть какую-то модель в игре, просто сунуть её в папку ресурсов недостаточно, надо определить ей там место и указать характеристики. Соответственно и искать надо ответы на подобные вопросы в темах, связанных именно с модульной системой.
Модели:
Всё, что мы видим в игре состоит из модели и наложенной на неё текстуры. Что-то зашито в движок игры, что-то можно редактировать: менять или добавлять своё. Начнём с понятия, что такое модель вообще.
Сами модели находятся в игре в формате brf - это двоичный код, необходимый для чтения этой модели движком игры, но в этом файле храниться не только вид объекта, но и привязка к скелету, определенный ей материал (текстура) и другие параметры характеризующие отображение её, взаимодействие модели в игре. brf - это, можно сказать, архив, а так как это архив, то в нём может быть несколько моделей со своими характеристиками. Сами модели создаются в разных форматах 3D моделирования obj, 3ds, …, а только потом уже переносятся в формат brf.
Сама же модель без характеристик в архиве имеет название Mesh
Mesh- Полигональная сетка (англ. polygon mesh) или неструктурированная сетка, это совокупность вершин, ребер и граней, которые определяют форму многогранного объекта в трехмерной компьютерной графике и объемном моделировании. Гранями обычно являются треугольники, четырехугольники или другие простые выпуклые многоугольники (полигоны), так как это упрощает рендеринг, но так же может состоять из наиболее общих вогнутых многоугольников, или многоугольников с дырками. Учение о полигональных сетках это большой подраздел компьютерной графики и геометрического моделирования. Разные представления полигональных сеток используются для разных целей и приложений. Множество операций проводимых над сетками могут включать Булевую алгебру, сглаживание, упрощение и многие другие. Сетевые представления, такие как "потоковые" и "прогрессивные" сетки, используются для передачи полигональных сеток по сети. Объемные сетки отличаются от полигональных тем, что они явно представляют и поверхность и объём структуры, тогда как полигональные сетки явно представляют лишь поверхность (объём неявный). Так как полигональные сетки широко используются в компьютерной графике, также существуют алгоритмы трассировки лучей, обнаружения столкновений и динамики твердых тел для полигональных сеток.
Теперь поговорим о некоторых особенностях моделей в игре.
Условная классификация:
Условно используемые игрой модели можно разделить на 4 типа, с этим связано различное форматирование, при их конвертировании из двоичного кода:
- Модели оружия, щитов, предметов, строений. Не содержат ничего кроме сведений о геометрии самой модели. Экспортируются в формате OBJ, без привязки к скелету.
- Модели тел, костюмов, обуви, лошадей. Содержат сведения о геометрии, один из двух игровых скелетов и сведения о привязке модели к скелету. Экспортируются в формате SMD.
Скелетная анимация - это один из нескольких видов анимации, используемых в Mount&Blade. Характеризуется тем, что основывается на скелетах и костях.
Скелет (skeleton) — это, в сущности, трехмерная модель, но он имеет большое количество особенностей. Скелет отличается от любой другой модели тем, что он состоит не из вертексов и полигонов, а из костей (bones).
skel_horse — зашитый в движок код, отвечающий за правильное расположение копыт лошади, относительно поверхности земли. Благодаря ему анимация лошади динамически подстраивается под рельеф, из-за чего движения лошади выглядят реалистично даже на склонах и другом сложном рельефе.
Кость (bone) — это отдельный элемент модели, представляющий собой некое тело. Или, скорее, точку. Кость имеет координаты в пространстве и может их менять — проще говоря, кость может двигаться. Это довольно очевидно. Но, кроме этого, кость может поворачиваться по любой из трех осей, несмотря на свою «точечность», что менее очевидно сейчас, но станет гораздо яснее позже.
Кости имеют уникальное свойство связываться друг с другом, образуя цепи. Таким образом, создав набор из таких костей и связав их друг с другом правильным образом, можно получить... некую разветвленную цепь из костей. Эта цепь и называется скелетом. В Mount&Blade существуют два вида скелета - человеческий и лошадиный. Человеческий состоит из 20 костей, лошадиный - из 28.
«Зачем нужны эти скелеты?» - спросите вы? Дело в том, что скелеты, благодаря своей костной структуре, могут используются для создания качественных и реалистичных анимаций. И именно для этого и используются.
Скелетная анимация (skeletal animation) — это набор отдельных 3D моделей, кадров (frames), каждая из которых представляет собой скелет в каком-либо положении. Представьте себе кинопленку, в каждом кадре которой находится изображение. С каждым кадром положение объектов на этом изображении чуть меняется. Так вот — скелетная анимация представляет собой точно такую же кинопленку, в которой тоже есть кадры, и на каждом кадре нарисован скелет с чуть измененным положением костей — чуть подвинутых или чуть повернутых. Мда... в общем, ясно.
Скелетная анимация, раз она представляет из себя последовательность кадров, может проигрываться, как любая пленка. И именно для этого она и используется в игре, и именно благодаря этому происходят практически все действия в игре: люди ходят, бегают, прыгают, машут самым разным оружием, стреляют из лука, скачут на лошади... В общем-то, ВСЁ, что делают в игре человеческие персонажи — это всё скелетная анимация. Кроме того, скелетная анимация также используется и для лошадей — шаг, рысь, галоп, прыжок, вставание на дыбы и всё остальное, что способны делать лошади в игре — это всё также только благодаря скелетной анимации.
Так, ну а теперь, когда вы прониклись важностью темы скелетных анимаций, разберем все это дело с технической стороны.
Как все это происходит? Итак, каждый предмет в игре, имеющий отношение к человеку - оружие, доспехи, щит и т.д. - привязывается к скелету человека. Как именно - то есть, скажем, для каждого доспеха обязательно указывать, что он привязан к костям в человеческом скелете. Таким образом указывается, что модель доспеха будет использовать те же координаты, что и кости тела во время анимации, а значит, ее положение будет соответствовать положению тела на данном кадре анимации. Проще говоря, привязывая предмет к скелету, мы указываем, какой частью тела персонажа он является. Благодаря этому, все предметы располагаются правильно - шлем на голове, меч в руке, доспехи на туловище и т.д. И во время игры, когда проигрывается та или иная анимация, высчитывается положение каждой кости на данном кадре, и исходя из этого, меняется положение моделей предметов - доспех наклоняется и поворачивается вместе с костями тела, меч движется вместе с костью оружия и т.д.
Одна отдельная скелетная анимация в Mount&Blade - это файл формата .smd. Только в таком виде одна анимация может храниться, редактироваться и сохраняться различными 3D-редакторами, например, 3D Max или Blender. Но, для использования в игре, отдельные анимации в .smd - формате непригодны. Чтобы игра могла использовать анимацию, ее предварительно нужно положить в .brf - файл в папке Resource, воспринимаемый игрой. Итак, наборы готовых анимации хранятся запакованными в .brf - архивы в папке Resource, отдельные анимации могут выниматься из этих архивов и добавляться в них. В свободном виде, не находясь в .brf - файле, одна отдельная анимация имеет формат .smd.
Анимации в формате .smd могут быть отредактированы или созданы в одном из известных 3D-редакторов: 3D Max или Blender. Правда, для этого нужно будет установить специальные плагины, но сейчас это не так важно. Итак, открыв анимацию в одном из этих редакторов, мы увидим скелет. Этот скелет находится в определенном положении. Кроме этого, присутствует линейка кадров, перемещая которую, можно увидеть положение скелета на каждом кадре анимации. Ну а дальше, в целом, все просто - перемещая или поворачивая отдельные кости скелета на отдельном кадре, мы можем менять положение всего скелета на этом кадре, а значит - менять сам кадр, и значит - менять анимацию. Соответственно, кадры можно добавлять, удалять, вырезать, копировать и вставлять. И вот так, изменяя отдельные кадры, и создают скелетные анимации. После того, как анимация создана, она должна быть снова сохранена в формат .smd. И если анимация готова к использованию в игре — она добавляется в .brf-архив в папке Resource мода.
- Модели рук, перчаток, специфические модели (иконки армий на глобальной карте и т.п.) Содержат вертексную анимацию.
Вертекс - это вершина (в геометрическом смысле). То есть точка, в которой сходятся полигоны.
Вертексная анимация - это когда для каждого последующего кадра полностью трансформируется модель путем перемещения вертексов. Простыми словами это последовательное воспроизведение новых изменённых объектв с заданной последовательностью их смены на последубщий. Это чрезвычайно муторный процесс, но у вертексной анимации тоже есть преимущества - с помощью нее можно анимировать что угодно и как угодно, в то время как возможности скелетной анимации ограничиваются движениями скелета. Экспортируются и храниться в формате MD3 или покадрово, как OBJ, т.е. как отдельные модели. В игре же, как обычно в двоичном коде brf.
- Модели объектов для сцен - здания, деревья и т.п. Отличаются от других моделей тем, что могут иметь более 1 материала. При импорте в брф, эдитор спросит, надо ли разбить базовую модель. Меш разбивается на n частей, где n - число использованных в модели материалов. Такие модели называются мультимешами. В BRF Editor'е можно переключаться в режим показа модели целиком или по частям нажатием на кнопку Multi Mesh.
Мы уже усвоили, что все объекты в игре это модели, но модели это лишь прозрачные каркасы, а вот раскрасить их и придать им разнообразие помогают текстуры.
Качество поверхности текстуры определяется текселями — количеством пикселей на минимальную единицу текстуры. Так как сама по себе текстура является изображением, разрешение текстуры и её формат играют большую роль, которая впоследствии сказывается на общем впечатлении от качества графики в 3D-приложении.
Файлы текстур хранятся в формате DDS- изображения, в которых данные хранятся так же, как в видеопамяти (включая мипмэпы). Это позволяет их быстро загружать в игре. В DDS могут храниться объёмные текстуры, куб-мапы и прочие необычные (для графических файлов) вещи.
2D слои в DDS-файле могут храниться в RGBA формате, а могут быть сжаты в форматы DXT1, DXT3, DXT5.
Текстуры так же могут иметь и Мип - уровни - текстурный аналог lod-ов. Находятся в самой текстуре.
Увеличивают расход видеопамяти, но также увеличивают общую скорость рендеринга, подменяя основную текстуру по мере удаления от "камеры".
Без мип-уровней не будет работать настройка качества текстур (она определяет, какой из мип уровней считать основным).
На модель материал ложится по заранее созданной из его модели развёртки, задающей позиционирование.
Внимание парадокс - Игра не использует как таковые текстуры, она использует материал.
Материал определенной модели в свою очередь состоит из:
- Текстуры, используемый им, коих может быть 2.
- Карты нормалей или Normal map или Bump - Это та же развёртка, тоже текстура предмета. Техника заключается в том, что отклонение каждого пикселя от нормали к поверхности просчитываемого объекта смотрится в карте высот (поле высот) и применяется перед обсчётом освещения. Кроме описанной выше техники, называемой Bump mapping, существует ряд альтернатив, также позволяющих придавать рельефность поверхностям. Bump mapping более корректно переводится как «эффект бугристой поверхности». Так же есть и техника Parallax mapping, данная технология также использует карты нормалей, но, в отличие от normal mapping, она реализует не только освещение с учётом рельефа, но и сдвигает координаты диффузной текстуры. Этим достигается наиболее полный эффект рельефа, особенно при взгляде на поверхность под углом.
- Карта спекуляров - с использованием этой карты игра создает блеск на предметах. Specular Map (карта отражения) – текстура (всё таже развёртка), которая показывает способность отражения материала. Specular map не показывает отражения сцены, в которой находится объект, а показывает отражения света падающего на него. Specular Map содержит в себе пиксели в черно-белой цветовой гамме. Чем светлее пиксель, тем больше способность материала отбивать свет и тем ярче на нём блики от света. Соответственно чем темнее пиксель, тем матовее становится материал и теряет своё свойство отражать свет. Требует применения соответствующего шейдера (например, specular_shader).
- Шейдер (англ. Shader) — это программа для одной из ступеней графического конвейера, используемая в трёхмерной графике для определения окончательных параметров объекта или изображения. Она может включать в себя произвольной сложности описание поглощения и рассеяния света, наложения текстуры, отражение и преломление, затенение, смещение поверхности и эффекты пост-обработки.
Программируемые шейдеры гибки и эффективны. Сложные с виду поверхности могут быть визуализированы при помощи простых геометрических форм. HLSL (High Level Shading Language) - язык программирования шейдеров, чем то похож на Cg, созданный Microsoft-ом, и используется вместе с DirectX. В действительности HLSL был создан двумя корпорациями Microsoft и nVidia. Это тот язык, что используется в нашем любимом Мибе...
Вертексный шейдер:
Выполняет обработку геометрии - изменяет позицию, текстурные координаты, цвет вершин. Также может выполнять вычислении освещения. Допустимое количество команд может достигать одной-двух сотен.
Пример фрагмента кода:
float2 movepos = float2 (matWorld._m03, matWorld._m13) + vPosition.xy;
Пиксельный шейдер:
Выполняет обработку цветовых данных, полученных при прорисовке треугольника. Оперирует с текстурами и цветом. Количество инструкций, значительно ограничено, к примеру, в версии 1.4 оно не может быть больше 32.
Пример фрагмента кода:
float4 tex;
if(apply_depth)
{
tex = tex2D(ReflectionTextureSampler, (0.25f * normal.xy) + float2(0.5f + 0.5f * (In.PosWater.x / In.PosWater.w), 0.5f - 0.5f * (In.PosWater.y / In.PosWater.w)));
}
else
{
//for objects use env map (they use same texture register)
tex = tex2D(EnvTextureSampler, (vView - normal).yx * 3.4f);
}
- Материал имеет и другие параметры заданные ему, такие параметры, как прозрачность, наложение освещения на предмет, использование теней, RGB определяют цветность блеска в палитре RGB (красный, зеленый, синий), Envrivo - используется для эффекта зеркальности, в качестве карты можно использовать родную и т.п.
- Меш (модель). Причём у одного предмета может быть несколько используемых в игре мешей со своими характеристиками(например меч и ножны, лук и чехол...)
- Материал (см. выше)
- Анимация
- Скелет(для того кому предусмотрен)
- Определённые настройки визуализации
- Параметры, задающие функционал (файлы txt)
Так что усвойте - чтобы добавить объект, надо добавить несколько файлов и записей.
6 СценыСценой в игре называется любое пространство, где главный герой и всевозможные персонажи ходят, прыгают, дерутся и т.д. Игрок проводит тут львиную долю своего времени, поэтому уметь работать со сценами важно для каждого стоящего мода.
Как бы ни выглядела сцена, всё в ней формируется движком игры за счёт сведений из нескольких источников, и большинство из них можно редактировать. Можно сказать, что это наши механизмы формирования сцен, далее перечислим их в порядке от самых основных к менее очевидным.
Вот два самых стандартных примера такой записи:
("quick_battle_1",sf_generate,"none", "none", (0,0),(120,120),-100,"0x30401ee300059966000001bf0000299a0000638f",
[],[],"outer_terrain_plain"),
("tutorial_2",sf_indoors,"tutorial_2_scene", "bo_tutorial_2_scene", (-100,-100),(100,100),-100,"0",
[],[]),
Тут мы можем выделить 10 частей:
1 название сцены, добавляя приставку scn_ ,его используют для обращения к сцене из других файлов модульной системы. Также для каждой сцены предусмотрен индивидуальный файл с таки же названием (см. ниже).
2 флаги, подробно расписаны в файле header_scenes.py, если их несколько, то разделяются знаком вертикальной черты. Определяют особенности освещения, использование ландшафта и др.
3 имя меша - обычно тут указывается имя модели помещения, у уличных сцен из-за ненужности такой модели обычно написано "none" (читай - "отсутствует"). Для уличных сцен применяется outer_terrain модель окружения, обычная модель из ресурсов игры, которую можно создать как любой меш (модель).
4 имя колижн-меша, он необходим, чтобы стены, пол и другие части помещение не только выглядели твёрдыми, но и вели себя соответственно. У уличных сцен также "none".
5 первые круглые скобки - минимальная точка координат, дальше которой в сцене нельзя пройти.
6 вторые круглые скобки - максимальная точка координат, дальше которой в сцене нельзя пройти. Обе точки нужны для экономии машинных ресурсов, чтобы компьютер не обрабатывал бесконечное пространство. При изменении сцен стоит помнить, что указываемые здесь координаты должны соответствовать реальным размерам сцены (чтобы персонаж не наталкивался на невидимые стены).
7 уровень воды, как правило, не редактируется.
8 код ландшафта - здесь ноль у интерьерных сцен и длинная последовательность знаков у остальных. Код содержит информацию о размере сцены, типе местности (снег, пустыня, лес), неровностях рельефа, характере растительности, наличии рек. Сам код нужен для чтение движком игры, нам же возможно его сгенерировать, доступной утилитой движка игры- редактором ландшафтов(тераинов)
9 первые квадратные скобки, в нынешних версиях игры не используется, иногда там стоит слово "exit".
10 вторые квадратные скобки, пустые или содержат имена юнитов (но без обычной приставки trp_), к инвентарю которых можно получить доступ в данной сцене. Чаще всего, если тут кто-то и прописан, то это или "сенешаль" (инвентарь игрока-владельца замка), или "бонусный сундук".
Файл сцены находится в папке SceneObj вашего мода (если её нет, скопируйте её из Native), носит имя "название_сцены.sco(файл скомпилированный из разных источников движком игры (Встроенным редактором сцен - ВРС) и содержит самые мелкие подробности о реальном виде вашей сцены. То есть - где и как Вы вручную поменяли ландшафт, разместили различные объекты и растительность (включая их масштаб, углы наклона, ...), нанесли на поверхность земли текстуру песка или камня, покрасили снег в зелёный цвет, проложили АИ-меши, для компьютерных болванчиков...
ВРС - Собственно говоря, это и есть движок игры, такой же компилятор, как и Питон, он просто собирает в одно место информацию из разных файлов и позволяет нам их наглядно редактировать.
AI Mesh - это сеть, указывающая NPC (ботам, т.е всем кем управляет ИИ), где он может пройти, а где нет. Если, какой-нибудь NPC вдруг захотел прогуляться из точки A в точку B, он делает это так: находит кратчайший путь, проверяет, может ли он там пройти, и только потом (о, чудо!) идет. Если Вы построили стену у него на пути, то он врежется в нее и застрянет там навечно. Но если Вы сделаете AI mesh так, чтобы он учитывал эту стену, то NPC не только не врежется, но и обойдет злополучную стену кратчайшим путем
Следует знать, что объекты в файлах сцен запоминаются по названиям, и переименование объектов приведёт к их исчезновению из сцены. Для того, чтобы создать новый файл сцены, достаточно описать его так, как указано в предыдущем абзаце, войти в сцену внутри игры, а потом с помощью встроенного редактора сделать и сохранить хоть какое-то изменение. Например - поставил домик и сразу удалил, а выходя из режима редактирования, подтвердил изменения. В папке SceneObj при этом создаётся новый файл. В описанном примере его размер составит менее 1Кб, какой бы большой ни была сцена. Чем больше изменений в редакторе Вы будете делать, тем сильнее "разжиреет" этот файл.
События (триггеры) в файле module_mission_templates.py. Чтобы на сцене кипела жизнь, ей должна соответствовать определённая миссия (грубо говоря, сценарий). Вызов сцены в модульной системе сопровождается вызовом миссии (сценария). Далеко не всегда они составляют жёсткие пары. Обычно одна миссия используется для многих однотипных сцен, например, есть 110 деревень, для всех них в мирной ситуации используется миссия "village_center", а при сражении "lead_charge". Другой пример - на сцене Вы размещаете осадную башню, а вот её движение и поведение "актёров" определяется миссией.
Внутриигровые меню в файле module_game_menus.py - для каждой активной партии (т.е. города, отряда, деревни) игра с помощью скриптов определяет, какое именно меню вызвать. Зачастую внутри меню содержатся дополнительные проверки и вычисления, оценивающие игровую ситуацию. Дружественный это замок или враждебный? Соответственно используется либо мирная сцена, либо сцена штурма. Также в меню часто определяются присутствующие на сцене персонажи (стражники, гуляющие местные жители, бандиты). Самым обширным меню обладают города, там можно выбрать переход в одну из нескольких сцен (покои, таверна, улицы...).
(modify_visitors_at_site, "scn_tutorial_training_ground"), надо определить посетителей (персонажей) на данной сцене
(reset_visitors), сбрасываем старые настройки
(set_visitor, 43, "trp_veteran_fighter"), в точке входа №43 пусть появится указаный юнит
(set_jump_mission,"mt_tutorial_training_ground"), выбираем миссию (сценарий)
(jump_to_scene,"scn_tutorial_training_ground"), переходим к самой сцене
(change_screen_mission), обновляем экран
Каждый из пунктов меню внутри самой сцены можно продублировать объектами, которые называют "passage". Такой объект в игре проявляет себя надписями типа "Вход в магазин" или "Вход в тюрьму" и имеет две характеристики, указываемые в окошках Entry No и Menu Item No. В первом мы ставим номер точки входа, на которую хотим отправить игрока, во втором - порядковый номер пункта меню, из которого игра будет узнавать сцену. Причём нумерация начинается с нуля, то есть если приведённый выше пример взят из третьего по счёту пункта меню, то внутри редактора сцен мы поставим пассаж и укажем ему Menu Item No = 2. Игра найдёт этот пункт меню и использует указанные в нём сцену, миссию, выставит персонажей.
Скрипты в module_scripts.py, прежде всего script_game_start, так как он задаёт свойства очень многих игровых объектов. Я не буду рассматривать этот скрипт подробно, приведу в качестве иллюстрации несколько вырванных по-отдельности строк, по которым можно найти некоторые важные блоки в скрипте
(faction_set_slot, "fac_culture_1", slot_faction_tier_3_troop, "trp_swadian_footman"), указываем для фракции юнитов для пополнения гарнизонов и отрядов, они же используются как стражники
(faction_set_slot, "fac_culture_1", slot_faction_town_walker_male_troop, "trp_town_walker_1"), указываем для фракции прохожих (горожан, сельчан)
(party_set_slot,":town_no", slot_town_prison, ":cur_object_no"), указываем для города, какая сцена соответствует отдельным его частям (магазин, арена, тюрьма...)
(party_set_slot,"p_castle_1", slot_center_siege_with_belfry, 1), указываем для замков и городов, будет ли при штурме использоваться осадная башня
Свойства объектов сцены (предметов) в module_scene_props.py. Это хорошо заметно на примере тех из них, которые описываются не одной строкой, а целой последовательностью. Фактически там содержатся небольшие скрипты, обеспечивающие избирательное поведение предметов, например - факел горит ночью, но не днём; от чучела при ударе летит солома, идёт пыль, раздаётся характерный звук, а в итоге оно падает; с дерева падают сухие листья; из трубы идёт дым. Все эти явления задаются как свойства объектов ещё до помещения их на сцену.
Описание растительности в файле Flora_kinds.py (он не в папке Module_system, а в папке Module_data). Сюда большинство мододелов не залазят, быть может, и Вам не придётся. Файл содержит указания на то, какие растения существуют в игре, сколько у них есть альтернативных вариантов отображения (моделей), на какой местности (степь или лес), игра их будет "высевать", трава это или дерево и насколько часто встречается. В отличие от других файлов указанной папки, файл флоры легко редактируется, но нужно помнить, что большинство меняемых в нём параметров отобразятся на уже готовых сценах. И чтобы ничего потом не переделывать из-за растущих на снегу пальм и торчащих из стражников ёлок, сначала редактируется файл флоры, а потом делаются все сцены, где есть автоматически размещаемая растительность.
Скайбоксы- объект, в трёхмерной графике, играющий роль неба и горизонта. Представляет собой несложную трёхмерную модель (как правило, куб), с внутренней стороны которой натянута текстура неба (так называемая «кубическая текстура»). Обработка трёхмерной графики требует много вычислительной работы, поэтому «честно» просчитывать в играх объекты, находящиеся на горизонте, было бы расточительством. К тому же трёхмерное аппаратное обеспечение имеет Z-буферы, которые отсекают всё, что находится слишком далеко от камеры. Поэтому удалённые объекты изображаются крайне примитивно: в виде куба, шесть граней которого — текстуры неба и горизонта. Если отобразить этот куб так, чтобы камера находилась точно в центре, будет казаться, что через камеру действительно видны небо и горы. Скайбокс всегда следует за камерой, так что изображённые на скайбоксе объекты выглядят удалёнными в бесконечность. Движок отображает скайбокс каждый кадр в первую очередь, отключив Z-буферизацию. Высокие, заметные из любой точки уровня объекты наподобие башен обычно на скайбоксе не рисуют - для них нужна не иллюзия «бесконечной удалённости», а наоборот, определённое положение в пространстве. Источником текстур может быть что угодно: фотография, рисунок или трёхмерный рендер.
В игре скайбоксы представлены в виде меша (модели) с текстурой, сферической формы.
Выбор игрой скайбокса зависят от времени суток, от погодных условий или того и другого. К ним то они и прикреплены. Скайбоксы можно создать или редактировать, заменяя их. Но можно, при работе с модульной системой, задать для каждой сцены (миссии), свои в файле module_mission_templates.
Прочитав, из чего состоит сцена, можно сделать вывод: каждая сцена это определённый механизм, так что, у вас просто не выйдет создать сцену, работая только с одним файлом.
7 Глобальная картаГлобальная карта - это один из двух вариантов окружения, в котором происходит действие игры. Все время игрок проводит либо на какой-либо сцене, либо на глобальной карте.
Глобальная карта включает в себя несколько составляющих:
- Модель рельефа
- Поверхности
- Система координат
- Партии
Рельеф - это внешний вид карты, без каких-либо городов и замков. Фактически это физическая карта местности, Кальрадия, какой она была до того, как в ней появились вегиры со свадами и иже с ними. Для создания модели рельефа обычно используется специализированный редактор карт для Mount&Blade MapEditor, это наиболее удобно. Также можно для этой цели использовать 3DMax или любой другой профессиональный 3D-редактор.
Важно отметить, что карта рельефа - это не только визуальные поднятия и снижения. Это еще и текстуры, поверхности, которыми покрыта карта. И это не просто для визуальной красоты - каждая текстура имеет свои спецификации и особенности. Например, скорость передвижения - она разная у песка, травы, снега и т. д. По текстуре горы передвижение невозможно вообще - это используется для создания недостижимых или малодостижимых участков карты. Если просто сделать возвышение с текстурой травы - независимо от его высоты игрок будет перемещаться по нему с той же скоростью, как и по травянистой равнине. А если на ровном месте поставить пятно из текстуры горы - это место будет непроходимым.
Система координат. Итак, у нас есть заготовка карты. Посмотрим на нее сверху. На что похоже? Правильно, на какой-то разноцветный прямоугольник... А теперь представьте, что на карте размещены города, замки и деревни. Как определить, где именно на карте находится тот или иной город иди замок? Правильно - так же, как это делается на любой географической карте. С помощью «меридиан» и «параллелей». Ведь параллели и меридианы - это обыкновенная система координат... хотя, да, пожалуй, не совсем обыкновенная - это система координат на шаре. Ну а нам с нашей глобальной картой гораздо проще - у нас карта не шарообразная, а, как мы уже заметили выше, прямоугольная, поэтому мы можем просто ввести нормальную стандартную Декартову (прямоугольную) систему координат.
Прямоугольная система координат - прямолинейная система координат с взаимно перпендикулярными осями на плоскости или в пространстве. Наиболее простая и поэтому часто используемая система координат. Очень легко и прямо обобщается для пространств любой размерности, что также способствует ее широкому применению. Прямоугольная система координат на плоскости образуется двумя взаимно перпендикулярными осями координат X и Y. Оси координат пересекаются в точке , которая называется началом координат- 0, на каждой оси выбрано положительное направление. Соответственно есть и отрицательное, так вот то, что "ниже" нуля или "левее"- это значения с "-".
С помощью этого, просто определять точное местоположение любых объектов.
Точнее, вводить нам ничего не надо. Система координат глобальной карты давно уже введена разработчиками, и все объекты на глобальной карте и без нашей помощи давно получили такой параметр как координаты. Как выглядит эта система координат? Посмотрим на карту сверху, повернув север туда, где он должен находиться - вперед. В центре прямоугольника будет начало координат - точка с координатами (0;0). Ось X направлена с запада на восток - то есть слева направо при текущем виде карты. Ось Y – с юга на север (снизу вверх). Таким образом ориентироваться в этой простейшей системе не составляет никакого труда.
Партии - это любые объекты на глобальной карте. Вообще любые. Ну, то есть, кроме тех, что относятся к рельефу карты - например, горы, деревья, реки, озера партиями не являются. Но - партиями являются все отряды: игрок, лорды, короли, разбойники, крестьяне или торговцы, все населенные пункты - города, замки, деревни, бандитские логова и т. п. То есть, можно сказать, что партии - это все интерактивные объекты на глобальной карте. Объекты, с которыми игрок может взаимодействовать. И которые, могут взаимодействовать с игроком. И между собой.
Любая партия характеризуется параметром, свойственном партии любого вида - составом. С отрядами и армиями все понятно - каждый отряд включает в себя определенное количество определенных персонажей - воинов. Ну а любой город или замок имеет гарнизон. И любое логово бандитов никогда не бывает пустым - всегда в нем находится большая или маленькая группа разбойников.
Партия - это объект глобальной карты, содержащий список воинов, с которым игрок может взаимодействовать. Взаимодействия с городом и с отрядом лорда принципиально различаются - в первом случае открывается меню города, во втором - окно диалога с лордом. Естественно, у каждой партии есть специальный параметр, отвечающий за тип взаимодействия с данной партией. Этот параметр называется типом партии. Тип партии может быть «город», «замок», «лорд», «логово» и т. д. При взаимодействии игрока с партией дальнейшие действия разворачиваются в зависимости от этого параметра. Все эти параметры, редактируются в модульной системе.
От чего зависит, открывать ли диалог или меню, мы разобрались. Но ведь диалог-то должен быть конкретно с тем лордом, с которым мы встретились. И в меню должно стоять название и описание именно того города, в который мы зашли... Очевидно, что вышеописанных параметров недостаточно. Поэтому у каждой партии помимо всего прочего есть ID (идентификационный номер). ID у каждой партии уникален — то есть не существует двух партий с одинаковым ID. Зная ID партии, мы можем точно определить, о какой именно партии идет речь. В зависимости от ID партии и формируются специфические детали диалога или меню — проверяется ID партии, точно узнается, с какой именно партией взаимодействует игрок... Ну а там уже можно без труда определить все параметры данной партии, и в зависимости от них правильно составить диалог или меню.
А теперь вспомним о том, о чем уже говорили раньше - о системе координат. Нетрудно догадаться, что вся эта история с координатами нужна, в основном, именно для партий. Партии могут передвигаться, появляться, пропадать... Неспокойные это ребята, эти партии. На месте сидеть очень не любят. А чтобы не терять этих бегунов из виду и отслеживать и направлять все их перемещения как раз и используются координаты.
Поведение партий. Параметр координат есть у любой партии. Даже у статических, таких как города, замки и деревни. Но интереснее изучить партии двигающиеся, такие как отряды лордов, разбойников и т. п. Для чего конкретно могут использоваться координаты в данном случае?
Проверка расстояния. Координаты - единственный способ отследить, насколько далеко друг от друга расположены две данные партии. На проверке расстояния строится практически все поведение партий: таким образом, проверяется, видят ли друг друга данные партии, встретились ли они и т. д.
Выбор пути. Любая карта - это граф.
Граф - В математической теории графов и информатике, граф — это совокупность непустого множества вершин и множества пар вершин (связей между вершинами).
Объекты представляются как вершины, или узлы графа, а связи — как дуги, или рёбра. Для разных областей применения виды графов могут различаться направленностью, ограничениями на количество связей и дополнительными данными о вершинах или рёбрах.
Многие структуры, представляющие практический интерес в математике и информатике, могут быть представлены графами. Объекты представляются как вершины, или узлы графа, а связи — как дуги, или рёбра. Для разных областей применения виды графов могут различаться направленностью, ограничениями на количество связей и дополнительными данными о вершинах или рёбрах. Т.е. это определённая графическая схема. Где вершины - это пункт назначения, а рёбра - это путь к ним.
И наша глобальная карта не исключение. Вершинами можно назвать все партии - и статические, и динамические, ребрами - прямые пути, соединяющие их. И вот по этим ребрам и двигаются все партии. Все, без исключения. Даже партия игрока движется к указанной цели (даже если это не партия, а просто точка на карте) по кратчайшему пути. Почему партия игрока может ходить к случайно выбранной точке, спросите вы? Все довольно просто - кроме вышеперечисленных у графа карты есть еще одна вершина - точка цели игрока. Это такая же вершина, как и любая партия, и к ней также проводятся ребра. М-да... Понимаю, что объяснить это непросто, а понять еще сложнее, но вы все-таки попробуйте. На самом деле все довольно просто и очевидно. Все партии двигаются по кратчайшим путям, представляющим собой отрезки прямых. Или ломаные, составленные из нескольких отрезков, в случаи, если на пути встречается препятствие, которое нужно обогнуть. Любую прямую на координатной плоскости можно описать одним линейным уравнением - это известно любому школьнику. Отрезок, соответственно, тоже. И именно так и задаются пути партий - линейными кусочно-заданными функциями, описывающими отрезки, ведущие от точки начала движения к точке конца. И как раз здесь-то без координат не обойтись вообще никак. По понятным причинам. Поэтому без координат было бы невозможно в принципе движение партий.
Патрулирование. Патрулирование приведено как пример движения партии следующего вида: задается какой-либо один конкретный объект. Пока неважно как задается, пусть хоть с помощью ID. И нам нужно обеспечить, чтобы партия постоянно двигалась в окрестностях этого объекта, не удаляясь от него на расстояние, больше заданного. Очевидно, что для этого на необходимо мысленно очертить круг с центром в искомом объекте и радиусом, равным данному расстоянию, и для движения партии все время выбирать случайную координату внутри его. Так, все-таки промелькнуло слово «координата», ну да ладно. Думаю, вы и сами догадались, что выполнить подобную задачу без координат невозможно. А с координатами это делается проще простого - просто нужно выбирать случайную точку так, чтобы расстояние от нее до центра было меньше или равно заданному расстоянию.
Да, а вы как думали? Это внешне игра выглядит так просто и красиво. За всеми этими удобностями и красивостями на самом деле стоит наисуровейший математический аппарат, и это еще отнюдь не самое сложное. Но моддеру, со всем этим, дела иметь практически не придется. Это все делает движок игры, к которому моддер отношения не имеет. Поэтому успокойтесь и вздохните глубже — все очень просто, всё, что вам нужно - это только задавать координаты, радиусы и поведение, остальное будет делать движок.
8 Авторы и источники информации
Авторы:
Гильдия модостроителей "Всадников Кальрадии":
Основные: HunterWolf, Romitas, Dargor, Leon473, Rongar, Легионер, FinGall.
Благодарности:
Caba`drin, Lumos, Swyter и многим другим, кто писал различные пособия и пояснения на форуме TaleWorlds.
Источники информации:
Различные форумы и сайты, посвещённые компьютерным играм и в частности игре Mount&Blade. Всемогущая Википедия и Великий и Ужасный Google Search.
Сообщение отредактировал HunterWolf: 06 января 2013 - 02:00