Exemple #1
0
    public List <Vector3> GetPath(Vector2 start, Vector2 end)
    {
        Vector3Int     startCell = tilemap.WorldToCell(new Vector3(start.x, start.y, 0));
        Vector3Int     endCell   = tilemap.WorldToCell(new Vector3(end.x, end.y, 0));
        List <Spot>    pathTiles = astar.CreatePath(spots, new Vector2Int(startCell.x, startCell.y), new Vector2Int(endCell.x, endCell.y), 1000);
        List <Vector3> path      = new List <Vector3>();

        for (int i = 0; i < pathTiles.Count; i++)
        {
            path.Add(tilemap.CellToWorld(new Vector3Int(
                                             pathTiles[pathTiles.Count - 1 - i].X,
                                             pathTiles[pathTiles.Count - 1 - i].Y
                                             , 0)) + tilemap.transform.localScale / 2.0f);
        }
        return(path);
    }
Exemple #2
0
    /**
     * Donne les cases les plus proches du joueur vers lesquelles il peut se déplacer
     * Update aussi la liste des tiles accessibles directement, qu'il y ait ennemis ou non (pour dévoiler les cases dans FogMgr par exemple)
     */
    public void UpdateAccessibleTilesList()
    {
        Vector3Int supposedPlayerCellPos = PlayerManager.Instance.supposedPos;                                     //Position du player en format cell

        nearestTilesList.Clear();                                                                                  //Clear la liste de tiles avant de placer les nouvelles
        nearestTilesList.Add(new Vector3Int(supposedPlayerCellPos.x + nbTilesToMove, supposedPlayerCellPos.y, 0)); //Ajoute les 4 cases voisines
        nearestTilesList.Add(new Vector3Int(supposedPlayerCellPos.x - nbTilesToMove, supposedPlayerCellPos.y, 0));
        nearestTilesList.Add(new Vector3Int(supposedPlayerCellPos.x, supposedPlayerCellPos.y + nbTilesToMove, 0));
        nearestTilesList.Add(new Vector3Int(supposedPlayerCellPos.x, supposedPlayerCellPos.y - nbTilesToMove, 0));

        accessibleTiles.Clear();
        showableTilesList.Clear();

        Vector3Int currentCellPos = PlayerManager.Instance.GetPlayerCellPosition();

        if (null != tilesList)
        {
            //On regarde si les cases proches sont walkable, si non : on les retire de la liste
            List <Vector3Int> tempNearTilesList = new List <Vector3Int>();
            foreach (Vector3Int tile in nearestTilesList)
            {
                if (tilesList.Contains(tile))
                {
                    tempNearTilesList.Add(tile);
                }
            }
            nearestTilesList = tempNearTilesList;


            //Si le chemin vers les rooms proches est direct, dans ce cas on met la tile dans la liste des accessibles
            foreach (Vector3Int tile in nearestTilesList)
            {
                //Roadpath partant du centre de la room, qu'il y ait un ennemi ou pas, pour calculer les tiles accessibles, et qu'il n'y ait pas de décalage si le player n'est pas au centre de la room
                roadPath = astar.CreatePath(spots, new Vector2Int(supposedPlayerCellPos.x, supposedPlayerCellPos.y), new Vector2Int(tile.x, tile.y), 100);

                //Si le chemin est direct (moins de 5 tiles pour y accéder)
                if (roadPath.Count < 5)
                {
                    accessibleTiles.Add(tile);
                    showableTilesList.Add(tile);
                }
            }


            //On retire maintenant les tiles où il y a un ennemi si on souhaite le prendre en compte (carte move autre que swift, etc...)
            List <Vector3Int> tilesToRemove = new List <Vector3Int>();
            foreach (Vector3Int tile in accessibleTiles)
            {
                //Roadpath partant de la tile actuelle du player, dans le cas où il n'est pas au centre de la room, va permettre de regarder si l'ennemi est sur le path
                tempRoadPath = astar.CreatePath(spots, new Vector2Int(currentCellPos.x, currentCellPos.y), new Vector2Int(tile.x, tile.y), 100);

                bool isEnemyOnPath = false;

                //On check en plus si on a un ennemi sur le chemin
                foreach (Spot _tile in tempRoadPath)
                {
                    //Si un ennemi est sur une tile du roadPath
                    if (null != EnemyManager.Instance.GetEnemyViewByPosition(new Vector3Int(_tile.X, _tile.Y, 0)))
                    {
                        //Si cet ennemi est dans la room
                        if (EnemyManager.Instance.GetEnemyViewByPosition(new Vector3Int(_tile.X, _tile.Y, 0)).enemyData.inPlayersRoom)
                        {
                            isEnemyOnPath = true;
                        }
                    }
                }

                if (isEnemyOnPath && (PlayerManager.Instance.GetCardEffectData()[0].rolling || PlayerManager.Instance.GetCardEffectData()[0].noBrakes))
                {
                    //Remove la tile des accessibles
                    tilesToRemove.Add(tile);
                }
            }

            if (tilesToRemove.Count > 0)
            {
                foreach (Vector3Int tile in tilesToRemove)
                {
                    if (accessibleTiles.Contains(tile))
                    {
                        Debug.Log("Tile removed");
                        accessibleTiles.Remove(tile);
                    }
                }
            }
        }
        else
        {
            Debug.Log("TilesList is null !");
        }
    }
