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.Random; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // Enemies Enemy goblin = new Goblin(); Enemy skeleton = new Skeleton(); Enemy vampire = new Vampire(); Enemy[] enemies = {goblin, vampire, skeleton}; // An array of the enemies except Dragon which is the final boss // Locations, one for each enemy Location forest = new Location("Whispering forest", goblin); Location catacombs = new Location("forgotten catacombs", skeleton); Location castle = new Location("crimson castle", vampire); Location[] locations = {forest, catacombs, castle}; // An array of the location except peak where is the Dragon(final boss) located System.out.println("\t=============== Java Knight ===============\n"); boolean running = true; while(running){ System.out.println("\tChoose your option:"); System.out.println("\t1. Start game" + " 2. Exit"); int option = scanner.nextInt(); if(option == 1){ startGame(locations); } else if (option == 2) { running = false; break; } } } public static void startGame(Location[] locations){ // Scanner scanner = new Scanner(System.in); Random random = new Random(); // Set up System.out.print("\tEnter your name: "); String name = scanner.next(); Player player = null; int option = 0; while(option > 3 || option < 1){ System.out.println("\n Select your character: (Enter number)"); System.out.println("\t1. Knight (fights with a sword)\n" + "\t2. Assassin (fights with dual daggers)\n" + "\t3. Wizard (fights with his magic staff)"); if (scanner.hasNextInt()) { option = scanner.nextInt(); } else { System.out.println("\tInvalid input! Please enter a number."); scanner.next(); } } switch (option){ case 1: player = new Knight(name); System.out.printf("\n\tYour Character: %s, Your Name: %s\n\n", "Knight", player.getName()); break; case 2: player = new Assassin(name); System.out.printf("\n\tYour Character: %s, Your Name: %s\n\n", "Assassin", player.getName()); break; case 3: player = new Wizard(name); System.out.printf("\n\tYour Character: %s, Your Name: %s\n\n", "Wizard", player.getName()); break; default: player = null; break; } // Choosing location and enemy Location loc = locations[random.nextInt(locations.length)]; loc = setLocation(loc, locations, player, random, scanner); Enemy enemy = loc.getEnemy(); System.out.println("\t=============== Prepare to fight ==============="); while(player.isAlive()){ while(enemy.isAlive()){ playerMove(player, enemy, scanner); if(!enemy.isStunned() && enemy.getAlive()) { enemyMove(enemy, player, random); } else{ enemy.stun(false); } } player.addXP(30); enemy.heal(); // Key dropping (50% chance) boolean[] logics = {false, true}; boolean drop = true; if(enemy.hasKey() && drop){ player.addKey(enemy); } // resetting player and enemy for the next battle player.fillMana(); enemy.fillHP(); // the final battle, Dragon fight if(player.getKeys() == 3){ System.out.println("\t=============== Entering Ashen Peak to fight the Dragon ==============="); enemy = new Dragon(); loc = new Location("ashen peak", enemy); while(enemy.isAlive() && player.isAlive()){ playerMove(player, enemy, scanner); if(!enemy.isStunned() && enemy.isAlive()) { enemyMove(enemy, player, random); } else{ enemy.stun(false); } } break; } else{ loc = setLocation(loc, locations, player, random, scanner); enemy = loc.getEnemy(); } } } public static Location setLocation(Location currentLocation, Location[] locations, Player player, Random random, Scanner scanner){ System.out.printf("\t%s should fight %s who fights with %s in %s\n", player.getName(), currentLocation.getEnemy().getName(), currentLocation.getEnemy().getWeapon().getName(), currentLocation.getName()); int option = 0; while(option > 2 || option < 1){ System.out.println("\tChoose your option: "); System.out.println("\t1. Fight " + currentLocation.getEnemy().getName() + "\t2. Change location"); if (scanner.hasNextInt()) { option = scanner.nextInt(); } else { System.out.println("\tInvalid input! Please enter a number."); scanner.next(); } } if(option == 1){ return currentLocation; } else{ Location[] temp_locations = new Location[locations.length - 1]; int counter = 0; for(Location l : locations){ if (l != currentLocation) { temp_locations[counter] = l; counter++; } } currentLocation = temp_locations[random.nextInt(temp_locations.length)]; System.out.println("\tChanging locations...\n"); setLocation(currentLocation, locations, player, random, scanner); } return currentLocation; } public static void playerMove(Player player, Enemy enemy, Scanner scanner){ player.defend(false); int option = 0; while(option > 5 || option < 1){ System.out.println("\n Your turn. Choose your move: \n" + " 1. Light attack" + " 2. Heavy attack" + " 3. Defend" + " 4. Heal" + " 5. Special Ability"); if (scanner.hasNextInt()) { option = scanner.nextInt(); if(option != 1 && player.getMp() <= 0){ // when mana runs out the only available action is light attack System.out.println("\tYou are out of Mana. You can only choose \"1. Light attack\""); option = 0; } else if(option == 4 && player.getHp() == player.getMaxHP()){ System.out.println("\tYour HP is at its maximum. Choose another option."); option = 0; } } else { System.out.println("\tInvalid input! Please enter a number."); scanner.next(); } } switch (option){ case 1: // light attack if(!enemy.isDefending()){ player.lightAttack(enemy); } break; case 2: // heavy attack if(player.getMp() >= player.getWeapon().getManaCost()) { player.heavyAttack(enemy); } else{ System.out.println("\tYou don\'t have enough Mana"); playerMove(player, enemy, scanner); } break; case 3: // defend if(player.getMp() >= player.getDefendMP()) { player.defend(true); } else{ System.out.println("\tYou don\'t have enough Mana"); playerMove(player, enemy, scanner); } break; case 4: // heal if(player.getMp() >= player.getDefendMP()) { player.heal( (int)((0.2)*player.getMaxHP()) ); } else{ System.out.println("\tYou don\'t have enough Mana"); playerMove(player, enemy, scanner); } break; case 5: // special ability if(player.getMp() >= player.getSpecialAbilityMP()) { player.specialAbility(enemy); } else{ System.out.println("\tYou don\'t have enough Mana"); playerMove(player, enemy, scanner); } break; } showStatus(player, enemy); } public static void enemyMove(Enemy enemy, Player player, Random random){ enemy.defend(false); enemy.stun(false); // have been checked before calling this method System.out.println("\t" + enemy.getName() + "'s turn: "); int move_id = random.nextInt(5) + 1; switch (move_id){ case 1: // attack (light attack) enemy.attack(player); break; case 2: // special ability (heavy attack) if(enemy instanceof Skeleton && enemy.isRevived()){ enemyMove(enemy, player, random); } enemy.specialAbility(player); break; case 3: // defend enemy.defend(true); break; case 4: // heal enemy.heal( (int)((0.2)*player.getMaxHP()) ); break; } showStatus(player, enemy); } public static void showStatus(Player player, Enemy enemy){ System.out.printf("\t[%s - %d/%d HP | %d/%d Mana]\t[%s - %d/%d HP]\n\n", player.getName(), player.getHp(), player.getMaxHP(), player.getMp(), player.getMaxMP(), enemy.getName(), enemy.getHp(), enemy.getMaxHP() ); } }