示例#1
0
 public override void SetShadowRotation(UnitBase unitToSet, IndividualTiles unitToCheckPos, IndividualTiles otherUnitToCheck)
 {
     if (unitToCheckPos.tileX == otherUnitToCheck.tileX)
     {
         //Arriba
         if (unitToCheckPos.tileZ > otherUnitToCheck.tileZ)
         {
             unitToSet.sombraHoverUnit.transform.DORotate(new Vector3(0, 0, 0), timeDurationRotation);
         }
         //Abajo
         else
         {
             unitToSet.sombraHoverUnit.transform.DORotate(new Vector3(0, 180, 0), timeDurationRotation);
         }
     }
     //Izquierda o derecha
     else
     {
         //Derecha
         if (unitToCheckPos.tileX > otherUnitToCheck.tileX)
         {
             unitToSet.sombraHoverUnit.transform.DORotate(new Vector3(0, 90, 0), timeDurationRotation);
         }
         //Izquierda
         else
         {
             unitToSet.sombraHoverUnit.transform.DORotate(new Vector3(0, -90, 0), timeDurationRotation);
         }
     }
 }
示例#2
0
    public void ChangePosition(Mage mage2Move)
    {
        CreateAttackCommand(mage2Move);

        IndividualTiles magePreviousTile = mage2Move.myCurrentTile;

        mage2Move.MoveToTilePushed(myCurrentTile);
        mage2Move.UpdateInformationAfterMovement(myCurrentTile);
        this.MoveToTilePushed(magePreviousTile);
        UpdateInformationAfterMovement(magePreviousTile);
        mage2Move.hasMoved = true;
        LM.UnitHasFinishedMovementAndRotation();
        UIM.RefreshTokens();

        if (mage2Move.isDecoyBomb2)
        {
            TM.GetSurroundingTiles(myCurrentTile, 1, true, false);

            //Hago daño a las unidades adyacentes
            for (int i = 0; i < TM.surroundingTiles.Count; ++i)
            {
                if (TM.surroundingTiles[i] != null)
                {
                    TM.surroundingTiles[i].ColorAttack();
                }
            }

            StartCoroutine("WaitToDamageSurroundingAfterChangePos");
        }

        HideAttackEffect(null);
    }
示例#3
0
 //MEJORAR ESTO. PROBABLEMENTE NO NECESITO DOS FUNCIONES  PARA ESTO Y ADEMÁS SE REPITE EN EL PLAYER UNIT
 //Decidir rotación al moverse por los tiles.
 public void CheckTileDirection(IndividualTiles tileToCheck)
 {
     //Arriba o abajo
     if (tileToCheck.tileX == myCurrentTile.tileX)
     {
         //Arriba
         if (tileToCheck.tileZ > myCurrentTile.tileZ)
         {
             unitModel.transform.DORotate(new Vector3(0, 0, 0), timeDurationRotation);
             currentFacingDirection = FacingDirection.North;
         }
         //Abajo
         else
         {
             unitModel.transform.DORotate(new Vector3(0, 180, 0), timeDurationRotation);
             currentFacingDirection = FacingDirection.South;
         }
     }
     //Izquierda o derecha
     else
     {
         //Derecha
         if (tileToCheck.tileX > myCurrentTile.tileX)
         {
             unitModel.transform.DORotate(new Vector3(0, 90, 0), timeDurationRotation);
             currentFacingDirection = FacingDirection.East;
         }
         //Izquierda
         else
         {
             unitModel.transform.DORotate(new Vector3(0, -90, 0), timeDurationRotation);
             currentFacingDirection = FacingDirection.West;
         }
     }
 }
示例#4
0
    //Esta función se encarga de mover a la unidad
    public override void MoveUnit()
    {
        if (!isDead)
        {
            movementParticle.SetActive(true);

            IndividualTiles tileToMove = GetTileToMove();

            //Si recibe null es porque ambos tiles laterales están ocupados
            if (tileToMove == null)
            {
                hasMoved = true;
            }

            else
            {
                MovementLogic(tileToMove);
            }

            movementParticle.SetActive(false);

            tilesToShoot.Clear();

            myCurrentEnemyState = enemyState.Searching;
        }

        else
        {
            myCurrentEnemyState = enemyState.Waiting;
        }
    }
示例#5
0
    //Override a la información que se actualiza al moverse
    public override void UpdateInformationAfterMovement(IndividualTiles newTile)
    {
        //Aviso a los tiles alrededor
        for (int i = 0; i < myCurrentTile.surroundingNeighbours.Count; i++)
        {
            myCurrentTile.surroundingNeighbours[i].unitOnTile = null;
            myCurrentTile.surroundingNeighbours[i].WarnInmediateNeighbours();
        }

        //Actualizo normal
        base.UpdateInformationAfterMovement(newTile);

        //Aviso a los tiles de alrededor
        for (int i = 0; i < myCurrentTile.surroundingNeighbours.Count; i++)
        {
            myCurrentTile.surroundingNeighbours[i].unitOnTile = GetComponent <UnitBase>();
            myCurrentTile.surroundingNeighbours[i].WarnInmediateNeighbours();
        }

        exteriorTiles.Clear();

        //Añado los tiles exteriores para el stomp.
        for (int i = 0; i < LM.TM.GetSurroundingTiles(myCurrentTile, 2, true, true).Count; i++)
        {
            exteriorTiles.Add(LM.TM.GetSurroundingTiles(myCurrentTile, 2, true, true)[i]);
        }
    }
示例#6
0
    //Lógica actual del movimiento. Básicamente es el encargado de mover al modelo y setear las cosas
    private void MovementLogic(IndividualTiles tileToMove)
    {
        //Muevo a la balista
        transform.DOMove(currentTileVectorToMove, currentTimeForMovement);

        //Actualizo las variables de los tiles
        UpdateInformationAfterMovement(tileToMove);

        //Aviso de que se ha movido
        hasMoved = true;
    }
示例#7
0
    //El LevelManager avisa a la unidad de que debe moverse.
    //Esta función tiene que ser override para que el mago pueda instanciar decoys.
    public override void MoveToTile(IndividualTiles tileToMove, List <IndividualTiles> pathReceived)
    {
        oldTile = myCurrentTile;

        base.MoveToTile(tileToMove, pathReceived);

        if (tileToMove != oldTile)
        {
            //Compruebo si tengo que instanciar decoy
            CheckDecoy(oldTile);
        }
    }
示例#8
0
    public override void MoveToTilePushed(IndividualTiles newTile)
    {
        FeedbackTilesToAttack(false);
        base.MoveToTilePushed(newTile);

        if (isAttackPrepared)
        {
            FeedbackTilesToAttack(false);
            tilesToShoot.Clear();
            CheckCharactersInLine(true, myCurrentTile);
            FeedbackTilesToAttack(true);
        }
    }
示例#9
0
    public void ChangePosition(PlayerUnit unitToMove)
    {
        CreateAttackCommand(unitToMove);

        IndividualTiles valkyriePreviousTile = unitToMove.myCurrentTile;

        unitToMove.MoveToTilePushed(myCurrentTile);
        unitToMove.UpdateInformationAfterMovement(myCurrentTile);
        this.MoveToTilePushed(valkyriePreviousTile);
        UpdateInformationAfterMovement(valkyriePreviousTile);
        hasMoved = true;
        LM.UnitHasFinishedMovementAndRotation();
        UIM.RefreshTokens();
    }
示例#10
0
    public void InstantiateDecoy(IndividualTiles tileForDecoy)
    {
        GameObject decoyToInstantiate = Instantiate(mageDecoyRefAsset, transform.position, transform.rotation);

        //Inicializo mageDecoy. SI VUELVE A SALTAR ERROR POR EL TILE DEL MAGEDECOY NO TOCAR ESTO, HABLAR EL PROBLEMA PARA QUE SOLUCIONARLO ENTRE LOS DOS Y QUE NO VUELVA A SALIR
        decoyToInstantiate.GetComponent <MageDecoy>().myMage = this;
        decoyToInstantiate.GetComponent <MageDecoy>().InitializeHealth();
        decoyToInstantiate.GetComponent <MageDecoy>().myCurrentTile = tileForDecoy;
        decoyToInstantiate.GetComponent <MageDecoy>().myCurrentTile.WarnInmediateNeighbours();
        decoyToInstantiate.GetComponent <MageDecoy>().UpdateInformationAfterMovement(tileForDecoy);

        //Pongo esta referencia para que el mage solo pueda cambiarse con sus decoys y para que pueda comprobar sus booleanos (para las habilidades)
        myDecoys.Add(decoyToInstantiate);
    }
