338 lines
13 KiB
Java
338 lines
13 KiB
Java
package org.project;
|
|
|
|
import org.project.entity.players.*;
|
|
import org.project.entity.enemies.*;
|
|
import org.project.location.*;
|
|
import org.project.item.weapons.*;
|
|
import org.project.item.consumables.*;
|
|
import org.project.item.armors.*;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.Random;
|
|
import java.util.Scanner;
|
|
|
|
public class Main {
|
|
private static Scanner scanner = new Scanner(System.in);
|
|
private static Random random = new Random();
|
|
|
|
private static Player player;
|
|
|
|
//Collected keys
|
|
private static boolean hasGoblinKey = false;
|
|
private static boolean hasSkeletonKey = false;
|
|
private static boolean hasVampireKey = false;
|
|
|
|
private static boolean castleUnlocked = false;
|
|
|
|
public static void main(String[] args) {
|
|
System.out.println("⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️");
|
|
NarrativeConsole.printNormal(" JAVA KNIGHT - THE DRAGON'S CURSE");
|
|
System.out.println("⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️⚔️");
|
|
NarrativeConsole.printNormal("\nFor centuries, the land of Javanest lived in peace...");
|
|
NarrativeConsole.printNormal("Until a magical Dragon attacked, plunging the realm into darkness!");
|
|
NarrativeConsole.printNormal("You are the last hope. Gather the 3 keys and slay the Dragon!\n");
|
|
|
|
//Choosing a role
|
|
createPlayer();
|
|
|
|
gameLoop();
|
|
}
|
|
|
|
private static void createPlayer() {
|
|
System.out.println("=".repeat(20));
|
|
System.out.println("CHOOSE YOUR HERO:");
|
|
System.out.println("1. Knight ⚔️ - High damage, strong armor");
|
|
System.out.println("2. Wizard 🧙♂️ - High HP, healing spells");
|
|
System.out.println("3. Assassin 🗡️ - High mana, critical strikes");
|
|
System.out.print("\nEnter choice (1-3): ");
|
|
|
|
int choice = getIntInput();
|
|
scanner.nextLine();
|
|
|
|
System.out.print("Enter your hero's name: ");
|
|
String name = scanner.nextLine();
|
|
|
|
switch (choice) {
|
|
case 1:
|
|
player = new Knight(name);
|
|
break;
|
|
case 2:
|
|
player = new Wizard(name);
|
|
break;
|
|
case 3:
|
|
player = new Assassin(name);
|
|
break;
|
|
default:
|
|
System.out.println("Invalid choice! Defaulting to Knight.");
|
|
player = new Knight(name);
|
|
}
|
|
|
|
System.out.println("\n✨ " + player.getName() + " the " +
|
|
player.getClass().getSimpleName() + " has entered Javanest!");
|
|
NarrativeConsole.printHeal("💚 HP: " + player.getHp() + "/" + player.getMaxHP());
|
|
NarrativeConsole.printMana("💙 MP: " + player.getMp() + "/" + player.getMaxMP());
|
|
System.out.println("\nPress Enter to begin your journey...");
|
|
scanner.nextLine();
|
|
}
|
|
|
|
private static void gameLoop() {
|
|
boolean gameRunning = true;
|
|
boolean firstLocation = true;
|
|
|
|
while (gameRunning && player.isAlive()) {
|
|
//Entering a new location
|
|
if (!firstLocation) {
|
|
System.out.println("\n" + "=".repeat(30));
|
|
System.out.println("You move to a new location...");
|
|
}
|
|
firstLocation = false;
|
|
|
|
Enemy currentEnemy = spawnRandomEnemy();
|
|
NarrativeConsole.printWarning("\n⭕⭕⭕ A " +
|
|
currentEnemy.getName(currentEnemy).toUpperCase() + " appears before you! ⭕⭕⭕");
|
|
NarrativeConsole.printWarning("❤️ " + currentEnemy.getName(currentEnemy) + " HP: " +
|
|
currentEnemy.getHp() + "/" + currentEnemy.getMaxHP());
|
|
|
|
//Pre-battle menu
|
|
boolean locationExited = false;
|
|
|
|
while (!locationExited && player.isAlive() && gameRunning) {
|
|
displayMainMenu();
|
|
int choice = getIntInput();
|
|
|
|
if (choice == 1) {
|
|
//Option 1: Starting the battle
|
|
boolean victory = startBattle(currentEnemy);
|
|
|
|
if (victory) {
|
|
handleVictory(currentEnemy);
|
|
locationExited = true; //Moving on the next location
|
|
} else {
|
|
gameRunning = false; //Player's death
|
|
}
|
|
|
|
} else if (choice == 2) {
|
|
//Option 2: Move to another location1
|
|
System.out.println("\n🚶 You flee to another location...");
|
|
currentEnemy = spawnRandomEnemy();
|
|
NarrativeConsole.printWarning("⭕ A " + currentEnemy.getName(currentEnemy) +
|
|
" appears in this new location!");
|
|
|
|
} else if (choice == 3 && castleUnlocked) {
|
|
//Option 3: Going to the castle and fight the dragon (only with 3 keys)
|
|
System.out.println("\n🏰🏰🏰 YOU STAND BEFORE THE DRAGON'S CASTLE! 🏰🏰🏰");
|
|
System.out.println("The gates slowly open... A massive shadow emerges...\n");
|
|
|
|
boolean victory = startBattle(new Dragon());
|
|
if (victory) {
|
|
System.out.println("\n🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉");
|
|
NarrativeConsole.printSuccess(" THE DRAGON IS DEFEATED! YOU SAVED JAVANEST!");
|
|
System.out.println("🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉");
|
|
gameRunning = false;
|
|
} else {
|
|
NarrativeConsole.printError("\n💀 The Dragon's flames consume you... GAME OVER!");
|
|
gameRunning = false;
|
|
}
|
|
break;
|
|
}
|
|
|
|
//Checking the condition for opening the castle
|
|
if (hasAllKeys() && !castleUnlocked) {
|
|
castleUnlocked = true;
|
|
System.out.println("\n🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑");
|
|
NarrativeConsole.printSuccess(" YOU HAVE COLLECTED ALL 3 KEYS!");
|
|
NarrativeConsole.printSuccess("🏰 THE PATH TO THE DRAGON'S CASTLE IS NOW OPEN! 🏰");
|
|
System.out.println("🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑🔑");
|
|
}
|
|
|
|
displayKeyProgress();
|
|
|
|
//End game
|
|
if (!player.isAlive()) {
|
|
NarrativeConsole.printError("\n💀💀💀 GAME OVER! 💀💀💀");
|
|
NarrativeConsole.printError("Your journey ends here. The curse of Javanest remains unbroken...");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void displayMainMenu() {
|
|
System.out.println("\n" + "-".repeat(30));
|
|
System.out.println("WHAT WILL YOU DO?");
|
|
System.out.println("1. ⚔️ FIGHT the enemy");
|
|
System.out.println("2. 🚶 MOVE to another location");
|
|
|
|
if (castleUnlocked) {
|
|
System.out.println("3. 🏰 GO TO THE CASTLE (Fight the Dragon!)");
|
|
}
|
|
System.out.print("\nChoose: ");
|
|
}
|
|
|
|
private static boolean startBattle(Enemy enemy) {
|
|
System.out.println("\n" + "🔥".repeat(30));
|
|
System.out.println(" BATTLE BEGINS!");
|
|
System.out.println("🔥".repeat(30));
|
|
|
|
while (player.isAlive() && enemy.isAlive()) {
|
|
displayBattleStatus(enemy);
|
|
|
|
playerTurn(enemy);
|
|
if (!enemy.isAlive()) {
|
|
break;
|
|
}
|
|
|
|
enemyTurn(enemy);
|
|
}
|
|
|
|
return player.isAlive();
|
|
}
|
|
|
|
private static void playerTurn(Enemy enemy) {
|
|
System.out.println("\n" + "-".repeat(30));
|
|
System.out.println("YOUR TURN");
|
|
System.out.println("1. ⚔️ Light Attack (0 Mana)");
|
|
System.out.println("2. 💥 Heavy Attack (-8 Mana)");
|
|
System.out.println("3. 🛡️ Defend (-6 Mana)");
|
|
System.out.println("4. 💚 Heal (-12 Mana)");
|
|
System.out.println("5. ⭐ Special Ability (-15 Mana)");
|
|
System.out.print("Choose action: ");
|
|
|
|
int choice = getIntInput();
|
|
|
|
switch (choice) {
|
|
case 1:
|
|
player.lightAttack(enemy);
|
|
break;
|
|
case 2:
|
|
player.heavyAttack(enemy);
|
|
break;
|
|
case 3:
|
|
player.defend();
|
|
break;
|
|
case 4:
|
|
player.heal(12);
|
|
break;
|
|
case 5:
|
|
player.specialAbility(enemy);
|
|
break;
|
|
default:
|
|
NarrativeConsole.printWarning("❌ Invalid choice! You hesitate and lose your turn!");
|
|
}
|
|
|
|
//Checking the death of enemy
|
|
if (!enemy.isAlive()) {
|
|
NarrativeConsole.printSuccess("\n💀 " +
|
|
enemy.getName(enemy).toUpperCase() + " HAS BEEN DEFEATED! 💀");
|
|
}
|
|
}
|
|
|
|
private static void enemyTurn(Enemy enemy) {
|
|
System.out.println("\n" + "-".repeat(30));
|
|
System.out.println("ENEMY TURN");
|
|
enemy.attack(player);
|
|
}
|
|
|
|
private static void displayBattleStatus(Enemy enemy) {
|
|
System.out.println("\n" + "═".repeat(45));
|
|
System.out.printf("❤️ %s: %d/%d HP | 💙 Mana: %d/%d%n",
|
|
player.getName(), player.getHp(), player.getMaxHP(),
|
|
player.getMp(), player.getMaxMP());
|
|
System.out.printf("👾 %s: %d/%d HP%n",
|
|
enemy.getName(enemy), enemy.getHp(), enemy.getMaxHP());
|
|
System.out.println("═".repeat(45));
|
|
}
|
|
|
|
private static Enemy spawnRandomEnemy() {
|
|
int roll = random.nextInt(3); // 0, 1, 2
|
|
|
|
switch (roll) {
|
|
case 0:
|
|
return new Goblin();
|
|
case 1:
|
|
return new Skeleton();
|
|
default:
|
|
return new Vampire();
|
|
}
|
|
}
|
|
|
|
private static void handleVictory(Enemy defeatedEnemy) {
|
|
NarrativeConsole.printSuccess("\n✨✨✨ VICTORY! ✨✨✨");
|
|
NarrativeConsole.printSuccess(defeatedEnemy.getName(defeatedEnemy).toUpperCase() +
|
|
" has been defeated!");
|
|
|
|
//Getting Higher Max HP and MP
|
|
player.setMaxHP(player.getMaxHP() + getXpReward(defeatedEnemy)/5);
|
|
player.setMaxMP(player.getMaxMP() + getXpReward(defeatedEnemy)/5);
|
|
|
|
//Full HP and Mana Recovery (Post-Combat Recovery)
|
|
player.setHp(player.getMaxHP());
|
|
player.setMp(player.getMaxMP());
|
|
NarrativeConsole.printHeal("💚 HP and Mana fully restored in higher levels!");
|
|
|
|
//Key Drop (20% chance)
|
|
attemptKeyDrop(defeatedEnemy);
|
|
}
|
|
|
|
private static int getXpReward(Enemy enemy) {
|
|
if (enemy instanceof Goblin) return 50;
|
|
if (enemy instanceof Skeleton) return 65;
|
|
if (enemy instanceof Vampire) return 85;
|
|
if (enemy instanceof Dragon) return 300;
|
|
return 40;
|
|
}
|
|
|
|
private static void attemptKeyDrop(Enemy enemy) {
|
|
//Checking if we already have this key or not
|
|
if (enemy instanceof Goblin && hasGoblinKey) {
|
|
return;
|
|
}
|
|
if (enemy instanceof Skeleton && hasSkeletonKey) {
|
|
return;
|
|
}
|
|
if (enemy instanceof Vampire && hasVampireKey) {
|
|
return;
|
|
}
|
|
|
|
//Dropping the key (20% Chance)
|
|
int dropChance = random.nextInt(100);
|
|
if (dropChance > 80) {
|
|
if (enemy instanceof Goblin) {
|
|
hasGoblinKey = true;
|
|
NarrativeConsole.printSuccess("\n🔑🔑🔑 YOU FOUND THE GOBLIN KEY! (1/3) 🔑🔑🔑");
|
|
} else if (enemy instanceof Skeleton) {
|
|
hasSkeletonKey = true;
|
|
NarrativeConsole.printSuccess("\n🔑🔑🔑 YOU FOUND THE SKELETON KEY! (2/3) 🔑🔑🔑");
|
|
} else if (enemy instanceof Vampire) {
|
|
hasVampireKey = true;
|
|
NarrativeConsole.printSuccess("\n🔑🔑🔑 YOU FOUND THE VAMPIRE KEY! (3/3) 🔑🔑🔑");
|
|
}
|
|
} else {
|
|
System.out.println("🔑 No key dropped this time... Keep fighting!");
|
|
}
|
|
}
|
|
|
|
private static boolean hasAllKeys() {
|
|
return hasGoblinKey && hasSkeletonKey && hasVampireKey;
|
|
}
|
|
|
|
private static void displayKeyProgress() {
|
|
System.out.println("\n" + "-".repeat(40));
|
|
System.out.println("KEY PROGRESS:");
|
|
System.out.println(" " + (hasGoblinKey ? "👹" : "⬜") + " Goblin Key " + (hasGoblinKey ? "(Obtained)" : "(Missing)"));
|
|
System.out.println(" " + (hasSkeletonKey ? "💀" : "⬜") + " Skeleton Key " + (hasSkeletonKey ? "(Obtained)" : "(Missing)"));
|
|
System.out.println(" " + (hasVampireKey ? "🦇" : "⬜") + " Vampire Key " + (hasVampireKey ? "(Obtained)" : "(Missing)"));
|
|
System.out.println("-".repeat(40));
|
|
}
|
|
|
|
private static int getIntInput() {
|
|
while (true) {
|
|
try {
|
|
int input = Integer.parseInt(scanner.nextLine().trim());
|
|
return input;
|
|
} catch (NumberFormatException e) {
|
|
NarrativeConsole.printWarning("❌ Invalid input! Please enter a number: ");
|
|
}
|
|
}
|
|
}
|
|
} |