//****************************************************************//
        // This function tests if a given position is in collision with a //
        // wall, if so it will return true.                               //
        //****************************************************************//
        private bool IsInCollisionWithWall(CPoint2f pos)
        {
            /////////////////////////////////////////////////////////////////
            // First we check if we've moved outside of the board this will also
            // return true.

            if (pos.X < 0 || pos.Y < 0 || pos.X + CGameTextures.TILE_SIZE > m_boardDims[0] || pos.Y + CGameTextures.TILE_SIZE > m_boardDims[1])
            {
                return(true);
            }


            //////////////////////////////////////////////////////////////////
            // Next we calculate the centre of the tile and see if this is in
            // collision. This will allow the player to walk a little bit (50%)
            // into walls.

            CPoint2i centre = new CPoint2i();

            centre.X = (int)pos.X + CGameTextures.TILE_SIZE / 2;
            centre.Y = (int)pos.Y + CGameTextures.TILE_SIZE / 2;

            CPoint2i tilePos = CLevelUtils.GetTileCoordinatesFromPixel(centre);

            return(m_level.GetTileType(tilePos.X, tilePos.Y) == eTileType.Wall);
        }
        //****************************************************************//
        // This function tests if a given position is in collision with a //
        // fire, if so it will return true.                               //
        //****************************************************************//
        private bool IsInCollisionWithFire(CPoint2f pos)
        {
            /////////////////////////////////////////////////////////////////
            // First we check if we've moved outside of the board this will also
            // return true.

            if (pos.X < 0 || pos.Y < 0 || pos.X + CGameTextures.TILE_SIZE > m_boardDims[0] || pos.Y + CGameTextures.TILE_SIZE > m_boardDims[1])
            {
                return(true);
            }


            //////////////////////////////////////////////////////////////////
            // Next we calculate the centre of the tile and see if this is in
            // collision. This will allow the player to walk a little bit (50%)
            // into walls.

            CPoint2i centre = new CPoint2i();

            centre.X = (int)pos.X + CGameTextures.TILE_SIZE / 2;
            centre.Y = (int)pos.Y + CGameTextures.TILE_SIZE / 2;

            CPoint2i tilePos = CLevelUtils.GetTileCoordinatesFromPixel(centre);

            foreach (CPoint2f posFire in m_level.FirePositions)
            {
                if ((Math.Pow(tilePos.X - posFire.X, 2.0) + Math.Pow(tilePos.Y - posFire.Y, 2.0)) <= 0.1)
                {
                    return(true);
                }
            }

            return(false);
        }
        //****************************************************************//
        // This initilaises the dynamic parts of the game to their initial//
        // positions as specified by the game level.                      //
        //****************************************************************//
        private void InitialiseGameState()
        {
            ////////////////////////////////////////////////////////////
            // Place the player at their initial position.

            gameState.Player.Position = CLevelUtils.GetPixelFromTileCoordinates(currentLevel.StartPosition);

            Random random = new Random();

            for (int i = 0; i < currentLevel.EnemyPositions.Count(); i++)
            {
                ////////////////////////////////////////////////////////////
                // Place each enemy at their initial position and give them an
                // initial random direction.

                gameState.Enemies[i].Position = CLevelUtils.GetPixelFromTileCoordinates(currentLevel.EnemyPositions[i]);

                gameState.Enemies[i].TargetPosition.X = gameState.Enemies[i].Position.X;
                gameState.Enemies[i].TargetPosition.Y = gameState.Enemies[i].Position.Y;


                /////////////////////////////////////////////////////////////
                // Create a random direction to walk in.

                int direction = random.Next() % 4;

                switch (direction)
                {
                case 0:
                    gameState.Enemies[i].Velocity.X = monster_speed;
                    gameState.Enemies[i].Velocity.Y = 0.0f;
                    break;

                case 1:
                    gameState.Enemies[i].Velocity.X = -monster_speed;
                    gameState.Enemies[i].Velocity.Y = 0.0f;
                    break;

                case 2:
                    gameState.Enemies[i].Velocity.X = 0.0f;
                    gameState.Enemies[i].Velocity.Y = monster_speed;
                    break;

                case 3:
                default:
                    gameState.Enemies[i].Velocity.X = 0.0f;
                    gameState.Enemies[i].Velocity.Y = -monster_speed;
                    break;
                }
            }
        }
        private void cvsMainScreen_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Point    p        = e.GetPosition(cvsMainScreen);
            CPoint2i pixelPos = new CPoint2i((int)p.X, (int)p.Y);
            CPoint2i mapPos   = CLevelUtils.GetTileCoordinatesFromPixel(pixelPos);

            if (FloorWallToggleRadio.IsChecked == true)
            {
                if (currentLevel.GetTileType(mapPos.X, mapPos.Y) == eTileType.Wall)
                {
                    currentLevel.SetTileType(mapPos.X, mapPos.Y, eTileType.Floor);
                }
                else if (currentLevel.GetTileType(mapPos.X, mapPos.Y) == eTileType.Floor)
                {
                    currentLevel.SetTileType(mapPos.X, mapPos.Y, eTileType.Wall);
                }
            }
            else if (PlayerRadio.IsChecked == true && (currentLevel.GetTileType(mapPos.X, mapPos.Y) == eTileType.Floor))
            {
                currentLevel.StartPosition = mapPos;
            }
            else if (EnemyRadio.IsChecked == true && (currentLevel.GetTileType(mapPos.X, mapPos.Y) == eTileType.Floor))
            {
                //Fill In here
            }
            else if (GoalRadio.IsChecked == true && (currentLevel.GetTileType(mapPos.X, mapPos.Y) == eTileType.Floor))
            {
                currentLevel.GoalPosition = mapPos;
            }
            else if (WallRadio.IsChecked == true && (currentLevel.GetTileType(mapPos.X, mapPos.Y) == eTileType.Floor))
            {
                currentLevel.SetTileType(mapPos.X, mapPos.Y, eTileType.Wall);
            }
            else if (FloorRadio.IsChecked == true && (currentLevel.GetTileType(mapPos.X, mapPos.Y) == eTileType.Wall))
            {
                currentLevel.SetTileType(mapPos.X, mapPos.Y, eTileType.Floor);
            }
            else if (FireRadio.IsChecked == true && (currentLevel.GetTileType(mapPos.X, mapPos.Y) == eTileType.Floor))
            {
                //Fill In here
            }
            reRender();
        }
        //****************************************************************//
        // This function updates the position of each enemy in the game   //
        // and the player, it then checks if there are collisions between //
        // the enemy or the player and raises a PlayerCaught event.       //
        // It also checks if the player has reached the end goal.         //
        //****************************************************************//
        public void UpdatePositions(CGameState gameState, float time_delta)
        {
            ///////////////////////////////////////////////////////////////////
            // First we update the positions of the players and enemies.

            foreach (CSprite sprite in gameState.Enemies)
            {
                UpdatePosition(sprite, time_delta);
            }

            UpdatePosition(gameState.Player, time_delta);


            ///////////////////////////////////////////////////////////////////
            // Next we check if our player has reached the goal position.

            CPoint2f goalPositionPixels = CLevelUtils.GetPixelFromTileCoordinates(m_level.GoalPosition);

            if (IsInCollision(gameState.Player.Position, goalPositionPixels))
            {
                OnGoalReached(this, "You Won!! Goal Reached!!");
                return;
            }


            ///////////////////////////////////////////////////////////////////
            // Next we check each enemy in turn to see if the user has been
            // caught.

            foreach (CSprite sprite in gameState.Enemies)
            {
                if (IsInCollision(gameState.Player.Position, sprite.Position))
                {
                    OnPlayerCaught(this, "You Lose!! Player Caught!!");
                    break;
                }
            }
        }
        //****************************************************************//
        // This function is used as an event handler for the load click  *//
        // event. This is used to load a new level. In addition to       *//
        // the data required for the level it also ensures the board is  *//
        // displayed.                                                    *//
        //****************************************************************//
        private void btnLoad_Click(object sender, RoutedEventArgs e)
        {
            ////////////////////////////////////////////////////////////
            // clear any existing children from the canvas.

            cvsMainScreen.Children.Clear();

            ///////////////////////////////////////////////////////////
            // Get the directory where the level data is stored and
            // load the data in.

            string fileDir = txtLevelDir.Text;

            currentLevel = CLevelParser.ImportLevel(fileDir);
            gameTextures = CLevelParser.ImportTextures(fileDir);


            ///////////////////////////////////////////////////////////
            // Draw the set of wall and floor tiles for the current
            // level and the goal icon. This is part of the game
            // we do not expect to change as it cannot move.

            DrawLevel();


            //////////////////////////////////////////////////////////
            // Add a game state, this represents the position and velocity
            // of all the enemies and the player. Basically, anything
            // that is dynamic that we expect to move around.

            gameState = new CGameState(currentLevel.EnemyPositions.Count());


            ///////////////////////////////////////////////////////////
            // Set up the player to have the correct .bmp and set it to
            // its initial starting point. The player's position is stored
            // as a tile index on the Clevel class, this must be converted
            // to a pixel position on the game state.

            playerIcon        = new Image();
            playerIcon.Width  = CGameTextures.TILE_SIZE;
            playerIcon.Height = CGameTextures.TILE_SIZE;

            playerIcon.Source = gameTextures.PlayerIcon;

            cvsMainScreen.Children.Add(playerIcon);


            //////////////////////////////////////////////////////////
            // Create instances of the enemies and fires for display. We must do
            // this as each child on a canvas must be a distinct object,
            // we could not simply add the same image multiple times.

            enemyIcons = new Image[currentLevel.EnemyPositions.Count()];

            for (int i = 0; i < currentLevel.EnemyPositions.Count(); i++)
            {
                enemyIcons[i] = new Image();

                enemyIcons[i].Width  = CGameTextures.TILE_SIZE;
                enemyIcons[i].Height = CGameTextures.TILE_SIZE;

                enemyIcons[i].Source = gameTextures.EnemyIcon;

                cvsMainScreen.Children.Add(enemyIcons[i]);
            }


            fireIcons = new Image[currentLevel.FirePositions.Count()];

            for (int i = 0; i < currentLevel.FirePositions.Count(); i++)
            {
                fireIcons[i] = new Image();

                fireIcons[i].Width  = CGameTextures.TILE_SIZE;
                fireIcons[i].Height = CGameTextures.TILE_SIZE;

                fireIcons[i].Source = gameTextures.FireIcon;

                cvsMainScreen.Children.Add(fireIcons[i]);

                CPoint2i tilePosition = CLevelUtils.GetPixelFromTileCoordinates(new CPoint2i(currentLevel.FirePositions[i].X, currentLevel.FirePositions[i].Y));


                Canvas.SetLeft(fireIcons[i], tilePosition.X);
                Canvas.SetTop(fireIcons[i], tilePosition.Y);
            }

            loadTextures();
            ////////////////////////////////////////////////////////////
            // Set each instance of a dynamic object to its initial position
            // as defined by the current level object.

            InitialiseGameState();


            ////////////////////////////////////////////////////////////
            // Render the current game state, this will render the player
            // and the enemies in their initial position.

            RenderGameState();
        }
        //****************************************************************//
        // This function draws the static parts of the level onto the    *//
        // canvas.                                                       *//
        //****************************************************************//
        private void DrawLevel()
        {
            /////////////////////////////////////////////////////////////
            // Compute the width of the canvas, this will be the number
            // of tiles multiplied by the tile size (in pixels).

            int width  = currentLevel.Width * CGameTextures.TILE_SIZE;
            int height = currentLevel.Height * CGameTextures.TILE_SIZE;

            cvsMainScreen.Width  = width;
            cvsMainScreen.Height = height;


            /////////////////////////////////////////////////////////////
            // Loop through the level setting each tiled position on the
            // canvas.

            for (int y = 0; y < currentLevel.Height; y++)
            {
                for (int x = 0; x < currentLevel.Width; x++)
                {
                    /////////////////////////////////////////////////////////
                    // We must create a new instance of the image as an image
                    // can only be added once to a given canvas.

                    Image texture = new Image();
                    texture.Width  = CGameTextures.TILE_SIZE;
                    texture.Height = CGameTextures.TILE_SIZE;


                    //////////////////////////////////////////////////////////
                    // Set the position of the tile, we must convert from tile
                    // coordinates to pixel coordinates.

                    CPoint2i tilePosition = CLevelUtils.GetPixelFromTileCoordinates(new CPoint2i(x, y));


                    Canvas.SetLeft(texture, tilePosition.X);
                    Canvas.SetTop(texture, tilePosition.Y);


                    //////////////////////////////////////////////////////////
                    // Check whether it should be a wall tile or floor tile.

                    if (currentLevel.GetTileType(x, y) == eTileType.Wall)
                    {
                        texture.Source = gameTextures.WallTexture;
                    }
                    else
                    {
                        texture.Source = gameTextures.FloorTexture;
                    }

                    cvsMainScreen.Children.Add(texture);
                }
            }


            ////////////////////////////////////////////////////////////
            // The goal is also static as it does not move so we will
            // also add this now also.

            Image goalImg = new Image();

            goalImg.Width  = CGameTextures.TILE_SIZE;
            goalImg.Height = CGameTextures.TILE_SIZE;

            goalImg.Source = gameTextures.GoalIcon;

            CPoint2i GoalPosition = CLevelUtils.GetPixelFromTileCoordinates(new CPoint2i(currentLevel.GoalPosition.X, currentLevel.GoalPosition.Y));

            Canvas.SetLeft(goalImg, GoalPosition.X);
            Canvas.SetTop(goalImg, GoalPosition.Y);

            cvsMainScreen.Children.Add(goalImg);
        }