/// <summary> /// Perform a reaction on a solution. This assumes all reaction criteria have already been checked and are met. /// </summary> /// <param name="solution">Solution to be reacted.</param> /// <param name="reaction">Reaction to occur.</param> /// <param name="unitReactions">The number of times to cause this reaction.</param> private void PerformReaction(ReactionPrototype reaction, ReagentUnit unitReactions) { //Remove non-catalysts foreach (var reactant in reaction.Reactants) { if (!reactant.Value.Catalyst) { var amountToRemove = unitReactions * reactant.Value.Amount; TryRemoveReagent(reactant.Key, amountToRemove); } } // Add products foreach (var product in reaction.Products) { TryAddReagent(product.Key, product.Value * unitReactions, out var acceptedQuantity, true); } // Trigger reaction effects foreach (var effect in reaction.Effects) { effect.React(Owner, unitReactions.Double()); } // Play reaction sound client-side _audioSystem.PlayAtCoords("/Audio/Effects/Chemistry/bubbles.ogg", Owner.Transform.Coordinates); }
/// <summary> /// Perform a reaction on a solution. This assumes all reaction criteria have already been checked and are met. /// </summary> /// <param name="solution">Solution to be reacted.</param> /// <param name="reaction">Reaction to occur.</param> /// <param name="unitReactions">The number of times to cause this reaction.</param> private void PerformReaction(ReactionPrototype reaction, int unitReactions) { //Remove non-catalysts foreach (var reactant in reaction.Reactants) { if (!reactant.Value.Catalyst) { int amountToRemove = unitReactions * reactant.Value.Amount; TryRemoveReagent(reactant.Key, amountToRemove); } } //Add products foreach (var product in reaction.Products) { TryAddReagent(product.Key, (int)(unitReactions * product.Value), out int acceptedQuantity, true); } //Trigger reaction effects foreach (var effect in reaction.Effects) { effect.React(Owner, unitReactions); } //Play reaction sound client-side _audioSystem.Play("/Audio/effects/chemistry/bubbles.ogg", Owner.Transform.GridPosition); }
/// <summary> /// Checks if a solution has the reactants required to cause a specified reaction. /// </summary> /// <param name="solution">The solution to check for reaction conditions.</param> /// <param name="reaction">The reaction whose reactants will be checked for in the solution.</param> /// <param name="unitReactions">The number of times the reaction can occur with the given solution.</param> /// <returns></returns> private bool SolutionValidReaction(ReactionPrototype reaction, out ReagentUnit unitReactions) { unitReactions = ReagentUnit.MaxValue; //Set to some impossibly large number initially foreach (var reactant in reaction.Reactants) { if (!ContainsReagent(reactant.Key, out ReagentUnit reagentQuantity)) { return(false); } var currentUnitReactions = reagentQuantity / reactant.Value.Amount; if (currentUnitReactions < unitReactions) { unitReactions = currentUnitReactions; } } if (unitReactions == 0) { return(false); } else { return(true); } }
protected virtual void OnReaction(ReactionPrototype reaction, IEntity owner, ReagentUnit unitReactions) { foreach (var effect in reaction.Effects) { effect.React(owner, unitReactions.Double()); } }
/// <summary> /// Perform a reaction on a solution. This assumes all reaction criteria are met. /// Removes the reactants from the solution, then returns a solution with all products. /// </summary> private static Solution PerformReaction(Solution solution, IEntity owner, ReactionPrototype reaction, ReagentUnit unitReactions) { //Remove reactants foreach (var reactant in reaction.Reactants) { if (!reactant.Value.Catalyst) { var amountToRemove = unitReactions * reactant.Value.Amount; solution.RemoveReagent(reactant.Key, amountToRemove); } } //Create products var products = new Solution(); foreach (var product in reaction.Products) { products.AddReagent(product.Key, product.Value * unitReactions); } // Trigger reaction effects foreach (var effect in reaction.Effects) { effect.React(owner, unitReactions.Double()); } return(products); }
protected override void OnReaction(ReactionPrototype reaction, IEntity owner, ReagentUnit unitReactions) { base.OnReaction(reaction, owner, unitReactions); if (reaction.Sound != null) { Get <AudioSystem>().PlayAtCoords(reaction.Sound, owner.Transform.Coordinates); } }
protected override void OnReaction(ReactionPrototype reaction, IEntity owner, ReagentUnit unitReactions) { base.OnReaction(reaction, owner, unitReactions); if (reaction.Sound != null) { SoundSystem.Play(Filter.Pvs(owner), reaction.Sound, owner.Transform.Coordinates); } }
protected override void OnReaction(Solution solution, ReactionPrototype reaction, ReagentPrototype randomReagent, EntityUid Owner, FixedPoint2 unitReactions) { base.OnReaction(solution, reaction, randomReagent, Owner, unitReactions); var coordinates = EntityManager.GetComponent <TransformComponent>(Owner).Coordinates; _logSystem.Add(LogType.ChemicalReaction, reaction.Impact, $"Chemical reaction {reaction.ID} occurred with strength {unitReactions:strength} on entity {Owner} at {coordinates}"); SoundSystem.Play(Filter.Pvs(Owner, entityManager: EntityManager), reaction.Sound.GetSound(), Owner); }
protected override void OnReaction(Solution solution, ReactionPrototype reaction, ReagentPrototype randomReagent, EntityUid owner, FixedPoint2 unitReactions) { base.OnReaction(solution, reaction, randomReagent, owner, unitReactions); var coordinates = Transform(owner).Coordinates; _logSystem.Add(LogType.ChemicalReaction, reaction.Impact, $"Chemical reaction {reaction.ID:reaction} occurred with strength {unitReactions:strength} on entity {ToPrettyString(owner):metabolizer} at {coordinates}"); SoundSystem.Play(Filter.Pvs(owner, entityManager:EntityManager), reaction.Sound.GetSound(), owner); }
public ReactionEntry(ReactionPrototype proto) { Id = proto.ID; Name = proto.Name; Reactants = proto.Reactants .Select(x => KeyValuePair.Create(x.Key, new ReactantEntry(x.Value.Amount.Float(), x.Value.Catalyst))) .ToDictionary(x => x.Key, x => x.Value); Products = proto.Products .Select(x => KeyValuePair.Create(x.Key, x.Value.Float())) .ToDictionary(x => x.Key, x => x.Value); Effects = proto.Effects; }
/// <summary> /// Checks if a solution can undergo a specified reaction. /// </summary> /// <param name="solution">The solution to check.</param> /// <param name="reaction">The reaction to check.</param> /// <param name="lowestUnitReactions">How many times this reaction can occur.</param> /// <returns></returns> private static bool CanReact(Solution solution, ReactionPrototype reaction, out ReagentUnit lowestUnitReactions) { lowestUnitReactions = ReagentUnit.MaxValue; foreach (var reactantData in reaction.Reactants) { var reactantName = reactantData.Key; var reactantCoefficient = reactantData.Value.Amount; if (!solution.ContainsReagent(reactantName, out var reactantQuantity)) { return(false); } var unitReactions = reactantQuantity / reactantCoefficient; if (unitReactions < lowestUnitReactions) { lowestUnitReactions = unitReactions; } } return(true); }
protected override void OnReaction(ReactionPrototype reaction, IEntity owner, ReagentUnit unitReactions) { base.OnReaction(reaction, owner, unitReactions); SoundSystem.Play(Filter.Pvs(owner), reaction.Sound.GetSound(), owner); }