Example #1
0
            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);
            }
Example #2
0
            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);
                }
            }