/// <summary> /// Initializes a new instance of the <see cref="CellUnity.Reaction.ReactionPrep"/> class. /// </summary> /// <param name="t">Reaction Type</param> public ReactionPrep(ReactionType t) { this.reactionType = t; int reagentsCount = t.Reagents.Length; this.ready = new bool[reagentsCount]; this.molecules = new List <Molecule> (reagentsCount); for (int i = 0; i < ready.Length; i++) { ready[i] = false; } }
/// <summary> /// Initiates a reaction. /// </summary> /// <returns><c>true</c>, if the reaction was initiated, <c>false</c> otherwise.</returns> /// <param name="reaction">Reaction.</param> /// <param name="queueIfNotPossible">If set to <c>true</c>, the reaction is queued and performed later if the reaction is not possible at the moment.</param> public bool InitiateReaction(ReactionType reaction, bool queueIfNotPossible) { CUE cue = CUE.GetInstance(); ReactionPrep reactionPrep = new ReactionPrep(reaction); bool moleculesFound; // Select molecules // Prefer selected molecule if suitable if ( selectedMolecule != null && selectedReaction != null && // molecule and reaction must be selected selectedReaction == reaction && // selected reaction must match current reaction selectedMolecule.ReactionPrep == null // selected molecule must not be already involved in a reaction ) { moleculesFound = cue.Molecules.FindMolecuelsForReaction(reactionPrep, selectedMolecule); } else { // select random molecules moleculesFound = cue.Molecules.FindMolecuelsForReaction(reactionPrep); } if (moleculesFound) { // Ready reactions for 0 to 1 reagents because Collision is never called for these molecules if (reactionPrep.MoleculeCount == 0) { reactionPrep.Ready(null); } if (reactionPrep.MoleculeCount == 1) { reactionPrep.Ready(reactionPrep.Molecules[0]); // necessary if only one reagent in reaction } return(true); } else { // not sufficient molecules for reaction reactionPrep.Release(); // remove ReactonPrep from Molecules if (queueIfNotPossible) { // --> queue Reaction for later ShortKeyDict <ReactionType, int> .Entry entry; if (!openReactions.Find(reaction, out entry)) { entry = openReactions.Set(reaction, 0); } entry.Value++; } return(false); } }