9 Commits
29 changed files with 1494 additions and 93 deletions
@@ -0,0 +1,15 @@
package org.project;
public class Colors {
public static final String RESET = "\u001B[0m";
public static final String RED = "\u001B[31m";
public static final String GREEN = "\u001B[32m";
public static final String YELLOW = "\u001B[33m";
public static final String RED_BRIGHT = "\u001B[91m";
public static final String CYAN = "\u001B[36m";
}
@@ -1,15 +1,11 @@
package org.project; package org.project;
import org.project.location.Location;
import java.util.ArrayList;
import java.util.List;
public class Main { public class Main {
public static void main(String[] args) { public static void main(String[] args) {
// TODO: ADD LOCATIONS TO YOUR GAME
List<Location> locations = new ArrayList<>();
// TODO: IMPLEMENT GAMEPLAY GameLoop game = new GameLoop();
game.start();
} }
} }
@@ -0,0 +1,34 @@
package org.project.abilities;
import org.project.entity.Entity;
public class ArcaneStorm extends SpecialAbility{
/*
Wizard use this special ability
it Becomes invisible
no longer gets damage
*/
public ArcaneStorm() {
super("ArcaneStorm",25, 3, AbilityTarget.TARGET);
}
@Override
public void onApply(Entity target) {
super.onApply(target);
}
@Override
public void onTick(Entity target) {
target.freeze();
System.out.println(target.getName() + " is steel Frozen!");
reduceDuration();
}
@Override
public void onExpire(Entity self) {
System.out.println(self.getName() + "'s special ability onExpired");
}
}
@@ -0,0 +1,35 @@
package org.project.abilities;
import org.project.entity.Entity;
public class BoneStrike extends SpecialAbility{
/*
Skeleton use this special ability
its throws bones and damage enemies
*/
private final int damage = 5;
public BoneStrike() {
super("BoneThrow",10, 3, AbilityTarget.TARGET);
}
@Override
public void onApply(Entity target) {
super.onApply(target);
}
@Override
public void onTick(Entity target) {
target.takeDamage(damage);
System.out.println(target.getName() + " suffers from " + getName());
reduceDuration();
}
@Override
public void onExpire(Entity self) {
System.out.println(self.getName() + "'s special ability onExpired");
}
}
@@ -0,0 +1,38 @@
package org.project.abilities;
import org.project.entity.Entity;
public class GuardianOath extends SpecialAbility{
/*
Knight use this special ability
The first damage and the knight is completely restrained
its gains some health
*/
public GuardianOath() {
super("GuardianOath",15, 1, AbilityTarget.SELF);
}
@Override
public void onApply(Entity target) {
super.onApply(target);
}
@Override
public void onTick(Entity self) {
self.heal(5);
self.defend();
System.out.println("Guardian Oath empowers Sir Duncan: +5 HP and 50% Decreased damage.\n ");
reduceDuration();
}
@Override
public void onExpire(Entity self) {
System.out.println(self.getName() + "'s special ability onExpired");
}
}
@@ -0,0 +1,37 @@
package org.project.abilities;
import org.project.entity.Entity;
public class InfernoBreath extends SpecialAbility{
/*
Dragon use this special ability
its fiery breath deals huge damage to the enemy
*/
private final int breathDamage = 20;
public InfernoBreath() {
super("InfernoBreath",25, 1,AbilityTarget.TARGET);
}
@Override
public void onApply(Entity target) {
super.onApply(target);
}
@Override
public void onTick(Entity target) {
target.takeDamage(breathDamage);
System.out.println("ooooh! " + getName() + " impacted with " + target.getName());
reduceDuration();
}
@Override
public void onExpire(Entity self) {
super.onExpire(self);
}
}
@@ -0,0 +1,38 @@
package org.project.abilities;
import org.project.entity.Entity;
public class LifeSteal extends SpecialAbility{
/*
vampire use this special ability
its bite's the enemy's nek
*/
private final int healAmount = 15;
public LifeSteal() {
super("SuckingBlood",15, 1,AbilityTarget.SELF);
}
@Override
public void onApply(Entity target) {
super.onApply(target);
}
@Override
public void onTick(Entity self) {
self.heal(healAmount);
System.out.println(self.getName() + " healed for " + healAmount + " (LifeSteal)");
reduceDuration();
}
@Override
public void onExpire(Entity self) {
System.out.println(self.getName() + "'s special ability onExpired");
}
}
@@ -0,0 +1,42 @@
package org.project.abilities;
import org.project.entity.Entity;
import org.project.item.weapons.Dagger;
import org.project.weaponEffects.PoisonEffect;
import org.w3c.dom.ls.LSOutput;
public class PoisonDagger extends SpecialAbility{
/*
Goblin use this special ability
applies poison effect on goblin's weapon
*/
private final int poisonDamage = 5;
public PoisonDagger() {
super("poisonDagger",15,3,AbilityTarget.SELF);
}
@Override
public void onApply(Entity target) {
super.onApply(target);
target.setWeapon(new Dagger(new PoisonEffect()));
}
@Override
public void onTick(Entity self) {
System.out.println(self.getName() + " used Poisonous Dagger ");
reduceDuration();
}
@Override
public void onExpire(Entity target) {
target.setWeapon(new Dagger());
System.out.println(target.getName() + " no longer has poisonous Dagger");
}
}
@@ -0,0 +1,48 @@
package org.project.abilities;
import org.project.entity.Entity;
public abstract class SpecialAbility {
public enum AbilityTarget {
SELF,
TARGET
}
protected String name;
protected int manaCost;
protected int duration;
private final AbilityTarget target;
public SpecialAbility(String name,int manaCost, int duration, AbilityTarget target) {
this.name = name;
this.manaCost = manaCost;
this.duration = duration;
this.target = target;
}
public AbilityTarget getTarget() {
return target;
}
public String getName() {
return name;
}
public int getManaCost() {return manaCost;}
public int getDuration() {
return duration;
}
public void reduceDuration() {duration--;}
public void onApply(Entity target) {System.out.println(target.getName() + " activated " + name);}
public abstract void onTick(Entity target);
public void onExpire(Entity target) {}
}
@@ -1,21 +1,90 @@
package org.project.entity; package org.project.entity;
import org.project.abilities.SpecialAbility;
import org.project.item.armors.Armor;
import org.project.item.weapons.Weapon;
import org.project.managers.StatusEffectManager;
import org.project.weaponEffects.StatusEffect;
public interface Entity { public interface Entity {
void attack(Entity target);
// =========================================================
// IDENTITY
// =========================================================
String getName();
// =========================================================
// STATS
// =========================================================
int getHp();
int getMp();
int getMaxHP();
int getMaxMP();
void useMana(int amount);
int getBaseDamage();
// =========================================================
// EQUIPMENT
// =========================================================
Weapon getWeapon();
Armor getArmor();
void setWeapon(Weapon weapon);
void setArmor(Armor armor);
Armor getPersonalArmor();
// =========================================================
// ABILITIES
// =========================================================
SpecialAbility getSpacialAbility();
void addAbilityEffect(SpecialAbility ability, Entity target);
void tickAbilityEffects(Entity target);
// =========================================================
// STATUS EFFECTS
// =========================================================
void heal(int amount);
void freeze();
void stun();
void addStatusEffect(StatusEffect effect);
void tickStatusEffects();
StatusEffectManager getEffectManager();
// // =========================================================
// // RESOURCE MANAGEMENT
// // =========================================================
//
// void useMana(int amount);
// =========================================================
// COMBAT
// =========================================================
void takeDamage(int amount);
// =========================================================
// STATES
// =========================================================
void defend(); void defend();
boolean isDefending();
boolean isFrozen();
boolean isStunned();
void resetTurnState();
void heal(int health);
void fillMana(int mana); // =========================================================
// INTERNAL SETTERS
// =========================================================
void takeDamage(int damage); void setHp(int value);
void setMp(int value);
int getMaxHP();
int getMaxMP();
/*
TODO: ADD OTHER REQUIRED AND BONUS METHODS
*/
} }
@@ -0,0 +1,47 @@
package org.project.entity.enemies;
import org.project.abilities.InfernoBreath;
import org.project.item.armors.Armor;
import org.project.item.armors.DragonArmor;
import org.project.item.weapons.Sword;
public class Dragon extends Enemy {
private static final String NAME = "Dragon";
private static final int MAX_HP = 300;
private static final int MAX_MP = 150;
private static final int XP_REWARD = 500;
private static final int BASE_DAMAGE = 30;
private final Armor personalArmor = new DragonArmor();
public Dragon() {
super(
NAME,
MAX_HP,
MAX_MP,
XP_REWARD,
BASE_DAMAGE,
null,
new Sword(),
new InfernoBreath()
);
}
@Override
public Armor getPersonalArmor() {
return personalArmor;
}
@Override
public String toString() {
return "Dragon{" +
"MAX_HP : 300 | " +
"MAX_MP : 150 | " +
"XP_REWARD : 500 | " +
"BASE_DAMAGE : 30 | " +
"personalArmor = " + personalArmor +
'}';
}
}
@@ -1,34 +1,322 @@
package org.project.entity.enemies; package org.project.entity.enemies;
import org.project.abilities.SpecialAbility;
import org.project.entity.Entity;
import org.project.entity.players.Player;
import org.project.item.armors.Armor;
import org.project.item.weapons.Weapon; import org.project.item.weapons.Weapon;
import org.project.managers.SpecialAbilityManager;
import org.project.managers.StatusEffectManager;
import org.project.weaponEffects.StatusEffect;
// TODO: UPDATE IMPLEMENTATION public abstract class Enemy implements Entity {
public abstract class Enemy {
Weapon weapon; // =========================================================
// BASIC INFO
// =========================================================
private final String name;
// =========================================================
// STATS
// =========================================================
private int xpReward;
private int maxHp;
private int hp; private int hp;
private int maxMp;
private int mp; private int mp;
public Enemy(int hp, int mp, Weapon weapon) { private int baseDamage;
this.hp = hp;
this.mp = mp;
// =========================================================
// EQUIPMENT
// =========================================================
private Armor armor;
private Weapon weapon;
// =========================================================
// ABILITIES
// =========================================================
private final SpecialAbility specialAbility;
private final StatusEffectManager effectManager;
private final SpecialAbilityManager abilityManager;
// =========================================================
// STATES
// =========================================================
private boolean defending;
private boolean frozen;
private boolean stunned;
private boolean live;
// =========================================================
// CONSTRUCTOR
// =========================================================
public Enemy(
String name,
int maxHp,
int maxMp,
int xpReward,
int baseDamage,
Armor armor,
Weapon weapon,
SpecialAbility specialAbility
) {
this.name = name;
this.maxHp = maxHp;
this.hp = maxHp;
this.maxMp = maxMp;
this.mp = maxMp;
this.xpReward = xpReward;
this.baseDamage = baseDamage;
this.armor = armor;
this.weapon = weapon; this.weapon = weapon;
this.specialAbility = specialAbility;
this.effectManager = new StatusEffectManager();
this.abilityManager = new SpecialAbilityManager();
this.live = true;
}
// =========================================================
// XP REWARD
// =========================================================
public void rewardXp(Player player) {
if (player == null) {
return;
}
player.gainXp(xpReward);
System.out.println(
player.getName() +
" gained " +
xpReward +
" XP from defeating " +
name
);
}
// =========================================================
// STATUS EFFECTS
// =========================================================
@Override
public void addStatusEffect(StatusEffect effect) {
effectManager.addEffect(effect, this);
} }
@Override @Override
public void takeDamage(int damage) { public void tickStatusEffects() {
hp -= damage; effectManager.tick(this);
} }
@Override
public StatusEffectManager getEffectManager() {
return effectManager;
}
// =========================================================
// ABILITIES
// =========================================================
@Override
public void addAbilityEffect(SpecialAbility ability, Entity target) {
abilityManager.addAbility(ability, target);
}
@Override
public void tickAbilityEffects(Entity target) {
abilityManager.tick(this, target);
}
@Override
public SpecialAbility getSpacialAbility() {
return specialAbility;
}
// =========================================================
// COMBAT
// =========================================================
@Override
public void takeDamage(int amount) {
int finalDamage = Math.max(0, amount);
hp -= finalDamage;
if (hp <= 0) {
hp = 0;
live = false;
}
}
@Override
public void heal(int amount) {
if (!live) {
return;
}
hp += amount;
if (hp > maxHp) {
hp = maxHp;
System.out.println("HP reached maximum amount " + maxHp);
}
}
@Override
public void useMana(int amount) {
if (amount <= 0) {
return;
}
if (mp < amount) {
System.out.println(name + " doesn't have enough mana!");
return;
}
mp -= amount;
}
@Override
public void defend() {
defending = true;
}
// =========================================================
// STATES
// =========================================================
@Override
public boolean isDefending() {
return defending;
}
@Override
public boolean isFrozen() {
return frozen;
}
public boolean isStunned() {return stunned;}
@Override
public void freeze() {
frozen = true;
}
public void stun() {
stunned = true;
}
@Override
public void resetTurnState() {
defending = false;
frozen = false;
stunned = false;
}
// =========================================================
// GETTERS
// =========================================================
@Override
public String getName() {
return name;
}
@Override
public int getHp() { public int getHp() {
return hp; return hp;
} }
@Override
public int getMp() { public int getMp() {
return mp; return mp;
} }
@Override
public int getMaxHP() {
return maxHp;
}
@Override
public int getMaxMP() {
return maxMp;
}
@Override
public int getBaseDamage() {
return baseDamage;
}
@Override
public Weapon getWeapon() { public Weapon getWeapon() {
return weapon; return weapon;
} }
@Override
public Armor getArmor() {
return armor;
}
@Override
public Armor getPersonalArmor() {
return armor;
}
public boolean isLive() {
return live;
}
public int getXpReward() {
return xpReward;
}
// =========================================================
// SETTERS
// =========================================================
@Override
public void setWeapon(Weapon weapon) {
this.weapon = weapon;
}
@Override
public void setArmor(Armor armor) {
this.armor = armor;
}
@Override
public void setHp(int value) {
hp = Math.max(0, Math.min(value, maxHp));
}
@Override
public void setMp(int value) {
mp = Math.max(0, Math.min(value, maxMp));
}
} }
@@ -0,0 +1,47 @@
package org.project.entity.enemies;
import org.project.abilities.PoisonDagger;
import org.project.item.armors.Armor;
import org.project.item.armors.GoblinArmor;
import org.project.item.weapons.Dagger;
public class Goblin extends Enemy {
private static final String NAME = "Goblin";
private static final int MAX_HP = 45;
private static final int MAX_MP = 50;
private static final int XP_REWARD = 30;
private static final int BASE_DAMAGE = 5;
private final Armor personalArmor = new GoblinArmor();
public Goblin() {
super(
NAME,
MAX_HP,
MAX_MP,
XP_REWARD,
BASE_DAMAGE,
null,
new Dagger(),
new PoisonDagger()
);
}
@Override
public Armor getPersonalArmor() {
return personalArmor;
}
@Override
public String toString() {
return "Goblin{" +
"MAX_HP : 45 | " +
"MAX_MP : 50 | " +
"XP_REWARD : 30 | " +
"BASE_DAMAGE : 5 | " +
"personalArmor = " + personalArmor +
'}';
}
}
@@ -1,6 +1,47 @@
package org.project.entity.enemies; package org.project.entity.enemies;
// TODO: UPDATE IMPLEMENTATION import org.project.abilities.BoneStrike;
public class Skeleton { import org.project.item.armors.Armor;
// TODO: DESIGN ENEMY AND IMPLEMENT THE CONSTRUCTOR import org.project.item.armors.SkeletonArmor;
import org.project.item.weapons.Sword;
public class Skeleton extends Enemy {
private static final String NAME = "Skeleton";
private static final int MAX_HP = 40;
private static final int MAX_MP = 30;
private static final int XP_REWARD = 25;
private static final int BASE_DAMAGE = 7;
private final Armor personalArmor = new SkeletonArmor();
public Skeleton() {
super(
NAME,
MAX_HP,
MAX_MP,
XP_REWARD,
BASE_DAMAGE,
null,
new Sword(),
new BoneStrike()
);
}
@Override
public Armor getPersonalArmor() {
return personalArmor;
}
@Override
public String toString() {
return "Skeleton{" +
"MAX_HP : 40 | " +
"MAX_MP : 30 | " +
"XP_REWARD : 25 | " +
"BASE_DAMAGE : 7 | " +
"personalArmor = " + personalArmor +
'}';
}
} }
@@ -0,0 +1,47 @@
package org.project.entity.enemies;
import org.project.abilities.LifeSteal;
import org.project.item.armors.Armor;
import org.project.item.armors.VampireArmor;
import org.project.item.weapons.Dagger;
public class Vampire extends Enemy {
private static final String NAME = "Vampire";
private static final int MAX_HP = 90;
private static final int MAX_MP = 80;
private static final int XP_REWARD = 80;
private static final int BASE_DAMAGE = 12;
private final Armor personalArmor = new VampireArmor();
public Vampire() {
super(
NAME,
MAX_HP,
MAX_MP,
XP_REWARD,
BASE_DAMAGE,
null,
new Dagger(),
new LifeSteal()
);
}
@Override
public Armor getPersonalArmor() {
return personalArmor;
}
@Override
public String toString() {
return "vampire{" +
"MAX_HP : 90 | " +
"MAX_MP : 80 | " +
"XP_REWARD : 80 | " +
"BASE_DAMAGE : 12 | " +
"personalArmor = " + personalArmor +
'}';
}
}
@@ -0,0 +1,38 @@
package org.project.entity.players;
import org.project.abilities.ArcaneStorm;
import org.project.item.armors.Armor;
import org.project.item.armors.AssassinArmor;
import org.project.item.weapons.Dagger;
public class Assassin extends Player {
private static final int MAX_HP = 90;
private static final int MAX_MP = 120;
private static final int LEVEL = 1;
private static final int XP = 0;
private static final int BASE_DAMAGE = 15;
private final Armor personalArmor =
new AssassinArmor();
public Assassin(String name) {
super(
name,
MAX_HP,
MAX_MP,
LEVEL,
XP,
null,
BASE_DAMAGE,
new Dagger(),
new ArcaneStorm()
);
}
@Override
public Armor getPersonalArmor() {
return personalArmor;
}
}
@@ -1,6 +1,38 @@
package org.project.entity.players; package org.project.entity.players;
// TODO: UPDATE IMPLEMENTATION import org.project.abilities.GuardianOath;
public class Knight { import org.project.item.armors.Armor;
// TODO: DESIGN KNIGHT'S WEAPON AND ARMOR AND IMPLEMENT THE CONSTRUCTOR import org.project.item.armors.KnightArmor;
import org.project.item.weapons.Sword;
public class Knight extends Player {
private static final int MAX_HP = 150;
private static final int MAX_MP = 80;
private static final int LEVEL = 1;
private static final int XP = 0;
private static final int BASE_DAMAGE = 12;
private final Armor personalArmor =
new KnightArmor();
public Knight(String name) {
super(
name,
MAX_HP,
MAX_MP,
LEVEL,
XP,
null,
BASE_DAMAGE,
new Sword(),
new GuardianOath()
);
}
@Override
public Armor getPersonalArmor() {
return personalArmor;
}
} }
@@ -1,89 +1,359 @@
package org.project.entity.players; package org.project.entity.players;
import org.project.abilities.SpecialAbility;
import org.project.entity.Entity; import org.project.entity.Entity;
import org.project.item.armors.Armor; import org.project.item.armors.Armor;
import org.project.item.weapons.Weapon; import org.project.item.weapons.Weapon;
import org.project.managers.SpecialAbilityManager;
import org.project.managers.StatusEffectManager;
import org.project.weaponEffects.StatusEffect;
// TODO: UPDATE IMPLEMENTATION public abstract class Player implements Entity {
public abstract class Player {
protected String name; // =========================================================
Weapon weapon; // BASIC INFO
Armor armor; // =========================================================
private final String name;
private int level;
private int xp;
// =========================================================
// STATS
// =========================================================
private int maxHp;
private int hp; private int hp;
private int maxHP;
private int maxMp;
private int mp; private int mp;
private int maxMP;
public Player(String name, int hp, int mp, Weapon weapon, Armor armor) { private int baseDamage;
// =========================================================
// EQUIPMENT
// =========================================================
private Armor armor;
private Weapon weapon;
// =========================================================
// ABILITIES
// =========================================================
protected SpecialAbility specialAbility;
private final StatusEffectManager effectManager;
private final SpecialAbilityManager abilityManager;
// =========================================================
// STATES
// =========================================================
private boolean defending;
private boolean frozen;
private boolean stunned;
private boolean live;
// =========================================================
// CONSTRUCTOR
// =========================================================
public Player(
String name,
int maxHp,
int maxMp,
int level,
int xp,
Armor armor,
int baseDamage,
Weapon weapon,
SpecialAbility specialAbility
) {
this.name = name; this.name = name;
this.hp = hp;
this.mp = mp;
this.weapon = weapon; this.maxHp = maxHp;
this.hp = maxHp;
this.maxMp = maxMp;
this.mp = maxMp;
this.level = level;
this.xp = xp;
this.armor = armor; this.armor = armor;
this.baseDamage = baseDamage;
this.weapon = weapon;
this.specialAbility = specialAbility;
this.effectManager = new StatusEffectManager();
this.abilityManager = new SpecialAbilityManager();
this.defending = false;
this.frozen = false;
this.stunned = false;
this.live = true;
}
// =========================================================
// STATUS EFFECTS
// =========================================================
@Override
public void addStatusEffect(StatusEffect effect) {
effectManager.addEffect(effect, this);
} }
@Override @Override
public void attack(Entity target) { public void tickStatusEffects() {
target.takeDamage(weapon.getDamage()); effectManager.tick(this);
} }
@Override @Override
public StatusEffectManager getEffectManager() {
return effectManager;
}
// =========================================================
// ABILITIES
// =========================================================
@Override
public void addAbilityEffect(SpecialAbility ability, Entity target) {
abilityManager.addAbility(ability, target);
}
@Override
public void tickAbilityEffects(Entity target) {
abilityManager.tick(this, target);
}
@Override
public SpecialAbility getSpacialAbility() {
return specialAbility;
}
// =========================================================
// COMBAT
// =========================================================
@Override
public void takeDamage(int amount) {
int finalDamage = Math.max(0, amount);
hp -= finalDamage;
if (hp <= 0) {
hp = 0;
live = false;
}
}
public void heal(int amount) {
if (!live) {
return;
}
hp += amount;
if (hp > maxHp) {
hp = maxHp;
}
}
public void useMana(int amount) {
if (amount <= 0) {
return;
}
if (mp < amount) {
System.out.println(name + " doesn't have enough mana!");
return;
}
mp -= amount;
}
public void restoreMana(int amount) {
mp += amount;
if (mp > maxMp) {
mp = maxMp;
}
}
// =========================================================
// STATES
// =========================================================
public void defend() { public void defend() {
// TODO defending = true;
} }
public void freeze() {
frozen = true;
}
@Override public void stun() {
public void takeDamage(int damage) { stunned = true;
hp -= damage - armor.getDefense();
} }
@Override @Override
public void heal(int health) { public void resetTurnState() {
hp += health;
if (hp > maxHP) { defending = false;
hp = maxHP; frozen = false;
stunned = false;
}
public void restore() {
hp = maxHp;
mp = maxMp;
System.out.println(name + " fully restored!");
System.out.println(" HP: " + hp + "/" + maxHp + " | MP: " + mp + "/" + maxMp + "\n");
}
// =========================================================
// LEVEL SYSTEM
// =========================================================
public void gainXp(int amount) {
xp += amount;
while (xp >= level * 100) {
xp -= level * 100;
levelUp();
} }
} }
@Override public void levelUp() {
public void fillMana(int mana) {
mp += mana; level++;
if (mp > maxMP) {
mp = maxMP; maxHp += 20;
} maxMp += 10;
baseDamage += 5;
hp = maxHp;
mp = maxMp;
System.out.println(name + " leveled up!");
System.out.println("Current Level: " + level);
} }
// =========================================================
// GETTERS
// =========================================================
@Override
public String getName() { public String getName() {
return name; return name;
} }
@Override
public int getHp() { public int getHp() {
return hp; return hp;
} }
@Override @Override
public int getMaxHP() {
return maxHP;
}
public int getMp() { public int getMp() {
return mp; return mp;
} }
public int getLevel() {
return level;
}
public int getXp() {
return xp;
}
@Override
public int getMaxHP() {
return maxHp;
}
@Override @Override
public int getMaxMP() { public int getMaxMP() {
return maxMP; return maxMp;
} }
public Weapon getWeapon() { @Override
return weapon; public int getBaseDamage() {
return baseDamage;
} }
@Override
public Armor getArmor() { public Armor getArmor() {
return armor; return armor;
} }
@Override
public Weapon getWeapon() {
return weapon;
}
@Override
public Armor getPersonalArmor() {
return armor;
}
public boolean isDefending() {
return defending;
}
public boolean isFrozen() {
return frozen;
}
public boolean isStunned() {
return stunned;
}
public boolean isLive() {
return live;
}
// =========================================================
// SETTERS
// =========================================================
@Override
public void setHp(int value) {
hp = Math.max(0, Math.min(value, maxHp));
}
@Override
public void setMp(int value) {
mp = Math.max(0, Math.min(value, maxMp));
}
public void setArmor(Armor armor) {
this.armor = armor;
}
@Override
public void setWeapon(Weapon weapon) {
this.weapon = weapon;
}
} }
@@ -0,0 +1,38 @@
package org.project.entity.players;
import org.project.abilities.ArcaneStorm;
import org.project.item.armors.Armor;
import org.project.item.armors.WizardArmor;
import org.project.item.weapons.Sword;
public class Wizard extends Player {
private static final int MAX_HP = 80;
private static final int MAX_MP = 200;
private static final int LEVEL = 1;
private static final int XP = 0;
private static final int BASE_DAMAGE = 10;
private final Armor personalArmor =
new WizardArmor();
public Wizard(String name) {
super(
name,
MAX_HP,
MAX_MP,
LEVEL,
XP,
null,
BASE_DAMAGE,
new Sword(),
new ArcaneStorm()
);
}
@Override
public Armor getPersonalArmor() {
return personalArmor;
}
}
@@ -3,9 +3,7 @@ package org.project.item;
import org.project.entity.Entity; import org.project.entity.Entity;
public interface Item { public interface Item {
void use(Entity target);
/* String getName();
TODO: ADD OTHER REQUIRED AND BONUS METHODS
*/
} }
@@ -1,31 +1,77 @@
package org.project.item.armors;
// TODO: UPDATE IMPLEMENTATION package org.project.item.armors;
public abstract class Armor { public class Armor {
public enum ArmorType {
LIGHT,
MEDIUM,
HEAVY
}
private String name;
private ArmorType type;
private int defense; private int defense;
private int maxDefense; private int maxDefense;
private int durability; private int durability;
private int maxDurability; private int maxDurability;
private boolean isBroke; private boolean isBroken;
public Armor(int defense, int durability) { // Constructor
this.defense = defense; public Armor(String name, ArmorType type, int maxDefense, int maxDurability) {
this.durability = durability; this.name = name;
this.type = type;
this.maxDefense = maxDefense;
this.defense = maxDefense;
this.maxDurability = maxDurability;
this.durability = maxDurability;
this.isBroken = false;
} }
public void checkBreak() {
public int reduceDamage(int damage) {
if (isBroken) {
return damage;
}
int reducedDamage = damage - defense;
if (reducedDamage < 0) {
reducedDamage = 0;
}
reduceDurability(1);
return reducedDamage;
}
public void reduceDurability(int amount) {
durability -= amount;
if (durability <= 0) { if (durability <= 0) {
isBroke = true; durability = 0;
defense = 0; breakArmor();
} }
} }
// TODO: (BONUS) UPDATE THE REPAIR METHOD // شکستن زره
public void repair() { private void breakArmor() {
isBroke = false; isBroken = true;
defense = maxDefense; defense = 0;
durability = maxDurability; }
// ===== Getters =====
public String getName() {
return name;
}
public ArmorType getType() {
return type;
} }
public int getDefense() { public int getDefense() {
@@ -36,7 +82,19 @@ public abstract class Armor {
return durability; return durability;
} }
public boolean isBroke() { public int getMaxDurability() {
return isBroke; return maxDurability;
}
public boolean isBroken() {
return isBroken;
}
@Override
public String toString() {
return name + " | Type: " + type +
" | Defense: " + defense +
" | Durability: " + durability + "/" + maxDurability +
(isBroken ? " (BROKEN)" : "");
} }
} }
@@ -0,0 +1,17 @@
package org.project.item.armors;
public class AssassinArmor extends Armor {
private static final String NAME = "wizard Robe";
private static final ArmorType ARMOR_TYPE = ArmorType.HEAVY;
private static final int MAX_DEFENSE = 35;
private static final int MAX_DURABILITY = 60;
public AssassinArmor() {
super(NAME,
ARMOR_TYPE,
MAX_DEFENSE,
MAX_DURABILITY
);
}
}
@@ -0,0 +1,17 @@
package org.project.item.armors;
public class DragonArmor extends Armor {
private static final String NAME = "Dragon scale armor";
private static final ArmorType ARMOR_TYPE = ArmorType.HEAVY;
private static final int MAX_DEFENSE = 40;
private static final int MAX_DURABILITY = 60;
public DragonArmor() {
super(NAME,
ARMOR_TYPE,
MAX_DEFENSE,
MAX_DURABILITY
);
}
}
@@ -0,0 +1,17 @@
package org.project.item.armors;
public class GoblinArmor extends Armor {
private static final String NAME = "goblin Robe";
private static final ArmorType ARMOR_TYPE = ArmorType.LIGHT;
private static final int MAX_DEFENSE = 5;
private static final int MAX_DURABILITY = 15;
public GoblinArmor() {
super(NAME,
ARMOR_TYPE,
MAX_DEFENSE,
MAX_DURABILITY
);
}
}
@@ -1,6 +1,17 @@
package org.project.item.armors; package org.project.item.armors;
// TODO: UPDATE IMPLEMENTATION public class KnightArmor extends Armor {
public class KnightArmor {
// TODO: DESIGN ARMOR'S ATTRIBUTES IMPLEMENT THE CONSTRUCTOR private static final String NAME = "knight armor";
private static final ArmorType ARMOR_TYPE = ArmorType.HEAVY;
private static final int MAX_DEFENSE = 35;
private static final int MAX_DURABILITY = 60;
public KnightArmor() {
super(NAME,
ARMOR_TYPE,
MAX_DEFENSE,
MAX_DURABILITY
);
}
} }
@@ -0,0 +1,17 @@
package org.project.item.armors;
public class SkeletonArmor extends Armor {
private static final String NAME = "skeleton armor";
private static final ArmorType ARMOR_TYPE = ArmorType.LIGHT;
private static final int MAX_DEFENSE = 15;
private static final int MAX_DURABILITY = 20;
public SkeletonArmor() {
super(NAME,
ARMOR_TYPE,
MAX_DEFENSE,
MAX_DURABILITY
);
}
}
@@ -0,0 +1,17 @@
package org.project.item.armors;
public class VampireArmor extends Armor {
private static final String NAME = "vampire armor";
private static final ArmorType ARMOR_TYPE = ArmorType.MEDIUM;
private static final int MAX_DEFENSE = 16;
private static final int MAX_DURABILITY = 30;
public VampireArmor() {
super(NAME,
ARMOR_TYPE,
MAX_DEFENSE,
MAX_DURABILITY
);
}
}
@@ -0,0 +1,17 @@
package org.project.item.armors;
public class WizardArmor extends Armor {
private static final String NAME = "wizard Robe";
private static final ArmorType ARMOR_TYPE = ArmorType.MEDIUM;
private static final int MAX_DEFENSE = 20;
private static final int MAX_DURABILITY = 20;
public WizardArmor() {
super(NAME,
ARMOR_TYPE,
MAX_DEFENSE,
MAX_DURABILITY
);
}
}
@@ -1,8 +1,40 @@
package org.project.item.consumables; package org.project.item.consumables;
import org.project.entity.players.Player;
// TODO: UPDATE IMPLEMENTATION // TODO: UPDATE IMPLEMENTATION
public abstract class Consumable { public abstract class Consumable {
/* /*
TODO: ADD OTHER REQUIRED AND BONUS METHODS TODO: ADD OTHER REQUIRED AND BONUS METHODS
*/ */
private String name;
private int healAmount;
private int charges;
public Consumable(String name, int healAmount, int charges) {
this.name = name;
this.healAmount = healAmount;
this.charges = charges;
}
public void use(Player target) {
if (charges <= 0) {
System.out.println("The flask is empty!");
return;
}
target.heal(healAmount);
charges--;
}
public int getCharges() {
return charges;
}
public String getName() {
return name;
}
} }