示例#11
0
    public override void MoveToTilePushed(IndividualTiles newTile)
    {
        base.MoveToTilePushed(newTile);

        if (isCharging)
        {
            for (int i = 0; i < beamTiles.Count; i++)
            {
                beamTiles[i].ColorDesAttack();
            }


            CheckTilesForBeam();
        }
    }
示例#12
0
    //Función que muetra la sombra del objetivo donde va a ser atraida
    public void ShowGrabShadow(IndividualTiles _referenceTile, FacingDirection _referenceDirection)
    {
        if (currentUnitsAvailableToAttack.Count > 0)
        {
            playerWithShadowActivated = currentUnitsAvailableToAttack[0];

            currentUnitsAvailableToAttack[0].sombraHoverUnit.SetActive(true);

            List <IndividualTiles> tileUnitGrabbed = new List <IndividualTiles>();
            tileUnitGrabbed = _referenceTile.GetTilesInFrontOfTheCharacter(_referenceDirection, 1);

            Vector3 pointPosition = new Vector3(tileUnitGrabbed[0].transform.position.x, tileUnitGrabbed[0].transform.position.y + 0.5f, tileUnitGrabbed[0].transform.position.z);

            currentUnitsAvailableToAttack[0].sombraHoverUnit.transform.position = pointPosition;
        }
    }
示例#13
0
    public MoveCommand(UnitBase.FacingDirection newRotation, UnitBase.FacingDirection previousRotation,
                       IndividualTiles previousTile, IndividualTiles tileToMove,
                       List <IndividualTiles> currentPath, UnitBase pj,
                       int _pjDamageBuffDebuff, int _pjTurnsDamageBuffDebuff, int _pjMovementBuffDebuff, int _pjTurnsMovementBuffDebuff)
    {
        this.newRotation      = newRotation;
        this.previousRotation = previousRotation;

        this.previousTile = previousTile;
        this.tileToMove   = tileToMove;

        this.currentPath = currentPath;
        this.pj          = pj;

        pj_damageBuffDebuff      = _pjDamageBuffDebuff;
        pj_turnsDamageBuffDebuff = _pjTurnsDamageBuffDebuff;

        pj_movementBuffDebuff      = _pjMovementBuffDebuff;
        pj_turnsMovementBuffDebuff = _pjTurnsMovementBuffDebuff;
    }
示例#14
0
    public void CheckDecoy(IndividualTiles tileForDecoy)
    {
        if (myDecoys.Count < maxDecoys)
        {
            //Instancio el decoy
            InstantiateDecoy(tileForDecoy);
        }

        else
        {
            //Destruyo al decoy anterior
            GameObject decoyToDestroy = myDecoys[0];
            Destroy(decoyToDestroy);
            LM.charactersOnTheBoard.Remove(decoyToDestroy.GetComponent <PlayerUnit>());
            myDecoys.Remove(decoyToDestroy);

            //Instancio el decoy
            InstantiateDecoy(tileForDecoy);
        }
    }
示例#15
0
    //Función genérica que comprueba la nueva dirección a la que debe mirar el pícaro tras saltar.
    public void NewRotationAfterJump(IndividualTiles tileWithEnemyAttacked)
    {
        Debug.Log("1");
        if (tileWithEnemyAttacked.tileX == myCurrentTile.tileX)
        {
            Debug.Log("2");
            //Arriba
            if (tileWithEnemyAttacked.tileZ < myCurrentTile.tileZ)
            {
                unitModel.transform.DORotate(new Vector3(0, 180, 0), timeDurationRotation);
                currentFacingDirection = FacingDirection.South;
            }
            //Abajo
            else
            {
                unitModel.transform.DORotate(new Vector3(0, 0, 0), timeDurationRotation);
                currentFacingDirection = FacingDirection.North;
            }
        }
        //Izquierda o derecha
        else
        {
            //Derecha
            if (tileWithEnemyAttacked.tileX < myCurrentTile.tileX)
            {
                Debug.Log("izq");

                unitModel.transform.DORotate(new Vector3(0, -90, 0), timeDurationRotation);
                currentFacingDirection = FacingDirection.West;
            }
            //Izquierda
            else
            {
                Debug.Log("der");
                unitModel.transform.DORotate(new Vector3(0, 90, 0), timeDurationRotation);
                currentFacingDirection = FacingDirection.East;
            }
        }
    }
示例#16
0
    //Función que se encarga de realizar el calculo e daño como tal. Simplemente es para no repetir el mismo código todo el rato
    private void CalculteDamageLogic(UnitBase unitToDealDamage, IndividualTiles tileLineToCheck, FacingDirection directionForBackAttack)
    {
        //Si estoy en desventaja de altura hago menos daño
        if (unitToDealDamage.myCurrentTile.height > tileLineToCheck.height)
        {
            damageWithMultipliersApplied -= penalizatorDamageLessHeight;
            unitToDealDamage.downToUpDamageIcon.SetActive(true);
        }

        //Si estoy en ventaja de altura hago más daño
        else if (unitToDealDamage.myCurrentTile.height < tileLineToCheck.height)
        {
            damageWithMultipliersApplied += bonusDamageMoreHeight;
            unitToDealDamage.upToDownDamageIcon.SetActive(true);
        }

        //Si le ataco por la espalda hago más daño
        if (unitToDealDamage.currentFacingDirection == directionForBackAttack)
        {
            //Ataque por la espalda
            damageWithMultipliersApplied += bonusDamageBackAttack;
            unitToDealDamage.backStabIcon.SetActive(true);
        }
    }
示例#17
0
    public override void UndoMove(MoveCommand _moveCommand, IndividualTiles tileToMoveBack, FacingDirection rotationToTurnBack, bool shouldResetMovement)
    {
        base.UndoMove(_moveCommand, tileToMoveBack, rotationToTurnBack, shouldResetMovement);

        if (shouldResetMovement)
        {
            if (myDecoys.Count > 0)
            {
                LM.charactersOnTheBoard.Remove(myDecoys[myDecoys.Count - 1].GetComponent <PlayerUnit>());

                Destroy(myDecoys[myDecoys.Count - 1]);
                myDecoys.RemoveAt(myDecoys.Count - 1);
            }
        }

        //Estas líneas las añado para comprobar si hay samurai y si hay que actualizar el honor
        Samurai samuraiUpgraded = FindObjectOfType <Samurai>();

        if (samuraiUpgraded != null)
        {
            samuraiUpgraded.RefreshHonorOnPortrait();
        }
        UIM.CheckActionsAvaliable();
    }
