Skip to content

Commit

Permalink
#27 Add Skip next turn effect
Browse files Browse the repository at this point in the history
  • Loading branch information
vincent4vx committed Jul 13, 2018
1 parent 79fb7f3 commit efac051
Show file tree
Hide file tree
Showing 7 changed files with 179 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import fr.quatrevieux.araknemu.game.fight.castable.effect.handler.EffectHandler;
import fr.quatrevieux.araknemu.game.fight.castable.effect.handler.damage.DamageHandler;
import fr.quatrevieux.araknemu.game.fight.castable.effect.handler.damage.StealLifeHandler;
import fr.quatrevieux.araknemu.game.fight.castable.effect.handler.misc.SkipTurnHandler;
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;
Expand Down Expand Up @@ -37,6 +38,8 @@ public EffectsHandler(Fight fight) {
register(98, new DamageHandler(Element.AIR));
register(99, new DamageHandler(Element.FIRE));
register(100, new DamageHandler(Element.NEUTRAL));

register(140, new SkipTurnHandler(fight));
}

public void register(int effectId, EffectHandler applier) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package fr.quatrevieux.araknemu.game.fight.castable.effect.handler.misc;

import fr.quatrevieux.araknemu.game.fight.Fight;
import fr.quatrevieux.araknemu.game.fight.castable.Castable;
import fr.quatrevieux.araknemu.game.fight.castable.effect.TargetResolver;
import fr.quatrevieux.araknemu.game.fight.castable.effect.buff.Buff;
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.Fighter;
import fr.quatrevieux.araknemu.game.fight.map.FightCell;
import fr.quatrevieux.araknemu.game.spell.effect.SpellEffect;
import fr.quatrevieux.araknemu.network.game.out.fight.action.ActionEffect;