Exemple #3
0
    /**
     * Update 2 lists :
     * * accessibles Tiles where the player can move
     * * showable Tiles where you can remove fog for example
     */
    public void UpdateAccessibleNodesList()
    {
        //Player node position
        Vector3Int supposedPlayerNodePos = PlayerMgr.Instance.GetNodePosOfPlayer();
        Vector3Int supposedPlayerTilePos = PlayerMgr.Instance.GetTilePosOfPlayer();
        Node       currentNode           = GetNodeFromPos(supposedPlayerNodePos).GetComponent <NodeScript>().node;

        //Clear the list to get new ones
        nearestNodesList.Clear();

        switch (currentNode.roadType)
        {
        case RoadType.Cross:
            //Add the RIGHT node
            if (supposedPlayerNodePos.x + nodeWidth < map.mapSize.x * 3)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x + nodeWidth, 0, supposedPlayerNodePos.z)));
            }
            //Add the LEFT node
            if (supposedPlayerNodePos.x - nodeWidth >= 0)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x - nodeWidth, 0, supposedPlayerNodePos.z)));
            }
            //Add the TOP node
            if (supposedPlayerNodePos.z + nodeWidth < map.mapSize.y * 3)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z + nodeWidth)));
            }
            //Add the DOWN node
            if (supposedPlayerNodePos.z - nodeWidth >= 0)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z - nodeWidth)));
            }
            break;

        case RoadType.Horizontal:
            //Add the RIGHT node
            if (supposedPlayerNodePos.x + nodeWidth < map.mapSize.x * 3)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x + nodeWidth, 0, supposedPlayerNodePos.z)));
            }
            //Add the LEFT node
            if (supposedPlayerNodePos.x - nodeWidth >= 0)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x - nodeWidth, 0, supposedPlayerNodePos.z)));
            }
            break;

        case RoadType.Vertical:
            //Add the TOP node
            if (supposedPlayerNodePos.z + nodeWidth < map.mapSize.y * 3)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z + nodeWidth)));
            }
            //Add the DOWN node
            if (supposedPlayerNodePos.z - nodeWidth >= 0)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z - nodeWidth)));
            }
            break;

        case RoadType.TurnUpRight:
            //Add the TOP node
            if (supposedPlayerNodePos.z + nodeWidth < map.mapSize.y * 3)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z + nodeWidth)));
            }
            //Add the RIGHT node
            if (supposedPlayerNodePos.x + nodeWidth < map.mapSize.x * 3)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x + nodeWidth, 0, supposedPlayerNodePos.z)));
            }
            break;

        case RoadType.TurnUpLeft:
            //Add the TOP node
            if (supposedPlayerNodePos.z + nodeWidth < map.mapSize.y * 3)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z + nodeWidth)));
            }
            // Add the LEFT node
            if (supposedPlayerNodePos.x - nodeWidth >= 0)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x - nodeWidth, 0, supposedPlayerNodePos.z)));
            }
            break;

        case RoadType.TurnDownRight:
            //Add the RIGHT node
            if (supposedPlayerNodePos.x + nodeWidth < map.mapSize.x * 3)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x + nodeWidth, 0, supposedPlayerNodePos.z)));
            }
            //Add the DOWN node
            if (supposedPlayerNodePos.z - nodeWidth >= 0)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z - nodeWidth)));
            }
            break;

        case RoadType.TurnDownLeft:
            // Add the LEFT node
            if (supposedPlayerNodePos.x - nodeWidth >= 0)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x - nodeWidth, 0, supposedPlayerNodePos.z)));
            }
            //Add the DOWN node
            if (supposedPlayerNodePos.z - nodeWidth >= 0)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z - nodeWidth)));
            }
            break;

        case RoadType.TRight:
            //Add the TOP node
            if (supposedPlayerNodePos.z + nodeWidth < map.mapSize.y * 3)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z + nodeWidth)));
            }
            //Add the DOWN node
            if (supposedPlayerNodePos.z - nodeWidth >= 0)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z - nodeWidth)));
            }
            //Add the RIGHT node
            if (supposedPlayerNodePos.x + nodeWidth < map.mapSize.x * 3)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x + nodeWidth, 0, supposedPlayerNodePos.z)));
            }
            break;

        case RoadType.TLeft:
            //Add the TOP node
            if (supposedPlayerNodePos.z + nodeWidth < map.mapSize.y * 3)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z + nodeWidth)));
            }
            //Add the DOWN node
            if (supposedPlayerNodePos.z - nodeWidth >= 0)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z - nodeWidth)));
            }
            // Add the LEFT node
            if (supposedPlayerNodePos.x - nodeWidth >= 0)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x - nodeWidth, 0, supposedPlayerNodePos.z)));
            }
            break;

        case RoadType.TUp:
            //Add the RIGHT node
            if (supposedPlayerNodePos.x + nodeWidth < map.mapSize.x * 3)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x + nodeWidth, 0, supposedPlayerNodePos.z)));
            }
            //Add the LEFT node
            if (supposedPlayerNodePos.x - nodeWidth >= 0)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x - nodeWidth, 0, supposedPlayerNodePos.z)));
            }
            //Add the TOP node
            if (supposedPlayerNodePos.z + nodeWidth < map.mapSize.y * 3)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z + nodeWidth)));
            }
            break;

        case RoadType.TDown:
            //Add the RIGHT node
            if (supposedPlayerNodePos.x + nodeWidth < map.mapSize.x * 3)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x + nodeWidth, 0, supposedPlayerNodePos.z)));
            }
            //Add the LEFT node
            if (supposedPlayerNodePos.x - nodeWidth >= 0)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x - nodeWidth, 0, supposedPlayerNodePos.z)));
            }
            //Add the DOWN node
            if (supposedPlayerNodePos.z - nodeWidth >= 0)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z - nodeWidth)));
            }
            break;

        case RoadType.DeadendRight:
            //Add the RIGHT node
            if (supposedPlayerNodePos.x + nodeWidth < map.mapSize.x * 3)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x + nodeWidth, 0, supposedPlayerNodePos.z)));
            }
            break;

        case RoadType.DeadendLeft:
            //Add the LEFT node
            if (supposedPlayerNodePos.x - nodeWidth >= 0)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x - nodeWidth, 0, supposedPlayerNodePos.z)));
            }
            break;

        case RoadType.DeadendUp:
            //Add the TOP node
            if (supposedPlayerNodePos.z + nodeWidth < map.mapSize.y * 3)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z + nodeWidth)));
            }
            break;

        case RoadType.DeadendDown:
            //Add the DOWN node
            if (supposedPlayerNodePos.z - nodeWidth >= 0)
            {
                nearestNodesList.Add(GetNodeFromPos(new Vector3Int(supposedPlayerNodePos.x, 0, supposedPlayerNodePos.z - nodeWidth)));
            }
            break;
        }


        //Clear the two lists
        accessibleNodes.Clear();
        showableTilesList.Clear();

        //Update card datas to know if it's a swift move card


        if (null != tilesMap)
        {
            //If the path to nearest nodes is direct, add them to accessibles nodes
            foreach (Transform node in nearestNodesList)
            {
                //Get the middle tile of node
                Vector3Int targetTile = new Vector3Int((int)node.position.x + 1, (int)node.position.y, (int)node.position.z + 1);

                //Roadpath starting from the center of the node, with enemy on path or not, to calculate accessible tiles, and to not have an offset if the player is not in the center of the node
                roadPath = astar.CreatePath(grid, new Vector2Int(supposedPlayerTilePos.x, supposedPlayerTilePos.z),
                                            new Vector2Int(targetTile.x, targetTile.z), 100);

                //If the path is direct (less than 5 tiles)
                if (roadPath != null && roadPath.Count <= 5)
                {
                    bool enemyOnPath = false;

                    // Check if an enemy is on path, but not on the last tile, because we can go on a node with an enemy on it
                    foreach (Spot tile in roadPath)
                    {
                        //If there is an enemy on path
                        if (EnemyMgr.Instance.GetEnemyByPosition(new Vector3Int(tile.X, 0, tile.Y)))
                        {
                            if (EnemyMgr.Instance.GetEnemyByPosition(new Vector3Int(tile.X, 0, tile.Y)).enemyData.inPlayersNode)
                            {
                                enemyOnPath = true;
                            }
                        }
                    }

                    if (!enemyOnPath || ignoreEnemies)
                    {
                        accessibleNodes.Add(node);
                    }
                }
            }
        }
    }
