Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
e4f04af
Stop time on a lone Reflex Surge
Jackriip Nov 11, 2026
34d4842
Paint the stopped-time afterimages the ring's green
Jackriip Nov 11, 2026
86cd344
Make the lone Reflex Surge slow the world instead of stopping it
Jackriip Nov 11, 2026
df73bd6
Run the dilation on its own timer and keep the user's shots in colour
Jackriip Nov 11, 2026
5d39c96
Keep the user's slow-mo shots in colour and drop deleted things from …
Jackriip Nov 11, 2026
e29bb28
Slow do_after, queued bursts, mechs, turrets and grenade fuses in the…
Jackriip Nov 11, 2026
c865602
Slow gore animation in the dilation field
Jackriip Nov 11, 2026
e348ff4
Turn off the reflex dodge while the Sandevistan user has the world sl…
Jackriip Nov 11, 2026
1a9b11b
Keep the green afterimage trail for the rest of a surge that slowed t…
Jackriip Nov 11, 2026
2af43b4
Let mobs on their own Cascade surge run at full speed in a dilation f…
Jackriip Nov 11, 2026
53d7947
Run surging mobs at their tier's rate relative to the Sandevistan user
Jackriip Nov 11, 2026
f52637c
Fly every bullet in the dilation field at the field's pace
Jackriip Nov 11, 2026
c0572b6
Slow the weather and the world's sounds for the Sandevistan user duri…
Jackriip Nov 11, 2026
82d56d4
Merge branch 'feature/sandevistan-relative' into feature/sandevistan-…
Jackriip Nov 11, 2026
1b2b68b
Run the Sandevistan slow-mo for the whole surge with no freeze, and l…
Jackriip Nov 11, 2026
b8ccd88
Roll the Sandevistan ring with the slow-mo, tint behind its front, fl…
Jackriip Nov 11, 2026
b4c7271
Merge remote-tracking branch 'origin2/feature/hyperviolence-mega' int…
Jackriip Nov 11, 2026
5ac509e
Keep a surging NPC's shots untinted, and bring the slow-mo tests in l…
Jackriip Nov 11, 2026
3116f29
Run the Sandevistan user's own mech or vehicle at full speed in their…
Jackriip Nov 11, 2026
09e0e2d
Merge remote-tracking branch 'origin2/feature/hyperviolence-mega' int…
Jackriip Nov 11, 2026
bf9c049
Sandevistan: no surge perks inside a slow-mo, crewmates slow like NPCs
Jackriip Nov 11, 2026
6de1b3b
Sandevistan: replay the slow-mo at normal speed when it ends (blocking)
Jackriip Nov 11, 2026
b66857f
Sandevistan replay: surge trail, surge sound and fight sounds, tweene…
Jackriip Nov 11, 2026
195be6b
Sandevistan: blood takes the slow-mo tint like the world; wet blood k…
Jackriip Nov 11, 2026
ec57b78
Sandevistan replay: everyone near the user holds still while it plays
Jackriip Nov 11, 2026
9bc7db3
Sandevistan replay: an afterimage on every tile crossed; wet blood re…
Jackriip Nov 11, 2026
c9a44a1
Sandevistan: tint blood with the colour matrix and hold its drying co…
Jackriip Nov 11, 2026
b356868
Sandevistan: tinted blood keeps its own colour under the slow-mo's tint
Jackriip Nov 11, 2026
f03b627
Sandevistan replay: name the changes no wrapper saw, and check them b…
Jackriip Nov 11, 2026
4261632
Sandevistan: tint loose gore with the world, end the slow-mo when the…
Jackriip Nov 12, 2026
c1079c2
Sandevistan: blood and gore take the slow-mo's tint like everything else
Jackriip Nov 12, 2026
5b27ac3
Sandevistan tests: a dead user's slow-mo ends at death; gib tint chec…
Jackriip Nov 12, 2026
b556106
Sandevistan: gut strand ends keep the slow-mo tint, gib meat replays …
Jackriip Nov 12, 2026
5c1917a
Sandevistan replay: the user's crit and damage screens come off for t…
Jackriip Nov 12, 2026
bbd7279
Sandevistan replay crit test: compare the user's look without the cra…
Jackriip Nov 12, 2026
e16be1a
Cyberware: the Cascade and Redline crashes no longer tint the screen
Jackriip Nov 12, 2026
d2b4a1b
Merge feature/hyperviolence-mega: plating deflect and cradle rig
Jackriip Nov 12, 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
8 changes: 8 additions & 0 deletions code/__HELPERS/mobs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -246,10 +246,18 @@ GLOBAL_LIST_INIT(skin_tone_names, list(

var/endtime = world.time + delay
var/starttime = world.time
var/dilation_tick = world.time // VOIDCREW EDIT ADDITION - cyberware time dilation
. = TRUE
while (world.time < endtime)
stoplag(1)

// VOIDCREW EDIT ADDITION START - cyberware time dilation (voidcrew/modules/cyberware/ware_sandy_timestop.dm): a slowed body works slower, a frozen one not at all
var/dilation_lost = cyberware_time_lost(user, world.time - dilation_tick)
dilation_tick = world.time
endtime += dilation_lost
starttime += dilation_lost
// VOIDCREW EDIT ADDITION END

if(!QDELETED(progbar))
progbar.update(world.time - starttime)

Expand Down
6 changes: 5 additions & 1 deletion code/datums/components/ranged_attacks.dm
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,12 @@
INVOKE_ASYNC(src, PROC_REF(async_fire_ranged_attack), firer, target, modifiers)
if(isnull(burst_shots))
return
// VOIDCREW EDIT CHANGE START - cyberware time dilation (voidcrew/modules/cyberware/ware_sandy_timestop.dm): each burst shot waits for the mob's own clock, so a slowed mob's burst slows down too
cyberware_burst_start = cyberware_burst_clock(firer)
for(var/i in 1 to (burst_shots - 1))
addtimer(CALLBACK(src, PROC_REF(async_fire_ranged_attack), firer, target, modifiers), i * burst_intervals)
addtimer(CALLBACK(src, PROC_REF(cyberware_burst_shot), firer, target, modifiers, i), i * burst_intervals)
// ORIGINAL: addtimer(CALLBACK(src, PROC_REF(async_fire_ranged_attack), firer, target, modifiers), i * burst_intervals)
// VOIDCREW EDIT CHANGE END

/// Actually fire the damn thing
/datum/component/ranged_attacks/proc/async_fire_ranged_attack(mob/living/basic/firer, atom/target, modifiers)
Expand Down
2 changes: 1 addition & 1 deletion code/game/objects/items/grenades/_grenade.dm
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@
active = TRUE
icon_state = (base_icon_state || initial(icon_state)) + "_active"
SEND_SIGNAL(src, COMSIG_GRENADE_ARMED, det_time, delayoverride)
addtimer(CALLBACK(src, PROC_REF(detonate)), isnull(delayoverride)? det_time : delayoverride)
addtimer(CALLBACK(src, PROC_REF(cyberware_fuse_done)), isnull(delayoverride)? det_time : delayoverride) // VOIDCREW EDIT CHANGE - cyberware time dilation (voidcrew/modules/cyberware/ware_sandy_timestop.dm): the fuse burns slow in a slowed field. ORIGINAL: addtimer(CALLBACK(src, PROC_REF(detonate)), isnull(delayoverride)? det_time : delayoverride)

/**
* detonate (formerly prime) refers to when the grenade actually delivers its payload (whether or not a boom/bang/detonation is involved)
Expand Down
12 changes: 12 additions & 0 deletions code/game/sound/sound.dm
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@
var/turf/turf_source = get_turf(source)
if (!turf_source)
return
// VOIDCREW EDIT ADDITION START - cyberware: a Sandevistan slow-mo keeps its sounds for its replay (voidcrew/modules/cyberware/ware_sandy_replay.dm)
if(length(GLOB.sandy_replays))
sandy_replay_hear(turf_source, soundin, vol, vary, extrarange, falloff_exponent, frequency, pressure_affected, ignore_walls, falloff_distance, use_reverb, volume_preference)
// VOIDCREW EDIT ADDITION END

//allocate a channel if necessary now so its the same for everyone
channel = channel || SSsounds.random_available_channel()
Expand Down Expand Up @@ -200,6 +204,14 @@
if(HAS_TRAIT(src, TRAIT_SOUND_DEBUGGED))
to_chat(src, span_admin("Max Range-[max_distance] Distance-[distance] Vol-[round(sound_to_use.volume, 0.01)] Sound-[sound_to_use.file]"))

// VOIDCREW EDIT CHANGE START - cyberware: a Sandevistan user hears the slowed world slowed (voidcrew/modules/cyberware/ware_sandy_senses.dm)
if(length(GLOB.cyberware_time_fields))
var/sandy_frequency = sound_to_use.frequency
cyberware_dilate_heard(src, turf_source, sound_to_use, usr)
SEND_SOUND(src, sound_to_use)
sound_to_use.frequency = sandy_frequency // the datum can be shared with the next listener
return
// VOIDCREW EDIT CHANGE END
SEND_SOUND(src, sound_to_use)

/proc/sound_to_playing_players(soundin, volume = 100, vary = FALSE, frequency = 0, channel = 0, pressure_affected = FALSE, sound/S)
Expand Down
11 changes: 11 additions & 0 deletions code/modules/projectiles/gun.dm
Original file line number Diff line number Diff line change
Expand Up @@ -448,6 +448,12 @@
if(!user || !firing_burst)
firing_burst = FALSE
return FALSE
// VOIDCREW EDIT ADDITION START - cyberware time dilation (voidcrew/modules/cyberware/ware_sandy_timestop.dm): each burst shot waits for the shooter's own clock, so a burst slows or stops with them
var/dilation_wait = cyberware_burst_wait(user, cyberware_burst_start, cyberware_burst_gap, iteration - 1)
if(dilation_wait > 0)
addtimer(CALLBACK(src, PROC_REF(process_burst), user, target, message, params, zone_override, random_spread, burst_spread_mult, iteration), dilation_wait)
return TRUE
// VOIDCREW EDIT ADDITION END
if(!issilicon(user))
if(iteration > 1 && !(user.is_holding(src))) //for burst firing
firing_burst = FALSE
Expand Down Expand Up @@ -517,6 +523,11 @@
if(user && HAS_TRAIT(user, TRAIT_DOUBLE_TAP))
modified_burst_delay = ROUND_UP(burst_delay * 0.5)
modified_fire_delay = ROUND_UP(fire_delay * 0.5)
// VOIDCREW EDIT ADDITION START - cyberware time dilation (voidcrew/modules/cyberware/ware_sandy_timestop.dm): a slowed shooter's gun cycles slowly too
cyberware_burst_start = cyberware_burst_clock(user)
cyberware_burst_gap = modified_burst_delay
modified_fire_delay = cyberware_dilated_time(user, modified_fire_delay)
// VOIDCREW EDIT ADDITION END

if(burst_size > 1)
firing_burst = TRUE
Expand Down
2 changes: 1 addition & 1 deletion code/modules/vehicles/mecha/_mecha.dm
Original file line number Diff line number Diff line change
Expand Up @@ -708,7 +708,7 @@

SEND_SIGNAL(user, COMSIG_MOB_USED_CLICK_MECH_MELEE, src)
if(target.mech_melee_attack(src, user))
TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MELEE_ATTACK, melee_cooldown)
TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MELEE_ATTACK, cyberware_dilated_time(src, melee_cooldown)) // VOIDCREW EDIT CHANGE - cyberware time dilation (voidcrew/modules/cyberware/ware_sandy_timestop.dm). ORIGINAL: TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MELEE_ATTACK, melee_cooldown)

/// Driver alt clicks anything while in mech
/obj/vehicle/sealed/mecha/proc/on_click_alt(mob/user, atom/target, params)
Expand Down
2 changes: 1 addition & 1 deletion code/modules/vehicles/mecha/equipment/mecha_equipment.dm
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@
return TRUE

/obj/item/mecha_parts/mecha_equipment/proc/action(mob/source, atom/target, list/modifiers)
TIMER_COOLDOWN_START(chassis, COOLDOWN_MECHA_EQUIPMENT(type), equip_cooldown)//Cooldown is on the MECH so people dont bypass it by switching equipment
TIMER_COOLDOWN_START(chassis, COOLDOWN_MECHA_EQUIPMENT(type), cyberware_dilated_time(chassis, equip_cooldown)) // VOIDCREW EDIT CHANGE - cyberware time dilation (voidcrew/modules/cyberware/ware_sandy_timestop.dm): a slowed mech's weapons cycle slowly. ORIGINAL: TIMER_COOLDOWN_START(chassis, COOLDOWN_MECHA_EQUIPMENT(type), equip_cooldown)//Cooldown is on the MECH so people dont bypass it by switching equipment
SEND_SIGNAL(source, COMSIG_MOB_USED_MECH_EQUIPMENT, chassis)
chassis.use_energy(energy_drain)
return TRUE
Expand Down
3 changes: 3 additions & 0 deletions tgstation.dme
Original file line number Diff line number Diff line change
Expand Up @@ -7229,6 +7229,9 @@
#include "voidcrew\modules\cyberware\ware_pro_combat.dm"
#include "voidcrew\modules\cyberware\ware_pro_utility.dm"
#include "voidcrew\modules\cyberware\ware_registry.dm"
#include "voidcrew\modules\cyberware\ware_sandy_replay.dm"
#include "voidcrew\modules\cyberware\ware_sandy_senses.dm"
#include "voidcrew\modules\cyberware\ware_sandy_timestop.dm"
#include "voidcrew\modules\cyberware\ware_second_wind.dm"
#include "voidcrew\modules\cyberware\ware_street.dm"
#include "voidcrew\modules\cyberware\ware_street_passives.dm"
Expand Down
8 changes: 8 additions & 0 deletions voidcrew/modules/bounties/chrome/bounty_chrome_cascade.dm
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,14 @@
return FALSE
return ..()

/datum/bounty_chrome_move/cascade/tell(atom/target)
cyberware_time_untint(owner) // its glow shows through a Sandevistan's slowed world (ware_sandy_timestop.dm)
return ..()

/datum/bounty_chrome_move/cascade/clear_tell()
. = ..()
cyberware_time_retint(owner)

/datum/bounty_chrome_move/cascade/tell_text(atom/target)
return "[owner]'s spine lights up with a rising whine."

Expand Down
24 changes: 21 additions & 3 deletions voidcrew/modules/cyberware/cyberware_anim.dm
Original file line number Diff line number Diff line change
Expand Up @@ -641,16 +641,20 @@
var/ring_alpha = 235
/// How long the ring takes to roll out and fade.
var/ring_time = 0.65 SECONDS
/// How far the ring rolls out when it stops time (ware_sandy_timestop.dm).
var/stop_ring_scale = 7.5

/obj/item/organ/cyberimp/cyberware/cascade/milspec
ring_scale = 2.7
ring_alpha = 190
ring_time = 0.55 SECONDS
stop_ring_scale = 6.5

/obj/item/organ/cyberimp/cyberware/cascade/street
ring_scale = 2.2
ring_alpha = 140
ring_time = 0.45 SECONDS
stop_ring_scale = 5.5

/obj/item/organ/cyberimp/cyberware/cascade/cyberware_worn_key()
return "[..()]-[node_look]"
Expand Down Expand Up @@ -735,8 +739,20 @@
/obj/item/organ/cyberimp/cyberware/cascade/proc/roll_ring()
ring_timer = null
var/turf/here = get_turf(owner)
if(here)
new /obj/effect/temp_visual/cyberware_time_ring(here, ring_scale, ring_alpha, ring_time)
if(!here)
return
new /obj/effect/temp_visual/cyberware_time_ring(here, ring_scale, ring_alpha, ring_time)

/// The world slows as the window opens: the green ring rolls out past the edge of the screen at once, with the
/// tint behind its front, instead of waiting for the last spine node.
/obj/item/organ/cyberimp/cyberware/cascade/proc/roll_stop_ring()
if(ring_timer)
deltimer(ring_timer)
ring_timer = null
var/turf/here = get_turf(owner)
if(!here)
return
new /obj/effect/temp_visual/cyberware_time_ring(here, stop_ring_scale, ring_alpha, ring_time, TRUE)

/// The crash: nodes die hips to neck and stay dark.
/obj/item/organ/cyberimp/cyberware/cascade/proc/play_crash()
Expand Down Expand Up @@ -784,9 +800,11 @@
randomdir = FALSE
duration = 0.65 SECONDS

/obj/effect/temp_visual/cyberware_time_ring/Initialize(mapload, max_scale = 3.3, peak_alpha = 235, ring_time = 0.65 SECONDS)
/obj/effect/temp_visual/cyberware_time_ring/Initialize(mapload, max_scale = 3.3, peak_alpha = 235, ring_time = 0.65 SECONDS, green = FALSE)
duration = ring_time
. = ..()
if(green)
color = cyberware_time_stop_green()
add_overlay(emissive_appearance(icon, icon_state, src))
transform = matrix().Scale(0.2)
alpha = peak_alpha
Expand Down
Binary file not shown.
92 changes: 66 additions & 26 deletions voidcrew/modules/cyberware/ware_legend.dm
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,11 @@
var/window_alert = /atom/movable/screen/alert/status_effect/cyberware_cascade
/// What the bearer reads on activation.
var/online_message = "CASCADE ONLINE."
/// How fast the world runs through the window when no other player is near (ware_sandy_timestop.dm).
var/dilation_scale = 0.2
/// How much faster than normal the bearer runs in the window. A surging mob in someone else's field runs at its
/// multiplier over theirs.
var/time_multiplier = 5

/obj/item/organ/cyberimp/cyberware/cascade/on_mob_remove(mob/living/carbon/organ_owner, special = FALSE, movement_flags)
. = ..()
Expand Down Expand Up @@ -125,10 +130,29 @@
cooldown_time = 60 SECONDS
click_to_activate = FALSE

/// Whether a press now would end a running window: a player's own press only. An NPC's AI never turns its surge off.
/datum/action/cooldown/cyberware/cascade_surge/proc/can_cut_short()
if(!isliving(owner))
return FALSE
var/mob/living/surger = owner
return !!surger.ckey && !!surger.has_status_effect(/datum/status_effect/cyberware_cascade_window)

/// The cooldown starts as the window opens, so pressing again to end the window early looks past it.
/datum/action/cooldown/cyberware/cascade_surge/IsAvailable(feedback = FALSE)
if(!can_cut_short())
return ..()
var/cooldown_end = next_use_time
next_use_time = 0
. = ..()
next_use_time = cooldown_end

/datum/action/cooldown/cyberware/cascade_surge/Activate(atom/target)
if(!isliving(owner))
return FALSE
var/mob/living/surger = owner
if(can_cut_short()) // the second press: back to real time, and the crash
surger.remove_status_effect(/datum/status_effect/cyberware_cascade_window)
return TRUE
if(surger.has_status_effect(/datum/status_effect/cyberware_cascade_window) || surger.has_status_effect(/datum/status_effect/cyberware_cascade_crash))
surger.balloon_alert(surger, "lattice still cycling!")
return FALSE
Expand Down Expand Up @@ -172,6 +196,8 @@
var/crash_stamina = CYBERWARE_CASCADE_CRASH_STAMINA
/// Steps taken so far, for the afterimage cadence.
var/steps_taken = 0
/// Whether the surge's own speed, quicker blows, crit and dodge are on now (refresh_perks()).
var/perks_on = FALSE

/// Optional second argument: the lattice whose numbers this window runs on.
/datum/status_effect/cyberware_cascade_window/on_creation(mob/living/new_owner, obj/item/organ/cyberimp/cyberware/cascade/lattice)
Expand All @@ -188,15 +214,16 @@
online_message = lattice.online_message
crash_duration = lattice.crash_duration
crash_stamina = lattice.crash_stamina
dilation_scale = lattice.dilation_scale
time_multiplier = lattice.time_multiplier
return ..()

/datum/status_effect/cyberware_cascade_window/on_apply()
trail_hue = rand(0, 359)
owner.add_movespeed_modifier(speed_type)
owner.add_movespeed_mod_immunities(id, /datum/movespeed_modifier/reagent)
cyberware_register_dodge_source(owner, id, CALLBACK(src, PROC_REF(get_dodge_chance)), melee = TRUE)
owner.hv_crit_set_attacker_bonus(id, crit_bonus)
RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(on_move))
RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(on_death))
owner.add_client_colour(colour_type, id)
playsound(owner, 'sound/effects/magic/timeparadox2.ogg', 70, TRUE)
owner.visible_message(
Expand All @@ -205,30 +232,57 @@
)
owner.balloon_alert(owner, "cascade online")
cyberware_cascade_window_fx(owner)
try_time_stop() // ware_sandy_timestop.dm
refresh_perks()
return TRUE

/datum/status_effect/cyberware_cascade_window/on_remove()
owner.remove_movespeed_modifier(speed_type)
end_time_stop()
set_perks(FALSE)
owner.remove_movespeed_mod_immunities(id, /datum/movespeed_modifier/reagent)
cyberware_unregister_dodge_source(owner, id)
owner.hv_crit_set_attacker_bonus(id, null)
UnregisterSignal(owner, COMSIG_MOVABLE_MOVED)
UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_LIVING_DEATH))
owner.remove_client_colour(id)
if(!QDELETED(owner) && owner.stat != DEAD)
// A slow-mo that ran to its end replays first, and the crash lands when the replay is over (ware_sandy_replay.dm).
if(!QDELETED(owner) && owner.stat != DEAD && !sandy_replay_defer_crash(owner, crash_duration, crash_stamina))
owner.apply_status_effect(/datum/status_effect/cyberware_cascade_crash, crash_duration, crash_stamina)
if(!QDELETED(owner))
cyberware_cascade_window_end_fx(owner)
return ..()

/// Signal proc for [COMSIG_LIVING_DEATH]: the bearer's slow-mo ends with them (its replay still plays).
/datum/status_effect/cyberware_cascade_window/proc/on_death(mob/living/source, gibbed)
SIGNAL_HANDLER
end_time_stop() // ware_sandy_timestop.dm

/// Melee cooldowns scaled for the window (changeNext_move multiplies these in).
/datum/status_effect/cyberware_cascade_window/nextmove_modifier()
return melee_mult
return perks_on ? melee_mult : 1

/**
* The surge's own edge (speed, quicker blows, crit, dodge) is off while a slow-mo carries the surger: its own
* (ware_sandy_timestop.dm), or someone else's that runs it at its relative rate. There it moves and swings at
* normal speed and only the world around it is slowed. Call whenever either changes.
*/
/datum/status_effect/cyberware_cascade_window/proc/refresh_perks()
set_perks(!time_stop && !cyberware_surge_in_field(owner))

/datum/status_effect/cyberware_cascade_window/proc/set_perks(on)
if(on == perks_on)
return
perks_on = on
if(on)
owner.add_movespeed_modifier(speed_type)
owner.hv_crit_set_attacker_bonus(id, crit_bonus)
else
owner.remove_movespeed_modifier(speed_type)
owner.hv_crit_set_attacker_bonus(id, null)

/// Dodge-source callback for the shared arbiter: flat chance while the window
/// lives (the arbiter itself enforces the moving-only and point-blank rules
/// for shots, and the pinned rules for blows).
/datum/status_effect/cyberware_cascade_window/proc/get_dodge_chance()
return dodge_chance
return perks_on ? dodge_chance : 0

/// Signal proc for [COMSIG_MOVABLE_MOVED]: one afterimage per step, the
/// telegraph everyone in the fight can read. Each step shifts the hue, so the
Expand All @@ -240,6 +294,10 @@
steps_taken++
if(steps_taken % afterimage_interval) // cheaper chrome leaves a sparser trail
return
if(time_stop) // green while the world is slowed
stopped_afterimage(old_loc)
return
trail_hue = cyberware_time_trail_hue(owner, trail_hue) // ware_sandy_timestop.dm
new /obj/effect/temp_visual/decoy/fading/cascade(old_loc, owner, trail_hue, afterimage_alpha)
trail_hue = (trail_hue + CYBERWARE_CASCADE_HUE_STEP) % 360

Expand Down Expand Up @@ -299,7 +357,6 @@
/datum/status_effect/cyberware_cascade_crash/on_apply()
owner.add_movespeed_modifier(/datum/movespeed_modifier/cyberware_cascade_crash)
owner.adjustStaminaLoss(crash_stamina)
owner.add_client_colour(/datum/client_colour/cyberware_cascade_crash, id)
playsound(owner, 'sound/machines/warning-buzzer.ogg', 50, TRUE)
owner.visible_message(
span_warning("[owner] staggers, every movement suddenly leaden."),
Expand All @@ -311,7 +368,6 @@

/datum/status_effect/cyberware_cascade_crash/on_remove()
owner.remove_movespeed_modifier(/datum/movespeed_modifier/cyberware_cascade_crash)
owner.remove_client_colour(id)
if(!QDELETED(owner) && owner.stat != DEAD)
owner.balloon_alert(owner, "systems restabilized")
if(!QDELETED(owner))
Expand All @@ -331,13 +387,6 @@
fade_in = 3
fade_out = 3

/// The crash's screen: drained and gray-brown.
/datum/client_colour/cyberware_cascade_crash
priority = CLIENT_COLOR_ORGAN_PRIORITY
color = list(0.55, 0.3, 0.25, 0.35, 0.55, 0.25, 0.25, 0.25, 0.5)
fade_in = 3
fade_out = 5

// =========================================================================
// REDLINE CORE
// =========================================================================
Expand Down Expand Up @@ -777,7 +826,6 @@
/datum/status_effect/cyberware_redline_crash/on_apply()
owner.add_movespeed_modifier(/datum/movespeed_modifier/cyberware_redline_crash)
owner.adjustStaminaLoss(stamina_dump)
owner.add_client_colour(/datum/client_colour/cyberware_redline_crash, id)
owner.visible_message(
span_warning("[owner] sags as the red drains out of [owner.p_their()] eyes."),
span_userdanger("The core slams shut and your legs go out from under you."),
Expand All @@ -789,7 +837,6 @@

/datum/status_effect/cyberware_redline_crash/on_remove()
owner.remove_movespeed_modifier(/datum/movespeed_modifier/cyberware_redline_crash)
owner.remove_client_colour(id)
if(!QDELETED(owner) && owner.stat != DEAD)
owner.balloon_alert(owner, "core recovered")
if(!QDELETED(owner))
Expand All @@ -806,13 +853,6 @@
fade_in = 2
fade_out = 10

/// The crash's screen: burnt out, brown-gray.
/datum/client_colour/cyberware_redline_crash
priority = CLIENT_COLOR_ORGAN_PRIORITY
color = list(0.6, 0.35, 0.3, 0.3, 0.5, 0.25, 0.25, 0.25, 0.45)
fade_in = 3
fade_out = 5

// =========================================================================
// GOVERNOR DELETE
// =========================================================================
Expand Down
Loading