Example #1
0
        /// <summary>
        /// Finds 1-3 random, dead entities across the station
        /// and turns them into zombies.
        /// </summary>
        public override void Started()
        {
            base.Started();
            List <MobStateComponent> deadList = new();

            foreach (var mobState in EntityManager.EntityQuery <MobStateComponent>())
            {
                if (mobState.IsDead() || mobState.IsCritical())
                {
                    deadList.Add(mobState);
                }
            }
            RobustRandom.Shuffle(deadList);

            var toInfect = RobustRandom.Next(1, 3);

            foreach (var target in deadList)
            {
                if (toInfect-- == 0)
                {
                    break;
                }

                _zombify.ZombifyEntity(target.Owner);
            }
        }
Example #2
0
    public override void Started()
    {
        base.Started();

        // TODO: "safe random" for chems. Right now this includes admin chemicals.
        var allReagents = PrototypeManager.EnumeratePrototypes <ReagentPrototype>()
                          .Where(x => !x.Abstract)
                          .Select(x => x.ID).ToList();

        // This is gross, but not much can be done until event refactor, which needs Dynamic.
        var sound = new SoundPathSpecifier("/Audio/Effects/extinguish.ogg");

        foreach (var(_, transform) in EntityManager.EntityQuery <GasVentPumpComponent, TransformComponent>())
        {
            var solution = new Solution();

            if (!RobustRandom.Prob(0.33f))
            {
                continue;
            }

            if (RobustRandom.Prob(0.05f))
            {
                solution.AddReagent(RobustRandom.Pick(allReagents), 100);
            }
            else
            {
                solution.AddReagent(RobustRandom.Pick(SafeishVentChemicals), 100);
            }

            FoamAreaReactionEffect.SpawnFoam("Foam", transform.Coordinates, solution, RobustRandom.Next(2, 6), 20, 1,
                                             1, sound, EntityManager);
        }
    }
        public override void OnStart()
        {
            if (Property == "Enabled") // special case for boolean, we randomize it
            {
                ApplyProperty(RobustRandom.NextDouble() < 0.5 ? true : false);
                return;
            }

            if (InterpolateMode == AnimationInterpolationMode.Cubic)
            {
                _randomValue1 = _randomValue2;
                _randomValue2 = _randomValue3;
            }

            _randomValue3 = _randomValue4;
            _randomValue4 = InterpolateLinear(StartValue, EndValue, (float)RobustRandom.NextDouble());
        }
Example #4
0
        private void Spark()
        {
            if (RobustRandom.NextFloat() <= SparkChance)
            {
                if (!_foundTile ||
                    _targetGrid == default ||
                    (!EntityManager.EntityExists(_targetGrid) ? EntityLifeStage.Deleted : EntityManager.GetComponent <MetaDataComponent>(_targetGrid).EntityLifeStage) >= EntityLifeStage.Deleted ||
                    !_atmosphere.IsSimulatedGrid(_targetGrid))
                {
                    return;
                }

                // Don't want it to be so obnoxious as to instantly murder anyone in the area but enough that
                // it COULD start potentially start a bigger fire.
                _atmosphere.HotspotExpose(_targetGrid, _targetTile, 700f, 50f, true);
                SoundSystem.Play("/Audio/Effects/sparks4.ogg", Filter.Pvs(_targetCoords), _targetCoords);
            }
        }
    /// <summary>
    /// Finds 2-5 random, alive entities that can host diseases
    /// and gives them a randomly selected disease.
    /// They all get the same disease.
    /// </summary>
    public override void Started()
    {
        base.Started();
        HashSet <EntityUid>            stationsToNotify = new();
        List <DiseaseCarrierComponent> aliveList        = new();

        foreach (var(carrier, mobState) in EntityManager.EntityQuery <DiseaseCarrierComponent, MobStateComponent>())
        {
            if (!mobState.IsDead())
            {
                aliveList.Add(carrier);
            }
        }
        RobustRandom.Shuffle(aliveList);

        // We're going to filter the above out to only alive mobs. Might change after future mobstate rework
        var toInfect = RobustRandom.Next(2, 5);

        var diseaseName = RobustRandom.Pick(NotTooSeriousDiseases);

        if (!PrototypeManager.TryIndex(diseaseName, out DiseasePrototype? disease))
        {
            return;
        }

        // Now we give it to people in the list of living disease carriers earlier
        foreach (var target in aliveList)
        {
            if (toInfect-- == 0)
            {
                break;
            }

            _diseaseSystem.TryAddDisease(target.Owner, disease, target);

            var station = StationSystem.GetOwningStation(target.Owner);
            if (station == null)
            {
                continue;
            }
            stationsToNotify.Add((EntityUid)station);
        }
    }
