Skip to content
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
cc31147
one commit because i messed up the history or whatever. sorry
Turk1shcat Aug 17, 2026
e85669c
Merge branch 'starlight-dev' into changeling-update-1
Turk1shcat Aug 17, 2026
ad2a9c7
fix whitespaces ig
Turk1shcat Aug 17, 2026
b0d6cd9
braces to appease the rabbit gods
Turk1shcat Aug 17, 2026
f354b60
im dumb, thanks walks
Turk1shcat Aug 17, 2026
bd337c4
region block to appease the rabbit gods
Turk1shcat Aug 17, 2026
47230f2
starlight edit clarity
Turk1shcat Aug 17, 2026
3c53ec5
no more override flash immunity (sharedflashsystem)
Turk1shcat Aug 17, 2026
58b7c50
Refactor flash handling and clean up comments
Turk1shcat Aug 17, 2026
d426f1e
no more flash immunity
Turk1shcat Aug 17, 2026
0edce19
Merge branch 'starlight-dev' into changeling-update-1
Turk1shcat Aug 17, 2026
b95d699
whitespaces.....
Turk1shcat Aug 17, 2026
ac28669
Merge branch 'starlight-dev' into changeling-update-1
Turk1shcat Aug 20, 2026
108ef76
Merge branch 'starlight-dev' into changeling-update-1
Turk1shcat Aug 22, 2026
bd6c4f5
Merge branch 'starlight-dev' into changeling-update-1
Turk1shcat Aug 25, 2026
0cc3255
Merge branch 'starlight-dev' into changeling-update-1
Turk1shcat Aug 26, 2026
bd694c9
removed _Starlight edit comments
Turk1shcat Sep 2, 2026
f164df9
Remove redundant comments
Turk1shcat Sep 2, 2026
c016100
remove fluff description
Turk1shcat Sep 2, 2026
876316c
Apply suggestion from @walksanatora
Turk1shcat Sep 2, 2026
aeb38a7
Merge branch 'starlight-dev' into changeling-update-1
Turk1shcat Sep 2, 2026
538b81a
partial class stuff
Turk1shcat Sep 2, 2026
2ea47c0
Remove SetRotAfter method from SharedRottingSystem
Turk1shcat Sep 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<ReagentPrototype> FerrochromicAcidPrototype = "FerrochromicAcid";
private static readonly ProtoId<ReagentPrototype> PolytrinicAcidPrototype = "PolytrinicAcid";
Expand Down Expand Up @@ -132,6 +134,7 @@ private void OnAbsorb(EntityUid uid, ChangelingComponent comp, ref AbsorbDNAEven
};
_doAfter.TryStartDoAfter(dargs);
}

public ProtoId<DamageGroupPrototype> AbsorbedDamageGroup = "Genetic";
private void OnDevouredPerson(EntityUid uid, ChangelingComponent comp, ref OnLingDevour args)
{
Expand Down Expand Up @@ -159,6 +162,12 @@ private void OnDevouredPerson(EntityUid uid, ChangelingComponent comp, ref OnLin
// Starlight edit end

EnsureComp<AbsorbedComponent>(target);
// Starlight edit start - doubles the length of the rotting timer from 10 to 20
Comment thread
Turk1shcat marked this conversation as resolved.
Outdated
if (TryComp<PerishableComponent>(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;
Expand Down Expand Up @@ -304,16 +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<EntityUid> 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<PoweredLightComponent>();

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);

private void ToggleStrainedMuscles(EntityUid uid, ChangelingComponent comp)
Expand Down
11 changes: 11 additions & 0 deletions Content.Shared/Atmos/Rotting/SharedRottingSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you please move this function into a partial class. if you need help you can ping me on discord and I can help (you technically dont have to because this was submitted before the announcement, but it saves us future cleanup)


perishable.RotAfter = newTime;
return true;
}
Comment thread
Turk1shcat marked this conversation as resolved.
Outdated
// starlight edit - end
Comment thread
Turk1shcat marked this conversation as resolved.
Outdated
}
34 changes: 29 additions & 5 deletions Content.Shared/Flash/SharedFlashSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@
/// <param name="displayPopup">Whether or not to show a popup to the target player.</param>
/// <param name="melee">Was this flash caused by a melee attack? Used for checking for revolutionary conversion.</param>
/// <param name="stunDuration">The time the target will be stunned. If null the target will be slowed down instead.</param>
/// <param name="overrideFlashImmunity">Whether to override flash immunity checks.</param> (STARLIGHT EDIT)
public void Flash(
EntityUid target,
EntityUid? user,
Expand All @@ -170,7 +171,8 @@
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);
Expand All @@ -188,8 +190,8 @@
}
#endregion Starlight

