public void Undo(CharacterObservable caller, CharacterObservable personaeToInteracWith, GameManager gm)
    {
        PreviousAction = (ICharacterActionCommand)CommandStack.Pop();

        if (PreviousAction is AttackCommand && LastCharacterAttacked != null)
        {
            var attackStrenght = caller.Stats.GetAttackStrenght(caller, LastCharacterAttacked);
            LastCharacterAttacked.Health.RaiseHealth(caller);
            ((AttackCommand)PreviousAction).IsExecuted = false;
            return;
        }
        if (PreviousAction is DefendCommand)
        {
            caller.Stats.DefenseBonusActivated = false;
            caller.Stats.ResetTemporaryBonus();
            ((DefendCommand)PreviousAction).IsExecuted = false;
            return;
        }
        if (PreviousAction is MoveCommand)
        {
            //caller.CurrentCoordinates = caller.OldCoordinates;
            //((MoveCommand)PreviousAction).Execute(caller.CurrentCoordinates);
            //((MoveCommand)PreviousAction).IsExecuted = false;
        }
        PreviousAction.Execute(caller);
    }
    //TODO: Update method's signature
    public void Undo(CharacterObservable caller, CharacterObservable active)
    {
        if (!Equals(caller, active))
            throw new Exception("Cannot Undo on non-active character");

        PreviousAction = (ICharacterActionCommand)CommandStack.Pop();
        if (PreviousAction is AttackCommand && LastCharacterAttacked != null)
        {
            var attackStrenght = caller.Stats.GetAttackStrenght(caller, LastCharacterAttacked);
            LastCharacterAttacked.Health.RaiseHealth(caller);
            LastCharacterAttacked.healthWasRaised = true;
            LastCharacterAttacked.Notify();
            LastCharacterAttacked.healthWasRaised = false;
            ((AttackCommand)PreviousAction).IsExecuted = false;
            return;
        }
        if (PreviousAction is DefendCommand)
        {
            caller.Stats.DefenseBonusActivated = false;
            caller.Stats.ResetTemporaryBonus();
            ((DefendCommand)PreviousAction).IsExecuted = false;
            return;
        }
        //Implementation to come
        if (PreviousAction is MoveCommand)
        {
            //caller.CurrentCoordinates = caller.OldCoordinates;
            //((MoveCommand)PreviousAction).Execute(caller.CurrentCoordinates);
            //((MoveCommand)PreviousAction).IsExecuted = false;
        }

        if (PreviousAction is RotateCommand)
        {
        }
    }
    public void Undo(CharacterObservable caller, CharacterObservable personaeToInteracWith, GameManager gm)
    {
        PreviousAction = (ICharacterActionCommand)CommandStack.Pop();

        if (PreviousAction is AttackCommand && LastCharacterAttacked != null)
        {
            var attackStrenght = caller.Stats.GetAttackStrenght(caller, LastCharacterAttacked);
            LastCharacterAttacked.Health.RaiseHealth(caller);
            ((AttackCommand)PreviousAction).IsExecuted = false;
            return;
        }
        if (PreviousAction is DefendCommand)
        {
            caller.Stats.DefenseBonusActivated = false;
            caller.Stats.ResetTemporaryBonus();
            ((DefendCommand)PreviousAction).IsExecuted = false;
            return;
        }
        if (PreviousAction is MoveCommand)
        {
            //caller.CurrentCoordinates = caller.OldCoordinates;
            //((MoveCommand)PreviousAction).Execute(caller.CurrentCoordinates);
            //((MoveCommand)PreviousAction).IsExecuted = false;
        }
        PreviousAction.Execute(caller);
    }
 public void UpdateCommandStack(ICharacterActionCommand cmd)
 {
     if (CurrentCharater == null)
     {
         throw new NullReferenceException();
     }
     if (!cmd.IsExecuted)
     {
         throw new Exception("Cannot update stack if command was not executed!");
     }
     CommandStack.Push(cmd);
     if (cmd is AttackCommand)
     {
         LastCharacterAttacked = ((AttackCommand)cmd).Target;
     }
     PreviousAction = cmd;
 }
    //TODO: Update method's signature
    public void Undo(CharacterObservable caller, CharacterObservable active)
    {
        if (!Equals(caller, active))
        {
            throw new Exception("Cannot Undo on non-active character");
        }

        PreviousAction = (ICharacterActionCommand)CommandStack.Pop();
        if (PreviousAction is AttackCommand && LastCharacterAttacked != null)
        {
            var attackStrenght = caller.Stats.GetAttackStrenght(caller, LastCharacterAttacked);
            LastCharacterAttacked.Health.RaiseHealth(caller);
            LastCharacterAttacked.healthWasRaised = true;
            LastCharacterAttacked.Notify();
            LastCharacterAttacked.healthWasRaised      = false;
            ((AttackCommand)PreviousAction).IsExecuted = false;
            return;
        }
        if (PreviousAction is DefendCommand)
        {
            caller.Stats.DefenseBonusActivated = false;
            caller.Stats.ResetTemporaryBonus();
            ((DefendCommand)PreviousAction).IsExecuted = false;
            return;
        }
        //Implementation to come
        if (PreviousAction is MoveCommand)
        {
            //caller.CurrentCoordinates = caller.OldCoordinates;
            //((MoveCommand)PreviousAction).Execute(caller.CurrentCoordinates);
            //((MoveCommand)PreviousAction).IsExecuted = false;
        }

        if (PreviousAction is RotateCommand)
        {
        }
    }
 public void UpdateCommandStack(ICharacterActionCommand cmd)
 {
     if (CurrentCharater == null)
         throw new NullReferenceException();
     if (!cmd.IsExecuted)
         throw new Exception("Cannot update stack if command was not executed!");
     CommandStack.Push(cmd);
     if (cmd is AttackCommand)
     {
         LastCharacterAttacked = ((AttackCommand)cmd).Target;
     }
     PreviousAction = cmd;
 }