示例#18
0
    //El bool y el tile es solo para la balista pero comparte la funcion con el charger y tiene que tenerlo
    public override void CheckCharactersInLine(bool _NoUsarEsteBooleano, IndividualTiles _noUsarEsteTile)
    {
        if (!isDead)
        {
            if (myCurrentTile == null)
            {
                InitializeUnitOnTile();
            }

            tilesBehindObjective.Clear();
            currentUnitsAvailableToAttack.Clear();

            //Busco objetivos en los tiles de arriba

            //Seteo número de tiles a comprobar en función del rango y del número de tiles disponibles
            if (rangeOfAction <= myCurrentTile.tilesInLineUp.Count)
            {
                rangeVSTilesInLineLimitant = rangeOfAction;
            }
            else
            {
                rangeVSTilesInLineLimitant = myCurrentTile.tilesInLineUp.Count;
            }

            for (int i = 0; i < rangeVSTilesInLineLimitant; i++)
            {
                //Paro de comprobar si hay un obstáculo, un tile vacío o una unidad enemiga.
                if (myCurrentTile.tilesInLineUp[i].isObstacle ||
                    myCurrentTile.tilesInLineUp[i].isEmpty ||
                    (myCurrentTile.tilesInLineUp[i].unitOnTile != null && myCurrentTile.tilesInLineUp[i].unitOnTile.GetComponent <EnemyUnit>()) ||
                    (i > 0 && Mathf.Abs(myCurrentTile.tilesInLineUp[i].height - myCurrentTile.tilesInLineUp[i - 1].height) > maxHeightDifferenceToMove))
                {
                    break;
                }

                //Si por el contrario encuentro una unidad del jugador a mi altura, la añado a la lista de objetivos (en el resto de direcciones antes compruebo si es la unidad más lejana)
                else if (myCurrentTile.tilesInLineUp[i].unitOnTile != null && myCurrentTile.tilesInLineUp[i].unitOnTile.GetComponent <PlayerUnit>())
                {
                    //Almaceno la primera unidad en la lista de posibles unidades.
                    currentUnitsAvailableToAttack.Add(myCurrentTile.tilesInLineUp[i].unitOnTile);
                    furthestAvailableUnitDistance = i;

                    if (i + 1 < myCurrentTile.tilesInLineUp.Count)
                    {
                        tilesBehindObjective.Add(myCurrentTile.tilesInLineUp[i + 1]);
                    }


                    temporalFacingDirectionWhileHover = FacingDirection.North;

                    //Break ya que sólo me interesa la primera unidad de la linea
                    break;
                }
            }

            //Tiles derecha
            if (rangeOfAction <= myCurrentTile.tilesInLineRight.Count)
            {
                rangeVSTilesInLineLimitant = rangeOfAction;
            }
            else
            {
                rangeVSTilesInLineLimitant = myCurrentTile.tilesInLineRight.Count;
            }

            for (int i = 0; i < rangeVSTilesInLineLimitant; i++)
            {
                if (myCurrentTile.tilesInLineRight[i].isObstacle ||
                    myCurrentTile.tilesInLineRight[i].isEmpty ||
                    (myCurrentTile.tilesInLineRight[i].unitOnTile != null && myCurrentTile.tilesInLineRight[i].unitOnTile.GetComponent <EnemyUnit>()) ||
                    (i > 0 && Mathf.Abs(myCurrentTile.tilesInLineRight[i].height - myCurrentTile.tilesInLineRight[i - 1].height) > maxHeightDifferenceToMove))
                {
                    break;
                }

                else if (myCurrentTile.tilesInLineRight[i].unitOnTile != null && myCurrentTile.tilesInLineRight[i].unitOnTile.GetComponent <PlayerUnit>() && Mathf.Abs(myCurrentTile.tilesInLineRight[i].height - myCurrentTile.height) <= maxHeightDifferenceToAttack)
                {
                    //Compruebo que unidad está más lejos
                    if (currentUnitsAvailableToAttack.Count == 0 || furthestAvailableUnitDistance < i)
                    {
                        currentUnitsAvailableToAttack.Clear();
                        currentUnitsAvailableToAttack.Add(myCurrentTile.tilesInLineRight[i].unitOnTile);
                        furthestAvailableUnitDistance = i;
                    }

                    //Si tienen la misma distancia almaceno a las dos
                    else if (furthestAvailableUnitDistance == i)
                    {
                        currentUnitsAvailableToAttack.Add(myCurrentTile.tilesInLineRight[i].unitOnTile);
                    }

                    if (i + 1 < myCurrentTile.tilesInLineRight.Count)
                    {
                        tilesBehindObjective.Add(myCurrentTile.tilesInLineRight[i + 1]);
                    }

                    temporalFacingDirectionWhileHover = FacingDirection.East;

                    //Break ya que sólo me interesa la primera unidad de la linea
                    break;
                }
            }

            //Tiles abajo
            if (rangeOfAction <= myCurrentTile.tilesInLineDown.Count)
            {
                rangeVSTilesInLineLimitant = rangeOfAction;
            }
            else
            {
                rangeVSTilesInLineLimitant = myCurrentTile.tilesInLineDown.Count;
            }

            for (int i = 0; i < rangeVSTilesInLineLimitant; i++)
            {
                if (myCurrentTile.tilesInLineDown[i].isObstacle ||
                    myCurrentTile.tilesInLineDown[i].isEmpty ||
                    (myCurrentTile.tilesInLineDown[i].unitOnTile != null && myCurrentTile.tilesInLineDown[i].unitOnTile.GetComponent <EnemyUnit>()) ||
                    (i > 0 && Mathf.Abs(myCurrentTile.tilesInLineDown[i].height - myCurrentTile.tilesInLineDown[i - 1].height) > maxHeightDifferenceToMove))
                {
                    break;
                }

                else if (myCurrentTile.tilesInLineDown[i].unitOnTile != null && myCurrentTile.tilesInLineDown[i].unitOnTile.GetComponent <PlayerUnit>() && Mathf.Abs(myCurrentTile.tilesInLineDown[i].height - myCurrentTile.height) <= maxHeightDifferenceToAttack)
                {
                    //Compruebo que unidad está más lejos
                    if (currentUnitsAvailableToAttack.Count == 0 || furthestAvailableUnitDistance < i)
                    {
                        currentUnitsAvailableToAttack.Clear();
                        currentUnitsAvailableToAttack.Add(myCurrentTile.tilesInLineDown[i].unitOnTile);
                        furthestAvailableUnitDistance = i;
                    }

                    //Si tienen la misma distancia almaceno a las dos
                    else if (furthestAvailableUnitDistance == i)
                    {
                        currentUnitsAvailableToAttack.Add(myCurrentTile.tilesInLineDown[i].unitOnTile);
                    }

                    if (i + 1 < myCurrentTile.tilesInLineDown.Count)
                    {
                        tilesBehindObjective.Add(myCurrentTile.tilesInLineDown[i + 1]);
                    }

                    temporalFacingDirectionWhileHover = FacingDirection.South;

                    //Break ya que sólo me interesa la primera unidad de la linea
                    break;
                }
            }

            //Tiles abajo
            if (rangeOfAction <= myCurrentTile.tilesInLineLeft.Count)
            {
                rangeVSTilesInLineLimitant = rangeOfAction;
            }
            else
            {
                rangeVSTilesInLineLimitant = myCurrentTile.tilesInLineLeft.Count;
            }

            for (int i = 0; i < rangeVSTilesInLineLimitant; i++)
            {
                if (myCurrentTile.tilesInLineLeft[i].isObstacle ||
                    myCurrentTile.tilesInLineLeft[i].isEmpty ||
                    (myCurrentTile.tilesInLineLeft[i].unitOnTile != null && myCurrentTile.tilesInLineLeft[i].unitOnTile.GetComponent <EnemyUnit>()) ||
                    (i > 0 && Mathf.Abs(myCurrentTile.tilesInLineLeft[i].height - myCurrentTile.tilesInLineLeft[i - 1].height) > maxHeightDifferenceToMove))
                {
                    break;
                }

                else if (myCurrentTile.tilesInLineLeft[i].unitOnTile != null && myCurrentTile.tilesInLineLeft[i].unitOnTile.GetComponent <PlayerUnit>() && Mathf.Abs(myCurrentTile.tilesInLineLeft[i].height - myCurrentTile.height) <= maxHeightDifferenceToAttack)
                {
                    //Compruebo que unidad está más lejos
                    if (currentUnitsAvailableToAttack.Count == 0 || furthestAvailableUnitDistance < i)
                    {
                        currentUnitsAvailableToAttack.Clear();
                        currentUnitsAvailableToAttack.Add(myCurrentTile.tilesInLineLeft[i].unitOnTile);
                        furthestAvailableUnitDistance = i;
                    }

                    //Si tienen la misma distancia almaceno a las dos
                    else if (furthestAvailableUnitDistance == i)
                    {
                        currentUnitsAvailableToAttack.Add(myCurrentTile.tilesInLineLeft[i].unitOnTile);
                    }

                    if (i + 1 < myCurrentTile.tilesInLineLeft.Count)
                    {
                        tilesBehindObjective.Add(myCurrentTile.tilesInLineLeft[i + 1]);
                    }

                    temporalFacingDirectionWhileHover = FacingDirection.West;

                    //Break ya que sólo me interesa la primera unidad de la linea
                    break;
                }
            }

            //Si coincide que hay varios personajes a la misma distancia, me quedo con el que tiene menos vida
            if (currentUnitsAvailableToAttack.Count > 1)
            {
                //Ordeno la lista de posibles objetivos de menor a mayor vida actual
                currentUnitsAvailableToAttack.Sort(delegate(UnitBase a, UnitBase b)
                {
                    return((a.currentHealth).CompareTo(b.currentHealth));
                });
            }
        }
    }
