110 lines
4.9 KiB
Markdown
110 lines
4.9 KiB
Markdown
# Java Knight - Turn-Based RPG
|
||
|
||
## Introduction
|
||
|
||
Java Knight is a turn-based RPG that runs in the terminal. The land of Javanest is cursed by a Dragon. People have turned into Goblins, Skeletons, and Vampires. You must defeat these monsters, collect their three keys, and finally kill the Dragon to break the curse.
|
||
|
||
## How to Compile and Run
|
||
|
||
### Prerequisites
|
||
|
||
- Java Development Kit (JDK) 8 or later
|
||
|
||
### Compilation
|
||
|
||
Open a terminal in the root folder of the project (where the `org` folder is located). Run this command:
|
||
|
||
javac org/project/**/.java org/project/.java
|
||
|
||
|
||
### Execution
|
||
|
||
After compilation, run:
|
||
|
||
java org.project.Main
|
||
|
||
## OOP Principles and Design
|
||
|
||
The project uses the following object-oriented principles:
|
||
|
||
- **Encapsulation** – Fields like `hp`, `mp`, `damage` are private or protected. Access is done through getter methods.
|
||
- **Inheritance** – `Player` (abstract) is extended by `Knight`, `Assassin`, `Wizard`. `Enemy` (abstract) is extended by `Goblin`, `Skeleton`, `Vampire`, `Dragon`.
|
||
- **Polymorphism** – The `Entity` interface allows the game to treat players and enemies the same way. The `SpecialAbility()` method works differently for each class.
|
||
- **Abstraction** – `Player` and `Enemy` have abstract methods that subclasses must implement, like `SpecialAbility()`.
|
||
- **Method Overriding** – Every subclass overrides `SpecialAbility()`, `LightAttack()`, `heal()`, etc.
|
||
|
||
### Design Patterns
|
||
|
||
- **Template Method Pattern** – The combat loop in `Main` defines the basic turn structure, while specific actions are handled by overridden methods.
|
||
- **Factory Method Pattern** – The method `spawnRandomEnemyForLocation()` creates different enemy types without exposing the creation logic.
|
||
- **Strategy Pattern** – The five player actions (Light Attack, Heavy Attack, Defend, Heal, Special Ability) are interchangeable strategies chosen at runtime.
|
||
|
||
### Key Classes
|
||
|
||
| Class | Description |
|
||
|-------|-------------|
|
||
| `Entity` (interface) | Defines combat methods: `LightAttack`, `HeavyAttack`, `defend`, `heal`, etc. |
|
||
| `Player` (abstract) | Manages HP, mana, defense stance, and common actions. |
|
||
| `Knight` | High base damage. Special: shield bash (stuns enemy). |
|
||
| `Assassin` | Highest mana. Special: invisible (dodge next attack + guaranteed critical hit). |
|
||
| `Wizard` | Highest HP. Special: spell that damages enemy and heals self. |
|
||
| `Enemy` (abstract) | Base for all monsters. |
|
||
| `Goblin` | 30% critical hit chance on light attacks. |
|
||
| `Skeleton` | Revives once with 50% HP. |
|
||
| `Vampire` | Lifesteals 30% of damage dealt. |
|
||
| `Dragon` | Final boss. Fiery breath ignores defense and deals double damage. |
|
||
| `Main` | Game loop, location navigation, key collection, victory/loss logic. |
|
||
|
||
## How to Play
|
||
|
||
### Starting the Game
|
||
|
||
Run `Main.java`. You will see a menu to choose your class:
|
||
|
||
1. **Knight** – High damage, good HP, stunning special ability.
|
||
2. **Assassin** – High mana pool, can turn invisible to dodge and land critical hits.
|
||
3. **Wizard** – Highest HP, special ability damages enemy and heals self.
|
||
|
||
### Location and Exploration
|
||
|
||
You begin in a random location (Forest, Cemetery, Crypt, or Ruins). An enemy appears automatically. At each location, you have these options:
|
||
|
||
- **1. Fight the enemy** – Start turn-based combat.
|
||
- **2. Move to another location** – Skip the current enemy and go to a different location (a new random enemy will appear).
|
||
- **3. Go to the Castle** – This option only appears after you collect all three keys. It starts the final boss fight against the Dragon.
|
||
|
||
### Combat Actions (Your Turn)
|
||
|
||
During combat, you have five actions. Mana costs are shown in the menu:
|
||
|
||
| Action | Mana Cost | Effect |
|
||
|--------|-----------|--------|
|
||
| 1. Light Attack | 0 | Moderate damage |
|
||
| 2. Heavy Attack | 8 | High damage |
|
||
| 3. Defend | 6 | Reduces next enemy attack by 50% |
|
||
| 4. Heal | 10 | Restores a portion of your HP |
|
||
| 5. Special Ability | 15 | Class-unique move (see below) |
|
||
|
||
#### Special Abilities
|
||
|
||
- **Knight – Shield Bash** – Deals heavy damage and stuns the enemy. The enemy skips its next turn.
|
||
- **Assassin – Invisibility** – Dodges the next enemy attack completely. Your next hit becomes a critical hit (double damage).
|
||
- **Wizard – Devastating Spell** – Damages the enemy and heals the caster.
|
||
|
||
### After Winning a Fight
|
||
|
||
- Your HP and mana are fully restored.
|
||
- The defeated enemy has a 20% chance to drop its unique key (Goblin Key, Skeleton Key, or Vampire Key).
|
||
- Each key can be obtained only once. Killing more Goblins will not give another Goblin Key.
|
||
|
||
### Winning the Game
|
||
|
||
- Collect all three keys. Then the option "Go to the Castle" appears.
|
||
- Fight the Dragon. The Dragon has 180 HP. Its normal attack deals 45 damage. Its fiery breath deals double damage and ignores your defense.
|
||
- Defeat the Dragon to break the curse and save Javanest.
|
||
|
||
### Losing the Game
|
||
|
||
- If your HP reaches zero during any fight, the game ends with "Game Over".
|
||
|
||
Good luck, hero. |