package magic.model.action;
import magic.ai.ArtificialScoringSystem;
import magic.model.MagicGame;
import magic.model.MagicPlayer;
import magic.model.MagicPlayerState;
import magic.model.trigger.MagicLifeChangeTriggerData;
import magic.model.trigger.MagicTriggerType;
public class ChangeLifeAction extends MagicAction {
private final MagicPlayer player;
private final boolean isDamage;
private int lifeChange;
private int oldLife;
private int oldLifeGain;
private int oldLifeLoss;
public ChangeLifeAction(final MagicPlayer aPlayer,final int aLifeChange, final boolean aIsDamage) {
player = aPlayer;
lifeChange = aLifeChange;
isDamage = aIsDamage;
}
public ChangeLifeAction(final MagicPlayer aPlayer,final int aLifeChange) {
this(aPlayer, aLifeChange, false);
}
public MagicPlayer getPlayer() {
return player;
}
public int getLifeChange() {
return lifeChange;
}
public boolean isDamage() {
return isDamage;
}
public int getOldLife() {
return oldLife;
}
public int getNewLife() {
return oldLife + lifeChange;
}
public void setLifeChange(final int aLifeChange) {
lifeChange = aLifeChange;
}
@Override
public void doAction(final MagicGame game) {
oldLife = player.getLife();
oldLifeGain = player.getLifeGainThisTurn();
oldLifeLoss = player.getLifeLossThisTurn();
game.executeTrigger(MagicTriggerType.IfLifeWouldChange, this);
final int newLife = oldLife + lifeChange;
player.setLife(newLife);
setScore(player,ArtificialScoringSystem.getLifeScore(newLife)-ArtificialScoringSystem.getLifeScore(oldLife));
if (newLife > oldLife) {
game.executeTrigger(MagicTriggerType.WhenLifeIsGained,new MagicLifeChangeTriggerData(player,newLife-oldLife));
game.doAction(new ChangePlayerStateAction(player,MagicPlayerState.HasGainedLife));
player.changeLifeGainThisTurn(newLife-oldLife);
} else if (newLife < oldLife) {
game.executeTrigger(MagicTriggerType.WhenLifeIsLost,new MagicLifeChangeTriggerData(player,oldLife-newLife));
game.doAction(new ChangePlayerStateAction(player,MagicPlayerState.HasLostLife));
player.changeLifeLossThisTurn(oldLife-newLife);
}
game.setStateCheckRequired();
}
@Override
public void undoAction(final MagicGame game) {
player.setLife(oldLife);
player.setLifeGainThisTurn(oldLifeGain);
player.setLifeLossThisTurn(oldLifeLoss);
}
@Override
public String toString() {
return getClass().getSimpleName()+" ("+player.getName()+','+lifeChange+')';
}
}