Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-sync

This commit is contained in:
xPokee
2025-09-24 10:13:01 -04:00
313 changed files with 6548 additions and 4624 deletions
@@ -27,8 +27,8 @@
new /obj/effect/temp_visual/circle_wave/bluespace(get_turf(src))
playsound(src, 'sound/effects/magic/cosmic_energy.ogg', vol = 50)
var/turf/T = pick(get_area_turfs(impact_area))
if(!T)
var/turf/impact_turf = pick(get_area_turfs(impact_area))
if(!impact_turf)
return
// Calculate new position (searches through beacons in world)
@@ -51,39 +51,31 @@
return
// Calculate previous position for transition
var/turf/FROM = T // the turf of origin we're travelling FROM
var/turf/TO = get_turf(chosen) // the turf of origin we're travelling TO
var/turf/beacon_turf = get_turf(chosen) // the turf of origin we're travelling TO
playsound(TO, 'sound/effects/phasein.ogg', 100, TRUE)
playsound(beacon_turf, 'sound/effects/phasein.ogg', 100, TRUE)
priority_announce("Massive bluespace translocation detected.", "Anomaly Alert")
var/list/flashers = list()
for(var/mob/living/carbon/C in viewers(TO, null))
if(C.flash_act())
flashers += C
for(var/mob/living/living in viewers(beacon_turf, null))
if(living.flash_act(affect_silicon = TRUE, visual = TRUE, type = /atom/movable/screen/fullscreen/bluespace_sparkle, length = 2 SECONDS))
flashers += living
var/y_distance = TO.y - FROM.y
var/x_distance = TO.x - FROM.x
for (var/atom/movable/A in urange(12, FROM )) // iterate thru list of mobs in the area
if(istype(A, /obj/item/beacon))
continue // don't teleport beacons because that's just insanely stupid
if(iseyemob(A))
continue // Don't mess with AI eye, blob eye, xenobio or advanced cameras
if(A.anchored)
continue
var/y_distance = beacon_turf.y - impact_turf.y
var/x_distance = beacon_turf.x - impact_turf.x
var/list/available_turfs = RANGE_TURFS(12, beacon_turf)
for (var/atom/movable/movable in urange(12, impact_turf )) // iterate thru list of mobs in the area
if(istype(movable, /obj/item/beacon) || iseffect(movable) || iseyemob(movable))
continue // Don't mess with beacons, effects or camera mobs (blob, AI eye etc...)
if(movable.anchored)
continue // do_teleport doesn't check if the item is anchored or not.
var/turf/newloc = locate(A.x + x_distance, A.y + y_distance, TO.z) // calculate the new place
if(!A.Move(newloc) && newloc) // if the atom, for some reason, can't move, FORCE them to move! :) We try Move() first to invoke any movement-related checks the atom needs to perform after moving
A.forceMove(newloc)
var/turf/newloc = locate(movable.x + x_distance, movable.y + y_distance, beacon_turf.z) || pick(available_turfs) // calculate the new place, or pick a random one as fallback
do_teleport(movable, newloc, no_effects = TRUE)
if(ismob(A) && !(A in flashers)) // don't flash if we're already doing an effect
var/mob/give_sparkles = A
if(give_sparkles.client)
blue_effect(give_sparkles)
/obj/effect/anomaly/bluespace/proc/blue_effect(mob/make_sparkle)
make_sparkle.overlay_fullscreen("bluespace_flash", /atom/movable/screen/fullscreen/bluespace_sparkle, 1)
addtimer(CALLBACK(make_sparkle, TYPE_PROC_REF(/mob/, clear_fullscreen), "bluespace_flash"), 2 SECONDS)
if(isliving(movable) && !(movable in flashers)) // don't flash if we're already doing an effect
var/mob/living/give_sparkles = movable
give_sparkles.flash_act(affect_silicon = TRUE, visual = TRUE, type = /atom/movable/screen/fullscreen/bluespace_sparkle, length = 2 SECONDS)
/obj/effect/anomaly/bluespace/stabilize(anchor, has_core)
. = ..()
@@ -10,7 +10,7 @@
/obj/effect/spawner/random/sakhno/ammo
name = ".310 Strilka stripper clip spawner"
loot = list(
/obj/item/ammo_box/strilka310/surplus = 80,
/obj/item/ammo_box/strilka310 = 10,
/obj/item/ammo_box/speedloader/strilka310/surplus = 80,
/obj/item/ammo_box/speedloader/strilka310 = 10,
/obj/item/food/rationpack = 1,
)