public override void Act(params object[] args) { if (this.Life.Energy < this.EnergyCost.Value) { this.Life.Stimulate(this.Life.EnergyLowStimulus); return; } this.Life.Energy -= this.EnergyCost; double param = 0; foreach (var obj in args) { if (obj is double || obj is long || obj is int) { param += Convert.ToDouble(obj); } } var fromEnergy = param * Life.World.Random.NextDouble(); var substance = new Substance( Life.World, /*to Energy*/ fromEnergy * (param * (0.95 + 0.06 / (Life.World.Random.NextDouble() - 1.065))), fromEnergy ); var energy = Life.Energy * (-0.06 / (Life.World.Random.NextDouble() - 1.065)); var v = Math.Tan(0.89 * Math.PI * (Life.World.Random.NextDouble() - 0.49)) * 7 + 50; var min = (Math.Tan(0.85 * Math.PI * (Life.World.Random.NextDouble() - 0.466)) / 10 + 0.3) * 0.5 + 0.05; var amount = substance.FromEnergy * energy; var limit = v * (Math.Tan(0.85 * Math.PI * (Life.World.Random.NextDouble() - 0.466)) / 10 + 0.3); var res = new SubstanceCapsule(Life, substance, amount, min + v, min, limit); Life.AddResource(res); }
public override void Act(params object[] args) { if (Life.Energy < this.EnergyCost) { this.Life.Stimulate(this.Life.EnergyLowStimulus); return; } Life.Energy = Life.Energy - this.EnergyCost; double param = 0; Substance substance = null; SubstanceCell resCell = null; foreach (object obj in args) { if (obj is double || obj is long || obj is int) { param += Convert.ToDouble(obj); } else if (substance == null) { if (obj is Substance) { substance = obj as Substance; } else if (obj is SubstanceCapsule) { substance = (obj as SubstanceCapsule).Substance; } else if (obj is SubstanceCell) { substance = (obj as SubstanceCell).Substance; } } } var cell = Life.World[Life.X, Life.Y]; if ((substance == null || !cell.Substances.ContainsKey(substance)) && cell.Substances.Count > 0) { substance = cell.Substances.Keys.ToArray()[(int)((param * Life.World.Random.NextDouble()) % 1) * cell.Substances.Count]; } if (substance == null || !cell.Substances.ContainsKey(substance)) { return; } resCell = cell.Substances[substance]; double amount = 0; // create SubstanceCapsule if (!Life.Resources.Keys.Contains(substance)) { var v = ((Math.Tan(0.85 * Math.PI * (Life.World.Random.NextDouble() - 0.466)) / 10) * 500 + 200); var min = ((Math.Tan(0.85 * Math.PI * (Life.World.Random.NextDouble() - 0.466)) / 10 + 0.3) * 0.5 + 0.05); var limit = v * (Math.Tan(0.85 * Math.PI * (Life.World.Random.NextDouble() - 0.49)) / 10 + 0.3); amount = limit * (Math.Tan(0.85 * Math.PI * (Life.World.Random.NextDouble() - 0.49)) / 10 + 0.5); amount = cell.GetSubstance(substance, amount); var res = new SubstanceCapsule(Life, substance, amount, min + v, min, limit); Life.AddResource(res); } else { var res = Life.Resources[substance]; amount = res.TransferLimit * (Math.Tan(0.85 * Math.PI * (Life.World.Random.NextDouble() - 0.49)) / 10 + 0.5); amount = cell.GetSubstance(substance, amount); res.Add(amount); } }