# 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.