diff --git a/Java-Knight/src/main/java/org/project/combat/AttackResult.java b/Java-Knight/src/main/java/org/project/combat/AttackResult.java new file mode 100644 index 0000000..df09aa7 --- /dev/null +++ b/Java-Knight/src/main/java/org/project/combat/AttackResult.java @@ -0,0 +1,18 @@ +package org.project.combat; + +public class AttackResult { + + private int damageToTarget; + private int healSelf; + private boolean defended; + + public AttackResult(int damageToTarget, int healSelf, boolean defended) { + this.damageToTarget = damageToTarget; + this.healSelf = healSelf; + this.defended = defended; + } + + public int getDamageToTarget() { return damageToTarget; } + public int getHealSelf() { return healSelf; } + public boolean isDefended() { return defended; } +} diff --git a/Java-Knight/src/main/java/org/project/combat/TotalAttackCalculator.java b/Java-Knight/src/main/java/org/project/combat/TotalAttackCalculator.java new file mode 100644 index 0000000..72cb6a3 --- /dev/null +++ b/Java-Knight/src/main/java/org/project/combat/TotalAttackCalculator.java @@ -0,0 +1,198 @@ +package org.project.combat; + +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.managers.ActionDecisionManager; +import org.project.managers.ManaCostManager; +import org.project.managers.SpecialAbilityManager; +import org.project.managers.StatusEffectManager; + +public class TotalAttackCalculator { + + private final StatusEffectManager statusEffectManager; + private final SpecialAbilityManager specialAbilityManager; + private final ManaCostManager manaCostManager; + + private static final int HEAL_AMOUNT = 25; + private static final int SHIELD_BASH_BASE_DAMAGE = 15; + private static final int SHIELD_BASH_STUN_CHANCE = 30; + + public TotalAttackCalculator( + StatusEffectManager statusEffectManager, + SpecialAbilityManager specialAbilityManager, + ManaCostManager manaCostManager + ) { + this.statusEffectManager = statusEffectManager; + this.specialAbilityManager = specialAbilityManager; + this.manaCostManager = manaCostManager; + } + + public AttackResult calculate( + Entity attacker, + Entity defender, + ActionDecisionManager.actionsType action + ) { + + switch (action) { + + case lightAttack: + return lightAttack(attacker, defender); + + case heavyAttack: + return heavyAttack(attacker, defender); + + case defend: + return defend(attacker); + + case heal: + return heal(attacker); + + case ability: + return ability(attacker, defender); + + case shiedbash: + return shieldBash(attacker, defender); + } + + return new AttackResult(0,0,false); + } + + // -------------------------------- + // LIGHT ATTACK + // -------------------------------- + private AttackResult lightAttack(Entity attacker, Entity defender) { + + int damage = attacker.getBaseDamage(); + + Weapon weapon = attacker.getWeapon(); + + if (weapon != null) { + damage += weapon.getLightAttackDamage(); + + if (weapon.getEffect() != null) + statusEffectManager.addEffect(weapon.getEffect(), defender); + } + + damage = applyArmor(defender, damage); + + if (defender.isDefending()) + damage /= 2; + + return new AttackResult(damage,0,false); + } + + // -------------------------------- + // HEAVY ATTACK + // -------------------------------- + private AttackResult heavyAttack(Entity attacker, Entity defender) { + + if (!manaCostManager.useHeavyAttack( attacker)) + return new AttackResult(0,0,false); + + int damage = attacker.getBaseDamage() * 2; + + Weapon weapon = attacker.getWeapon(); + + if (weapon != null) { + + damage += weapon.getHeavyAttackDamage(); + + if (weapon.getEffect() != null) + statusEffectManager.addEffect(weapon.getEffect(), defender); + } + + damage = applyArmor(defender, damage); + + if (defender.isDefending()) + damage /= 2; + + return new AttackResult(damage,0,false); + } + + // -------------------------------- + // DEFEND + // -------------------------------- + private AttackResult defend(Entity attacker) { + + if (!manaCostManager.useHeavyAttack( attacker)) + return new AttackResult(0,0,false); + + return new AttackResult(0,0,true); + } + + // -------------------------------- + // HEAL + // -------------------------------- + private AttackResult heal(Entity attacker) { + + if (!manaCostManager.useHeavyAttack( attacker)) + return new AttackResult(0,0,false); + + return new AttackResult(0,HEAL_AMOUNT,false); + } + + // -------------------------------- + // SPECIAL ABILITY + // -------------------------------- + private AttackResult ability(Entity attacker, Entity defender) { + + SpecialAbility ability = attacker.getSpacialAbility(); + + if (ability == null) + return new AttackResult(0,0,false); + + if (attacker instanceof Player && !manaCostManager.useSpecialAbility((Player) attacker)) + return new AttackResult(0,0,false); + + Entity target = + ability.getTarget() == SpecialAbility.AbilityTarget.SELF + ? attacker + : defender; + + specialAbilityManager.addAbility(ability, target); + + return new AttackResult(0,0,false); + } + + // -------------------------------- + // SHIELD BASH + // -------------------------------- + private AttackResult shieldBash(Entity attacker, Entity defender) { + + if (!manaCostManager.useHeavyAttack( attacker)) + return new AttackResult(0,0,false); + + Armor armor = attacker.getArmor(); + + if (armor == null) + return new AttackResult(0,0,false); + + if (armor.getType() != Armor.ArmorType.HEAVY) + return new AttackResult(0,0,false); + + int damage = SHIELD_BASH_BASE_DAMAGE + armor.getDefense() / 2; + + damage = applyArmor(defender, damage); + + if (Math.random() * 100 < SHIELD_BASH_STUN_CHANCE) + defender.stun(); + + return new AttackResult(damage,0,false); + } + + // -------------------------------- + // ARMOR REDUCTION + // -------------------------------- + private int applyArmor(Entity defender, int rawDamage) { + + Armor armor = defender.getArmor(); + + if (armor == null) + return rawDamage; + + return armor.reduceDamage(rawDamage); + } +}