/// <summary> /// Vents (throws out) non-useful compounds from this cell /// </summary> private void HandleCompoundVenting(float delta) { // TODO: check that this works // Skip if process system has not run yet if (!Compounds.HasAnyBeenSetUseful()) { return; } float amountToVent = Constants.COMPOUNDS_TO_VENT_PER_SECOND * delta; // Cloud types are ones that can be vented foreach (var type in SimulationParameters.Instance.GetCloudCompounds()) { // Vent if not useful, or if over float the capacity if (!Compounds.IsUseful(type)) { amountToVent -= EjectCompound(type, amountToVent); } else if (Compounds.GetCompoundAmount(type) > 2 * Compounds.Capacity) { // Vent the part that went over float toVent = Compounds.GetCompoundAmount(type) - (2 * Compounds.Capacity); amountToVent -= EjectCompound(type, Math.Min(toVent, amountToVent)); } if (amountToVent <= 0) { break; } } }
/// <summary> /// Absorbs compounds from this cloud /// </summary> public void AbsorbCompounds(int localX, int localY, CompoundBag storage, Dictionary <Compound, float> totals, float delta, float rate) { var fractionToTake = 1.0f - (float)Math.Pow(0.5f, delta / Constants.CLOUD_ABSORPTION_HALF_LIFE); for (int i = 0; i < Constants.CLOUDS_IN_ONE; i++) { if (Compounds[i] == null) { break; } // Skip if compound is non-useful if (!storage.IsUseful(Compounds[i])) { continue; } // Overestimate of how much compounds we get float generousAmount = HackyAddress(Density[localX, localY], i) * Constants.SKIP_TRYING_TO_ABSORB_RATIO; // Skip if there isn't enough to absorb if (generousAmount < MathUtils.EPSILON) { continue; } float freeSpace = storage.Capacity - storage.GetCompoundAmount(Compounds[i]); float multiplier = 1.0f * rate; if (freeSpace < generousAmount) { // Allow partial absorption to allow cells to take from high density clouds multiplier = freeSpace / generousAmount; } float taken = TakeCompound(Compounds[i], localX, localY, fractionToTake * multiplier) * Constants.ABSORPTION_RATIO; storage.AddCompound(Compounds[i], taken); // Keep track of total compounds absorbed for the cell if (!totals.ContainsKey(Compounds[i])) { totals.Add(Compounds[i], taken); } else { totals[Compounds[i]] += taken; } } }