/**
* Skip the fighter turn until buff is expired
*/
final public class SkipTurnHandler implements EffectHandler, BuffHook {
final private Fight fight;

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

@Override
public void handle(Fighter caster, Castable castable, SpellEffect effect, FightCell target) {
buff(caster, castable, effect, target);
}

@Override
public void buff(Fighter caster, Castable castable, SpellEffect effect, FightCell target) {
new TargetResolver(caster, target)
.area(effect.area())
.fighters(fighter -> fighter.buffs().add(new Buff(effect, castable, caster, fighter, this)))
;
}

@Override
public boolean onStartTurn(Buff buff) {
return false;
}

@Override
public void onBuffStarted(Buff buff) {
fight.send(ActionEffect.skipNextTurn(buff.caster(), buff.target()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -94,4 +94,14 @@ static public ActionEffect fighterDie(Fighter caster, Fighter fighter) {
static public ActionEffect teleport(Fighter caster, Fighter fighter, FightCell target) {
return new ActionEffect(4, caster, fighter.id(), target.id());
}

/**
* The fighter skip the next turn
*
* @param caster The buff caster
* @param fighter The target fighter
*/
static public ActionEffect skipNextTurn(Fighter caster, Fighter fighter) {
return new ActionEffect(140, caster, fighter.id());
}
}
3 changes: 2 additions & 1 deletion src/test/java/fr/quatrevieux/araknemu/game/GameDataSet.java
Original file line number Diff line number Diff line change
Expand Up @@ -361,7 +361,8 @@ public GameDataSet pushFunctionalSpells() throws SQLException, ContainerExceptio

connection.query(
"INSERT INTO `SPELL` (`SPELL_ID`, `SPELL_NAME`, `SPELL_SPRITE`, `SPELL_SPRITE_ARG`, `SPELL_LVL_1`, `SPELL_LVL_2`, `SPELL_LVL_3`, `SPELL_LVL_4`, `SPELL_LVL_5`, `SPELL_LVL_6`, `SPELL_TARGET`) VALUES " +
"(181, 'Tremblement', 1003, '11,1,1', '99,2,,,2,0,0d0+2|99,4,,,2,0,0d0+4|2|0|0|50|100|false|false|false|false|0|1|0|5|CfCf||18;19;3;1;41|26|false', '99,3,,,2,0,0d0+3|99,6,,,2,0,0d0+6|2|0|0|50|100|false|false|false|false|0|1|0|5|CgCg||18;19;3;1;41|26|false', '99,3,,,3,0,0d0+3|99,6,,,3,0,0d0+6|2|0|0|50|100|false|false|false|false|0|1|0|5|ChCh||18;19;3;1;41|26|false', '99,4,,,3,0,0d0+4|99,8,,,3,0,0d0+8|2|0|0|50|100|false|false|false|false|0|1|0|5|CiCi||18;19;3;1;41|26|false', '99,5,,,4,0,0d0+5|99,10,,,4,0,0d0+10|2|0|0|50|100|false|false|false|false|0|1|0|5|CjCj||18;19;3;1;41|26|false', '99,7,,,4,0,0d0+7|99,12,,,4,0,0d0+12|2|0|0|50|100|false|false|false|false|0|1|0|5|CkCk||18;19;3;1;41|126|false', '');"
"(181, 'Tremblement', 1003, '11,1,1', '99,2,,,2,0,0d0+2|99,4,,,2,0,0d0+4|2|0|0|50|100|false|false|false|false|0|1|0|5|CfCf||18;19;3;1;41|26|false', '99,3,,,2,0,0d0+3|99,6,,,2,0,0d0+6|2|0|0|50|100|false|false|false|false|0|1|0|5|CgCg||18;19;3;1;41|26|false', '99,3,,,3,0,0d0+3|99,6,,,3,0,0d0+6|2|0|0|50|100|false|false|false|false|0|1|0|5|ChCh||18;19;3;1;41|26|false', '99,4,,,3,0,0d0+4|99,8,,,3,0,0d0+8|2|0|0|50|100|false|false|false|false|0|1|0|5|CiCi||18;19;3;1;41|26|false', '99,5,,,4,0,0d0+5|99,10,,,4,0,0d0+10|2|0|0|50|100|false|false|false|false|0|1|0|5|CjCj||18;19;3;1;41|26|false', '99,7,,,4,0,0d0+7|99,12,,,4,0,0d0+12|2|0|0|50|100|false|false|false|false|0|1|0|5|CkCk||18;19;3;1;41|126|false', '')," +
"(1630, 'Test skip turn', -1, '0,0,0', '140,,,,0,0||1|1|5|0|50|false|true|false|false|0|0|0|3|Pa||18;19;3;1;41|0|false', '140,,,,0,0||1|1|5|0|50|false|true|false|false|0|0|0|3|Pa||18;19;3;1;41|0|false', '140,,,,0,0||1|1|5|0|50|false|true|false|false|0|0|0|3|Pa||18;19;3;1;41|0|false', '140,,,,0,0||1|1|5|0|50|false|true|false|false|0|0|0|3|Pa||18;19;3;1;41|0|false', '140,,,,0,0||1|1|5|0|50|false|true|false|false|0|0|0|3|Pa||18;19;3;1;41|0|false', '', '');"
);

return this;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@
import fr.quatrevieux.araknemu.game.fight.turn.action.util.CriticalityStrategy;
import fr.quatrevieux.araknemu.game.spell.SpellService;
import fr.quatrevieux.araknemu.network.game.out.fight.action.ActionEffect;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.util.Optional;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class FunctionalTest extends FightBaseCase {
Expand Down Expand Up @@ -47,6 +47,8 @@ public void setUp() throws Exception {

fight.state(PlacementState.class).startFight();
fight.turnList().start();

requestStack.clear();
}

@Test
Expand Down Expand Up @@ -85,6 +87,25 @@ void poisonSpell() {
assertEquals(3, buff2.get().remainingTurns());
}

@Test
void skipNextTurn() {
castNormal(1630, fighter2.cell());

Optional<Buff> found = fighter2.buffs().stream().filter(buff -> buff.effect().effect() == 140).findFirst();

assertTrue(found.isPresent());
assertEquals(140, found.get().effect().effect());
assertEquals(0, found.get().remainingTurns());

requestStack.assertOne(ActionEffect.skipNextTurn(fighter1, fighter2));

fighter1.turn().stop();
assertSame(fighter1, fight.turnList().currentFighter());
fighter1.turn().stop();

assertSame(fighter2, fight.turnList().currentFighter());
}

private void castNormal(int spellId, FightCell target) {
FightTurn currentTurn = fight.turnList().current().get();

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package fr.quatrevieux.araknemu.game.fight.castable.effect.handler.misc;

import fr.quatrevieux.araknemu.game.fight.Fight;
import fr.quatrevieux.araknemu.game.fight.FightBaseCase;
import fr.quatrevieux.araknemu.game.fight.castable.effect.buff.Buff;
import fr.quatrevieux.araknemu.game.fight.fighter.player.PlayerFighter;
import fr.quatrevieux.araknemu.game.spell.Spell;
import fr.quatrevieux.araknemu.game.spell.effect.SpellEffect;
import fr.quatrevieux.araknemu.game.spell.effect.area.CellArea;
import fr.quatrevieux.araknemu.network.game.out.fight.AddBuff;
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 java.util.Optional;

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

class SkipTurnHandlerTest extends FightBaseCase {
private Fight fight;
private PlayerFighter caster;
private PlayerFighter target;
private SkipTurnHandler handler;

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

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

caster = player.fighter();
target = other.fighter();

target.move(fight.map().get(123));

handler = new SkipTurnHandler(fight);

requestStack.clear();
}

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

Mockito.when(effect.area()).thenReturn(new CellArea());

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

Optional<Buff> buff = target.buffs().stream().findFirst();

assertTrue(buff.isPresent());
assertSame(effect, buff.get().effect());

requestStack.assertAll(
ActionEffect.skipNextTurn(caster, target),
new AddBuff(buff.get())
);
}

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

Mockito.when(effect.area()).thenReturn(new CellArea());
Mockito.when(effect.duration()).thenReturn(3);

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

Optional<Buff> buff = target.buffs().stream().findFirst();

assertTrue(buff.isPresent());
assertSame(effect, buff.get().effect());

requestStack.assertAll(
ActionEffect.skipNextTurn(caster, target),
new AddBuff(buff.get())
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -100,4 +100,18 @@ void criticalHitCloseCombat() {
ActionEffect.criticalHitCloseCombat(caster).toString()
);
}

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

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

assertEquals(
"GA;140;123;456",
ActionEffect.skipNextTurn(caster, target).toString()
);
}
}

0 comments on commit efac051

Please sign in to comment.