/// <summary>
    /// Load from database unless the local cache has the data
    /// </summary>
    public override void Load()
    {
        Get_Modified_Date();
        DateTime DB_Date = getDatabaseValue <DateTime>("MAX(DT_Stamp)", "SELECT MAX(DT_Stamp) FROM tbl_Save_Data WHERE Unique_Identifier = '" + d.DUI + "';");

        d.Log(true, "Loading Game State : Local Cache > " + Modified + ", Database > " + DB_Date + ((Modified >= DB_Date) ?
                                                                                                    " | Attempting to restore Game State from local cache." : " | Attempting to restore Game State from database."), false);
        if (Modified >= DB_Date)
        {
            #region Use Local cache data
            try
            {
                BinaryFormatter bf = new BinaryFormatter();
                file = new FileStream(d.path + "/" + File_Name, FileMode.OpenOrCreate);
                BinaryReader br = new BinaryReader(file);
                Modified            = Convert.ToDateTime(br.ReadString());
                Current_Medals      = br.ReadByte();
                Total_Medals_Earned = br.ReadByte();
                Current_Gems        = br.ReadInt32();
                Total_Gems_Earned   = br.ReadInt32();
                Level_Data.Clear();
                int Level_Count = br.ReadInt32();
                for (int i = 0; i < Level_Count; i++)
                {
                    Level_Data.Add((Level_Info)bf.Deserialize(br.BaseStream));
                }
                br.Close();
                file.Close();
            }
            catch (Exception e)
            {
                d.Log(false, "Loading from local cache failed: " + e.Message + " Attempting to load from database instead.", true);
                try
                {
                    reader = queryDatabase("SELECT * FROM tbl_Save_Data WHERE Unique_Identifier = '" + d.DUI + "';");
                    if (reader == null)
                    {
                        d.Log(false, "Loading from database failed: The MySqlDataReader returned null, please check the SQL Syntax is correct and ensure there is data to pull! " +
                              "| UNABLE TO LOAD GAME STATE!", true);
                        return;
                    }
                    if (reader.Read())
                    {
                        Current_Medals      = reader.GetByte("Current_Medals");
                        Total_Medals_Earned = reader.GetByte("Total_Medals_Earned");
                        Current_Gems        = reader.GetInt32("Current_Gems");
                        Total_Gems_Earned   = reader.GetInt32("Total_Gems_Earned");
                        int Save_ID = reader.GetInt32("Save_ID");
                        Level_Data.Clear();
                        reader = queryDatabase("SELECT " +
                                               "tbl_Level_Save_Data.Medals_Earned AS ME, " +
                                               "tbl_Map_Data.Level_Name AS LN, " +
                                               "tbl_Map_Data.Level_Number AS MI " +
                                               "FROM tbl_Level_Save_Data " +
                                               "LEFT JOIN tbl_Map_Data " +
                                               "ON tbl_Level_Save_Data.Map_ID = tbl_Map_Data.Level_Number " +
                                               "WHERE tbl_Level_Save_Data.Save_ID = " + Save_ID + ";");
                        if (reader.HasRows)
                        {
                            while (reader.Read())
                            {
                                Level_Data.Add(new Level_Info(reader["LN"].ToString(), reader.GetByte("MI"), reader.GetByte("ME")));
                            }
                        }
                    }
                    else
                    {
                        d.Log(false, "Loading from database failed: The MySqlDataReader returned no records | UNABLE TO LOAD GAME STATE!", true);
                        return;
                    }
                    Modified = DB_Date;
                    d.Log(true, "Loading from database successful.", false);
                    return;
                }
                catch (Exception ex)
                {
                    d.Log(false, "Loading from database failed: " + ex.Message + " | UNABLE TO LOAD GAME STATE!", true);
                }
            }
            finally
            {
                if (file != null)
                {
                    file.Close();
                }
            }
            d.Log(true, "Loading from local cache successful: " + Path.Combine(d.path, File_Name), false);
            #endregion
        }
        else
        {
            #region Use Database data
            try
            {
                reader = queryDatabase("SELECT * FROM tbl_Save_Data WHERE Unique_Identifier = '" + d.DUI + "';");
                if (reader == null)
                {
                    d.Log(false, "Loading from database failed: The MySqlDataReader returned null, please check the SQL Syntax is correct and ensure there is data to pull! " +
                          "Attempting to load from local cache instead.", true);
                    try
                    {
                        // Use local cache data instead
                        BinaryFormatter bf = new BinaryFormatter();
                        file = new FileStream(d.path + "/" + File_Name, FileMode.OpenOrCreate);
                        BinaryReader br = new BinaryReader(file);
                        Modified            = Convert.ToDateTime(br.ReadString());
                        Current_Medals      = br.ReadByte();
                        Total_Medals_Earned = br.ReadByte();
                        Current_Gems        = br.ReadInt32();
                        Total_Gems_Earned   = br.ReadInt32();
                        Level_Data.Clear();
                        int Level_Count = br.ReadInt32();
                        for (int i = 0; i < Level_Count; i++)
                        {
                            Level_Data.Add((Level_Info)bf.Deserialize(br.BaseStream));
                        }
                        d.Log(true, "Loading from local cache successful.", false);
                        br.Close();
                        file.Close();
                    }
                    catch (Exception e)
                    {
                        d.Log(false, "Loading from local cache failed: " + e.Message + " | UNABLE TO LOAD GAME STATE!", true);
                    }
                    finally
                    {
                        if (file != null)
                        {
                            file.Close();
                        }
                    }
                    return;
                }
                if (reader.Read())
                {
                    Current_Medals      = reader.GetByte("Current_Medals");
                    Total_Medals_Earned = reader.GetByte("Total_Medals_Earned");
                    Current_Gems        = reader.GetInt32("Current_Gems");
                    Total_Gems_Earned   = reader.GetInt32("Total_Gems_Earned");
                    int Save_ID = reader.GetInt32("Save_ID");
                    Level_Data.Clear();
                    reader = queryDatabase("SELECT " +
                                           "tbl_Level_Save_Data.Medals_Earned AS ME, " +
                                           "tbl_Map_Data.Level_Name AS LN, " +
                                           "tbl_Map_Data.Level_Number AS MI " +
                                           "FROM tbl_Level_Save_Data " +
                                           "LEFT JOIN tbl_Map_Data " +
                                           "ON tbl_Level_Save_Data.Map_ID = tbl_Map_Data.Level_Number " +
                                           "WHERE tbl_Level_Save_Data.Save_ID = " + Save_ID + ";");
                    if (reader.HasRows)
                    {
                        while (reader.Read())
                        {
                            Level_Data.Add(new Level_Info(reader["LN"].ToString(), reader.GetByte("MI"), reader.GetByte("ME")));
                        }
                    }
                }
                else
                {
                    d.Log(false, "Loading from database failed: The MySqlDataReader returned no records | UNABLE TO LOAD GAME STATE!", true);
                    return;
                }
                Modified = DB_Date;
                d.Log(true, "Loading from database successful.", false);
                return;
            }
            catch (Exception ex)
            {
                d.Log(false, "Loading from database failed: " + ex.Message + " | UNABLE TO LOAD GAME STATE!", true);
            }
            #endregion
        }
        // For testing purposes:
        d.Log(true, "Game State Contents: ", false);
        d.Log(true, "Current Medals: " + Current_Medals + ", Total Medals Earned: " + total_Medals_Earned +
              ", Current Gems: " + Current_Gems + ", Total Gems Earned: " + Total_Gems_Earned +
              ", Modified DateTime: " + Modified, false);
        foreach (Level_Info level in Level_Data)
        {
            d.Log(true, "Level #" + level.Number + ", '" + level.Name + "', Medals: " + level.Medals, false);
        }
    }