Skip to content

Commit

Permalink
#27 Add teleport effect + fix exception on fight action terminated
Browse files Browse the repository at this point in the history
  • Loading branch information
vincent4vx committed May 13, 2018
1 parent 4a9bc31 commit 839a442
Show file tree
Hide file tree
Showing 8 changed files with 174 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import fr.quatrevieux.araknemu.game.fight.castable.effect.handler.damage.DamageHandler;
import fr.quatrevieux.araknemu.game.fight.castable.effect.handler.EffectHandler;
import fr.quatrevieux.araknemu.game.fight.castable.effect.handler.damage.StealLifeHandler;
import fr.quatrevieux.araknemu.game.fight.castable.effect.handler.shifting.TeleportHandler;
import fr.quatrevieux.araknemu.game.fight.fighter.Fighter;
import fr.quatrevieux.araknemu.game.fight.map.FightCell;
import fr.quatrevieux.araknemu.game.spell.Spell;
Expand All @@ -23,6 +24,8 @@ final public class EffectsHandler {
public EffectsHandler(Fight fight) {
this.fight = fight;

register(4, new TeleportHandler(fight));

register(91, new StealLifeHandler(Element.WATER));
register(92, new StealLifeHandler(Element.EARTH));
register(93, new StealLifeHandler(Element.AIR));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package fr.quatrevieux.araknemu.game.fight.castable.effect.handler.shifting;

import fr.quatrevieux.araknemu.game.fight.Fight;
import fr.quatrevieux.araknemu.game.fight.castable.effect.handler.EffectHandler;
import fr.quatrevieux.araknemu.game.fight.fighter.Fighter;
import fr.quatrevieux.araknemu.game.fight.map.FightCell;
import fr.quatrevieux.araknemu.game.spell.Spell;
import fr.quatrevieux.araknemu.game.spell.effect.SpellEffect;
import fr.quatrevieux.araknemu.network.game.out.fight.action.ActionEffect;

/**
* Handle teleport effect
*/
final public class TeleportHandler implements EffectHandler {
final private Fight fight;

public TeleportHandler(Fight fight) {
this.fight = fight;
}

@Override
public void handle(Fighter caster, Spell spell, SpellEffect effect, FightCell target) {
if (!target.walkable()) {
return; // @todo exception ?
}

caster.move(target);

fight.send(ActionEffect.teleport(caster, caster, target));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,13 +66,16 @@ public void terminate() {
future.cancel(false);

Action action = current;
action.end();

current = null;
fight.dispatch(new FightActionTerminated(action));
try {
action.end();
} finally {
current = null;
fight.dispatch(new FightActionTerminated(action));

termination.forEach(Runnable::run);
termination.clear();
termination.forEach(Runnable::run);
termination.clear();
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package fr.quatrevieux.araknemu.network.game.out.fight.action;

import fr.quatrevieux.araknemu.game.fight.fighter.Fighter;
import fr.quatrevieux.araknemu.game.fight.map.FightCell;
import fr.quatrevieux.araknemu.game.spell.Spell;
import org.apache.commons.lang3.StringUtils;

Expand Down Expand Up @@ -73,4 +74,15 @@ static public ActionEffect criticalHitSpell(Fighter caster, Spell spell) {
static public ActionEffect fighterDie(Fighter caster, Fighter fighter) {
return new ActionEffect(103, caster, fighter.id());
}

/**
* Teleport a fighter
*
* @param caster The spell caster
* @param fighter The teleport fighter
* @param target The target cell
*/
static public ActionEffect teleport(Fighter caster, Fighter fighter, FightCell target) {
return new ActionEffect(4, caster, fighter.id(), target.id());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,4 +66,17 @@ void applyStealLife() {
ActionEffect.alterLifePoints(player.fighter(), player.fighter(), 7)
);
}

@Test
void applyTeleport() {
SpellEffect effect = Mockito.mock(SpellEffect.class);

Mockito.when(effect.effect()).thenReturn(4);
requestStack.clear();

handler.apply(player.fighter(), Mockito.mock(Spell.class), effect, fight.map().get(123));

requestStack.assertLast(ActionEffect.teleport(player.fighter(), player.fighter(), fight.map().get(123)));
assertEquals(123, player.fighter().cell().id());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package fr.quatrevieux.araknemu.game.fight.castable.effect.handler.shifting;

import fr.quatrevieux.araknemu.game.fight.Fight;
import fr.quatrevieux.araknemu.game.fight.FightBaseCase;
import fr.quatrevieux.araknemu.game.fight.fighter.player.PlayerFighter;
import fr.quatrevieux.araknemu.game.fight.map.FightCell;
import fr.quatrevieux.araknemu.game.spell.Spell;
import fr.quatrevieux.araknemu.game.spell.effect.SpellEffect;
import fr.quatrevieux.araknemu.network.game.out.fight.action.ActionEffect;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import static org.junit.jupiter.api.Assertions.*;

class TeleportHandlerTest extends FightBaseCase {
private Fight fight;
private PlayerFighter caster;
private TeleportHandler handler;

@Override
@BeforeEach
public void setUp() throws Exception {
super.setUp();

fight = createFight();
fight.nextState();

caster = player.fighter();

handler = new TeleportHandler(fight);

requestStack.clear();
}

@Test
void applySuccess() {
SpellEffect effect = Mockito.mock(SpellEffect.class);

FightCell lastCell = caster.cell();

FightCell target = fight.map().get(123);

handler.handle(caster, Mockito.mock(Spell.class), effect, target);

requestStack.assertLast(ActionEffect.teleport(caster, caster, target));

assertSame(caster, target.fighter().get());
assertSame(target, caster.cell());
assertFalse(lastCell.fighter().isPresent());
}

@Test
void applyNotFreeCell() {
SpellEffect effect = Mockito.mock(SpellEffect.class);

FightCell lastCell = caster.cell();

FightCell target = other.fighter().cell();

handler.handle(caster, Mockito.mock(Spell.class), effect, target);

requestStack.assertEmpty();

assertSame(lastCell, caster.cell());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,28 @@ void terminateWithTerminationListener() {
assertTrue(b.get());
}

@Test
void terminateWithException() {
Action action = Mockito.mock(Action.class);
ActionResult result = Mockito.mock(ActionResult.class);

Mockito.when(action.validate()).thenReturn(true);
Mockito.when(action.start()).thenReturn(result);
Mockito.when(action.duration()).thenReturn(Duration.ofMillis(10));
Mockito.doThrow(new RuntimeException()).when(action).end();

Mockito.when(result.success()).thenReturn(true);

actionHandler.start(action);

AtomicBoolean b = new AtomicBoolean();
actionHandler.terminated(() -> b.set(true));

assertThrows(Exception.class, () -> actionHandler.terminate());

assertTrue(b.get());
}

@Test
void terminateWithTerminationListenerWillRemoveOldListeners() {
Action action = Mockito.mock(Action.class);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package fr.quatrevieux.araknemu.network.game.out.fight.action;

import fr.quatrevieux.araknemu.game.fight.fighter.Fighter;
import fr.quatrevieux.araknemu.game.fight.map.FightCell;
import fr.quatrevieux.araknemu.game.spell.Spell;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
Expand Down Expand Up @@ -71,4 +72,21 @@ void fighterDie() {
ActionEffect.fighterDie(caster, fighter).toString()
);
}

@Test
void teleport() {
Fighter caster = Mockito.mock(Fighter.class);
Mockito.when(caster.id()).thenReturn(123);

Fighter fighter = Mockito.mock(Fighter.class);
Mockito.when(fighter.id()).thenReturn(321);

FightCell target = Mockito.mock(FightCell.class);
Mockito.when(target.id()).thenReturn(456);

assertEquals(
"GA;4;123;321,456",
ActionEffect.teleport(caster, fighter, target).toString()
);
}
}

0 comments on commit 839a442

Please sign in to comment.