/*/////////////////////////////////////////
         * GRAPHICAL DATA & RESOURCE LOADING
         */
        ////////////////////////////////////////
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            this.sprite_batch = new SpriteBatch(this.GraphicsDevice);

            // Load game logo:
            this.logo = this.Content.Load<Texture2D>("Textures/Interface/UI_Logo");
            this.logo_pos = new Vector2((float)Math.Ceiling((this.GraphicsDevice.Viewport.Width - this.logo.Width) / 2.0),
                                        (float)Math.Ceiling((this.GraphicsDevice.Viewport.Height - this.logo.Height) / 2.0));

            // Create Kinect manager:
            this.kinect_manager = new KinectManager(ColorImageFormat.RgbResolution640x480Fps30,
                                                    DepthImageFormat.Resolution640x480Fps30,
                                                    this);

            // Create player cursors:
            this.player_1_cursor = new Cursor(this.Content.Load<Texture2D>("Textures/Interface/UI_CursorHand"),
                                              this.Content.Load<Texture2D>("Textures/Interface/UI_CursorColourIcon"),
                                              this.Content.Load<SpriteFont>("Fonts/Segoe16"),
                                              JointType.HandLeft,
                                              1.0f,
                                              0);
            this.player_2_cursor = new Cursor(this.Content.Load<Texture2D>("Textures/Interface/UI_CursorHand"),
                                              this.Content.Load<Texture2D>("Textures/Interface/UI_CursorColourIcon"),
                                              this.Content.Load<SpriteFont>("Fonts/Segoe16"),
                                              JointType.HandRight,
                                              1.0f,
                                              1);

            // Create main-menu/player-selection buttons (with offset):
            this.mainmenu_button_1player = new Button(this.Content.Load<Texture2D>("Textures/Interface/UI_SinglePlayer"),
                                                      1.2f,
                                                      new Vector2((float)Math.Ceiling((this.GraphicsDevice.Viewport.Width / 2.0f) - 270),
                                                                  (float)Math.Ceiling((this.GraphicsDevice.Viewport.Height - 360) / 2.0f)),
                                                      GestureType.NONE);

            this.mainmenu_button_2player = new Button(this.Content.Load<Texture2D>("Textures/Interface/UI_MultiPlayer"),
                                                      1.2f,
                                                      new Vector2((float)Math.Ceiling((this.GraphicsDevice.Viewport.Width / 2.0f) + 10),
                                                                  (float)Math.Ceiling((this.GraphicsDevice.Viewport.Height - 360) / 2.0f)),
                                                      GestureType.NONE);

            // Create hand selection buttons (with offset):
            this.mainmenu_lefthand_1 = new Button(this.Content.Load<Texture2D>("Textures/Interface/UI_LeftHand"),
                                                  1.2f,
                                                  new Vector2((float)Math.Ceiling((this.GraphicsDevice.Viewport.Width / 2.0f) - 270),
                                                              (float)Math.Ceiling((this.GraphicsDevice.Viewport.Height / 2.0f) - 160)),
                                                  GestureType.NONE);

            this.mainmenu_lefthand_2 = new Button(this.Content.Load<Texture2D>("Textures/Interface/UI_LeftHand"),
                                                  1.2f,
                                                  new Vector2((float)Math.Ceiling((this.GraphicsDevice.Viewport.Width / 2.0f) + 110),
                                                              (float)Math.Ceiling((this.GraphicsDevice.Viewport.Height / 2.0f) - 160)),
                                                  GestureType.NONE);

            this.mainmenu_righthand_1 = new Button(this.Content.Load<Texture2D>("Textures/Interface/UI_RightHand"),
                                                   1.2f,
                                                   new Vector2((float)Math.Ceiling((this.GraphicsDevice.Viewport.Width / 2.0f) - 270),
                                                               (float)Math.Ceiling((this.GraphicsDevice.Viewport.Height / 2.0f))),
                                                   GestureType.NONE);

            this.mainmenu_righthand_2 = new Button(this.Content.Load<Texture2D>("Textures/Interface/UI_RightHand"),
                                                   1.2f,
                                                   new Vector2((float)Math.Ceiling((this.GraphicsDevice.Viewport.Width / 2.0f) + 110),
                                                               (float)Math.Ceiling((this.GraphicsDevice.Viewport.Height / 2.0f))),
                                                   GestureType.NONE);

            // Create start game button (with offset):
            this.mainmenu_startgame = new Button(this.Content.Load<Texture2D>("Textures/Interface/UI_StartGame"),
                                                 1.2f,
                                                 new Vector2((float)Math.Ceiling((this.GraphicsDevice.Viewport.Width - 160) / 2.0f),
                                                             (float)Math.Ceiling((this.GraphicsDevice.Viewport.Height / 2.0f) + 100)),
                                                 GestureType.NONE);

            this.player_1_cursor.selected_colour = Color.Red;
        }
        /*/////////////////////////////////////////
          * GRAPHICAL RESOURCE LOADING
          */
        ///////////////////////////////////////
        public void load(ContentManager p_content,
                         GraphicsDevice p_gfx_device)
        {
            // Load the puzzle game:
            this.marker_texture = p_content.Load<Texture2D>("Textures/Game/PuzzleMarkers");
            Rectangle[,] temp_rects = new Rectangle[across, down];

            // Divide image into sections:
            for (int i = 0; i < this.across; i++)
            {
                for (int j = 0; j < this.down; j++)
                {
                    temp_rects[i, j] = new Rectangle(i * this.width,
                                                     j * this.height,
                                                     this.width,
                                                     this.height);
                }
            }

            // Create puzzle-piece lists:
            if (this.is_two_player)
            {
                // Setup both lists of puzzle pieces:
                this.p1_pieces = new List<PuzzlePiece>();
                this.p2_pieces = new List<PuzzlePiece>();

                for (int i = 0; i < this.across; i++)
                {
                    for (int j = 0; j < this.down; j++)
                    {
                        var temp = temp_rects[i, j];
                        var temp2 = temp;

                        temp2.X = this.image_rect.X + i * this.width;
                        temp2.Y = this.image_rect.Y + j * this.height;

                        if(temp.X < 256)
                        {
                            // Give piece to player 1:
                            this.p1_pieces.Add(new PuzzlePiece(temp, temp2));
                        }
                        else
                        {
                            // Give piece to player 2:
                            this.p2_pieces.Add(new PuzzlePiece(temp, temp2));
                        }
                    }
                }
            }
            else
            {
                // Setup player 1's list of puzzle pieces:
                this.p1_pieces = new List<PuzzlePiece>();
                this.p2_pieces = null;

                for (int i = 0; i < this.across; i++)
                {
                    for (int j = 0; j < this.down; j++)
                    {
                        var temp = temp_rects[i, j];
                        var temp2 = temp;

                        temp2.X = this.image_rect.X + i * this.width;
                        temp2.Y = this.image_rect.Y + j * this.height;

                        // Give piece to player 1:
                        this.p1_pieces.Add(new PuzzlePiece(temp, temp2));
                    }
                }
            }

            this.p1_current_piece = 0;
            this.p2_current_piece = 0;
            this.p1_new_piece = false;
            this.p2_new_piece = false;

            // Create buttons for player 1:
            Vector2 temp_p1_pos = new Vector2(this.image_rect.X - 270.0f,
                                              (float)Math.Ceiling((p_gfx_device.Viewport.Height - 750) / 2.0f) - 10.0f);

            this.p1_next_piece = new Button(p_content.Load<Texture2D>("Textures/Interface/UI_ButtonUp"),
                                            1.2f,
                                            temp_p1_pos,
                                            GestureType.NONE);

            temp_p1_pos.Y += 150;

            // Position player 1's pieces;
            foreach(var piece in this.p1_pieces)
            {
                piece.destination_rect.X = (int)temp_p1_pos.X + 50;
                piece.destination_rect.Y = (int)temp_p1_pos.Y + 100;
            }

            temp_p1_pos.Y += 150 * 3;

            this.p1_prev_piece = new Button(p_content.Load<Texture2D>("Textures/Interface/UI_ButtonDown"),
                                            1.2f,
                                            temp_p1_pos,
                                            GestureType.NONE);

            // Create buttons for player 2:
            Vector2 temp_p2_pos = new Vector2(this.image_rect.X + this.image_rect.Width + 60.0f,
                                              (float)Math.Ceiling((p_gfx_device.Viewport.Height - 750) / 2.0f) - 10.0f);

            this.p2_next_piece = new Button(p_content.Load<Texture2D>("Textures/Interface/UI_ButtonUp"),
                                            1.2f,
                                            temp_p2_pos,
                                            GestureType.NONE);
            temp_p2_pos.Y += 150;

            // Positions player 2's pieces:
            if (this.is_two_player &&
                this.p2_pieces != null)
            {
                foreach (var piece in this.p2_pieces)
                {
                    piece.destination_rect.X = (int)temp_p2_pos.X + 40;
                    piece.destination_rect.Y = (int)temp_p2_pos.Y + 100;
                }
            }

            temp_p2_pos.Y += 150 * 3;

            this.p2_prev_piece = new Button(p_content.Load<Texture2D>("Textures/Interface/UI_ButtonDown"),
                                            1.2f,
                                            temp_p2_pos,
                                            GestureType.NONE);
        }
        /*/////////////////////////////////////////
          * GRAPHICAL RESOURCE LOADING
          */
        ///////////////////////////////////////
        public void load(ContentManager p_content,
                         GraphicsDevice p_gfx_device)
        {
            int current_image = this.rand.Next(0, this.valid_pictures.Length);

            // Load the image:
            Texture2D image_base = p_content.Load<Texture2D>("Textures/Game/" + this.valid_pictures[current_image] + "_Sections");
            int base_size = image_base.Width * image_base.Height;

            Color[] image_colours = new Color[base_size];

            for (int i = 0; i < image_colours.Length; i++)
            {
                image_colours[i] = Color.White;
            }

            // Load image outline, setup blank white paintable image, position with offset:
            this.image_outlines = p_content.Load<Texture2D>("Textures/Game/" + this.valid_pictures[current_image] + "_Outline");
            this.image_rect = new Rectangle((int)Math.Ceiling((p_gfx_device.Viewport.Width - image_base.Width) / 2.0f),
                                            (int)Math.Ceiling(((p_gfx_device.Viewport.Height - image_base.Height) / 2.0f) - 60),
                                            image_base.Width,
                                            image_base.Height);

            this.image_paintable = new Texture2D(p_gfx_device, image_base.Width, image_base.Height);
            this.image_paintable.SetData(image_colours);

            // Convert base image to paint sections:
            image_base.GetData(image_colours);
            Color[] unique_colours = this.findUniqueColours(image_colours);
            this.image_sections = new PaintSection[unique_colours.Length]; // create a paint section for each unique colour

            for (int i = 0; i < image_sections.Length; i++)
            {
                this.image_sections[i] = new PaintSection(base_size,
                                                          unique_colours[i],
                                                          1.2f,
                                                          GestureType.NONE);
                this.image_sections[i].createSectionMask(image_colours);
            }

            this.paint_colours = image_colours;
            for (int i = 0; i < this.paint_colours.Length; i++) this.paint_colours[i] = Color.White;

            // Create finish minigame button (positioned from the bottom of the base image with offset):
            this.finish_confirm = new Button(p_content.Load<Texture2D>("Textures/Interface/UI_ButtonConfirm"),
                                             1.2f,
                                             new Vector2((float)Math.Ceiling((p_gfx_device.Viewport.Width - 210) / 2.0f),
                                                         this.image_rect.Y + this.image_rect.Height + 20),
                                             GestureType.NONE);

            // Create colour selection & scroll buttons for player 1:
            Vector2 temp_p1_pos = new Vector2(this.image_rect.X - 270.0f,
                                              (float)Math.Ceiling((p_gfx_device.Viewport.Height - 750) / 2.0f) - 10.0f);

            this.p1_next_col = new Button(p_content.Load<Texture2D>("Textures/Interface/UI_ButtonUp"),
                                          1.2f,
                                          temp_p1_pos,
                                          GestureType.NONE);

            this.p1_cbuttons = new ColourButton[3];
            temp_p1_pos.Y += 150;

            for (int i = 0; i < this.p1_cbuttons.Length; i++)
            {
                this.p1_cbuttons[i] = new ColourButton(p_content.Load<Texture2D>("Textures/Interface/UI_ColourButton"),
                                                       1.2f,
                                                       temp_p1_pos,
                                                       GestureType.NONE,
                                                       this.valid_button_colours[this.p1_colours[i]]);

                // Next button position:
                temp_p1_pos.Y += 150;
            }

            this.p1_prev_col = new Button(p_content.Load<Texture2D>("Textures/Interface/UI_ButtonDown"),
                                          1.2f,
                                          temp_p1_pos,
                                          GestureType.NONE);

            // Create colour selection & scroll buttons for player 2:
            Vector2 temp_p2_pos = new Vector2(this.image_rect.X + this.image_rect.Width + 60.0f,
                                              (float)Math.Ceiling((p_gfx_device.Viewport.Height - 750) / 2.0f) - 10.0f);

            this.p2_next_col = new Button(p_content.Load<Texture2D>("Textures/Interface/UI_ButtonUp"),
                                          1.2f,
                                          temp_p2_pos,
                                          GestureType.NONE);

            this.p2_cbuttons = new ColourButton[3];
            temp_p2_pos.Y += 150;

            for (int i = 0; i < this.p2_cbuttons.Length; i++)
            {
                this.p2_cbuttons[i] = new ColourButton(p_content.Load<Texture2D>("Textures/Interface/UI_ColourButton"),
                                                       1.2f,
                                                       temp_p2_pos,
                                                       GestureType.NONE,
                                                       this.valid_button_colours[this.p1_colours[i]]);

                // Next button position:
                temp_p2_pos.Y += 150;
            }

            this.p2_prev_col = new Button(p_content.Load<Texture2D>("Textures/Interface/UI_ButtonDown"),
                                          1.2f,
                                          temp_p2_pos,
                                          GestureType.NONE);
        }