Сценой в игре называется любое пространство, где главный герой и всевозможные персонажи ходят, прыгают, дерутся и т.д. Игрок проводит тут львиную долю своего времени, поэтому уметь работать со сценами важно для каждого стоящего мода.
Как бы ни выглядела сцена, всё в ней формируется движком игры за счёт сведений из нескольких источников, и большинство из них можно редактировать. Можно сказать, что это наши механизмы формирования сцен, далее перечислим их в порядке от самых основных к менее очевидным.
Описание в файле scenes.py модульной системы:("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.
Прочитав, из чего состоит сцена, можно сделать вывод: каждая сцена это определённый механизм, так что, у вас просто не выйдет создать сцену, работая только с одним файлом.
Глобальная карта - это один из двух вариантов окружения, в котором происходит действие игры. Все время игрок проводит либо на какой-либо сцене, либо на глобальной карте.
Глобальная карта - это игровое окружение во время, когда игрок не находится ни на одной из сцен. А проще говоря - это вот та самая карта всея Кальрадии, с ее замками, деревнями и городами, по которой передвигаются отряд игрока, армии лордов, шайки разбойников и караваны в свободное от сражений время. Глобальная карта- это бинарный файл, преобразованный утилитой (движком игры) из графического 3D.
Глобальная карта включает в себя несколько составляющих:- Модель рельефа
- Поверхности
- Система координат
- Партии
Рельеф - это внешний вид карты, без каких-либо городов и замков. Фактически это физическая карта местности, Кальрадия, какой она была до того, как в ней появились вегиры со свадами и иже с ними. Для создания модели рельефа обычно используется специализированный редактор карт для Mount&Blade MapEditor, это наиболее удобно. Также можно для этой цели использовать 3DMax или любой другой профессиональный 3D-редактор.
Важно отметить, что карта рельефа - это не только визуальные поднятия и снижения. Это еще и текстуры, поверхности, которыми покрыта карта. И это не просто для визуальной красоты - каждая текстура имеет свои спецификации и особенности. Например, скорость передвижения - она разная у песка, травы, снега и т. д. По текстуре горы передвижение невозможно вообще - это используется для создания недостижимых или малодостижимых участков карты. Если просто сделать возвышение с текстурой травы - независимо от его высоты игрок будет перемещаться по нему с той же скоростью, как и по травянистой равнине. А если на ровном месте поставить пятно из текстуры горы - это место будет непроходимым.
Система координат. Итак, у нас есть заготовка карты. Посмотрим на нее сверху. На что похоже? Правильно, на какой-то разноцветный прямоугольник... А теперь представьте, что на карте размещены города, замки и деревни. Как определить, где именно на карте находится тот или иной город иди замок? Правильно - так же, как это делается на любой географической карте. С помощью «меридиан» и «параллелей». Ведь параллели и меридианы - это обыкновенная система координат... хотя, да, пожалуй, не совсем обыкновенная - это система координат на шаре. Ну а нам с нашей глобальной картой гораздо проще - у нас карта не шарообразная, а, как мы уже заметили выше, прямоугольная, поэтому мы можем просто ввести нормальную стандартную Декартову (прямоугольную) систему координат.
Прямоугольная система координат - прямолинейная система координат с взаимно перпендикулярными осями на плоскости или в пространстве. Наиболее простая и поэтому часто используемая система координат. Очень легко и прямо обобщается для пространств любой размерности, что также способствует ее широкому применению. Прямоугольная система координат на плоскости образуется двумя взаимно перпендикулярными осями координат X и Y. Оси координат пересекаются в точке , которая называется началом координат- 0, на каждой оси выбрано положительное направление. Соответственно есть и отрицательное, так вот то, что "ниже" нуля или "левее"- это значения с "-".
С помощью этого, просто определять точное местоположение любых объектов.
Точнее, вводить нам ничего не надо. Система координат глобальной карты давно уже введена разработчиками, и все объекты на глобальной карте и без нашей помощи давно получили такой параметр как координаты. Как выглядит эта система координат? Посмотрим на карту сверху, повернув север туда, где он должен находиться - вперед. В центре прямоугольника будет начало координат - точка с координатами (0;0). Ось X направлена с запада на восток - то есть слева направо при текущем виде карты. Ось Y – с юга на север (снизу вверх). Таким образом ориентироваться в этой простейшей системе не составляет никакого труда.
Партии - это любые объекты на глобальной карте. Вообще любые. Ну, то есть, кроме тех, что относятся к рельефу карты - например, горы, деревья, реки, озера партиями не являются. Но - партиями являются все отряды: игрок, лорды, короли, разбойники, крестьяне или торговцы, все населенные пункты - города, замки, деревни, бандитские логова и т. п. То есть, можно сказать, что партии - это все интерактивные объекты на глобальной карте. Объекты, с которыми игрок может взаимодействовать. И которые, могут взаимодействовать с игроком. И между собой.
Любая партия характеризуется параметром, свойственном партии любого вида - составом. С отрядами и армиями все понятно - каждый отряд включает в себя определенное количество определенных персонажей - воинов. Ну а любой город или замок имеет гарнизон. И любое логово бандитов никогда не бывает пустым - всегда в нем находится большая или маленькая группа разбойников.
Партия - это объект глобальной карты, содержащий список воинов, с которым игрок может взаимодействовать. Взаимодействия с городом и с отрядом лорда принципиально различаются - в первом случае открывается меню города, во втором - окно диалога с лордом. Естественно, у каждой партии есть специальный параметр, отвечающий за тип взаимодействия с данной партией. Этот параметр называется типом партии. Тип партии может быть «город», «замок», «лорд», «логово» и т. д. При взаимодействии игрока с партией дальнейшие действия разворачиваются в зависимости от этого параметра. Все эти параметры, редактируются в модульной системе.
От чего зависит, открывать ли диалог или меню, мы разобрались. Но ведь диалог-то должен быть конкретно с тем лордом, с которым мы встретились. И в меню должно стоять название и описание именно того города, в который мы зашли... Очевидно, что вышеописанных параметров недостаточно. Поэтому у каждой партии помимо всего прочего есть ID (идентификационный номер). ID у каждой партии уникален — то есть не существует двух партий с одинаковым ID. Зная ID партии, мы можем точно определить, о какой именно партии идет речь. В зависимости от ID партии и формируются специфические детали диалога или меню — проверяется ID партии, точно узнается, с какой именно партией взаимодействует игрок... Ну а там уже можно без труда определить все параметры данной партии, и в зависимости от них правильно составить диалог или меню.
А теперь вспомним о том, о чем уже говорили раньше - о системе координат. Нетрудно догадаться, что вся эта история с координатами нужна, в основном, именно для партий. Партии могут передвигаться, появляться, пропадать... Неспокойные это ребята, эти партии. На месте сидеть очень не любят. А чтобы не терять этих бегунов из виду и отслеживать и направлять все их перемещения как раз и используются координаты.
Поведение партий. Параметр координат есть у любой партии. Даже у статических, таких как города, замки и деревни. Но интереснее изучить партии двигающиеся, такие как отряды лордов, разбойников и т. п. Для чего конкретно могут использоваться координаты в данном случае?
Проверка расстояния. Координаты - единственный способ отследить, насколько далеко друг от друга расположены две данные партии. На проверке расстояния строится практически все поведение партий: таким образом, проверяется, видят ли друг друга данные партии, встретились ли они и т. д.
Выбор пути. Любая карта - это
граф.
Граф - В математической теории графов и информатике, граф — это совокупность непустого множества вершин и множества пар вершин (связей между вершинами).
Объекты представляются как вершины, или узлы графа, а связи — как дуги, или рёбра. Для разных областей применения виды графов могут различаться направленностью, ограничениями на количество связей и дополнительными данными о вершинах или рёбрах.
Многие структуры, представляющие практический интерес в математике и информатике, могут быть представлены графами. Объекты представляются как вершины, или узлы графа, а связи — как дуги, или рёбра. Для разных областей применения виды графов могут различаться направленностью, ограничениями на количество связей и дополнительными данными о вершинах или рёбрах. Т.е. это определённая графическая схема. Где вершины - это пункт назначения, а рёбра - это путь к ним.
И наша глобальная карта не исключение. Вершинами можно назвать все партии - и статические, и динамические, ребрами - прямые пути, соединяющие их. И вот по этим ребрам и двигаются все партии. Все, без исключения. Даже партия игрока движется к указанной цели (даже если это не партия, а просто точка на карте) по кратчайшему пути. Почему партия игрока может ходить к случайно выбранной точке, спросите вы? Все довольно просто - кроме вышеперечисленных у графа карты есть еще одна вершина - точка цели игрока. Это такая же вершина, как и любая партия, и к ней также проводятся ребра. М-да... Понимаю, что объяснить это непросто, а понять еще сложнее, но вы все-таки попробуйте. На самом деле все довольно просто и очевидно. Все партии двигаются по кратчайшим путям, представляющим собой отрезки прямых. Или ломаные, составленные из нескольких отрезков, в случаи, если на пути встречается препятствие, которое нужно обогнуть. Любую прямую на координатной плоскости можно описать одним линейным уравнением - это известно любому школьнику. Отрезок, соответственно, тоже. И именно так и задаются пути партий - линейными кусочно-заданными функциями, описывающими отрезки, ведущие от точки начала движения к точке конца. И как раз здесь-то без координат не обойтись вообще никак. По понятным причинам. Поэтому без координат было бы невозможно в принципе движение партий.
Патрулирование. Патрулирование приведено как пример движения партии следующего вида: задается какой-либо один конкретный объект. Пока неважно как задается, пусть хоть с помощью ID. И нам нужно обеспечить, чтобы партия постоянно двигалась в окрестностях этого объекта, не удаляясь от него на расстояние, больше заданного. Очевидно, что для этого на необходимо мысленно очертить круг с центром в искомом объекте и радиусом, равным данному расстоянию, и для движения партии все время выбирать случайную координату внутри его. Так, все-таки промелькнуло слово «координата», ну да ладно. Думаю, вы и сами догадались, что выполнить подобную задачу без координат невозможно. А с координатами это делается проще простого - просто нужно выбирать случайную точку так, чтобы расстояние от нее до центра было меньше или равно заданному расстоянию.
Да, а вы как думали? Это внешне игра выглядит так просто и красиво. За всеми этими удобностями и красивостями на самом деле стоит наисуровейший математический аппарат, и это еще отнюдь не самое сложное. Но моддеру, со всем этим, дела иметь практически не придется. Это все делает движок игры, к которому моддер отношения не имеет. Поэтому успокойтесь и вздохните глубже — все очень просто, всё, что вам нужно - это только задавать координаты, радиусы и поведение, остальное будет делать движок.