package org.project; import org.project.entity.enemies.*; import org.project.entity.players.Assassin; import org.project.entity.players.Knight; import org.project.entity.players.Player; import org.project.entity.players.Wizard; import org.project.location.Location; import java.util.Scanner; import java.util.Random; import java.util.ArrayList; import java.util.List; import static org.project.colors.ConsoleColor.*; public class Main { static boolean hasGoblinKey = false; static boolean hasSkeletonKey = false; static boolean hasVampireKey = false; static boolean unlockedCastleL = false; static int key = 0; static int currentLocation = 0; // 0 = first location public static void main(String[] args) { List locations = new ArrayList<>(); ArrayList players = new ArrayList<>(); Player p1 = new Knight("Joan of Arc", 120, 80); players.add(p1); Player p2 = new Knight("Galahad", 120, 80); players.add(p2); Player p3 = new Wizard("Harry Potter", 90, 70); players.add(p3); Player p4 = new Assassin("Creed from Office", 70, 50); players.add(p4); ArrayList ghostTownEnemies = new ArrayList<>(); ghostTownEnemies.add(new Goblin(50, 10)); ghostTownEnemies.add(new Skeleton(50, 20)); ArrayList wreckShipEnemies = new ArrayList<>(); wreckShipEnemies.add(new Skeleton(55, 18)); wreckShipEnemies.add(new Vampire(75, 30)); wreckShipEnemies.add(new Vampire(75, 30)); wreckShipEnemies.add(new Vampire(75, 30)); wreckShipEnemies.add(new Vampire(75, 30)); wreckShipEnemies.add(new Vampire(75, 30)); ArrayList darkWoodEnemies = new ArrayList<>(); darkWoodEnemies.add(new Vampire(70, 28)); darkWoodEnemies.add(new Skeleton(60, 22)); darkWoodEnemies.add(new Vampire(70, 30)); darkWoodEnemies.add(new Vampire(75, 30)); darkWoodEnemies.add(new Vampire(55, 25)); darkWoodEnemies.add(new Vampire(60, 30)); darkWoodEnemies.add(new Vampire(75, 10)); darkWoodEnemies.add(new Goblin(45, 12)); Location l1 = new Location("GHOST TOWN", ghostTownEnemies); locations.add(l1); Location l2 = new Location("WRACK SHIP", wreckShipEnemies); locations.add(l2); Location l3 = new Location("DARK WOOD", darkWoodEnemies); locations.add(l3); Scanner scanner = new Scanner(System.in); Random rand = new Random(); boolean player_isAlive; boolean enemy_isAlive; boolean player_isAlive_dragon; boolean dragon_isAlive; welcomeP(); System.out.println(); System.out.println(YELLOW + "Pick your player!" + RESET); System.out.println(); System.out.println("1) " + p1.getName()); System.out.println("2) " + p2.getName()); System.out.println("3) " + p3.getName()); System.out.println("4) " + p4.getName()); System.out.println(); int pnum = scanner.nextInt(); System.out.println(); Player currentPlayer = players.get(pnum - 1); while (true) { showMenu(); int choose = scanner.nextInt(); switch (choose) { case 1: System.out.println(PURPLE + "You chose to Fight!" + RESET); System.out.println(); Location selectedLocation = locations.get(currentLocation); ArrayList locationEnemies = selectedLocation.getEnemies(); if (locationEnemies.isEmpty()) { System.out.println("No enemies left in " + selectedLocation.getName() + "!"); System.out.println("Move to another location using option 2."); break; } Enemy selectedEnemy = locationEnemies.get(rand.nextInt(locationEnemies.size())); System.out.println("You as \"" + currentPlayer + "\" (" + currentPlayer.getClass().getSimpleName() + ')' + " and enemy as \"" + selectedEnemy.getClass().getSimpleName() + "\" will fight in " + selectedLocation + '!'); System.out.println(); enemy_isAlive = true; player_isAlive = true; while (enemy_isAlive && player_isAlive) { System.out.println(); System.out.println(GREEN + "Your turn:" + RESET); System.out.println("1) Light Attack | 2) Heavy Attack " + RED + "(-10 Mana) " + RESET + " | 3) Defend " + RED + "(-5 Mana)" + RESET + " | 4) Heal " + RED + "(-10 Mana)" + RESET + " | 5) Special Ability " + RED + "(-15 Mana)" + RESET); int input = scanner.nextInt(); actions(selectedEnemy, currentPlayer, input); if (selectedEnemy.getHp() <= 0) { enemy_isAlive = false; } if (enemy_isAlive) { System.out.println(); System.out.println(RED + selectedEnemy + "'s turn:" + RESET); int enemyAction = rand.nextInt(4); enemyAction(selectedEnemy, currentPlayer, enemyAction); if (currentPlayer.getHp() <= 0) { player_isAlive = false; } } } if (!enemy_isAlive) { // Reset player HP/MP after battle currentPlayer.setHp(currentPlayer.getMaxHP()); currentPlayer.setMp(currentPlayer.getMaxMP()); boolean dropped = keyDrop(selectedEnemy); if (dropped) { System.out.println(GREEN + "✨ A key dropped from the " + selectedEnemy.getClass().getSimpleName() + "! ✨" + RESET); } locationEnemies.remove(selectedEnemy); if (key == 3) { unlockedCastleL = true; } } break; case 2: System.out.println(); System.out.println("Current location: " + locations.get(currentLocation).getName()); System.out.println(); for (int i = 0; i < locations.size(); i++) { System.out.println((i + 1) + ") " + locations.get(i).getName()); } System.out.println(); System.out.print("Choose location (1-3): "); int newLoc = scanner.nextInt() - 1; if (newLoc >= 0 && newLoc < locations.size()) { currentLocation = newLoc; System.out.println(); System.out.println("✨ You traveled to " + locations.get(currentLocation).getName() + "! ✨"); } else { System.out.println("Invalid choice! You stay where you are."); } System.out.println(); break; case 3: if (key >= 3) { System.out.println(GREEN + "You have all 3 keys! The castle gate opens..." + RESET); System.out.println(); Dragon dragon = new Dragon(150, 50); System.out.println("You as \"" + currentPlayer.getName() + "\" will fight the " + dragon + "!"); System.out.println(); player_isAlive_dragon = true; dragon_isAlive = true; while (dragon_isAlive && player_isAlive_dragon) { System.out.println(); System.out.println(GREEN + "Your turn:" + RESET); System.out.println("1) Light Attack | 2) Heavy Attack " + RED + "(-10 Mana) " + RESET + " | 3) Defend " + RED + "(-5 Mana)" + RESET + " | 4) Heal " + RED + "(-10 Mana)" + RESET + " | 5) Special Ability " + RED + "(-15 Mana)" + RESET); int input = scanner.nextInt(); actions(dragon, currentPlayer, input); if (dragon.getHp() <= 0) { dragon_isAlive = false; } if (dragon_isAlive) { System.out.println(); System.out.println(RED + "🐉 Dragon's turn:" + RESET); int dragonAction = rand.nextInt(4); enemyAction(dragon, currentPlayer, dragonAction); System.out.println(currentPlayer.getName() + " HP: " + currentPlayer.getHp() + "/" + currentPlayer.getMaxHP()); if (currentPlayer.getHp() <= 0) { player_isAlive_dragon = false; } } } if (!dragon_isAlive) { System.out.println(); System.out.println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); System.out.println("🎉" + GREEN + " VICTORY! YOU DEFEATED THE DRAGON! " + RESET + "🎉"); System.out.println(); System.out.println(BOLD_GREEN + "✨ " + "GAME COMPLETED" + " ✨" + RESET); System.out.println(); System.out.println(BOLD_BLUE + "Thanks for playing JAVAKNIGHT!" + RESET); System.exit(0); } if (!player_isAlive_dragon) { System.out.println(); System.out.println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); System.out.println("💀" + RED + " GAME OVER " + RESET + "💀"); System.out.println(); System.out.println("You were defeated by the Dragon..."); System.out.println("- Press Enter to exit"); scanner.next(); System.exit(0); } } else { System.out.println(RED + "You need all 3 keys first! (" + key + "/3 collected)" + RESET); } break; default: System.out.println(RED + "Invalid choice! Try again." + RESET); break; } } } public static void showMenu() { System.out.println(YELLOW + "Choose your next step" + RESET); System.out.println(); System.out.println("1) Fight the enemy"); System.out.println("2) Move to another location"); System.out.println("3) Go to the castle to Fight the Dragon"); System.out.println(); } public static void welcomeP() { System.out.println(); System.out.println(BOLD_BLUE + " WELCOME TO JAVAKNIGHT" + RESET); System.out.println(); System.out.println("To overcome this game you should first find all three keys by fighting" + "\n 3 kinds of enemies. As you found them the final game" + BOLD_RED + "\n \"Fighting the Dragon\"" + RESET + "\n starts!"); } public static void showLocations(List locations) { System.out.println("Now in which location you would rather fight:"); for (int i = 1; i <= locations.size(); i++) { System.out.println(i + ") " + locations.get(i - 1)); } System.out.println(); } public static void actions(Enemy enemy, Player player, int input) { if (input == 1) { System.out.println(YELLOW + " →" + RESET + BLUE + " choose:" + RESET + " Light Attack"); System.out.println(player.getName() + " (" + player.getClass().getSimpleName() + ") used Light Attack! (0 Mana)"); player.attack(enemy); } else if (input == 2) { System.out.println(YELLOW + " →" + RESET + BLUE + " choose:" + RESET + " Heavy Attack"); System.out.println(player.getName() + " (" + player.getClass().getSimpleName() + ") used Heavy Attack! (10 Mana)"); player.heavyAttack(enemy); System.out.println(player.getName() + " Mana: " + player.getMp() + '/' + player.getMaxMP()); } else if (input == 3) { System.out.println(YELLOW + " →" + RESET + BLUE + " choose:" + RESET + " Defend"); System.out.println(player.getName() + " (" + player.getClass().getSimpleName() + ") used Defend! (5 Mana)"); player.defend(); System.out.println(player.getName() + " Mana: " + player.getMp() + '/' + player.getMaxMP()); } else if (input == 4) { System.out.println(YELLOW + " →" + RESET + BLUE + " choose:" + RESET + " Heal"); System.out.println(player.getName() + " (" + player.getClass().getSimpleName() + ") used Heal! (10 Mana)"); player.heal(15); System.out.println(player.getName() + " HP: " + player.getHp() + '/' + player.getMaxHP()); System.out.println(player.getName() + " Mana: " + player.getMp() + '/' + player.getMaxMP()); } else if (input == 5) { System.out.println(YELLOW + " →" + RESET + BLUE + " choose:" + RESET + " Special Ability"); System.out.println(player.getName() + " (" + player.getClass().getSimpleName() + ") used Special Ability! (15 Mana)"); player.specialAbility(enemy); System.out.println(enemy.getClass().getSimpleName() + " has " + enemy.getHp() + '/' + enemy.getMaxHP() + " HP remaining."); System.out.println(player.getName() + " Mana: " + player.getMp() + '/' + player.getMaxMP()); } else { System.out.println(RED + "Invalid input!" + RESET); } } public static boolean keyDrop(Enemy enemy) { String enemyType = enemy.getClass().getSimpleName(); if (enemyType.equals("Goblin")) { if (!hasGoblinKey) { int randN = (int)(Math.random() * 100) + 1; if (randN <= 50) { hasGoblinKey = true; key++; return true; } } } else if (enemyType.equals("Skeleton")) { if (!hasSkeletonKey) { int randN = (int)(Math.random() * 100) + 1; if (randN <= 25) { hasSkeletonKey = true; key++; return true; } } } else if (enemyType.equals("Vampire")) { if (!hasVampireKey) { int randN = (int)(Math.random() * 100) + 1; if (randN <= 20) { hasVampireKey = true; key++; return true; } } } return false; } public static void enemyAction(Enemy enemy, Player currentPlayer, int enemyAction) { if (enemyAction == 0) { enemy.resetDefend(); enemy.attack(currentPlayer); System.out.println(currentPlayer.getName() + " has " + currentPlayer.getHp() + '/' + currentPlayer.getMaxHP() + " HP remaining."); } else if (enemyAction == 1) { enemy.defend(); if (enemy.isDefending()) { System.out.println(enemy + " defended!"); } else { System.out.println(enemy + " tried to defend but failed!"); } } else if (enemyAction == 2) { System.out.println(enemy + " tries to heal!"); enemy.heal(10); System.out.println(enemy + " HP: " + enemy.getHp() + '/' + enemy.getMaxHP()); } else { System.out.println(enemy + " uses SPECIAL ABILITY!"); enemy.specialAbility(currentPlayer); System.out.println(currentPlayer.getName() + " has " + currentPlayer.getHp() + '/' + currentPlayer.getMaxHP() + " HP remaining."); } } }