Esempio n. 1
0
    private void SelectTileToMove(UnitScript unit)
    {
        Vector3Int gridClickPos;

        // obtiene el tile en el que se hizo click
        if (!ClickOnGrid(out gridClickPos))
        {
            return;
        }

        // obtiene el tile en el que esta la unidad
        Vector3Int gridUnitPos = map.GetGridTile(unit.GetPosition());

        // setea el radio de movimiento y ataque de la unidad
        unit.SetTilesRadius(gridUnitPos);

        List <Vector2> movementTiles = unit.GetMovementTiles();
        List <Vector2> attackTiles   = unit.GetAttackTiles();

        // comprueba que el click no haya sido sobre el tile de la unidad
        if (!selectingTile)
        {
            // crea los tiles de movimiento
            map.InstantiateMovementTiles(movementTiles);
            map.InstantiateAttackTiles(attackTiles);
            selectingTile = true;
        }
        else
        {
            if (unit.ClickOnMovementTile(gridClickPos.x, gridClickPos.y))
            {
                worldPos = map.GetWorldPos(gridClickPos);
                // determina la direccion de movimiento segun la posicion del tile destino
                unit.SetMovementDirection(worldPos);
            }
            else if (unit.ClickOnAttackTile(gridClickPos.x, gridClickPos.y))
            {
                bool targetFound = false;
                foreach (UnitScript possibleTarget in enemyArmy)
                {
                    Vector3Int gridTargetUnitPos = map.GetGridTile(possibleTarget.GetPosition());
                    if (gridClickPos.x == gridTargetUnitPos.x && gridClickPos.y == gridTargetUnitPos.y)
                    {
                        targetUnit = possibleTarget;
                        unit.ToggleAttack(true);
                        targetFound = true;
                        break;
                    }
                }

                if (targetFound)
                {
                    unit.SetMovementDirection(map.GetWorldPos(gridClickPos));

                    // asegura que al hacer click en un tile de ataque la unidad mueva al tile anterior
                    if (gridClickPos.x > gridUnitPos.x)
                    {
                        gridClickPos.x--;
                    }
                    else if (gridClickPos.x < gridUnitPos.x)
                    {
                        gridClickPos.x++;
                    }

                    if (gridClickPos.y > gridUnitPos.y)
                    {
                        gridClickPos.y--;
                    }
                    else if (gridClickPos.y < gridUnitPos.y)
                    {
                        gridClickPos.y++;
                    }

                    worldPos = map.GetWorldPos(gridClickPos);
                }
                else
                {
                    unit.ToggleSelected(false);
                }
            }
            else
            {
                unit.ToggleSelected(false);
            }

            map.DestroyTiles();
            movementTiles.Clear();
            attackTiles.Clear();
            selectingTile = false;
        }
    }