https://github.com/yuriyvyatkin/rpg-game
RPG игра
https://github.com/yuriyvyatkin/rpg-game
algorithms jest js-game modules webpack
Last synced: 2 months ago
JSON representation
RPG игра
- Host: GitHub
- URL: https://github.com/yuriyvyatkin/rpg-game
- Owner: yuriyvyatkin
- License: mpl-2.0
- Created: 2021-08-03T06:45:54.000Z (almost 5 years ago)
- Default Branch: master
- Last Pushed: 2023-07-12T16:17:04.000Z (almost 3 years ago)
- Last Synced: 2025-02-23T00:44:14.912Z (over 1 year ago)
- Topics: algorithms, jest, js-game, modules, webpack
- Language: JavaScript
- Homepage: https://yuriyvyatkin.github.io/rpg-game
- Size: 854 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Ролевая игра
[](https://ci.appveyor.com/project/yuriyvyatkin/ajs-diploma-project)
## Концепция игры
Двухмерная игра в стиле фэнтези, где игроку предстоит выставлять своих персонажей против персонажей нечисти. После каждого раунда, восстанавливается жизнь уцелевших персонажей игрока и повышается их уровень. Максимальный уровень - 4.
## Общая механика
Размер поля фиксирован (8x8). Направление движения аналогично ферзю в шахматах. Персонажи разного типа могут ходить на разное расстояние:
* Мечники/Скелеты - 4 клетки в любом направлении
* Лучники/Вампиры - 2 клетки в любом направлении
* Маги/Демоны - 1 клетка в любом направлении

Дальность атаки так же ограничена:
* Мечники/Скелеты - могут атаковать только соседнюю клетку
* Лучники/Вампиры - на ближайшие 2 клетки
* Маги/Демоны - на ближайшие 4 клетки
Клетки считаются "по радиусу".
Для мечника зона поражения будет выглядеть вот так:

Для лучника (отмечено красным):

Игрок и компьютер последовательно выполняют по одному игровому действию, после чего управление передаётся противостоящей стороне. Как это выглядит:
1. Выбирается собственный персонаж (для этого на него необходимо кликнуть левой кнопкой мыши)
1. Далее возможен один из двух вариантов:
1. Перемещение: выбирается свободное поле, на которое можно передвинуть персонажа (для этого на поле необходимо кликнуть левой кнопкой мыши)
2. Атака: выбирается поле с противником, которое можно атаковать с учётом ограничений по дальности атаки (для этого на персонаже противника необходимо кликнуть левой кнопкой мыши)
В новой игре игрок всегда начинает первым (если игра загружается из сохранения, то порядок определяется в сохранении).
Игра заканчивается тогда, когда все персонажи игрока погибают.
Уровень завершается выигрышем игрока тогда, когда все персонажи компьютера погибли.
Баллы, которые набирает игрок за уровень равны сумме жизней оставшихся в живых персонажей.
### Генерация персонажей
Персонажи генерируются рандомно в столбцах 1 и 2 для игрока и в столбцах 7 и 8 для компьютера:

### Уровни игры, на примере первых четырёх
#### Level 1: prairie
У игрока генерируются два персонажа: (случайным образом - типов `Bowman` и `Swordsman`) с уровнем 1, характеристики соответствуют таблице характеристик (см. раздел ниже).
У компьютера генерируется произвольный набор персонажей в количестве 2 единиц.
#### Level 2: desert
У игрока повышается level игроков на 1 + восстанавливается здоровье выживших. Дополнительно случайным образом добавляется новый персонаж уровня 1.
У компьютера случайным образом генерируются персонажи в количестве, равным количеству персонажей игрока, с уровнем от 1 до 2.
#### Level 3: arctic
У игрока повышается level игроков на 1 + восстанавливается здоровье выживших. Дополнительно случайным образом добавляется два новых персонаж уровня 1 или 2.
У компьютера случайным образом генерируются персонажи в количестве, равным количеству персонажей игрока, с уровнем от 1 до 3.
#### Level 4: mountain
У игрока повышается 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%, то показатели никак не увеличаться.
## Общее описание структуры
Ключевые сущности:
1. GamePlay - класс, отвечающий за взаимодействие с HTML-страницей
2. GameController - класс, отвечающий за логику приложения
3. Character - базовый класс, от которого наследуются специализированные персонажи
4. GameState - объект, который хранит текущее состояние игры
5. GameStateService - объект, который взаимодействует с текущим состоянием
6. PositionedCharacter - Character, привязанный к координате на поле
7. Team - класс для команды (набор персонажей), представляющих компьютер и игрока
8. generators - модуль, содержащий вспомогательные функции для генерации команды и персонажей