/// <summary> /// Triggers reproduction on this cell (even if not ready) /// Ignores security checks. If you want those checks, use <see cref="Divide"/> /// </summary> public void ForceDivide() { // Separate the two cells. var separation = new Vector3(Radius, 0, 0); // Create the one daughter cell. var copyEntity = SpawnHelpers.SpawnMicrobe(Species, Translation + separation, GetParent(), SpawnHelpers.LoadMicrobeScene(), true, cloudSystem, CurrentGame); // Make it despawn like normal SpawnSystem.AddEntityToTrack(copyEntity); // Remove the compounds from the created cell copyEntity.Compounds.ClearCompounds(); var keys = new List <Compound>(Compounds.Compounds.Keys); var reproductionCompounds = copyEntity.CalculateTotalCompounds(); // Split the compounds between the two cells. foreach (var compound in keys) { var amount = Compounds.GetCompoundAmount(compound); if (amount <= 0) { continue; } // If the compound is for reproduction we give player and NPC microbes different amounts. if (reproductionCompounds.TryGetValue(compound, out float divideAmount)) { // The amount taken away from the parent cell depends on if it is a player or NPC. Player // cells always have 50% of the compounds they divided with taken away. float amountToTake = amount * 0.5f; if (!IsPlayerMicrobe) { // NPC parent cells have at least 50% taken away, or more if it would leave them // with more than 90% of the compound it would take to immediately divide again. amountToTake = Math.Max(amountToTake, amount - (divideAmount * 0.9f)); } Compounds.TakeCompound(compound, amountToTake); // Since the child cell is always an NPC they are given either 50% of the compound from the // parent, or 90% of the amount required to immediately divide again, whichever is smaller. float amountToGive = Math.Min(amount * 0.5f, divideAmount * 0.9f); var addedCompound = copyEntity.Compounds.AddCompound(compound, amountToGive); if (addedCompound < amountToGive) { // TODO: handle the excess compound that didn't fit in the other cell } } else { // Non-reproductive compounds just always get split evenly to both cells. Compounds.TakeCompound(compound, amount * 0.5f); var amountAdded = copyEntity.Compounds.AddCompound(compound, amount * 0.5f); if (amountAdded < amount) { // TODO: handle the excess compound that didn't fit in the other cell } } } // Play the split sound PlaySoundEffect("res://assets/sounds/soundeffects/reproduction.ogg"); }