develop #1

Open
HadiSharifi wants to merge 33 commits from develop into main
10 changed files with 38 additions and 29 deletions
Showing only changes of commit 0992256cfe - Show all commits
@@ -169,7 +169,6 @@ public class Game {
System.out.println("-".repeat(30));
if (player instanceof Assassin && player.getUsingSpecialAbility()) {
player.setUsingSpecialAbility(false);
System.out.println(enemy.getClass().getSimpleName() + " skipped its turn!");
turn = 0;
continue;
@@ -208,22 +207,20 @@ public class Game {
private boolean handlePlayerAction(int choice, Enemy enemy) {
switch (choice) {
case 1 -> { player.lightAttack(enemy); return true; }
case 2 -> { player.heavyAttack(enemy); if (player.isSuccessfulAction()) return true; }
case 3 -> { player.defend(); if (player.isSuccessfulAction()) return true; }
case 4 -> { player.heal(10); if (player.isSuccessfulAction()) return true; }
case 5 -> { player.specialAbility(enemy); if (player.isSuccessfulAction()) return true; }
case 2 -> { player.heavyAttack(enemy); return player.isSuccessfulAction();}
case 3 -> { player.defend(); return player.isSuccessfulAction(); }
case 4 -> { player.heal(10); return player.isSuccessfulAction(); }
case 5 -> { player.specialAbility(enemy); return player.isSuccessfulAction(); }
case 6 -> { player.getFlask().use(player); return true; }
default -> { System.out.println("Invalid choice."); return false; }
}
System.out.println("Not enough mana! Choose another action (1. Light attack is always free).");
return false;
}
private boolean handleEnemyAction(Enemy enemy) {
int choice = new Random().nextInt(3);
switch (choice) {
case 1 -> { enemy.defend(); if (enemy.isSuccessfulAction()) return true; }
case 2 -> { enemy.heal(10); if (enemy.isSuccessfulAction()) return true; }
case 1 -> { enemy.defend(); return enemy.isSuccessfulAction(); }
case 2 -> { enemy.heal(10); return enemy.isSuccessfulAction(); }
}
enemy.attack(player);
@@ -233,9 +230,9 @@ public class Game {
private void printCombatStatus(Enemy enemy) {
System.out.println("[" + player.getClass().getSimpleName() + " - " + player.getHP() + "/" + player.getMaxHP() +
" HP | " + player.getMP() + "/" + player.getMaxMP() + "]");
" HP | " + player.getMP() + "/" + player.getMaxMP() + " MP]");
System.out.println("[" + enemy.getClass().getSimpleName() + " - " + enemy.getHP() + "/" + enemy.getMaxHP() +
" HP | " + enemy.getMP() + "/" + enemy.getMaxMP() + "]");
" HP | " + enemy.getMP() + "/" + enemy.getMaxMP() + "MP]");
}
@@ -30,6 +30,7 @@ public class Dragon extends Enemy {
}
target.takeDamage((int) damage);
setMP(getMP() - FIRE_BREATH_MP_COST);
return;
}
if (target.isDefending()) {
@@ -43,7 +44,7 @@ public class Dragon extends Enemy {
@Override
public void defend() {
System.out.println("Dragon roars and ignores the chance to defend!");
setSuccessfulAction(false);
setSuccessfulAction(true);
}
@Override
@@ -48,6 +48,7 @@ public class Skeleton extends Enemy{
if (getHP() <= 0 && !incarnation) {
setHP(getMaxHP() / 2);
incarnation = true;
System.out.println("The Skeleton shatters... but dark magic pulls its bones back together!");
}
}
@@ -16,12 +16,11 @@ public class Vampire extends Enemy{
super.attack(target);
double damage = weapon.getDamage() * getAttackMultiplier();
setAttackMultiplier(1);
if (target.isDefending()) {
super.heal( (int) (.3 * (damage * (1 - target.getDefendRate()))));
}
else {
super.heal( (int) (.3 * damage));
}
int lifeSteal = target.isDefending()
? (int)(.3 * (damage * (1 - target.getDefendRate())))
: (int)(.3 * damage);
System.out.println("Vampire drains " + lifeSteal + " HP from " + target.getClass().getSimpleName() + "!");
setHP(getHP() + lifeSteal);
}
@Override
@@ -27,8 +27,8 @@ public class Assassin extends Player {
@Override
public void heavyAttack(Entity target) {
super.heavyAttack(target);
if (getUsingSpecialAbility()) {
System.out.println("Assassin strikes from the shadows with lethal precision! (1.8x)");
setAttackMultiplier(1.8);
attack(target);
setAttackMultiplier(1);
@@ -36,6 +36,7 @@ public class Assassin extends Player {
}
else if (getMP() >= weapon.getManaCost()) {
System.out.println("Assassin delivers a heavy blow! (1.4x)");
setAttackMultiplier(1.4);
attack(target);
setAttackMultiplier(1);
@@ -63,7 +64,7 @@ public class Assassin extends Player {
public void specialAbility(Entity target) {
if (getMP() >= 25) {
setUsingSpecialAbility(true);
System.out.println("Assasin using SpecialAbility");
System.out.println("Assassin melts into the shadows... next heavy attack will be devastating!");
setMP(getMP() - 25);
}
else {
@@ -87,7 +88,7 @@ public class Assassin extends Player {
@Override
public void takeDamage(int damage) {
if (getUsingSpecialAbility()) {
System.out.println("player using special ability");
System.out.println("Assassin vanishes into the shadows — attack missed!");
} else {
damage = ((AssassinArmor) (getArmor())).reduceDamage(damage, this);
super.takeDamage(damage);
@@ -27,7 +27,6 @@ public class Knight extends Player {
@Override
public void heavyAttack(Entity target) {
super.heavyAttack(target);
if (getMP() >= weapon.getManaCost()) {
setAttackMultiplier(1.5);
attack(target);
@@ -57,6 +56,7 @@ public class Knight extends Player {
if (getMP() >= 30) {
setUsingSpecialAbility(true);
setAttackMultiplier(2);
System.out.println("Knight channels all strength into a devastating strike! (2x)");
attack(target);
setAttackMultiplier(1);
setMP(getMP() - 30);
@@ -84,6 +84,7 @@ public class Knight extends Player {
super.takeDamage(damage);
if (!getArmor().checkBrake()) {
int reflected = ((KnightArmor) armor).getReflectedDamage(damage);
System.out.println("Knight's armor reflects " + reflected + " damage back at " + attacker.getClass().getSimpleName() + "!");
attacker.takeDamage(reflected);
}
}
@@ -44,6 +44,8 @@ public abstract class Player implements Entity, CombatOptions {
public void attack(Entity target) {
setSuccessfulAction(true);
double damage = getAttackMultiplier() * weapon.getDamage();
System.out.println(this.getClass().getSimpleName() + ": attacking " + target.getClass().getSimpleName()
+ " for " + damage + " damages!");
if (target.isDefending()) {
target.takeDamage( (int) (damage * (1 - target.getDefendRate())));
target.setDefending(false);
@@ -59,9 +61,7 @@ public abstract class Player implements Entity, CombatOptions {
}
@Override
public void heavyAttack(Entity target) {
System.out.println(this.getClass().getSimpleName() + " heavy attacking");
}
public abstract void heavyAttack(Entity target);
@Override
public void defend(){
@@ -79,12 +79,13 @@ public abstract class Player implements Entity, CombatOptions {
int finalDamage = armor.getDefense() - damage;
if (finalDamage < 0) {
System.out.println(this.getClass().getSimpleName() + " took " + -finalDamage + " damages!");
System.out.println(getClass().getSimpleName() + " took " + -finalDamage + " damage! (armor absorbed " + armor.getDefense() + ")");
setHP(getHP() + finalDamage);
armor.setDefense(0);
System.out.println("Your armor has been destroyed!");
}
else {
System.out.println(this.getClass().getSimpleName() + " took " + damage + " damages!");
System.out.println(getClass().getSimpleName() + " took 0 damage! (fully absorbed by armor, " + finalDamage + " durability remaining)");
armor.setDefense(finalDamage);
}
}
@@ -27,7 +27,6 @@ public class Wizard extends Player{
@Override
public void heavyAttack(Entity target) {
super.heavyAttack(target);
if (getMP() >= weapon.getManaCost()) {
setAttackMultiplier(1.3);
attack(target);
@@ -56,10 +55,12 @@ public class Wizard extends Player{
public void specialAbility(Entity target) {
if (getMP() >= 20) {
setAttackMultiplier(1.6);
System.out.println("Wizard channels arcane energy — empowered shot fired! (1.6x)");
attack(target);
setAttackMultiplier(1);
setMP(getMP() - 20);
setHP(getHP() + 10);
System.out.println("Wizard absorbs residual magic — restored 10 HP!");
}
else {
System.out.println("Not enough MP");
@@ -83,6 +84,8 @@ public class Wizard extends Player{
public void takeDamage(int damage) {
if (!getArmor().checkBrake()) {
int finalDamage = ((WizardArmor) armor).absorbDamage(damage, getMP());
int absorbed = damage - finalDamage;
if (absorbed > 0) System.out.println("Wizard's mana field absorbs " + absorbed + " damage!");
super.takeDamage(finalDamage);
}
else {
@@ -19,6 +19,8 @@ public class AssassinArmor extends Armor {
public int reduceDamage(int damage, Player player) {
if (isLowHP(player)) {
System.out.println("Assassin's survival instincts kick in — damage halved!");
return damage / 2;
}
return damage;
@@ -1,6 +1,7 @@
package org.project.item.consumables;
import org.project.entity.Entity;
import org.project.entity.players.Player;
public class Flask extends Consumable {
private int healAmount;
@@ -22,8 +23,10 @@ public class Flask extends Consumable {
System.out.println(target.getClass().getSimpleName()
+ " restored " + healAmount + " MP!");
} else {
target.heal(healAmount);
target.setHP(target.getHP() + healAmount);
System.out.println(target.getClass().getSimpleName() + " healed " + healAmount + " HP!");
}
consume();
System.out.println("(" + getQuantity() + " charges remaining)");
}
}