Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
            }
        }
Example #5
0
        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);
        }
Example #6
0
        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);
                }
            }
        }
Example #7
0
        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);
        }
Example #8
0
        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);
        }