Example #6
0
    public override void Started()
    {
        base.Started();

        var allApcs   = EntityQuery <ApcComponent>().ToList();
        var toDisable = Math.Min(RobustRandom.Next(3, 7), allApcs.Count);

        if (toDisable == 0)
        {
            return;
        }

        RobustRandom.Shuffle(allApcs);

        for (var i = 0; i < toDisable; i++)
        {
            _apcSystem.ApcToggleBreaker(allApcs[i].Owner, allApcs[i]);
        }
    }
    public override void Started()
    {
        base.Started();

        if (StationSystem.Stations.Count == 0)
        {
            return;                                    // No stations
        }
        var chosenStation = RobustRandom.Pick(StationSystem.Stations.ToList());
        var jobList       = _stationJobs.GetJobs(chosenStation).Keys.ToList();

        // Low chance to completely change up the late-join landscape by closing all positions except infinite slots.
        // Lower chance than the /tg/ equivalent of this event.
        if (RobustRandom.Prob(0.25f))
        {
            var chosenJob = RobustRandom.PickAndTake(jobList);
            _stationJobs.MakeJobUnlimited(chosenStation, chosenJob); // INFINITE chaos.
            foreach (var job in jobList)
            {
                if (_stationJobs.IsJobUnlimited(chosenStation, job))
                {
                    continue;
                }
                _stationJobs.TrySetJobSlot(chosenStation, job, 0);
            }
        }
        else
        {
            // Changing every role is maybe a bit too chaotic so instead change 20-30% of them.
            for (var i = 0; i < RobustRandom.Next((int)(jobList.Count * 0.20), (int)(jobList.Count * 0.30)); i++)
            {
                var chosenJob = RobustRandom.PickAndTake(jobList);
                if (_stationJobs.IsJobUnlimited(chosenStation, chosenJob))
                {
                    continue;
                }

                _stationJobs.TryAdjustJobSlot(chosenStation, chosenJob, RobustRandom.Next(-3, 6));
            }
        }
    }
