Ejemplo n.º 1
0
        public AIMotorMovement(Motor motor, List<Rectangle> checkPointListAi, int mode)
        {
            this.checkPointListAi = checkPointListAi;
            this.motor = motor;
            this.currentLap = 1;
            this.motor.Thrust = false;
            this.motor.Turning = false;
            this.currentCheckpoint = 0;
            this.speedRandom = 0.95F+0.01F*(float)random.Next(1,9);
            this.handlingDivider = 10;
            this.mode = mode;

            this.currentLapCheckpoints = new List<int>();
            foreach(Rectangle rectangle in this.checkPointListAi)
            {
                this.currentLapCheckpoints.Add(0);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Update(GameTime gameTime)
        {
            mapTexture = skin.mapTexture;
            // Get input

            KeyboardState keyboard = Keyboard.GetState();
            GamePadState gamePad = GamePad.GetState(PlayerIndex.One);
            #region Allways keys

            // back to menu
            if (keyboard.IsKeyDown(Keys.M) && gameState != GameState.Options)
            {
                gameState = GameState.Intro;
                ////turn off all sounds
                foreach (Motor motor in motors)
                {
                    motor.Active = false;
                    motor.Update(gameTime);
                }
            }

            #endregion

            #region Intro
            if (gameState == GameState.Intro)
            {
                winner.Clear();
                winner.Append("Welcome to ZUZELO             Steering:\n");
                winner.Append("                                            ONE: Left, Up, Right\n");
                winner.Append("                                            TWO: A, S, D\n");
                winner.Append("Press:                                  \n");
                winner.Append("B - one player single game      G - one player Tournament\n");
                winner.Append("N - two player single game      H - two player Tournament\n");
                winner.Append("O - options");

                //new game
                if (keyboard.IsKeyDown(Keys.B))
                {
                    gameState = GameState.NewGame;
                    player2 = Players.AI;
                    whatGame = WhatGame.singleGame;
                }
                //options
                if (keyboard.IsKeyDown(Keys.O))
                {
                    gameState = GameState.Options;

                }
                //new game
                if (keyboard.IsKeyDown(Keys.N))
                {
                    gameState = GameState.NewGame;
                    player2 = Players.Player2;
                    whatGame = WhatGame.singleGame;
                }

                //new game
                if (keyboard.IsKeyDown(Keys.G))
                {
                    gameState = GameState.NewGame;
                    player2 = Players.AI;
                    whatGame = WhatGame.Tournament;
                    tournament = new Tournament(GameConstants.ROUNDSTOURNAMENT);
                }
                //new game
                if (keyboard.IsKeyDown(Keys.H))
                {
                    gameState = GameState.NewGame;
                    player2 = Players.Player2;
                    whatGame = WhatGame.Tournament;
                    tournament = new Tournament(GameConstants.ROUNDSTOURNAMENT);
                }

                // Allows the game to exit
                if (gamePad.Buttons.Back == ButtonState.Pressed ||
                    keyboard.IsKeyDown(Keys.Escape))
                {
                    MyExit();
                }

            }
            #endregion

            #region Options
            if (gameState == GameState.Options)
            {
                // Allows the game to exit
                if (gamePad.Buttons.Back == ButtonState.Pressed ||
                    keyboard.IsKeyDown(Keys.Escape))
                {
                    MyExit();
                }
                // back to menu
                if (keyboard.IsKeyDown(Keys.M))
                {
                    gameState = GameState.Intro;
                    ////turn off all sounds
                    foreach (Motor motor in motors)
                    {
                        motor.Active = false;
                        motor.Update(gameTime);
                    }
                    InitiateSave();
                }

                winner.Clear();
                if (difficulty == Difficulty.Easy)
                {
                    winner.Append("I  - Difficulty Easy                             Made by:\n");
                }
                else
                {
                    winner.Append("I  - Difficulty Hard                              Made by:\n");
                }
                if (classicMode)
                    winner.Append("T - Classic mode ON                www.krzykustudio.pl\n");
                else
                    winner.Append("T - Classic mode OFF              www.krzykustudio.pl\n");
                if (soundON)
                    winner.Append("U - Sound ON\n");
                else
                    winner.Append("U - Sound OFF\n");

                if (showFps)
                    winner.Append("Y - Show fps ON                            Sounds from:\n");
                else
                    winner.Append("Y - Show fps OFF                          Sounds from:\n");

                winner.Append("M - Menu                                   www.freefx.co.uk\n");
                winner.Append("K - " + skin.skinName + "                                             2015\n");

                //classic mode
                if (keyboard.IsKeyDown(Keys.T) && keyTup)
                {
                    if (classicMode)
                    {
                        classicMode = false;
                    }
                    else
                    {
                        classicMode = true;
                    }
                    keyTup = false;
                }
                if (keyboard.IsKeyUp(Keys.T))
                {
                    keyTup = true;
                }

                //difficulty
                if (keyboard.IsKeyDown(Keys.I) && keyIup)
                {
                    if (difficulty == Difficulty.Easy)
                    {
                        difficulty = Difficulty.Hard;
                    }
                    else
                    {
                        difficulty = Difficulty.Easy;
                    }
                    keyIup = false;
                }
                if (keyboard.IsKeyUp(Keys.I))
                {
                    keyIup = true;
                }

                //Skin
                if (keyboard.IsKeyDown(Keys.K) && keyKup)
                {
                    if (skin == skin1)
                    {
                        skin = skin2;
                    }
                    else
                    {
                        skin = skin1;
                    }
                    keyKup = false;
                }
                if (keyboard.IsKeyUp(Keys.K))
                {
                    keyKup = true;
                }

                //sounds on off
                if (keyboard.IsKeyDown(Keys.U) && keyUup)
                {
                    if (soundON)
                    {
                        soundON = false;
                    }
                    else
                    {
                        soundON = true;
                    }
                    keyUup = false;
                }
                if (keyboard.IsKeyUp(Keys.U))
                {
                    keyUup = true;
                }

                //show fps
                if (keyboard.IsKeyDown(Keys.Y) && keyYup)
                {
                    if (showFps)
                    {
                        showFps = false;
                    }
                    else
                    {
                        showFps = true;
                    }
                    keyYup = false;

                }

                if (keyboard.IsKeyUp(Keys.Y))
                {
                    keyYup = true;
                }

            }
            #endregion

            #region New Game
            if (gameState == GameState.NewGame)
            {
                tireMarks.Clear();
                motors.Clear();
                laps.Clear();
                int index, pos;
                lapsWinner.Clear();
                //sounds counting flag
                soundPlayingGO = false;
                soundPlaying1 = false;
                soundPlaying2 = false;
                soundPlaying3 = false;
                //starting positions
                List<int> positions = new List<int>();
                positions.Add(0);
                positions.Add(1);
                positions.Add(2);
                positions.Add(3);

                int mode;
                float speed = GameConstants.MOTOR_ACC_SPEED;

                if (difficulty == Difficulty.Easy)
                {
                    speed = GameConstants.MOTOR_ACC_SPEED;
                }
                if (difficulty == Difficulty.Hard)
                {
                    speed = GameConstants.MOTOR_ACC_SPEED + 0.07F;
                }

                if (classicMode)
                {
                    mode = 1;
                }
                else
                {
                    mode = 0;
                }

                pos = random.Next(positions.Count);
                index = positions[pos];
                positions.RemoveAt(pos);
                motorSound = Content.Load<SoundEffect>("audio\\motorRunning1");
                motorRed = new Motor("Red    ", Content, skin.motorRed, (int)GameConstants.START_POS.X,
                            (int)GameConstants.START_POS.Y + 27 * index, new Vector2(0, 0), motorSound, GameConstants.SFX_VOL, speed, mode);
                motors.Add(motorRed);

                pos = random.Next(positions.Count);
                index = positions[pos];
                positions.RemoveAt(pos);
                motorSound = Content.Load<SoundEffect>("audio\\motorRunning2");
                motorYellow = new Motor("Yellow", Content, skin.motorYellow, (int)GameConstants.START_POS.X,
                             (int)GameConstants.START_POS.Y + 27 * index, new Vector2(0, 0), motorSound, GameConstants.SFX_VOL, speed, mode);
                motors.Add(motorYellow);

                pos = random.Next(positions.Count);
                index = positions[pos];
                positions.RemoveAt(pos);
                motorSound = Content.Load<SoundEffect>("audio\\motorRunning3");
                motorBlue = new Motor("Blue   ", Content, skin.motorBlue, (int)GameConstants.START_POS.X,
                           (int)GameConstants.START_POS.Y + 27 * index, new Vector2(0, 0), motorSound, GameConstants.SFX_VOL, speed, mode);
                motors.Add(motorBlue);

                pos = random.Next(positions.Count);
                index = positions[pos];
                positions.RemoveAt(pos);
                motorSound = Content.Load<SoundEffect>("audio\\motorRunning3");
                motorGreen = new Motor("Green ", Content, skin.motorGreen, (int)GameConstants.START_POS.X,
                           (int)GameConstants.START_POS.Y + 27 * index, new Vector2(0, 0), motorSound, GameConstants.SFX_VOL, speed, mode);
                motors.Add(motorGreen);

                //AI layers
                aiGreen = new AIMotorMovement(motorGreen, checkAiPointsList, mode);
                aiBlue = new AIMotorMovement(motorBlue, checkAiPointsList, mode);
                aiYellow = new AIMotorMovement(motorYellow, checkAiPointsList, mode);

                // if tournament add players to tournament
                if (whatGame == WhatGame.Tournament)
                {
                    if (tournament.State == Tournament.TournamentState.NewGame)
                    {
                        foreach (Motor motor in motors)
                        {
                            tournament.AddPlayer(motor.MotorName);
                        }
                        tournament.State = Tournament.TournamentState.Playing;
                    }

                }

                clock = (int)gameTime.TotalGameTime.TotalSeconds;
                gameState = GameState.Counting;

            }
            #endregion

            #region Counting
            //Odliczanie

            if (gameState == GameState.Counting)
            {
                SoundEffect counting;
                counting = Content.Load<SoundEffect>("audio\\tick");
                SoundEffectInstance instance;
                instance = counting.CreateInstance();
                instance.IsLooped = false;
                winner.Clear();

                if ((int)gameTime.TotalGameTime.TotalSeconds - clock == 2)
                {

                    if (!soundPlaying3)
                    {
                        instance.Play();
                        soundPlaying3 = true;
                    }

                    winner.Append("                                 *********\n");
                    winner.Append("                                         **\n");
                    winner.Append("                                         **\n");
                    winner.Append("                                 *********\n");
                    winner.Append("                                         **\n");
                    winner.Append("                                         **\n");
                    winner.Append("                                 *********\n");
                }
                if ((int)gameTime.TotalGameTime.TotalSeconds - clock == 3)
                {

                    if (!soundPlaying2)
                    {
                        instance.Play();
                        soundPlaying2 = true;
                    }
                    winner.Append("                                 *********\n");
                    winner.Append("                                        **\n");
                    winner.Append("                                       **\n");
                    winner.Append("                                      **\n");
                    winner.Append("                                     **\n");
                    winner.Append("                                   **    \n");
                    winner.Append("                                 *********\n");
                }
                if ((int)gameTime.TotalGameTime.TotalSeconds - clock == 4)
                {

                    if (!soundPlaying1)
                    {
                        instance.Play();
                        soundPlaying1 = true;
                    }
                    winner.Append("                                      *****\n");
                    winner.Append("                                     *   **\n");
                    winner.Append("                                         **\n");
                    winner.Append("                                         **\n");
                    winner.Append("                                         **\n");
                    winner.Append("                                         **\n");
                    winner.Append("                                       ****\n");
                }
                if ((int)gameTime.TotalGameTime.TotalSeconds - clock >= 5)
                {
                    if (!soundPlayingGO)
                    {
                        counting = Content.Load<SoundEffect>("audio\\tack");
                        counting.Play();
                        soundPlayingGO = true;
                    }
                    gameState = GameState.StartGame;
                }

            }
            #endregion

            #region Start Game
            if (gameState == GameState.StartGame)
            {
                clock = (int)gameTime.TotalGameTime.TotalMilliseconds;

                lapsMotorRed = new Laps(motorRed, checkPointsList, finishMapRectangle, GameConstants.LAPS_NUMBER, clock);
                laps.Add(lapsMotorRed);
                lapsMotorYellow = new Laps(motorYellow, checkPointsList, finishMapRectangle, GameConstants.LAPS_NUMBER, clock);
                laps.Add(lapsMotorYellow);
                lapsMotorGreen = new Laps(motorGreen, checkPointsList, finishMapRectangle, GameConstants.LAPS_NUMBER, clock);
                laps.Add(lapsMotorGreen);
                lapsMotorBlue = new Laps(motorBlue, checkPointsList, finishMapRectangle, GameConstants.LAPS_NUMBER, clock);
                laps.Add(lapsMotorBlue);

                gameState = GameState.Playing;
            }
            #endregion

            #region Game Playing
            if (gameState == GameState.Playing)
            {

                foreach (Motor motorek in motors)
                {
                    motorek.AngleVelocity = 0.0F;
                    motorek.Turning = false;

                }
                clock_elapsed = (int)gameTime.TotalGameTime.TotalMilliseconds;

                #region Move the player

                //RED
                if (keyboard.IsKeyDown(Keys.Left))
                {
                    if (classicMode)
                    {
                        motorRed.AngleVelocity = GameConstants.MOTOR_ANGLE - 0.02F;
                    }
                    else
                    {
                        motorRed.AngleVelocity = GameConstants.MOTOR_ANGLE;
                    }

                    motorRed.Turning = true;

                }
                if (keyboard.IsKeyDown(Keys.Right) && classicMode == false)
                {
                    motorRed.AngleVelocity = -GameConstants.MOTOR_ANGLE;
                    motorRed.Turning = true;

                }

                if (keyboard.IsKeyDown(Keys.Up) && classicMode == false)
                {
                    motorRed.Thrust = true;
                }
                else if (classicMode)
                {
                    motorRed.Thrust = true;
                }
                else
                {
                    motorRed.Thrust = false;
                }
                //Yellow motor player or AI
                if (player2 == Players.Player2)
                {

                    //YELLOW
                    if (keyboard.IsKeyDown(Keys.A))
                    {
                        if (classicMode)
                        {
                            motorYellow.AngleVelocity = GameConstants.MOTOR_ANGLE - 0.02F;
                        }
                        else
                        {
                            motorYellow.AngleVelocity = GameConstants.MOTOR_ANGLE;
                        }

                        motorYellow.Turning = true;

                    }
                    if (keyboard.IsKeyDown(Keys.D) && classicMode == false)
                    {
                        motorYellow.AngleVelocity = -GameConstants.MOTOR_ANGLE;
                        motorYellow.Turning = true;

                    }
                    if (keyboard.IsKeyDown(Keys.W) && classicMode == false)
                    {
                        motorYellow.Thrust = true;
                    }
                    else if (classicMode)
                    {
                        motorYellow.Thrust = true;
                    }
                    else
                    {
                        motorYellow.Thrust = false;
                    }
                }
                else
                {
                    //AI Yellow
                    aiYellow.Update(gameTime);
                }

                aiBlue.Update(gameTime);
                aiGreen.Update(gameTime);
                #endregion

                // Check collision with mapborder
                allMotorsActive = motors.Count();
                foreach (Motor motorek in motors)
                {
                    if (!motorek.Active) allMotorsActive -= 1;

                    if (Intersect.IntersectPixels(motorek.DrawRectangle, motorek.TextureData,
                                      mapRectangle, mapGradTextureData))
                    {
                        motorek.Active = false;
                    }

                    motorek.Update(gameTime);
                    if (motorek.MotorName.Trim() == "Red")
                    {
                        tireMarks.Add(new TireMark(Content, skin.motorRedTires, motorek.DrawRectangle.Center.X, motorek.DrawRectangle.Center.Y));
                    }
                    if (motorek.MotorName.Trim() == "Green")
                    {
                        tireMarks.Add(new TireMark(Content, skin.motorGreenTires, motorek.DrawRectangle.Center.X, motorek.DrawRectangle.Center.Y));
                    }
                    if (motorek.MotorName.Trim() == "Blue")
                    {
                        tireMarks.Add(new TireMark(Content, skin.motorBlueTires, motorek.DrawRectangle.Center.X, motorek.DrawRectangle.Center.Y));
                    }
                    if (motorek.MotorName.Trim() == "Yellow")
                    {
                        tireMarks.Add(new TireMark(Content, skin.motorYellowTires, motorek.DrawRectangle.Center.X, motorek.DrawRectangle.Center.Y));
                    }

                }

                if (allMotorsActive == 0)
                {
                    gameState = GameState.GameOver;
                }

                //update playing
                foreach (Laps lap in laps)
                {
                    lap.Update(gameTime, clock_elapsed - clock);

                }

                // build playing string
                if (gameTime.TotalGameTime.TotalMilliseconds - clock < 500)
                {
                    winner.Clear();
                    winner.Append("                           ********      ********\n");
                    winner.Append("                          **      **     **       **\n");
                    winner.Append("                          **             **       **\n");
                    winner.Append("                          **  *****     **       **\n");
                    winner.Append("                          **      **     **       **\n");
                    winner.Append("                          **      **     **       **\n");
                    winner.Append("                           *********     ********\n");
                }
                else
                {
                    winner.Clear();
                    winner.Append("GameTime: " + DisplayClock(clock_elapsed - clock) + "\n\n");
                    int position = 1;
                    foreach (Laps lap in laps)
                    {
                        winner.Append(lap.MotorName + "       Lap:    " + lap.CurrentLap + "/" + GameConstants.LAPS_NUMBER.ToString() + "\n");
                        position++;
                    }
                }

                if (tireMarks.Count > skin.tireLongMark)
                {
                    tireMarks.RemoveAt(0);
                    tireMarks.RemoveAt(0);
                    tireMarks.RemoveAt(0);
                }

            }

            #endregion

            #region Game Over
            if (gameState == GameState.GameOver)
            {
                List<int> temporaryList = new List<int>();

                var winnerMotor =
                    from motor in laps
                    where motor.LapTime > 0
                    orderby motor.LapTime
                    select motor;

                winner.Clear();

                foreach (Laps lap in winnerMotor)
                {
                    lapsWinner.Add(lap);
                }
                //build winner list only in someone true ended race
                if (lapsWinner.Count > 0)
                {

                    if (whatGame == WhatGame.singleGame)
                    {
                        winner.Append("Winner: " + lapsWinner[0].MotorName + "                    SPACE for main screen\n\n");
                    }
                    else
                    {
                        winner.Append("Winner: " + lapsWinner[0].MotorName + "                    SPACE for tournament screen\n\n");
                        int score = 3;
                        foreach (Laps lap in lapsWinner)
                        {
                            tournament.AddTimes(lap.MotorName, score, lap.LapTime);
                            score--;
                        }
                    }
                    int position = 1;
                    foreach (Laps lap in lapsWinner)
                    {
                        winner.Append(position.ToString() + ". " + lap.MotorName + "       time:    " + DisplayClock(lap.LapTime) + "\n");
                        position++;
                    }
                }
                else
                {
                    winner.Clear();
                    if (whatGame == WhatGame.singleGame)
                    {
                        winner.Append("Nobody wins           SPACE for main screen\n\n");

                    }
                    else
                    {
                        winner.Append("Nobody wins           SPACE for tournament screen\n\n");
                    }

                }
                gameState = GameState.DisplayResults;
            }
            #endregion

            #region Display Results
            if (gameState == GameState.DisplayResults)
            {
                //intro screen
                if (keyboard.IsKeyDown(Keys.Space) && whatGame == WhatGame.singleGame)
                {
                    gameState = GameState.Intro;
                }
                //tournament results
                if (keyboard.IsKeyDown(Keys.Space) && whatGame == WhatGame.Tournament)
                {
                    gameState = GameState.DisplayTournament;
                    clock = (int)gameTime.TotalGameTime.TotalSeconds;
                }

            }
            #endregion

            #region Display Tournament
            if (gameState == GameState.DisplayTournament)
            {
                winner.Clear();
                if (tournament.State == Tournament.TournamentState.Playing)
                {
                    winner.Append("Tournament scores          SPACE for next round\n");
                    winner.Append(tournament.ToString());
                    //new game with 1second delay hiting key
                    if (keyboard.IsKeyDown(Keys.Space) && ((int)gameTime.TotalGameTime.TotalSeconds - clock) >= 1)
                    {
                        gameState = GameState.NewGame;
                        tournament.AddRound();
                    }
                }

                else if (tournament.State == Tournament.TournamentState.Ended)
                {
                    winner.Clear();
                    winner.Append("FINAL SCORES                 SPACE for end Tournament\n");
                    winner.Append(tournament.ToString());
                    //new game with 1second delay hiting key
                    if (keyboard.IsKeyDown(Keys.Space) && ((int)gameTime.TotalGameTime.TotalSeconds - clock) >= 2)
                    {
                        gameState = GameState.Intro;
                        clock = (int)gameTime.TotalGameTime.TotalSeconds;
                    }
                }

            }
            #endregion

            #region Display Tournament Winner
            if (gameState == GameState.DisplayTournamentFinal)
            {
                //tournament results
                if (keyboard.IsKeyDown(Keys.Space) && ((int)gameTime.TotalGameTime.TotalSeconds - clock) >= 1)
                {
                    gameState = GameState.Intro;

                }

            }
            #endregion

            //motors sounds on of
            foreach (Motor motor in motors)
            {
                motor.SoundOnOff(soundON, GameConstants.SFX_VOL);

            }

            //update fog
            float dt = (float)gameTime.ElapsedGameTime.TotalSeconds;

            if (skin.skinName == "Skin1")
            {
                foreach (Motor motor in motors)
                {
                    //add new smoke
                    if (motor.Active)
                    {
                        int X = (int)(Math.Cos(motor.Angle) * -motor.DrawRectangle.Width / 2) + motor.DrawRectangle.Center.X;
                        int Y = (int)(Math.Sin(motor.Angle) * motor.DrawRectangle.Height) + motor.DrawRectangle.Center.Y;
                        UpdateSmokePlume(dt, X, Y);
                    }
                }
            }

            fpsMonitor.Update();

            base.Update(gameTime);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Update(GameTime gameTime)
        {
            mapTexture = skin.mapTexture;
            // Get input

            KeyboardState keyboard = Keyboard.GetState();
            GamePadState  gamePad  = GamePad.GetState(PlayerIndex.One);

            #region Allways keys

            // back to menu
            if (keyboard.IsKeyDown(Keys.M) && gameState != GameState.Options)
            {
                gameState = GameState.Intro;
                ////turn off all sounds
                foreach (Motor motor in motors)
                {
                    motor.Active = false;
                    motor.Update(gameTime);
                }
            }


            #endregion

            #region Intro
            if (gameState == GameState.Intro)
            {
                winner.Clear();
                winner.Append("Welcome to ZUZELO             Steering:\n");
                winner.Append("                                            ONE: Left, Up, Right\n");
                winner.Append("                                            TWO: A, S, D\n");
                winner.Append("Press:                                  \n");
                winner.Append("B - one player single game      G - one player Tournament\n");
                winner.Append("N - two player single game      H - two player Tournament\n");
                winner.Append("O - options");

                //new game
                if (keyboard.IsKeyDown(Keys.B))
                {
                    gameState = GameState.NewGame;
                    player2   = Players.AI;
                    whatGame  = WhatGame.singleGame;
                }
                //options
                if (keyboard.IsKeyDown(Keys.O))
                {
                    gameState = GameState.Options;
                }
                //new game
                if (keyboard.IsKeyDown(Keys.N))
                {
                    gameState = GameState.NewGame;
                    player2   = Players.Player2;
                    whatGame  = WhatGame.singleGame;
                }

                //new game
                if (keyboard.IsKeyDown(Keys.G))
                {
                    gameState  = GameState.NewGame;
                    player2    = Players.AI;
                    whatGame   = WhatGame.Tournament;
                    tournament = new Tournament(GameConstants.ROUNDSTOURNAMENT);
                }
                //new game
                if (keyboard.IsKeyDown(Keys.H))
                {
                    gameState  = GameState.NewGame;
                    player2    = Players.Player2;
                    whatGame   = WhatGame.Tournament;
                    tournament = new Tournament(GameConstants.ROUNDSTOURNAMENT);
                }

                // Allows the game to exit
                if (gamePad.Buttons.Back == ButtonState.Pressed ||
                    keyboard.IsKeyDown(Keys.Escape))
                {
                    MyExit();
                }
            }
            #endregion

            #region Options
            if (gameState == GameState.Options)
            {
                // Allows the game to exit
                if (gamePad.Buttons.Back == ButtonState.Pressed ||
                    keyboard.IsKeyDown(Keys.Escape))
                {
                    MyExit();
                }
                // back to menu
                if (keyboard.IsKeyDown(Keys.M))
                {
                    gameState = GameState.Intro;
                    ////turn off all sounds
                    foreach (Motor motor in motors)
                    {
                        motor.Active = false;
                        motor.Update(gameTime);
                    }
                    InitiateSave();
                }


                winner.Clear();
                if (difficulty == Difficulty.Easy)
                {
                    winner.Append("I  - Difficulty Easy                             Made by:\n");
                }
                else
                {
                    winner.Append("I  - Difficulty Hard                              Made by:\n");
                }
                if (classicMode)
                {
                    winner.Append("T - Classic mode ON                www.krzykustudio.pl\n");
                }
                else
                {
                    winner.Append("T - Classic mode OFF              www.krzykustudio.pl\n");
                }
                if (soundON)
                {
                    winner.Append("U - Sound ON\n");
                }
                else
                {
                    winner.Append("U - Sound OFF\n");
                }

                if (showFps)
                {
                    winner.Append("Y - Show fps ON                            Sounds from:\n");
                }
                else
                {
                    winner.Append("Y - Show fps OFF                          Sounds from:\n");
                }

                winner.Append("M - Menu                                   www.freefx.co.uk\n");
                winner.Append("K - " + skin.skinName + "                                             2015\n");


                //classic mode
                if (keyboard.IsKeyDown(Keys.T) && keyTup)
                {
                    if (classicMode)
                    {
                        classicMode = false;
                    }
                    else
                    {
                        classicMode = true;
                    }
                    keyTup = false;
                }
                if (keyboard.IsKeyUp(Keys.T))
                {
                    keyTup = true;
                }

                //difficulty
                if (keyboard.IsKeyDown(Keys.I) && keyIup)
                {
                    if (difficulty == Difficulty.Easy)
                    {
                        difficulty = Difficulty.Hard;
                    }
                    else
                    {
                        difficulty = Difficulty.Easy;
                    }
                    keyIup = false;
                }
                if (keyboard.IsKeyUp(Keys.I))
                {
                    keyIup = true;
                }

                //Skin
                if (keyboard.IsKeyDown(Keys.K) && keyKup)
                {
                    if (skin == skin1)
                    {
                        skin = skin2;
                    }
                    else
                    {
                        skin = skin1;
                    }
                    keyKup = false;
                }
                if (keyboard.IsKeyUp(Keys.K))
                {
                    keyKup = true;
                }

                //sounds on off
                if (keyboard.IsKeyDown(Keys.U) && keyUup)
                {
                    if (soundON)
                    {
                        soundON = false;
                    }
                    else
                    {
                        soundON = true;
                    }
                    keyUup = false;
                }
                if (keyboard.IsKeyUp(Keys.U))
                {
                    keyUup = true;
                }

                //show fps
                if (keyboard.IsKeyDown(Keys.Y) && keyYup)
                {
                    if (showFps)
                    {
                        showFps = false;
                    }
                    else
                    {
                        showFps = true;
                    }
                    keyYup = false;
                }

                if (keyboard.IsKeyUp(Keys.Y))
                {
                    keyYup = true;
                }
            }
            #endregion

            #region New Game
            if (gameState == GameState.NewGame)
            {
                tireMarks.Clear();
                motors.Clear();
                laps.Clear();
                int index, pos;
                lapsWinner.Clear();
                //sounds counting flag
                soundPlayingGO = false;
                soundPlaying1  = false;
                soundPlaying2  = false;
                soundPlaying3  = false;
                //starting positions
                List <int> positions = new List <int>();
                positions.Add(0);
                positions.Add(1);
                positions.Add(2);
                positions.Add(3);

                int   mode;
                float speed = GameConstants.MOTOR_ACC_SPEED;

                if (difficulty == Difficulty.Easy)
                {
                    speed = GameConstants.MOTOR_ACC_SPEED;
                }
                if (difficulty == Difficulty.Hard)
                {
                    speed = GameConstants.MOTOR_ACC_SPEED + 0.07F;
                }

                if (classicMode)
                {
                    mode = 1;
                }
                else
                {
                    mode = 0;
                }

                pos   = random.Next(positions.Count);
                index = positions[pos];
                positions.RemoveAt(pos);
                motorSound = Content.Load <SoundEffect>("audio\\motorRunning1");
                motorRed   = new Motor("Red    ", Content, skin.motorRed, (int)GameConstants.START_POS.X,
                                       (int)GameConstants.START_POS.Y + 27 * index, new Vector2(0, 0), motorSound, GameConstants.SFX_VOL, speed, mode);
                motors.Add(motorRed);

                pos   = random.Next(positions.Count);
                index = positions[pos];
                positions.RemoveAt(pos);
                motorSound  = Content.Load <SoundEffect>("audio\\motorRunning2");
                motorYellow = new Motor("Yellow", Content, skin.motorYellow, (int)GameConstants.START_POS.X,
                                        (int)GameConstants.START_POS.Y + 27 * index, new Vector2(0, 0), motorSound, GameConstants.SFX_VOL, speed, mode);
                motors.Add(motorYellow);

                pos   = random.Next(positions.Count);
                index = positions[pos];
                positions.RemoveAt(pos);
                motorSound = Content.Load <SoundEffect>("audio\\motorRunning3");
                motorBlue  = new Motor("Blue   ", Content, skin.motorBlue, (int)GameConstants.START_POS.X,
                                       (int)GameConstants.START_POS.Y + 27 * index, new Vector2(0, 0), motorSound, GameConstants.SFX_VOL, speed, mode);
                motors.Add(motorBlue);

                pos   = random.Next(positions.Count);
                index = positions[pos];
                positions.RemoveAt(pos);
                motorSound = Content.Load <SoundEffect>("audio\\motorRunning3");
                motorGreen = new Motor("Green ", Content, skin.motorGreen, (int)GameConstants.START_POS.X,
                                       (int)GameConstants.START_POS.Y + 27 * index, new Vector2(0, 0), motorSound, GameConstants.SFX_VOL, speed, mode);
                motors.Add(motorGreen);

                //AI layers
                aiGreen  = new AIMotorMovement(motorGreen, checkAiPointsList, mode);
                aiBlue   = new AIMotorMovement(motorBlue, checkAiPointsList, mode);
                aiYellow = new AIMotorMovement(motorYellow, checkAiPointsList, mode);

                // if tournament add players to tournament
                if (whatGame == WhatGame.Tournament)
                {
                    if (tournament.State == Tournament.TournamentState.NewGame)
                    {
                        foreach (Motor motor in motors)
                        {
                            tournament.AddPlayer(motor.MotorName);
                        }
                        tournament.State = Tournament.TournamentState.Playing;
                    }
                }

                clock     = (int)gameTime.TotalGameTime.TotalSeconds;
                gameState = GameState.Counting;
            }
            #endregion

            #region Counting
            //Odliczanie


            if (gameState == GameState.Counting)
            {
                SoundEffect counting;
                counting = Content.Load <SoundEffect>("audio\\tick");
                SoundEffectInstance instance;
                instance          = counting.CreateInstance();
                instance.IsLooped = false;
                winner.Clear();

                if ((int)gameTime.TotalGameTime.TotalSeconds - clock == 2)
                {
                    if (!soundPlaying3)
                    {
                        instance.Play();
                        soundPlaying3 = true;
                    }

                    winner.Append("                                 *********\n");
                    winner.Append("                                         **\n");
                    winner.Append("                                         **\n");
                    winner.Append("                                 *********\n");
                    winner.Append("                                         **\n");
                    winner.Append("                                         **\n");
                    winner.Append("                                 *********\n");
                }
                if ((int)gameTime.TotalGameTime.TotalSeconds - clock == 3)
                {
                    if (!soundPlaying2)
                    {
                        instance.Play();
                        soundPlaying2 = true;
                    }
                    winner.Append("                                 *********\n");
                    winner.Append("                                        **\n");
                    winner.Append("                                       **\n");
                    winner.Append("                                      **\n");
                    winner.Append("                                     **\n");
                    winner.Append("                                   **    \n");
                    winner.Append("                                 *********\n");
                }
                if ((int)gameTime.TotalGameTime.TotalSeconds - clock == 4)
                {
                    if (!soundPlaying1)
                    {
                        instance.Play();
                        soundPlaying1 = true;
                    }
                    winner.Append("                                      *****\n");
                    winner.Append("                                     *   **\n");
                    winner.Append("                                         **\n");
                    winner.Append("                                         **\n");
                    winner.Append("                                         **\n");
                    winner.Append("                                         **\n");
                    winner.Append("                                       ****\n");
                }
                if ((int)gameTime.TotalGameTime.TotalSeconds - clock >= 5)
                {
                    if (!soundPlayingGO)
                    {
                        counting = Content.Load <SoundEffect>("audio\\tack");
                        counting.Play();
                        soundPlayingGO = true;
                    }
                    gameState = GameState.StartGame;
                }
            }
            #endregion

            #region Start Game
            if (gameState == GameState.StartGame)
            {
                clock = (int)gameTime.TotalGameTime.TotalMilliseconds;

                lapsMotorRed = new Laps(motorRed, checkPointsList, finishMapRectangle, GameConstants.LAPS_NUMBER, clock);
                laps.Add(lapsMotorRed);
                lapsMotorYellow = new Laps(motorYellow, checkPointsList, finishMapRectangle, GameConstants.LAPS_NUMBER, clock);
                laps.Add(lapsMotorYellow);
                lapsMotorGreen = new Laps(motorGreen, checkPointsList, finishMapRectangle, GameConstants.LAPS_NUMBER, clock);
                laps.Add(lapsMotorGreen);
                lapsMotorBlue = new Laps(motorBlue, checkPointsList, finishMapRectangle, GameConstants.LAPS_NUMBER, clock);
                laps.Add(lapsMotorBlue);

                gameState = GameState.Playing;
            }
            #endregion

            #region Game Playing
            if (gameState == GameState.Playing)
            {
                foreach (Motor motorek in motors)
                {
                    motorek.AngleVelocity = 0.0F;
                    motorek.Turning       = false;
                }
                clock_elapsed = (int)gameTime.TotalGameTime.TotalMilliseconds;

                #region Move the player

                //RED
                if (keyboard.IsKeyDown(Keys.Left))
                {
                    if (classicMode)
                    {
                        motorRed.AngleVelocity = GameConstants.MOTOR_ANGLE - 0.02F;
                    }
                    else
                    {
                        motorRed.AngleVelocity = GameConstants.MOTOR_ANGLE;
                    }


                    motorRed.Turning = true;
                }
                if (keyboard.IsKeyDown(Keys.Right) && classicMode == false)
                {
                    motorRed.AngleVelocity = -GameConstants.MOTOR_ANGLE;
                    motorRed.Turning       = true;
                }

                if (keyboard.IsKeyDown(Keys.Up) && classicMode == false)
                {
                    motorRed.Thrust = true;
                }
                else if (classicMode)
                {
                    motorRed.Thrust = true;
                }
                else
                {
                    motorRed.Thrust = false;
                }
                //Yellow motor player or AI
                if (player2 == Players.Player2)
                {
                    //YELLOW
                    if (keyboard.IsKeyDown(Keys.A))
                    {
                        if (classicMode)
                        {
                            motorYellow.AngleVelocity = GameConstants.MOTOR_ANGLE - 0.02F;
                        }
                        else
                        {
                            motorYellow.AngleVelocity = GameConstants.MOTOR_ANGLE;
                        }

                        motorYellow.Turning = true;
                    }
                    if (keyboard.IsKeyDown(Keys.D) && classicMode == false)
                    {
                        motorYellow.AngleVelocity = -GameConstants.MOTOR_ANGLE;
                        motorYellow.Turning       = true;
                    }
                    if (keyboard.IsKeyDown(Keys.W) && classicMode == false)
                    {
                        motorYellow.Thrust = true;
                    }
                    else if (classicMode)
                    {
                        motorYellow.Thrust = true;
                    }
                    else
                    {
                        motorYellow.Thrust = false;
                    }
                }
                else
                {
                    //AI Yellow
                    aiYellow.Update(gameTime);
                }

                aiBlue.Update(gameTime);
                aiGreen.Update(gameTime);
                #endregion

                // Check collision with mapborder
                allMotorsActive = motors.Count();
                foreach (Motor motorek in motors)
                {
                    if (!motorek.Active)
                    {
                        allMotorsActive -= 1;
                    }

                    if (Intersect.IntersectPixels(motorek.DrawRectangle, motorek.TextureData,
                                                  mapRectangle, mapGradTextureData))
                    {
                        motorek.Active = false;
                    }

                    motorek.Update(gameTime);
                    if (motorek.MotorName.Trim() == "Red")
                    {
                        tireMarks.Add(new TireMark(Content, skin.motorRedTires, motorek.DrawRectangle.Center.X, motorek.DrawRectangle.Center.Y));
                    }
                    if (motorek.MotorName.Trim() == "Green")
                    {
                        tireMarks.Add(new TireMark(Content, skin.motorGreenTires, motorek.DrawRectangle.Center.X, motorek.DrawRectangle.Center.Y));
                    }
                    if (motorek.MotorName.Trim() == "Blue")
                    {
                        tireMarks.Add(new TireMark(Content, skin.motorBlueTires, motorek.DrawRectangle.Center.X, motorek.DrawRectangle.Center.Y));
                    }
                    if (motorek.MotorName.Trim() == "Yellow")
                    {
                        tireMarks.Add(new TireMark(Content, skin.motorYellowTires, motorek.DrawRectangle.Center.X, motorek.DrawRectangle.Center.Y));
                    }
                }

                if (allMotorsActive == 0)
                {
                    gameState = GameState.GameOver;
                }


                //update playing
                foreach (Laps lap in laps)
                {
                    lap.Update(gameTime, clock_elapsed - clock);
                }

                // build playing string
                if (gameTime.TotalGameTime.TotalMilliseconds - clock < 500)
                {
                    winner.Clear();
                    winner.Append("                           ********      ********\n");
                    winner.Append("                          **      **     **       **\n");
                    winner.Append("                          **             **       **\n");
                    winner.Append("                          **  *****     **       **\n");
                    winner.Append("                          **      **     **       **\n");
                    winner.Append("                          **      **     **       **\n");
                    winner.Append("                           *********     ********\n");
                }
                else
                {
                    winner.Clear();
                    winner.Append("GameTime: " + DisplayClock(clock_elapsed - clock) + "\n\n");
                    int position = 1;
                    foreach (Laps lap in laps)
                    {
                        winner.Append(lap.MotorName + "       Lap:    " + lap.CurrentLap + "/" + GameConstants.LAPS_NUMBER.ToString() + "\n");
                        position++;
                    }
                }

                if (tireMarks.Count > skin.tireLongMark)
                {
                    tireMarks.RemoveAt(0);
                    tireMarks.RemoveAt(0);
                    tireMarks.RemoveAt(0);
                }
            }

            #endregion

            #region Game Over
            if (gameState == GameState.GameOver)
            {
                List <int> temporaryList = new List <int>();

                var winnerMotor =
                    from motor in laps
                    where motor.LapTime > 0
                    orderby motor.LapTime
                    select motor;

                winner.Clear();

                foreach (Laps lap in winnerMotor)
                {
                    lapsWinner.Add(lap);
                }
                //build winner list only in someone true ended race
                if (lapsWinner.Count > 0)
                {
                    if (whatGame == WhatGame.singleGame)
                    {
                        winner.Append("Winner: " + lapsWinner[0].MotorName + "                    SPACE for main screen\n\n");
                    }
                    else
                    {
                        winner.Append("Winner: " + lapsWinner[0].MotorName + "                    SPACE for tournament screen\n\n");
                        int score = 3;
                        foreach (Laps lap in lapsWinner)
                        {
                            tournament.AddTimes(lap.MotorName, score, lap.LapTime);
                            score--;
                        }
                    }
                    int position = 1;
                    foreach (Laps lap in lapsWinner)
                    {
                        winner.Append(position.ToString() + ". " + lap.MotorName + "       time:    " + DisplayClock(lap.LapTime) + "\n");
                        position++;
                    }
                }
                else
                {
                    winner.Clear();
                    if (whatGame == WhatGame.singleGame)
                    {
                        winner.Append("Nobody wins           SPACE for main screen\n\n");
                    }
                    else
                    {
                        winner.Append("Nobody wins           SPACE for tournament screen\n\n");
                    }
                }
                gameState = GameState.DisplayResults;
            }
            #endregion

            #region Display Results
            if (gameState == GameState.DisplayResults)
            {
                //intro screen
                if (keyboard.IsKeyDown(Keys.Space) && whatGame == WhatGame.singleGame)
                {
                    gameState = GameState.Intro;
                }
                //tournament results
                if (keyboard.IsKeyDown(Keys.Space) && whatGame == WhatGame.Tournament)
                {
                    gameState = GameState.DisplayTournament;
                    clock     = (int)gameTime.TotalGameTime.TotalSeconds;
                }
            }
            #endregion

            #region Display Tournament
            if (gameState == GameState.DisplayTournament)
            {
                winner.Clear();
                if (tournament.State == Tournament.TournamentState.Playing)
                {
                    winner.Append("Tournament scores          SPACE for next round\n");
                    winner.Append(tournament.ToString());
                    //new game with 1second delay hiting key
                    if (keyboard.IsKeyDown(Keys.Space) && ((int)gameTime.TotalGameTime.TotalSeconds - clock) >= 1)
                    {
                        gameState = GameState.NewGame;
                        tournament.AddRound();
                    }
                }

                else if (tournament.State == Tournament.TournamentState.Ended)
                {
                    winner.Clear();
                    winner.Append("FINAL SCORES                 SPACE for end Tournament\n");
                    winner.Append(tournament.ToString());
                    //new game with 1second delay hiting key
                    if (keyboard.IsKeyDown(Keys.Space) && ((int)gameTime.TotalGameTime.TotalSeconds - clock) >= 2)
                    {
                        gameState = GameState.Intro;
                        clock     = (int)gameTime.TotalGameTime.TotalSeconds;
                    }
                }
            }
            #endregion

            #region Display Tournament Winner
            if (gameState == GameState.DisplayTournamentFinal)
            {
                //tournament results
                if (keyboard.IsKeyDown(Keys.Space) && ((int)gameTime.TotalGameTime.TotalSeconds - clock) >= 1)
                {
                    gameState = GameState.Intro;
                }
            }
            #endregion

            //motors sounds on of
            foreach (Motor motor in motors)
            {
                motor.SoundOnOff(soundON, GameConstants.SFX_VOL);
            }

            //update fog
            float dt = (float)gameTime.ElapsedGameTime.TotalSeconds;

            if (skin.skinName == "Skin1")
            {
                foreach (Motor motor in motors)
                {
                    //add new smoke
                    if (motor.Active)
                    {
                        int X = (int)(Math.Cos(motor.Angle) * -motor.DrawRectangle.Width / 2) + motor.DrawRectangle.Center.X;
                        int Y = (int)(Math.Sin(motor.Angle) * motor.DrawRectangle.Height) + motor.DrawRectangle.Center.Y;
                        UpdateSmokePlume(dt, X, Y);
                    }
                }
            }

            fpsMonitor.Update();

            base.Update(gameTime);
        }