Exemplo n.º 1
0
        public static bool ShouldApply(this ReagentEffect effect, ReagentEffectArgs args,
                                       IRobustRandom?random = null)
        {
            if (random == null)
            {
                random = IoCManager.Resolve <IRobustRandom>();
            }

            if (effect.Probability < 1.0f && !random.Prob(effect.Probability))
            {
                return(false);
            }

            if (effect.Conditions != null)
            {
                foreach (var cond in effect.Conditions)
                {
                    if (!cond.Condition(args))
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
        public override void Effect(ReagentEffectArgs args)
        {
            var solution = args.Source;

            if (solution == null)
            {
                return;
            }

            var deltaT = GetDeltaT(solution);

            if (_scaled)
            {
                deltaT = deltaT * (float)args.Quantity;
            }

            if (deltaT == 0.0d)
            {
                return;
            }
            if (deltaT > 0.0d && solution.Temperature >= _maxTemp)
            {
                return;
            }
            if (deltaT < 0.0d && solution.Temperature <= _minTemp)
            {
                return;
            }

            solution.Temperature = MathF.Max(MathF.Min(solution.Temperature + deltaT, _minTemp), _maxTemp);
        }
        public override void Effect(ReagentEffectArgs args)
        {
            if (!args.EntityManager.TryGetComponent(args.SolutionEntity, out PlantHolderComponent? plantHolderComp) ||
                plantHolderComp.Seed == null || plantHolderComp.Dead ||
                plantHolderComp.Seed.Immutable)
            {
                return;
            }

            var random = IoCManager.Resolve <IRobustRandom>();

            var chance = MathHelper.Lerp(15f, 150f, plantHolderComp.Seed.Potency) * 3.5f;

            if (random.Prob(chance))
            {
                plantHolderComp.CheckForDivergence(true);
                plantHolderComp.Seed.Potency++;
            }

            chance = MathHelper.Lerp(6f, 2f, plantHolderComp.Seed.Yield) * 0.15f;

            if (random.Prob(chance))
            {
                plantHolderComp.CheckForDivergence(true);
                plantHolderComp.Seed.Yield--;
            }
        }
 //Remove reagent at set rate, satiate hunger if a HungerComponent can be found
 public override void Effect(ReagentEffectArgs args)
 {
     if (args.EntityManager.TryGetComponent(args.SolutionEntity, out HungerComponent? hunger))
     {
         hunger.UpdateFood(NutritionFactor * (float)args.Quantity);
     }
 }
Exemplo n.º 5
0
 /// Satiate thirst if a ThirstComponent can be found
 public override void Effect(ReagentEffectArgs args)
 {
     if (args.EntityManager.TryGetComponent(args.SolutionEntity, out ThirstComponent? thirst))
     {
         EntitySystem.Get <ThirstSystem>().UpdateThirst(thirst, HydrationFactor);
     }
 }
Exemplo n.º 6
0
        public override void Effect(ReagentEffectArgs args)
        {
            var floatIntensity = (float)args.Quantity;

            if (!args.EntityManager.HasComponent <SolutionContainerManagerComponent>(args.SolutionEntity))
            {
                return;
            }

            //Handle scaling
            if (_scaled)
            {
                floatIntensity = MathF.Min(floatIntensity, _maxScale);
            }
            else
            {
                floatIntensity = 1;
            }

            //Calculate intensities
            var finalDevastationRange = (int)MathF.Round(_devastationRange * floatIntensity);
            var finalHeavyImpactRange = (int)MathF.Round(_heavyImpactRange * floatIntensity);
            var finalLightImpactRange = (int)MathF.Round(_lightImpactRange * floatIntensity);
            var finalFlashRange       = (int)MathF.Round(_flashRange * floatIntensity);

            EntitySystem.Get <ExplosionSystem>().SpawnExplosion(args.SolutionEntity, finalDevastationRange,
                                                                finalHeavyImpactRange, finalLightImpactRange, finalFlashRange);
        }
Exemplo n.º 7
0
    public override void Effect(ReagentEffectArgs args)
    {
        EntitySystem.Get <ElectrocutionSystem>().TryDoElectrocution(args.SolutionEntity, null,
                                                                    Math.Max((args.Quantity * ElectrocuteDamageScale).Int(), 1), TimeSpan.FromSeconds(ElectrocuteTime), Refresh);

        args.Source?.RemoveReagent(args.Reagent.ID, args.Quantity);
    }
Exemplo n.º 8
0
 /// Satiate thirst if a ThirstComponent can be found
 public override void Effect(ReagentEffectArgs args)
 {
     if (args.EntityManager.TryGetComponent(args.SolutionEntity, out ThirstComponent? thirst))
     {
         thirst.UpdateThirst(HydrationFactor);
     }
 }
Exemplo n.º 9
0
 public override void Effect(ReagentEffectArgs args)
 {
     if (args.EntityManager.TryGetComponent(args.SolutionEntity, out TemperatureComponent temp))
     {
         var sys = args.EntityManager.EntitySysManager.GetEntitySystem <TemperatureSystem>();
         sys.ChangeHeat(args.SolutionEntity, Amount, true, temp);
     }
 }
Exemplo n.º 10
0
 public override void Effect(ReagentEffectArgs args)
 {
     if (args.EntityManager.TryGetComponent <RespiratorComponent>(args.SolutionEntity, out var resp))
     {
         var respSys = EntitySystem.Get <RespiratorSystem>();
         respSys.UpdateSaturation(resp.Owner, args.Quantity.Float() * Factor, resp);
     }
 }
        public override void Effect(ReagentEffectArgs args)
        {
            if (!CanMetabolize(args.SolutionEntity, out var plantHolderComp, args.EntityManager, mustHaveAlivePlant: false))
            {
                return;
            }

            plantHolderComp.AdjustWater(Amount);
        }
    public override bool Condition(ReagentEffectArgs args)
    {
        if (args.EntityManager.TryGetComponent <TagComponent>(args.SolutionEntity, out var tag))
        {
            return(tag.HasTag(Tag) ^ Invert);
        }

        return(false);
    }
Exemplo n.º 13
0
        public override void Effect(ReagentEffectArgs args)
        {
            if (!args.EntityManager.TryGetComponent(args.SolutionEntity, out CreamPiedComponent? creamPied))
            {
                return;
            }

            EntitySystem.Get <CreamPieSystem>().SetCreamPied(args.SolutionEntity, creamPied, false);
        }
        public override void Effect(ReagentEffectArgs args)
        {
            if (!CanMetabolize(args.SolutionEntity, out var plantHolderComp, args.EntityManager))
            {
                return;
            }

            plantHolderComp.PestLevel += Amount;
        }
Exemplo n.º 15
0
 public override void Effect(ReagentEffectArgs args)
 {
     if (args.EntityManager.TryGetComponent <BloodstreamComponent>(args.SolutionEntity, out var blood))
     {
         var sys = EntitySystem.Get <BloodstreamSystem>();
         var amt = Scaled ? Amount * args.Quantity.Float() : Amount;
         sys.TryModifyBleedAmount(args.SolutionEntity, amt, blood);
     }
 }
Exemplo n.º 16
0
        public override void Effect(ReagentEffectArgs args)
        {
            if (!CanMetabolize(args.SolutionEntity, out var plantHolderComp, args.EntityManager))
            {
                return;
            }

            plantHolderComp.AffectGrowth((int)Amount);
        }
Exemplo n.º 17
0
        public override void Effect(ReagentEffectArgs args)
        {
            if (!args.EntityManager.TryGetComponent(args.SolutionEntity, out FlammableComponent? flammable))
            {
                return;
            }

            EntitySystem.Get <FlammableSystem>().AdjustFireStacks(args.SolutionEntity, args.Quantity.Float() * Multiplier, flammable);
            args.Source?.RemoveReagent(args.Reagent.ID, args.Quantity);
        }
Exemplo n.º 18
0
        public override void Effect(ReagentEffectArgs args)
        {
            if (!CanMetabolize(args.SolutionEntity, out var plantHolderComp, args.EntityManager))
            {
                return;
            }

            plantHolderComp.AdjustNutrient(Amount);
            return;
        }
Exemplo n.º 19
0
 public override void Effect(ReagentEffectArgs args)
 {
     if (args.EntityManager.TryGetComponent <LungComponent>(args.OrganEntity, out var lung))
     {
         foreach (var(gas, ratio) in _ratios)
         {
             lung.Air.Moles[(int)gas] += (ratio * args.Quantity.Float()) / Atmospherics.BreathMolesToReagentMultiplier;
         }
     }
 }
Exemplo n.º 20
0
        public override void Effect(ReagentEffectArgs args)
        {
            if (!CanMetabolize(args.SolutionEntity, out var plantHolderComp, args.EntityManager))
            {
                return;
            }

            plantHolderComp.Health += Amount;
            plantHolderComp.CheckHealth();
        }
        public override bool Condition(ReagentEffectArgs args)
        {
            if (args.Source == null)
                return false;
            if (args.Source.ThermalEnergy < Min)
                return false;
            if (args.Source.ThermalEnergy > Max)
                return false;

            return true;
        }
        public override void Effect(ReagentEffectArgs args)
        {
            var intensity = MathF.Min((float)args.Quantity * IntensityPerUnit, MaxTotalIntensity);

            EntitySystem.Get <ExplosionSystem>().QueueExplosion(
                args.SolutionEntity,
                ExplosionType,
                intensity,
                IntensitySlope,
                MaxIntensity);
        }
Exemplo n.º 23
0
    public override void Effect(ReagentEffectArgs args)
    {
        var atmosSys = args.EntityManager.EntitySysManager.GetEntitySystem <AtmosphereSystem>();

        var tileMix = atmosSys.GetContainingMixture(args.SolutionEntity, false, true);

        if (tileMix != null)
        {
            tileMix.AdjustMoles(Gas, args.Quantity.Float() * Multiplier);
        }
    }
Exemplo n.º 24
0
        public override void Effect(ReagentEffectArgs args)
        {
            if (args.EntityManager.TryGetComponent <DiseasedComponent>(args.SolutionEntity, out var diseased))
            {
                return;
            }

            var random = IoCManager.Resolve <IRobustRandom>();

            EntitySystem.Get <DiseaseSystem>().TryAddDisease(args.SolutionEntity, random.Pick(Diseases));
        }
        public override void Effect(ReagentEffectArgs args)
        {
            var solution = args.Source;

            if (solution == null)
            {
                return;
            }

            solution.Temperature = _temperature;
        }
Exemplo n.º 26
0
        public override bool Condition(ReagentEffectArgs args)
        {
            if (args.EntityManager.TryGetComponent(args.SolutionEntity, out TemperatureComponent temp))
            {
                if (temp.CurrentTemperature > Min && temp.CurrentTemperature < Max)
                {
                    return(true);
                }
            }

            return(false);
        }
Exemplo n.º 27
0
    public override void Effect(ReagentEffectArgs args)
    {
        var atmosSys = EntitySystem.Get <AtmosphereSystem>();

        var xform   = args.EntityManager.GetComponent <TransformComponent>(args.SolutionEntity);
        var tileMix = atmosSys.GetTileMixture(xform.Coordinates);

        if (tileMix != null)
        {
            tileMix.AdjustMoles(Gas, args.Quantity.Float() * Multiplier);
        }
    }
Exemplo n.º 28
0
        public override void Effect(ReagentEffectArgs args)
        {
            if (!args.EntityManager.TryGetComponent(args.SolutionEntity, out FlammableComponent? flammable))
            {
                return;
            }

            var flammableSystem = EntitySystem.Get <FlammableSystem>();

            flammableSystem.Extinguish(args.SolutionEntity, flammable);
            flammableSystem.AdjustFireStacks(args.SolutionEntity, -1.5f * (float)args.Quantity, flammable);
        }
Exemplo n.º 29
0
        public override bool Condition(ReagentEffectArgs args)
        {
            if (args.EntityManager.TryGetComponent(args.SolutionEntity, out DamageableComponent damage))
            {
                var total = damage.TotalDamage;
                if (total > Min && total < Max)
                {
                    return(true);
                }
            }

            return(false);
        }
Exemplo n.º 30
0
        public override void Effect(ReagentEffectArgs args)
        {
            if (args.Source == null)
            {
                return;
            }

            var splitSolution = EntitySystem.Get <SolutionContainerSystem>().SplitSolution(args.SolutionEntity, args.Source, args.Source.MaxVolume);
            // We take the square root so it becomes harder to reach higher amount values
            var amount = (int)Math.Round(_rangeConstant + _rangeMultiplier * Math.Sqrt(args.Quantity.Float()));

            amount = Math.Min(amount, _maxRange);

            if (_diluteReagents)
            {
                // The maximum value of solutionFraction is _reagentMaxConcentrationFactor, achieved when amount = 0
                // The infimum of solutionFraction is 0, which is approached when amount tends to infinity
                // solutionFraction is equal to 1 only when amount equals _reagentDilutionStart
                // Weird formulas here but basically when amount increases, solutionFraction gets closer to 0 in a reciprocal manner
                // _reagentDilutionFactor defines how fast solutionFraction gets closer to 0
                float solutionFraction = 1 / (_reagentDilutionFactor * (amount) + 1);
                splitSolution.RemoveSolution(splitSolution.TotalVolume * (1 - solutionFraction));
            }

            var transform = args.EntityManager.GetComponent <TransformComponent>(args.SolutionEntity);

            if (!_mapManager.TryFindGridAt(transform.MapPosition, out var grid))
            {
                return;
            }

            var coords = grid.MapToGrid(transform.MapPosition);

            var ent = args.EntityManager.SpawnEntity(_prototypeId, coords.SnapToGrid());

            var areaEffectComponent = GetAreaEffectComponent(ent);

            if (areaEffectComponent == null)
            {
                Logger.Error("Couldn't get AreaEffectComponent from " + _prototypeId);
                IoCManager.Resolve <IEntityManager>().QueueDeleteEntity(ent);
                return;
            }

            areaEffectComponent.TryAddSolution(splitSolution);
            areaEffectComponent.Start(amount, _duration, _spreadDelay, _removeDelay);

            SoundSystem.Play(Filter.Pvs(args.SolutionEntity), _sound.GetSound(), args.SolutionEntity, AudioHelpers.WithVariation(0.125f));
        }