Exemple #4
0
        public void MoveToPlayer()
        {
            tilesList = new List <Spot>();

            //position d'arrivée (player) en format cellule
            Vector3    playerPos     = player.transform.position;
            Vector3Int playerCellPos = walkableTilemap.WorldToCell(playerPos);

            //Si l'ennemi n'est pas dans la room du player
            if (!enemyData.inPlayersRoom && !enemyData.inOtherEnemyRoom)
            {
                tileIndex = 0;

                //Position cellule de l'enemy
                Vector3Int enemyPos = walkableTilemap.WorldToCell(transform.position);

                if (roadPath != null && roadPath.Count > 0) //reset le roadpath
                {
                    roadPath.Clear();
                }

                //création du path, prenant en paramètre la position des tiles, le point de départ, le point d'arrivée, et la longueur en tiles du path -> dépend de l'ennemi
                //roadPath est une liste de spots = une liste de positions de tiles
                roadPath = astar.CreatePath(walkableTilesArray, new Vector2Int(enemyPos.x, enemyPos.y), new Vector2Int(playerCellPos.x, playerCellPos.y), nbTilesPerMove * enemyData.nbMoves);

                if (roadPath == null)
                {
                    return;
                }

                //On ajoute les tiles à parcourir dans une liste, en vérifiant si le joueur est sur le path
                foreach (Spot tile in roadPath)
                {
                    bool isPlayerOnPath     = false;
                    bool isOtherEnemyOnPath = false;

                    //on ajoute les tiles par lesquelles il va devoir passer sauf celle où il y a le player ou un autre ennemi
                    if (playerCellPos.x == tile.X && playerCellPos.y == tile.Y)
                    {
                        isPlayerOnPath          = true;
                        enemyData.inPlayersRoom = true; //L'ennemi sera présent dans la room
                    }

                    //On regarde si on a un autre ennemi sur le path parmis tous les ennemis existants
                    foreach (EnemyView enemy in EnemyManager.Instance.GetAllEnemies())
                    {
                        //Position cellule de l'ennemi
                        Vector3Int _enemyCellPos = walkableTilemap.WorldToCell(enemy.transform.position);

                        //On check seulement les ennemis autres que celui qu'on veut bouger (qui porte ce script)
                        if (enemy != this)
                        {
                            //Si l'ennemi est sur une tile
                            if (_enemyCellPos.x == tile.X && _enemyCellPos.y == tile.Y)
                            {
                                isOtherEnemyOnPath         = true;
                                enemyData.inOtherEnemyRoom = true; //L'ennemi sera présent dans la room
                                //Debug.Log("L'ennemi " + this.name + " a un ennemi sur sa route : " + enemy.name);
                            }
                        }
                    }

                    if (!isPlayerOnPath && !isOtherEnemyOnPath)
                    {
                        tilesList.Add(tile);
                    }

                    tileIndex++;
                }

                enemiesInRoom.Clear();  //Clear la liste d'ennemis présents dans la future room

                Vector3    targetTilePos = TilesManager.Instance.walkableTilemap.CellToWorld(new Vector3Int(roadPath[0].X, roadPath[0].Y, 0));
                Vector3Int targetRoom    = TilesManager.Instance.roomTilemap.WorldToCell(targetTilePos); //Récup la room future en prenant la position de la tile la plus éloignée du path

                foreach (EnemyView enemy in EnemyManager.Instance.GetAllEnemies())                       //Pour chaque ennemi de la map
                {
                    if (enemy != this)                                                                   //Si c'est un autre que celui actuel
                    {
                        if (enemy.GetRoomPosition() == targetRoom)                                       //On check si l'autre ennemi est dans la future room
                        {
                            enemiesInRoom.Add(enemy);                                                    //On ajoute donc l'ennemi dans la liste
                        }
                    }
                }

                tilesList.Reverse(); //on inverse la liste pour la parcourir de la tile la plus proche à la plus éloignée
                tilesList.RemoveAt(0);

                Vector3Int enemyCellPos = TilesManager.Instance.walkableTilemap.WorldToCell(this.transform.position);


                //On update le sprite du player en fonction de sa direction
                if (tilesList[0].Y > enemyCellPos.y)
                {
                    UpdateEnemySprite("haut_gauche");
                }
                else if (tilesList[0].X > enemyCellPos.x)
                {
                    UpdateEnemySprite("haut_droite");
                }
                else if (tilesList[0].X < enemyCellPos.x)
                {
                    UpdateEnemySprite("bas_gauche");
                }
                else if (tilesList[0].Y < enemyCellPos.y)
                {
                    UpdateEnemySprite("bas_droite");
                }

                //Affiche les coordonnées de tiles des paths que l'ennemi doit parcourir

                /*foreach(Spot spot in tilesList)
                 * {
                 *  Debug.Log(spot.X + " / " + spot.Y);
                 * }*/
            }

            tileIndex      = 0;
            canMove        = true;  //On autorise le mouvement lancé par l'Update
            isMoveFinished = false; //Le bool retournera false tant que le mouvement n'est pas fini

            //SFX enemy move
            MusicManager.Instance.PlayEnemyMoving();
        }