package com.rhazzoul.tournament.warriors; import com.rhazzoul.tournament.equipments.Buckler; import com.rhazzoul.tournament.equipments.Defense; import com.rhazzoul.tournament.equipments.Equipment; import com.rhazzoul.tournament.weapons.Axe; import com.rhazzoul.tournament.weapons.Sword; import com.rhazzoul.tournament.weapons.Weapon; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; public class Swordsman implements Warrior { private int hitPoints = 100; private Weapon weapon; private List equipments; public Swordsman() { this.equipments = new ArrayList<>(); this.weapon = new Sword(); } @Override public void engage(Warrior warrior) { if (this.getEquipments().isEmpty() && warrior.getEquipments().isEmpty()) { while (this.hitPoints() > 0 && warrior.hitPoints() > 0) { warrior.setHitPoints(warrior.hitPoints() - this.weapon.getDamage()); this.setHitPoints(this.hitPoints() - warrior.getWeapon().getDamage()); } } else { while (this.hitPoints() > 0 && warrior.hitPoints() > 0) { if (isTheBucklerDestroyed(warrior) || wasTheBucklerUsed(warrior)) { warrior.setHitPoints(warrior.hitPoints() - this.getWeapon().getDamage()); } setBucklerUsage(warrior, this); if (isTheBucklerDestroyed(this) || wasTheBucklerUsed(this)) { this.setHitPoints(this.hitPoints() - warrior.getWeapon().getDamage()); } setBucklerUsage(this, warrior); } } if (this.hitPoints < 0) this.setHitPoints(0); else warrior.setHitPoints(0); } @Override public Swordsman equip(String weapon) { switch (weapon) { case "buckler": equipments.add(new Buckler()); break; case "defense": equipments.add(new Defense()); break; } return this; } public int hitPoints() { return hitPoints; } public void setHitPoints(int hitPoints) { this.hitPoints = hitPoints; } public Weapon getWeapon() { return weapon; } public void setWeapon(Weapon weapon) { this.weapon = weapon; } public List getEquipments() { return equipments; } public void setEquipments(List equipments) { this.equipments = equipments; } public Buckler getBuckler(Warrior warrior) { return warrior.getEquipments() .stream() .filter(x -> x instanceof Buckler) .map(x -> (Buckler) x) .findFirst() .get(); } public boolean wasTheBucklerUsed(Warrior warrior) { return getBuckler(warrior).isWasUsed(); } public boolean isTheBucklerDestroyed(Warrior warrior){ return getBuckler(warrior).isDestroyed(); } public void setBucklerUsage(Warrior warrior, Warrior enemy) { Buckler buckler = getBuckler(warrior); if (enemy.getWeapon() instanceof Axe && buckler.getNumberOfHits() >= 3) { buckler.setDestroyed(true); } else if (buckler.isWasUsed()) { buckler.setNumberOfHits(buckler.getNumberOfHits() + 1); buckler.setWasUsed(!buckler.isWasUsed()); } else buckler.setWasUsed(!buckler.isWasUsed()); } }