//--------------------------------------- // Action //--------------------------------------- IEnumerator PatrolToNeighborCoroutine() { // Idle for random seconds idleTimer = Random.Range(owner.idleTimeMin, owner.idleTimeMax); while (idleTimer > 0) { //Debug.Log(idleTimer); if (owner.detectState != DetectState.Idle) { break; } idleTimer -= Time.deltaTime; yield return(null); } // Patrol to a random neighbor if (owner.detectState == DetectState.Idle) { List <Tile> neighbors = MazeUTL.GetNeighborTilesWithoutWall(owner.CurrentTile); Tile targetTile = MazeUTL.GetRandomTileFromList(neighbors); owner.TryMoveToTile(targetTile); do { yield return(new WaitForSeconds(0.01f)); } while (owner.CurrentAction == ActionType.Walking); owner.StopWalkingAnim(); } SetActionFinished("PatrolToNeighborCoroutine", true); yield return(null); }
void GenerateStartPoint_Random(Maze maze) { Tile tile = MazeUTL.GetRandomTileFromList(maze.mazeTileList); tile.SpawnTileItem(level.startPointPrefab); level.tileStart = tile; TilesWithItem.Add(tile); }
//--------------------------------------- // Action //--------------------------------------- IEnumerator SearchAlertedTargetCoroutine() { Tile previousTile = owner.CurrentTile; // Smart search till the first intersection or being alerted List <Tile> path = MazeUTL.GetShortestPath(owner.CurrentTile, owner.alertedTarget.CurrentTile, (owner.searchRange)); for (int i = 0; i < path.Count; i++) { previousTile = owner.CurrentTile; owner.TryMoveToTile(path[i]); do { yield return(new WaitForSeconds(0.01f)); } while (owner.CurrentAction == ActionType.Walking); if ((owner.detectState == DetectState.Alerted)) { break; } if (MazeUTL.GetNeighborTilesWithoutWall(owner.CurrentTile).Count >= 3) { break; } } // Random search during Warning state while (owner.detectState == DetectState.Warning) { List <Tile> neighbors = MazeUTL.GetNeighborTilesWithoutWall(owner.CurrentTile); if (neighbors.Count > 1) { neighbors.Remove(previousTile); } previousTile = owner.CurrentTile; owner.TryMoveToTile(MazeUTL.GetRandomTileFromList(neighbors)); do { yield return(new WaitForSeconds(0.01f)); } while (owner.CurrentAction == ActionType.Walking); } owner.StopWalkingAnim(); SetActionFinished("SearchAlertedTargetCoroutine", true); yield return(null); }
void GenerateObjective_Random(Maze maze) { // Make sure the objective is at least half map aways from the start point. Also, make it spawn at C shape wall layout. List <Tile> orgs = new List <Tile>(); orgs.Add(level.tileStart); List <Tile> tileList = MazeUTL.UpdateTileListOutOfRange(maze.mazeTileList, orgs, Formula.CalculateObjectiveLeastDistance(LevelManager.instance.mazeDifficulty)); tileList = MazeUTL.UpdateTileListWithDesiredWallLayout(tileList, WallLayout.C); Tile tile = MazeUTL.GetRandomTileFromList(tileList); tile.SpawnTileItem(level.objectivePrefab); level.tileObjective = tile; TilesWithItem.Add(tile); }
List <Tile> GetItemSpawnRandomTiles(int numItems, int range, List <Tile> tileList, List <Tile> tilesLeft, List <Tile> exclusiveTiles) { if (numItems <= 0) { return(tileList); } tilesLeft = MazeUTL.UpdateTileListOutOfRange(tilesLeft, exclusiveTiles, range); Tile tile = MazeUTL.GetRandomTileFromList(tilesLeft); tileList.Add(tile); List <Tile> newExclusiveTiles = new List <Tile>(); foreach (Tile t in exclusiveTiles) { newExclusiveTiles.Add(t); } newExclusiveTiles.Add(tile); numItems--; return(GetItemSpawnRandomTiles(numItems, range, tileList, tilesLeft, newExclusiveTiles)); }