diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index 4158879..ddbacd6 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -16,5 +16,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Java-Knight/src/main/java/org/project/Game.java b/Java-Knight/src/main/java/org/project/Game.java
new file mode 100644
index 0000000..ac0c654
--- /dev/null
+++ b/Java-Knight/src/main/java/org/project/Game.java
@@ -0,0 +1,387 @@
+package org.project;
+
+import org.project.entity.Entity;
+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.item.weapons.Dagger;
+import org.project.item.weapons.Sword;
+import org.project.location.Location;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import java.util.Scanner;
+
+import static org.project.entity.enemies.Enemy.GREEN;
+import static org.project.entity.players.Player.*;
+
+public class Game {
+
+ private Player player;
+ private Scanner scanner;
+ private Location currentLocation;
+ private List allLocations;
+ private Enemy currentEnemy;
+ private Random random = new Random();
+
+ private boolean hasGoblinKey = false;
+ private boolean hasSkeletonKey = false;
+ private boolean hasVampireKey = false;
+
+ private List allEnemiesInGame = new ArrayList<>();
+
+ protected static final String GREEN_LIGHT = "\033[92m";
+ protected static final String PURPLE = "\033[35m";
+
+ public Game()
+ {
+ this.scanner = new Scanner(System.in);
+ this.allLocations = setupWorld();
+ }
+
+ public void start()
+ {
+ System.out.println("\nπ° Welcome to Java Knight!");
+ this.player = createPlayer();
+ selectStartingLocation();
+ spawnRandomEnemy();
+ gameLoop();
+ }
+
+ public Player createPlayer()
+ {
+ System.out.println("Enter your name: ");
+ String name = scanner.nextLine();
+
+ System.out.println("1. βοΈ Knight (High Damage, Balanced HP)");
+ System.out.println("2. π§ Wizard (High HP, Magic Power)");
+ System.out.println("3. π‘οΈ Assassin (High Mana, Critical Hits)");
+ int choice = getIntInput("Choose your character: ");
+
+ Player newPlayer = null;
+ switch (choice)
+ {
+ case 1:
+ System.out.println("You chose the Knight!");
+ newPlayer = new Knight(name);
+ break;
+ case 2:
+ System.out.println("You chose the Wizard!");
+ newPlayer = new Wizard(name);
+ break;
+ case 3:
+ System.out.println("You chose the Assassin!");
+ newPlayer = new Assassin(name);
+ break;
+ default:
+ System.out.println("Invalid choice. Defaulting to Knight.");
+ newPlayer = new Knight(name);
+ break;
+ }
+ return newPlayer;
+ }
+
+ public void selectStartingLocation()
+ {
+ System.out.println("πΊοΈ Choose your starting location:");
+ for (int i = 0; i < allLocations.size(); i++)
+ {
+ System.out.println((i+1) + ". " + allLocations.get(i).getName());
+ }
+ int choice = getIntInput("Enter your choice: ");
+ if (choice > 0 && choice <= allLocations.size())
+ {
+ this.currentLocation = allLocations.get(choice - 1);
+ System.out.println("πΆ You have arrived at: " + currentLocation.getName());
+ }
+ else
+ {
+ System.out.println("Invalid choice. Defaulting to Forest.");
+ this.currentLocation = allLocations.get(0);
+ }
+ }
+
+ private List setupWorld()
+ {
+ List locations = new ArrayList<>();
+
+ ArrayList forestEnemies = new ArrayList<>();
+ forestEnemies.add(new Goblin(new Dagger()));
+ forestEnemies.add(new Goblin(new Dagger()));
+ forestEnemies.add(new Goblin(new Dagger()));
+ forestEnemies.add(new Goblin(new Dagger()));
+ forestEnemies.add(new Skeleton(new Sword()));
+ forestEnemies.add(new Vampire(new Dagger()));
+ forestEnemies.add(new Skeleton(new Sword()));
+ forestEnemies.add(new Vampire(new Dagger()));
+ forestEnemies.add(new Skeleton(new Sword()));
+ Location forest = new Location("Dark Forest", new ArrayList<>(), forestEnemies);
+ allEnemiesInGame.addAll(forestEnemies);
+
+ ArrayList caveEnemies = new ArrayList<>();
+ caveEnemies.add(new Skeleton(new Sword()));
+ caveEnemies.add(new Skeleton(new Sword()));
+ caveEnemies.add(new Skeleton(new Sword()));
+ caveEnemies.add(new Skeleton(new Sword()));
+ caveEnemies.add(new Goblin(new Dagger()));
+ caveEnemies.add(new Vampire(new Dagger()));
+ caveEnemies.add(new Goblin(new Dagger()));
+ caveEnemies.add(new Vampire(new Dagger()));
+ caveEnemies.add(new Vampire(new Dagger()));
+ Location cave = new Location("Spooky Cave", new ArrayList<>(), caveEnemies);
+ allEnemiesInGame.addAll(caveEnemies);
+
+ ArrayList swampEnemies = new ArrayList<>();
+ swampEnemies.add(new Vampire(new Dagger()));
+ swampEnemies.add(new Vampire(new Dagger()));
+ swampEnemies.add(new Vampire(new Dagger()));
+ swampEnemies.add(new Vampire(new Dagger()));
+ swampEnemies.add(new Goblin(new Dagger()));
+ swampEnemies.add(new Skeleton(new Sword()));
+ swampEnemies.add(new Goblin(new Dagger()));
+ swampEnemies.add(new Goblin(new Dagger()));
+ swampEnemies.add(new Skeleton(new Sword()));
+ Location swamp = new Location("Swamp", new ArrayList<>(), swampEnemies);
+ allEnemiesInGame.addAll(swampEnemies);
+
+ locations.add(forest);
+ locations.add(cave);
+ locations.add(swamp);
+
+ return locations;
+ }
+
+ public void spawnRandomEnemy()
+ {
+ ArrayList enemies = currentLocation.getEnemies();
+ if (enemies == null || enemies.isEmpty()) {
+ System.out.println("π² The area is quiet... no enemies nearby. Move to another location.");
+ this.currentEnemy = null;
+ return;
+ }
+
+ int index = random.nextInt(enemies.size());
+ this.currentEnemy = enemies.get(index);
+ this.currentEnemy = enemies.remove(index);
+ allEnemiesInGame.remove(this.currentEnemy);
+
+ System.out.println("β οΈ A wild " + currentEnemy.getClass().getSimpleName() + " appears in " + currentLocation.getName() + "!");
+ }
+
+ public void gameLoop()
+ {
+ while (player.isAlive())
+ {
+ System.out.println("\n========================================");
+ System.out.println("π Location: " + currentLocation.getName());
+ System.out.println("β€οΈ Player HP: " + player.getHp() + "/" + player.getMaxHP());
+ System.out.println("π Player MP: " + player.getMp() + "/" + player.getMaxMP());
+
+ if (currentEnemy != null && currentEnemy.isAlive())
+ {
+ System.out.println("Enemy: " + currentEnemy.getClass().getSimpleName() + " (HP: " + currentEnemy.getHp() + ")");
+ }
+
+ System.out.println("---- Actions ----");
+ System.out.println("1. π₯· Fight enemy");
+ System.out.println("2. πΆ Move to another location");
+ System.out.println("3. π Go to Dragon Castle");
+ System.out.println("4. π³οΈ Quit game");
+
+ int choice = getIntInput("Enter your choice: ");
+
+ switch (choice)
+ {
+ case 1: //fight
+ if (currentEnemy == null)
+ {
+ spawnRandomEnemy();
+ }
+
+ if (currentEnemy != null)
+ {
+ System.out.println("βοΈ Battle Started: " + player.getName() + " vs " + currentEnemy.getClass().getSimpleName());
+ fight(currentEnemy);
+ postCombat(currentEnemy);
+
+ spawnRandomEnemy();
+ }
+ else
+ {
+ System.out.println("β οΈ No enemy found in this location.");
+ }
+ break;
+
+ case 2: //move
+ moveLocation();
+ spawnRandomEnemy();
+ break;
+
+ case 3:
+ if (hasGoblinKey && hasSkeletonKey && hasVampireKey)
+ {
+ System.out.println(PURPLE+"π Entering Dragon's lair..."+RESET);
+ startDragonFight();
+ }
+ else
+ {
+ System.out.println("π Locked! Collect all 3 keys.");
+ }
+ break;
+
+ case 4:
+ System.out.println("Byyyeee!");
+ return;
+
+ default:
+ System.out.println("Invalid."); break;
+ }
+ }
+ System.out.println(RED+"==== π Game Over! ===="+RESET);
+ }
+
+ private void fight(Enemy enemy)
+ {
+ while (player.isAlive() && enemy.isAlive())
+ {
+ handlePlayerTurn(enemy);
+ if (enemy.isStunned())
+ {
+ System.out.println("Enemy is stunned and skips its turn!");
+ enemy.unstun();
+ }
+ else
+ {
+ enemy.attack(player);
+ }
+ }
+ }
+
+ private void handlePlayerTurn(Entity target)
+ {
+ System.out.println(BLUE+"\n--- Your Turn ---"+RESET);
+ System.out.println("1. Light Attack | 2. Heavy Attack (-20 Mana) | 3. Defend (-15 Mana) | 4. Heal (-30 Mana) | 5. Special (-50 Mana)");
+ int action = getIntInput("Choose action: ");
+
+ switch (action)
+ {
+ case 1: player.lightAttack(target); break;
+ case 2: player.heavyAttack(target); break;
+ case 3: player.defend(); break;
+ case 4: player.heal(20); break;
+ case 5: player.specialAbility(target); break;
+ default: System.out.println("Invalid!"); break;
+ }
+ }
+
+ public void postCombat(Enemy enemy)
+ {
+ if (player.isAlive())
+ {
+ int xp = enemy.getXpReward();
+ player.addXp(xp);
+ checkKeyDrop(enemy);
+ player.setHp(player.getMaxHP());
+ player.fillMana(player.getMaxMP() - player.getMp());
+ System.out.println("π HP and MP fully restored!");
+ }
+ }
+
+ public void checkKeyDrop(Enemy enemy)
+ {
+ if (enemy instanceof Goblin && hasGoblinKey) return;
+ if (enemy instanceof Skeleton && hasSkeletonKey) return;
+ if (enemy instanceof Vampire && hasVampireKey) return;
+
+ String enemyType = enemy.getClass().getSimpleName();
+
+ boolean isLastOne = true;
+
+ for (Enemy e : allEnemiesInGame)
+ {
+ if (e.getClass().getSimpleName().equals(enemyType))
+ {
+ isLastOne = false;
+ break;
+ }
+ }
+
+ double dropChance;
+ if (isLastOne)
+ {
+ dropChance = 1.0;
+ System.out.println("β¨ This is the last " + enemyType + " in the world!");
+ }
+ else
+ {
+ dropChance = 0.2; //20% chance
+ }
+
+ if (Math.random() < dropChance)
+ {
+ if (enemy instanceof Goblin)
+ {
+ hasGoblinKey = true;
+ System.out.println(GREEN + "π You found the Goblin Key!" + RESET);
+ }
+ else if (enemy instanceof Skeleton)
+ {
+ hasSkeletonKey = true;
+ System.out.println(GREEN + "π You found the Skeleton Key!" + RESET);
+ }
+ else if (enemy instanceof Vampire)
+ {
+ hasVampireKey = true;
+ System.out.println(GREEN + "π You found the Vampire Key!" + RESET);
+ }
+ }
+ }
+
+ private void moveLocation()
+ {
+ System.out.println("πΊοΈ Available destinations:");
+ for (int i = 0; i < allLocations.size(); i++)
+ {
+ System.out.println((i + 1) + ". " + allLocations.get(i).getName());
+ }
+
+ int choice = getIntInput("Choose destination: ");
+ if (choice > 0 && choice <= allLocations.size())
+ {
+ currentLocation = allLocations.get(choice - 1);
+ System.out.println("πΆ You traveled to " + currentLocation.getName());
+ }
+ }
+
+ private void startDragonFight() {
+ System.out.println("π THE DRAGON APPEARS! PREPARE FOR BATTLE!");
+ Dragon dragon = new Dragon(null);
+
+ fight(dragon);
+
+ if (player.isAlive())
+ {
+ System.out.println(GREEN_LIGHT + "\n== π VICTORY! You have defeated the Dragon and broken the curse! ==" + RESET);
+ System.out.println("π You are the Hero of the Realm!");
+ }
+ else
+ {
+ System.out.println(RED + "\n==== π You have been slain by the Dragon! ====" + RESET);
+ }
+ }
+
+ private int getIntInput(String prompt) {
+ System.out.print(prompt);
+ while (!scanner.hasNextInt()) {
+ System.out.println("β οΈ Please enter a valid number!");
+ scanner.next();
+ System.out.print(prompt);
+ }
+ return scanner.nextInt();
+ }
+
+
+}
diff --git a/Java-Knight/src/main/java/org/project/Main.java b/Java-Knight/src/main/java/org/project/Main.java
index 6bde20e..929a18b 100644
--- a/Java-Knight/src/main/java/org/project/Main.java
+++ b/Java-Knight/src/main/java/org/project/Main.java
@@ -1,15 +1,24 @@
package org.project;
+import org.project.entity.players.Player;
import org.project.location.Location;
import java.util.ArrayList;
import java.util.List;
+
public class Main {
public static void main(String[] args) {
- // TODO: ADD LOCATIONS TO YOUR GAME
- List locations = new ArrayList<>();
- // TODO: IMPLEMENT GAMEPLAY
+ try
+ {
+ Game game = new Game();
+ game.start();
+ }
+ catch (Exception e) {
+ System.err.println("β Error: " + e.getMessage());
+ e.printStackTrace();
+ }
+
}
}
\ No newline at end of file
diff --git a/Java-Knight/src/main/java/org/project/entity/enemies/Dragon.java b/Java-Knight/src/main/java/org/project/entity/enemies/Dragon.java
index 8297c30..c3f92c8 100644
--- a/Java-Knight/src/main/java/org/project/entity/enemies/Dragon.java
+++ b/Java-Knight/src/main/java/org/project/entity/enemies/Dragon.java
@@ -4,38 +4,57 @@ import org.project.entity.Entity;
import org.project.entity.players.Player;
import org.project.item.weapons.Weapon;
+import static org.project.entity.players.Player.BLUE;
+import static org.project.entity.players.Player.RED;
+
public class Dragon extends Enemy{
private static final double BREATH_DAMAGE_PENETRATION = 0.5;
public Dragon(Weapon weapon)
{
- super(200, 0, weapon);
+ super(250, 0, weapon);
}
@Override
public void attack(Entity target)
{
if(!this.isAlive()) return;
+ System.out.println(BLUE+"-- Dragon's Turn --"+RESET);
int damage = 25;
if(super.getWeapon() != null)
{
damage += super.getWeapon().getDamage();
}
- target.takeDamage(damage);
- System.out.println("π Dragon used Fire Breath!");
-
if (target instanceof Player)
{
Player player = (Player) target;
if (player.isDefending())
{
- int penetrationDamage = (int) (damage * BREATH_DAMAGE_PENETRATION);
- player.takeDamage(penetrationDamage);
- System.out.println("π₯ Dragon's fiery breath bypassed the shield!");
- System.out.println("π₯ " + player.getName() + " took " + penetrationDamage + " additional damage from fire!");
+ System.out.println("π₯ Dragon's fiery breath bypasses the shield!");
+ System.out.println("π₯ " + player.getName() + " takes FULL damage!");
+ //instead of player.takeDamage (Bypassing Defense in takeDamage method)
+ player.setHp(player.getHp() - damage);
+ System.out.println("π₯ " + player.getName() + " took " + RED + damage + RESET + " damage!");
+ System.out.println("β€οΈ " + player.getName() + " HP remaining: " + player.getHp() + "/" + player.getMaxHP());
+ player.setDefending(false);
}
+ else
+ {
+ System.out.println("π Dragon used Fire Breath!");
+ player.takeDamage(damage);
+ }
+ }
+ else
+ {
+ target.takeDamage(damage);
+ }
+
+ if (!target.isAlive())
+ {
+ Player player = (Player) target;
+ System.out.println("π " + player.getName() + " has been defeated!");
}
}
}
diff --git a/Java-Knight/src/main/java/org/project/entity/enemies/Enemy.java b/Java-Knight/src/main/java/org/project/entity/enemies/Enemy.java
index cfcb46f..3fa1660 100644
--- a/Java-Knight/src/main/java/org/project/entity/enemies/Enemy.java
+++ b/Java-Knight/src/main/java/org/project/entity/enemies/Enemy.java
@@ -9,7 +9,7 @@ public abstract class Enemy implements Entity{
private int hp;
private int mp;
private int maxHp;
- private boolean isAlive = true;
+ protected boolean isAlive = true;
private int maxMp;
private int xpReward;
@@ -19,26 +19,32 @@ public abstract class Enemy implements Entity{
public static final String GREEN = "\u001B[32m";
public static final String RESET = "\u001B[0m";
+ public static final String ORANGE = "\u001B[33m";
- public Enemy(int hp, int mp, Weapon weapon) {
- this.hp = hp;
+ public Enemy(int maxHp, int mp, Weapon weapon) {
+ this.maxHp = maxHp;
+ this.hp = maxHp;
this.mp = mp;
this.weapon = weapon;
- this.maxHp = maxHp;
}
@Override
public void takeDamage(int damage) {
if (!isAlive) return;
hp -= damage;
+ if (this.hp < 0)
+ {
+ this.hp = 0;
+ }
System.out.println("β€οΈ " + this.getClass().getSimpleName() + " HP remaining: " + hp + "/" + maxHp);
if (this.hp <= 0) {
this.hp = 0;
this.isAlive = false;
+ System.out.println("π "+ ORANGE+ this.getClass().getSimpleName() + " has been defeated!"+RESET);
}
}
@@ -86,6 +92,10 @@ public abstract class Enemy implements Entity{
this.isStunned = b;
}
+ public boolean isStunned() {
+ return isStunned;
+ }
+
public int getXpReward()
{
return xpReward;
@@ -128,4 +138,9 @@ public abstract class Enemy implements Entity{
public int getMaxMP() {
return maxHp;
}
+
+ public void unstun()
+ {
+ this.isStunned = false;
+ }
}
diff --git a/Java-Knight/src/main/java/org/project/entity/enemies/Goblin.java b/Java-Knight/src/main/java/org/project/entity/enemies/Goblin.java
index 0b0cd77..8a87c32 100644
--- a/Java-Knight/src/main/java/org/project/entity/enemies/Goblin.java
+++ b/Java-Knight/src/main/java/org/project/entity/enemies/Goblin.java
@@ -3,17 +3,20 @@ package org.project.entity.enemies;
import org.project.entity.Entity;
import org.project.item.weapons.Weapon;
+import static org.project.entity.players.Player.BLUE;
+
public class Goblin extends Enemy{
public Goblin(Weapon weapon)
{
- super(30, 0, weapon);
+ super(50, 0, weapon);
}
@Override
public void attack(Entity target)
{
if (!this.isAlive()) return;
+ System.out.println(BLUE+"-- Goblin's Turn --"+RESET);
int baseDamage = 0;
if (super.getWeapon() != null)
{
@@ -26,13 +29,19 @@ public class Goblin extends Enemy{
if (Math.random() < 0.4)
{
int criticalDamage = baseDamage*2;
- target.takeDamage(criticalDamage);
System.out.println("πΉ Goblin used Critical Strike!");
+ target.takeDamage(criticalDamage);
}
else
{
- target.takeDamage(baseDamage);
System.out.println("πΉ Goblin used Slash!");
+ target.takeDamage(baseDamage);
}
}
+
+ @Override
+ public int getXpReward()
+ {
+ return 25;
+ }
}
diff --git a/Java-Knight/src/main/java/org/project/entity/enemies/Skeleton.java b/Java-Knight/src/main/java/org/project/entity/enemies/Skeleton.java
index de466b5..8b93022 100644
--- a/Java-Knight/src/main/java/org/project/entity/enemies/Skeleton.java
+++ b/Java-Knight/src/main/java/org/project/entity/enemies/Skeleton.java
@@ -3,6 +3,8 @@ package org.project.entity.enemies;
import org.project.entity.Entity;
import org.project.item.weapons.Weapon;
+import static org.project.entity.players.Player.BLUE;
+
public class Skeleton extends Enemy{
private boolean hasResurrected = false;
@@ -10,8 +12,8 @@ public class Skeleton extends Enemy{
public Skeleton(Weapon weapon)
{
- super(40, 0, weapon);
- this.resurrectionThreshold = 20;
+ super(60, 0, weapon);
+ this.resurrectionThreshold = 30;
}
@Override
@@ -29,6 +31,7 @@ public class Skeleton extends Enemy{
public void attack(Entity target)
{
if (!this.isAlive()) return;
+ System.out.println(BLUE+"-- Skeleton's Turn --"+RESET);
int damage = 0;
if (super.getWeapon() != null)
{
@@ -44,10 +47,17 @@ public class Skeleton extends Enemy{
public void resurrect()
{
- int healAmount = super.getMaxHP() / 2;
- super.heal(healAmount);
-
+ this.isAlive = true;
this.hasResurrected = true;
- System.out.println("π» Skeleton is rising from the grave! HP restored to " + super.getHp());
+ int currentMaxHP = (this instanceof Enemy) ? ((Enemy) this).getMaxHP() : 60;
+ this.setHp(currentMaxHP / 2);
+ System.out.println("π» Skeleton is rising from the grave! HP restored to " + this.getHp());
+
+ }
+
+ @Override
+ public int getXpReward()
+ {
+ return 40;
}
}
diff --git a/Java-Knight/src/main/java/org/project/entity/enemies/Vampire.java b/Java-Knight/src/main/java/org/project/entity/enemies/Vampire.java
index 29e31b5..1d3f705 100644
--- a/Java-Knight/src/main/java/org/project/entity/enemies/Vampire.java
+++ b/Java-Knight/src/main/java/org/project/entity/enemies/Vampire.java
@@ -3,19 +3,21 @@ package org.project.entity.enemies;
import org.project.entity.Entity;
import org.project.item.weapons.Weapon;
+import static org.project.entity.players.Player.BLUE;
+
public class Vampire extends Enemy{
private static final double lifeStealPercent = 0.3;
public Vampire(Weapon weapon)
{
- super(60, 0, weapon);
+ super(80, 0, weapon);
}
@Override
public void attack(Entity target) {
if (!this.isAlive()) return;
-
+ System.out.println(BLUE+"-- Vampire's Turn --"+RESET);
int damage = 0;
if (super.getWeapon() != null) {
damage = super.getWeapon().getDamage();
@@ -30,12 +32,19 @@ public class Vampire extends Enemy{
int healAmount = (int) (damage * lifeStealPercent);
if (healAmount > 0)
{
+ System.out.println("π¦ Vampire used Life Drain!");
super.heal(healAmount);
- System.out.println("π¦ Vampire used Life Drain and drained " + healAmount + " HP!");
}
else
{
System.out.println("π¦ Vampire used Bite!");
}
}
+
+ @Override
+ public int getXpReward()
+ {
+ return 60;
+ }
+
}
diff --git a/Java-Knight/src/main/java/org/project/entity/players/Assassin.java b/Java-Knight/src/main/java/org/project/entity/players/Assassin.java
index cf4f621..afbdfda 100644
--- a/Java-Knight/src/main/java/org/project/entity/players/Assassin.java
+++ b/Java-Knight/src/main/java/org/project/entity/players/Assassin.java
@@ -23,6 +23,7 @@ public class Assassin extends Player {
@Override
public void specialAbility(Entity target)
{
+ isDefending = false;
if (this.getMp() < costSpecial)
{
System.out.println(YELLOW+"Not enough Mana for Vanish!"+RESET);
@@ -37,7 +38,9 @@ public class Assassin extends Player {
}
@Override
- public void heavyAttack(Entity target) {
+ public void heavyAttack(Entity target)
+ {
+ isDefending = false;
int baseDmg = getBaseDamage() * 2;
int weaponDmg = (weapon != null) ? weapon.getDamage() : 0;
int totalDmg = baseDmg + weaponDmg;
@@ -54,14 +57,15 @@ public class Assassin extends Player {
}
this.setMp(this.getMp() - costHeavy);
- target.takeDamage(totalDmg);
System.out.println("πͺ " + name + " (Assassin) used Heavy Attack! " + "( " + BLUE + costHeavy + RESET + " Mana)");
System.out.println("π₯ " + target.getClass().getSimpleName() + " took " + RED+totalDmg+RESET + " damage!");
+ target.takeDamage(totalDmg);
}
@Override
public void lightAttack(Entity target)
{
+ isDefending = false;
int baseDmg = getBaseDamage();
int weaponDmg = (weapon != null) ? weapon.getDamage() : 0;
int totalDmg = baseDmg + weaponDmg;
@@ -71,19 +75,28 @@ public class Assassin extends Player {
setNextAttackCritical(false);
}
- target.takeDamage(totalDmg);
System.out.println("οΈπ‘οΈ " + name + " (Assassin) used Light Attack! " + "( " + BLUE+costLight+RESET + " Mana)");
System.out.println("π₯ " + target.getClass().getSimpleName() + " took " + RED+totalDmg+RESET + " damage!");
+ target.takeDamage(totalDmg);
}
@Override
public void heal(int health)
{
- setHp(getHp() + health);
- if (this.getHp() > getMaxHP()) {
- setHp(getMaxHP());
+ isDefending = false;
+ if (this.getMp() >= costHeal)
+ {
+ setHp(getHp() + health);
+ if (this.getHp() > getMaxHP()) {
+ setHp(getMaxHP());
+ }
+ this.setMp(getMp() - costHeal);
+ System.out.println("π" + name + " (Assassin) healed " + health + " HP!" + " ( " + BLUE+costHeal+RESET + " Mana)");
+ }
+ else
+ {
+ System.out.println(YELLOW+"Not enough Mana!"+RESET);
}
- System.out.println("π" + name + " (Assassin) healed " + health + " HP!" );
}
@Override
public void defend()
@@ -93,6 +106,7 @@ public class Assassin extends Player {
this.setMp(getMp() - costDefend);
this.setDefending(true);
System.out.println("π‘οΈ" + name + " (Assassin) is defending!" + "( " + BLUE+costDefend+RESET + " Mana)");
+ isDefending = true;
}
else
{
diff --git a/Java-Knight/src/main/java/org/project/entity/players/Knight.java b/Java-Knight/src/main/java/org/project/entity/players/Knight.java
index ac1d4d2..2a238b9 100644
--- a/Java-Knight/src/main/java/org/project/entity/players/Knight.java
+++ b/Java-Knight/src/main/java/org/project/entity/players/Knight.java
@@ -24,6 +24,7 @@ public class Knight extends Player{
@Override
public void specialAbility(Entity target)
{
+ isDefending = false;
if (this.getMp() < costSpecial)
{
System.out.println(YELLOW+"Not enough Mana for shield bash!"+RESET);
@@ -35,16 +36,16 @@ public class Knight extends Player{
Enemy enemyTarget = (Enemy) target;
enemyTarget.setStunned(true);
System.out.println("π‘οΈ " + PURPLE+getName() + " used Shield Bash!" +RESET+ "( " + BLUE+costSpecial+RESET + " Mana)");
- System.out.println("Enemy is Stunned and will skip their next turn!");
}
int damage = getBaseDamage() + (weapon != null ? weapon.getDamage() : 0) + 10;
- target.takeDamage(damage);
System.out.println("π₯ " + target.getClass().getSimpleName() + " took " + RED+damage+RESET + " damage!");
+ target.takeDamage(damage);
}
public void heavyAttack(Entity target)
{
+ isDefending = false;
int baseDmg = getBaseDamage() * 2;
int weaponDmg = (weapon != null) ? weapon.getDamage() : 0;
int totalDmg = baseDmg + weaponDmg;
@@ -56,29 +57,39 @@ public class Knight extends Player{
}
this.setMp(this.getMp() - costHeavy);
- target.takeDamage(totalDmg);
System.out.println("π₯ " + name + " (Knight) used Heavy Attack! " + "( " + BLUE+costHeavy+RESET + " Mana)");
System.out.println("π₯ " + target.getClass().getSimpleName() + " took " + RED+totalDmg+RESET + " damage!");
+ target.takeDamage(totalDmg);
}
public void lightAttack(Entity target)
{
+ isDefending = false;
int baseDmg = getBaseDamage();
int weaponDmg = (weapon != null) ? weapon.getDamage() : 0;
int totalDmg = baseDmg + weaponDmg;
- target.takeDamage(totalDmg);
System.out.println("βοΈ " + name + " (Knight) used Light Attack! " + "( " + BLUE+costLight+RESET + " Mana)");
System.out.println("π₯ " + target.getClass().getSimpleName() + " took " + RED+totalDmg+RESET + " damage!");
+ target.takeDamage(totalDmg);
}
@Override
public void heal(int health)
{
- setHp(getHp() + health);
- if (this.getHp() > getMaxHP()) {
- setHp(getMaxHP());
+ isDefending = false;
+ if (this.getMp() >= costHeal)
+ {
+ setHp(getHp() + health);
+ if (this.getHp() > getMaxHP()) {
+ setHp(getMaxHP());
+ }
+ this.setMp(getMp() - costHeal);
+ System.out.println("π " + name + " (Knight) healed " + health + " HP!" + " ( " + BLUE+costHeal+RESET + " Mana)");
+ }
+ else
+ {
+ System.out.println(YELLOW+"Not enough Mana!"+RESET);
}
- System.out.println("π" + name + " (Knight) healed " + health + " HP!" );
}
@Override
public void defend()
@@ -88,10 +99,12 @@ public class Knight extends Player{
this.setMp(getMp() - costDefend);
this.setDefending(true);
System.out.println("π‘οΈ" + name + " (Knight) is defending!" + "( " + BLUE+costDefend+RESET + " Mana)");
+ isDefending = true;
}
else
{
System.out.println(YELLOW+"Not enough Mana!"+RESET);
}
+
}
}
diff --git a/Java-Knight/src/main/java/org/project/entity/players/Player.java b/Java-Knight/src/main/java/org/project/entity/players/Player.java
index 891bf66..f09142a 100644
--- a/Java-Knight/src/main/java/org/project/entity/players/Player.java
+++ b/Java-Knight/src/main/java/org/project/entity/players/Player.java
@@ -21,7 +21,7 @@ public abstract class Player implements Entity {
protected static final int costDefend = 15;
protected static final int costHeal = 30;
protected static final int costSpecial = 50;
- private boolean isDefending = false;
+ protected boolean isDefending = false;
public static final String BLUE = "\u001B[34m";
public static final String RED = "\033[31m";
@@ -31,6 +31,8 @@ public abstract class Player implements Entity {
public Player(String name, int maxHP, int maxMP, Weapon weapon, Armor armor) {
this.name = name;
+ this.maxHP = maxHP;
+ this.maxMP = maxMP;
this.hp = maxHP;
this.mp = maxMP;
this.weapon = weapon;
@@ -38,19 +40,39 @@ public abstract class Player implements Entity {
}
@Override
- public void takeDamage(int damage) {
+ public void takeDamage(int rawDamage) {
+ int actualDamage = rawDamage;
+ String logMessage = "";
+
if (isDefending)
{
- damage = (int) (damage * 0.1);
+ int defenseReduction = (int) (actualDamage * 0.5);
+ actualDamage -= defenseReduction;
isDefending = false;
+ logMessage += "π‘οΈ You braced for impact! (-50% damage) ";
}
- int actualDamage = Math.max(0, damage - (armor != null ? armor.getDefense() : 0));
- hp -= actualDamage;
+
+ int armorDefense = 0;
+ if (armor != null)
+ {
+ armorDefense = armor.getDefense();
+ int damageAfterArmor = Math.max(0, actualDamage - armorDefense);
+ actualDamage = damageAfterArmor;
+
+ if (armorDefense > 0)
+ {
+ logMessage += "π‘οΈ " + armor.getName() +" blocked "+ armorDefense + " damage! ";
+ }
+ }
+
+ this.hp -= actualDamage;
if (this.hp < 0)
{
this.hp = 0;
}
- System.out.println("π₯ " + name + " took " + RED+damage+RESET + " damage!");
+
+ System.out.println(logMessage);
+ System.out.println("π₯ " + name + " took " + RED + actualDamage + RESET + " damage!");
System.out.println("β€οΈ " + name + " HP remaining: " + hp + "/" + maxHP);
}
diff --git a/Java-Knight/src/main/java/org/project/entity/players/Wizard.java b/Java-Knight/src/main/java/org/project/entity/players/Wizard.java
index 600fb14..c6f7930 100644
--- a/Java-Knight/src/main/java/org/project/entity/players/Wizard.java
+++ b/Java-Knight/src/main/java/org/project/entity/players/Wizard.java
@@ -21,6 +21,7 @@ public class Wizard extends Player{
@Override
public void specialAbility(Entity target)
{
+ isDefending = false;
if (this.getMp() < costSpecial)
{
System.out.println(YELLOW+"Not enough Mana for Soul Siphon!"+RESET);
@@ -28,17 +29,18 @@ public class Wizard extends Player{
}
this.setMp(this.getMp() - costSpecial);
int damage = getBaseDamage() + (weapon != null ? weapon.getDamage() : 0) + 25;
- target.takeDamage(damage);
int selfHeal = 15;
System.out.println("πͺ " +PURPLE+ name + " (Wizard) used soul siphon!"+RESET + " (" + BLUE+costSpecial+RESET + " Mana)");
System.out.println("π₯ " + target.getClass().getSimpleName() + " took " + RED+damage+RESET + " damage!");
+ target.takeDamage(damage);
heal(selfHeal);
}
@Override
public void heavyAttack(Entity target)
{
+ isDefending = false;
int baseDmg = getBaseDamage() * 2;
int weaponDmg = (weapon != null) ? weapon.getDamage() : 0;
int totalDmg = baseDmg + weaponDmg;
@@ -50,30 +52,40 @@ public class Wizard extends Player{
}
this.setMp(this.getMp() - costHeavy);
- target.takeDamage(totalDmg);
System.out.println("π₯ " + name + " (Wizard) used Heavy Attack! " + "( " + BLUE+costHeavy+RESET + " Mana)");
System.out.println("π₯ " + target.getClass().getSimpleName() + " took " + RED+totalDmg+RESET + " fire damage!");
+ target.takeDamage(totalDmg);
}
@Override
public void lightAttack(Entity target)
{
+ isDefending = false;
int baseDmg = getBaseDamage();
int weaponDmg = (weapon != null) ? weapon.getDamage() : 0;
int totalDmg = baseDmg + weaponDmg;
- target.takeDamage(totalDmg);
System.out.println("οΈπ§ " + name + " (Wizard) used Light Attack! " + "( " + BLUE+costLight+RESET + " Mana)");
System.out.println("π₯ " + target.getClass().getSimpleName() + " took " + RED+totalDmg+RESET + " magical damage!");
+ target.takeDamage(totalDmg);
}
@Override
public void heal(int health)
{
- setHp(getHp() + health);
- if (this.getHp() > getMaxHP()) {
- setHp(getMaxHP());
+ isDefending = false;
+ if (this.getMp() >= costHeal)
+ {
+ setHp(getHp() + health);
+ if (this.getHp() > getMaxHP()) {
+ setHp(getMaxHP());
+ }
+ this.setMp(getMp() - costHeal);
+ System.out.println("π " + name + " (Wizard) healed " + health + " HP!" + " ( " + BLUE+costHeal+RESET + " Mana)");
+ }
+ else
+ {
+ System.out.println(YELLOW+"Not enough Mana!"+RESET);
}
- System.out.println("π" + name + " (Wizard) healed " + health + " HP!" );
}
@Override
public void defend()
@@ -83,6 +95,7 @@ public class Wizard extends Player{
this.setMp(getMp() - costDefend);
this.setDefending(true);
System.out.println("π‘οΈ" + name + " (Wizard) is defending!" + "( " + BLUE+costDefend+RESET + " Mana)");
+ isDefending = true;
}
else
{
diff --git a/Java-Knight/src/main/java/org/project/game.java b/Java-Knight/src/main/java/org/project/game.java
deleted file mode 100644
index f5aa61a..0000000
--- a/Java-Knight/src/main/java/org/project/game.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.project.entity.players;
-
-import java.util.Scanner;
-
-public class game {
-
- private Player player;
- private Scanner scanner;
-
- public game()
- {
- this.scanner = new Scanner(System.in);
- this.player = createPlayer();
- this.location
- }
-
- public Player createPlayer()
- {
- System.out.println("π° Welcome to Java Knight!");
- System.out.println("Enter your name: ");
- String name = scanner.nextLine();
-
- System.out.println("1. βοΈ Knight (High Damage, Balanced HP)");
- System.out.println("2. π§ Wizard (High HP, Magic Power)");
- System.out.println("3. π‘οΈ Assassin (High Mana, Critical Hits)");
- int choice = getIntInput("Choose your character: ");
-
- Player newPlayer = null;
- switch (choice)
- {
- case 1:
- System.out.println("You chose the Knight!");
- newPlayer = new Knight(name);
- break;
- case 2:
- System.out.println("You chose the Wizard!");
- newPlayer = new Wizard(name);
- break;
- case 3:
- System.out.println("You chose the Assassin!");
- newPlayer = new Assassin(name);
- default:
- System.out.println("Invalid choice. Defaulting to Knight.");
- newPlayer = new Knight(name);
- break;
- }
-
- }
-
- private int getIntInput(String prompt) {
- System.out.print(prompt);
- while (!scanner.hasNextInt()) {
- System.out.println("β οΈ Please enter a valid number!");
- scanner.next();
- System.out.print(prompt);
- }
- return scanner.nextInt();
- }
-}
diff --git a/Java-Knight/src/main/java/org/project/item/armors/KnightArmor.java b/Java-Knight/src/main/java/org/project/item/armors/KnightArmor.java
index b710fd1..31266ee 100644
--- a/Java-Knight/src/main/java/org/project/item/armors/KnightArmor.java
+++ b/Java-Knight/src/main/java/org/project/item/armors/KnightArmor.java
@@ -6,7 +6,7 @@ public class KnightArmor extends Armor{
public KnightArmor()
{
- super(1, "Plate Armor", 15, 100);
+ super(1, "Plate Armor", 5, 100);
}
@Override
diff --git a/Java-Knight/src/main/java/org/project/item/armors/LeatherArmor.java b/Java-Knight/src/main/java/org/project/item/armors/LeatherArmor.java
index e29f443..9c8f650 100644
--- a/Java-Knight/src/main/java/org/project/item/armors/LeatherArmor.java
+++ b/Java-Knight/src/main/java/org/project/item/armors/LeatherArmor.java
@@ -6,7 +6,7 @@ public class LeatherArmor extends Armor{
public LeatherArmor()
{
- super(3, "Light Leather", 8, 70);
+ super(3, "Light Leather", 3, 70);
}
@Override
diff --git a/Java-Knight/src/main/java/org/project/item/armors/Robe.java b/Java-Knight/src/main/java/org/project/item/armors/Robe.java
index a4c4eed..141c7c6 100644
--- a/Java-Knight/src/main/java/org/project/item/armors/Robe.java
+++ b/Java-Knight/src/main/java/org/project/item/armors/Robe.java
@@ -5,7 +5,7 @@ import org.project.entity.Entity;
public class Robe extends Armor{
public Robe()
{
- super(2, "magic robe", 5, 50);
+ super(2, "magic robe", 1, 50);
}
@Override
diff --git a/Java-Knight/src/main/java/org/project/location/Location.java b/Java-Knight/src/main/java/org/project/location/Location.java
index 92ed0a8..5da5fc1 100644
--- a/Java-Knight/src/main/java/org/project/location/Location.java
+++ b/Java-Knight/src/main/java/org/project/location/Location.java
@@ -9,9 +9,10 @@ public class Location {
private ArrayList locations;
private ArrayList enemies;
- public Location(ArrayList locations, ArrayList enemies) {
+ public Location(String name, ArrayList locations, ArrayList enemies) {
this.locations = locations;
this.enemies = enemies;
+ this.name = name;
}
public String getName() {
diff --git a/Java-Knight/target/classes/org/project/Game.class b/Java-Knight/target/classes/org/project/Game.class
new file mode 100644
index 0000000..8cb2e4a
Binary files /dev/null and b/Java-Knight/target/classes/org/project/Game.class differ
diff --git a/Java-Knight/target/classes/org/project/Main.class b/Java-Knight/target/classes/org/project/Main.class
new file mode 100644
index 0000000..c5e5d3e
Binary files /dev/null and b/Java-Knight/target/classes/org/project/Main.class differ
diff --git a/Java-Knight/target/classes/org/project/entity/Entity.class b/Java-Knight/target/classes/org/project/entity/Entity.class
new file mode 100644
index 0000000..c51c395
Binary files /dev/null and b/Java-Knight/target/classes/org/project/entity/Entity.class differ
diff --git a/Java-Knight/target/classes/org/project/entity/enemies/Dragon.class b/Java-Knight/target/classes/org/project/entity/enemies/Dragon.class
new file mode 100644
index 0000000..e8c2e86
Binary files /dev/null and b/Java-Knight/target/classes/org/project/entity/enemies/Dragon.class differ
diff --git a/Java-Knight/target/classes/org/project/entity/enemies/Enemy.class b/Java-Knight/target/classes/org/project/entity/enemies/Enemy.class
new file mode 100644
index 0000000..21f5f06
Binary files /dev/null and b/Java-Knight/target/classes/org/project/entity/enemies/Enemy.class differ
diff --git a/Java-Knight/target/classes/org/project/entity/enemies/Goblin.class b/Java-Knight/target/classes/org/project/entity/enemies/Goblin.class
new file mode 100644
index 0000000..b7a196d
Binary files /dev/null and b/Java-Knight/target/classes/org/project/entity/enemies/Goblin.class differ
diff --git a/Java-Knight/target/classes/org/project/entity/enemies/Skeleton.class b/Java-Knight/target/classes/org/project/entity/enemies/Skeleton.class
new file mode 100644
index 0000000..3d89e9a
Binary files /dev/null and b/Java-Knight/target/classes/org/project/entity/enemies/Skeleton.class differ
diff --git a/Java-Knight/target/classes/org/project/entity/enemies/Vampire.class b/Java-Knight/target/classes/org/project/entity/enemies/Vampire.class
new file mode 100644
index 0000000..8244b3c
Binary files /dev/null and b/Java-Knight/target/classes/org/project/entity/enemies/Vampire.class differ
diff --git a/Java-Knight/target/classes/org/project/entity/players/Assassin.class b/Java-Knight/target/classes/org/project/entity/players/Assassin.class
new file mode 100644
index 0000000..801e265
Binary files /dev/null and b/Java-Knight/target/classes/org/project/entity/players/Assassin.class differ
diff --git a/Java-Knight/target/classes/org/project/entity/players/Knight.class b/Java-Knight/target/classes/org/project/entity/players/Knight.class
new file mode 100644
index 0000000..d593449
Binary files /dev/null and b/Java-Knight/target/classes/org/project/entity/players/Knight.class differ
diff --git a/Java-Knight/target/classes/org/project/entity/players/Player.class b/Java-Knight/target/classes/org/project/entity/players/Player.class
new file mode 100644
index 0000000..2c640fa
Binary files /dev/null and b/Java-Knight/target/classes/org/project/entity/players/Player.class differ
diff --git a/Java-Knight/target/classes/org/project/entity/players/Wizard.class b/Java-Knight/target/classes/org/project/entity/players/Wizard.class
new file mode 100644
index 0000000..8298d58
Binary files /dev/null and b/Java-Knight/target/classes/org/project/entity/players/Wizard.class differ
diff --git a/Java-Knight/target/classes/org/project/item/Item.class b/Java-Knight/target/classes/org/project/item/Item.class
new file mode 100644
index 0000000..5a93a1b
Binary files /dev/null and b/Java-Knight/target/classes/org/project/item/Item.class differ
diff --git a/Java-Knight/target/classes/org/project/item/armors/Armor.class b/Java-Knight/target/classes/org/project/item/armors/Armor.class
new file mode 100644
index 0000000..3c52792
Binary files /dev/null and b/Java-Knight/target/classes/org/project/item/armors/Armor.class differ
diff --git a/Java-Knight/target/classes/org/project/item/armors/KnightArmor.class b/Java-Knight/target/classes/org/project/item/armors/KnightArmor.class
new file mode 100644
index 0000000..43521c4
Binary files /dev/null and b/Java-Knight/target/classes/org/project/item/armors/KnightArmor.class differ
diff --git a/Java-Knight/target/classes/org/project/item/armors/LeatherArmor.class b/Java-Knight/target/classes/org/project/item/armors/LeatherArmor.class
new file mode 100644
index 0000000..8538866
Binary files /dev/null and b/Java-Knight/target/classes/org/project/item/armors/LeatherArmor.class differ
diff --git a/Java-Knight/target/classes/org/project/item/armors/Robe.class b/Java-Knight/target/classes/org/project/item/armors/Robe.class
new file mode 100644
index 0000000..fdcae5d
Binary files /dev/null and b/Java-Knight/target/classes/org/project/item/armors/Robe.class differ
diff --git a/Java-Knight/target/classes/org/project/item/consumables/Consumable.class b/Java-Knight/target/classes/org/project/item/consumables/Consumable.class
new file mode 100644
index 0000000..e222e9a
Binary files /dev/null and b/Java-Knight/target/classes/org/project/item/consumables/Consumable.class differ
diff --git a/Java-Knight/target/classes/org/project/item/consumables/Flask.class b/Java-Knight/target/classes/org/project/item/consumables/Flask.class
new file mode 100644
index 0000000..b55f7cb
Binary files /dev/null and b/Java-Knight/target/classes/org/project/item/consumables/Flask.class differ
diff --git a/Java-Knight/target/classes/org/project/item/weapons/Dagger.class b/Java-Knight/target/classes/org/project/item/weapons/Dagger.class
new file mode 100644
index 0000000..4298ef7
Binary files /dev/null and b/Java-Knight/target/classes/org/project/item/weapons/Dagger.class differ
diff --git a/Java-Knight/target/classes/org/project/item/weapons/Sword.class b/Java-Knight/target/classes/org/project/item/weapons/Sword.class
new file mode 100644
index 0000000..8511ff9
Binary files /dev/null and b/Java-Knight/target/classes/org/project/item/weapons/Sword.class differ
diff --git a/Java-Knight/target/classes/org/project/item/weapons/Wand.class b/Java-Knight/target/classes/org/project/item/weapons/Wand.class
new file mode 100644
index 0000000..71be97a
Binary files /dev/null and b/Java-Knight/target/classes/org/project/item/weapons/Wand.class differ
diff --git a/Java-Knight/target/classes/org/project/item/weapons/Weapon.class b/Java-Knight/target/classes/org/project/item/weapons/Weapon.class
new file mode 100644
index 0000000..497266a
Binary files /dev/null and b/Java-Knight/target/classes/org/project/item/weapons/Weapon.class differ
diff --git a/Java-Knight/target/classes/org/project/location/Location.class b/Java-Knight/target/classes/org/project/location/Location.class
new file mode 100644
index 0000000..07b8cbe
Binary files /dev/null and b/Java-Knight/target/classes/org/project/location/Location.class differ