// This function activates the next stage // currentStage must be updated before calling this function private void ActivateStage() { // Build a set of all the parts that will be decoupled decoupledParts.Clear(); for (int i = 0; i < allParts.Count; ++i) { PartSim partSim = allParts[i]; if (partSim.decoupledInStage >= this.currentStage) { decoupledParts.Add(partSim); } } foreach (PartSim partSim in decoupledParts) { // Remove it from the all parts list this.allParts.Remove(partSim); partSim.Release(); if (partSim.isEngine) { // If it is an engine then loop through all the engine modules and remove all the ones from this engine part for (int i = this.allEngines.Count - 1; i >= 0; i--) { EngineSim engine = this.allEngines[i]; if (engine.partSim == partSim) { this.allEngines.RemoveAt(i); engine.Release(); } } } // If it is a fuel line then remove it from the list of all fuel lines if (partSim.isFuelLine) { this.allFuelLines.Remove(partSim); } } // Loop through all the (remaining) parts for (int i = 0; i < allParts.Count; ++i) { // Ask the part to remove all the parts that are decoupled allParts[i].RemoveAttachedParts(decoupledParts); } // Now we loop through all the engines and activate those that are ignited in this stage for (int i = 0; i < allEngines.Count; ++i) { EngineSim engine = allEngines[i]; if (engine.partSim.inverseStage == this.currentStage) { engine.isActive = true; } } }