private void floodFill(GridElement startElement) { Debug.Log("floodfilling"); Debug.DrawRay(startElement.transform.position, new Vector2(0, 1), Color.green); Debug.DrawRay(startElement.transform.position, new Vector2(1, 0), Color.green); Debug.DrawRay(startElement.transform.position, new Vector2(0, -1), Color.green); Debug.DrawRay(startElement.transform.position, new Vector2(-1, 0), Color.green); GridElement wallElement = null; Queue <GridElement> queue = new Queue <GridElement>(); queue.Enqueue(startElement); // add additional fillpoints for special cases foreach (GridElement point in additionalFillPoints) { queue.Enqueue(point); } int count = 0; while (queue.Count != 0) { GridElement element = queue.Dequeue(); if (element.capture(walls)) { count++; foreach (GridElement neighbour in element.getNeighbours()) { queue.Enqueue(neighbour); } } else if (wallElement == null) { if (element.ContainsWall(walls) && !element.iscaptured()) { wallElement = element; } } } // floodfill the wall as well queue.Enqueue(wallElement); while (queue.Count != 0) { GridElement element = queue.Dequeue(); if (element != null && element.captureWall(walls)) { count++; foreach (GridElement neighbour in element.getNeighbours()) { queue.Enqueue(neighbour); } } } additionalFillPoints.Clear(); gridElementsCaptured += count; // Set number of moves before checking level complete, don't check if number of moves exceeded yet nbMoves++; setup.movesText.text = nbMoves + "/" + GameSetup.getLevelManager().getCurrentLevel().nbOfMoves; // check for level complete float percentageCaptured = (gridElementsCaptured * 1.0f) / (setup.numberOfGridElements * 1.0f); if (percentageCaptured > 1) { percentageCaptured = 1; } setup.progress.text = (int)(percentageCaptured * 100) + "/" + (int)(GameSetup.getLevelManager().getCurrentLevel().percentage); if (percentageCaptured * 100 > GameSetup.getLevelManager().getCurrentLevel().percentage) { setup.levelComplete(); return; } // check for almost all moves used if (nbMoves >= GameSetup.getLevelManager().getCurrentLevel().nbOfMoves - 2) { Color color; ColorUtility.TryParseHtmlString("#F1B858", out color); setup.movesText.color = color; setup.movesText.fontStyle = FontStyle.Bold; } // check for maximum number of moves used if (nbMoves == GameSetup.getLevelManager().getCurrentLevel().nbOfMoves) { setup.movesText.color = Color.red; setup.movesText.fontStyle = FontStyle.Bold; setup.gameOver(true); return; } if (GameSetup.debugMode) { Debug.Log("filling " + count + " grid elements"); } }