static void DrawBackground(int level, Raylib_cs.Color bgColor, int score, bool drawScore)
 {
     DrawRectangle(0, screenHeight - 100, screenWidth, 100, bgColor);
     DrawRectangle(40, screenHeight - 150, 200, 50, bgColor);
     DrawRectangle(screenWidth - 240, screenHeight - 150, 200, 50, bgColor);
     DrawRectangle((screenWidth / 2) - 150, screenHeight - 175, 300, 75, bgColor);
     if (drawScore)
     {
         DrawText("Level: " + level.ToString(), 0, 0, 40, YELLOW);
         DrawText(score.ToString(), screenWidth / 2, 0, 40, YELLOW);
     }
 } //draws the rectangles and GUI
        public static int Main()
        {
            InitWindow(screenWidth, screenHeight, "Project");
            HideCursor();
            SetTargetFPS(60);
            bool stillGoing = true;

            Raylib_cs.Color background = new Raylib_cs.Color(200, 40, 0, 255);

            //declaring objects to exist
            PlayerCursor      player      = new PlayerCursor();
            Launcher          launcher1   = new Launcher(10, new Vector2(130, screenHeight - 150));
            Launcher          launcher2   = new Launcher(20, new Vector2(screenWidth / 2 - 10, screenHeight - 175));
            Launcher          launcher3   = new Launcher(10, new Vector2(screenWidth - 150, screenHeight - 150));
            Location          loc1        = new Location(new Vector2(275, screenHeight - 125));
            Location          loc2        = new Location(new Vector2(425, screenHeight - 125));
            Location          loc3        = new Location(new Vector2(575, screenHeight - 125));
            Location          loc4        = new Location(new Vector2(975, screenHeight - 125));
            Location          loc5        = new Location(new Vector2(1125, screenHeight - 125));
            Location          loc6        = new Location(new Vector2(1275, screenHeight - 125));
            List <Projectile> projectiles = new List <Projectile>();
            List <Incoming>   inbound     = new List <Incoming>();
            int   currentLevel            = 1;
            float incomingTime            = 0;
            int   remainingIncoming       = 20;
            float incomingSpeed           = 4;
            int   score           = 0;
            float levelTime       = 0;
            int   redirectCounter = 0;
            float incomingDelay   = 3f;
            bool  inGame          = false;
            bool  displayingScore = false;
            Menu  menu            = Menu.Start;
            int   highScore       = 0;

            if (File.Exists(Environment.CurrentDirectory + @"\highScore.txt"))
            {
                highScore = int.Parse(File.ReadAllText(Environment.CurrentDirectory + @"\highScore.txt"));
            }

            while (!WindowShouldClose() && stillGoing)  // Game loop continues until ESC pressed, window closed, or the boolean becomes false
            {
                List <GameObject> gameObjects = new List <GameObject>();
                {
                    {
                        gameObjects.Add(loc1);
                        gameObjects.Add(loc2);
                        gameObjects.Add(loc3);
                        gameObjects.Add(loc4);
                        gameObjects.Add(loc5);
                        gameObjects.Add(loc6);
                    }
                    foreach (Projectile pro in projectiles)
                    {
                        gameObjects.Add(pro);
                    }
                    foreach (Incoming IN in inbound)
                    {
                        gameObjects.Add(IN);
                    }
                }//fills the list

                BeginDrawing();
                ClearBackground(BLACK);
                DrawBackground(currentLevel, background, score, inGame);

                if (inGame)
                {
                    {
                        loc1.Draw();
                        loc2.Draw();
                        loc3.Draw();
                        loc4.Draw();
                        loc5.Draw();
                        loc6.Draw();
                    }// draws the locations
                    {
                        launcher1.DisplayText();
                        launcher2.DisplayText();
                        launcher3.DisplayText();
                    }//displays remaining projectiles on the launchers
                    for (int i = 0; i < projectiles.Count; i++)
                    {
                        if (!projectiles[i].active)
                        {
                            projectiles.RemoveAt(i);
                        }
                    }//removes projectiles no longer active
                    {
                        if (!(loc1.destroyed && loc2.destroyed && loc3.destroyed && loc4.destroyed && loc5.destroyed && loc6.destroyed))
                        {
                            if (IsKeyPressed(Raylib_cs.KeyboardKey.KEY_ONE) && launcher1.remaining > 0)
                            {
                                projectiles.Add(new Projectile(launcher1.speed, launcher1.pos, GetMousePosition()));
                                launcher1.remaining--;
                            }
                            if (IsKeyPressed(Raylib_cs.KeyboardKey.KEY_TWO) && launcher2.remaining > 0)
                            {
                                projectiles.Add(new Projectile(launcher2.speed, launcher2.pos, GetMousePosition()));
                                launcher2.remaining--;
                            }
                            if (IsKeyPressed(Raylib_cs.KeyboardKey.KEY_THREE) && launcher3.remaining > 0)
                            {
                                projectiles.Add(new Projectile(launcher3.speed, launcher3.pos, GetMousePosition()));
                                launcher3.remaining--;
                            }
                        }
                    }// spawns projectiles on key press

                    foreach (GameObject g in gameObjects)
                    {
                        g.Update();
                        g.Draw();
                    }//draws and updates the list

                    for (int i = 0; i < inbound.Count; i++)
                    {
                        bool cont = false;
                        foreach (Projectile pro in projectiles)
                        {
                            if (pro.exploding && Vector2.Distance(inbound[i].pos, pro.pos) < 50)
                            {
                                inbound.RemoveAt(i);
                                score += 10;
                                cont   = true;
                                Console.Beep(180, 75);
                            }
                        }
                        if (cont)
                        {
                            continue;
                        }

                        if (inbound[i].pos.Y > screenHeight - 125)
                        {
                            if (!inbound[i].redirected)
                            {
                                switch (inbound[i].target.X)
                                {
                                case 300:
                                    loc1.Destroy();
                                    inbound.RemoveAt(i);
                                    break;

                                case 450:
                                    loc2.Destroy();
                                    inbound.RemoveAt(i);
                                    break;

                                case 600:
                                    loc3.Destroy();
                                    inbound.RemoveAt(i);
                                    break;

                                case 1000:
                                    loc4.Destroy();
                                    inbound.RemoveAt(i);
                                    break;

                                case 1150:
                                    loc5.Destroy();
                                    inbound.RemoveAt(i);
                                    break;

                                case 1300:
                                    loc6.Destroy();
                                    inbound.RemoveAt(i);
                                    break;
                                }
                            }
                            else
                            {
                                switch (inbound[i].actualTarget.X)
                                {
                                case 300:
                                    loc1.Destroy();
                                    inbound.RemoveAt(i);
                                    break;

                                case 450:
                                    loc2.Destroy();
                                    inbound.RemoveAt(i);
                                    break;

                                case 600:
                                    loc3.Destroy();
                                    inbound.RemoveAt(i);
                                    break;

                                case 1000:
                                    loc4.Destroy();
                                    inbound.RemoveAt(i);
                                    break;

                                case 1150:
                                    loc5.Destroy();
                                    inbound.RemoveAt(i);
                                    break;

                                case 1300:
                                    loc6.Destroy();
                                    inbound.RemoveAt(i);
                                    break;
                                }
                            }
                        }
                    }//checks if incomings are landed or intercepted

                    incomingTime += GetFrameTime();
                    if (incomingTime > incomingDelay)
                    {
                        Random random          = new Random();
                        int    incomingTarget  = random.Next(1, 7);
                        int    incomingTarget2 = random.Next(1, 7);


                        bool validTarget  = false;
                        bool validTarget2 = false;

                        if (!(loc1.destroyed && loc2.destroyed && loc3.destroyed && loc4.destroyed && loc5.destroyed && loc6.destroyed) && remainingIncoming > 0)
                        {
                            if (redirectCounter < 100)
                            {
                                while (!validTarget)
                                {
                                    switch (incomingTarget)
                                    {
                                    case 1:
                                        if (!loc1.destroyed)
                                        {
                                            inbound.Add(new Incoming(incomingSpeed, loc1.pos + new Vector2(25, 0)));
                                            validTarget = true;
                                        }
                                        break;

                                    case 2:
                                        if (!loc2.destroyed)
                                        {
                                            inbound.Add(new Incoming(incomingSpeed, loc2.pos + new Vector2(25, 0)));
                                            validTarget = true;
                                        }
                                        break;

                                    case 3:
                                        if (!loc3.destroyed)
                                        {
                                            inbound.Add(new Incoming(incomingSpeed, loc3.pos + new Vector2(25, 0)));
                                            validTarget = true;
                                        }
                                        break;

                                    case 4:
                                        if (!loc4.destroyed)
                                        {
                                            inbound.Add(new Incoming(incomingSpeed, loc4.pos + new Vector2(25, 0)));
                                            validTarget = true;
                                        }
                                        break;

                                    case 5:
                                        if (!loc5.destroyed)
                                        {
                                            inbound.Add(new Incoming(incomingSpeed, loc5.pos + new Vector2(25, 0)));
                                            validTarget = true;
                                        }
                                        break;

                                    case 6:
                                        if (!loc6.destroyed)
                                        {
                                            inbound.Add(new Incoming(incomingSpeed, loc6.pos + new Vector2(25, 0)));
                                            validTarget = true;
                                        }
                                        break;
                                    }//decides where each Incoming is pointed
                                    incomingTarget = random.Next(1, 7);
                                }
                                incomingTime = 0;
                                remainingIncoming--;
                                Console.Beep(90, 75);
                                redirectCounter += currentLevel * 2;
                            }
                            else
                            {
                                Vector2 vect1 = new Vector2(0, 0);
                                Vector2 vect2 = new Vector2(0, 0);
                                while (!validTarget)
                                {
                                    switch (incomingTarget)
                                    {
                                    case 1:
                                        if (!loc1.destroyed)
                                        {
                                            vect1       = loc1.pos + new Vector2(25, 0);
                                            validTarget = true;
                                        }
                                        break;

                                    case 2:
                                        if (!loc2.destroyed)
                                        {
                                            vect1       = loc2.pos + new Vector2(25, 0);
                                            validTarget = true;
                                        }
                                        break;

                                    case 3:
                                        if (!loc3.destroyed)
                                        {
                                            vect1       = loc3.pos + new Vector2(25, 0);
                                            validTarget = true;
                                        }
                                        break;

                                    case 4:
                                        if (!loc4.destroyed)
                                        {
                                            vect1       = loc4.pos + new Vector2(25, 0);
                                            validTarget = true;
                                        }
                                        break;

                                    case 5:
                                        if (!loc5.destroyed)
                                        {
                                            vect1       = loc5.pos + new Vector2(25, 0);
                                            validTarget = true;
                                        }
                                        break;

                                    case 6:
                                        if (!loc6.destroyed)
                                        {
                                            vect1       = loc5.pos + new Vector2(25, 0);
                                            validTarget = true;
                                        }
                                        break;
                                    }
                                    incomingTarget = random.Next(1, 7);
                                }
                                while (!validTarget2)
                                {
                                    switch (incomingTarget2)
                                    {
                                    case 1:
                                        if (!loc1.destroyed)
                                        {
                                            vect2        = loc1.pos + new Vector2(25, 0);
                                            validTarget2 = true;
                                        }
                                        break;

                                    case 2:
                                        if (!loc2.destroyed)
                                        {
                                            vect2        = loc2.pos + new Vector2(25, 0);
                                            validTarget2 = true;
                                        }
                                        break;

                                    case 3:
                                        if (!loc3.destroyed)
                                        {
                                            vect2        = loc3.pos + new Vector2(25, 0);
                                            validTarget2 = true;
                                        }
                                        break;

                                    case 4:
                                        if (!loc4.destroyed)
                                        {
                                            vect2        = loc4.pos + new Vector2(25, 0);
                                            validTarget2 = true;
                                        }
                                        break;

                                    case 5:
                                        if (!loc5.destroyed)
                                        {
                                            vect2        = loc5.pos + new Vector2(25, 0);
                                            validTarget2 = true;
                                        }
                                        break;

                                    case 6:
                                        if (!loc6.destroyed)
                                        {
                                            vect2        = loc5.pos + new Vector2(25, 0);
                                            validTarget2 = true;
                                        }
                                        break;
                                    }
                                    incomingTarget2 = random.Next(1, 7);
                                }
                                inbound.Add(new Incoming(incomingSpeed, vect1, vect2));
                                incomingTime = 0;
                                remainingIncoming--;
                                Console.Beep(90, 75);
                                redirectCounter = 0;
                            }
                        }
                        else if (!(loc1.destroyed && loc2.destroyed && loc3.destroyed && loc4.destroyed && loc5.destroyed && loc6.destroyed) && remainingIncoming == 0)
                        {
                            levelTime += GetFrameTime();
                            if (levelTime > 3)
                            {
                                currentLevel++;

                                score += 5 * launcher1.remaining;
                                score += 5 * launcher3.remaining;
                                score += 10 * launcher2.remaining;
                                if (!loc1.destroyed)
                                {
                                    score += 15;
                                }
                                if (!loc2.destroyed)
                                {
                                    score += 15;
                                }
                                if (!loc3.destroyed)
                                {
                                    score += 15;
                                }
                                if (!loc4.destroyed)
                                {
                                    score += 15;
                                }
                                if (!loc5.destroyed)
                                {
                                    score += 15;
                                }
                                if (!loc6.destroyed)
                                {
                                    score += 15;
                                }


                                launcher1.remaining = 10;
                                launcher2.remaining = 10;
                                launcher3.remaining = 10;
                                loc1.destroyed      = false;
                                loc2.destroyed      = false;
                                loc3.destroyed      = false;
                                loc4.destroyed      = false;
                                loc5.destroyed      = false;
                                loc6.destroyed      = false;
                                incomingSpeed      *= 1.05f;
                                if (incomingSpeed > 20f)
                                {
                                    incomingSpeed = 20f;
                                }
                                incomingDelay *= 0.95f;
                                if (incomingDelay < 0.25f)
                                {
                                    incomingDelay = 0.25f;
                                }
                                background        = new Raylib_cs.Color(random.Next(0, 255), random.Next(0, 255), random.Next(0, 255), 255);
                                incomingTime      = 0;
                                remainingIncoming = 20;
                                levelTime         = 0;

                                for (int i = 5; i < 51; i += 5)
                                {
                                    if (currentLevel > i)
                                    {
                                        remainingIncoming++;
                                    }
                                }

                                if (currentLevel > 50)
                                {
                                    int additionalIncoming = currentLevel - 50;

                                    launcher1.remaining += additionalIncoming;
                                    launcher3.remaining += additionalIncoming;
                                    remainingIncoming   += remainingIncoming * 2;
                                }
                            }
                        } //advancing levels
                    }     //generates Incomings, ends level if the allotted number have been spawned

                    if (loc1.destroyed && loc2.destroyed && loc3.destroyed && loc4.destroyed && loc5.destroyed && loc6.destroyed)
                    {
                        DrawText("GAME END", (screenWidth / 2) - 500, (screenHeight / 2) - 100, 200, new Raylib_cs.Color(100, 0, 0, 255));
                        if (IsKeyPressed(Raylib_cs.KeyboardKey.KEY_ENTER))
                        {
                            if (highScore < score)
                            {
                                highScore = score;
                                File.WriteAllText(Environment.CurrentDirectory + @"\highScore.txt", highScore.ToString());
                            }
                            inGame = false;
                        }
                    }//the game over screen
                }
                else
                {
                    DrawTitle(menu, displayingScore, highScore);
                    if (IsKeyPressed(Raylib_cs.KeyboardKey.KEY_ENTER))
                    {
                        switch (menu)
                        {
                        case Menu.Start:
                        {
                            inGame            = true;
                            currentLevel      = 1;
                            incomingTime      = 0;
                            remainingIncoming = 20;
                            incomingSpeed     = 4;
                            score             = 0;
                            levelTime         = 0;
                            redirectCounter   = 0;
                            incomingDelay     = 3f;
                            loc1.destroyed    = false;
                            loc2.destroyed    = false;
                            loc3.destroyed    = false;
                            loc4.destroyed    = false;
                            loc5.destroyed    = false;
                            loc6.destroyed    = false;
                        }
                        break;

                        case Menu.Quit:
                            stillGoing = false;
                            break;

                        case Menu.Score:
                            displayingScore = !displayingScore;
                            break;
                        }
                    }
                    if (!displayingScore)
                    {
                        if (IsKeyPressed(Raylib_cs.KeyboardKey.KEY_UP))
                        {
                            switch (menu)
                            {
                            case Menu.Start:
                                menu = Menu.Score;
                                break;

                            case Menu.Quit:
                                menu = Menu.Start;
                                break;

                            case Menu.Score:
                                menu = Menu.Quit;
                                break;
                            }
                        }
                        if (IsKeyPressed(Raylib_cs.KeyboardKey.KEY_DOWN))
                        {
                            switch (menu)
                            {
                            case Menu.Start:
                                menu = Menu.Quit;
                                break;

                            case Menu.Quit:
                                menu = Menu.Score;
                                break;

                            case Menu.Score:
                                menu = Menu.Start;
                                break;
                            }
                        }
                    }
                }//game hasn't started yet


                player.Update();
                player.Draw();

                EndDrawing();
            }
            CloseWindow();

            return(0);
        }