Примечание: таким цветом выделены
до конца не выверенные части
Язык программирования
В качестве языка программирования выбран Python
как наиболее быстро развивающийся, удобный в программировании, имеющий
систему байт-кода и позволяющий встраивать интерпритатор в приложения.
Недостатком такого подхода является меньшая
производительность, нежели в собственноручном специализированном языке,
но такой выбор позволит существенно сократить время на разработку проекта.
В будущем возможно написание своего компилятора и виртуальной машины.
Общие положения
Скрипты поведения юнитов и соединений обьеденены
в модули. Модуль является самостоятельным обьектом в окружении игры
и может сохранятся от игры к игре, передаваться между игроками. Модуль
распростряняется как в исходных кодах, так и в байт-коде (если разработчик
хочет скрыть свое ноу-хау ;)
При конструировании юнита игрок указывает модуль,
который будет управлять юнитом после окончания производства. В процессе
игры это соответствие можно поменять. Если модуль не указан, то юнит
управляется базовым классом.
Все внешние для юнита игровые события (попадание
в корпус, невозможность движения, разрядка аккумуляторов, окончание
загрузки груза, и т.п - см. список) передаются
посредствои механизма исключений в модуль юнита. Так же возможно описание
своих событий для обмена информацией между юнитами / соединениями.
Сущуствуют два типа скриптов: алгоритмы поведения
и обработчики событий.
Алгоритм поведения заведует основной линией
поведения юнита в данный момент времени и, по существу, является командой
игрока юниту. Алгоритм поведения оформлен как отдельный класс со специализированной
функцией unit.действие(параметры), окончание которой является окончанием
действия.
Обработчик события позволяет юниту понимать
и реагировать на событие. Обработчик события свой для каждого алгоритма
поведения и вызывается только при наступлении события.
Типы данных
- Стандатные питоновские
- Координата. Существует операция вычитания координат, результат -
вектор.
- Вектор (графический). Существуют операции сложения и вычитания векторов.
- Обьект. Ссылка на обьект (остов либо юнит).
- Юнит. Ссылка на юнит.
Базовый класс Object
От него порождены все остальные классы. Иерархия классов
представлена здесь
Базовый класс Unit
Класс Unit является базовым для всех классов модуля
юнита. Порожден от класса Object. Реализован в движке игры. Содержит
свойства, отвечающие за состояние юнита и методы управления юнитом.
Если блок в конструкции юнита не предусмотрен, то соответствующие свойства
/ методы недоступны (при обращении возникает исключение).
Свойства класса Unit (только чтение, где не указано
иное):
- unit.тип - тип конструкции юнита
- unit.координата - текущее положение (Х,У)
- unit.направление - абсолютный угол поворота корпуса юнита
- unit.скорость - текущая скорость юнита
- unit.реактор
- unit.реактор.активен (чтение/запись) - вкл / выкл
- unit.аккумулятор
- unit.аккумулятор.заряд - текущий заряд аккумулятора в МДж
- unit.радар
- unit.радар.активен (чтение/запись) - вкл / выкл
- unit.масс_анализатор unit.радар.сканировать_ракеты()
- unit.масс_анализатор.активен (чтение/запись) - вкл / выкл
- unit.броня
- unit.броня.величена - остаток брони в тоннах
- unit.генератор_ЗП
- unit.генератор_ЗП.статус (чтение/запись) - вкл / выкл
- unit.генератор_ЗП.величена - остаток защитного поля в МДж
- unit.пушка
- unit.пушка.направление - абсолютный угол поворота станины
- unit.пушка.направляющая
- unit.пушка.направляющая[номер].заряд - текущий заряд пушки
- unit.пушка.направляющая[номер].готов - готовность к стрельбе
(индикация полного заряда)
- unit.разрядник
- unit.разрядник.зяряд - текущий заряд
- unit.разрядник.готов - готовность к стрельбе (индикация полного
заряда)
- unit.ракетница
- unit.ракетница.направление - абсолютный угол поворота станины
- unit.ракетница.направляющая
- unit.ракетница.направляющая[номер].зяряд - текущий заряд
- unit.ракетница.направляющая[номер].готов - готовность к
стрельбе (индикация полного заряда)
- unit.добывалка
- unit.добывалка.активен (чтение/запись) - вкл / выкл
- unit.добывалка.руда - есть ли руда под буром добывалки
- unit.кузов
- unit.кузов.груз
- unit.кузов.груз.статус - есть / нет
- unit.кузов.груз.тип - тип груза (руда, остоа юнит)
- unit.кузов.груз.масса - масса груза
- unit.ремонтник
- unit.ремонтник.активен (чтение/запись) - вкл / выкл
- unit.телепорт
- unit.телепорт.активен (чтение/запись) - вкл / выкл
- unit.телепорт.состояние - походное / разворачивание / стационароное
/ передача / сворачивание
- unit.телепорт.свободен - в области входа нет юнитов (может принимать
передаваемый обьект)
- unit.телепорт.цель - ссылка на юнит, несущий парный телепорт
- unit.переработчик
- unit.переработчик.активен (чтение/запись) - перерабатывает /
простаивает
- unit.прозводственник
- unit.прозводственник.активен (чтение/запись) - производит /
простаивает
- unit.прозводственник.тип (чтение/запись) - тип текущей конструкции
производимого юнита
- unit.прозводственник.осталось - время в сек до конца производства
- unit.исследователь
- unit.исследователь.активен (чтение/запись) - исследует / простаивает
- unit.переработчик.тип (чтение/запись) - исследуемая технология
- unit.переработчик.осталось - время в сек до конца исследования
Атомарные (непереопределеяемые, системные)
методы класса Unit:
- unit.поворот(угол) - поворот корпуса на заданный угол
- unit.двигаться(скорость-число) - двигаться вперед (назад) с заданной
скоростью
- unit.двигаться(скорость-вектор) - двигаться от текущей точки по
вектору скорости (сначала разворот, потом движение)
- unit.стоп() - немедленно остановится
- unit.аккумулятор
- unit.аккумулятор.можно_зарядиться(юнит) - проверка возможности
зарядки от юнита (юнит должен находится в непосредственной близости
от юнита)
- unit.аккумулятор.зарядиться(юнит) - зарядка от юнита
- unit.радар
- unit.радар.сканировать(тип обьектов) - просканировать область
видимости радара и выдать список найденых обьектов. Тип обьекта
может быт: все, свои юниты, вражеские юниты, дружественные юниты,
остовы, свои ракеты, вражеские ракеты
- unit.радар.ближайший(тип обьектов, направление, расстояние)
- просканировать в указаном направлениии и на расстоянии не большем
указанного и выдать указательна ближайший обьект
- unit.пушка
- unit.пушка.фиксировать(обьект) - захватить и следить за обьектом
(станина всегда направлена на обьект)
- unit.пушка.прямо() - снять фиксацию и повернуть станину по ходу
корпуса
- unit.пушка.поворот(угол) - поворот станины на заданный угол
- unit.пушка.можно_выстрелить(обьект) - проверка досягаемости
обьекта (он должен находится в створе генератора стабилизирующего
поля и на расстоянии выстрела)
- unit.пушка.направляющая[номер].выстрел(обьект) - стрелять по
указанному обьекту вне зависимости от полноты текущего заряда
- unit.разрядник
- unit.разрядник.можно_выстрелить(обьект) - проверка досягаемости
обьекта (обьект должен находится в передней полусфере юнита и
на минимальном расстоянии
от юнита)
- unit.разрядник.выстрел(обьект) - стрелять по указанному обьекту
вне зависимости от полноты текущего заряда
- unit.ракетница
- unit.ракетница.фиксировать(обьект) - захватить и следить за
обьектом (станина всегда направлена на обьект)
- unit.ракетница.прямо() - снять фиксацию и повернуть станину
по ходу корпуса
- unit.ракетница.поворот(угол) -поворот станины на заданный угол
- unit.ракетница.можно_выстрелить(обьект) - проверка досягаемости
обьекта (обьект должен находится в поле действия радара юнита)
- unit.ракетница.направляющая[номер].выстрел(обьект) - стрелять
по указанному обьекту вне зависимости от полноты текущего заряда
- unit.кузов
- unit.кузов.можно_загрузить(обьект) - проверка возможности загрузки
обьекта в кузов (хватает грузоподьемности и находится на минимальном
расстоянии от юнита в задней полусфере)
- unit.кузов.загрузить(обьект) - загрузить обьект
- unit.кузов.выгрузить() - выгрузить всё содержимое кузова
- unit.кузов.можно_обменять(юнит) - проверка возможности обмены
груза с юнитом (юнит должен находиться на минимальном
расстоянии от юнита в задней полусфере)
- unit.кузов.передать(юнит) - передать содержимое кузова юниту
- unit.кузов.принять(юнит) - принять содержимое кузова юнита
- unit.ремонтник
- unit.ремонтник.можно_чинить(юнит) - проверка возможности починки
юнита (юнит должен находится в передней полусфере и на минимальном
расстоянии)
- unit.ремонтник.чинить(юнит) - чинить юнит
- unit.ремонтник.стоп() - остановить текущий ремонт
- unit.телепорт
- unit.телепорт.назначить(юнит) - назначить парный телепорт (куда
будут доставляться юниты, целевой юнит должен иметь телепорт)
- unit.телепорт.можно_передать(обьект) - проверка возможности
передачи обьекта (обьект должен находится на области входа)
- unit.телепорт.передать(обьект) - передать обьект на парный телепорт
Переопределяемые методы класса Unit:
- unit.инициализация() - абстрактный. Вызывается после создания юнита.
- unit.разрушение() - абстрактный. Вызывается перед окончательным
уничтожением юнита.
- unit.двигаться(точка_на_карте) - двигаться в указанную точку по
стандартоному алгоритму поиска пути. Игрок может переопределить этот
метод для реализации своих алгоритмов движения.
- unit.обработка_исключения() - Переопределяется для обработки исключений.
- unit.действие(параметры) - абстрактный. Реализация конкретного алгоритма
поведения юнита. Параметром может быть точка на карте (например для
движения) или обьект (для атаки, охраны и т.п.) Основное место нахождения
потока управления. Для передачи потока управления движку игры используются
системные вызовы (sleep и т.п.) или атомарные методы класса Unit.
Так же действует система ограничения стоимости
выполнения
Структура модуля юнита
Модуль содержит описание основного класса юнита (далее
ОК), порожденного от базового класа Unit, и описание классов алгоритмов
поведения (далее КАП), наследуемых от ОК.
ОК отвечает за хранение общих для всех КАП данных
и методов. В ОК можно хранить данные и реализовывать методы, общие для
всех КАП. Метод unit.действие() в ОК реализует алгоритм умолчательного
поведения юнита (в моменты между выполнением КАП). Должен иметь имя
<имя модуля>_base
КАП реализуют одно из возможных поведений юнита переопределением
метода unit.действие(). Должны иметь имя <имя модуля>_<команда>
Базовый класс Formation
Класс Formation является базовым для всех классов
модуля соединения. Порожден от класса Object. Содержит свойства / методы,
отвечающие за состояние соединения (оценивающие местность, своих "солдат",
солдат противника / союзника и т.д.) и методы управления соединением.
Свойства класса (только чтение, где не указано иное):
- formation.список_типов_подчиненных_юнитов - список типов конструкций
всех юнитов, которые должны быть в соединении.
- formation.список_подчиненных_юнитов - список всех юнитов, ассоциированных
с этим соединением
- formation.наступательная_способность - сумма (по всем юнитам соединения)
отношений мощности оружия к скорости его перезарядки. Служит для определения
средней интенсивности атаки, которую может производить соединение.
- formation.оборонительная_способность - сумма (по всем юнитам соединения)
скоростей восстановления защитных полей. Служит для определения интенсивности
атаки, которую (в среднем) может выдержать соединение.
- (здесь ваши предложения)
Атомарные (непереопределеяемые системные) методы
класса Formation:
- formation.зарядка_аккумуляторов() - доля заряженности (от 0 до 1)
всех аккумуляторов соединения
- formation.оборонительная_емкость() - сумма (по всем юнитам соединения)
текущих эффективных емкостей защитных полей и текущих эффективных
брони
- formation.доля_оборонительной_емкости() - отношение formation.оборонительная_емкость()
к сумме начальных эффективных емкостей защитных полей и начальных
эффективных брони
- (здесь ваши предложения)
Переопределяемые методы класса Formation:
- formation.инициализация() - абстрактный. Вызывается после создания
юнита.
- formation.разрушение() - абстрактный. Вызывается перед окончательным
уничтожением юнита.
- formation.двигаться(точка_на_карте) - двигаться в указанную точку
(по умолчанию - вызов всех unit.двигаться(точка_на_карте) соединения).
Игрок может переопределить этот метод для реализации своих алгоритмов
движения.
- formation.обработка_исключения() - Переопределяется для обработки
исключений.
- formation.действие(параметры) - абстрактный. Реализация алгоритма
поведения соединения. Параметром может быть точка на карте (например
для движения) или обьект (для атаки, охраны и т.п.) Основное место
нахождения потока управления. Для передачи потока управления движку
игры используются системные вызовы (sleep и т.п.) или атомарные методы
класса Formation. Так же действует система ограничения стоимости
выполнения
Структура модуля соединения
Структура модуля соединения очень похожа на структуру
модуля юнита (в идеале приближается к нему).
Модуль содержит описание основного класса юнита (далее
ОК), порожденного от базового класа Formation, и описание классов алгоритмов
поведения (далее КАП), наследуемых от основного класса.
ОК отвечает за хранение общих для всех КАП данных
и методов. В ОК можно хранить данные и реализовывать методы, общие для
всех КАП. Метод formation.действие() в ОК реализует алгоритм общего
поведения соединения (в моменты между выполнением КАП). Должен иметь
имя <имя модуля>_base
КАП реализуют одно из возможных поведений соединения
переопределением метода unit.действие(). Должны иметь имя <имя модуля>_<команда>
Базовый класс Army
Класс Army является базовым для всех классов модуля
армии. Порожден от класса Object. Содержит свойства / методы, отвечающие
за состояние армии и методы управления армией.
Свойства класса (только чтение, где не указано иное):
- army.список_всех_объектов - список всех объектов (соединений и юнитов)
армии
- army.кол-во ресурса - доступный для производства ресурс
- army.перерабатывающая мощность - суммарная скорость переработки
концентрата
- army.производственная мощность - суммарная скорость производства
- army.исследовательская мощность - суммарная скорость исследования
- (здесь ваши предложения)
Атомарные (непереопределеяемые системные) методы
класса Army:
- army.еще не продумал ;)
- (здесь ваши предложения)
Переопределяемые методы класса Army:
- army.инициализация() - абстрактный. Вызывается после создания армии.
- army.разрушение() - абстрактный. Вызывается перед окончательным
уничтожением армии.
- army.обработка_исключения() - Переопределяется для обработки исключений.
- army.действие(параметры) - абстрактный. Реализация алгоритма поведения
армии. Основное место нахождения потока управления. Для передачи потока
управления движку игры используются системные вызовы (sleep и т.п.)
или атомарные методы класса Army. Так же действует система ограничения
стоимости выполнения
- (здесь ваши предложения)
Структура модуля армии
(До конца не продуман, пока
калька с класса юнита)
Модуль содержит описание основного класса армии (далее
ОК), порожденного от базового класа Army, и описание классов алгоритмов
поведения (далее КАП), наследуемых от ОК.
ОК отвечает за хранение общих для всех КАП данных
и методов. В ОК можно хранить данные и реализовывать методы, общие для
всех КАП. Метод Army.действие() в ОК реализует алгоритм общего поведения
армии (в моменты между выполнением КАП). Должен иметь имя <имя модуля>_base
КАП реализуют одно из возможных поведений армии переопределением
метода Army.действие(). Должны иметь имя <имя модуля>_<команда>
Исключения
Исключения служат для индикации событий в виртуальном
мире игры. Передаются в следующей последовательности (если метод не
обработал исключение, оно передается далее по списку):
- в метод текущего класса модуля юнита, при выполнении
которого произошло исключение.
- в специальный метод обработки исключений текущего класса
модуля юнита.
- в специальный метод обработки исключений основного класса
модуля юнита.
- в специальный метод обработки исключений текущего класса
модуля соединения, которому принадлежит юнит, с дополнительным
параметром - ссылкой на юнит
- в специальный метод обработки исключений основного класса
модуля соединения, которому принадлежит юнит, с дополнительным
параметром - ссылкой на юнит
- в специальный метод обработки исключений текущего класса
модуля армии, с дополнительным параметром - ссылкой на юнит
- в специальный метод обработки исключений основного класса
модуля армии, с дополнительным параметром - ссылкой на юнит
- пользователю в читабельной форме
Исключения могут иметь параметры, детализирующие их. Далее следует
список всех исключений:
- нет такого блока (тип блока)
- попадание в юнит (выстреливший юнит)
- препятствие по ходу движения юнита (обьект)
- нехватка энергии для действия (код_действия, кол-во_недостающей_энергии)
- новый обьект в зоне видимости радара (обьект)
- защитное поле опустошено
- защитное поле восстановлено
- невозможно включить защитное поле - если юнит находится
под полем другого юнита
- юнит разрушен
- разрядка аккумуляторов
- окончание зарядки аккумуляторов
- окончание производства
- окончание исследования
- нехватка руды для переработки - если на всей базе
кончилась руда
- нехватка ресурса для производства (кол-во_недостающей_руды)
- нехватка ресурса для исследования (кол-во_недостающей_руды)
- в клетке ИП кончилась руда
- окончание передачи обьекта через телепорт (обьект)
- кузов полон
- кузов пуст
- невозможно погрузить обьект (обьект)
- невозможно добывать руду
- некуда складывать добытую руду (кол-во_недостающего_места)
- невозможно ремонтировать юнит (юнит, код причины) - код
причины может быть: нехватка ресурсов, превышение максимального L>
расстояния между юнитами, нехватка энергии и т.п.
- (здесь ваши предложения)
Стоимость выполнения
Существует ограничение на время выполнения
скрипта в такте: каждому оператору/системному вызову присваивается некая
оценочная стоимость (например, арифметическая операция - 1, обьединение
строк - 2, вызов функции выдачи всех юнитов в зоне видимости - 100 и
т.д.). В такте программе можно выполнить действий на заранее заданную
сумму (10000, к примеру). Если скрипт не успевает выполниться, то в
следующем такте выполнение начинается с последней выполненной операции.
Максимальния сумма стоимости операций за такт является
опцией игры:10000 - блиц, небольшие программы; 100000 - нормальная игра;
500000 - умные, но тормознутые...
|