Skip to content

Commit

Permalink
Merge pull request #245 from vincent4vx/spell-effect-damage-on-action…
Browse files Browse the repository at this point in the history
…-point-use

#27 Add effect damage on action point use
  • Loading branch information
vincent4vx authored Apr 19, 2022
2 parents 90cf7fc + 35061a8 commit e5747e6
Show file tree
Hide file tree
Showing 19 changed files with 415 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import fr.quatrevieux.araknemu.game.fight.castable.effect.handler.damage.ReflectedDamage;
import fr.quatrevieux.araknemu.game.fight.fighter.ActiveFighter;
import fr.quatrevieux.araknemu.game.fight.fighter.PassiveFighter;
import fr.quatrevieux.araknemu.game.fight.turn.Turn;

/**
* Hook action for apply buff effects
Expand All @@ -42,7 +43,7 @@ public default boolean onStartTurn(Buff buff) {
/**
* Apply effect on turn ending
*/
public default void onEndTurn(Buff buff) {}
public default void onEndTurn(Buff buff, Turn turn) {}

/**
* Start the buff
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import fr.quatrevieux.araknemu.game.fight.fighter.ActiveFighter;
import fr.quatrevieux.araknemu.game.fight.fighter.Fighter;
import fr.quatrevieux.araknemu.game.fight.fighter.PassiveFighter;
import fr.quatrevieux.araknemu.game.fight.turn.Turn;
import fr.quatrevieux.araknemu.network.game.out.fight.AddBuff;

import java.util.Collection;
Expand Down Expand Up @@ -87,9 +88,9 @@ public boolean onStartTurn() {
}

@Override
public void onEndTurn() {
public void onEndTurn(Turn turn) {
for (Buff buff : buffs) {
buff.hook().onEndTurn(buff);
buff.hook().onEndTurn(buff, turn);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import fr.quatrevieux.araknemu.game.fight.castable.effect.handler.damage.ReflectedDamage;
import fr.quatrevieux.araknemu.game.fight.fighter.ActiveFighter;
import fr.quatrevieux.araknemu.game.fight.fighter.PassiveFighter;
import fr.quatrevieux.araknemu.game.fight.turn.Turn;

/**
* Handle and store buff list for a fighter
Expand Down Expand Up @@ -80,7 +81,7 @@ public interface Buffs extends Iterable<Buff> {
/**
* @see BuffHook#onEndTurn(Buff)
*/
public void onEndTurn();
public void onEndTurn(Turn turn);

/**
* @see BuffHook#onCastDamage(Buff, Damage, PassiveFighter)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import fr.quatrevieux.araknemu.game.fight.fighter.PassiveFighter;
import fr.quatrevieux.araknemu.game.fight.turn.Turn;
import fr.quatrevieux.araknemu.game.spell.effect.SpellEffect;
import org.checkerframework.checker.index.qual.Positive;

/**
* Base effect for steal turn points
Expand Down Expand Up @@ -94,7 +95,7 @@ public void buff(CastScope cast, CastScope.EffectScope effect) {
* @param turn The active turn
* @param toAdd Number of points to add. This value is always >= 1
*/
protected abstract void applyOnCurrentTurn(Fight fight, Turn turn, ActiveFighter caster, int toAdd);
protected abstract void applyOnCurrentTurn(Fight fight, Turn turn, ActiveFighter caster, @Positive int toAdd);

/**
* Apply to all targets and compute the stolen points
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import fr.quatrevieux.araknemu.game.fight.castable.effect.buff.Buff;
import fr.quatrevieux.araknemu.game.fight.castable.effect.handler.characteristic.AlterCharacteristicHook;
import fr.quatrevieux.araknemu.game.fight.turn.TurnPoints;
import org.checkerframework.checker.index.qual.NonNegative;

/**
* Buff hook for handle altering turn point characteristics (i.e. {@link Characteristic#ACTION_POINT} and {@link Characteristic#MOVEMENT_POINT})
Expand Down Expand Up @@ -99,6 +100,6 @@ public interface TurnPointsModifier {
*
* @param value Value to modify. Always a positive number
*/
public void modify(TurnPoints points, int value);
public void modify(TurnPoints points, @NonNegative int value);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import fr.quatrevieux.araknemu.game.fight.fighter.ActiveFighter;
import fr.quatrevieux.araknemu.game.fight.turn.Turn;
import fr.quatrevieux.araknemu.network.game.out.fight.action.ActionEffect;
import org.checkerframework.checker.index.qual.Positive;

