private IEnumerator Animate()
    {
        // TODO play animations, etc
        yield return(null);

        ApplyAbility();

        RoundController.EndTurn();
        owner.ChangeState <SelectUnitState>();
    }
    protected override void OnTouch(object sender, InfoEventArgs <Point> e)
    {
        Tile tile  = Board.GetTile(e.info);
        Unit actor = RoundController.Current;

        // End turn if select itself
        if (tile == actor.Tile)
        {
            RoundController.EndTurn();
            owner.ChangeState <SelectUnitState>();
            return;
        }

        bool inMoveRange    = RangeManager.MoveRange.Contains(tile);
        bool inAbilityRange = RangeManager.AbilityRangeAndOrigin.ContainsKey(tile);

        // Restart turn if out of range
        if (!inMoveRange && !inAbilityRange)
        {
            owner.ChangeState <RestartUnitState>();
            return;
        }

        // If another origin of attack tile, move there
        if (RangeManager.AbilityRangeAndOrigin[actor.turn.TargetTile].Contains(tile))
        {
            actor.turn.SelectMovement(tile);
            owner.ChangeState <PerformMovement>();
            return;
        }

        // Cancel attack and move
        if (inMoveRange)
        {
            actor.turn.SelectMovement(tile);
            actor.turn.SelectTarget(null);
            owner.ChangeState <PerformMovement>();
            return;
        }

        // If not a target, return
        if (!actor.GetComponentInChildren <AbilityTarget>().IsTarget(tile))
        {
            return;
        }

        // If in range, attack
        if (RangeManager.AbilityRangeAndOrigin[tile].Contains(actor.Tile))
        {
            owner.ChangeState <PerformAbilityState>();
            return;
        }
    }
Esempio n. 3
0
    protected override void OnTouch(object sender, InfoEventArgs <Point> e)
    {
        Tile tile  = Board.GetTile(e.info);
        Unit actor = RoundController.Current;

        // End turn if select itself
        if (tile == actor.Tile)
        {
            RoundController.EndTurn();
            owner.ChangeState <SelectUnitState>();
            return;
        }

        bool inMoveRange    = RangeManager.MoveRange.Contains(tile);
        bool inAbilityRange = RangeManager.AbilityRangeAndOrigin.ContainsKey(tile);

        // Restart turn if out of range
        if (!inMoveRange && !inAbilityRange)
        {
            owner.ChangeState <RestartUnitState>();
            return;
        }

        // Just move to empty tile
        if (inMoveRange)
        {
            actor.turn.SelectMovement(tile);
            owner.ChangeState <PerformMovement>();
            return;
        }

        // If not a target, return
        if (!actor.GetComponentInChildren <AbilityTarget>().IsTarget(tile))
        {
            return;
        }

        // If not in range to target, move to one of origins
        if (tile.content != null)
        {
            var attackOrigins = RangeManager.AbilityRangeAndOrigin[tile];
            actor.turn.SelectMovement(attackOrigins[0]);

            actor.turn.SelectTarget(tile);
            owner.ChangeState <PerformMovement>();
            return;
        }
    }