Проект ЗЕРКАЛО-44 посвящен стратегической игре, позволяющей
программировать поведение боевых единиц и соединений.
Примечание: курсивом выделены до конца не выверенные части
Мир
Существуют сектора - единичные карты для игр.
Игровое поле сектора (далее ИП) представляет собой
прямоугольник, разбитый на клетки. Максимальный размер ИП 65535 х 65535
клеток. Клетка - единица местоположения, два обьекта не могут занимать
одну и ту же клетку. Каждый обьект занимает одну или больше клеток.
Физический размер клетки - 1х1 метр.
ИП имеет три слоя:
- земля - здесь находятся и двигаются
наземные юниты и здания
- слой движения ракет - здесь двигаются
ракеты, взрываясь при нахождении над / под контуром обьекта
- воздух - здесь двигаются воздушние
юниты (геликоптеры)
Земля имеет проходимость: нулевая (стены, вода, пропасти)
или в долях от единицы для разных видов грунта.
Сектора
Генерятся с помощью специального (на основе псевдослучайных
чисел) алгоритма из одного числа - номера сектора.
Ресурсы
Распределённые: каждая клетка имеет исчерпаемый запас
руды. (Можно сделать ресурсы возобновляемыми: к примеру, на каждой
клетке ресурс востанавливается со скоростью 0.001 т/сек) Существуют
"месторождения" руды - это связанные области клеток, ёмкость
которых на порядок больше обычных. Руда перерабатывается в ресурс на
перерабатывающем заводе. Из 4 т руды получается
1 т ресурса. Руду на завод можно доставить с помощью спецблока-кузова.
Так же можно на заводе перерабатывать в ресурс остовы
от уничтоженых юнитов. Из 2 т остовов получается 1 т ресурса. Остовы
на завод доставляются так же с помощью спецблока-кузова.
При старте игрок получает 1000 т ресурса.
Физическая модель
Единицы измерения - мегаджоули (МДж), тонны (т), метры
(м) и секунды (сек). Ускорений нет (не учитываются).
Ограничение юнита по скорости Vmax = полкорпуса
за такт. Это нужно для непротиворечивого вычисления столкновений.
Столкновения юнитов могут привести к их разрушению,
все зависит от текущих полей столкнувшихся. Алгоритм такой:
- выбираем юнит с наименьшей максимальной
эфф. емкостью поля Eэффективной емкости поля
- вычисляем энергию потери Eпотери
= 0.5 * Eэффективной емкости поля,
- отнимаем Eпотери
из текущих значений энергий полей Eтекущее1 и
Eтекущее2
- если кто-то погиб, то из массы
его остова вычитаем 1 т / МДж *(Eпотери - Eтекущее)
тонн
-
если его остов имеет положительный остаток, то выживший юнит отталкивается
на прежнее место, остов погибшего остается лежать на месте столкновения
-
иначе выживщий занимает желаемую позицию
- иначе оба юнита отталкиваются
на прежние места.
Если юнит сталкивался со строением/остовом,
то Eпотери = 0.1 * Eтекущее и
у строения/остова выжигается 1 т / МДж * Eпотери
тонн брони
- если остов разрушен, то юнит занимает
желаемую позицию
- иначе если юнит остался жив, то
он отталкивается на прежнее место
- иначе его остов отталкивается
на прежнее место
Например, сталкиваются два юнита, у первого макс.
эфф. емкость поля 100 МДж, у второго 80 МДж. При столкновении первый
имел поле в 30 МДж, второй 70 МДж (были попадания и поля не успели восстановится).
Тогда Eпотери = 0.5 * 80 МДж = 40 МДж. То есть
первый погибнет, и у его остова вычтется 1 * (40 - 30) = 10 тонн. У
втрого останется 70 - 40 = 30 МДж энергии поля. Если второй на сл. такте
опять наедет уже на остов первого, то у него отнимется 3 МДж энергии
поля, а остов первого потеряет еще 3 тонны массы.
Время дискретно. Полный такт состоит из стадий:
- расчет детонации ракет / осуществление
выстрелов из пушек
- приращение величин полей / заряда
пушек
- расчет движения юнитов / ракет
(желаемое положение в зав-ти от вектора скорости)
- расчет столкновений (итеративно:
если юнит не уничтожается, но отталкивается, он включается в список
на последующую обработку с новым положением)
- отработка программ роботов (обработка
событий, обработка сообщений, определение вектора движения, поворот
оружия, пуск ракет / запись выстрела пушек)
Юниты
Состоят из набора деталей - корпус, реактор и/или
аккумулятор, генератор защитного поля, радар, оружие: пушка и/или ракетница,
спец. блоки.
Размер юнита (его корпуса) выбирается игроком из допустимого
диапазона
Модель юнита на ИП включает в себя: центр юнита, контур
его корпуса, направление движения, направление пушки, направление ракетницы.
Все клетки, по которым проходит контур корпуса считаются занятыми юнитом.
После уничтожения юнита от него остается остов с массой,
рассчитанной по формуле Мостова = Мюнита
- Рпоследнего удара * 0.1. Остов является непроходимым
препятствием и может быть уничтожен, как и здание. (Можно сделать
время жизни остова - предположим, он горит - для уменьшения захламленности
карты)
Корпус
Несет на себе все остальные детали юнита и имеет несколько
типов. Зависомость грузоподьемности, максимальной скорости и потребления
энергии приведены в таблице:
Тип корпуса |
Мин. размер |
Макс. размер |
Коэффициент грузоподъемности 1 |
Макс. скорость |
Коэфф. потребл. энергии 2 |
Колесный |
5 т
|
300 т
|
0.3
|
5 м/с
|
0.01
|
Шагающий |
2 ногий |
10 т
|
-
|
0.4
|
5 м/с
|
0.015
|
4 ногий |
20 т
|
-
|
0.4
|
10 м/с
|
0.015
|
6 ногий |
30 т
|
-
|
0.4
|
10 м/с
|
0.015
|
Траковый |
20 т
|
-
|
0.5
|
15 м/с
|
0.02
|
Ховер (парящий над землей) |
5 т
|
100 т
|
0.2
|
20 м/с
|
0.03
|
Геликоптер (парящий в воздухе) |
10 т
|
100 т
|
0.1
|
25 м/с
|
0.04
|
прим:
1 -
может нести устройств, К * (массу корпуса)
2
- МДж / сек на тонну ОБЩЕЙ массы
Например, траковый корпус массой 100 т может
нести 50 т устройств, при этом потребляемая корпусом мощность будет
(100 + 50) * 0.02 = 3 МДж / сек
Реактор
Реактор имеет неограниченный срок работоспособности.
Юнит, несущий реактор, может подзаряжать аккумуляторы (своий или на
других юнитах), но для этого он должен быть спректирован с остаточной
мощностью реактора.
Масса реактора от 30 тонн, т.е. может он устанавливаться
только на корпус, размера больше определенного.
На тонну своей массы реактор выдает 1
[МДж /сек] энергии.
Аккумулятор
Аккумулятор накапливает энергию для жизнедеятельности
юнита и может устанавливаться на любой корпус.
На тонну своей массы аккумулятор сохраняет 500
Мдж энергии. То есть аккумулятор массой 10 т имеет емкость 5000 МДж,
что при скорости потребления среднего юнита 5 [МДж /сек]
позволяет ему функционировать 1000 секунд.
Аккумулятор может заряжаться от своего реактора, реактора
другого юнита (при непосредственном контакте) или от зданий базы (тоже
при непосредственном контакте). При зарядке берет не более 20% от своей
емкости (то есть при свободной зарядке - кол-во энергии неограничено
- будет заряжаться 5 сек)
Генератор защитного поля
Генерируемое поле имеет максимальную "эффективную"
емкость - сколько энергии удара поле может поглотить - и скорость восстановления
этого поля.
На тонну своей массы генератор защитного поля берет
0.1 [МДж /сек] энергии.
Эта энергия расходуется на поддержание емкости и восстановление поля:
Ргенератора = Pёмкости
+ Pвосстановления. Соотношение между Pёмкости
и Pвосстановления устанавливается на этапе проектирования
юнита.
Эффективная ёмкость поля равна 10
[1/cек] * Pёмкости. Скорость
восстановления поля равна 0.2 * Pвосстановления.
Радар
"Глаза" юнита, с помощью них юнит видит
окружающую местность. На тонну своей массы радар забирает 3
[МДж /сек]. Дальность действия радара равна 50
[м*cек/МДж] * Pрадара.
Пушка
Стреляет зарядом антипротонов на ограниченную мощностью
стабилизирующего поля дальность. Выстрел происходит мгновенно, т.е.
заряд попадает в цель в том же такте игры, что и выстрел. Пушка может
стрелять в секторе +/- 10 градусов от своего
направления - это позволяет конструкция генератора стабилизирующего
поля.
Пушка может иметь до 3-х стволов, выстрелы с каждого
ствола производятся независимо. Все стволы устанавливаются на станине,
скорость поворота которой равна 3 градуса
/ сек.
На тонну своей массы один ствол пушки забирает 0.6
[МДж /сек] энергии. Эта энергия расходуется на
мощность стабилизирующего поля (т.е. на дальность выстрела), мощность
формирования заряда и на скорость перезарядки: Рствола
= Рстаб.поля + Рформирования
заряда + Рперезарядки. Соотношение между
Рстаб.поля, Рформирования заряда
и Рперезарядки устанавливается на этапе проектирования
юнита.
Дальность выстрела равна 30
[м*сек/МДж] * Рстаб.поля.
Мощность заряда равна 2 [1/сек]
* Рформирования заряда. Скорость перезарядки
равна 0.15 * Рперезарядки
.
Ракетница
Стреляет ракетами на неограниченную дальность.
Ракета самонаводится на цель в области действия радара юнита, за областью
действия летит по прямой. Ракета детонирует при нахождении под/над контуром
юнита-цели, здания-цели или клетки-цели в зоне действия радара и при
при нахождении под/над контуром любого вражеского обьекта вне зоны действия
радара. Ракета летит со скоростью 8 м / с (управляющий вектор - 2 м
/ с) по алгоритму "волк за зайцем" - управляющий вектор всегда
смотрит на цель. При выстреле можно указать расстояние от юнита, на
котором ракета самоликвидируется со взрывом или без. Ракета самоликвидируется
без взрыва через 60 сек полета. Любую ракету можно сбить выстрелом из
пушки мощностью от 1 МДж.
Ракетница может иметь до 3-х напрявляющих, выстрелы
с каждой напрявляющей производятся независимо. Все напрявляющие устанавливаются
на станине, скорость поворота которой равна 1
градус / сек.
На тонну своей массы одна направляющая забирает 0.9
[МДж /сек] энергии. Эта энергия расходуется на
мощность формирования ракеты и на скорость перезарядки: Рнаправляющей
= Рформирования ракеты + Рперезарядки.
Соотношение между Рформирования ракеты и Рперезарядки
устанавливается на этапе проектирования юнита.
Мощность боеголовки ракеты равна 5
* Рформирования ракеты. Скорость перезарядки
равна 0.05 1 / сек * Рперезарядки.
Электроразрядник
Думаю ввести в список оружия некое близкодействующее
оружие. Мощное, но с дальностью в 1-2 метра. Типа электрошока, для моделирования
зелтов / собачек / фаерботов. Название / суть действия нужно продумать
получше.
Можно обойтись и пушкой, но у "разрядника"
придумаем другие параметры мощности / скорости восстановления: типа
мощность = 10 * Рформирования
заряда, скорость перезарядки = 0.5
1 / сек * Рперезарядки.
То есть если подошел, то отколошматит по полной и
быстро ;)
Специальные блоки
Добывалка - модуль который может добывать руду из
грунта. Добыча происходит из клетки над которой находится бур добывалки
(вынесен на нос юнита). На тонну своей массы добывалка забирает 0.3
[МДж /сек] энергии и может добыть 0.5
т / сек руды. Добывалка руду не хранит, руда должна поступать в кузов,
находящийся на юните с добывалкой, или в кузов стоящего вплотную другого
юнита.
Кузов - модуль, который позволяет перевозить мехзародышей,
руду, червей-ремонтников, любой другой юнит, остов уничтоженного юнита.
Работает по принципу ховер подушки, то есть несет груз в магнитной ловушке
за юнитом. На тонну своей массы может поднять 5
тонн груза. На тонну перевозимого груза расходует 0.01
[МДж /сек] энергии. Скорость передачи груза между
кузовами и/или зданиями равна 5 т/сек.
При уничтожении юнита с кузовом весь груз кузова теряется.
Строения
Все здания, за исключением "матки", производятся из
механозародышей (далее мехзародыши). Мехзародыш свой для каждого здания.
Передвигается со скоростью 1.5 м/с. После
разворачивания в здание уничтожается.
Все здания могут передвигаться в особом, походном,
режиме со скоростью 1 м/с. Переключение
походный / эксплуатационный режим осуществляется за 20
сек. В походном режиме здания не могут производить свои основные действия.
У всех зданий накапливающая броня, т.е. каждое попадание
выжигает определенную массу брони: удар оружия в 1Мдж сжигает 0.1 тонну
здания. Здание работоспособно до тех пор, пока у него остается 50% массы.
Если массы менее 50%, здание выключается и не работает до полного уничтожения.
Командный центр - матка
Основное здание армии, при уничтожении игрок проигрывает.
Командный центр производит мехзародышей для всех типов зданий со скоростью
4 т / сек. Имеет собственный реактор, поэтому
в стационарном режиме не потребляет энергии извне, но при производстве
ему необходимо дополнительно 10 МДж / сек. При начале игры несет по
одному типу мехзародыша на борту.
Фабрика юнитов
Производит все юниты. Время производства юнита пропорционально
его массе с коффициентом 0.5 т / сек, т.е.
юнит с массой 100 т будет производится 200 сек ~ 3.5 мин. Стоимость
производства: 2 т ресурса за 1 т готового юнита
Электростанция
Производит энергию для всей базы. Работает на ядерной
энергии, поэтому не требует ресурсов для работы. Работает "по требованию",
т.е. выдает энергии от 0 до 50 МДж / сек в зависимости от нужд базы.
Перерабатывающий завод
Перерабытывает руду, добываемую юнитами со специальными
блоками (добывалками) в ресурс, потребляемый для производства других
юнитов и механозародышей.
Скорость переработки 1
т готового ресурса / сек. Завод может хранить до 1000 т руды.
Исследовательский центр
Повышает уровень технологии (см. раздел Технологии)
Стоимость развития одного уровня технологии - 100
т ресурса, время исследования - 5 мин.
Сводная таблица параметров строений:
Название |
Стоимость / вес мехзародыша 1 |
Кол-во в армии |
Броня |
Скорость постройки |
Потребление энергии, МДж/сек |
При работе |
При простое |
Командный центр - матка |
- |
1 |
7000 т |
- |
-10 |
- |
Электростанция |
400 т / 200 т |
любое |
2000 т |
1 мин |
+50 |
- |
Фабрика юнитов |
800 т / 400 т |
любое |
4000 т |
2 мин |
-20 |
-5 |
Перерабатывающий завод |
600 т / 300 т |
любое |
3000 т |
1.5 мин |
-20 |
-5 |
Исследовательский центр |
600 т / 300 т |
любое |
3000 т |
1.5 мин |
-20 |
-5 |
прим:
1 - стоимость
в тоннах ресурса
Ремонт строений
Ремонтом зданий занимаются спецюниты - черви, 10
штук на здание, вес - 40 т, забирает энергии у электростанций базы 0.1
/ 1 Мдж/сек ( ждущий / рабочий режим).
Червь-ремонтник автоматически восстанавливает 0.1
т брони за сек, забирая при этом 0.2 т
ресурса. Производится фабрикой, после создания автоматически прикрепляется
к фабрике, потом может быть перевезен на другое здание юнитом-грузовиком.
Уничтожается вместе со зданием.
Технологии
Входят как коэффициент-множитель во все соотношения
/ цифры игры, обозначенные красным (растущие)
и синим (уменьшаюшиеся) цветом.
Формула коэффициентов:
для красных K
= 1.5 - (2 / (N + 4)), график
для синих K
= 0.5 + (2 / (N + 4)), график
где N - уровень
технологии, от 0 и выше.
Например, скорость восстановления защитного поля для
нулевого уровня этой технологии 0.1 МДж
/ сек. Коэффициент-можитель - 1. На первом уровне коэффициент будет
1.1, и скорость восстановления защитного поля будет 0.11 МДж / сек,
на втором, соответственно, ~1.33 и ~0.16 и т.д.
Формула выбрана с насыщением, что позволяет каждому
игроку самому решить, до какого уровня развивать технологии.
Юниты / здания автоматически обновляют свои уровни
технологий после завершения исследования.
Язык поведения юнитов
Язык игры должен быть обьектно-ориентированным,
с механизмом сообщений (исключений). С++ подобный, но без всех его наворотов:
нет шаблонов классов, нет наследования классов, упрощен синтаксис. Оно
бы конечно хорошо все это иметь, но интерпритатор будет тормозить. Здесь
как всегда противоречие между универсальностью и скоростью.
Зато есть исключения, как системные, так и задаваемые
пользователем. Исключения можно посылать другому обьекту - в даннм контексте
они будут сообщениями.
Так же естественно есть набор системных классов/функций
(описание надо продумывать). Существует ограничение
на время выполнения программы в такте: каждому оператору/системному
вызову присваивается некая оценочная стоимость (например, арифметическая
операция - 1, обьединение строк - 2, вызов функции выдачи всех юнитов
в зоне видимости - 100) и в такте программе можно выполнить действий
на заранее заданную сумму (10000, к примеру). Если программа не успевает
выполниться, то на крыше юнита зажигается красная лампочка ;) и в следующем
такте выполнение начинается с последней выполненной операции.
Пусть максимальния сумма стоимости операций за такт
является опцией игры:1000 - блиц, небольшие программы; 10000 - нормальная
игра; 50000 - умные, но тормознутые...
|