# 🐉 The Curse of the Dragon - Complete RPG Game

## Table of Contents
1. [Project Overview](#project-overview)
2. [Game Story](#game-story)
3. [Technical Architecture](#technical-architecture)


---

## Project Overview

**The Curse of the Dragon** is a fully-featured Java RPG (Role-Playing Game) built with Object-Oriented Programming principles. The game features turn-based combat, item collection, leveling systems, and a complete progression arc from humble beginnings to an epic dragon boss battle.

### Key Features
- ✅ **3 Playable Classes**: Knight, Assassin, Wizard
- ✅ **4 Enemy Types**: Goblin, Skeleton, Vampire, Dragon
- ✅ **Key Collection System**: 3 unique keys with 20% drop rates
- ✅ **Leveling System**: XP-based progression with stat increases
- ✅ **Item System**: Healing potions and mana potions
- ✅ **ANSI Color Output**: Beautiful console visuals
- ✅ **Complete Game Loop**: Exploration, combat, progression
- ✅ **Boss Battle**: Epic dragon fight with unique mechanics

---

## Game Story

> *"A dark curse has befallen the land. The Ancient Dragon Ember has risen from its slumber, spreading fear and darkness across the realm. The only way to break the curse is to collect the three ancient keys - held by the Goblin King, the Skeleton Lord, and the Vampire Count - and confront the Dragon in its castle. Will you be the hero who saves the kingdom?"*

---

## Technical Architecture

### Design Patterns Used

#### 1. Strategy Pattern
Each enemy type implements its own attack strategy:

```java
// Goblin - Basic attack
@Override
public void attack(Entity target) {
    System.out.println(name + " swings a crude club!");
    target.receiveAttack(damage, false);
}

// Skeleton - Can miss
@Override
public void attack(Entity target) {
    if (Math.random() < 0.1) {
        System.out.println(name + " attacks but misses!");
        return;
    }
    super.attack(target);
}

// Vampire - Lifesteal
@Override
public void attack(Entity target) {
    target.receiveAttack(totalDamage, false);
    int healAmount = (int)(totalDamage * 0.3);
    heal(healAmount);
}