示例#19
0
    public bool isAlone; //ESTO EN REALIDAD IRIA EN EL MOVIMIENTO, COMPROBAR QUE FUNCIONA (HACER LO MISMO CON EL CABALLERO Y SI SE PONE A PROTEGER A LOS LADOS
    #endregion

    public AttackCommand(UnitBase.FacingDirection _enemypreviousRotation, UnitBase.FacingDirection _pjpreviousRotation,
                         IndividualTiles _enemyPreviousTile, IndividualTiles _pjPreviousTile,
                         int _enemyPreviousHealth, int _pjPreviousHealth,
                         UnitBase _pj, UnitBase _enemy,
                         int _pjArmor, int _objArmor,
                         bool _pjIsStunned, bool _objIsStunned,
                         bool _pjIsMarked, bool _objIsMarked, int _pjnumberOfMarks, int _objnumberOfMarks,
                         bool _pjHasMoved, bool _objHasMoved, bool _pjHasAttacked, bool _objHasAttacked,
                         int _pjDamageBuffDebuff, int _objDamageBuffDebuff, int _pjMovementBuffDebuff, int _objMovementBuffDebuff,
                         int _pjTurnsDamageBuffDebuff, int _objTurnsDamageBuffDebuff, int _pjTurnsMovementBuffDebuff, int _objTurnsMovementBuffDebuff)
    {
        objPreviousRotation = _enemypreviousRotation;
        pjPreviousRotation  = _pjpreviousRotation;

        objPreviousTile = _enemyPreviousTile;
        pjPreviousTile  = _pjPreviousTile;

        objPreviousHealth = _enemyPreviousHealth;
        pjPreviousHealth  = _pjPreviousHealth;

        pj  = _pj;
        obj = _enemy;

        pjArmor  = _pjArmor;
        objArmor = _objArmor;

        pjIsStunned  = _pjIsStunned;
        objIsStunned = _objIsStunned;

        pjIsMarked       = _pjIsMarked;
        objIsMarked      = _objIsMarked;
        pjnumberOfMarks  = _pjnumberOfMarks;
        objnumberOfMarks = _objnumberOfMarks;

        pjHasMoved     = _pjHasMoved;
        objHasMoved    = _objHasMoved;
        pjHasAttacked  = _pjHasAttacked;
        objHasAttacked = _objHasAttacked;

        pj_damageBuffDebuff      = _pjDamageBuffDebuff;
        pj_turnsDamageBuffDebuff = _pjTurnsDamageBuffDebuff;

        obj_damageBuffDebuff      = _objDamageBuffDebuff;
        obj_turnsDamageBuffDebuff = _objTurnsDamageBuffDebuff;

        pj_movementBuffDebuff      = _pjMovementBuffDebuff;
        pj_turnsMovementBuffDebuff = _pjTurnsMovementBuffDebuff;

        obj_movementBuffDebuff      = _objMovementBuffDebuff;
        obj_turnsMovementBuffDebuff = _objTurnsMovementBuffDebuff;

        #region Specific

        if (pj.GetComponent <Rogue>())
        {
            Rogue refPj = pj.GetComponent <Rogue>();

            unitsAttacked.Clear();

            for (int i = 0; i < refPj.unitsAttacked.Count; i++)
            {
                unitsAttacked.Add(refPj.unitsAttacked[i]);
            }

            ninjaExtraTurns = refPj.extraTurnCount;
            ninjaExtraJumps = refPj.unitsCanJump;

            smokeTiles.Clear();
            for (int i = 0; i < refPj.realBombsSpawned.Count; i++)
            {
                smokeTiles.Add(refPj.realBombsSpawned[i]);
            }

            ninjaBonusDamage = refPj.baseDamage;
        }

        else if (pj.GetComponent <Mage>())
        {
            Mage refPj = pj.GetComponent <Mage>();

            if (refPj.myDecoys.Count > 0)
            {
                oldDecoy = refPj.myDecoys[0];
            }

            //Esto lo tenia apuntado hace tiempo pero en principio funciona bien
            //newDecoy; //Esto da problemas seguro, mirar quizas en el execute que quite el actual en vez de guardarlo antes.
            //hasMovedWithDecoy = refPj.hasMoved; //Quizás es poner simplemente si ha movido
        }

        else if (pj.GetComponent <Samurai>())
        {
            Samurai refPj = pj.GetComponent <Samurai>();

            unitToParry = refPj.unitToParry;
            honor       = pj.GetComponent <Samurai>().currentHonor;
        }

        else if (pj.GetComponent <Druid>())
        {
            Druid refPj = pj.GetComponent <Druid>();

            for (int i = 0; i < refPj.realTilesSpawned.Count; i++)
            {
                _realTilesInstantiated.Add(refPj.realTilesSpawned[i]);
            }

            for (int i = 0; i < refPj.damageTilesReplaced.Count; i++)
            {
                _damageTilesReplaced.Add(refPj.damageTilesReplaced[i]);
            }

            _healedLife = refPj.healedLife;
            _buffHeal   = refPj.buffHeal;
            //damageTileReplaced =;

            //El druida parece que afecta a movementUDs ¿Esto esta bien? ¿o debería ser un bufo?
        }

        //Este no es else if.
        if (obj.GetComponent <Berserker>())
        {
            Berserker refPj = obj.GetComponent <Berserker>();

            isInRage      = refPj.isInRage;
            rageTurnsLeft = refPj.turnsLeftToRageOff;
        }

        #endregion
    }
示例#20
0
    public void ShowPushResult()
    {
        if (pathToObjective.Count > 0)
        {
            pathToObjectiveTileReference = pathToObjective[pathToObjective.Count - 1];
        }

        else
        {
            pathToObjectiveTileReference = myCurrentTile;
        }

        currentUnitsAvailableToAttack[0].sombraHoverUnit.SetActive(true);

        //COMPROBAR
        SetShadowRotation(currentUnitsAvailableToAttack[0], currentUnitsAvailableToAttack[0].myCurrentTile, myCurrentTile);

        if (temporalFacingDirectionWhileHover == FacingDirection.North)
        {
            if (CalculatePushLogic(1, pathToObjectiveTileReference.tilesInLineUp, damageMadeByPush, damageMadeByFall) == currentUnitsAvailableToAttack[0].myCurrentTile)
            {
                currentUnitsAvailableToAttack[0].sombraHoverUnit.SetActive(false);
            }
            else
            {
                tileWhereObjectiveShadowWillEnd = CalculatePushLogic(1, pathToObjectiveTileReference.tilesInLineUp, damageMadeByPush, damageMadeByFall);

                currentUnitsAvailableToAttack[0].sombraHoverUnit.transform.position = tileWhereObjectiveShadowWillEnd.transform.position;

                tileWhereObjectiveShadowWillEnd.ColorAttack();
            }
        }

        else if (temporalFacingDirectionWhileHover == FacingDirection.South)
        {
            if (CalculatePushLogic(1, pathToObjectiveTileReference.tilesInLineDown, damageMadeByPush, damageMadeByFall) == currentUnitsAvailableToAttack[0].myCurrentTile)
            {
                currentUnitsAvailableToAttack[0].sombraHoverUnit.SetActive(false);
            }

            else
            {
                tileWhereObjectiveShadowWillEnd = CalculatePushLogic(1, pathToObjectiveTileReference.tilesInLineDown, damageMadeByPush, damageMadeByFall);
                currentUnitsAvailableToAttack[0].sombraHoverUnit.transform.position = tileWhereObjectiveShadowWillEnd.transform.position;
                tileWhereObjectiveShadowWillEnd.ColorAttack();
            }
        }

        else if (temporalFacingDirectionWhileHover == FacingDirection.East)
        {
            if (CalculatePushLogic(1, pathToObjectiveTileReference.tilesInLineRight, damageMadeByPush, damageMadeByFall) == currentUnitsAvailableToAttack[0].myCurrentTile)
            {
                currentUnitsAvailableToAttack[0].sombraHoverUnit.SetActive(false);
            }
            else
            {
                tileWhereObjectiveShadowWillEnd = CalculatePushLogic(1, pathToObjectiveTileReference.tilesInLineRight, damageMadeByPush, damageMadeByFall);
                currentUnitsAvailableToAttack[0].sombraHoverUnit.transform.position = tileWhereObjectiveShadowWillEnd.transform.position;
                tileWhereObjectiveShadowWillEnd.ColorAttack();
            }
        }

        else if (temporalFacingDirectionWhileHover == FacingDirection.West)
        {
            if (CalculatePushLogic(1, pathToObjectiveTileReference.tilesInLineLeft, damageMadeByPush, damageMadeByFall) == currentUnitsAvailableToAttack[0].myCurrentTile)
            {
                currentUnitsAvailableToAttack[0].sombraHoverUnit.SetActive(false);
            }
            else
            {
                tileWhereObjectiveShadowWillEnd = CalculatePushLogic(1, pathToObjectiveTileReference.tilesInLineLeft, damageMadeByPush, damageMadeByFall);
                currentUnitsAvailableToAttack[0].sombraHoverUnit.transform.position = tileWhereObjectiveShadowWillEnd.transform.position;
                tileWhereObjectiveShadowWillEnd.ColorAttack();
            }
        }
    }
