Двухмерная игра в стиле фэнтези, где игроку предстоит выставлять своих персонажей против персонажей нечисти. После каждого раунда, восстанавливается жизнь уцелевших персонажей игрока и повышается их уровень. Максимальный уровень - 4.
Размер поля фиксирован (8x8). Направление движения аналогично ферзю в шахматах. Персонажи разного типа могут ходить на разное расстояние:
- Мечники/Скелеты - 4 клетки в любом направлении
- Лучники/Вампиры - 2 клетки в любом направлении
- Маги/Демоны - 1 клетка в любом направлении
Дальность атаки так же ограничена:
- Мечники/Скелеты - могут атаковать только соседнюю клетку
- Лучники/Вампиры - на ближайшие 2 клетки
- Маги/Демоны - на ближайшие 4 клетки
Клетки считаются "по радиусу". Для мечника зона поражения будет выглядеть вот так:
Для лучника (отмечено красным):
Игрок и компьютер последовательно выполняют по одному игровому действию, после чего управление передаётся противостоящей стороне. Как это выглядит:
- Выбирается собственный персонаж (для этого на него необходимо кликнуть левой кнопкой мыши)
- Далее возможен один из двух вариантов:
- Перемещение: выбирается свободное поле, на которое можно передвинуть персонажа (для этого на поле необходимо кликнуть левой кнопкой мыши)
- Атака: выбирается поле с противником, которое можно атаковать с учётом ограничений по дальности атаки (для этого на персонаже противника необходимо кликнуть левой кнопкой мыши)
В новой игре игрок всегда начинает первым (если игра загружается из сохранения, то порядок определяется в сохранении). Игра заканчивается тогда, когда все персонажи игрока погибают.
Уровень завершается выигрышем игрока тогда, когда все персонажи компьютера погибли.
Баллы, которые набирает игрок за уровень равны сумме жизней оставшихся в живых персонажей.
Персонажи генерируются рандомно в столбцах 1 и 2 для игрока и в столбцах 7 и 8 для компьютера:
У игрока генерируются два персонажа: (случайным образом - типов Bowman
и Swordsman
) с уровнем 1, характеристики соответствуют таблице характеристик (см. раздел ниже).
У компьютера генерируется произвольный набор персонажей в количестве 2 единиц.
У игрока повышается level игроков на 1 + восстанавливается здоровье выживших. Дополнительно случайным образом добавляется новый персонаж уровня 1.
У компьютера случайным образом генерируются персонажи в количестве, равным количеству персонажей игрока, с уровнем от 1 до 2.
У игрока повышается level игроков на 1 + восстанавливается здоровье выживших. Дополнительно случайным образом добавляется два новых персонаж уровня 1 или 2.
У компьютера случайным образом генерируются персонажи в количестве, равным количеству персонажей игрока, с уровнем от 1 до 3.
У игрока повышается level игроков на 1 + восстанавливается здоровье выживших. Дополнительно случайным образом добавляется два новых персонаж уровня от 1 до 3.
У компьютера случайным образом генерируются персонажи в количестве, равным количеству персонажей игрока, с уровнем от 1 до 4.
Валидные строковые идентификаторы (к которым привязаны изображения):
- swordsman
- bowman
- magician
- daemon
- undead
- vampire
У игрока могут быть только swordsman, bowman и magician, у компьютера только daemon, undead, vampire.
- Bowman - 25/25
- Swordsman - 40/10
- Magician - 10/40
- Vampire - 25/25
- Undead - 40/10
- Daemon - 10/40
- После каждого раунда на 1 повышается поле level
- Показатель health приводится к значению: текущий уровень + 80 (но не более 100). Т.е. если у персонажа 1 после окончания раунда уровень жизни был 10, а персонажа 2 - 80, то после levelup:
- персонаж 1 - жизнь станет 90
- персонаж 2 - жизнь станет 100
- Повышение показателей атаки/защиты также привязаны к оставшейся жизни по формуле:
attackAfter = Math.max(attackBefore, attackBefore * (1.8 - life) / 100)
, т.е. если у персонажа после окончания раунда жизни осталось 50%, то его показатели улучшаться на 30%. Если же жизни осталось 1%, то показатели никак не увеличаться.
Ключевые сущности:
- GamePlay - класс, отвечающий за взаимодействие с HTML-страницей
- GameController - класс, отвечающий за логику приложения
- Character - базовый класс, от которого наследуются специализированные персонажи
- GameState - объект, который хранит текущее состояние игры
- GameStateService - объект, который взаимодействует с текущим состоянием
- PositionedCharacter - Character, привязанный к координате на поле
- Team - класс для команды (набор персонажей), представляющих компьютер и игрока
- generators - модуль, содержащий вспомогательные функции для генерации команды и персонажей