public GameSaveData(GameManager.GeneralGameData generalGameData, Building.BuildingData[] buildingsData, SpaceshipManager.SpaceshipData[] spaceshipsData, Level.LevelData reachedLevelData, ResourcesManager.ResourceData[] resourcesData, BuildingManager.UnlockedBuildingData[] unlockedBuildingsData, TechTreeManager.TechnologyData[] technologiesData, MegaStructureManager.MegaStructuresData megaStructuresData, PopulationManager.PopulationData populationData)
 {
     this.generalGameData       = generalGameData;
     this.buildingsData         = buildingsData;
     this.spaceshipsData        = spaceshipsData;
     this.reachedLevelData      = reachedLevelData;
     this.resourcesData         = resourcesData;
     this.unlockedBuildingsData = unlockedBuildingsData;
     this.technologiesData      = technologiesData;
     this.megaStructuresData    = megaStructuresData;
     this.populationData        = populationData;
 }
    public void SetupSavedData()
    {
        Debug.Log("SetupSavedData");
        Building.BuildingData[]          buildingsData   = gameSetupParameters.gameSaveData.buildingsData;
        GameManager.GeneralGameData      generalGameData = gameSetupParameters.gameSaveData.generalGameData;
        SpaceshipManager.SpaceshipData[] spaceshipsData  = gameSetupParameters.gameSaveData.spaceshipsData;
        Level.LevelData reachedLevelData = gameSetupParameters.gameSaveData.reachedLevelData;
        ResourcesManager.ResourceData[]         resourcesData         = gameSetupParameters.gameSaveData.resourcesData;
        BuildingManager.UnlockedBuildingData[]  unlockedBuildingsData = gameSetupParameters.gameSaveData.unlockedBuildingsData;
        TechTreeManager.TechnologyData[]        technologiesData      = gameSetupParameters.gameSaveData.technologiesData;
        MegaStructureManager.MegaStructuresData megaStructuresData    = gameSetupParameters.gameSaveData.megaStructuresData;
        PopulationManager.PopulationData        populationData        = gameSetupParameters.gameSaveData.populationData;

        if (buildingsData != null)
        {
            SetupSavedBuildings(buildingsData);
        }

        if (generalGameData != null)
        {
            SetupGeneralParameters(generalGameData);
        }

        if (reachedLevelData != null)
        {
            SetupReachedLevelParameters(reachedLevelData);
        }

        if (resourcesData != null)
        {
            SetupResourcesData(resourcesData);
        }

        if (technologiesData != null)
        {
            SetupTechnologies(technologiesData);
        }

        if (spaceshipsData != null)
        {
            SetupSpaceships(spaceshipsData);
        }

        if (megaStructuresData != null)
        {
            SetupMegaStructures(megaStructuresData);
        }

        if (populationData != null)
        {
            SetupPopulationData(populationData);
        }
    }
    public GameManager.GeneralGameData GatherGeneralGameData()
    {
        int  levelReached        = LevelManager.instance.currentLevelNumber;
        int  unlockedDisksNb     = SurroundingAreasManager.instance.unlockedDisksNb;
        int  score               = ScoreManager.instance.score;
        int  hits                = InfoManager.instance.nbMeteorCollisions;
        int  planetLife          = (int)ScoreManager.instance.planetLife;
        int  experiencePoints    = ScoreManager.instance.experiencePoints;
        int  artifactsNb         = ScoreManager.instance.artifactsNb;
        bool timerOptionEnabled  = TimeManager.instance.isTimerEnabled;
        bool hasGameOverOccured  = ScoreManager.instance.gameOverHappened;
        bool infiniteModeEnabled = GameManager.instance.IsInfiniteModeEnabled();

        //Debug.Log("Saving game variables | LevelReached [" + levelReached + "] | UnlockedDisksNb [" + unlockedDisksNb + "]");

        GameManager.GeneralGameData gameSavedVariables = new GameManager.GeneralGameData(levelReached, unlockedDisksNb, score, hits, planetLife, experiencePoints, artifactsNb, timerOptionEnabled, hasGameOverOccured, infiniteModeEnabled);
        return(gameSavedVariables);
    }
    public void SaveGameStateIntoSlot(int saveGameSlotIndex)
    {
        Debug.Log("Saving game state...");

        string saveTime = DateTime.Now.ToString("yyyy-MM-dd h:mm:ss tt");

        GameManager.GeneralGameData      generalData    = GatherGeneralGameData();
        Building.BuildingData[]          buildingDatas  = GatherBuildingsData();
        SpaceshipManager.SpaceshipData[] spaceshipsData = GatherSpaceshipsData();
        Level.LevelData reachedLevelData = GatherReachedLevelData();
        ResourcesManager.ResourceData[]         resourcesData         = GatherResourcesData();
        BuildingManager.UnlockedBuildingData[]  unlockedBuildingsData = GatherUnlockedBuildingsData();
        TechTreeManager.TechnologyData[]        technologiesData      = GatherTechnologiesData();
        MegaStructureManager.MegaStructuresData megaStructuresData    = GatherMegaStructuresData();
        PopulationManager.PopulationData        populationData        = GatherPopulationData();

        // Build Game Save Data
        GameSaveData gameSaveData        = new GameSaveData(generalData, buildingDatas, spaceshipsData, reachedLevelData, resourcesData, unlockedBuildingsData, technologiesData, megaStructuresData, populationData);
        int          currentLevelReached = LevelManager.instance.currentLevelNumber;

        // Binary Formatter + Stream
        BinaryFormatter bf       = new BinaryFormatter();
        string          fileName = (gameSaveFileName + saveGameSlotIndex + gameSaveFileExtension);

        Debug.Log("File Name: " + fileName);
        FileStream stream = new FileStream(Application.persistentDataPath + "/" + fileName, FileMode.Create);

        // Write chosen save file
        bf.Serialize(stream, gameSaveData);
        stream.Close();

        // Update SaveFilesInfo general object
        SavedGameFilesInfoData.SaveFileInfo saveFileInfo = new SavedGameFilesInfoData.SaveFileInfo(saveGameSlotIndex, true, saveTime);
        Debug.Log("Created new SaveFileInfo | SlotIndex [" + saveGameSlotIndex + "] | IsUsed [" + true + "] | SaveTime [" + saveTime + "]");

        globalSavedGameInfoData.UpdateSavedGameFilesInfoForIndex(saveFileInfo);

        // Update indicator in save panel
        SaveGamePanel.instance.UpdateSaveSlotInfo(saveFileInfo);

        // Write game saves info file
        WriteSaveFilesInfo();
    }
    public void SetupGeneralParameters(GameManager.GeneralGameData generalGameData)
    {
        int  score               = generalGameData.score;
        int  hits                = generalGameData.hits;
        int  planetLife          = generalGameData.planetLife;
        int  unlockedDisksNb     = generalGameData.unlockedDisks;
        int  experiencePoints    = generalGameData.experiencePoints;
        int  artifactsNb         = generalGameData.artifactsNb;
        bool timerEnabled        = generalGameData.timerEnabled;
        bool gameOverOccured     = generalGameData.hasGameOverOccured;
        bool infiniteModeEnabled = generalGameData.infiniteModeEnabled;

        //Debug.Log("SetupGeneralParameters | Score [" + score + "] | Hits [" + hits + "] | UnlockedDisks [" + unlockedDisksNb + "]");

        ScoreManager.instance.SetScore(score);
        ScoreManager.instance.SetExperiencePointsAndArtifactsNb(experiencePoints, artifactsNb);
        ScoreManager.instance.SetPlanetLife(planetLife);
        InfoManager.instance.SetMeteorCollisionsValue(hits);
        SurroundingAreasManager.instance.SetUnlockedDisksNb(unlockedDisksNb);
        TimeManager.instance.SetTimerEnabled(timerEnabled);
        GameManager.instance.SetInfiniteMode(infiniteModeEnabled);
        ScoreManager.instance.SetGameOverHappened(gameOverOccured);
    }