void GameController::OpenLocalSaveWindow(bool asCurrent)
{
    Simulation * sim = gameModel->GetSimulation();
    GameSave * gameSave = sim->Save();
    if(!gameSave)
    {
        new ErrorMessage("Error", "Unable to build save.");
    }
    else
    {
        sim->SaveSimOptions(gameSave);
        gameSave->paused = gameModel->GetPaused();

        SaveFile tempSave("");
        if (gameModel->GetSaveFile())
        {
            tempSave.SetFileName(gameModel->GetSaveFile()->GetName());
            tempSave.SetDisplayName(gameModel->GetSaveFile()->GetDisplayName());
        }
        tempSave.SetGameSave(gameSave);

        if (!asCurrent || !gameModel->GetSaveFile())
        {
            class LocalSaveCallback: public FileSavedCallback
            {
                GameController * c;
            public:
                LocalSaveCallback(GameController * _c): c(_c) {}
                virtual  ~LocalSaveCallback() {}
                virtual void FileSaved(SaveFile* file)
                {
                    c->gameModel->SetSaveFile(file);
                }
            };

            new LocalSaveActivity(tempSave, new LocalSaveCallback(this));
        }
        else if (gameModel->GetSaveFile())
        {
            gameModel->SetSaveFile(&tempSave);
            Client::Ref().MakeDirectory(LOCAL_SAVE_DIR);
            if (Client::Ref().WriteFile(gameSave->Serialise(), gameModel->GetSaveFile()->GetName()))
                new ErrorMessage("Error", "Unable to write save file.");
            else
                gameModel->SetInfoTip("Saved Successfully");
        }
    }
}
void GameController::OpenLocalSaveWindow(bool asCurrent)
{
	Simulation * sim = gameModel->GetSimulation();
	GameSave * gameSave = sim->Save();
	gameSave->paused = gameModel->GetPaused();
	gameSave->gravityMode = sim->gravityMode;
	gameSave->airMode = sim->air->airMode;
	gameSave->legacyEnable = sim->legacy_enable;
	gameSave->waterEEnabled = sim->water_equal_test;
	gameSave->gravityEnable = sim->grav->ngrav_enable;
	gameSave->aheatEnable = sim->aheat_enable;
	if(!gameSave)
	{
		new ErrorMessage("Error", "Unable to build save.");
	}
	else
	{
		std::string filename = "";
		if (gameModel->GetSaveFile())
			filename = gameModel->GetSaveFile()->GetDisplayName();
		SaveFile tempSave(filename);
		tempSave.SetGameSave(gameSave);

		if (!asCurrent || !gameModel->GetSaveFile())
		{
			class LocalSaveCallback: public FileSavedCallback
			{
				GameController * c;
			public:
				LocalSaveCallback(GameController * _c): c(_c) {}
				virtual  ~LocalSaveCallback() {};
				virtual void FileSaved(SaveFile* file)
				{
					c->gameModel->SetSaveFile(file);
				}
			};

			new LocalSaveActivity(tempSave, new LocalSaveCallback(this));
		}
		else if (gameModel->GetSaveFile())
		{
			Client::Ref().MakeDirectory(LOCAL_SAVE_DIR);
			if (Client::Ref().WriteFile(gameSave->Serialise(), gameModel->GetSaveFile()->GetName()))
				new ErrorMessage("Error", "Unable to write save file.");
		}
	}
}
void LocalSaveActivity::saveWrite(ByteString finalFilename)
{
	Client::Ref().MakeDirectory(LOCAL_SAVE_DIR);
	GameSave *gameSave = save.GetGameSave();
	Json::Value localSaveInfo;
	localSaveInfo["type"] = "localsave";
	localSaveInfo["username"] = Client::Ref().GetAuthUser().Username;
	localSaveInfo["title"] = finalFilename;
	localSaveInfo["date"] = (Json::Value::UInt64)time(NULL);
	Client::Ref().SaveAuthorInfo(&localSaveInfo);
	gameSave->authors = localSaveInfo;
	std::vector<char> saveData = gameSave->Serialise();
	if (saveData.size() == 0)
		new ErrorMessage("Error", "Unable to serialize game data.");
	else if (Client::Ref().WriteFile(saveData, finalFilename))
		new ErrorMessage("Error", "Unable to write save file.");
	else
	{
		callback->FileSaved(&save);
		Exit();
	}
}