示例#21
0
    public override void Attack(UnitBase unitToAttack)
    {
        CheckIfUnitHasMarks(unitToAttack);

        List <IndividualTiles> tilesInFront = new List <IndividualTiles>();

        tilesInFront = myCurrentTile.GetTilesInFrontOfTheCharacter(currentFacingDirection, 3);

        //Particulas
        for (int i = 0; i < tilesInFront.Count; i++)
        {
            if (tilesInFront[i].unitOnTile != null && tilesInFront[i].unitOnTile == unitToAttack)
            {
                if (i == 1)
                {
                    attack1.SetActive(true);
                }

                else if (i == 2)
                {
                    attack2.SetActive(true);
                }

                else if (i == 3)
                {
                    attack3.SetActive(true);
                }
            }
        }

        if (canChooseEnemy)
        {
            //Animación de ataque
            myAnimator.SetTrigger("Attack");

            //UNDO
            CreateAttackCommand(unitToAttack);

            //Quito el color del tile
            myCurrentTile.ColorDeselect();

            for (int i = 0; i < currentUnitsAvailableToAttack.Count; i++)
            {
                if (currentUnitsAvailableToAttack[i] == unitToAttack)
                {
                    break;
                }
                else if (currentUnitsAvailableToAttack[i] != null)
                {
                    //UNDO
                    CreateAttackCommand(currentUnitsAvailableToAttack[i]);

                    DoDamage(currentUnitsAvailableToAttack[i]);
                }
            }


            //Hago daño antes de que se produzca el intercambio
            DoDamage(unitToAttack);

            HideAttackEffect(unitToAttack);
            //Intercambio
            previousTile = unitToAttack.myCurrentTile;

            currentTileVectorToMove = unitToAttack.myCurrentTile.transform.position;
            transform.DOMove(currentTileVectorToMove, 1);

            currentTileVectorToMove = myCurrentTile.transform.position;
            unitToAttack.transform.DOMove(currentTileVectorToMove, 1);

            unitToAttack.UpdateInformationAfterMovement(myCurrentTile);
            UpdateInformationAfterMovement(previousTile);
            unitToAttack.UpdateInformationAfterMovement(unitToAttack.myCurrentTile);

            //Hay que cambiarlo
            SoundManager.Instance.PlaySound(AppSounds.ROGUE_ATTACK);
            //La base tiene que ir al final para que el bool de hasAttacked se active después del efecto.
            base.Attack(unitToAttack);
        }

        else if (armorMode)
        {
            //Animación de ataque
            myAnimator.SetTrigger("Attack");

            //UNDO
            CreateAttackCommand(unitToAttack);

            //Quito el color del tile
            myCurrentTile.ColorDeselect();

            if (unitToAttack.GetComponent <PlayerUnit>())
            {
                if (armorMode2)
                {
                    currentArmor += numberOfArmorAdded;
                    if (currentArmor > currentHealth)
                    {
                        currentArmor = currentHealth;
                    }
                }

                unitToAttack.currentArmor += numberOfArmorAdded;
                if (unitToAttack.currentArmor > unitToAttack.currentHealth)
                {
                    unitToAttack.currentArmor = unitToAttack.currentHealth;
                }

                unitToAttack.RefreshHealth(false);
                RefreshHealth(false);
            }

            else
            {
                //Hago daño
                DoDamage(unitToAttack);
            }

            //Intercambio
            previousTile = unitToAttack.myCurrentTile;

            currentTileVectorToMove = unitToAttack.myCurrentTile.transform.position;
            transform.DOMove(currentTileVectorToMove, 1);

            currentTileVectorToMove = myCurrentTile.transform.position;
            unitToAttack.transform.DOMove(currentTileVectorToMove, 1);

            unitToAttack.UpdateInformationAfterMovement(myCurrentTile);
            UpdateInformationAfterMovement(previousTile);
            unitToAttack.UpdateInformationAfterMovement(unitToAttack.myCurrentTile);

            HideAttackEffect(unitToAttack);
            UIM.RefreshHealth();
            //Hay que cambiarlo
            SoundManager.Instance.PlaySound(AppSounds.ROGUE_ATTACK);
            //La base tiene que ir al final para que el bool de hasAttacked se active después del efecto.
            base.Attack(unitToAttack);
        }

        else
        {
            //UNDO
            CreateAttackCommand(unitToAttack);

            //Animación de ataque
            myAnimator.SetTrigger("Attack");

            //Quito el color del tile
            myCurrentTile.ColorDeselect();

            if (unitToAttack.GetComponent <PlayerUnit>())
            {
            }

            else
            {
                //Hago daño
                DoDamage(unitToAttack);
            }

            HideAttackEffect(unitToAttack);
            //Intercambio
            previousTile = unitToAttack.myCurrentTile;

            currentTileVectorToMove = unitToAttack.myCurrentTile.transform.position;
            transform.DOMove(currentTileVectorToMove, 1);

            currentTileVectorToMove = myCurrentTile.transform.position;
            unitToAttack.transform.DOMove(currentTileVectorToMove, 1);

            unitToAttack.UpdateInformationAfterMovement(myCurrentTile);
            UpdateInformationAfterMovement(previousTile);
            unitToAttack.UpdateInformationAfterMovement(unitToAttack.myCurrentTile);

            //Hay que cambiarlo
            SoundManager.Instance.PlaySound(AppSounds.ROGUE_ATTACK);
            //La base tiene que ir al final para que el bool de hasAttacked se active después del efecto.
            base.Attack(unitToAttack);
        }

        hasAttacked = true;
    }
示例#22
0
 public override void MoveToTilePushed(IndividualTiles newTile)
 {
     Debug.Log("Can't be pushed");
 }
