private static float[] GetReagentVolumes(SubstanceMixture mixture, int[] indexes) { float[] reagentVolumes = new float[indexes.Length]; for (int i = 0; i < indexes.Length; i++) { reagentVolumes[i] = mixture[indexes[i]].Volume; } return(reagentVolumes); }
private static int FindSubstanceIndex(SubstanceMixture mixture, int id) { for (int i = 0; i < mixture.Count; i++) { if (mixture[i].SubstanceId == id) { return(i); } } return(-1); }
private static int FindSubstanceIndex(SubstanceMixture mixture, string name) { for (int i = 0; i < mixture.Count; i++) { if (ChemistryController.Current.GetSubstance(mixture[i].SubstanceId).Name == name) { return(i); } } return(-1); }
public void TransferToAnother(ISubstanceContainer otherContainer) { Debug.Log(gameObject.name + ": transfering liquids to " + otherContainer.gameObject); float amount = Mathf.Min(_transferAmount, _mixture.Volume); if (Math.Abs(amount) < 0.0001f) { Debug.Log("Nothing to transfer!"); } else { Debug.Log("Amount: " + amount); SubstanceMixture subtractedMixture = _mixture.SubtractVolume(amount); otherContainer.TransferInto(subtractedMixture); _mixture.Concatinate(subtractedMixture); } }
public void TransferInto(SubstanceMixture incomingMixture) { float remainingVolume = GetRemainingVolume(); SubstanceMixture concatinationMixture; if (remainingVolume >= incomingMixture.Volume) { concatinationMixture = incomingMixture.Clone() as SubstanceMixture; incomingMixture.Clear(); } else { concatinationMixture = incomingMixture.SubtractVolume(remainingVolume); } _mixture.Concatinate(concatinationMixture); Debug.Log(gameObject.name + ": New contents: " + _mixture); }
public static void React(SubstanceMixture mixture) { foreach (var reaction in AvailableReactions) { int[] reagentMixtureIndexes; bool allReagentsArePresent = FindReagentIndexes(mixture, reaction, out reagentMixtureIndexes); if (allReagentsArePresent) { float[] reagentVolumes = GetReagentVolumes(mixture, reagentMixtureIndexes); float[] factors = GetFactors(reagentVolumes, reaction.Reagents); int minFactorIndex = FindMinIndex(factors); float reactionFactor = factors[minFactorIndex]; DoReaction(mixture, reaction, reagentMixtureIndexes, reactionFactor); } } }
private static void DoReaction(SubstanceMixture mixture, Reaction reaction, int[] reagentsIndexes, float factor) { for (int i = 0; i < reagentsIndexes.Length; i++) { int reagentIndex = reagentsIndexes[i]; if (reagentIndex < 0 || reagentIndex >= mixture.Count || mixture.Count == 0) { return; } SubstanceInfo substanceInfo = mixture[reagentIndex]; float reactionVolume = factor * reaction.Reagents[i].Mole; substanceInfo.Volume -= reactionVolume; if (substanceInfo.Volume > 0) { mixture[reagentIndex] = substanceInfo; } else { mixture.RemoveAt(reagentIndex); } } SubstanceMixture additions = new SubstanceMixture(0, mixture.Temperature + reaction.TermalFactor * factor); for (int i = 0; i < reaction.Results.Length; i++) { int id = ChemistryController.Current.GetSubstance(reaction.Results[i].SubstanceName).Id; if (id != -1) { additions.Add(new SubstanceInfo(id, factor * reaction.Results[i].Mole)); } } mixture.Concatinate(additions); }
private static bool FindReagentIndexes(SubstanceMixture mixture, Reaction reaction, out int[] reagentIndexes) { reagentIndexes = new int[reaction.Reagents.Length]; bool ok = true; for (int i = 0; i < reagentIndexes.Length && ok; i++) { //string reagentName = reaction.Reagents[i].SubstanceName; int reagentId = ChemistryController.Current.GetSubstance(reaction.Reagents[i].SubstanceName).Id; int index = FindSubstanceIndex(mixture, reagentId); if (index != -1) { reagentIndexes[i] = index; } else { ok = false; } } return(ok); }