// don't paralyze, slowdown or convert to rev if the target is immune to flashes
if (!_statusEffectsSystem.TryAddStatusEffect<FlashedComponent>(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<FlashedComponent>(target, FlashedKey, flashDuration, true))
Comment thread
Turk1shcat marked this conversation as resolved.
Outdated
return;

if (stunDuration != null)
Expand Down Expand Up @@ -222,7 +224,21 @@
/// <param name="displayPopup">Whether or not to show a popup to the target player.</param>
/// <param name="probability">Chance to be flashed. Rolled separately for each target in range.</param>
/// <param name="sound">Additional sound to play at the source.</param>
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
/// <param name="overrideFlashImmunity">Whether to override flash immunity checks.</param>
/// <param name="ignoreEntities">Entities to ignore when flashing.</param>
/// starlight edit - end
public void FlashArea(
EntityUid source,

Check failure on line 232 in Content.Shared/Flash/SharedFlashSystem.cs

View workflow job for this annotation

GitHub Actions / EditorConfig Check

[EditorConfig] reported by reviewdog 馃惗 Trailing whitespace Raw Output: Content.Shared/Flash/SharedFlashSystem.cs:232:0: error: Trailing whitespace
EntityUid? user,

Check failure on line 233 in Content.Shared/Flash/SharedFlashSystem.cs

View workflow job for this annotation

GitHub Actions / EditorConfig Check

[EditorConfig] reported by reviewdog 馃惗 Trailing whitespace Raw Output: Content.Shared/Flash/SharedFlashSystem.cs:233:0: error: Trailing whitespace
float range,

Check failure on line 234 in Content.Shared/Flash/SharedFlashSystem.cs

View workflow job for this annotation

GitHub Actions / EditorConfig Check

[EditorConfig] reported by reviewdog 馃惗 Trailing whitespace Raw Output: Content.Shared/Flash/SharedFlashSystem.cs:234:0: error: Trailing whitespace
TimeSpan flashDuration,

Check failure on line 235 in Content.Shared/Flash/SharedFlashSystem.cs

View workflow job for this annotation

GitHub Actions / EditorConfig Check

[EditorConfig] reported by reviewdog 馃惗 Trailing whitespace Raw Output: Content.Shared/Flash/SharedFlashSystem.cs:235:0: error: Trailing whitespace
float slowTo = 0.8f,
bool displayPopup = false,

Check failure on line 237 in Content.Shared/Flash/SharedFlashSystem.cs

View workflow job for this annotation

GitHub Actions / EditorConfig Check

[EditorConfig] reported by reviewdog 馃惗 Trailing whitespace Raw Output: Content.Shared/Flash/SharedFlashSystem.cs:237:0: error: Trailing whitespace
float probability = 1f,

Check failure on line 238 in Content.Shared/Flash/SharedFlashSystem.cs

View workflow job for this annotation

GitHub Actions / EditorConfig Check

[EditorConfig] reported by reviewdog 馃惗 Trailing whitespace Raw Output: Content.Shared/Flash/SharedFlashSystem.cs:238:0: error: Trailing whitespace
SoundSpecifier? sound = null,
bool overrideFlashImmunity = false,
List<EntityUid>? ignoreEntities = null)
{
var transform = Transform(source);
var mapPosition = _transform.GetMapCoordinates(transform);
Expand All @@ -231,6 +247,13 @@
_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);
Expand All @@ -246,7 +269,8 @@
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));
Expand Down
13 changes: 12 additions & 1 deletion Content.Shared/_Starlight/Changeling/AbsorbedSystem.cs
Original file line number Diff line number Diff line change
@@ -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();
Expand All @@ -16,12 +19,20 @@ public override void Initialize()
private void OnExamine(Entity<AbsorbedComponent> ent, ref ExaminedEvent args)
{
args.PushMarkup(Loc.GetString("changeling-absorb-onexamine"));
args.PushMarkup(Loc.GetString("changeling-absorb-onexamine-fluid"));
Comment thread
Turk1shcat marked this conversation as resolved.
Outdated
}

private void OnMobStateChange(Entity<AbsorbedComponent> ent, ref MobStateChangedEvent args)
{
// in case one somehow manages to dehusk someone
if (args.NewMobState != MobState.Dead)
if (args.NewMobState != MobState.Dead) {
RemComp<AbsorbedComponent>(ent);
// starlight edit - start: The changeling devour changes the rot timer, so we need to reset it when reviving someone
Comment thread
Turk1shcat marked this conversation as resolved.
Outdated
if (TryComp<PerishableComponent>(ent, out var perishable))
{
_rotting.SetRotAfter(ent, TimeSpan.FromMinutes(10), perishable);
}
}
// starlight edit - end
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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; // 1.5 -> 1.25; 3.3 minutes -> 6.6 minutes to fully drain 100 chemicals

[DataField]
public float StasisDrain = 0.2f;
Expand Down
1 change: 1 addition & 0 deletions Resources/Locale/en-US/abilities/changeling.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Comment thread
Turk1shcat marked this conversation as resolved.
Outdated

changeling-transform-cycle = Switched to {$target}'s DNA.
changeling-transform-cycle-empty = You don't have any DNA strains!
Expand Down
1 change: 1 addition & 0 deletions Resources/Locale/en-US/store/changeling-catalog.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Comment thread
Turk1shcat marked this conversation as resolved.
Costs 35 chemicals.

# Starlight - monkey form is permanent (until transform is fixed, at least)
Expand Down
1 change: 1 addition & 0 deletions Resources/Prototypes/_Starlight/Actions/changeling.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading