/** * Add a ladder to this dam and set a flag so we can apply ladder effects later * * @param damLadder The Ladder being added to the dam */ public void AddLadder(DamLadder damLadder) { // Set crossing rates for fish to ones supplied by the ladder smallCrossingRate = defaultCrossingRate + damLadder.smallCrossingRate; mediumCrossingRate = defaultCrossingRate + damLadder.mediumCrossingRate; largeCrossingRate = defaultCrossingRate + damLadder.largeCrossingRate; }
/** * Attach a ladder to the dam at this location (if there is one) * * @param damLadder The dam ladder being placed in the level */ public void AttachLadder(DamLadder damLadder) { // Can only attach if there is a dam here with no ladder if (!inUse || currentDam == null || HasLadder) { return; } // Put the ladder in the correct location and parent it to the current dam Transform transform2; (transform2 = damLadder.transform).SetParent(currentDam.transform); var transform1 = ladderMeshRenderer.transform; transform2.localPosition = transform1.localPosition; transform2.localRotation = transform1.localRotation; transform2.localScale = transform1.localScale; // Tell the dam that a ladder is being attached currentDam.AddLadder(damLadder); // This dam location now has a ladder attached to it HasLadder = true; placementTurn = GameManager.Instance.Turn; }
/** * Add a ladder to this dam * * Set a flag so we can apply ladder effects later */ public void AddLadder(DamLadder damLadder) { // set crossing rates for fish to ones supplied by the ladder smallCrossingRate = damLadder.smallCrossingRate; mediumCrossingRate = damLadder.mediumCrossingRate; largeCrossingRate = damLadder.largeCrossingRate; // set flag so we know we have a ladder hasLadder = true; }
/** * Attach a ladder to the dam at this location (if there is one) */ public void AttachLadder(DamLadder damLadder) { // can only attach if there is a dam here with no ladder if (inUse && currentDam != null && !HasLadder) { // put the ladder in the correct location and parent it to the current dam damLadder.transform.SetParent(currentDam.transform); damLadder.transform.localPosition = ladderMeshRenderer.transform.localPosition; damLadder.transform.localRotation = ladderMeshRenderer.transform.localRotation; damLadder.transform.localScale = ladderMeshRenderer.transform.localScale; // tell the dam that a ladder is being attached currentDam.AddLadder(damLadder); // this dam location now has a ladder attached to it HasLadder = true; } }
/* * 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; }