From 8b1da4b522ada3852ddb3e7f56c8d3ccf424bcba Mon Sep 17 00:00:00 2001 From: HadiSharifi Date: Sun, 10 May 2026 00:24:53 +0330 Subject: [PATCH] implement new armors --- .../src/main/java/org/project/Main.java | 4 +-- .../main/java/org/project/entity/Entity.java | 2 ++ .../org/project/entity/enemies/Enemy.java | 13 +++++++-- .../org/project/entity/players/Assassin.java | 10 +++++-- .../org/project/entity/players/Knight.java | 11 ++++++- .../org/project/entity/players/Player.java | 5 ++++ .../org/project/entity/players/Wizard.java | 17 +++++++++-- .../java/org/project/item/armors/Armor.java | 29 ++++++++++--------- .../project/item/armors/AssassinArmor.java | 27 +++++++++++++++++ .../org/project/item/armors/KnightArmor.java | 13 ++++++--- .../org/project/item/armors/WizardArmor.java | 15 ++++++++++ 11 files changed, 117 insertions(+), 29 deletions(-) create mode 100644 Java-Knight/src/main/java/org/project/item/armors/AssassinArmor.java create mode 100644 Java-Knight/src/main/java/org/project/item/armors/WizardArmor.java diff --git a/Java-Knight/src/main/java/org/project/Main.java b/Java-Knight/src/main/java/org/project/Main.java index e5ae85e..8dc14e5 100644 --- a/Java-Knight/src/main/java/org/project/Main.java +++ b/Java-Knight/src/main/java/org/project/Main.java @@ -22,9 +22,9 @@ public class Main { public static void main(String[] args) { Weapon wp = new Sword(); ArrayList players = new ArrayList<>(); - players.add(new Assassin(new KnightArmor(8, 1))); + players.add(new Assassin()); players.add(new Knight()); - players.add(new Wizard(new KnightArmor(2,1))); + players.add(new Wizard()); ArrayList enemies = new ArrayList<>(); enemies.add(new Goblin(80, 100, wp)); enemies.add(new Skeleton(70, 100, wp)); diff --git a/Java-Knight/src/main/java/org/project/entity/Entity.java b/Java-Knight/src/main/java/org/project/entity/Entity.java index 4a3e219..15560f5 100644 --- a/Java-Knight/src/main/java/org/project/entity/Entity.java +++ b/Java-Knight/src/main/java/org/project/entity/Entity.java @@ -11,6 +11,8 @@ public interface Entity { void takeDamage(int damage); + void takeDamage(int damage, Entity target); + int getHP(); void setHP(int hp); 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 399463b..8d4c00b 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 @@ -34,15 +34,17 @@ public abstract class Enemy implements Entity { System.out.println(this.getClass().getSimpleName() + ": attacking " + target.getClass().getSimpleName()); double damage = getAttackMultiplier() * weapon.getDamage(); if (target.isDefending()) { - target.takeDamage((int) (damage * (1 - target.getDefendRate()))); + target.takeDamage((int) (damage * (1 - target.getDefendRate())),this); target.setDefending(false); } else { target.takeDamage((int) damage); } setMP(getMP() - weapon.getManaCost()); } - else System.out.println("not enough mana"); - setSuccessful(false); + else { + System.out.println("not enough mana"); + setSuccessful(false); + } } @Override @@ -72,6 +74,11 @@ public abstract class Enemy implements Entity { } } + @Override + public void takeDamage(int damage, Entity target) { + this.takeDamage(damage); + } + @Override public int getHP() { return hp; 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 f1857cf..91ce181 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 @@ -3,14 +3,15 @@ package org.project.entity.players; import org.project.entity.Entity; import org.project.item.armors.Armor; +import org.project.item.armors.AssassinArmor; import org.project.item.weapons.Dagger; import org.project.item.weapons.Sword; import org.project.item.weapons.Weapon; public class Assassin extends Player { - public Assassin(Armor armor) { - super("ASSASSIN",100,100, new Dagger(), armor); + public Assassin() { + super("ASSASSIN",100,100, new Dagger(), new AssassinArmor()); setDefendRate(.7); } @@ -89,8 +90,11 @@ public class Assassin extends Player { public void takeDamage(int damage) { if (getUsingSpecialAbility()) { System.out.println("player using special ability"); + } else { + damage = ((AssassinArmor) (getArmor())).reduceDamage(damage, this); + super.takeDamage(damage); + } - else super.takeDamage(damage); } } 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 c833362..9e3c11c 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 @@ -11,7 +11,7 @@ import org.project.item.weapons.Weapon; public class Knight extends Player { public Knight() { - super("Knight",100,90, new Sword(), new KnightArmor(10,1)); + super("Knight",100,90, new Sword(), new KnightArmor()); setDefendRate(.9); } @@ -81,5 +81,14 @@ public class Knight extends Player { } } + + public void takeDamage(int damage, Entity attacker) { + super.takeDamage(damage); + if (!getArmor().checkBrake()) { + int reflected = ((KnightArmor) armor).getReflectedDamage(damage); + attacker.takeDamage(reflected); + } + } + } 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 66ab5b8..4f510db 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 @@ -81,6 +81,11 @@ public abstract class Player implements Entity, combatOptions { } } + @Override + public void takeDamage(int damage, Entity target) { + this.takeDamage(damage); + } + @Override public void heal(int health) { System.out.println(this.getClass().getSimpleName() + " is healing " + health + " HPs"); 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 5176a25..b6fc42a 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 @@ -2,14 +2,16 @@ package org.project.entity.players; import org.project.entity.Entity; import org.project.item.armors.Armor; +import org.project.item.armors.KnightArmor; +import org.project.item.armors.WizardArmor; import org.project.item.weapons.Bow; import org.project.item.weapons.Sword; import org.project.item.weapons.Weapon; public class Wizard extends Player{ - public Wizard(Armor armor) { - super("Wizard",90,90,new Bow(),armor); + public Wizard() { + super("Wizard",90,90,new Bow(),new WizardArmor()); setDefendRate(.6); } @@ -79,4 +81,15 @@ public class Wizard extends Player{ setSuccessful(false); } } + + @Override + public void takeDamage(int damage) { + if (!getArmor().checkBrake()) { + int finalDamage = ((WizardArmor) armor).absorbDamage(damage, getMP()); + super.takeDamage(finalDamage); + } + else { + super.takeDamage(damage); + } + } } diff --git a/Java-Knight/src/main/java/org/project/item/armors/Armor.java b/Java-Knight/src/main/java/org/project/item/armors/Armor.java index dfbaffe..4b04969 100644 --- a/Java-Knight/src/main/java/org/project/item/armors/Armor.java +++ b/Java-Knight/src/main/java/org/project/item/armors/Armor.java @@ -5,27 +5,17 @@ import org.project.item.Item; public abstract class Armor implements Item { private int defense; private int maxDefense; - private int durability; - private int maxDurability; - public Armor(int defense, int durability) { + public Armor(int defense) { this.defense = defense; this.maxDefense = defense; - this.durability = durability; - this.maxDurability = durability; } - public void checkBreak() { - if (durability <= 0) { - defense = 0; - } - } - // TODO: (BONUS) UPDATE THE REPAIR METHOD + public void repair() { defense = maxDefense; - durability = maxDurability; } public int getDefense() { @@ -36,8 +26,19 @@ public abstract class Armor implements Item { this.defense = defense; } - public int getDurability() { - return durability; + + public boolean checkBrake() { + return defense <= 0; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } + + @Override + public void use() { + System.out.println(this.getClass().getSimpleName() + " equipped"); } } diff --git a/Java-Knight/src/main/java/org/project/item/armors/AssassinArmor.java b/Java-Knight/src/main/java/org/project/item/armors/AssassinArmor.java new file mode 100644 index 0000000..c4fa1fe --- /dev/null +++ b/Java-Knight/src/main/java/org/project/item/armors/AssassinArmor.java @@ -0,0 +1,27 @@ +package org.project.item.armors; + +import org.project.entity.players.Player; +import org.project.item.armors.Armor; + +public class AssassinArmor extends Armor { + + private int HPPercentDamageReduction; + + public AssassinArmor() { + super(15); + this.HPPercentDamageReduction = 40; + } + + + private boolean isLowHP(Player player) { + return (player.getHP() * 100 / player.getMaxHP()) < HPPercentDamageReduction; + } + + public int reduceDamage(int damage, Player player) { + if (isLowHP(player)) { + return damage / 2; + } + return damage; + } + +} \ No newline at end of file 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 698c071..639a6c5 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 @@ -1,9 +1,14 @@ package org.project.item.armors; -// TODO: UPDATE IMPLEMENTATION + public class KnightArmor extends Armor{ - // TODO: DESIGN ARMOR'S ATTRIBUTES IMPLEMENT THE CONSTRUCTOR - public KnightArmor(int defense, int durability) { - super(defense, durability); + private int reflectPercent; + public KnightArmor() { + super(10); + this.reflectPercent = 15; + } + + public int getReflectedDamage(int damage) { + return (int) (damage * reflectPercent / 100); } } \ No newline at end of file diff --git a/Java-Knight/src/main/java/org/project/item/armors/WizardArmor.java b/Java-Knight/src/main/java/org/project/item/armors/WizardArmor.java new file mode 100644 index 0000000..4a0f3c5 --- /dev/null +++ b/Java-Knight/src/main/java/org/project/item/armors/WizardArmor.java @@ -0,0 +1,15 @@ +package org.project.item.armors; + +public class WizardArmor extends Armor { + + public WizardArmor() { + super(10); + } + + + public int absorbDamage(int damage, int mp) { + int reduction = mp / 10; // every 10 MP absorbs 1 damage + return Math.max(0, damage - reduction); + } + +} \ No newline at end of file