Библиотека сайта rus-linux.net
Фреймворк Thousand Parsec
Оригинал: "Thousand Parsec", глава из книги "The Architecture of Open Source Applications"Авторы: Alan Laudicina and Aaron Mavrinac
Перевод: Н.Ромоданов
Перевод был сделан в соответствие с лицензией Creative Commons. С русским вариантом лицензии можно ознакомиться здесь.
21.1. Анатомия звездной империи Star Empire
Чтобы познакомить с тем, что составляет универсум Thousand Parsec, имеет смысл сначала кратко рассказать об игре. Для этого мы рассмотрим набор правил Missile and Torpedo Wars (Ракетные и торпедные войны), второй важный набор правил проекта, в котором используется большинства основных функций текущей версии основного протокола Thousand Parsec. Некоторые используемые здесь термины еще не знакомы; для того, чтобы все встало на свои места, в оставшейся части этого раздела будут приведены их объяснения.
Missile and Torpedo Wars (Ракетные и торпедные войны) является расширенным набором правил в том смысле, что в нем реализованы все методы, имеющиеся во фреймворке Thousand Parsec. На момент написания статьи, это единственный набор правил, в котором это сделано, и этот набор правил быстро расширяется с тем, чтобы стать более полноценной и развлекательной игрой.
Когда устанавливается соединение с сервером Thousand Parsec, клиентская программа запрашивает с сервера список игровых объектов и переходит к загрузке всего каталога. В этом каталоге находятся все объекты, форумы, сообщения, категории, модели, компоненты, свойства, игроки и ресурсы, определяющие состояние игры и которые подробно описываются в данном разделе. Хотя может показаться, что этой информации слишком много с тем, чтобы клиентская программа могла справиться с ней в начале игры, а также в конце каждого хода, эта информация является для игры абсолютно необходимой. Как только эта информация будет загружена, что обычно занимает порядка нескольких секунд, в клиентской программе теперь будет все, что нужно, чтобы преобразовать эту информацию в свое собственное представление универсума игры.
При первом подключении к серверу случайным образом генерируется Планета, которая определяется как «домашняя Планета» нового игрока, и на ней автоматически создаются две Флотилии. Каждая Флотилия по умолчанию состоит из двух Кораблей-разведчиков, состоящих из разведывательной капсулы с ракетной пусковой установкой Alpha. Поскольку боеприпасов еще нет, то такая Флотилия, созданная по умолчанию, еще не может вести бой с другой Флотилией или с Планетой; это по сути то, где зарыта собака.
В этот момент для игрока очень важно начать оснащение Флотилии оружием. Это достигается при помощи создания распоряжения на сборку оружия Build Weapon order, а затем с помощью распоряжения на загрузку вооружения Load Armament order отгрузки готовой продукции для целевой Флотилии. Распоряжение на сборку оружия преобразует ресурсы Планеты, количество которых и их пропорциональное соотношение установлено для каждой Планеты случайным образом, в готовый продукт: в боеприпасы, которые создаются из ресурсов на поверхности Планеты. Затем распоряжение на загрузку вооружения перенаправляет это созданное вооружение для ожидающей Флотилии.
После того, как будут использованы легкодоступные ресурсы, находящиеся на поверхности Планеты, для того, чтобы получить их, еще потребуется их добыча в шахтах. Ресурсы бывают в двух различных состояниях: извлекаемые и неизвлекаемые. При помощи передачи распоряжения на Планету на добычу ресурсов в шахтах (Mine order), извлекаемые ресурсы могут в течение достаточно длительного времени преобразовываться в поверхностные ресурсы, которые затем могут быть использованы для производства.
21.1.1. Объекты
В универсуме Thousand Parsec каждая физическая вещь является объектом. На самом деле, сам универсум также является объектом. Такая конструкция позволяет иметь практически неограниченный набор элементов в игре, оставаясь при этом простой для набора правил, для которого нужны только несколько типов объектов. На верхнем уровне, где добавляются новые типы объектов, каждый объект может хранить некоторую свою собственную информацию, которую можно пересылать и использовать через протокол Thousand Parsec. В настоящее время по умолчанию предоставлены пять основных встроенных типов объектов: Вселенная (Universe), Галактика (Galaxy), Звездная система (Star System), Планета (Planet) и Флотилия (Fleet).
Вселенная является в игре Thousand Parsec объектом верхнего уровня и она всегда доступна для всех игроков. Хотя объект Вселенная, на самом деле, сильно не влияет на управление игрой, в нем хранится очень важная информация: номер текущего шага. Номер шага, также известный на жаргоне Thousand Parsec как "год", после завершения каждого хода увеличивается, естественно, на единицу. Он хранится в виде беззнакового 32-разрядного целого числа, что позволяет запускать игры вплоть до 4294967295 года. Авторы, на сегодняшний день, не видели, чтобы процесс игры заходил так далеко, хотя, в теории, это не исключено.
Галактика является контейнером для ряда более уточненных объектов - Звездных систем, Планет и Флотилий и не предоставляет никакой дополнительной информации. В игре может существовать большое количество Галактик, причем каждая из них является подчастью Вселенной.
Как и два предыдущих объекта, Звездная система является, прежде всего, контейнером для объектов следующего более низкого уровня. Но объект Звездная система является первым уровнем объектов, который в клиенте представлен графически. Эти объекты могут содержать в себе Планеты и Флотилии (по крайней мере, временно).
Планета является большим небесным телом, которое может быть заселено и может иметь шахты для добычи ресурсов, производственные мощности, наземное вооружение и многое другое. Планеты являются первым уровнем объектов, которые могут принадлежать игроку; владение Планетой является достижением и этого добиться нелегко, а отсутствие во владении каких-либо Планет является в наборе правил типичным условием провозгласить поражение игрока. Объект Планета имеет относительно большой объем сохраняемых данных, среди которых есть следующее:
- Идентификатор игрока владельца Планеты (или -1, если Планета никому не принадлежит).
- Список ресурсов Планеты, содержащий идентификатор ресурса (тип) и количество этого ресурса на Планете на ее поверхности, количество, которое можно добыть в шахтах, и количество недоступных ресурсов этого типа.
Встроенные объекты, перечисленные выше, представляют собой хорошую базу для многих наборов правил, соответствующих традиционной формуле игр космических стратегий жанра 4X. Естественно, что в соответствие с принципами инженерии хорошего программного обеспечения, внутри набора правил классы объектов можно расширять. Таким образом, разработчик набора правил имеет возможность создавать новые типы объектов или хранить в существующих типах объектов дополнительную информацию, соответствующую тому, что требуется в наборах правил, т.е. предоставляется возможность фактически неограниченного расширения физических объектов, имеющихся в игре.
21.1.2. Распоряжения
В соответствии с каждым набором правил, распоряжения могут направляться как объектам Флотилия, так и объектам Планета. Хотя главный сервер не поставляется с какими-либо типами распоряжений, определяемыми по умолчанию, они как раз являются существенной частью основы игры. В зависимости от характера набора правил, распоряжения могут быть использованы для выполнения практически любой задачи. В духе жанра 4X есть несколько стандартных распоряжений, которые реализованы в большинстве наборов правил: это следующие распоряжения — Переместиться (Move), Перехватить (Intercept), Построить (Build), Колонизировать (Colonize), Добывать (Mine) и Атаковать (Attack).
Чтобы выполнить первый императив (исследовать) жанра 4X, нужно иметь возможность перемещаться по карте Вселенной. Это обычно достигается с помощью распоряжения Переместиться, которое передается объекту Флотилия. В гибком и расширяемом по духу фреймворке Thousand Parsec распоряжение Переместиться может быть реализовано по-разному в зависимости от природы набора правил. В наборах правил Minisec и Missile and Torpedo Wars, распоряжение Переместиться обычно в качестве параметра использует точку в трехмерном пространстве. На стороне сервера вычисляется расчетное время прибытия и клиентской программе отсылается количество требуемых шагов. Распоряжение Переместиться также действует как псевдо-распоряжение Атаковать в тех наборах правил, где не реализована командная работа. Например, перемещение к точке, которую занимает вражеская Флотилия, в обоих наборах правил Minisec и Missile and Torpedo Wars почти наверняка означает, что затем последует период интенсивных боевых действий. В некоторых наборах правил, в которых поддерживается распоряжение Переместиться, применяется другая параметризация (т.е. не используются точки трехмерного пространства). Например, в наборе правил Risk допускается только одношаговый переход к Планетам, соединенных между собой "туннелем".
Распоряжение Перехватить обычно отправляется объекту Флотилия, что позволяет встретиться в космосе с другой Флотилией (обычно вражеской). Это распоряжение похоже на распоряжение Переместиться, но поскольку во время, пока выполняется шаг игры, два объекта могут двигаться в разных направлениях, невозможно, указав только координаты в пространстве, встретиться непосредственно с другой Флотилией, поэтому необходим другой тип распоряжения. Эту проблему решает распоряжение Перехватить и его можно использовать для уничтожения неприятельской Флотилии в глубоком космосе или для того, чтобы задержать предстоящую атаку в момент кризиса.
Распоряжение Построить помогает выполнить два императива жанра 4X — развивать и эксплуатировать. Очевидным средством экспансии во Вселенной является создание большого количества Флотилий и затем Перемещения их вдаль и вширь. Распоряжение на Постройку, как правило, направляется объектам Планета и часто ограничивается количеством ресурсов, которые есть на Планете, и тем, как они используются. Если игроку повезло иметь домашнюю Планету, достаточно богатую ресурсами, то этот игрок может при Постройке кораблей достаточно рано в игре получить преимущество.
Точно также, как распоряжение Построить, распоряжение Колонизировать помогает выполнять императивы развивать и эксплуатировать. Распоряжение Колонизировать, почти всегда добавляемое к объектам Флотилия, позволяет игроку присвоить себе ничейные Планеты. Это помогает расширять контроль над Планетами по всей Вселенной.
Распоряжение Добывать ресурсы в шахтах воплощает в себе императив эксплуатировать. Это распоряжение, как правило, направляемое объектам Планета и другим небесным телам, позволяет игроку добывать неиспользованные ресурсы, которые не сразу доступны на поверхности. В результате эти ресурсы переносятся на поверхность, что позволяет в дальнейшем использовать их для построения Флотилий и, в конечном, итоге расширять экспансию игрока во Вселенной.
Распоряжение Атаковать, реализованное в некоторых наборах правил, позволяет игроку явно инициировать бой с Флотилией или Планетой противника, выполняя тем самым последний императив жанра 4X (уничтожить). В наборах правил, допускающих командную игру, команде важно иметь различные варианты распоряжений Атаковать (в отличие от простого использования распоряжений Переместиться и Перехватить при неявной атаки целей) с тем, чтобы избежать огня по дружественным игрокам или иметь возможность координировать совместную атаку.
Поскольку для фреймворка Thousand Parsec необходимы разработчики наборов правил, которые определяют свои собственные типы распоряжений, можно, и даже желательно, мыслить нестандартно и создавать свои собственные распоряжения, которых еще нигде нет. Возможность добавлять дополнительные данные к любому объекту позволяет разработчикам делать со своими типами распоряжений очень интересные вещи.
21.1.3. Ресурсы
Ресурсы являются дополнительными элементами данных, которые упакованы в объекты игры. Широко используемые, особенно в объектах Планета, ресурсы позволяют легко расширять наборы правил. Как и со многими другими проектными решениями, применяемыми в Thousand Parsec, расширяемость была движущим фактором при добавлении понятия ресурсы.
Хотя ресурсы, как правило, добавляются разработчиками набора правил, есть один ресурс, который можно использовать во фреймворке везде: ресурс Домашняя Планета (Home Planet), который используется для идентификации родной Планеты игрока.
Согласно практике использования фреймворка Thousand Parsec, ресурсы, как правило, используются для представления того, что может быть преобразовано в некоторый тип объекта. Например, в игре Minisec реализован ресурс Части корабля (Ship Parts), количественное значение которого случайным образом присваивается каждому объекту Планета во Вселенной. Когда одна из таких Планет колонизирована, вы можете с помощью распоряжения Построить преобразовать такой ресурс в реально действующие Флотилии.
В игре Missile and Torpedo Wars, пожалуй, самое широкое использование ресурсов среди все наборов правил, имеющихся на сегодняшний день. Это первый набор правил, где вооружение разрешено перемещать, что означает, что его можно добавлять на корабль с Планеты, а также удалить из корабля и добавлять обратно на Планету. Чтобы это можно было использовать, в игре для каждого вида оружия, созданного в игре, создается тип ресурсов. В результате на кораблях можно идентифицировать тип вооружения по его ресурсу, и перемешать вооружение по всей Вселенной. В Missile and Torpedo Wars с помощью ресурса Завод (Factorу), назначенного каждой Планете, также отслеживается размещение заводов (производственные мощности Планет).
21.1.4. Модели
В фреймворке Thousand Parsec, как вооружение, так и корабли могут состоять из различных компонентов. Эти компоненты объединяются с тем, чтобы сформировать основу Модели (Design) - прототипа чего-нибудь такого, что можно построить и использовать в игре. Когда создается набор правил, разработчик практически сразу должен принять немедленное решение: должен ли набор правил позволять динамически создавать модели вооружения и кораблей, или просто использовать список предопределенных моделей. С одной стороны, игры с использованием готовых моделей будет легче развивать и в них легче оценивать баланс ресурсов, но, с другой стороны, динамическое создание моделей добавляет в игру новый уровень сложности, новые проблемы и больше удовольствия.
Создаваемые пользователями модели позволяют сделать игру более усовершенствованной. Поскольку пользователи должны опираться на стратегии при разработке своих собственных кораблей и их вооружения, в игру добавляется пласт вариабельности, который может помочь еще одним способом смягчить большие преимущества, получаемые игроком благодаря удачным стечениям обстоятельств (например, при распределении Планет) или в результате других аспектов игровой стратегии. Управление этими моделями осуществляется в соответствии с вполне конкретными для каждого набора правил правилами, определяемыми для каждого компонента и записываемыми на языке компонентов Thousand Parsec Component Language (языке TPCL, который описан далее в этой главе). Получается так, что для реализации моделей вооружения и кораблей со стороны разработчиков не требуется дополнительного программирования каких-либо функций; достаточно настройки некоторых простых правил, которые для каждого компонента имеются в наборе правил.
Без тщательного планирования и надлежащего баланса возможностей, большое преимущество от использования своих собственных моделей может оказаться гибельным. На более поздних стадиях игры, на разработку новых типов оружия и кораблей при их создании может затрачиваться огромное количество времени. Также проблемы могут быть связаны с отсутствием достаточного опыта, необходимого на стороне клиентской программы для манипуляциями с моделями. Несмотря на то, что использование моделей может быть неотъемлемой частью одной игры, и, одновременно, не иметь никакого отношения к другой игре, значительным препятствием может оказаться добавление в клиентские программы окон, позволяющих обращаться к моделям. В клиенте tpclient-pywx, который является наиболее полный клиентом фреймворка Thousand Parsec, в настоящее время есть лаунчер этого окна, расположенный в сравнительно отдаленном месте - в подменю панели меню (который, в остальных случаях, в игре используется редко).
Функциональность Моделей реализована так, что они легко доступны для разработчиков наборов правил, что позволяет расширять игры практически до неограниченного уровня сложности. Во многих из существующих наборов правил разрешается использовать только предопределенные Модели. Однако, в Missile and Torpedo Wars можно из различных компонентов полностью создавать Модели вооружения и кораблей.
Далее: 21.2. Протокол Thousand Parsec