/**
* Effect for steal action points
Expand All @@ -48,7 +49,7 @@ public StealActionPointHandler(Fight fight, int removeActionPointEffect, int add
}

@Override
protected void applyOnCurrentTurn(Fight fight, Turn turn, ActiveFighter caster, int toAdd) {
protected void applyOnCurrentTurn(Fight fight, Turn turn, ActiveFighter caster, @Positive int toAdd) {
turn.points().addActionPoints(toAdd);
fight.send(ActionEffect.addActionPoints(caster, toAdd));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import fr.quatrevieux.araknemu.game.fight.fighter.ActiveFighter;
import fr.quatrevieux.araknemu.game.fight.turn.Turn;
import fr.quatrevieux.araknemu.network.game.out.fight.action.ActionEffect;
import org.checkerframework.checker.index.qual.Positive;

/**
* Effect for steal movement points
Expand All @@ -48,7 +49,7 @@ public StealMovementPointHandler(Fight fight, int removeMovementPointEffect, int
}

@Override
protected void applyOnCurrentTurn(Fight fight, Turn turn, ActiveFighter caster, int toAdd) {
protected void applyOnCurrentTurn(Fight fight, Turn turn, ActiveFighter caster, @Positive int toAdd) {
turn.points().addMovementPoints(toAdd);
fight.send(ActionEffect.addMovementPoints(caster, toAdd));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
/*
* This file is part of Araknemu.
*
* Araknemu is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Araknemu is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Araknemu. If not, see <https://www.gnu.org/licenses/>.
*
* Copyright (c) 2017-2022 Vincent Quatrevieux
*/

package fr.quatrevieux.araknemu.game.fight.castable.effect.handler.damage;

import fr.quatrevieux.araknemu.game.fight.Fight;
import fr.quatrevieux.araknemu.game.fight.castable.CastScope;
import fr.quatrevieux.araknemu.game.fight.castable.effect.Element;
import fr.quatrevieux.araknemu.game.fight.castable.effect.buff.Buff;
import fr.quatrevieux.araknemu.game.fight.castable.effect.buff.BuffEffect;
import fr.quatrevieux.araknemu.game.fight.castable.effect.buff.BuffHook;
import fr.quatrevieux.araknemu.game.fight.castable.effect.handler.EffectHandler;
import fr.quatrevieux.araknemu.game.fight.fighter.ActiveFighter;
import fr.quatrevieux.araknemu.game.fight.fighter.PassiveFighter;
import fr.quatrevieux.araknemu.game.fight.turn.Turn;

