implement Java-Knight gameplay

This commit is contained in:
2026-05-18 01:44:39 +04:30
parent 78d4bedb08
commit 006b318509
65 changed files with 2319 additions and 258 deletions
+439
View File
@@ -0,0 +1,439 @@
import org.project.Colors;
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.armors.AssassineArmor;
import org.project.item.armors.KnightArmor;
import org.project.item.armors.WizardArmor;
import org.project.item.consumables.*;
import org.project.item.weapons.AssassineWeapon;
import org.project.item.weapons.Sword;
import org.project.item.weapons.WizardWeapon;
import org.project.location.Location;
import javax.swing.plaf.metal.MetalRootPaneUI;
import java.util.*;
public class Main {
public static void main(String[] args) {
// TODO: ADD LOCATIONS TO YOUR GAME
List<Location> locations = new ArrayList<>();
Location loc1 = new Location("Darkmire Hollow");
loc1.addEnemy(new Goblin());
Location loc2 = new Location("Grave of the Fallen");
loc2.addEnemy(new Skeleton());
Location loc3 = new Location("Goblin Warrens");
loc3.addEnemy(new Goblin());
Location loc4 = new Location("Vampire's Embrace");
loc4.addEnemy(new Vampire());
Location loc5 = new Location("Blightmoor Cave");
loc5.addEnemy(new Goblin());
loc5.addEnemy(new Skeleton());
Location loc6 = new Location("Crypt of Bleeding Bones");
loc6.addEnemy(new Vampire());
loc6.addEnemy(new Skeleton());
Location loc7 = new Location("Cackling Caverns");
loc7.addEnemy(new Goblin());
loc7.addEnemy(new Goblin());
loc7.addEnemy(new Goblin());
Collections.addAll(locations, loc1, loc2, loc3, loc4, loc5, loc6, loc7);
List<Consumable> allItems = new ArrayList<>();
Collections.addAll(allItems, new CursedDagger(), new ElixirOfLife(), new GoblinGland(), new HealthPotion(), new HolyWater(), new ManaPotion());
// TODO: IMPLEMENT GAMEPLAY
System.out.print(Colors.RESET + "enter your name: ");
Scanner in = new Scanner(System.in);
String name = in.next();
System.out.println("Choos your character: ");
System.out.println("1.Knight: ");
System.out.println("2.Assassine");
System.out.println("3.Wizard");
Player player = null;
int input2 = in.nextInt();
while (input2 > 3 || input2 < 1)
{
System.out.println("invalid input!");
System.out.println("Choos your character: ");
System.out.println("1.Knight");
System.out.println("2.Assassine");
System.out.println("3.Wizard");
input2 = in.nextInt();
}
switch (input2)
{
case (1):
{
player = new Knight(name, new Sword(), new KnightArmor());
break;
}
case(2):
{
player = new Assassin(name, new AssassineWeapon(), new AssassineArmor());
break;
}
case(3):
{
player = new Wizard(name, new WizardWeapon(), new WizardArmor());
break;
}
}
player.showInf();
System.out.println(Colors.YELLO + "WELCOME\n" + Colors.RESET);
boolean running = true;
while (running)
{
Location randomLoc = locations.get(new Random().nextInt(7));
// while (randomLoc.isDiscovered())
// {
// randomLoc = locations.get(new Random().nextInt());
// }
System.out.println(randomLoc);
System.out.println("1.Fight the enemies");
System.out.println("2.Move to another location");
System.out.println("3.Visit Merchant");
boolean hasKeys = player.getGoblinKey() && player.getSkeletonKey() && player.getVampireKey();
if(hasKeys)
{
System.out.println("4.Go to the Castle to fight the Dragon");
}
int input = in.nextInt();
while((input > 4 || input < 1))
{
System.out.println("input is invalid!");
System.out.println(randomLoc);
System.out.println("1.Fight the enemies");
System.out.println("2.Move to another location");
System.out.println("3.Visit Merchant");
if(hasKeys)
{
System.out.println("4.Go to the Castle to fight the Dragon");
}
in.next();
input = in.nextInt();
}
switch (input)
{
case (1):
{
if(randomLoc.getEnemies().size() > 1)
{
System.out.println("You have to fight with " + randomLoc.getEnemies().size() + " enemies!");
System.out.println("How Brave you are!");
System.out.println(Colors.YELLO + "Have luck" + Colors.RESET);
}
//or && running?
while (randomLoc.checkLives() && player.isAlive())
{
for (int i = 0; i < randomLoc.getEnemies().size(); i++) {
Enemy currentEnemy = randomLoc.getEnemies().get(i);
System.out.println("You know have to fight with " + currentEnemy.getClass().getSimpleName());
if (combat(player, currentEnemy))
{
// randomLoc.defeatEnemy(currentEnemy);
if (player.needLevelUp()) {
player.levelUp();
}
}
else
{
running = false;
break;
}
}
}
if(player.isAlive())
{
player.setHp(player.getMaxHP());
player.fillMana(player.getMaxMP());
player.getArmor().repair();
randomLoc.resetLives();
}
break;
}
case(2):
{
break;
}
case(3):
{
System.out.println(Colors.WELCOME + "Welcome, traveler!" + Colors.RESET);
int input4;
do
{
for (int i = 0; i < allItems.size(); i++) {
System.out.println((i + 1) + "." + allItems.get(i));
}
System.out.println(Colors.ORANGE + "[" + Colors.RESET + "Your coins: " + Colors.COIN + player.getCoin() + Colors.ORANGE + "]" + Colors.RESET);
System.out.println("Which one do you want to buy?");
System.out.println("enter your choice(write 0 to back): ");
input4 = in.nextInt();
if(input4 < 0 || input4 > allItems.size())
{
System.out.println("invalid input!");
continue;
}
switch (input4) {
case (0): {
break;
}
case (1): {
if (allItems.get(0).getValue() <= player.getCoin()) {
player.addItem(allItems.get(0));
player.setCoin(player.getCoin() - allItems.get(0).getValue());
break;
}
}
case (2): {
if (allItems.get(1).getValue() <= player.getCoin()) {
player.addItem(allItems.get(1));
player.setCoin(player.getCoin() - allItems.get(1).getValue());
break;
}
}
case (3): {
if (allItems.get(2).getValue() <= player.getCoin()) {
player.addItem(allItems.get(2));
player.setCoin(player.getCoin() - allItems.get(2).getValue());
break;
}
}
case (4): {
if (allItems.get(3).getValue() <= player.getCoin()) {
player.addItem(allItems.get(3));
player.setCoin(player.getCoin() - allItems.get(3).getValue());
break;
}
}
case (5): {
if (allItems.get(4).getValue() <= player.getCoin()) {
player.addItem(allItems.get(4));
player.setCoin(player.getCoin() - allItems.get(4).getValue());
break;
}
}
case (6): {
if (allItems.get(5).getValue() <= player.getCoin()) {
player.addItem(allItems.get(5));
player.setCoin(player.getCoin() - allItems.get(5).getValue());
break;
}
}
default: {
System.out.println("You don't have enough coin!");
}
}
}while (input4 != 0 );
}
case(4):
{
if(hasKeys)
{
if (combat(player, new Dragon()))
{
System.out.println(Colors.PINK + "VICTORY!!!!!!!");
running = false;
}
else
{
running = false;
break;
}
}
}
}
}
}
public static boolean combat(Player p, Enemy e)
{
int round = 0;
while (p.isAlive() && e.isAlive())
{
// System.out.println("You choos to fight with " + e.getClass().getSimpleName());
System.out.printf(Colors.ORANGE + "[" + Colors.RESET + p.getName() + " - " +"%d/%d HP | %d/%d Mana" + Colors.ORANGE + "]\n" ,
p.getHp(), p.getMaxHP(), p.getMp(), p.getMaxMP());
System.out.printf(Colors.ORANGE + "[" + Colors.RESET + e.getClass().getSimpleName() + " - " +"%d/%d HP" + Colors.ORANGE + "]\n" + Colors.RESET, e.getHp(), e.getMaxHP() );
System.out.println("Your turn:");
switch (p) {
case Knight knight ->
System.out.println("1.Light Attack | 2.Heavy Attack " + Colors.ORANGE + "(" + Colors.RESET + "-50 " + Colors.BLUE + "Mana" + Colors.ORANGE + ")" +
Colors.RESET + " | 3.Defend " + Colors.ORANGE + "(" + Colors.RESET + "-40 " + Colors.BLUE + "Mana" + Colors.ORANGE + ")" +
Colors.RESET + " | 4.Heal" + Colors.ORANGE + "(" + Colors.RESET + "-45 " + Colors.BLUE + "Mana" + Colors.ORANGE + ")" +
Colors.RESET + " | 5.Shield Bash " + Colors.ORANGE + "(" + Colors.RESET + "-65 " + Colors.BLUE + "Mana" + Colors.ORANGE + ")\n" + Colors.RESET);
case Assassin assassin ->
System.out.println("1.Light Attack | 2.Heavy Attack " + Colors.ORANGE + "(" + Colors.RESET + "-55 " + Colors.BLUE + "Mana" + Colors.ORANGE + ")" +
Colors.RESET + " | 3.Defend " + Colors.ORANGE + "(" + Colors.RESET + "-40 " + Colors.BLUE + "Mana" + Colors.ORANGE + ")" +
Colors.RESET + " | 4.Heal" + Colors.ORANGE + "(" + Colors.RESET + "-45 " + Colors.BLUE + "Mana" + Colors.ORANGE + ")" +
Colors.RESET + " | 5.Shadow Strike " + Colors.ORANGE + "(" + Colors.RESET + "-80 " + Colors.BLUE + "Mana" + Colors.ORANGE + ")\n" + Colors.RESET);
case Wizard wizard ->
System.out.println("1.Light Attack | 2.Heavy Attack " + Colors.ORANGE + "(" + Colors.RESET + "-65 " + Colors.BLUE + "Mana" + Colors.ORANGE + ")" +
Colors.RESET + " | 3.Defend " + Colors.ORANGE + "(" + Colors.RESET + "-40 " + Colors.BLUE + "Mana" + Colors.ORANGE + ")" +
Colors.RESET + " | 4.Heal" + Colors.ORANGE + "(" + Colors.RESET + "-45 " + Colors.BLUE + "Mana" + Colors.ORANGE + ")" +
Colors.RESET + " | 5.Blood Burn " + Colors.ORANGE + "(" + Colors.RESET + "-75 " + Colors.BLUE + "Mana" + Colors.ORANGE + ")\n" + Colors.RESET);
default -> {
}
}
if(!p.getItems().isEmpty())
{
System.out.println("press 6 to see your items.");
}
Scanner input = new Scanner(System.in);
int input3 = input.nextInt();
switch (input3)
{
case(1):
{
p.lightAttack(e);
break;
}
case(2):
{
if(!p.heavyAttack(e))
{
continue;
}
break;
}
case(4):
{
if(!p.heal(p.getMaxHP()))
{
continue;
}
break;
}
case(5):
{
if(!p.specialAbility(e))
{
continue;
}
break;
}
case(6):
{
if(!p.getItems().isEmpty())
{
p.showItems();
System.out.println("What do you want to use: ");
System.out.println("press 0 to back.");
// System.out.println(p);
int input5 = input.nextInt();
while (input5 < 0 || input5 > p.getItems().size())
{
System.out.println("invalid input!");
p.showItems();
System.out.println("What do you want to use: ");
System.out.println("press 0 to back.");
input5 =input.nextInt();
}
if(input5 == 0)
{
continue;
}
else
{
if(p.getItems().get(input5 - 1).getTargetType().equals("Player"))
{
p.getItems().get(input5 - 1).use(p);
}
else
{
if(p.getItems().get(input5 - 1) instanceof GoblinGland)
{
p.getItems().get(input5 - 1).use(e);
continue;
}
p.getItems().get(input5 - 1).use(e);
}
p.useItem(p.getItems().get(input5 - 1));
}
}
break;
}
}
if(e.isAlive())
{
if(e.isConfuse())
{
System.out.println("Enemy lost its turn cause of confusion");
continue;
}
if (input3 == 5 && p instanceof Knight)
{
System.out.printf("%s couldn't do anything in his round\n", e.getClass().getSimpleName());
continue;
}
if(e.HaveBleed())
{
// System.out.println(e.getClass().getSimpleName() + " is " + Colors.RED + "Bleeding!\n" + Colors.RESET);
e.bleed((AssassineWeapon) p.getWeapon());
}
System.out.printf("%s" + "'s turn:\n", e.getClass().getSimpleName());
if (input3 == 3) {
p.defend(e.attack());
}
else
{
if(e instanceof Dragon)
{
p.takeDamage((Dragon) e);
}
else if(p instanceof Wizard w) {
w.takeDamage(e ,e.attack());
}
else
{
p.takeDamage(e.attack());
}
}
if(!p.isAlive())
{
System.out.println("You " + Colors.RED + "Died" + Colors.BLUE + ":(");
return false;
}
round++;
if(round == 2)
{
round = 0;
if (p instanceof Knight) {
p.fillMana(p.getMaxMP() / 5);
} else {
p.fillMana(p.getMaxMP() / 10);
}
}
}
else
{
System.out.println("You defeat the " + e.getClass().getSimpleName());
p.addXp(e);
p.addCoin(e);
e.dropKey(p);
System.out.println("Keep moving forward!");
System.out.println("Good luck!");
return true;
}
}
return false;
}
}
@@ -0,0 +1,33 @@
package org.project;
import org.project.entity.enemies.*;
import org.project.entity.players.Assassin;
import org.project.entity.players.Knight;
import org.project.entity.players.Player;
import org.project.entity.players.Wizard;
import org.project.item.armors.AssassineArmor;
import org.project.item.armors.KnightArmor;
import org.project.item.armors.WizardArmor;
import org.project.item.weapons.AssassineWeapon;
import org.project.item.weapons.Sword;
import org.project.item.weapons.WizardWeapon;
import org.project.location.Location;
import java.util.*;
public class Colors {
public static final String RED = "\u001b[38;5;124m";
public static final String LIGHTRED = "\u001b[38;5;160m";
public static final String ORANGE = "\u001b[38;5;202m";
public static final String FIRE = "\u001b[38;5;208m";
public static final String BLUE = "\u001b[38;5;33m";
public static final String KEY = "\u001b[38;5;14m";
public static final String LIGHTBLUE = "\u001b[38;5;68m";
public static final String RESET = "\u001b[38;5;15m";
public static final String YELLO = "\u001b[38;5;226m";
public static final String COIN = "\u001b[38;5;214m";
public static final String PURPLE = "\u001b[38;5;164m";
public static final String PINK = "\u001b[38;5;205m";
public static final String HEAL = "\u001b[38;5;203m";
public static final String WELCOME = "\u001b[38;5;65m";
}
@@ -1,15 +0,0 @@
package org.project;
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<Location> locations = new ArrayList<>();
// TODO: IMPLEMENT GAMEPLAY
}
}
@@ -1,20 +1,14 @@
package org.project.entity;
public interface Entity {
void attack(Entity target);
void defend();
void heal(int health);
void fillMana(int mana);
void takeDamage(int damage);
int getMaxHP();
int getMaxMP();
boolean heal(int health);
boolean isAlive();
/*
TODO: ADD OTHER REQUIRED AND BONUS METHODS
*/
@@ -0,0 +1,13 @@
package org.project.entity;
public interface ICombatActions {
void lightAttack(Entity target);
boolean heavyAttack(Entity target);
boolean specialAbility(Entity target);
boolean defend(int damage);
}
@@ -0,0 +1,25 @@
package org.project.entity.enemies;
import org.project.entity.players.Player;
import java.util.Random;
public class Dragon extends Enemy{
public Dragon() {
super(250, 58);
}
@Override
public int attack() {
if(new Random().nextInt(100) < 35)
{
return 100;
}
return super.getDamage();
}
@Override
public void dropKey(Player player) {
return;
}
}
@@ -1,34 +1,138 @@
package org.project.entity.enemies;
import org.project.item.weapons.Weapon;
import org.project.Colors;
import org.project.entity.Entity;
import org.project.entity.players.Player;
import org.project.item.weapons.AssassineWeapon;
// TODO: UPDATE IMPLEMENTATION
public abstract class Enemy {
Weapon weapon;
public abstract class Enemy implements Entity {
private final int maxHp;
private int hp;
private int mp;
private Boolean haveBleed;
private int bleedingRound;
private final int damage;
public boolean confuse;//for Goblin Gland
public Enemy(int hp, int mp, Weapon weapon) {
this.hp = hp;
this.mp = mp;
this.weapon = weapon;
public Enemy(int maxHp, int damage) {
this.maxHp = maxHp;
this.hp = maxHp;
this.damage = damage;
this.haveBleed = false;
this.bleedingRound = 0;
this.confuse = false;
}
public void setConfuse(boolean confuse) {
this.confuse = confuse;
}
public boolean isConfuse()
{
if(confuse)
{
confuse = false;
return true;
}
return false;
}
public int getDamage() {
return damage;
}
@Override
public boolean heal(int health) {
System.out.printf("%s healed for " + Colors.LIGHTRED + "%d" + Colors.RESET +" HP\n", this.getClass().getSimpleName(), health);
hp += health;
if (hp > maxHp) {
hp = maxHp;
}
return true;
}
@Override
public int getMaxHP() {
return maxHp;
}
public void bleed(AssassineWeapon aw)
{
if(haveBleed)
{
if(bleedingRound > 0)
{
System.out.printf("%s Bleeds out!."+ Colors.RED + "-%d" +Colors.RESET + " HP\n", this.getClass().getSimpleName(), aw.getBleedDamage());
hp -= aw.getBleedDamage();
this.bleedingRound--;
}
if(bleedingRound == 0)
{
this.haveBleed = false;
}
}
}
public int getBleedingRound() {
return bleedingRound;
}
public void setBleedingRound(int bleedingRound) {
this.bleedingRound = bleedingRound;
}
public Boolean HaveBleed() {
return haveBleed;
}
public void setHaveBleed(Boolean haveBleed) {
this.haveBleed = haveBleed;
}
@Override
public boolean isAlive() {
return hp > 0;
}
public int attack()
{
return damage;
}
public abstract void dropKey(Player player);
@Override
public void takeDamage(int damage) {
hp -= damage;
if(hp < 0)
{
hp = 0;
}
System.out.printf("%s took " + Colors.RED + "%d" + Colors.RESET + " damage!\n",this.getClass().getSimpleName(), damage);
}
public int getHp() {
return hp;
}
public int getMp() {
return mp;
public void setHp(int hp) {
this.hp = hp;
if(hp > maxHp)
{
hp = maxHp;
}
}
// public int getMp() {
// return mp;
// }
public Weapon getWeapon() {
return weapon;
}
// public Weapon getWeapon() {
// return weapon;
// }
}
@@ -0,0 +1,45 @@
package org.project.entity.enemies;
import org.project.Colors;
import org.project.entity.players.Player;
import java.util.Random;
public class Goblin extends Enemy{
private int hitChance;
public Goblin() {
super(50, 25);
this.hitChance = 20;
}
Random rand = new Random();
@Override
public int attack() {
if(rand.nextInt(100) < hitChance)
{
System.out.println("Goblin used Critical Strike!");
hitChance -= 5;
return 45;
}
else
{
System.out.println("Goblin attacked");
return super.getDamage();
}
}
@Override
public void dropKey(Player player) {
if(!player.getGoblinKey())
{
if (new Random().nextInt(100) < 50) {
System.out.println("Goblin dropped a " + Colors.KEY +"KEY" +Colors.RESET +"!");
player.setGoblinKey(true);
}
}
}
}
@@ -1,6 +1,53 @@
package org.project.entity.enemies;
import org.project.Colors;
import org.project.entity.players.Player;
import java.util.Random;
// TODO: UPDATE IMPLEMENTATION
public class Skeleton {
public class Skeleton extends Enemy {
private int lifeChance;
public Skeleton() {
super(60, 30);
this.lifeChance = 1;
}
@Override
public boolean isAlive() {
if(super.getHp() <= 0)
{
if(lifeChance >= 1)
{
lifeChance--;
super.setHp(30);
System.out.println("Skeleton rises again with 50% of HP (current HP: 30)");
return true;
}
else
{
return false;
}
}
else
{
return true;
}
}
@Override
public void dropKey(Player player) {
if(!player.getSkeletonKey())
{
if (new Random().nextInt(100) < 35) {
System.out.println("Skeleton dropped a " + Colors.KEY +"KEY" +Colors.RESET +"!");
player.setSkeletonKey(true);
}
}
}
// TODO: DESIGN ENEMY AND IMPLEMENT THE CONSTRUCTOR
}
@@ -0,0 +1,38 @@
package org.project.entity.enemies;
import org.project.Colors;
import org.project.entity.players.Player;
import java.util.Random;
public class Vampire extends Enemy{
public Vampire() {
super(75, 35);
}
@Override
public boolean heal(int health) {
super.setHp(super.getHp() + health);
return false;
}
@Override
public int attack() {
System.out.println("Your HP is know VAMPIRE's HP!");
super.heal(super.getDamage() / 2);
return super.getDamage();
}
@Override
public void dropKey(Player player) {
if(!player.getVampireKey())
{
if (new Random().nextInt(100) < 40) {
System.out.println("Vampire dropped a " + Colors.KEY +"KEY" +Colors.RESET +"!");
player.setVampireKey(true);
}
}
}
}
@@ -0,0 +1,169 @@
package org.project.entity.players;
import org.project.Colors;
import org.project.entity.Entity;
import org.project.entity.enemies.Enemy;
import org.project.item.armors.AssassineArmor;
import org.project.item.weapons.AssassineWeapon;
public class Assassin extends Player{
public Assassin(String name, AssassineWeapon weapon, AssassineArmor armor) {
super(name, 65, 120, weapon, armor, 70);
super.setDamage(35);
}
@Override
public void levelUp() {
if(super.getLevel() < 5) {
addLevel();
System.out.printf("You leveled up! " +Colors.ORANGE +"(" +Colors.RESET +"your level: " + Colors.LIGHTBLUE + "%d" + Colors.ORANGE +")\n" + Colors.RESET, super.getLevel());
switch (super.getLevel())
{
case (2):
{
super.setMaxHP(super.getMaxHP() + ((20*super.getMaxHP()) / 100 ));
System.out.println("Your maximum HP is know 20% higher");
super.setDamage(super.getDamage() + ((20*super.getMaxHP()) / 100 ));
System.out.println("Your base damage is know 20% higher");
break;
}
case(3):
{
AssassineArmor asA = (AssassineArmor) super.getArmor();
asA.setDodgeChance(asA.getDodgeChance() + asA.getDodgeChance()/2);
System.out.println("Your dodge chance is know " + asA.getDodgeChance());
asA.setMaxPercentage(2*asA.getMaxPercentage());
System.out.println("Your defend percentage is know " + asA.getDefensePercentage());
break;
}
case(4):
{
super.setDamage(super.getDamage() + super.getDamage()/ 2);
System.out.println("Your base damage is know 50% higher");
AssassineWeapon aw = (AssassineWeapon) super.getWeapon();
aw.setBleedingRound(aw.getBleedingRound() + 1);
System.out.println("Bleed duration on the enemy increased to two rounds (up from one)");
aw.setBleedChance(2*aw.getBleedChance());
System.out.println("Your bleed chance is know " + aw.getBleedChance());
break;
}
case (5):
{
super.setMaxHP(super.getMaxHP() + ((30*super.getMaxHP()) / 100 ));
System.out.println("Your maximum HP is know 20% higher");
super.setMaxMP(super.getMaxMP() + ((10*super.getMaxMP()) / 100 ));
System.out.println("Your maximum Mana is know 10% higher");
super.getWeapon().setDamage(super.getWeapon().getDamage() + ((30*super.getWeapon().getDamage()) / 100 ));
System.out.println("Your Weapon damage is know 30% higher");
super.setMaxDefense(super.getMaxDefense() + ((20*super.getMaxDefense()) / 100 ));
System.out.println("Your maximum defence is know 20% higher");
AssassineWeapon aw = (AssassineWeapon) super.getWeapon();
aw.setBleedingRound(aw.getBleedingRound() + 1);
System.out.println("Bleed duration on the enemy increased to three rounds (up from two)");
break;
}
}
super.setHp(super.getMaxHP());
super.fillMana(super.getMaxMP());
super.getArmor().repair();
System.out.println();
showInf();
}
}
@Override
public boolean heavyAttack(Entity target) {
if(super.getMp() >= super.getWeapon().getManaCost()) {
super.setMp(super.getMp() - super.getWeapon().getManaCost());
System.out.printf("%s (%s) uses heavy attack.\n", name, this.getClass().getSimpleName());
target.takeDamage(super.getWeapon().getDamage());
AssassineWeapon aw = (AssassineWeapon) super.getWeapon();
aw.manaGain(this, aw.getDamage() / 4);
if(target instanceof Enemy enemy)
{
enemy.setHaveBleed(aw.bleed());
if(enemy.HaveBleed())
{
enemy.setBleedingRound(aw.getBleedingRound());
}
}
return true;
}
System.out.println("You don't have enough " + Colors.BLUE + "Mana" + Colors.RESET + " for heavy attack.");
return false;
}
@Override
public void takeDamage(int damage) {
AssassineArmor asA = (AssassineArmor) super.getArmor();
int defence = asA.getDefense(damage);
if(defence == damage)
{
System.out.printf("%s (Assassin) dodged the attack.\n", super.name);
}
else {
super.takeDamage(damage - defence);
}
}
@Override
public boolean specialAbility(Entity target) {
if(super.getMp() > 80) {
super.setMp(super.getMp() - 80);
System.out.printf("%s (Assassin) uses special ability.\n", super.name);
System.out.println("Assassin dodged the " + Colors.RED + "attack" + Colors.RESET);
AssassineWeapon aw = (AssassineWeapon) super.getWeapon();
System.out.printf("%s (Assassin) used Critical Strike!\n", super.name);
target.takeDamage(aw.criticalHit());
return true;
}
System.out.println("You don't have enough " + Colors.BLUE + "Mana" + Colors.RESET + " for your special ability.");
return false;
}
@Override
public void showInf() {
AssassineArmor asA = (AssassineArmor) super.getArmor();
AssassineWeapon aw = (AssassineWeapon) super.getWeapon();
System.out.println("Your information:");
System.out.printf("""
Level: %d
HP: %d
MP: %d
Coin: %d
Maximum defence: %d
Armor:
Durability: %d
DefensePercentage: %d
Dodge chance: %d
Weapon:
Damage: %d
Mana cost: %d
Bleed chance: %d
Bleed damage: %d
Bleeding round: %d
Critical hit: %d
""", super.getLevel(), super.getHp(), super.getMp(), super.getCoin(), super.getMaxDefense(),
super.getArmor().getDurability(), super.getArmor().getDefensePercentage(),
asA.getDodgeChance(), aw.getDamage(), aw.getManaCost() ,aw.getBleedChance(),
aw.getBleedDamage(), aw.getBleedingRound(), 3*aw.getDamage() );
}
}
@@ -1,6 +1,144 @@
package org.project.entity.players;
import org.project.Colors;
import org.project.entity.Entity;
import org.project.item.armors.Armor;
import org.project.item.armors.KnightArmor;
import org.project.item.weapons.Sword;
import org.project.item.weapons.Weapon;
// TODO: UPDATE IMPLEMENTATION
public class Knight {
public class Knight extends Player {
public Knight(String name,Sword weapon, KnightArmor armor) {
//although hp is low but armor is wow.
super(name, 60, 70, weapon, armor, 65);
super.setDamage(40);
}
@Override
public void levelUp() {
if(super.getLevel() < 5) {
addLevel();
System.out.printf("You leveled up! " +Colors.ORANGE +"(" +Colors.RESET +"your level: " + Colors.LIGHTBLUE + "%d" + Colors.ORANGE +")\n" + Colors.RESET, super.getLevel());
switch (super.getLevel())
{
case (2):
{
super.setMaxHP(super.getMaxHP() + ((15*super.getMaxHP()) / 100 ));
System.out.println("Your maximum HP is know 15% higher");
super.setMaxMP(super.getMaxMP() + ((10*super.getMaxMP()) / 100 ));
System.out.println("Your maximum Mana is know 10% higher");
break;
}
case(3):
{
super.getArmor().setMaxDurability(super.getArmor().getMaxDurability() + ((10 * super.getArmor().getMaxDurability()) / 100));
System.out.println("Your armor's maximum durability is know 10% higher");
break;
}
case(4):
{
super.setMaxHP(super.getMaxHP() + ((40*super.getMaxHP()) / 100 ));
System.out.println("Your maximum HP is know 40% higher");
Sword sword = (Sword) super.getWeapon();
sword.setSpecialDamage(sword.getSpecialDamage() + (10*sword.getSpecialDamage() / 100 ));
System.out.println("Your sword special damage is know 10% higher");
super.setDamage(super.getDamage() + ((20*super.getDamage()) / 100 ));
System.out.println("Your base damage is know 20% higher");
super.getWeapon().setManaCost(super.getWeapon().getManaCost() - ((10*super.getWeapon().getManaCost()) / 100 ));
System.out.println("Your weapon mana cost decreased by 10%");
break;
}
case (5):
{
super.setMaxMP(super.getMaxMP() + ((20*super.getMaxMP()) / 100 ));
System.out.println("Your maximum mana is know 20% higher");
super.setMaxDefense(super.getMaxDefense() + ((20*super.getMaxDefense()) / 100 ));
System.out.println("Your maximum defence is know 20% higher");
super.getWeapon().setDamage(super.getWeapon().getDamage() + ((10*super.getWeapon().getDamage()) / 100 ));
System.out.println("Your sword damage is know 10% higher");
break;
}
}
}
super.setHp(super.getMaxHP());
super.fillMana(super.getMaxMP());
super.getArmor().repair();
System.out.println();
showInf();
}
@Override
public boolean specialAbility(Entity target) {
if(super.getMp() > 65) {
super.setMp(super.getMp() - 65);
System.out.printf("%s (Knight) uses special ability.\n", super.name);
Sword sword = (Sword) super.getWeapon();
target.takeDamage(sword.getSpecialDamage());
return true;
}
System.out.println("You don't have enough " + Colors.BLUE + "Mana" + Colors.RESET + " for your special ability.");
return false;
}
@Override
public void showInf() {
Sword sword = (Sword) super.getWeapon();
System.out.println("Your information:");
System.out.printf("""
level: %d
HP: %d
MP: %d
Coin: %d
Maximum defence: %d
armor:
durability: %d
defensePercentage: %d
Sword:
damage: %d
mana cost: %d
Special damage: %d
""", super.getLevel(), super.getHp(), super.getMp(), super.getCoin(), super.getMaxDefense(),
super.getArmor().getDurability(), super.getArmor().getDefensePercentage(),
sword.getDamage(),sword.getManaCost() ,sword.getSpecialDamage());
}
// @Override
// public void defend(int damage) {
//
// if(damage > 60)
// {
// int defense = (80 * damage) / 100;
// this.takeDamage(damage - defense);
// System.out.printf("You took " + Colors.BLUE + "%d" + Colors.RESET + "damage!" + Colors.YELLO + "(%d damage was defended)\n" + Colors.RESET, damage, damage - defense);
// }
// else
// {
// System.out.println("The enemy hit defended!");
// }
//
// }
// @Override
// public void takeDamage(int damage) {
// super.takeDamage(damage);
// System.out.printf("%s (Knight) took" + Colors.RED + "%d" + Colors.RESET + "damage!\n",super.name, damage - armor.getDefense(damage) );
// }
// TODO: DESIGN KNIGHT'S WEAPON AND ARMOR AND IMPLEMENT THE CONSTRUCTOR
}
@@ -1,53 +1,195 @@
package org.project.entity.players;
import org.project.Colors;
import org.project.entity.Entity;
import org.project.entity.ICombatActions;
import org.project.entity.enemies.*;
import org.project.item.armors.Armor;
import org.project.item.consumables.Consumable;
import org.project.item.weapons.Weapon;
import java.util.ArrayList;
import static java.lang.Math.*;
// TODO: UPDATE IMPLEMENTATION
public abstract class Player {
public abstract class Player implements Entity, ICombatActions {
protected String name;
Weapon weapon;
Armor armor;
private Weapon weapon;
private Armor armor;
private ArrayList<Consumable> items;
private int hp;
private int maxHP;
private int mp;
private int maxMP;
private int damage;
private int level;
private int xp;
private Boolean goblinKey;
private Boolean skeletonKey;
private Boolean vampireKey;
private int coin;// write it in constructor with right amount
public Player(String name, int hp, int mp, Weapon weapon, Armor armor) {
private int maxDefense;
//
public int getMaxDefense() {
return maxDefense;
}
public void setMaxDefense(int maxDefense) {
this.maxDefense = maxDefense;
}
public Player(String name, int hp, int mp, Weapon weapon, Armor armor, int maxDefense) {
this.name = name;
this.hp = hp;
this.maxHP = hp;
this.maxMP = mp;
this.mp = mp;
this.level = 1;
this.weapon = weapon;
this.armor = armor;
this.maxDefense = maxDefense;
this.goblinKey = false;
this.skeletonKey = false;
this.vampireKey = false;
this.coin = 0;
this.items = new ArrayList<>();
}
@Override
public void attack(Entity target) {
target.takeDamage(weapon.getDamage());
public void lightAttack(Entity target)
{
System.out.printf("%s (%s) used light attack\n", name, this.getClass().getSimpleName());
target.takeDamage(damage);
}
public void addItem(Consumable c)
{
if(items.contains(c))
{
items.get(items.indexOf(c)).addOne();
}
else
{
items.add(c);
}
}
public ArrayList<Consumable> getItems() {
return items;
}
public void useItem(Consumable c)
{
if(items.get(items.indexOf(c)).getNumberOf() > 1)
{
items.get(items.indexOf(c)).reduceOne();
if(items.get(items.indexOf(c)).getNumberOf() == 0)
{
items.remove(c);
}
}
else
{
items.remove(c);
}
}
public void showItems()
{
if(!items.isEmpty())
{
System.out.println("Your items: ");
for (int i = 0; i < items.size(); i++) {
System.out.println((i + 1) + "." + items.get(i).getClass().getSimpleName() + ": " + items.get(i).getNumberOf());
}
}
}
public void setCoin(int coin) {
this.coin = coin;
}
@Override
public boolean heavyAttack(Entity target) {
if(mp >= weapon.getManaCost()) {
System.out.printf("%s (%s) uses heavy attack\n", name, this.getClass().getSimpleName());
target.takeDamage(weapon.getDamage());
mp -= weapon.getManaCost();
return true;
}
System.out.println("You don't have enough " + Colors.BLUE + "Mana" + Colors.RESET + " for heavy attack.");
return false;
}
public void setMp(int mp) {
this.mp = mp;
}
@Override
public void defend() {
// TODO
public boolean defend(int damage) {
if(mp > 40)
{
mp -= 40;
if (damage > maxDefense) {
int defense = (80 * damage) / 100;
this.takeDamage(damage - defense);
System.out.printf("You took " + Colors.BLUE + "%d" + Colors.RESET + "damage!" + Colors.YELLO + "(%d damage was defended)\n" + Colors.RESET, damage, damage - defense);
} else {
System.out.println("The enemy hit defended!");
}
return true;
}
System.out.println("You don't have enough " + Colors.BLUE + "Mana" + Colors.RESET + " to defend.");
return false;
}
@Override
public void takeDamage(int damage) {
hp -= damage - armor.getDefense();
//
//max(0 ,damage - armor.getDefense(damage))
hp -= (damage - armor.getDefense(damage));
System.out.printf("%s (%s) took " + Colors.RED + "%d" + Colors.RESET + " damage!\n",name, this.getClass().getSimpleName(), damage - armor.getDefense(damage) );
}
public void takeDamage(Dragon dragon)
{
hp -= dragon.getDamage();
System.out.println("you can't defeat dragon " + Colors.FIRE + "Fire" + Colors.RESET + "!");
System.out.printf("%s (%s) took " + Colors.RED + "%d" + Colors.RESET + " damage!\n",name, this.getClass().getSimpleName(), dragon.getDamage());
}
@Override
public void heal(int health) {
hp += health;
if (hp > maxHP) {
hp = maxHP;
public boolean heal(int health) {
if(mp > 45)
{
mp -= 45;
System.out.printf("%s (%s) healed for " +Colors.HEAL +"%d" +Colors.RESET+ " HP.\n", name, this.getClass().getSimpleName(), health);
hp += health;
if (hp > maxHP) {
hp = maxHP;
}
return true;
}
System.out.println("You don't have enough " + Colors.BLUE + "Mana" + Colors.RESET + " to heal.");
return false;
}
@Override
public boolean isAlive() {
return hp > 0;
}
public void fillMana(int mana) {
mp += mana;
if (mp > maxMP) {
@@ -55,6 +197,139 @@ public abstract class Player {
}
}
public abstract void levelUp();
/*
(maximum level of every character must be 5)
maxDefense++
damage++
hp++
mp++
level++
(mabe open new items in shop)
*/
public void showInf()
{
System.out.printf("""
level: %d
HP: %d
MP: %d
Maximum defence: %d
armor:
durability: %d
defensePercentage: %d
weapon:
damage: %d
mana cost: %d
""", getLevel(), getHp(), getMp(), getMaxDefense(), armor.getDurability(), armor.getDefensePercentage(), weapon.getDamage(), weapon.getManaCost());
}
public void setMaxMP(int maxMP) {
this.maxMP = maxMP;
}
public void setMaxHP(int maxHP) {
this.maxHP = maxHP;
}
public void addLevel(){level++;}
public void addXp(int XP)
{
if(xp < 600)
{
this.xp += XP;
System.out.printf("You received %d Xp " + Colors.ORANGE +
"[" + Colors.RESET + "Your Xp: %d" + Colors.ORANGE + "]\n", XP, this.xp);
}
}
public void addXp(Enemy e)
{
if(xp < 600)
{
int amount = 0;
if (e instanceof Goblin) {
amount = 50;
} else if (e instanceof Skeleton) {
amount = 70;
} else if (e instanceof Vampire) {
amount = 90;
}
this.xp += amount;
System.out.printf("You received %d Xp " + Colors.ORANGE +
"[" + Colors.RESET + "Your Xp: %d" + Colors.ORANGE + "]\n" + Colors.RESET, amount, this.xp);
}
}
public Boolean needLevelUp()
{
switch (this.level)
{
case (1): {
if (xp >= 50) {
return true;
}
break;
}
case (2):
{
if(xp >= 150)
{
return true;
}
break;
}
case (3):
{
if(xp >= 300)
{
return true;
}
break;
}
case (4):
{
if(xp > 500)
{
return true;
}
break;
}
}
return false;
}
public void addCoin(int amount)
{
this.coin += amount;
System.out.println(Colors.COIN + "+" + amount + " coins!" + Colors.RESET);
}
public void addCoin(Enemy e)
{
int amount = 0;
if (e instanceof Goblin) {
amount = 10;
} else if (e instanceof Skeleton) {
amount = 25;
} else if (e instanceof Vampire) {
amount = 60;
}
this.coin += amount;
System.out.println("You gained " + Colors.COIN + amount + " coins" + Colors.RESET + ".");
}
public int getCoin() {
return coin;
}
public String getName() {
return name;
@@ -64,7 +339,6 @@ public abstract class Player {
return hp;
}
@Override
public int getMaxHP() {
return maxHP;
}
@@ -73,7 +347,6 @@ public abstract class Player {
return mp;
}
@Override
public int getMaxMP() {
return maxMP;
}
@@ -86,4 +359,42 @@ public abstract class Player {
return armor;
}
public int getDamage() {
return damage;
}
public int getXp(){return xp;}
public int getLevel(){return level;}
public void setDamage(int baseDamage){this.damage = baseDamage;}
public void setHp(int hp) {
this.hp = hp;
}
public Boolean getSkeletonKey() {
return skeletonKey;
}
public void setSkeletonKey(Boolean skeletonKey) {
this.skeletonKey = skeletonKey;
}
public Boolean getVampireKey() {
return vampireKey;
}
public void setVampireKey(Boolean vampireKey) {
this.vampireKey = vampireKey;
}
public Boolean getGoblinKey() {
return goblinKey;
}
public void setGoblinKey(Boolean goblinKey) {
this.goblinKey = goblinKey;
}
}
@@ -0,0 +1,134 @@
package org.project.entity.players;
import org.project.Colors;
import org.project.entity.Entity;
import org.project.item.armors.WizardArmor;
import org.project.item.weapons.Weapon;
import org.project.item.weapons.WizardWeapon;
public class Wizard extends Player{
public Wizard(String name, Weapon weapon, WizardArmor armor) {
super(name, 80, 80, weapon, armor,50 );
super.setDamage(35);
super.setMp(super.getMp() + armor.getBonus(this));
super.setMaxMP(super.getMp() + armor.getBonus(this));
}
@Override
public void levelUp() {
if(super.getLevel() < 5) {
addLevel();
System.out.printf("You leveled up! " +Colors.ORANGE +"(" +Colors.RESET +"your level: " + Colors.LIGHTBLUE + "%d" + Colors.ORANGE +")\n" + Colors.RESET, super.getLevel());
switch (getLevel())
{
case (2):
{
super.setMaxDefense(super.getMaxDefense() + ((30*super.getMaxDefense()) / 100));
System.out.println("Your maximum defence is know 30% higher");
super.setMaxHP(super.getMaxHP() + ((10*super.getMaxHP()) / 100));
System.out.println("Your maximum HP is know 10% higher");
break;
}
case(3):
{
WizardArmor wizardArmor = (WizardArmor) super.getArmor();
wizardArmor.setBonusPercent(2*wizardArmor.getBonusPercent());
System.out.println("Bonus percentage has doubled");
wizardArmor.setReflectPercent(wizardArmor.getReflectPercent() + ((30*wizardArmor.getReflectPercent()) / 100));
System.out.println("Reflect percentage increased");
break;
}
case(4):
{
super.setMaxHP(super.getMaxMP() + ((30*super.getMaxMP()) / 100 ));
System.out.println("Your maximum HP is know 30% higher");
WizardWeapon wizardWeapon = (WizardWeapon) super.getWeapon();
wizardWeapon.setManaCost(wizardWeapon.getManaCost() - ((35* wizardWeapon.getManaCost()) / 100 ));
System.out.println("Your weapon mana cost decreased by 35%");
super.setDamage(super.getDamage() + ((50*super.getDamage()) / 100 ));
System.out.println("Your base damage is know 50% higher");
break;
}
case (5):
{
super.setMaxMP(super.getMaxMP() + ((50*super.getMaxMP()) / 100 ));
System.out.println("Your maximum mana is know 50% higher");
super.setMaxHP(super.getMaxHP() + ((40*super.getMaxHP()) / 100 ));
System.out.println("Your maximum HP is know 40% higher");
super.setMaxDefense(super.getMaxDefense() + ((50*super.getMaxDefense()) / 100));
System.out.println("Your maximum defence is know 50% higher");
break;
}
}
}
super.setHp(super.getMaxHP());
super.fillMana(super.getMaxMP());
super.getArmor().repair();
System.out.println();
showInf();
}
public void takeDamage(Entity attacker ,int damage) {
super.takeDamage(damage);
WizardArmor w = (WizardArmor) super.getArmor();
w.reflect(attacker, damage);
}
@Override
public boolean heavyAttack(Entity target) {
if(super.getMp() > super.getWeapon().getManaCost()) {
super.setMp(super.getMp() - super.getWeapon().getManaCost());
System.out.printf("%s (Wizard) performed a triple attack!\n", super.name);
WizardWeapon wp = (WizardWeapon) super.getWeapon();
target.takeDamage(wp.tripleAttack());
return true;
}
System.out.println("You don't have enough " + Colors.BLUE + "Mana" + Colors.RESET + " for heavy attack.");
return false;
}
@Override
public boolean specialAbility(Entity target) {
if(super.getMp() > 75) {
super.setMp(super.getMp() - 75);
System.out.printf("%s (Wizard) uses special ability.\n", super.name);
WizardWeapon w = (WizardWeapon) super.getWeapon();
target.takeDamage(4*w.getDamage());
super.setHp(super.getHp() + ((6 * super.getMaxHP()) / 10));
return true;
}
System.out.println("You don't have enough " + Colors.BLUE + "Mana" + Colors.RESET + " for your special ability.");
return false;
}
@Override
public void showInf() {
WizardArmor w = (WizardArmor) super.getArmor();
System.out.println("Your information:");
System.out.printf("""
level: %d
HP: %d
MP: %d
Coin: %d
Maximum defence: %d
Special damage(in special attack): %d
armor:
durability: %d
defensePercentage: %d
Bonus percentage: %d
Reflect percent: %d
weapon:
damage: %d
mana cost: %d
""", super.getLevel(), super.getHp(), super.getMp(), super.getCoin(), super.getMaxDefense(),
4*super.getWeapon().getDamage(), w.getDurability(), w.getDefensePercentage(),
w.getBonusPercent(), w.getReflectPercent(), super.getWeapon().getDamage(), super.getWeapon().getManaCost());
}
}
@@ -1,11 +0,0 @@
package org.project.item;
import org.project.entity.Entity;
public interface Item {
void use(Entity target);
/*
TODO: ADD OTHER REQUIRED AND BONUS METHODS
*/
}
@@ -1,35 +1,59 @@
package org.project.item.armors;
// TODO: UPDATE IMPLEMENTATION
public abstract class Armor {
private int defense;
private int maxDefense;
public abstract class Armor{
// private int defense;
// private final int maxDefense;
private int defensePercentage;
private int maxPercentage;
private int durability;
private int maxDurability;
private boolean isBroke;
public Armor(int defense, int durability) {
this.defense = defense;
this.durability = durability;
public Armor(int maxPercentage, int maxDurability) {
// this.maxDefense = maxDefense;
// this.defense = maxDefense;
this.maxPercentage = maxPercentage;
this.defensePercentage = maxPercentage;
this.maxDurability = maxDurability;
this.durability = maxDurability;
}
public void setMaxDurability(int maxDurability)
{
this.maxDurability = maxDurability;
}
public int getMaxDurability() {
return maxDurability;
}
public void checkBreak() {
if (durability <= 0) {
isBroke = true;
defense = 0;
defensePercentage = 0;
System.out.println("Your armor broke!");
}
}
// TODO: (BONUS) UPDATE THE REPAIR METHOD
public void repair() {
isBroke = false;
defense = maxDefense;
defensePercentage = maxPercentage;
durability = maxDurability;
}
public int getDefense() {
public int getDefense(int damage) {
int defense = (defensePercentage * damage) / 100;
this.defensePercentage -= (10 * this.defensePercentage) / 100;
reduceDurability(15);
return defense;
}
public int getDurability() {
@@ -39,4 +63,35 @@ public abstract class Armor {
public boolean isBroke() {
return isBroke;
}
public void setBroke(boolean broke) {
isBroke = broke;
}
public void setDurability(int durability) {
this.durability = durability;
}
public void reduceDurability(int percentage)
{
if(durability < percentage)
{
this.durability = 0;
}
else {
this.durability -= (percentage * this.durability) / 100;
}
}
public void setMaxPercentage(int maxPercentage) {
this.maxPercentage = maxPercentage;
}
public int getMaxPercentage() {
return maxPercentage;
}
public int getDefensePercentage() {
return defensePercentage;
}
}
@@ -0,0 +1,39 @@
package org.project.item.armors;
import java.util.Random;
public class AssassineArmor extends Armor{
private int dodgeChance;
public AssassineArmor() {
super(12, 100);
this.dodgeChance = 10;
}
@Override
public int getDefense(int damage) {
if(new Random().nextInt(100) < dodgeChance)
{
System.out.println("Assassin dodged the Hit!");
super.reduceDurability(20);
return damage;
}
else {
return super.getDefense(damage);
}
}
public int getDodgeChance() {
return dodgeChance;
}
public void setDodgeChance(int dodgeChance) {
this.dodgeChance = dodgeChance;
}
}
@@ -1,6 +1,19 @@
package org.project.item.armors;
import org.project.entity.Entity;
// TODO: UPDATE IMPLEMENTATION
public class KnightArmor {
public class KnightArmor extends Armor {
public KnightArmor() {
super(80, 100);
}
// public void useAsWeapon(Entity target) {
// //it will useAsWeapon the Knight armor as weapon
// target.takeDamage(super.getDurability());
// super.setBroke(true);
// }
// TODO: DESIGN ARMOR'S ATTRIBUTES IMPLEMENT THE CONSTRUCTOR
}
@@ -0,0 +1,49 @@
package org.project.item.armors;
import org.project.Colors;
import org.project.entity.Entity;
import org.project.entity.players.Wizard;
public class WizardArmor extends Armor{
//Reflects enemy attacks back to itself.
//you get mana bonus
private int bonusPercent;
private int reflectPercent;
public WizardArmor() {
super(10, 75);
this.bonusPercent = 15;
this.reflectPercent = 20;
}
public int getBonusPercent() {
return bonusPercent;
}
public void setBonusPercent(int bonusPercent) {
this.bonusPercent = bonusPercent;
}
public int getReflectPercent() {
return reflectPercent;
}
public void setReflectPercent(int reflectPercent) {
this.reflectPercent = reflectPercent;
}
public int getBonus(Wizard w)
{
return (bonusPercent*w.getMaxMP()) / 100;
}
public void reflect(Entity attacker, int damage)
{
System.out.printf( Colors.ORANGE + "%d" + Colors.RESET + " of damage reflected.\n", (reflectPercent*damage) / 100);
attacker.takeDamage((reflectPercent*damage) / 100);
super.reduceDurability(12);
}
}
@@ -1,8 +1,46 @@
package org.project.item.consumables;
import org.project.entity.Entity;
// TODO: UPDATE IMPLEMENTATION
public abstract class Consumable {
/*
TODO: ADD OTHER REQUIRED AND BONUS METHODS
*/
private String name;
private int value;
int numberOf;
private final String targetType;
public Consumable(String name, int value, String targetType) {
this.name = name;
this.value = value;
this.targetType = targetType;
this.numberOf = 1;
}
public abstract void use(Entity entity);
public abstract String toString();
public String getName() {
return name;
}
public String getTargetType() {
return targetType;
}
public void addOne()
{
numberOf++;
}
public void reduceOne(){numberOf--;}
public int getNumberOf() {
return numberOf;
}
public int getValue() {
return value;
}
}
@@ -0,0 +1,41 @@
package org.project.item.consumables;
import org.project.Colors;
import org.project.entity.Entity;
import org.project.entity.enemies.Dragon;
import org.project.entity.enemies.Enemy;
import java.util.Collections;
import java.util.Random;
public class CursedDagger extends Consumable{
public CursedDagger() {
super("Cursed Dagger", 80, "Enemy");
}
@Override
public void use(Entity entity) {
Enemy e = (Enemy) entity;
if(!(entity instanceof Dragon))
{
if (new Random().nextInt(100) < 30) {
System.out.println("Cursed Dagger strikes true!");
System.out.println("Enemy " + Colors.RED + "died" + Colors.RESET + "instantly.");
e.setHp(0);
} else {
System.out.println("Cursed dagger fails.");
e.takeDamage(10);
}
}
else
{
System.out.println("Cursed Dagger has no effect on Dragon");
}
}
@Override
public String toString() {
return "Cursed Dagger:\n" + Colors.COIN + "80 coins" +Colors.RESET +"\n30% chance to instantly kill a enemy(do not work for dragon). if it fails, deals 10 damage.";
}
}
@@ -0,0 +1,28 @@
package org.project.item.consumables;
import org.project.Colors;
import org.project.entity.Entity;
import org.project.entity.players.Player;
import java.util.Collections;
public class ElixirOfLife extends Consumable{
public ElixirOfLife() {
super("Elixir Of Life", 100, "Player");
}
@Override
public void use(Entity entity) {
System.out.println(Colors.RED +"Life" +Colors.RESET+ " and " + Colors.BLUE+ "Mana"+ Colors.RESET+ "restored.");
Player p = (Player) entity;
p.setHp(p.getMaxHP());
p.setMp(p.getMaxMP());
}
@Override
public String toString() {
return "Elixir Of Life:\n" + Colors.COIN + "100 coins" +Colors.RESET +"\nFully restores HP and Mana.";
}
}
@@ -1,16 +0,0 @@
package org.project.item.consumables;
import org.project.entity.Entity;
// TODO: UPDATE IMPLEMENTATION
public class Flask {
/*
THIS IS AN EXAMPLE OF A CONSUMABLE DESIGN.
*/
// TODO: UPDATE USE METHOD
@Override
public void use(Entity target) {
target.heal(target.getMaxHP() / 10);
}
}
@@ -0,0 +1,26 @@
package org.project.item.consumables;
import org.project.Colors;
import org.project.entity.Entity;
import org.project.entity.enemies.Enemy;
public class GoblinGland extends Consumable{
public GoblinGland() {
super("Goblin Gland", 15, "Enemy");
}
@Override
public void use(Entity entity) {
System.out.println("Enemy is confused!");
Enemy e = (Enemy) entity;
e.setConfuse(true);
}
@Override
public String toString() {
return "Goblin Gland:\n" + Colors.COIN + "15 coins" +Colors.RESET +"\nThrow to confuse an enemy for 1 turn(They miss their attack).";
}
}
@@ -0,0 +1,24 @@
package org.project.item.consumables;
import org.project.Colors;
import org.project.entity.Entity;
import org.project.entity.players.Player;
public class HealthPotion extends Consumable{
public HealthPotion() {
super("Health Potion", 20, "Player");
}
@Override
public void use(Entity entity) {
System.out.println("You drink The potion. +20 " + Colors.HEAL + "HP" + Colors.RESET + ".");
Player p = (Player) entity;
p.setHp(p.getHp() + 30);
}
@Override
public String toString() {
return "Health Potion:\n" + Colors.COIN + "20 coins" +Colors.RESET +"\nRestores 30 HP instantly.";
}
}
@@ -0,0 +1,32 @@
package org.project.item.consumables;
import org.project.Colors;
import org.project.entity.Entity;
import org.project.entity.enemies.Skeleton;
import org.project.entity.enemies.Vampire;
public class HolyWater extends Consumable{
public HolyWater() {
super("Holy Water", 40, "Enemy");
}
@Override
public void use(Entity entity) {
if(entity instanceof Skeleton || entity instanceof Vampire)
{
System.out.println("Holy water burns the enemy!");
entity.takeDamage(50);
}
else
{
System.out.println("You can't use Holy Water on non-Skeleton|Vampire enemy!");
}
}
@Override
public String toString() {
return "Holy water:\n" + Colors.COIN + "40 coins" +Colors.RESET + "\nDeals 50 holy damage to undead(Skeleton, Vampire).";
}
}
@@ -0,0 +1,23 @@
package org.project.item.consumables;
import org.project.Colors;
import org.project.entity.Entity;
import org.project.entity.players.Player;
public class ManaPotion extends Consumable{
public ManaPotion() {
super("Mana Potion", 20, "Player");
}
@Override
public void use(Entity entity) {
Player p = (Player) entity;
System.out.println("You drink The potion. +20 " + Colors.BLUE + "Mana" + Colors.RESET + ".");
p.setMp(p.getMp() + 20);
}
@Override
public String toString() {
return "Mana Potion:\n" +Colors.COIN + "20 coins" +Colors.RESET +"\nRestores 20 MP instantly";
}
}
@@ -0,0 +1,79 @@
package org.project.item.weapons;
import org.project.Colors;
import org.project.entity.players.Assassin;
import java.util.Random;
public class AssassineWeapon extends Weapon{
private int silenceChance;
private int bleedChance;
private int bleedDamage;
private int bleedingRound;
public AssassineWeapon() {
super(45, 55);
// this.silenceChance = 14;
this.bleedChance = 30;
this.bleedDamage = 10;
this.bleedingRound = 1;
}
public Boolean bleed()
{
return new Random().nextInt(100) < bleedChance;
}
public int criticalHit()
{
return 3*super.getDamage();
}
// public Boolean silence()
// {
// return new Random().nextInt(100) < silenceChance;
// }
public int getBleedingRound() {
return bleedingRound;
}
public void setBleedingRound(int bleedingRound) {
this.bleedingRound = bleedingRound;
}
public int getBleedChance() {
return bleedChance;
}
public void setBleedChance(int bleedChance) {
this.bleedChance = bleedChance;
}
public int getBleedDamage() {
return bleedDamage;
}
public void setBleedDamage(int bleedDamage) {
this.bleedDamage = bleedDamage;
}
//
// public int getSilenceChance() {
// return silenceChance;
// }
//
// public void setSilenceChance(int silenceChance) {
// this.silenceChance = silenceChance;
// }
public void manaGain(Assassin assassin, int amount)
{
System.out.printf("%d of damage gained as " + Colors.BLUE + "Mana.\n" + Colors.RESET, amount);
assassin.fillMana(amount);
}
}
@@ -5,17 +5,29 @@ import org.project.entity.Entity;
import java.util.ArrayList;
// TODO: UPDATE IMPLEMENTATION
public class Sword {
public class Sword extends Weapon {
/*
THIS IS AN EXAMPLE OF A WEAPON DESIGN.
*/
int abilityCharge;
private int specialDamage;
public Sword() {
super(65, 50);
this.specialDamage = 85;
// TODO: DESIGN SWORD'S ATTRIBUTES IMPLEMENT THE CONSTRUCTOR
}
public int getSpecialDamage() {
return specialDamage;
}
public void setSpecialDamage(int specialDamage) {
this.specialDamage = specialDamage;
}
// TODO: (BONUS) UPDATE THE UNIQUE ABILITY
public void uniqueAbility(ArrayList<Entity> targets) {
abilityCharge += 2;
@@ -1,9 +1,7 @@
package org.project.item.weapons;
import org.project.entity.Entity;
// TODO: UPDATE IMPLEMENTATION
public abstract class Weapon {
public abstract class Weapon{
private int damage;
private int manaCost;
@@ -16,15 +14,22 @@ public abstract class Weapon {
this.manaCost = manaCost;
}
@Override
public void use(Entity target) {
target.takeDamage(damage);
}
public int getDamage() {
return damage;
}
public void setDamage(int damage) {
this.damage = damage;
}
public void setManaCost(int manaCost) {
this.manaCost = manaCost;
}
public int getManaCost() {
return manaCost;
}
@@ -0,0 +1,14 @@
package org.project.item.weapons;
import org.project.entity.Entity;
public class WizardWeapon extends Weapon{
public WizardWeapon() {
super(35, 65);
}
public int tripleAttack()
{
return 3*super.getDamage();
}
}
@@ -1,26 +1,124 @@
package org.project.location;
import org.project.entity.enemies.Enemy;
import org.project.entity.enemies.Goblin;
import org.project.entity.enemies.Skeleton;
import org.project.entity.enemies.Vampire;
import java.util.ArrayList;
public class Location {
private String name;
// private Boolean isDiscovered;
private int skeleton = 0;
private int vampire = 0;
private int goblin = 0;
private ArrayList<Enemy> enemies;
// private ArrayList<Location> locations;
public Location(ArrayList<Location> locations, ArrayList<Enemy> enemies) {
this.locations = locations;
this.enemies = enemies;
// ArrayList<Location> locations
public Location(String name) {
// this.locations = locations;
this.name = name;
this.enemies = new ArrayList<>();
// this.isDiscovered = false;
}
public int getGoblin() {
return goblin;
}
public int getVampire() {
return vampire;
}
public int getSkeleton() {
return skeleton;
}
public void addEnemy(Enemy enemy)
{
enemies.add(enemy);
if(enemy instanceof Skeleton)
{
skeleton++;
} else if (enemy instanceof Vampire)
{
vampire++;
}
else if(enemy instanceof Goblin)
{
goblin++;
}
}
public void defeatEnemy(Enemy enemy)
{
enemies.remove(enemy);
}
@Override
public String toString() {
StringBuilder s = new StringBuilder();
s.append(name).append("\n").append("Enemies: \n");
if(skeleton > 0)
{
s.append("Skeleton: ").append(skeleton).append("\n");
}
if(vampire > 0)
{
s.append("Vampire: ").append(vampire).append("\n");
}
if(goblin > 0)
{
s.append("Goblin: ").append(goblin).append("\n");
}
return s.toString();
}
public boolean checkLives()
{
for (Enemy enemy : enemies) {
if (enemy.isAlive()) {
return true;
}
}
return false;
}
public void resetLives()
{
for (Enemy enemy : enemies) {
enemy.setHp(enemy.getMaxHP());
enemy.setHaveBleed(false);
enemy.setBleedingRound(0);
}
}
public String getName() {
return name;
}
public ArrayList<Location> getLocations() {
return locations;
}
// public ArrayList<Location> getLocations() {
// return locations;
// }
// public Boolean isDiscovered() {
// return isDiscovered;
// }
//
// public void setDiscovered(Boolean discovered) {
// isDiscovered = discovered;
// }
public ArrayList<Enemy> getEnemies() {
return enemies;
Binary file not shown.
Binary file not shown.