示例#23
0
    public override void CheckTilesInRange(IndividualTiles _referenceTile, FacingDirection _referenceDirection)
    {
        currentTilesInRangeForAttack.Clear();

        Debug.Log(_referenceTile);
        Debug.Log(_referenceDirection);

        if (_referenceDirection == FacingDirection.North)
        {
            if (attackRange <= _referenceTile.tilesInLineUp.Count)
            {
                rangeVSTilesInLineLimitant = attackRange;
            }
            else
            {
                rangeVSTilesInLineLimitant = _referenceTile.tilesInLineUp.Count;
            }

            for (int i = 0; i < rangeVSTilesInLineLimitant; i++)
            {
                if (!_referenceTile.tilesInLineUp[i].isEmpty && !_referenceTile.tilesInLineUp[i].isObstacle && Mathf.Abs(_referenceTile.tilesInLineUp[i].height - _referenceTile.height) <= maxHeightDifferenceToAttack)
                {
                    currentTilesInRangeForAttack.Add(_referenceTile.tilesInLineUp[i]);

                    for (int j = 0; j < _referenceTile.tilesInLineUp[i].GetLateralTilesBasedOnDirection(_referenceDirection, 1).Count; j++)
                    {
                        currentTilesInRangeForAttack.Add(_referenceTile.tilesInLineUp[i].GetLateralTilesBasedOnDirection(_referenceDirection, 1)[j]);
                    }
                }

                if (_referenceTile.tilesInLineUp[i].unitOnTile != null && Mathf.Abs(_referenceTile.tilesInLineUp[i].height - _referenceTile.height) <= maxHeightDifferenceToAttack)
                {
                    break;
                }
            }
        }

        if (_referenceDirection == FacingDirection.South)
        {
            if (attackRange <= _referenceTile.tilesInLineDown.Count)
            {
                rangeVSTilesInLineLimitant = attackRange;
            }
            else
            {
                rangeVSTilesInLineLimitant = _referenceTile.tilesInLineDown.Count;
            }

            for (int i = 0; i < rangeVSTilesInLineLimitant; i++)
            {
                if (!_referenceTile.tilesInLineDown[i].isEmpty && !_referenceTile.tilesInLineDown[i].isObstacle && Mathf.Abs(_referenceTile.tilesInLineDown[i].height - _referenceTile.height) <= maxHeightDifferenceToAttack)
                {
                    currentTilesInRangeForAttack.Add(_referenceTile.tilesInLineDown[i]);


                    for (int j = 0; j < _referenceTile.tilesInLineDown[i].GetLateralTilesBasedOnDirection(_referenceDirection, 1).Count; j++)
                    {
                        currentTilesInRangeForAttack.Add(_referenceTile.tilesInLineDown[i].GetLateralTilesBasedOnDirection(_referenceDirection, 1)[j]);
                    }
                }

                if (_referenceTile.tilesInLineDown[i].unitOnTile != null && Mathf.Abs(_referenceTile.tilesInLineDown[i].height - _referenceTile.height) <= maxHeightDifferenceToAttack)
                {
                    break;
                }
            }
        }

        if (_referenceDirection == FacingDirection.East)
        {
            if (attackRange <= _referenceTile.tilesInLineRight.Count)
            {
                rangeVSTilesInLineLimitant = attackRange;
            }
            else
            {
                rangeVSTilesInLineLimitant = _referenceTile.tilesInLineRight.Count;
            }

            for (int i = 0; i < rangeVSTilesInLineLimitant; i++)
            {
                if (!_referenceTile.tilesInLineRight[i].isEmpty && !_referenceTile.tilesInLineRight[i].isObstacle && Mathf.Abs(_referenceTile.tilesInLineRight[i].height - _referenceTile.height) <= maxHeightDifferenceToAttack)
                {
                    currentTilesInRangeForAttack.Add(_referenceTile.tilesInLineRight[i]);

                    for (int j = 0; j < _referenceTile.tilesInLineRight[i].GetLateralTilesBasedOnDirection(_referenceDirection, 1).Count; j++)
                    {
                        currentTilesInRangeForAttack.Add(_referenceTile.tilesInLineRight[i].GetLateralTilesBasedOnDirection(_referenceDirection, 1)[j]);
                        Debug.Log("Tile lateral " + _referenceTile.tilesInLineRight[i].GetLateralTilesBasedOnDirection(_referenceDirection, 1)[j].name);
                    }
                }

                if (_referenceTile.tilesInLineRight[i].unitOnTile != null && Mathf.Abs(_referenceTile.tilesInLineRight[i].height - _referenceTile.height) <= maxHeightDifferenceToAttack)
                {
                    break;
                }
            }
        }

        if (_referenceDirection == FacingDirection.West)
        {
            if (attackRange <= _referenceTile.tilesInLineLeft.Count)
            {
                rangeVSTilesInLineLimitant = attackRange;
            }
            else
            {
                rangeVSTilesInLineLimitant = _referenceTile.tilesInLineLeft.Count;
            }

            for (int i = 0; i < rangeVSTilesInLineLimitant; i++)
            {
                if (!_referenceTile.tilesInLineLeft[i].isEmpty && !_referenceTile.tilesInLineLeft[i].isObstacle && Mathf.Abs(_referenceTile.tilesInLineLeft[i].height - _referenceTile.height) <= maxHeightDifferenceToAttack)
                {
                    currentTilesInRangeForAttack.Add(_referenceTile.tilesInLineLeft[i]);

                    for (int j = 0; j < _referenceTile.tilesInLineLeft[i].GetLateralTilesBasedOnDirection(_referenceDirection, 1).Count; j++)
                    {
                        currentTilesInRangeForAttack.Add(_referenceTile.tilesInLineLeft[i].GetLateralTilesBasedOnDirection(_referenceDirection, 1)[j]);
                    }
                }

                if (_referenceTile.tilesInLineLeft[i].unitOnTile != null && Mathf.Abs(_referenceTile.tilesInLineLeft[i].height - _referenceTile.height) <= maxHeightDifferenceToAttack)
                {
                    break;
                }
            }
        }

        for (int i = 0; i < currentTilesInRangeForAttack.Count; i++)
        {
            currentTilesInRangeForAttack[i].ColorBorderRed();
        }
    }
