public void TryLoadGameElseNewGame() { LevelData.Data data = LevelData.LoadGame(Application.persistentDataPath + Control.userDataFolder + Control.userLevelSaveFile); //Only load if a save file exists. If a save file doesn't exist, generate a new game if (data == null) { //Debug.Log("No save exists; generating new game"); GenerateGame(GENERATION_TYPE_NEW_GAME); } else { //Debug.Log("Save exists; loading game"); //VERSE //Centre Star SpawnCBodyStar(Vector3.zero, data.controlCentreStarName); //Verse position relative to origin verseSpace.transform.position = new Vector3( data.controlVerseSpacePosition[0], data.controlVerseSpacePosition[1], data.controlVerseSpacePosition[2] ); //Planetoids for (byte i = 0; i < data.controlPlanetoidQuantity; i++) { if (data.controlPlanetoidHasStation[i]) { //Slice the array so that we have only the upgrade offers' indexes (since we are already looping through each planetoid) int[] controlScriptPlanetoidStationUpgradeIndex = new int[StationDocking.upgradeButtons]; for (int i2 = 0; i2 < StationDocking.upgradeButtons; i2++) { controlScriptPlanetoidStationUpgradeIndex[i2] = data.controlPlanetoidStationUpgradeIndex[i, i2]; } SpawnPlanetoidManually( new Vector3( data.controlPlanetoidPosition[i, 0], data.controlPlanetoidPosition[i, 1], data.controlPlanetoidPosition[i, 2] ), new Vector3( data.controlPlanetoidVelocity[i, 0], data.controlPlanetoidVelocity[i, 1], data.controlPlanetoidVelocity[i, 2] ), data.controlPlanetoidName[i], data.controlPlanetoidHasStation[i], data.controlPlanetoidStationTitle[i], false, //generate offers? data.controlPlanetoidStationPricePlatinoid[i], data.controlPlanetoidStationPricePreciousMetal[i], data.controlPlanetoidStationPriceWater[i], controlScriptPlanetoidStationUpgradeIndex ); } else { SpawnPlanetoidManually( new Vector3( data.controlPlanetoidPosition[i, 0], data.controlPlanetoidPosition[i, 1], data.controlPlanetoidPosition[i, 2] ), new Vector3( data.controlPlanetoidVelocity[i, 0], data.controlPlanetoidVelocity[i, 1], data.controlPlanetoidVelocity[i, 2] ), data.controlPlanetoidName[i], data.controlPlanetoidHasStation[i], null, false, //generate offers? 0f, 0f, 0f, null ); } } //Asteroids for (byte i = 0; i < data.controlAsteroidQuantity; i++) { SpawnAsteroidManually( new Vector3( data.controlAsteroidPosition[i, 0], data.controlAsteroidPosition[i, 1], data.controlAsteroidPosition[i, 2] ), new Vector3( data.controlAsteroidVelocity[i, 0], data.controlAsteroidVelocity[i, 1], data.controlAsteroidVelocity[i, 2] ), data.controlAsteroidSize[i], data.controlAsteroidType[i], data.controlAsteroidHealth[i] ); } //PLAYER SpawnPlayer( GENERATION_TYPE_LOADED_GAME, new Vector3( data.playerPosition[0], data.playerPosition[1], data.playerPosition[2] ) ); Player playerScript = instancePlayer.GetComponentInChildren <Player>(); //Player properties playerScript.upgradeLevels = data.playerUpgrades; playerScript.UpdateUpgrades(); playerScript.vitalsHealth = data.playerVitalsHealth; Player.destroyed = data.playerDestroyed; playerScript.vitalsFuel = data.playerVitalsFuel; playerScript.currency = data.playerCurrency; playerScript.ore = data.playerOre; //Asteroids (generate) GenerateCBodiesAsteroids(Random.Range(ASTEROID_CLUSTERS_RANGE_LOW, ASTEROID_CLUSTERS_RANGE_HIGH), instanceCentreStar); } //Update UI to reflect loaded data control.ui.UpdateAllPlayerResourcesUI(); }
public void SaveGame() { //Debug.Log("Saving game"); //World properties //Planetoids CBodyPlanetoid[] planetoidArray = FindObjectsOfType <CBodyPlanetoid>(); float[,] controlScriptPlanetoidPosition = new float[planetoidArray.Length, 3]; float[,] controlScriptPlanetoidVelocity = new float[planetoidArray.Length, 3]; string[] controlScriptPlanetoidName = new string[planetoidArray.Length]; bool[] controlScriptPlanetoidHasStation = new bool[planetoidArray.Length]; string[] controlScriptPlanetoidStationTitle = new string[planetoidArray.Length]; float[] controlScriptPlanetoidPricePlatinoid = new float[planetoidArray.Length]; float[] controlScriptPlanetoidPricePreciousMetal = new float[planetoidArray.Length]; float[] controlScriptPlanetoidPriceWater = new float[planetoidArray.Length]; int[,] controlScriptPlanetoidStationUpgradeIndex = new int[planetoidArray.Length, StationDocking.upgradeButtons]; byte planetoidArrayIndex = 0; foreach (CBodyPlanetoid planetoid in planetoidArray) { //Position controlScriptPlanetoidPosition[planetoidArrayIndex, 0] = planetoid.transform.position.x; controlScriptPlanetoidPosition[planetoidArrayIndex, 1] = planetoid.transform.position.y; controlScriptPlanetoidPosition[planetoidArrayIndex, 2] = planetoid.transform.position.z; //Velocity controlScriptPlanetoidVelocity[planetoidArrayIndex, 0] = planetoid.GetComponent <Rigidbody>().velocity.x; controlScriptPlanetoidVelocity[planetoidArrayIndex, 1] = planetoid.GetComponent <Rigidbody>().velocity.y; controlScriptPlanetoidVelocity[planetoidArrayIndex, 2] = planetoid.GetComponent <Rigidbody>().velocity.z; //Name controlScriptPlanetoidName[planetoidArrayIndex] = planetoid.GetComponent <CelestialName>().title; //Station controlScriptPlanetoidHasStation[planetoidArrayIndex] = planetoid.GetComponent <CBodyPlanetoid>().hasStation; if (planetoid.hasStation && planetoid.instancedStation != null) { controlScriptPlanetoidStationTitle[planetoidArrayIndex] = planetoid.instancedStation.GetComponent <HumanName>().title; controlScriptPlanetoidPricePlatinoid[planetoidArrayIndex] = planetoid.instancedStation.GetComponentInChildren <StationDocking>().pricePlatinoid; controlScriptPlanetoidPricePreciousMetal[planetoidArrayIndex] = planetoid.instancedStation.GetComponentInChildren <StationDocking>().pricePreciousMetal; controlScriptPlanetoidPriceWater[planetoidArrayIndex] = planetoid.instancedStation.GetComponentInChildren <StationDocking>().priceWater; //Concatenate the array so that we have the planetoid data along with the data for each upgrade offer's index for (int i = 0; i < StationDocking.upgradeButtons; i++) { controlScriptPlanetoidStationUpgradeIndex[planetoidArrayIndex, i] = planetoid.instancedStation.GetComponentInChildren <StationDocking>().upgradeIndexAtButton[i]; } } else { controlScriptPlanetoidStationTitle[planetoidArrayIndex] = null; controlScriptPlanetoidPricePlatinoid[planetoidArrayIndex] = 0f; controlScriptPlanetoidPricePreciousMetal[planetoidArrayIndex] = 0f; controlScriptPlanetoidPriceWater[planetoidArrayIndex] = 0f; //Concatenate the array so that we have the planetoid data along with the data for each upgrade offer's index for (int i = 0; i < StationDocking.upgradeButtons; i++) { controlScriptPlanetoidStationUpgradeIndex[planetoidArrayIndex, i] = 0; } } //Increment planetoidArrayIndex++; } //Asteroids CBodyAsteroid[] asteroidArray = FindObjectsOfType <CBodyAsteroid>(); float[,] controlScriptAsteroidPosition = new float[asteroidArray.Length, 3]; float[,] controlScriptAsteroidVelocity = new float[asteroidArray.Length, 3]; string[] controlScriptAsteroidSize = new string[asteroidArray.Length]; byte[] controlScriptAsteroidType = new byte[asteroidArray.Length]; byte[] controlScriptAsteroidHealth = new byte[asteroidArray.Length]; byte asteroidArrayIndex = 0; foreach (CBodyAsteroid asteroid in asteroidArray) { //Position controlScriptAsteroidPosition[asteroidArrayIndex, 0] = asteroid.transform.position.x; controlScriptAsteroidPosition[asteroidArrayIndex, 1] = asteroid.transform.position.y; controlScriptAsteroidPosition[asteroidArrayIndex, 2] = asteroid.transform.position.z; //Velocity controlScriptAsteroidVelocity[asteroidArrayIndex, 0] = asteroid.GetComponent <Rigidbody>().velocity.x; controlScriptAsteroidVelocity[asteroidArrayIndex, 1] = asteroid.GetComponent <Rigidbody>().velocity.y; controlScriptAsteroidVelocity[asteroidArrayIndex, 2] = asteroid.GetComponent <Rigidbody>().velocity.z; //Size controlScriptAsteroidSize[asteroidArrayIndex] = asteroid.sizeClassDisplay; //Type controlScriptAsteroidType[asteroidArrayIndex] = asteroid.type; //Health controlScriptAsteroidHealth[asteroidArrayIndex] = asteroid.health; //Increment asteroidArrayIndex++; } //Verse float[] controlScriptVersePosition = new float[3]; controlScriptVersePosition[0] = verseSpace.transform.position.x; controlScriptVersePosition[1] = verseSpace.transform.position.y; controlScriptVersePosition[2] = verseSpace.transform.position.z; //Player Player playerScript = instancePlayer.GetComponentInChildren <Player>(); float[] playerScriptPlayerPosition = new float[3]; playerScriptPlayerPosition[0] = playerScript.transform.position.x; playerScriptPlayerPosition[1] = playerScript.transform.position.y; playerScriptPlayerPosition[2] = playerScript.transform.position.z; LevelData.Data data = new LevelData.Data { //World properties //Planetoids controlPlanetoidQuantity = (byte)planetoidArray.Length, controlPlanetoidPosition = controlScriptPlanetoidPosition, controlPlanetoidVelocity = controlScriptPlanetoidVelocity, controlPlanetoidName = controlScriptPlanetoidName, controlPlanetoidHasStation = controlScriptPlanetoidHasStation, //Planetoids: stations controlPlanetoidStationTitle = controlScriptPlanetoidStationTitle, controlPlanetoidStationPricePlatinoid = controlScriptPlanetoidPricePlatinoid, controlPlanetoidStationPricePreciousMetal = controlScriptPlanetoidPricePreciousMetal, controlPlanetoidStationPriceWater = controlScriptPlanetoidPriceWater, controlPlanetoidStationUpgradeIndex = controlScriptPlanetoidStationUpgradeIndex, //Asteroids controlAsteroidQuantity = asteroidArray.Length, controlAsteroidPosition = controlScriptAsteroidPosition, controlAsteroidVelocity = controlScriptAsteroidVelocity, controlAsteroidSize = controlScriptAsteroidSize, controlAsteroidType = controlScriptAsteroidType, controlAsteroidHealth = controlScriptAsteroidHealth, //Centre star controlCentreStarName = instanceCentreStar.GetComponent <CelestialName>().title, //Verse space controlVerseSpacePosition = controlScriptVersePosition, //Player properties playerPosition = playerScriptPlayerPosition, playerUpgrades = playerScript.upgradeLevels, playerVitalsHealth = playerScript.vitalsHealth, playerDestroyed = Player.destroyed, playerVitalsFuel = playerScript.vitalsFuel, playerCurrency = playerScript.currency, playerOre = playerScript.ore }; LevelData.SaveGame(Application.persistentDataPath + Control.userDataFolder + Control.userLevelSaveFile, data); }