add combat

This commit is contained in:
2026-05-17 08:51:14 -07:00
parent 4bd9823445
commit 42a1a97cab
2 changed files with 216 additions and 0 deletions
@@ -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; }
}
@@ -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);
}
}