From cc311473cb13ce9f3b9fa4abe714e488f426f2b4 Mon Sep 17 00:00:00 2001 From: Turk1shcat Date: Sun, 16 Aug 2026 18:38:32 -0700 Subject: [PATCH 01/16] one commit because i messed up the history or whatever. sorry --- .../Changeling/ChangelingSystem.Abilities.cs | 16 +++++++-- .../Atmos/Rotting/SharedRottingSystem.cs | 11 ++++++ Content.Shared/Flash/SharedFlashSystem.cs | 34 ++++++++++++++++--- .../_Starlight/Changeling/AbsorbedSystem.cs | 10 ++++++ .../Changeling/ChangelingComponent.cs | 2 +- .../Locale/en-US/abilities/changeling.ftl | 1 + .../Locale/en-US/store/changeling-catalog.ftl | 1 + .../_Starlight/Actions/changeling.yml | 1 + 8 files changed, 68 insertions(+), 8 deletions(-) diff --git a/Content.Server/_Starlight/Changeling/ChangelingSystem.Abilities.cs b/Content.Server/_Starlight/Changeling/ChangelingSystem.Abilities.cs index bf1c58880784..3797e115409c 100644 --- a/Content.Server/_Starlight/Changeling/ChangelingSystem.Abilities.cs +++ b/Content.Server/_Starlight/Changeling/ChangelingSystem.Abilities.cs @@ -33,6 +33,7 @@ using Content.Shared._Starlight.Changeling; using Content.Server._Starlight.Objectives.Components; using Content.Shared.Flash; +using Content.Shared.Atmos.Rotting; // Starlight edit end namespace Content.Server._Starlight.Changeling; @@ -43,6 +44,7 @@ public sealed partial class ChangelingSystem : EntitySystem [Dependency] private ChangelingIdentitySystem _changelingIdentitySystem = default!; [Dependency] private LanguageSystem _language = default!; [Dependency] private SharedFlashSystem _flashSystem = default!; + [Dependency] private SharedRottingSystem _rotting = default!; private static readonly ProtoId FerrochromicAcidPrototype = "FerrochromicAcid"; private static readonly ProtoId PolytrinicAcidPrototype = "PolytrinicAcid"; @@ -132,6 +134,7 @@ private void OnAbsorb(EntityUid uid, ChangelingComponent comp, ref AbsorbDNAEven }; _doAfter.TryStartDoAfter(dargs); } + public ProtoId AbsorbedDamageGroup = "Genetic"; private void OnDevouredPerson(EntityUid uid, ChangelingComponent comp, ref OnLingDevour args) { @@ -159,6 +162,12 @@ private void OnDevouredPerson(EntityUid uid, ChangelingComponent comp, ref OnLin // Starlight edit end EnsureComp(target); + // Starlight edit start - doubles the length of the rotting timer from 10 to 20 + if (TryComp(target, out var perishable)) + { + _rotting.SetRotAfter(target, TimeSpan.FromMinutes(20), perishable); + } + // Starlight edit end var popup = Loc.GetString("changeling-absorb-end-self-ling"); var bonusChemicals = 0f; @@ -304,14 +313,17 @@ private void OnShriekResonant(EntityUid uid, ChangelingComponent comp, ref Shrie DoScreech(uid, comp); var power = comp.ShriekPower; - _flash.FlashArea(uid, uid, power, TimeSpan.FromMilliseconds(power * 2f * 1000f)); + // Starlight edit - Overrides flash immunity. Why would a shriek get blocked by glasses? Also ignores the changeling doing the shriek. + List ignoreList = new() { uid }; + _flash.FlashArea(uid, uid, power, TimeSpan.FromMilliseconds(power * 2f * 1000f), 0.8f, false, 1f, null, true, ignoreList); var lookup = _lookup.GetEntitiesInRange(uid, power); var lights = GetEntityQuery(); - foreach (var ent in lookup) + // breaks lights if (lights.HasComponent(ent)) _light.TryDestroyBulb(ent); + } private void OnToggleStrainedMuscles(EntityUid uid, ChangelingComponent comp, ref ToggleStrainedMusclesEvent args) => ToggleStrainedMuscles(uid, comp); diff --git a/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs b/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs index 2f197e9648fe..1f4e69d07745 100644 --- a/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs +++ b/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs @@ -175,4 +175,15 @@ public int RotStage(EntityUid uid, RottingComponent? comp = null, PerishableComp return (int) (comp.TotalRotTime.TotalSeconds / perishable.RotAfter.TotalSeconds); } + + // starlight edit - start + public bool SetRotAfter(EntityUid uid, TimeSpan newTime, PerishableComponent? perishable = null) + { + if (!Resolve(uid, ref perishable)) + return false; + + perishable.RotAfter = newTime; + return true; + } + // starlight edit - end } diff --git a/Content.Shared/Flash/SharedFlashSystem.cs b/Content.Shared/Flash/SharedFlashSystem.cs index 5e4da0172706..50e118b4131b 100644 --- a/Content.Shared/Flash/SharedFlashSystem.cs +++ b/Content.Shared/Flash/SharedFlashSystem.cs @@ -162,6 +162,7 @@ private bool UseFlash(Entity ent, EntityUid? user) /// Whether or not to show a popup to the target player. /// Was this flash caused by a melee attack? Used for checking for revolutionary conversion. /// The time the target will be stunned. If null the target will be slowed down instead. + /// Whether to override flash immunity checks. (STARLIGHT EDIT) public void Flash( EntityUid target, EntityUid? user, @@ -170,7 +171,8 @@ public void Flash( float slowTo, bool displayPopup = true, bool melee = false, - TimeSpan? stunDuration = null) + TimeSpan? stunDuration = null, + bool overrideFlashImmunity = false) { var attempt = new FlashAttemptEvent(target, user, used); RaiseLocalEvent(target, ref attempt, true); @@ -188,8 +190,8 @@ public void Flash( } #endregion Starlight - // don't paralyze, slowdown or convert to rev if the target is immune to flashes - if (!_statusEffectsSystem.TryAddStatusEffect(target, FlashedKey, flashDuration, true)) + // don't paralyze, slowdown or convert to rev if the target is immune to flashes; STARLIGHT EDIT - functionality added to override flash immunity + if (!overrideFlashImmunity && !_statusEffectsSystem.TryAddStatusEffect(target, FlashedKey, flashDuration, true)) return; if (stunDuration != null) @@ -222,7 +224,21 @@ public void Flash( /// Whether or not to show a popup to the target player. /// Chance to be flashed. Rolled separately for each target in range. /// Additional sound to play at the source. - public void FlashArea(EntityUid source, EntityUid? user, float range, TimeSpan flashDuration, float slowTo = 0.8f, bool displayPopup = false, float probability = 1f, SoundSpecifier? sound = null) + /// starlight edit - start + /// Whether to override flash immunity checks. + /// Entities to ignore when flashing. + /// starlight edit - end + public void FlashArea( + EntityUid source, + EntityUid? user, + float range, + TimeSpan flashDuration, + float slowTo = 0.8f, + bool displayPopup = false, + float probability = 1f, + SoundSpecifier? sound = null, + bool overrideFlashImmunity = false, + List? ignoreEntities = null) { var transform = Transform(source); var mapPosition = _transform.GetMapCoordinates(transform); @@ -231,6 +247,13 @@ public void FlashArea(EntityUid source, EntityUid? user, float range, TimeSpan f _entityLookup.GetEntitiesInRange(transform.Coordinates, range, _entSet); foreach (var entity in _entSet) { + // starlight edit - functionality to ignore certain entities when flashing + if (ignoreEntities != null) + { + if (ignoreEntities.Contains(entity)) + continue; + } + // TODO: Use RandomPredicted https://github.com/space-wizards/RobustToolbox/pull/5849 var seed = SharedRandomExtensions.HashCodeCombine((int)_timing.CurTick.Value, GetNetEntity(entity).Id); var rand = new System.Random(seed); @@ -246,7 +269,8 @@ public void FlashArea(EntityUid source, EntityUid? user, float range, TimeSpan f if (!_examine.InRangeUnOccluded(entity, mapPosition, range, predicate: (e) => _damagedByFlashingQuery.HasComponent(e))) continue; - Flash(entity, user, source, flashDuration, slowTo, displayPopup); + // starlight edit - hardcoded melee and stun duration parameters and functionality to override flash immunity + Flash(entity, user, source, flashDuration, slowTo, displayPopup, false, null, overrideFlashImmunity); } _audio.PlayPredicted(sound, source, user, AudioParams.Default.WithVolume(1f).WithMaxDistance(3f)); diff --git a/Content.Shared/_Starlight/Changeling/AbsorbedSystem.cs b/Content.Shared/_Starlight/Changeling/AbsorbedSystem.cs index 2fa3378623ee..9a2e152c0bc0 100644 --- a/Content.Shared/_Starlight/Changeling/AbsorbedSystem.cs +++ b/Content.Shared/_Starlight/Changeling/AbsorbedSystem.cs @@ -1,10 +1,13 @@ using Content.Shared.Examine; using Content.Shared.Mobs; +using Content.Shared.Atmos.Rotting; // starlight edit namespace Content.Shared._Starlight.Changeling; public sealed partial class AbsorbedSystem : EntitySystem { + [Dependency] private SharedRottingSystem _rotting = default!; + public override void Initialize() { base.Initialize(); @@ -16,6 +19,7 @@ public override void Initialize() private void OnExamine(Entity ent, ref ExaminedEvent args) { args.PushMarkup(Loc.GetString("changeling-absorb-onexamine")); + args.PushMarkup(Loc.GetString("changeling-absorb-onexamine-fluid")); } private void OnMobStateChange(Entity ent, ref MobStateChangedEvent args) @@ -23,5 +27,11 @@ private void OnMobStateChange(Entity ent, ref MobStateChanged // in case one somehow manages to dehusk someone if (args.NewMobState != MobState.Dead) RemComp(ent); + // starlight edit - start: The changeling devour changes the rot timer, so we need to reset it when reviving someone + if (TryComp(ent, out var perishable)) + { + _rotting.SetRotAfter(ent, TimeSpan.FromMinutes(10), perishable); + } + // starlight edit - end } } diff --git a/Content.Shared/_Starlight/Changeling/ChangelingComponent.cs b/Content.Shared/_Starlight/Changeling/ChangelingComponent.cs index dfe37138a2fb..4830734d1077 100644 --- a/Content.Shared/_Starlight/Changeling/ChangelingComponent.cs +++ b/Content.Shared/_Starlight/Changeling/ChangelingComponent.cs @@ -49,7 +49,7 @@ public sealed partial class ChangelingComponent : Component public bool StealthEnabled = false; [DataField] - public float StealthDrain = 1.5f; + public float StealthDrain = 1.25f; // starlight edit - 1.5 -> 1.25; 3.3 minutes -> 6.6 minutes to fully drain 100 chemicals [DataField] public float StasisDrain = 0.2f; diff --git a/Resources/Locale/en-US/abilities/changeling.ftl b/Resources/Locale/en-US/abilities/changeling.ftl index e9424bca4cce..97a4ebb390db 100644 --- a/Resources/Locale/en-US/abilities/changeling.ftl +++ b/Resources/Locale/en-US/abilities/changeling.ftl @@ -11,6 +11,7 @@ changeling-absorb-fail-unabsorbable = The target is not absorbable. changeling-absorb-end-self = Another organic absorbed. You are evolving. changeling-absorb-end-self-ling = Another changeling absorbed. You are evolving more rapidly. changeling-absorb-onexamine = [color=red]The body feels hollow.[/color] +changeling-absorb-onexamine-fluid = [color=white]The body is covered in a thick chemical.[/color] changeling-transform-cycle = Switched to {$target}'s DNA. changeling-transform-cycle-empty = You don't have any DNA strains! diff --git a/Resources/Locale/en-US/store/changeling-catalog.ftl b/Resources/Locale/en-US/store/changeling-catalog.ftl index 6368516d9aa9..f061366dbd55 100644 --- a/Resources/Locale/en-US/store/changeling-catalog.ftl +++ b/Resources/Locale/en-US/store/changeling-catalog.ftl @@ -119,6 +119,7 @@ evolutionmenu-utility-stims-desc = evolutionmenu-utility-fleshmend-name = Fleshmend evolutionmenu-utility-fleshmend-desc = Rapidly heal yourself of all bruises and burns. + WARNING: Requires you to absorb at least 2 organics to use the ability. Costs 35 chemicals. # Starlight - monkey form is permanent (until transform is fixed, at least) diff --git a/Resources/Prototypes/_Starlight/Actions/changeling.yml b/Resources/Prototypes/_Starlight/Actions/changeling.yml index 0e9d0789f826..455b1610dd4d 100644 --- a/Resources/Prototypes/_Starlight/Actions/changeling.yml +++ b/Resources/Prototypes/_Starlight/Actions/changeling.yml @@ -609,6 +609,7 @@ event: !type:ActionFleshmendEvent {} - type: ChangelingAction chemicalCost: 35 + requireAbsorbed: 2 # easily one of the strongest combat abilities. Shouldn't be available round start useInLesserForm: true - type: entity From ad2a9c7e01dd6a4e3e5a195fdd1da670d58d873f Mon Sep 17 00:00:00 2001 From: TurkishCat <159595419+Turk1shcat@users.noreply.github.com> Date: Mon, 17 Aug 2026 15:13:04 -0700 Subject: [PATCH 02/16] fix whitespaces ig --- .../_Starlight/Changeling/ChangelingSystem.Abilities.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Content.Server/_Starlight/Changeling/ChangelingSystem.Abilities.cs b/Content.Server/_Starlight/Changeling/ChangelingSystem.Abilities.cs index e6e2103920e3..331dcaa2d5bb 100644 --- a/Content.Server/_Starlight/Changeling/ChangelingSystem.Abilities.cs +++ b/Content.Server/_Starlight/Changeling/ChangelingSystem.Abilities.cs @@ -163,7 +163,7 @@ private void OnDevouredPerson(EntityUid uid, ChangelingComponent comp, ref OnLin EnsureComp(target); // Starlight edit start - doubles the length of the rotting timer from 10 to 20 - if (TryComp(target, out var perishable)) + if (TryComp(target, out var perishable)) { _rotting.SetRotAfter(target, TimeSpan.FromMinutes(20), perishable); } @@ -323,9 +323,7 @@ private void OnShriekResonant(EntityUid uid, ChangelingComponent comp, ref Shrie // breaks lights if (lights.HasComponent(ent)) _light.TryDestroyBulb(ent); - } - private void OnToggleStrainedMuscles(EntityUid uid, ChangelingComponent comp, ref ToggleStrainedMusclesEvent args) => ToggleStrainedMuscles(uid, comp); private void ToggleStrainedMuscles(EntityUid uid, ChangelingComponent comp) From b0d6cd9472a09cdf34eb821963213e4be3c2098e Mon Sep 17 00:00:00 2001 From: TurkishCat <159595419+Turk1shcat@users.noreply.github.com> Date: Mon, 17 Aug 2026 15:15:54 -0700 Subject: [PATCH 03/16] braces to appease the rabbit gods --- Content.Shared/_Starlight/Changeling/AbsorbedSystem.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Content.Shared/_Starlight/Changeling/AbsorbedSystem.cs b/Content.Shared/_Starlight/Changeling/AbsorbedSystem.cs index 9a2e152c0bc0..9b8c1d134061 100644 --- a/Content.Shared/_Starlight/Changeling/AbsorbedSystem.cs +++ b/Content.Shared/_Starlight/Changeling/AbsorbedSystem.cs @@ -25,13 +25,14 @@ private void OnExamine(Entity ent, ref ExaminedEvent args) private void OnMobStateChange(Entity ent, ref MobStateChangedEvent args) { // in case one somehow manages to dehusk someone - if (args.NewMobState != MobState.Dead) + if (args.NewMobState != MobState.Dead) { RemComp(ent); // starlight edit - start: The changeling devour changes the rot timer, so we need to reset it when reviving someone if (TryComp(ent, out var perishable)) { _rotting.SetRotAfter(ent, TimeSpan.FromMinutes(10), perishable); } + } // starlight edit - end } } From f354b6084add57f515ea958251f006f97ceb1605 Mon Sep 17 00:00:00 2001 From: TurkishCat <159595419+Turk1shcat@users.noreply.github.com> Date: Mon, 17 Aug 2026 15:18:08 -0700 Subject: [PATCH 04/16] im dumb, thanks walks --- Content.Shared/_Starlight/Changeling/ChangelingComponent.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/_Starlight/Changeling/ChangelingComponent.cs b/Content.Shared/_Starlight/Changeling/ChangelingComponent.cs index b7180cae0f8a..76cea913b880 100644 --- a/Content.Shared/_Starlight/Changeling/ChangelingComponent.cs +++ b/Content.Shared/_Starlight/Changeling/ChangelingComponent.cs @@ -49,7 +49,7 @@ public sealed partial class ChangelingComponent : Component public bool StealthEnabled = false; [DataField] - public float StealthDrain = 1.25f; // starlight edit - 1.5 -> 1.25; 3.3 minutes -> 6.6 minutes to fully drain 100 chemicals + public float StealthDrain = 1.25f; // 1.5 -> 1.25; 3.3 minutes -> 6.6 minutes to fully drain 100 chemicals [DataField] public float StasisDrain = 0.2f; From bd337c462bdf70918267c4ce3f263fe01ddc31ec Mon Sep 17 00:00:00 2001 From: TurkishCat <159595419+Turk1shcat@users.noreply.github.com> Date: Mon, 17 Aug 2026 15:23:10 -0700 Subject: [PATCH 05/16] region block to appease the rabbit gods --- Content.Shared/Atmos/Rotting/SharedRottingSystem.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs b/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs index 1f4e69d07745..8044a1bc8dd8 100644 --- a/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs +++ b/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs @@ -176,7 +176,7 @@ public int RotStage(EntityUid uid, RottingComponent? comp = null, PerishableComp return (int) (comp.TotalRotTime.TotalSeconds / perishable.RotAfter.TotalSeconds); } - // starlight edit - start + #region Starlight public bool SetRotAfter(EntityUid uid, TimeSpan newTime, PerishableComponent? perishable = null) { if (!Resolve(uid, ref perishable)) @@ -185,5 +185,5 @@ public bool SetRotAfter(EntityUid uid, TimeSpan newTime, PerishableComponent? pe perishable.RotAfter = newTime; return true; } - // starlight edit - end + #endregion Starlight } From 47230f20863b3f43365c8a81564a95668f801ef9 Mon Sep 17 00:00:00 2001 From: TurkishCat <159595419+Turk1shcat@users.noreply.github.com> Date: Mon, 17 Aug 2026 15:24:53 -0700 Subject: [PATCH 06/16] starlight edit clarity --- Resources/Locale/en-US/store/changeling-catalog.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Locale/en-US/store/changeling-catalog.ftl b/Resources/Locale/en-US/store/changeling-catalog.ftl index f061366dbd55..51d983ded773 100644 --- a/Resources/Locale/en-US/store/changeling-catalog.ftl +++ b/Resources/Locale/en-US/store/changeling-catalog.ftl @@ -119,7 +119,7 @@ evolutionmenu-utility-stims-desc = evolutionmenu-utility-fleshmend-name = Fleshmend evolutionmenu-utility-fleshmend-desc = Rapidly heal yourself of all bruises and burns. - WARNING: Requires you to absorb at least 2 organics to use the ability. + WARNING: Requires you to absorb at least 2 organics to use the ability. // starlight edit Costs 35 chemicals. # Starlight - monkey form is permanent (until transform is fixed, at least) From 3c53ec500534a4c20e253c27d803bcd6ec6e9810 Mon Sep 17 00:00:00 2001 From: TurkishCat <159595419+Turk1shcat@users.noreply.github.com> Date: Mon, 17 Aug 2026 15:31:41 -0700 Subject: [PATCH 07/16] no more override flash immunity (sharedflashsystem) --- Content.Shared/Flash/SharedFlashSystem.cs | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/Content.Shared/Flash/SharedFlashSystem.cs b/Content.Shared/Flash/SharedFlashSystem.cs index 50e118b4131b..624b669e84a7 100644 --- a/Content.Shared/Flash/SharedFlashSystem.cs +++ b/Content.Shared/Flash/SharedFlashSystem.cs @@ -162,7 +162,6 @@ private bool UseFlash(Entity ent, EntityUid? user) /// Whether or not to show a popup to the target player. /// Was this flash caused by a melee attack? Used for checking for revolutionary conversion. /// The time the target will be stunned. If null the target will be slowed down instead. - /// Whether to override flash immunity checks. (STARLIGHT EDIT) public void Flash( EntityUid target, EntityUid? user, @@ -171,8 +170,7 @@ public void Flash( float slowTo, bool displayPopup = true, bool melee = false, - TimeSpan? stunDuration = null, - bool overrideFlashImmunity = false) + TimeSpan? stunDuration = null) { var attempt = new FlashAttemptEvent(target, user, used); RaiseLocalEvent(target, ref attempt, true); @@ -191,7 +189,7 @@ public void Flash( #endregion Starlight // don't paralyze, slowdown or convert to rev if the target is immune to flashes; STARLIGHT EDIT - functionality added to override flash immunity - if (!overrideFlashImmunity && !_statusEffectsSystem.TryAddStatusEffect(target, FlashedKey, flashDuration, true)) + if (!_statusEffectsSystem.TryAddStatusEffect(target, FlashedKey, flashDuration, true)) return; if (stunDuration != null) @@ -224,10 +222,7 @@ public void Flash( /// Whether or not to show a popup to the target player. /// Chance to be flashed. Rolled separately for each target in range. /// Additional sound to play at the source. - /// starlight edit - start - /// Whether to override flash immunity checks. - /// Entities to ignore when flashing. - /// starlight edit - end + /// Entities to ignore when flashing. (STARLIGHT EDIT) public void FlashArea( EntityUid source, EntityUid? user, @@ -237,7 +232,6 @@ public void FlashArea( bool displayPopup = false, float probability = 1f, SoundSpecifier? sound = null, - bool overrideFlashImmunity = false, List? ignoreEntities = null) { var transform = Transform(source); @@ -270,7 +264,7 @@ public void FlashArea( continue; // starlight edit - hardcoded melee and stun duration parameters and functionality to override flash immunity - Flash(entity, user, source, flashDuration, slowTo, displayPopup, false, null, overrideFlashImmunity); + Flash(entity, user, source, flashDuration, slowTo, displayPopup, false, null); } _audio.PlayPredicted(sound, source, user, AudioParams.Default.WithVolume(1f).WithMaxDistance(3f)); From 58b7c50c93047cc8a44a3740c6b79eac8d8c037a Mon Sep 17 00:00:00 2001 From: TurkishCat <159595419+Turk1shcat@users.noreply.github.com> Date: Mon, 17 Aug 2026 15:34:59 -0700 Subject: [PATCH 08/16] Refactor flash handling and clean up comments --- Content.Shared/Flash/SharedFlashSystem.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Content.Shared/Flash/SharedFlashSystem.cs b/Content.Shared/Flash/SharedFlashSystem.cs index 624b669e84a7..1cfaf3044f5d 100644 --- a/Content.Shared/Flash/SharedFlashSystem.cs +++ b/Content.Shared/Flash/SharedFlashSystem.cs @@ -188,7 +188,7 @@ public void Flash( } #endregion Starlight - // don't paralyze, slowdown or convert to rev if the target is immune to flashes; STARLIGHT EDIT - functionality added to override flash immunity + // don't paralyze, slowdown or convert to rev if the target is immune to flashes if (!_statusEffectsSystem.TryAddStatusEffect(target, FlashedKey, flashDuration, true)) return; @@ -263,8 +263,7 @@ public void FlashArea( if (!_examine.InRangeUnOccluded(entity, mapPosition, range, predicate: (e) => _damagedByFlashingQuery.HasComponent(e))) continue; - // starlight edit - hardcoded melee and stun duration parameters and functionality to override flash immunity - Flash(entity, user, source, flashDuration, slowTo, displayPopup, false, null); + Flash(entity, user, source, flashDuration, slowTo, displayPopup); } _audio.PlayPredicted(sound, source, user, AudioParams.Default.WithVolume(1f).WithMaxDistance(3f)); From d426f1e0ce20f3cc09acc2b4689c8b2cf3d11a35 Mon Sep 17 00:00:00 2001 From: TurkishCat <159595419+Turk1shcat@users.noreply.github.com> Date: Mon, 17 Aug 2026 15:35:17 -0700 Subject: [PATCH 09/16] no more flash immunity --- .../_Starlight/Changeling/ChangelingSystem.Abilities.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Server/_Starlight/Changeling/ChangelingSystem.Abilities.cs b/Content.Server/_Starlight/Changeling/ChangelingSystem.Abilities.cs index 331dcaa2d5bb..7fdddd258664 100644 --- a/Content.Server/_Starlight/Changeling/ChangelingSystem.Abilities.cs +++ b/Content.Server/_Starlight/Changeling/ChangelingSystem.Abilities.cs @@ -313,9 +313,9 @@ private void OnShriekResonant(EntityUid uid, ChangelingComponent comp, ref Shrie DoScreech(uid, comp); var power = comp.ShriekPower; - // Starlight edit - Overrides flash immunity. Why would a shriek get blocked by glasses? Also ignores the changeling doing the shriek. + // Starlight edit - ignores the changeling doing the shriek so you dont flash yourself List ignoreList = new() { uid }; - _flash.FlashArea(uid, uid, power, TimeSpan.FromMilliseconds(power * 2f * 1000f), 0.8f, false, 1f, null, true, ignoreList); + _flash.FlashArea(uid, uid, power, TimeSpan.FromMilliseconds(power * 2f * 1000f), 0.8f, false, 1f, null, ignoreList); var lookup = _lookup.GetEntitiesInRange(uid, power); var lights = GetEntityQuery(); From b95d6994f287e1b87b7826869d9554001a52b455 Mon Sep 17 00:00:00 2001 From: TurkishCat <159595419+Turk1shcat@users.noreply.github.com> Date: Mon, 17 Aug 2026 15:39:39 -0700 Subject: [PATCH 10/16] whitespaces..... --- Content.Shared/Flash/SharedFlashSystem.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Content.Shared/Flash/SharedFlashSystem.cs b/Content.Shared/Flash/SharedFlashSystem.cs index 1cfaf3044f5d..c6ba4ed254c4 100644 --- a/Content.Shared/Flash/SharedFlashSystem.cs +++ b/Content.Shared/Flash/SharedFlashSystem.cs @@ -224,13 +224,13 @@ public void Flash( /// Additional sound to play at the source. /// Entities to ignore when flashing. (STARLIGHT EDIT) public void FlashArea( - EntityUid source, - EntityUid? user, - float range, - TimeSpan flashDuration, + EntityUid source, + EntityUid? user, + float range, + TimeSpan flashDuration, float slowTo = 0.8f, - bool displayPopup = false, - float probability = 1f, + bool displayPopup = false, + float probability = 1f, SoundSpecifier? sound = null, List? ignoreEntities = null) { From bd694c9127bc231d764c6519db81444052795dd5 Mon Sep 17 00:00:00 2001 From: TurkishCat <159595419+Turk1shcat@users.noreply.github.com> Date: Tue, 1 Sep 2026 18:14:15 -0700 Subject: [PATCH 11/16] removed _Starlight edit comments --- .../_Starlight/Changeling/ChangelingSystem.Abilities.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/Content.Server/_Starlight/Changeling/ChangelingSystem.Abilities.cs b/Content.Server/_Starlight/Changeling/ChangelingSystem.Abilities.cs index f3c2bccec1ee..f9d476f44319 100644 --- a/Content.Server/_Starlight/Changeling/ChangelingSystem.Abilities.cs +++ b/Content.Server/_Starlight/Changeling/ChangelingSystem.Abilities.cs @@ -164,12 +164,10 @@ private void OnDevouredPerson(EntityUid uid, ChangelingComponent comp, ref OnLin // Starlight edit end EnsureComp(target); - // Starlight edit start - doubles the length of the rotting timer from 10 to 20 if (TryComp(target, out var perishable)) { _rotting.SetRotAfter(target, TimeSpan.FromMinutes(20), perishable); } - // Starlight edit end var popup = Loc.GetString("changeling-absorb-end-self-ling"); var bonusChemicals = 0f; @@ -315,7 +313,6 @@ private void OnShriekResonant(EntityUid uid, ChangelingComponent comp, ref Shrie DoScreech(uid, comp); var power = comp.ShriekPower; - // Starlight edit - ignores the changeling doing the shriek so you dont flash yourself List ignoreList = new() { uid }; _flash.FlashArea(uid, uid, power, TimeSpan.FromMilliseconds(power * 2f * 1000f), 0.8f, false, 1f, null, ignoreList); From f164df98849588d5c801d2e95cf8a3fe85a7af90 Mon Sep 17 00:00:00 2001 From: TurkishCat <159595419+Turk1shcat@users.noreply.github.com> Date: Tue, 1 Sep 2026 18:16:01 -0700 Subject: [PATCH 12/16] Remove redundant comments --- Content.Shared/_Starlight/Changeling/AbsorbedSystem.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Content.Shared/_Starlight/Changeling/AbsorbedSystem.cs b/Content.Shared/_Starlight/Changeling/AbsorbedSystem.cs index 9b8c1d134061..794803a5edec 100644 --- a/Content.Shared/_Starlight/Changeling/AbsorbedSystem.cs +++ b/Content.Shared/_Starlight/Changeling/AbsorbedSystem.cs @@ -19,7 +19,6 @@ public override void Initialize() private void OnExamine(Entity ent, ref ExaminedEvent args) { args.PushMarkup(Loc.GetString("changeling-absorb-onexamine")); - args.PushMarkup(Loc.GetString("changeling-absorb-onexamine-fluid")); } private void OnMobStateChange(Entity ent, ref MobStateChangedEvent args) @@ -27,12 +26,11 @@ private void OnMobStateChange(Entity ent, ref MobStateChanged // in case one somehow manages to dehusk someone if (args.NewMobState != MobState.Dead) { RemComp(ent); - // starlight edit - start: The changeling devour changes the rot timer, so we need to reset it when reviving someone + // The changeling devour changes the rot timer, so we need to reset it when reviving someone if (TryComp(ent, out var perishable)) { _rotting.SetRotAfter(ent, TimeSpan.FromMinutes(10), perishable); } } - // starlight edit - end } } From c016100cf5c70a5aee778a0247f3916ef4f20afd Mon Sep 17 00:00:00 2001 From: TurkishCat <159595419+Turk1shcat@users.noreply.github.com> Date: Tue, 1 Sep 2026 18:19:32 -0700 Subject: [PATCH 13/16] remove fluff description Removed fluid description from changeling abilities. --- Resources/Locale/en-US/abilities/changeling.ftl | 1 - 1 file changed, 1 deletion(-) diff --git a/Resources/Locale/en-US/abilities/changeling.ftl b/Resources/Locale/en-US/abilities/changeling.ftl index 97a4ebb390db..e9424bca4cce 100644 --- a/Resources/Locale/en-US/abilities/changeling.ftl +++ b/Resources/Locale/en-US/abilities/changeling.ftl @@ -11,7 +11,6 @@ changeling-absorb-fail-unabsorbable = The target is not absorbable. changeling-absorb-end-self = Another organic absorbed. You are evolving. changeling-absorb-end-self-ling = Another changeling absorbed. You are evolving more rapidly. changeling-absorb-onexamine = [color=red]The body feels hollow.[/color] -changeling-absorb-onexamine-fluid = [color=white]The body is covered in a thick chemical.[/color] changeling-transform-cycle = Switched to {$target}'s DNA. changeling-transform-cycle-empty = You don't have any DNA strains! From 876316c5b4f5fc477e66178bfb1e6cac57b2371c Mon Sep 17 00:00:00 2001 From: TurkishCat <159595419+Turk1shcat@users.noreply.github.com> Date: Tue, 1 Sep 2026 18:20:05 -0700 Subject: [PATCH 14/16] Apply suggestion from @walksanatora Co-authored-by: Walker Fowlkes <47339836+walksanatora@users.noreply.github.com> --- Resources/Locale/en-US/store/changeling-catalog.ftl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Resources/Locale/en-US/store/changeling-catalog.ftl b/Resources/Locale/en-US/store/changeling-catalog.ftl index 51d983ded773..d4ec937a6a1f 100644 --- a/Resources/Locale/en-US/store/changeling-catalog.ftl +++ b/Resources/Locale/en-US/store/changeling-catalog.ftl @@ -117,9 +117,10 @@ evolutionmenu-utility-stims-desc = Costs 20 chemicals. evolutionmenu-utility-fleshmend-name = Fleshmend +# Starlight edit: Added warning about requiring two absorbtions evolutionmenu-utility-fleshmend-desc = - Rapidly heal yourself of all bruises and burns. - WARNING: Requires you to absorb at least 2 organics to use the ability. // starlight edit + Rapidly heal yourself of all bruises and burns. + WARNING: Requires you to absorb at least 2 organics to use the ability. Costs 35 chemicals. # Starlight - monkey form is permanent (until transform is fixed, at least) From 538b81a67be987373568aa224e53a93a73d6807b Mon Sep 17 00:00:00 2001 From: Turk1shcat Date: Wed, 2 Sep 2026 04:53:23 -0700 Subject: [PATCH 15/16] partial class stuff --- .../Atmos/Rotting/SharedRottingSystem.cs | 3 +++ .../_Starlight/Atmos/Rotting/RotTimerSystem.cs | 15 +++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 Content.Shared/_Starlight/Atmos/Rotting/RotTimerSystem.cs diff --git a/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs b/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs index cf959e0780a3..bbe36cffa30a 100644 --- a/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs +++ b/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs @@ -166,6 +166,7 @@ public int RotStage(EntityUid uid, RottingComponent? comp = null, PerishableComp return (int) (comp.TotalRotTime.TotalSeconds / perishable.RotAfter.TotalSeconds); } +<<<<<<< HEAD #region Starlight public bool SetRotAfter(EntityUid uid, TimeSpan newTime, PerishableComponent? perishable = null) @@ -177,4 +178,6 @@ public bool SetRotAfter(EntityUid uid, TimeSpan newTime, PerishableComponent? pe return true; } #endregion Starlight +======= +>>>>>>> 5792ab3c55 (partial class stuff) } diff --git a/Content.Shared/_Starlight/Atmos/Rotting/RotTimerSystem.cs b/Content.Shared/_Starlight/Atmos/Rotting/RotTimerSystem.cs new file mode 100644 index 000000000000..59fbcb847dc2 --- /dev/null +++ b/Content.Shared/_Starlight/Atmos/Rotting/RotTimerSystem.cs @@ -0,0 +1,15 @@ +using Content.Shared.Atmos.Rotting; + +namespace Content.Shared.Atmos.Rotting; + +public abstract partial class SharedRottingSystem +{ + public bool SetRotAfter(EntityUid uid, TimeSpan newTime, PerishableComponent? perishable = null) + { + if (!Resolve(uid, ref perishable)) + return false; + + perishable.RotAfter = newTime; + return true; + } +} \ No newline at end of file From 2ea47c0259216b2a90b8c478b0367f92c4b43bac Mon Sep 17 00:00:00 2001 From: TurkishCat <159595419+Turk1shcat@users.noreply.github.com> Date: Wed, 2 Sep 2026 05:14:56 -0700 Subject: [PATCH 16/16] Remove SetRotAfter method from SharedRottingSystem --- .../Atmos/Rotting/SharedRottingSystem.cs | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs b/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs index bbe36cffa30a..230593d90668 100644 --- a/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs +++ b/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs @@ -166,18 +166,4 @@ public int RotStage(EntityUid uid, RottingComponent? comp = null, PerishableComp return (int) (comp.TotalRotTime.TotalSeconds / perishable.RotAfter.TotalSeconds); } -<<<<<<< HEAD - - #region Starlight - public bool SetRotAfter(EntityUid uid, TimeSpan newTime, PerishableComponent? perishable = null) - { - if (!Resolve(uid, ref perishable)) - return false; - - perishable.RotAfter = newTime; - return true; - } - #endregion Starlight -======= ->>>>>>> 5792ab3c55 (partial class stuff) }