/* * Loads the game state of the turn in the list of saves to revert the game to */ public static void LoadGame() { // The turn number from the Pause Menu UI slider that we want to revert the game to int turn = (int)GameManager.Instance.pauseMenu.turnSlider.value; // List counters for each kind of tower we are loading in int currentAngler = 0; int currentRanger = 0; int currentSealion = 0; int currentTower = 0; // Clear all the existing towers foreach (TowerBase tower in GameManager.Instance.GetTowerList()) { Destroy(tower.transform.parent.gameObject); } // Grab the save from turn - 1 as we start at turn 0, but the pause menu slider starts at 1 Save loadSave = saves[turn - 1]; // Loop through each saved tower and load them back into the scene appropriately foreach (int towerType in loadSave.towerTypes) { // NOTE: This can also be accomplished with a Swicth statement, but this seems more readable for little loss of performance // Angler if (towerType == 0) { GameObject angler = Instantiate(GameManager.Instance.GetTowerPrefabs()[0]); AnglerTower towerScript = angler.GetComponent <AnglerTower>(); angler.transform.position = new Vector3(loadSave.towerPositions[currentTower][0], loadSave.towerPositions[currentTower][1], loadSave.towerPositions[currentTower][2]); angler.transform.rotation = Quaternion.Euler(loadSave.towerRotations[currentTower][0], loadSave.towerRotations[currentTower][1], loadSave.towerRotations[currentTower][2]); towerScript.turnPlaced = loadSave.anglerPlaced[currentAngler]; towerScript.fishCaught = loadSave.caughtFish[currentAngler]; towerScript.smallCatchRate = loadSave.anglerCatchRates[currentAngler][0]; towerScript.mediumCatchRate = loadSave.anglerCatchRates[currentAngler][1]; towerScript.largeCatchRate = loadSave.anglerCatchRates[currentAngler][2]; currentTower++; currentAngler++; } // Ranger else if (towerType == 1) { GameObject ranger = Instantiate(GameManager.Instance.GetTowerPrefabs()[1]); RangerTower towerScript = ranger.GetComponent <RangerTower>(); ranger.transform.position = new Vector3(loadSave.towerPositions[currentTower][0], loadSave.towerPositions[currentTower][1], loadSave.towerPositions[currentTower][2]); ranger.transform.rotation = Quaternion.Euler(loadSave.towerRotations[currentTower][0], loadSave.towerRotations[currentTower][1], loadSave.towerRotations[currentTower][2]); towerScript.turnPlaced = loadSave.rangerPlaced[currentRanger]; towerScript.slowdownEffectSmall = loadSave.rangerRegulateRates[currentRanger][0]; towerScript.slowdownEffectMedium = loadSave.rangerRegulateRates[currentRanger][1]; towerScript.slowdownEffectLarge = loadSave.rangerRegulateRates[currentRanger][2]; currentTower++; currentRanger++; } // Sealion else if (towerType == 4) { GameObject sealion = Instantiate(GameManager.Instance.GetTowerPrefabs()[4]); SealionTower towerScript = sealion.GetComponent <SealionTower>(); sealion.transform.position = new Vector3(loadSave.towerPositions[currentTower][0], loadSave.towerPositions[currentTower][1], loadSave.towerPositions[currentTower][2]); sealion.transform.rotation = Quaternion.Euler(loadSave.towerRotations[currentTower][0], loadSave.towerRotations[currentTower][1], loadSave.towerRotations[currentTower][2]); towerScript.turnPlaced = loadSave.sealionAppeared[currentSealion]; towerScript.maleCatchRate = loadSave.sealionCatchRates[currentSealion][0]; towerScript.femaleCatchRate = loadSave.sealionCatchRates[currentSealion][1]; currentTower++; currentSealion++; } // Dam else if (towerType == 2) { GameObject dam = Instantiate(GameManager.Instance.GetTowerPrefabs()[2]); Dam towerScript = dam.GetComponent <Dam>(); dam.transform.position = new Vector3(loadSave.towerPositions[currentTower][0], loadSave.towerPositions[currentTower][1], loadSave.towerPositions[currentTower][2]); dam.transform.rotation = Quaternion.Euler(loadSave.towerRotations[currentTower][0], loadSave.towerRotations[currentTower][1], loadSave.towerRotations[currentTower][2]); towerScript.turnPlaced = loadSave.damPlaced; currentTower++; } // Ladder else if (towerType == 3) { GameObject ladder = Instantiate(GameManager.Instance.GetTowerPrefabs()[3]); DamLadder towerScript = ladder.GetComponent <DamLadder>(); ladder.transform.position = new Vector3(loadSave.towerPositions[currentTower][0], loadSave.towerPositions[currentTower][1], loadSave.towerPositions[currentTower][2]); ladder.transform.rotation = Quaternion.Euler(loadSave.towerRotations[currentTower][0], loadSave.towerRotations[currentTower][1], loadSave.towerRotations[currentTower][2]); towerScript.turnPlaced = loadSave.ladderType; currentTower++; } } // Load in the generation of fish from this turn List <FishGenome> revertGeneration = new List <FishGenome>(); /* * This is lengthy. The gist is we COULD just grab the list via GetFish in FishSchool, but then the save * would not be potentially serializable if we want that in the future. So instead, we are reconstructing the * appropriate generation based on the counts of small, medium, and large fish (both male and female) we saved * at the place stage of that turn. */ // Small Male Fish FishGenePair[] SMgenes = new FishGenePair[FishGenome.Length]; FishGenePair sexPair; sexPair.momGene = FishGenome.X; sexPair.dadGene = FishGenome.Y; FishGenePair sizePair; sizePair.momGene = FishGenome.b; sizePair.dadGene = FishGenome.b; SMgenes[(int)FishGenome.GeneType.Sex] = sexPair; SMgenes[(int)FishGenome.GeneType.Size] = sizePair; FishGenome smallMGenome = new FishGenome(SMgenes); for (int i = 0; i < loadSave.smallMale; i++) { revertGeneration.Add(smallMGenome); } // Medium Male Fish FishGenePair[] MMgenes = new FishGenePair[FishGenome.Length]; sizePair.momGene = FishGenome.b; sizePair.dadGene = FishGenome.B; MMgenes[(int)FishGenome.GeneType.Sex] = sexPair; MMgenes[(int)FishGenome.GeneType.Size] = sizePair; FishGenome mediumMGenome = new FishGenome(MMgenes); for (int i = 0; i < loadSave.mediumMale; i++) { revertGeneration.Add(mediumMGenome); } // Large Male Fish FishGenePair[] LMgenes = new FishGenePair[FishGenome.Length]; sizePair.momGene = FishGenome.B; sizePair.dadGene = FishGenome.B; LMgenes[(int)FishGenome.GeneType.Sex] = sexPair; LMgenes[(int)FishGenome.GeneType.Size] = sizePair; FishGenome largeMGenome = new FishGenome(LMgenes); for (int i = 0; i < loadSave.largeMale; i++) { revertGeneration.Add(largeMGenome); } // Small Female Fish FishGenePair[] SFgenes = new FishGenePair[FishGenome.Length]; sexPair.dadGene = FishGenome.X; SFgenes[(int)FishGenome.GeneType.Sex] = sexPair; sizePair.momGene = FishGenome.b; sizePair.dadGene = FishGenome.b; SFgenes[(int)FishGenome.GeneType.Size] = sizePair; FishGenome smallFGenome = new FishGenome(SFgenes); for (int i = 0; i < loadSave.smallFemale; i++) { revertGeneration.Add(smallFGenome); } // Medium Female Fish FishGenePair[] MFgenes = new FishGenePair[FishGenome.Length]; sizePair.momGene = FishGenome.B; sizePair.dadGene = FishGenome.b; MFgenes[(int)FishGenome.GeneType.Sex] = sexPair; MFgenes[(int)FishGenome.GeneType.Size] = sizePair; FishGenome mediumFGenome = new FishGenome(MFgenes); for (int i = 0; i < loadSave.mediumFemale; i++) { revertGeneration.Add(mediumFGenome); } // Large Female Fish FishGenePair[] LFgenes = new FishGenePair[FishGenome.Length]; sizePair.momGene = FishGenome.B; sizePair.dadGene = FishGenome.B; LFgenes[(int)FishGenome.GeneType.Sex] = sexPair; LFgenes[(int)FishGenome.GeneType.Size] = sizePair; FishGenome largeFGenome = new FishGenome(LFgenes); for (int i = 0; i < loadSave.largeFemale; i++) { revertGeneration.Add(largeFGenome); } FishGenomeUtilities.Shuffle(revertGeneration); GameManager.Instance.school.nextGenerationGenomes = revertGeneration; // Remove future turns we reverted over and set the UI slider in the pause menu appropriately GameManager.Instance.pauseMenu.turnSlider.maxValue = turn; GameManager.Instance.pauseMenu.turnSlider.value = turn; GameManager.Instance.Turn = turn; GameManager.Instance.SetState(new PlaceState()); currentSaveIndex = turn; }