Example #8
0
        public override void Started()
        {
            base.Started();

            // Essentially we'll pick out a target amount of gas to leak, then a rate to leak it at, then work out the duration from there.
            if (TryFindRandomTile(out _targetTile, out _targetStation, out _targetGrid, out _targetCoords))
            {
                _foundTile = true;

                _leakGas = RobustRandom.Pick(LeakableGases);
                // Was 50-50 on using normal distribution.
                var totalGas   = (float)RobustRandom.Next(MinimumGas, MaximumGas);
                var startAfter = ((StationEventRuleConfiguration)Configuration).StartAfter;
                _molesPerSecond = RobustRandom.Next(MinimumMolesPerSecond, MaximumMolesPerSecond);
                _endAfter       = totalGas / _molesPerSecond + startAfter;
                Sawmill.Info($"Leaking {totalGas} of {_leakGas} over {_endAfter - startAfter} seconds at {_targetTile}");
            }

            // Look technically if you wanted to guarantee a leak you'd do this in announcement but having the announcement
            // there just to f**k with people even if there is no valid tile is funny.
        }
    public override void Started()
    {
        base.Started();

        var spawnLocations = EntityManager.EntityQuery <VentCritterSpawnLocationComponent, TransformComponent>().ToList();

        RobustRandom.Shuffle(spawnLocations);

        var spawnAmount = RobustRandom.Next(7, 15); // A small colony of critters.

        for (int i = 0; i < spawnAmount && i < spawnLocations.Count - 1; i++)
        {
            var spawnChoice = RobustRandom.Pick(SpawnedPrototypeChoices);
            if (RobustRandom.Prob(0.01f) || i == 0) //small chance for multiple, but always at least 1
            {
                spawnChoice = "SpawnPointGhostRatKing";
            }

            var coords = spawnLocations[i].Item2.Coordinates;
            Sawmill.Info($"Spawning mouse {spawnChoice} at {coords}");
            EntityManager.SpawnEntity(spawnChoice, coords);
        }
    }
    public override void Started()
    {
        base.Started();
        var spawnChoice    = RobustRandom.Pick(SpawnedPrototypeChoices);
        var spawnLocations = EntityManager.EntityQuery <VentCritterSpawnLocationComponent>().ToList();

        RobustRandom.Shuffle(spawnLocations);

        var spawnAmount = RobustRandom.Next(4, 12); // A small colony of critters.

        Sawmill.Info($"Spawning {spawnAmount} of {spawnChoice}");
        foreach (var location in spawnLocations)
        {
            if (spawnAmount-- == 0)
            {
                break;
            }

            var coords = EntityManager.GetComponent <TransformComponent>(location.Owner);

            EntityManager.SpawnEntity(spawnChoice, coords.Coordinates);
        }
    }
 public override void OnInitialize()
 {
     _randomValue2 = InterpolateLinear(StartValue, EndValue, (float)RobustRandom.NextDouble());
     _randomValue3 = InterpolateLinear(StartValue, EndValue, (float)RobustRandom.NextDouble());
     _randomValue4 = InterpolateLinear(StartValue, EndValue, (float)RobustRandom.NextDouble());
 }
    public override void Started()
    {
        base.Started();
        HashSet <EntityUid> stationsToNotify = new();

        var targetList = EntityManager.EntityQuery <SentienceTargetComponent>().ToList();

        RobustRandom.Shuffle(targetList);

        var toMakeSentient = RobustRandom.Next(2, 5);
        var groups         = new HashSet <string>();

        foreach (var target in targetList)
        {
            if (toMakeSentient-- == 0)
            {
                break;
            }

            MakeSentientCommand.MakeSentient(target.Owner, EntityManager);
            EntityManager.RemoveComponent <SentienceTargetComponent>(target.Owner);
            var comp = EntityManager.AddComponent <GhostTakeoverAvailableComponent>(target.Owner);
            comp.RoleName        = EntityManager.GetComponent <MetaDataComponent>(target.Owner).EntityName;
            comp.RoleDescription = Loc.GetString("station-event-random-sentience-role-description", ("name", comp.RoleName));
            groups.Add(target.FlavorKind);
        }

        if (groups.Count == 0)
        {
            return;
        }

        var groupList = groups.ToList();
        var kind1     = groupList.Count > 0 ? groupList[0] : "???";
        var kind2     = groupList.Count > 1 ? groupList[1] : "???";
        var kind3     = groupList.Count > 2 ? groupList[2] : "???";

        var entSysMgr     = IoCManager.Resolve <IEntitySystemManager>();
        var stationSystem = entSysMgr.GetEntitySystem <StationSystem>();
        var chatSystem    = entSysMgr.GetEntitySystem <ChatSystem>();

        foreach (var target in targetList)
        {
            var station = stationSystem.GetOwningStation(target.Owner);
            if (station == null)
            {
                continue;
            }
            stationsToNotify.Add((EntityUid)station);
        }
        foreach (var station in stationsToNotify)
        {
            chatSystem.DispatchStationAnnouncement(
                (EntityUid)station,
                Loc.GetString("station-event-random-sentience-announcement",
                              ("kind1", kind1), ("kind2", kind2), ("kind3", kind3), ("amount", groupList.Count),
                              ("data", Loc.GetString($"random-sentience-event-data-{RobustRandom.Next(1, 6)}")),
                              ("strength", Loc.GetString($"random-sentience-event-strength-{RobustRandom.Next(1, 8)}"))),
                playDefaultSound: false,
                colorOverride: Color.Gold
                );
        }
    }
        public override void Update(float frameTime)
        {
            base.Update(frameTime);

            if (!RuleStarted)
            {
                return;
            }

            if (_waveCounter <= 0)
            {
                ForceEndSelf();
                return;
            }

            _cooldown -= frameTime;

            if (_cooldown > 0f)
            {
                return;
            }

            _waveCounter--;

            _cooldown += (MaximumCooldown - MinimumCooldown) * RobustRandom.NextFloat() + MinimumCooldown;

            Box2?playableArea = null;
            var  mapId        = GameTicker.DefaultMap;

            foreach (var grid in MapManager.GetAllGrids())
            {
                if (grid.ParentMapId != mapId || !EntityManager.TryGetComponent(grid.GridEntityId, out PhysicsComponent? gridBody))
                {
                    continue;
                }
                var aabb = gridBody.GetWorldAABB();
                playableArea = playableArea?.Union(aabb) ?? aabb;
            }

            if (playableArea == null)
            {
                ForceEndSelf();
                return;
            }

            var minimumDistance = (playableArea.Value.TopRight - playableArea.Value.Center).Length + 50f;
            var maximumDistance = minimumDistance + 100f;

            var center = playableArea.Value.Center;

            for (var i = 0; i < MeteorsPerWave; i++)
            {
                var angle         = new Angle(RobustRandom.NextFloat() * MathF.Tau);
                var offset        = angle.RotateVec(new Vector2((maximumDistance - minimumDistance) * RobustRandom.NextFloat() + minimumDistance, 0));
                var spawnPosition = new MapCoordinates(center + offset, mapId);
                var meteor        = EntityManager.SpawnEntity("MeteorLarge", spawnPosition);
                var physics       = EntityManager.GetComponent <PhysicsComponent>(meteor);
                physics.BodyStatus     = BodyStatus.InAir;
                physics.LinearDamping  = 0f;
                physics.AngularDamping = 0f;
                physics.ApplyLinearImpulse(-offset.Normalized * MeteorVelocity * physics.Mass);
                physics.ApplyAngularImpulse(
                    // Get a random angular velocity.
                    physics.Mass * ((MaxAngularVelocity - MinAngularVelocity) * RobustRandom.NextFloat() +
                                    MinAngularVelocity));
                // TODO: God this disgusts me but projectile needs a refactor.
                EnsureComp <TimedDespawnComponent>(meteor).Lifetime = 120f;
            }
        }
 public override void Started()
 {
     base.Started();
     _waveCounter = RobustRandom.Next(MinimumWaves, MaximumWaves);
 }
Example #15
0
    public override void Added()
    {
        base.Added();

        var str = Loc.GetString("station-event-breaker-flip-announcement", ("data", Loc.GetString(Loc.GetString($"random-sentience-event-data-{RobustRandom.Next(1, 6)}"))));

        ChatSystem.DispatchGlobalAnnouncement(str, playSound: false, colorOverride: Color.Gold);
    }