diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm
index b96937bfb9f..903ca6910ea 100644
--- a/code/game/objects/effects/anomalies.dm
+++ b/code/game/objects/effects/anomalies.dm
@@ -3,11 +3,12 @@
/obj/effect/anomaly
name = "anomaly"
icon = 'icons/effects/effects.dmi'
- desc = "A mysterious anomaly seen in the region of space that the station orbits."
+ desc = "A mysterious anomaly, seen commonly only in the region of space that the station orbits..."
icon_state = "bhole3"
unacidable = 1
density = 0
anchored = 1
+ luminosity = 3
var/obj/item/device/assembly/signaler/anomaly/aSignal = null
/obj/effect/anomaly/New()
@@ -45,7 +46,7 @@
density = 1
var/boing = 0
-obj/effect/anomaly/grav/New()
+/obj/effect/anomaly/grav/New()
..()
aSignal.origin_tech = "magnets=5;powerstorage=4"
@@ -77,25 +78,42 @@ obj/effect/anomaly/grav/New()
/////////////////////
-obj/effect/anomaly/flux
+/obj/effect/anomaly/flux
name = "flux wave anomaly"
- icon_state = "electricity"
+ icon_state = "electricity2"
-obj/effect/anomaly/flux/New()
+/obj/effect/anomaly/flux/New()
..()
aSignal.origin_tech = "powerstorage=5;programming=3;plasmatech=2"
/////////////////////
-obj/effect/anomaly/pyro
+/obj/effect/anomaly/bluespace
+ name = "bluespace anomaly"
+ icon = 'icons/obj/projectiles.dmi'
+ icon_state = "bluespace"
+ density = 1
+
+/obj/effect/anomaly/bluespace/New()
+ ..()
+ aSignal.origin_tech = "bluespace=5;magnets=3;powerstorage=2"
+
+/obj/effect/anomaly/bluespace/Bumped(atom/A)
+ if(isliving(A))
+ do_teleport(A, locate(A.x, A.y, A.z), 10)
+ return
+
+/////////////////////
+
+/obj/effect/anomaly/pyro
name = "pyroclastic anomaly"
icon_state = "mustard"
-obj/effect/anomaly/pyro/New()
+/obj/effect/anomaly/pyro/New()
..()
aSignal.origin_tech = "plasmatech=5;powerstorage=3;biotech=3"
-obj/effect/anomaly/pyro/anomalyEffect()
+/obj/effect/anomaly/pyro/anomalyEffect()
..()
var/turf/simulated/T = get_turf(src)
if(istype(T))
@@ -107,9 +125,8 @@ obj/effect/anomaly/pyro/anomalyEffect()
name = "vortex anomaly"
icon_state = "bhole3"
desc = "That's a nice station you have there. It'd be a shame if something happened to it."
-// var/blow = 0
-obj/effect/anomaly/bhole/New()
+/obj/effect/anomaly/bhole/New()
..()
aSignal.origin_tech = "materials=5;combat=4;engineering=3"
@@ -119,21 +136,18 @@ obj/effect/anomaly/bhole/New()
del(src)
return
- //blow = 3
+ grav(rand(0,3), rand(2,3), 50, 25)
//Throwing stuff around!
for(var/obj/O in orange(1,src))
if(!O.anchored)
- // var/atom/target = get_edge_target_turf(O, get_dir(src, get_step_away(O, src)))
- var/mob/living/target = locate() in view(7,src)
+ var/mob/living/target = locate() in view(5,src)
if(!target)
- return 0
- O.throw_at(target, 6, 10)
- // blow--
+ return
+ O.throw_at(target, 5, 10)
+ return
else
- O.ex_act(1)
-
- grav(rand(0,3), rand(2,3), 50, 25)//10, 75 // 0,25
+ O.ex_act(2)
/obj/effect/anomaly/bhole/proc/grav(var/r, var/ex_act_force, var/pull_chance, var/turf_removal_chance)
for(var/t = -r, t < r, t++)
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index b9995eb11d9..b8a6fca011e 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -436,14 +436,14 @@ var/global/floorIsLava = 0
Spawn a wave of meteors (aka lagocolyptic shower)
Spawn a vortex anomaly
Spawn a gravitational anomaly
- Spawn wormholes
Spawn a pyroclastic anomaly
Spawn a flux wave anomaly
+ Spawn a bluespace anomaly
+ Spawn wormholes
Spawn blob
Trigger an Alien infestation
Spawn an Alien silently
Trigger a Spider infestation
- Trigger a Bluespace Anomaly
Send in a space ninja
Trigger an Carp migration
Irradiate the station
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index dfed8fb4544..d54d2821a50 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1718,7 +1718,7 @@
feedback_add_details("admin_secrets_fun_used","SL")
message_admins("[key_name_admin(usr)] has spawned spiders", 1)
if("bluespaceanomaly")
- E = new /datum/round_event/bluespace_anomaly()
+ E = new /datum/round_event/anomaly_bluespace()
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","BA")
message_admins("[key_name_admin(usr)] has triggered a bluespace anomaly", 1)
diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm
new file mode 100644
index 00000000000..0fc1ff7a97c
--- /dev/null
+++ b/code/modules/events/anomaly_bluespace.dm
@@ -0,0 +1,111 @@
+/datum/round_event_control/anomaly_bluespace
+ name = "Bluespace Anomaly"
+ typepath = /datum/round_event/anomaly_bluespace
+ max_occurrences = 1
+ weight = 5
+
+/datum/round_event/anomaly_bluespace
+ startWhen = 3
+ announceWhen = 10
+ endWhen = 55
+
+ var/area/impact_area
+ var/obj/effect/anomaly/bluespace/newblue
+
+
+/datum/round_event/anomaly_bluespace/setup()
+ var/list/safe_areas = list(
+ /area/turret_protected/ai,
+ /area/turret_protected/ai_upload,
+ /area/engine,
+ /area/solar,
+ /area/holodeck,
+ /area/shuttle/arrival,
+ /area/shuttle/escape/station,
+ /area/shuttle/escape_pod1/station,
+ /area/shuttle/escape_pod2/station,
+ /area/shuttle/escape_pod3/station,
+ /area/shuttle/escape_pod5/station,
+ /area/shuttle/mining/station,
+ /area/shuttle/transport1/station,
+ /area/shuttle/specops/station)
+
+ //These are needed because /area/engine has to be removed from the list, but we still want these areas to get fucked up.
+ var/list/danger_areas = list(
+ /area/engine/break_room,
+ /area/engine/chiefs_office)
+
+
+ impact_area = locate(pick((the_station_areas - safe_areas) + danger_areas)) //need to locate() as it's just a list of paths.
+
+
+/datum/round_event/anomaly_bluespace/announce()
+ command_alert("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
+
+
+/datum/round_event/anomaly_bluespace/start()
+ var/turf/T = pick(get_area_turfs(impact_area))
+ if(T)
+ newblue = new /obj/effect/anomaly/bluespace(T.loc)
+
+/datum/round_event/anomaly_bluespace/tick()
+ if(!newblue)
+ kill()
+ return
+
+/datum/round_event/anomaly_bluespace/end()
+ if(newblue)
+ var/turf/T = pick(get_area_turfs(impact_area))
+ if(T)
+ // Calculate new position (searches through beacons in world)
+ var/obj/item/device/radio/beacon/chosen
+ var/list/possible = list()
+ for(var/obj/item/device/radio/beacon/W in world)
+ possible += W
+
+ if(possible.len > 0)
+ chosen = pick(possible)
+
+ if(chosen)
+ // 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
+
+ playsound(TO, 'sound/effects/phasein.ogg', 100, 1)
+
+ var/list/flashers = list()
+ for(var/mob/living/carbon/human/M in viewers(TO, null))
+ if(M:eyecheck() <= 0)
+ flick("e_flash", M.flash) // flash dose faggots
+ flashers += M
+
+ var/y_distance = TO.y - FROM.y
+ var/x_distance = TO.x - FROM.x
+ for (var/atom/movable/A in range(12, FROM )) // iterate thru list of mobs in the area
+ if(istype(A, /obj/item/device/radio/beacon)) continue // don't teleport beacons because that's just insanely stupid
+ if(A.anchored && istype(A, /obj/machinery)) continue
+ if(istype(A, /obj/structure/disposalpipe )) continue
+ if(istype(A, /obj/structure/cable )) continue
+
+ var/turf/newloc = locate(A.x + x_distance, A.y + y_distance, TO.z) // calculate the new place
+ if(!A.Move(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.loc = locate(A.x + x_distance, A.y + y_distance, TO.z)
+
+ command_alert("Massive bluespace translocation detected.", "Anomaly Alert")
+
+ spawn()
+ if(ismob(A) && !(A in flashers)) // don't flash if we're already doing an effect
+ var/mob/M = A
+ if(M.client)
+ var/obj/blueeffect = new /obj(src)
+ blueeffect.screen_loc = "WEST,SOUTH to EAST,NORTH"
+ blueeffect.icon = 'icons/effects/effects.dmi'
+ blueeffect.icon_state = "shieldsparkles"
+ blueeffect.layer = 17
+ blueeffect.mouse_opacity = 0
+ M.client.screen += blueeffect
+ sleep(20)
+ M.client.screen -= blueeffect
+ del(blueeffect)
+ del(newblue)
\ No newline at end of file
diff --git a/code/modules/events/anomaly_flux.dm b/code/modules/events/anomaly_flux.dm
index d24937e7e83..f08e12d3414 100644
--- a/code/modules/events/anomaly_flux.dm
+++ b/code/modules/events/anomaly_flux.dm
@@ -5,7 +5,7 @@
weight = 15
/datum/round_event/anomaly_flux
- startWhen = 5
+ startWhen = 3
announceWhen = 20
endWhen = 60
diff --git a/code/modules/events/anomaly_grav.dm b/code/modules/events/anomaly_grav.dm
index fb8576d16bd..b4131ebdac8 100644
--- a/code/modules/events/anomaly_grav.dm
+++ b/code/modules/events/anomaly_grav.dm
@@ -5,15 +5,15 @@
weight = 15
/datum/round_event/anomaly_grav
- startWhen = 5
+ startWhen = 3
announceWhen = 20
- endWhen = 100
+ endWhen = 50
var/area/impact_area
var/obj/effect/anomaly/grav/newgrav
-/datum/round_event/anomaly_grav/setup()//TODO: Make this location stuff into a helper proc to be used in other events.
+/datum/round_event/anomaly_grav/setup()
var/list/safe_areas = list(
/area/turret_protected/ai,
/area/turret_protected/ai_upload,
diff --git a/code/modules/events/anomaly_pyro.dm b/code/modules/events/anomaly_pyro.dm
index b979689080d..aea48f651b3 100644
--- a/code/modules/events/anomaly_pyro.dm
+++ b/code/modules/events/anomaly_pyro.dm
@@ -5,7 +5,7 @@
weight = 15
/datum/round_event/anomaly_pyro
- startWhen = 5
+ startWhen = 10
announceWhen = 3
endWhen = 70
diff --git a/code/modules/events/anomaly_vortex.dm b/code/modules/events/anomaly_vortex.dm
index f983eefe61a..1bd6e7e75e6 100644
--- a/code/modules/events/anomaly_vortex.dm
+++ b/code/modules/events/anomaly_vortex.dm
@@ -7,14 +7,13 @@
/datum/round_event/anomaly_vortex
startWhen = 10
announceWhen = 3
- endWhen = 70
+ endWhen = 80
var/area/impact_area
var/obj/effect/anomaly/bhole/vortex
/datum/round_event/anomaly_vortex/setup()
-// endWhen = rand(20, 30)
var/list/safe_areas = list(
/area/turret_protected/ai,
/area/turret_protected/ai_upload,
diff --git a/code/modules/events/bluespaceanomaly.dm b/code/modules/events/bluespaceanomaly.dm
deleted file mode 100644
index a2956717d2b..00000000000
--- a/code/modules/events/bluespaceanomaly.dm
+++ /dev/null
@@ -1,94 +0,0 @@
-/datum/round_event_control/bluespace_anomaly
- name = "Bluespace Anomaly"
- typepath = /datum/round_event/bluespace_anomaly
- weight = 5
- max_occurrences = 1
-
-/datum/round_event/bluespace_anomaly
- announceWhen = 20
-
- var/area/impact_area
-
-
-/datum/round_event/bluespace_anomaly/setup()
- var/list/safe_areas = list(
- /area/turret_protected/ai,
- /area/turret_protected/ai_upload,
- /area/engine,
- /area/solar,
- /area/holodeck,
- /area/shuttle/arrival,
- /area/shuttle/escape/station,
- /area/shuttle/escape_pod1/station,
- /area/shuttle/escape_pod2/station,
- /area/shuttle/escape_pod3/station,
- /area/shuttle/escape_pod5/station,
- /area/shuttle/mining/station,
- /area/shuttle/transport1/station,
- /area/shuttle/specops/station)
-
- //These are needed because /area/engine has to be removed from the list, but we still want these areas to get fucked up.
- var/list/danger_areas = list(
- /area/engine/break_room,
- /area/engine/chiefs_office)
-
-
- impact_area = locate(pick((the_station_areas - safe_areas) + danger_areas)) //need to locate() as it's just a list of paths.
-
-
-/datum/round_event/bluespace_anomaly/announce()
- command_alert("Bluespace anomaly detected in the vicinity of [station_name()]. [impact_area.name] has gone missing.", "Anomaly Alert")
-
-
-/datum/round_event/bluespace_anomaly/start()
- var/turf/T = pick(get_area_turfs(impact_area))
- if(T)
- // Calculate new position (searches through beacons in world)
- var/obj/item/device/radio/beacon/chosen
- var/list/possible = list()
- for(var/obj/item/device/radio/beacon/W in world)
- possible += W
-
- if(possible.len > 0)
- chosen = pick(possible)
-
- if(chosen)
- // 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
-
- playsound(TO, 'sound/effects/phasein.ogg', 100, 1)
-
- var/list/flashers = list()
- for(var/mob/living/carbon/human/M in viewers(TO, null))
- if(M:eyecheck() <= 0)
- flick("e_flash", M.flash) // flash dose faggots
- flashers += M
-
- var/y_distance = TO.y - FROM.y
- var/x_distance = TO.x - FROM.x
- for (var/atom/movable/A in range(12, FROM )) // iterate thru list of mobs in the area
- if(istype(A, /obj/item/device/radio/beacon)) continue // don't teleport beacons because that's just insanely stupid
- if(A.anchored && istype(A, /obj/machinery)) continue
- if(istype(A, /obj/structure/disposalpipe )) continue
- if(istype(A, /obj/structure/cable )) continue
-
- var/turf/newloc = locate(A.x + x_distance, A.y + y_distance, TO.z) // calculate the new place
- if(!A.Move(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.loc = locate(A.x + x_distance, A.y + y_distance, TO.z)
-
- spawn()
- if(ismob(A) && !(A in flashers)) // don't flash if we're already doing an effect
- var/mob/M = A
- if(M.client)
- var/obj/blueeffect = new /obj(src)
- blueeffect.screen_loc = "WEST,SOUTH to EAST,NORTH"
- blueeffect.icon = 'icons/effects/effects.dmi'
- blueeffect.icon_state = "shieldsparkles"
- blueeffect.layer = 17
- blueeffect.mouse_opacity = 0
- M.client.screen += blueeffect
- sleep(20)
- M.client.screen -= blueeffect
- del(blueeffect)
\ No newline at end of file
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 29953fe3a16..e99e87a425d 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 98a622dd931..883121ba7b7 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -755,12 +755,12 @@
#include "code\modules\detectivework\footprints_and_rag.dm"
#include "code\modules\detectivework\scanner.dm"
#include "code\modules\events\alien_infestation.dm"
+#include "code\modules\events\anomaly_bluespace.dm"
#include "code\modules\events\anomaly_flux.dm"
#include "code\modules\events\anomaly_grav.dm"
#include "code\modules\events\anomaly_pyro.dm"
#include "code\modules\events\anomaly_vortex.dm"
#include "code\modules\events\blob.dm"
-#include "code\modules\events\bluespaceanomaly.dm"
#include "code\modules\events\brand_intelligence.dm"
#include "code\modules\events\carp_migration.dm"
#include "code\modules\events\communications_blackout.dm"