public RandomProjectile GenerateProjectile(int x, int y, int size, Color co)
        {
            Color c = (co.Equals(Color.Transparent)) ? new Color(rand.Next(0, 256),
                                                                 rand.Next(0, 256), rand.Next(0, 256)) : co;
            RandomProjectile rp = new RandomProjectile(blank, new Rectangle(x, y, size, size), 10000)
            {
                Speed    = 3.5f,
                Rotation = (float)(rand.NextDouble() * Math.PI),
                Color    = c,
            };

            return(rp);
        }
        public void SpawnRandom(int safeDistance)
        {
            int size = 5 + rand.Next(5, 12);
            int x    = rand.Next(-size, game.Width + size);
            int y    = rand.Next(-size, game.Height + size);

            while (Vector2.Distance(player.Position, new Vector2(x, y)) <= safeDistance)
            {
                x = rand.Next(-size, game.Width + size);
                y = rand.Next(-size, game.Height + size);
            }
            RandomProjectile rp = new RandomProjectile(blank, new Rectangle(x, y, size, size), 10000)
            {
                Speed    = 2.5f,
                Rotation = (float)(rand.NextDouble() * Math.PI * 2),
                Color    = new Color(rand.Next(0, 256), rand.Next(0, 256), rand.Next(0, 256))
            };

            projectiles.Add(rp);
        }
        public override void Update(GameTime gameTime)
        {
            timer       += gameTime.ElapsedGameTime.TotalMilliseconds;
            rSpawnTimer += gameTime.ElapsedGameTime.TotalMilliseconds;
            spawnTimer  += gameTime.ElapsedGameTime.TotalMilliseconds;
            float dt = (float)gameTime.ElapsedGameTime.TotalMilliseconds;
            float dv = 0.0004f;

            water.Update(gameTime);
            Tile.Update(gameTime);
            player.Update(gameTime);
            float bossFightTimer = (float)(timer - (124000 + 4 / dv + 64));

            if (player.Health <= 0)
            {
                GameManager.GetInstance().ChangeScreen(ScreenState.MENU);
            }

            int t = (int)(2 / dv + 16);
            int rSpawnTimerThresh = (state.Equals(MinigameState.BOSS)) ? 300 : 200;

            if (timer > 8000 && rSpawnTimer > rSpawnTimerThresh && boss.Health > 0)
            {
                rSpawnTimer = 0;
                if (!state.Equals(MinigameState.BOSS))
                {
                    SpawnRandom(350);
                }
                Color            c  = (state.Equals(MinigameState.BOSS)) ? Color.Red : Color.Transparent;
                RandomProjectile p  = GenerateProjectile(game.Width / 5, 0, 10, c);
                RandomProjectile p2 = GenerateProjectile(game.Width / 5 * 2, 0, 10, c);
                RandomProjectile p3 = GenerateProjectile(game.Width / 5 * 3, 0, 10, c);
                RandomProjectile p4 = GenerateProjectile(game.Width / 5 * 4, 0, 10, c);

                projectiles.Add(p);
                projectiles.Add(p2);
                projectiles.Add(p3);
                projectiles.Add(p4);
            }

            int initialCount = projectiles.Count;

            for (int i = 0; i < projectiles.Count; i++)
            {
                projectiles[i].Update(gameTime);
                i += Math.Max(Math.Min(0, projectiles.Count - initialCount), 0);
                if (projectiles[Math.Min(i, projectiles.Count - 1)].TTL <= 0)
                {
                    projectiles.RemoveAt(i--);
                }
                i += Math.Max(Math.Min(0, projectiles.Count - initialCount), 0);
            }

            if (timer < 8000)
            {
                state = MinigameState.BEGIN;
            }
            else if (timer > 8000 && timer < 14000)
            {
                state = MinigameState.KEYNESIAN_CROSS;
                if (spawnTimer > 200)
                {
                    spawnTimer = 0;
                    projectiles.Add(new FortyFiveProjectile(blank, new Rectangle(
                                                                0, game.Height, 10, 10), 9000));
                    projectiles.Add(new KeynesianCross(blank, new Rectangle(
                                                           0, game.Height / 3 * 2, 10, 10), 9000));
                }
            }
            else if (timer > 15000 && timer < 28500)
            {
                state = MinigameState.AGGREGATE_DEMAND_SUPPLY;
                if (spawnTimer > 200)
                {
                    spawnTimer = 0;
                    projectiles.Add(new LRASProjectile(blank, new Rectangle(
                                                           game.Width / 2, 0, 10, 10), 5000));
                    projectiles.Add(new ASProjectile(blank, new Rectangle(
                                                         0, game.Height * 3 / 4, 10, 10), 10000));
                    projectiles.Add(new ADProjectile(blank, new Rectangle(
                                                         game.Width, game.Height * 3 / 4, 10, 10), 10000));
                }
            }
            else if (timer > 32000 && timer < 46500)
            {
                state = MinigameState.BUSINESS_CYCLE;
                if (spawnTimer > 200)
                {
                    spawnTimer = 0;
                    projectiles.Add(new BusinessCycleProjectile(blank, new Rectangle(
                                                                    0, game.Height / 4 * 3, 10, 10), 10000));
                }
            }
            else if (timer > 50000 && timer < 62000)
            {
                state = MinigameState.PHILLIPS;

                if (spawnTimer > 200)
                {
                    spawnTimer = 0;
                    projectiles.Add(new PhillipsProjectile(blank, new Rectangle(50, 0, 10, 10), 18000));
                }
            }
            else if (timer > 64000 && timer < 78000)
            {
                state = MinigameState.SUPPLY_DEMAND;

                if (spawnTimer > 200)
                {
                    spawnTimer = 0;
                    projectiles.Add(new ASProjectile(blank, new Rectangle(
                                                         0, game.Height * 3 / 4, 10, 10), 10000));
                    projectiles.Add(new ADProjectile(blank, new Rectangle(
                                                         game.Width, game.Height * 3 / 4, 10, 10), 10000));
                }
            }
            else if (timer > 82000 && timer < 88500)
            {
                state = MinigameState.RECESSION_DEPRESSION;

                if (spawnTimer > 200)
                {
                    spawnTimer = 0;
                    // recession/depression
                    projectiles.Add(new LRASProjectile(blank, new Rectangle(
                                                           game.Width / 2, 0, 10, 10), 5000));
                    projectiles.Add(new ASProjectile(blank, new Rectangle(
                                                         0, game.Height * 3 / 4, 10, 10), 10000));
                    projectiles.Add(new ADProjectile(blank, new Rectangle(
                                                         game.Width, game.Height * 3 / 4, 10, 10), 10000));
                    projectiles.Add(new ADProjectile(blank, new Rectangle(
                                                         game.Width - 300, game.Height * 3 / 4 + 300, 10, 10), 10000));
                }
            }
            else if (timer >= 88500 && timer < 96000)
            {
                state = MinigameState.INFLATION;

                if (spawnTimer > 200)
                {
                    spawnTimer = 0;
                    projectiles.Add(new LRASProjectile(blank, new Rectangle(
                                                           game.Width / 2, 0, 10, 10), 5000));
                    projectiles.Add(new ASProjectile(blank, new Rectangle(
                                                         0, game.Height * 3 / 4, 10, 10), 10000));
                    projectiles.Add(new ADProjectile(blank, new Rectangle(
                                                         game.Width, game.Height * 3 / 4, 10, 10), 10000));
                    projectiles.Add(new ADProjectile(blank, new Rectangle(
                                                         game.Width + 200, game.Height * 3 / 4 - 100, 10, 10), 10000));
                }
            }
            else if (timer >= 96000 && timer < 103000)
            {
                state = MinigameState.STAGFLATION;
                if (spawnTimer > 200)
                {
                    spawnTimer = 0;
                    projectiles.Add(new LRASProjectile(blank, new Rectangle(
                                                           game.Width / 2, 0, 10, 10), 5000));
                    projectiles.Add(new ASProjectile(blank, new Rectangle(
                                                         0, game.Height * 3 / 4, 10, 10), 10000));
                    projectiles.Add(new ASProjectile(blank, new Rectangle(
                                                         -200, game.Height * 3 / 4 - 200, 10, 10), 10000));
                    projectiles.Add(new ADProjectile(blank, new Rectangle(
                                                         game.Width, game.Height * 3 / 4, 10, 10), 10000));
                }
            }
            else if (timer > 103000 && timer < 112000)
            {
                state = MinigameState.ECONOMIC_BOOM;
                if (spawnTimer > 200)
                {
                    spawnTimer = 0;
                    projectiles.Add(new LRASProjectile(blank, new Rectangle(
                                                           game.Width / 2, 0, 10, 10), 5000));
                    projectiles.Add(new ASProjectile(blank, new Rectangle(
                                                         0, game.Height * 3 / 4, 10, 10), 10000));
                    projectiles.Add(new ASProjectile(blank, new Rectangle(
                                                         200, game.Height * 3 / 4 + 200, 10, 10), 10000));
                    projectiles.Add(new ADProjectile(blank, new Rectangle(
                                                         game.Width, game.Height * 3 / 4, 10, 10), 10000));
                }
            }
            else if (timer > 114000 && timer < 124000)
            {
                if (spawnTimer > 70)
                {
                    spawnTimer = 0;
                    projectiles.Add(new LafferProjectile(blank, new Rectangle(0, game.Height, 10, 10), 10000));
                }
                state = MinigameState.LAFFERS_CURVE;
            }
            else if (timer > 124000 && timer < 124000 + t)
            {
                state = MinigameState.NONE;
                MediaPlayer.Volume = Math.Max(MediaPlayer.Volume - dv * dt, 0);
                //GameManager.GetInstance().ChangeScreen(ScreenState.MENU);
            }
            else if (timer > 124000 + t && timer < 124000 + 2 * t)
            {
                if (!isPlayFlag)
                {
                    isPlayFlag = true;
                    MediaPlayer.Play(background2);
                }
                MediaPlayer.Volume = Math.Min(MediaPlayer.Volume + dv * dt, 1);
            }
            else if (timer > 124000 + 4 / dv + 64 && boss.Health > 0)
            {
                state = MinigameState.BOSS;
                boss.Update(gameTime);
                songName = "Spear of Justice! - Undertale";
            }
            else
            {
                state = MinigameState.NONE;
            }

            if (boss.Health <= 0)
            {
                endTimer += (float)gameTime.ElapsedGameTime.TotalMilliseconds;
                state     = MinigameState.END;

                if (endTimer > 10000)
                {
                    GameManager.GetInstance().ChangeScreen(ScreenState.MENU);
                }
            }
        }