/**
* Apply poison when action points are used
*
* This effect is applied on end turn
* The first effect parameter (i.e. min) is the amount of AP for apply damage
* The second effect parameter (i.e. max) is the damage to apply per amount of used AP
* Damage are modified by {@link Element#FIRE} and other boosts
*
* @see BuffHook#onEndTurn(Buff, Turn) The called hook
*/
public final class DamageOnActionPointUseHandler implements EffectHandler, BuffHook {
private final DamageApplier applier;

public DamageOnActionPointUseHandler(Fight fight) {
this.applier = new DamageApplier(Element.FIRE, fight);
}

@Override
public void handle(CastScope cast, CastScope.EffectScope effect) {
throw new UnsupportedOperationException("Damage on action point use can only be used as buff");
}

@Override
public void buff(CastScope cast, CastScope.EffectScope effect) {
for (PassiveFighter target : effect.targets()) {
target.buffs().add(new Buff(effect.effect(), cast.action(), cast.caster(), target, this));
}
}

@Override
public void onEndTurn(Buff buff, Turn turn) {
final int usedAP = turn.points().usedActionPoints();
final int minAP = buff.effect().min();
final ActiveFighter caster = buff.caster();

// Not enough AP used for apply the effect
if (usedAP < minAP) {
return;
}

// Create a fake Buff object with computed damage to apply
applier.apply(new Buff(
BuffEffect.fixed(buff.effect(), (usedAP / minAP) * buff.effect().max()),
buff.action(),
caster,
buff.target(),
this
));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import fr.quatrevieux.araknemu.game.fight.castable.effect.handler.characteristic.point.StealActionPointHandler;
import fr.quatrevieux.araknemu.game.fight.castable.effect.handler.characteristic.point.StealMovementPointHandler;
import fr.quatrevieux.araknemu.game.fight.castable.effect.handler.damage.DamageHandler;
import fr.quatrevieux.araknemu.game.fight.castable.effect.handler.damage.DamageOnActionPointUseHandler;
import fr.quatrevieux.araknemu.game.fight.castable.effect.handler.damage.FixedCasterDamageHandler;
import fr.quatrevieux.araknemu.game.fight.castable.effect.handler.damage.FixedDamageHandler;
import fr.quatrevieux.araknemu.game.fight.castable.effect.handler.damage.FixedStealLifeHandler;
Expand Down Expand Up @@ -107,6 +108,7 @@ public void effects(EffectsHandler handler) {
handler.register(88, new PercentLifeDamageHandler(Element.FIRE, fight));
handler.register(89, new PercentLifeDamageHandler(Element.NEUTRAL, fight));

handler.register(131, new DamageOnActionPointUseHandler(fight));
handler.register(671, new IndirectPercentLifeDamageHandler(Element.NEUTRAL, fight));

handler.register(276, new PercentLifeLostDamageHandler(Element.EARTH, fight));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ public FighterTurnPoints points() {
* Perform actions on turn ending
*/
private void endTurnActions(boolean aborted) {
fighter.buffs().onEndTurn();
fighter.buffs().onEndTurn(this);

fight.dispatch(new TurnTerminated(this, aborted));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import fr.quatrevieux.araknemu.game.fight.fighter.Fighter;
import fr.quatrevieux.araknemu.game.fight.turn.event.ActionPointsUsed;
import fr.quatrevieux.araknemu.game.fight.turn.event.MovementPointsUsed;
import org.checkerframework.checker.index.qual.NonNegative;

/**
* Handle fighter turn points (AP / MP)
Expand All @@ -32,43 +33,43 @@ public final class FighterTurnPoints implements TurnPoints {
private final Fight fight;
private final Fighter fighter;

private int movementPoints;
private int actionPoints;
private @NonNegative int movementPoints;
private @NonNegative int actionPoints;

private int usedMovementPoints;
private int usedActionPoints;
private @NonNegative int usedMovementPoints;
private @NonNegative int usedActionPoints;

public FighterTurnPoints(Fight fight, Fighter fighter) {
this.fight = fight;
this.fighter = fighter;

this.movementPoints = fighter.characteristics().get(Characteristic.MOVEMENT_POINT);
this.actionPoints = fighter.characteristics().get(Characteristic.ACTION_POINT);
this.movementPoints = Math.max(fighter.characteristics().get(Characteristic.MOVEMENT_POINT), 0);
this.actionPoints = Math.max(fighter.characteristics().get(Characteristic.ACTION_POINT), 0);
}

@Override
public int movementPoints() {
return movementPoints - usedMovementPoints;
public @NonNegative int movementPoints() {
return Math.max(movementPoints - usedMovementPoints, 0);
}

/**
* Remove movement points
*
* @param points Points to remove
*/
public void useMovementPoints(int points) {
public void useMovementPoints(@NonNegative int points) {
usedMovementPoints += points;

fight.dispatch(new MovementPointsUsed(fighter, points));
}

@Override
public void addMovementPoints(int value) {
public void addMovementPoints(@NonNegative int value) {
movementPoints += value;
}

@Override
public int removeMovementPoints(int value) {
public @NonNegative int removeMovementPoints(@NonNegative int value) {
if (value > movementPoints()) {
value = movementPoints();
}
Expand All @@ -79,28 +80,28 @@ public int removeMovementPoints(int value) {
}

@Override
public int actionPoints() {
return actionPoints - usedActionPoints;
public @NonNegative int actionPoints() {
return Math.max(actionPoints - usedActionPoints, 0);
}

/**
* Remove action points
*
* @param points Points to remove
*/
public void useActionPoints(int points) {
public void useActionPoints(@NonNegative int points) {
usedActionPoints += points;

fight.dispatch(new ActionPointsUsed(fighter, points));
}

@Override
public void addActionPoints(int value) {
public void addActionPoints(@NonNegative int value) {
actionPoints += value;
}

@Override
public int removeActionPoints(int value) {
public @NonNegative int removeActionPoints(@NonNegative int value) {
if (value > actionPoints()) {
value = actionPoints();
}
Expand All @@ -109,4 +110,14 @@ public int removeActionPoints(int value) {

return value;
}

@Override
public @NonNegative int usedActionPoints() {
return usedActionPoints;
}

@Override
public @NonNegative int usedMovementPoints() {
return usedMovementPoints;
}
}
Loading

0 comments on commit e5747e6

Please sign in to comment.