示例#24
0
    //Pongo público para acceder a la hora de hacer hover
    //ESTA FUNCIÓN NO PUEDE CAMBIAR EL CURRENTSTATE DEL ENEMIGO, se llama fuera del turno enemigo.
    //El referenceTile sirve porque está función la uso también cuando se va a mover para comprobar si va a atacar después de moverse o no.
    public override void CheckCharactersInLine(bool _shouldWarnTilesForBalistaColoring, IndividualTiles _referenceTile)
    {
        if (!isDead)
        {
            if (myCurrentTile == null)
            {
                InitializeUnitOnTile();
                if (_referenceTile == null)
                {
                    _referenceTile = myCurrentTile;
                }
            }

            currentUnitsAvailableToAttack.Clear();
            tilesToShoot.Clear();

            if (currentFacingDirection == FacingDirection.North)
            {
                if (rangeOfAction <= _referenceTile.tilesInLineUp.Count)
                {
                    rangeVSTilesInLineLimitant = rangeOfAction;
                }
                else
                {
                    rangeVSTilesInLineLimitant = _referenceTile.tilesInLineUp.Count;
                }

                for (int i = 0; i < rangeVSTilesInLineLimitant; i++)
                {
                    //Si hay un obstáculo paro de comprobar
                    if (_referenceTile.tilesInLineUp[i].isObstacle || _referenceTile.tilesInLineUp[i] == null)
                    {
                        break;
                    }

                    //Si el tile no es un obstáculo lo añado a la lista de tiles a los que disparar y compruebo si tiene una unidad.
                    else if (!_referenceTile.tilesInLineUp[i].isObstacle)
                    {
                        //Si la diferencia de altura supera la que puede tener el personaje paro de buscar
                        if (i > 0 && Mathf.Abs(_referenceTile.tilesInLineUp[i].height - _referenceTile.tilesInLineUp[i - 1].height) > maxHeightDifferenceToAttack)
                        {
                            break;
                        }

                        tilesToShoot.Add(_referenceTile.tilesInLineUp[i]);

                        if (_referenceTile.tilesInLineUp[i].unitOnTile != null && _referenceTile.tilesInLineUp[i].unitOnTile.GetComponent <PlayerUnit>())
                        {
                            //Almaceno la primera unidad en la lista de posibles unidades.
                            currentUnitsAvailableToAttack.Add(_referenceTile.tilesInLineUp[i].unitOnTile);

                            //Si el personaje es un caballero mi disparo acaba aqui
                            if (_referenceTile.tilesInLineUp[i].unitOnTile.GetComponent <Knight>())
                            {
                                if (_referenceTile.tilesInLineUp[i].unitOnTile.GetComponent <Knight>().currentFacingDirection == FacingDirection.South)
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
            }

            if (currentFacingDirection == FacingDirection.East)
            {
                if (rangeOfAction <= _referenceTile.tilesInLineRight.Count)
                {
                    rangeVSTilesInLineLimitant = rangeOfAction;
                }
                else
                {
                    rangeVSTilesInLineLimitant = _referenceTile.tilesInLineRight.Count;
                }

                for (int i = 0; i < rangeVSTilesInLineLimitant; i++)
                {
                    //Tanto la balista cómo el charger detiene su comprobación si hay un obstáculo
                    if (_referenceTile.tilesInLineRight[i].isObstacle || _referenceTile.tilesInLineRight[i] == null)
                    {
                        break;
                    }

                    else if (!_referenceTile.tilesInLineRight[i].isObstacle)
                    {
                        if (i > 0 && Mathf.Abs(_referenceTile.tilesInLineRight[i].height - _referenceTile.tilesInLineRight[i - 1].height) > maxHeightDifferenceToAttack)
                        {
                            break;
                        }

                        tilesToShoot.Add(_referenceTile.tilesInLineRight[i]);

                        if (_referenceTile.tilesInLineRight[i].unitOnTile != null && _referenceTile.tilesInLineRight[i].unitOnTile.GetComponent <PlayerUnit>())
                        {
                            //Almaceno la primera unidad en la lista de posibles unidades.
                            currentUnitsAvailableToAttack.Add(_referenceTile.tilesInLineRight[i].unitOnTile);

                            //Si el personaje es un caballero mi disparo acaba aqui
                            if (_referenceTile.tilesInLineRight[i].unitOnTile.GetComponent <Knight>())
                            {
                                if (_referenceTile.tilesInLineRight[i].unitOnTile.GetComponent <Knight>().currentFacingDirection == FacingDirection.West)
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
            }

            if (currentFacingDirection == FacingDirection.South)
            {
                if (rangeOfAction <= _referenceTile.tilesInLineDown.Count)
                {
                    rangeVSTilesInLineLimitant = rangeOfAction;
                }
                else
                {
                    rangeVSTilesInLineLimitant = _referenceTile.tilesInLineDown.Count;
                }

                for (int i = 0; i < rangeVSTilesInLineLimitant; i++)
                {
                    if (_referenceTile.tilesInLineDown[i].isObstacle || _referenceTile.tilesInLineDown[i] == null)
                    {
                        break;
                    }

                    else if (!_referenceTile.tilesInLineDown[i].isObstacle)
                    {
                        if (i > 0 && Mathf.Abs(_referenceTile.tilesInLineDown[i].height - _referenceTile.tilesInLineDown[i - 1].height) > maxHeightDifferenceToAttack)
                        {
                            break;
                        }

                        tilesToShoot.Add(_referenceTile.tilesInLineDown[i]);

                        if (_referenceTile.tilesInLineDown[i].unitOnTile != null && _referenceTile.tilesInLineDown[i].unitOnTile.GetComponent <PlayerUnit>())
                        {
                            //Almaceno la primera unidad en la lista de posibles unidades.
                            currentUnitsAvailableToAttack.Add(_referenceTile.tilesInLineDown[i].unitOnTile);

                            //Si el personaje es un caballero mi disparo acaba aqui
                            if (_referenceTile.tilesInLineDown[i].unitOnTile.GetComponent <Knight>())
                            {
                                if (_referenceTile.tilesInLineDown[i].unitOnTile.GetComponent <Knight>().currentFacingDirection == FacingDirection.North)
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
            }

            if (currentFacingDirection == FacingDirection.West)
            {
                if (rangeOfAction <= _referenceTile.tilesInLineLeft.Count)
                {
                    rangeVSTilesInLineLimitant = rangeOfAction;
                }
                else
                {
                    rangeVSTilesInLineLimitant = _referenceTile.tilesInLineLeft.Count;
                }

                for (int i = 0; i < rangeVSTilesInLineLimitant; i++)
                {
                    //Tanto la balista cómo el charger detiene su comprobación si hay un obstáculo
                    if (_referenceTile.tilesInLineLeft[i].isObstacle || _referenceTile.tilesInLineLeft[i] == null)
                    {
                        break;
                    }

                    else if (!_referenceTile.tilesInLineLeft[i].isObstacle)
                    {
                        if (i > 0 && Mathf.Abs(_referenceTile.tilesInLineLeft[i].height - _referenceTile.tilesInLineLeft[i - 1].height) > maxHeightDifferenceToAttack)
                        {
                            break;
                        }

                        tilesToShoot.Add(_referenceTile.tilesInLineLeft[i]);

                        if (_referenceTile.tilesInLineLeft[i].unitOnTile != null && _referenceTile.tilesInLineLeft[i].unitOnTile.GetComponent <PlayerUnit>())
                        {
                            //Almaceno la primera unidad en la lista de posibles unidades.
                            currentUnitsAvailableToAttack.Add(_referenceTile.tilesInLineLeft[i].unitOnTile);

                            //Si el personaje es un caballero mi disparo acaba aqui
                            if (_referenceTile.tilesInLineLeft[i].unitOnTile.GetComponent <Knight>())
                            {
                                if (_referenceTile.tilesInLineLeft[i].unitOnTile.GetComponent <Knight>().currentFacingDirection == FacingDirection.East)
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
            }

            if (_shouldWarnTilesForBalistaColoring)
            {
                //Aviso a los tiles de que tienen que buscar al caballero.
                WarnOrResetTilesToShoot(true);
            }
        }
    }
示例#25
0
    public void CheckUnitToAttack(IndividualTiles _referenceTile, FacingDirection _referenceFacingDirection)
    {
        currentUnitsAvailableToAttack.Clear();
        previousTileHeight = 0;

        if (_referenceTile != null)
        {
            if (currentFacingDirection == FacingDirection.North)
            {
                if (attackRange <= _referenceTile.tilesInLineUp.Count)
                {
                    rangeVSTilesInLineLimitant = attackRange;
                }
                else
                {
                    rangeVSTilesInLineLimitant = _referenceTile.tilesInLineUp.Count;
                }

                for (int i = 0; i < rangeVSTilesInLineLimitant; i++)
                {
                    //Guardo la altura mas alta en esta linea de tiles
                    if (_referenceTile.tilesInLineUp[i].height > previousTileHeight)
                    {
                        previousTileHeight = _referenceTile.tilesInLineUp[i].height;
                    }

                    //Si hay una unidad
                    if (_referenceTile.tilesInLineUp[i].unitOnTile != null && _referenceTile.tilesInLineUp[i].unitOnTile.GetComponent <PlayerUnit>())
                    {
                        //Compruebo que la diferencia de altura con mi tile y con el tile anterior es correcto.
                        if (Mathf.Abs(_referenceTile.tilesInLineUp[i].height - _referenceTile.height) <= maxHeightDifferenceToAttack ||
                            Mathf.Abs(_referenceTile.tilesInLineUp[i].height - previousTileHeight) <= maxHeightDifferenceToAttack)
                        {
                            //Almaceno la primera unidad en la lista de posibles unidades
                            currentUnitsAvailableToAttack.Add(_referenceTile.tilesInLineUp[i].unitOnTile);
                            break;
                        }

                        else
                        {
                            continue;
                        }
                    }
                    else if (_referenceTile.tilesInLineUp[i].unitOnTile != null)
                    {
                        break;
                    }


                    if (_referenceTile.tilesInLineUp[i].isEmpty)
                    {
                        break;
                    }
                }
            }

            if (currentFacingDirection == FacingDirection.South)
            {
                if (attackRange <= _referenceTile.tilesInLineDown.Count)
                {
                    rangeVSTilesInLineLimitant = attackRange;
                }
                else
                {
                    rangeVSTilesInLineLimitant = _referenceTile.tilesInLineDown.Count;
                }

                for (int i = 0; i < rangeVSTilesInLineLimitant; i++)
                {
                    //Guardo la altura mas alta en esta linea de tiles
                    if (_referenceTile.tilesInLineDown[i].height > previousTileHeight)
                    {
                        previousTileHeight = _referenceTile.tilesInLineDown[i].height;
                    }

                    //Si hay una unidad
                    if (_referenceTile.tilesInLineDown[i].unitOnTile != null && _referenceTile.tilesInLineDown[i].unitOnTile.GetComponent <PlayerUnit>())
                    {
                        //Compruebo que la diferencia de altura con mi tile y con el tile anterior es correcto.
                        if (Mathf.Abs(_referenceTile.tilesInLineDown[i].height - _referenceTile.height) <= maxHeightDifferenceToAttack ||
                            Mathf.Abs(_referenceTile.tilesInLineDown[i].height - previousTileHeight) <= maxHeightDifferenceToAttack)
                        {
                            //Almaceno la primera unidad en la lista de posibles unidades
                            currentUnitsAvailableToAttack.Add(_referenceTile.tilesInLineDown[i].unitOnTile);
                            break;
                        }

                        else
                        {
                            continue;
                        }
                    }
                    else if (_referenceTile.tilesInLineDown[i].unitOnTile != null)
                    {
                        break;
                    }

                    if (_referenceTile.tilesInLineDown[i].isEmpty)
                    {
                        break;
                    }
                }
            }

            if (currentFacingDirection == FacingDirection.East)
            {
                if (attackRange <= _referenceTile.tilesInLineRight.Count)
                {
                    rangeVSTilesInLineLimitant = attackRange;
                }
                else
                {
                    rangeVSTilesInLineLimitant = _referenceTile.tilesInLineRight.Count;
                }

                for (int i = 0; i < rangeVSTilesInLineLimitant; i++)
                {
                    //Guardo la altura mas alta en esta linea de tiles
                    if (_referenceTile.tilesInLineRight[i].height > previousTileHeight)
                    {
                        previousTileHeight = _referenceTile.tilesInLineRight[i].height;
                    }

                    //Si hay una unidad
                    if (_referenceTile.tilesInLineRight[i].unitOnTile != null && _referenceTile.tilesInLineRight[i].unitOnTile.GetComponent <PlayerUnit>())
                    {
                        //Compruebo que la diferencia de altura con mi tile y con el tile anterior es correcto.
                        if (Mathf.Abs(_referenceTile.tilesInLineRight[i].height - _referenceTile.height) <= maxHeightDifferenceToAttack ||
                            Mathf.Abs(_referenceTile.tilesInLineRight[i].height - previousTileHeight) <= maxHeightDifferenceToAttack)
                        {
                            //Almaceno la primera unidad en la lista de posibles unidades
                            currentUnitsAvailableToAttack.Add(_referenceTile.tilesInLineRight[i].unitOnTile);
                            break;
                        }

                        else
                        {
                            continue;
                        }
                    }
                    else if (_referenceTile.tilesInLineRight[i].unitOnTile != null)
                    {
                        break;
                    }

                    if (_referenceTile.tilesInLineRight[i].isEmpty)
                    {
                        break;
                    }
                }
            }

            if (currentFacingDirection == FacingDirection.West)
            {
                if (attackRange <= _referenceTile.tilesInLineLeft.Count)
                {
                    rangeVSTilesInLineLimitant = attackRange;
                }
                else
                {
                    rangeVSTilesInLineLimitant = _referenceTile.tilesInLineLeft.Count;
                }

                for (int i = 0; i < rangeVSTilesInLineLimitant; i++)
                {
                    //Guardo la altura mas alta en esta linea de tiles
                    if (_referenceTile.tilesInLineLeft[i].height > previousTileHeight)
                    {
                        previousTileHeight = _referenceTile.tilesInLineLeft[i].height;
                    }

                    //Si hay una unidad
                    if (_referenceTile.tilesInLineLeft[i].unitOnTile != null && _referenceTile.tilesInLineLeft[i].unitOnTile.GetComponent <PlayerUnit>())
                    {
                        //Compruebo que la diferencia de altura con mi tile y con el tile anterior es correcto.
                        if (Mathf.Abs(_referenceTile.tilesInLineLeft[i].height - _referenceTile.height) <= maxHeightDifferenceToAttack ||
                            Mathf.Abs(_referenceTile.tilesInLineLeft[i].height - previousTileHeight) <= maxHeightDifferenceToAttack)
                        {
                            //Almaceno la primera unidad en la lista de posibles unidades
                            currentUnitsAvailableToAttack.Add(_referenceTile.tilesInLineLeft[i].unitOnTile);
                            break;
                        }

                        else
                        {
                            continue;
                        }
                    }
                    else if (_referenceTile.tilesInLineLeft[i].unitOnTile != null)
                    {
                        break;
                    }

                    if (_referenceTile.tilesInLineLeft[i].isEmpty)
                    {
                        break;
                    }
                }
            }

            //Marco las unidades disponibles para atacar de color rojo
            for (int i = 0; i < currentUnitsAvailableToAttack.Count; i++)
            {
                CalculateDamagePreviousAttack(currentUnitsAvailableToAttack[i], GetComponent <UnitBase>(), _referenceTile, _referenceFacingDirection);
                currentUnitsAvailableToAttack[i].ColorAvailableToBeAttackedAndNumberDamage(damageWithMultipliersApplied);
            }
        }
    }
示例#26
0
    //Se llama desde el LevelManager. Al final del showAction se encarga de mostrar el tile al que va a atacar
    public override void ColorAttackTile()
    {
        shadowHoverTile = null;
        tileToUseBetweenShadowOrMine = null;

        //El +2 es porque pathToObjective tiene en cuenta tanto el tile inicial (ocupado por goblin) como el final (ocupado por player)
        if (pathToObjective.Count > 0 && pathToObjective.Count <= movementUds + 2 && myCurrentObjectiveTile != null)
        {
            //Compruebo si tile al que voy a atacar estaba bajo ataque
            base.ColorAttackTile();

            //Esto significa que el enemigo está adyacente del player (son el tile del gigante y el del player vamos)
            if (pathToObjective.Count > 2)
            {
                Debug.DrawRay(new Vector3(sombraHoverUnit.transform.position.x, sombraHoverUnit.transform.position.y + 0.5f, sombraHoverUnit.transform.position.z), transform.TransformDirection(Vector3.down), Color.yellow, 20f);

                if (Physics.Raycast(new Vector3(sombraHoverUnit.transform.position.x, sombraHoverUnit.transform.position.y + 0.5f, sombraHoverUnit.transform.position.z), transform.TransformDirection(Vector3.down), out hit))
                {
                    shadowHoverTile = hit.collider.gameObject.GetComponent <IndividualTiles>();
                }

                tileToUseBetweenShadowOrMine = shadowHoverTile;
            }

            else if (pathToObjective.Count == 2)
            {
                tileToUseBetweenShadowOrMine = myCurrentTile;
            }

            //Pinto tile izq y derecha
            if ((pathToObjective.Count > 2 && myCurrentObjectiveTile != null && shadowHoverTile != null && myCurrentObjectiveTile.tileX == shadowHoverTile.tileX) ||
                pathToObjective.Count == 2 && myCurrentObjectiveTile != null && myCurrentObjectiveTile.tileX == myCurrentTile.tileX)
            {
                //Hago lo mismo con los tiles laterales, los pinto de rojo y los guardo en la lista de bools

                if (myCurrentObjectiveTile.tilesInLineRight.Count > 0 && myCurrentObjectiveTile.tilesInLineRight[0] != null)
                {
                    //Tile lateral der
                    wereTilesAlreadyUnderAttack.Add(myCurrentObjectiveTile.tilesInLineRight[0].isUnderAttack);
                    tilesAlreadyUnderAttack.Add(myCurrentObjectiveTile.tilesInLineRight[0]);
                    myCurrentObjectiveTile.tilesInLineRight[0].ColorAttack();
                }

                if (myCurrentObjectiveTile.tilesInLineLeft.Count > 0 && myCurrentObjectiveTile.tilesInLineLeft[0] != null)
                {
                    //Tile lateral izq
                    wereTilesAlreadyUnderAttack.Add(myCurrentObjectiveTile.tilesInLineLeft[0].isUnderAttack);
                    tilesAlreadyUnderAttack.Add(myCurrentObjectiveTile.tilesInLineLeft[0]);
                    myCurrentObjectiveTile.tilesInLineLeft[0].ColorAttack();
                }
            }

            //O pinto tile arriba y debajo, depende de dirección
            else if ((myCurrentObjectiveTile != null && shadowHoverTile != null) && (pathToObjective.Count > 2 && myCurrentObjectiveTile.tileZ == shadowHoverTile.tileZ || pathToObjective.Count == 2 && myCurrentObjectiveTile.tileZ == myCurrentTile.tileZ))
            {
                if (myCurrentObjectiveTile.tilesInLineUp.Count > 0 && myCurrentObjectiveTile.tilesInLineUp[0] != null)
                {
                    //Tile lateral arriba
                    wereTilesAlreadyUnderAttack.Add(myCurrentObjectiveTile.tilesInLineUp[0].isUnderAttack);
                    tilesAlreadyUnderAttack.Add(myCurrentObjectiveTile.tilesInLineUp[0]);
                    myCurrentObjectiveTile.tilesInLineUp[0].ColorAttack();
                }

                if (myCurrentObjectiveTile.tilesInLineDown.Count > 0 && myCurrentObjectiveTile.tilesInLineDown[0] != null)
                {
                    //Tile lateral abajo
                    wereTilesAlreadyUnderAttack.Add(myCurrentObjectiveTile.tilesInLineDown[0].isUnderAttack);
                    tilesAlreadyUnderAttack.Add(myCurrentObjectiveTile.tilesInLineDown[0]);
                    myCurrentObjectiveTile.tilesInLineDown[0].ColorAttack();
                }
            }
        }
    }