diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm
index 946cd9de0e..862a562b39 100644
--- a/code/_helpers/global_lists_vr.dm
+++ b/code/_helpers/global_lists_vr.dm
@@ -12,6 +12,7 @@ var/global/list/everyone_traits = list() // Neutral traits available to all spec
var/global/list/positive_traits = list() // Positive custom species traits, indexed by path
var/global/list/traits_costs = list() // Just path = cost list, saves time in char setup
var/global/list/all_traits = list() // All of 'em at once (same instances)
+var/global/list/active_ghost_pods = list()
var/global/list/sensorpreflist = list("Off", "Binary", "Vitals", "Tracking", "No Preference") //TFF 5/8/19 - Suit Sensors global list
diff --git a/code/game/objects/structures/ghost_pods/event_vr.dm b/code/game/objects/structures/ghost_pods/event_vr.dm
new file mode 100644
index 0000000000..c724b9bd80
--- /dev/null
+++ b/code/game/objects/structures/ghost_pods/event_vr.dm
@@ -0,0 +1,101 @@
+/obj/structure/ghost_pod/ghost_activated/maintpred
+ name = "maintenance hole"
+ desc = "Looks like some creature dug its way into station's maintenance..."
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "tunnel_hole"
+ icon_state_opened = "tunnel_hole"
+ density = FALSE
+ ghost_query_type = /datum/ghost_query/maints_pred
+ anchored = TRUE
+ invisibility = INVISIBILITY_OBSERVER
+ spawn_active = TRUE
+ var/announce_prob = 35
+ var/list/possible_mobs = list("Space Bumblebee" = /mob/living/simple_mob/vore/bee,
+ "Voracious Lizard" = /mob/living/simple_mob/vore/aggressive/dino,
+ "Giant Frog" = /mob/living/simple_mob/vore/aggressive/frog,
+ "Giant Rat" = /mob/living/simple_mob/vore/aggressive/rat,
+ "Juvenile Solargrub" = /mob/living/simple_mob/vore/solargrub,
+ "Red Panda" = /mob/living/simple_mob/vore/redpanda,
+ "Fennec" = /mob/living/simple_mob/vore/fennec,
+ "Fennix" = /mob/living/simple_mob/vore/fennix,
+ "Jelly Blob" = /mob/living/simple_mob/animal/space/jelly,
+ "Wolf" = /mob/living/simple_mob/animal/wolf,
+ "Sect Queen" = /mob/living/simple_mob/vore/sect_queen,
+ "Defanged Xenomorph" = /mob/living/simple_mob/vore/xeno_defanged,
+ )
+
+/obj/structure/ghost_pod/ghost_activated/maintpred/create_occupant(var/mob/M)
+ ..()
+ var/choice
+ var/randomize
+ var/finalized = "No"
+
+ while(finalized == "No" && M.client)
+ choice = input(M,"What type of predator do you want to play as?") as null|anything in possible_mobs
+ if(!choice)
+ randomize = TRUE
+ break
+
+ if(choice)
+ finalized = alert(M, "Are you sure you want to play as [choice]?","Confirmation","No","Yes")
+
+ if(randomize)
+ choice = pick(possible_mobs)
+
+ var/mobtype = possible_mobs[choice]
+ var/mob/living/simple_mob/newPred = new mobtype(get_turf(src))
+ qdel(newPred.ai_holder)
+ newPred.ai_holder = null
+ //newPred.movement_cooldown = 0 // The "needless artificial speed cap" exists for a reason
+ if(M.mind)
+ M.mind.transfer_to(newPred)
+ to_chat(M, "You are [newPred], somehow having gotten aboard the station in search of food. \
+ You are wary of environment around you, but you do feel rather peckish. Stick around dark, secluded places to avoid danger or, \
+ if you are cute enough, try to make friends with this place's inhabitants.")
+ newPred.ckey = M.ckey
+ newPred.visible_message("[newPred] emerges from somewhere!")
+
+ if(prob(announce_prob))
+ spawn(2 MINUTES)
+ command_announcement.Announce("Unexpected biosignature detected in the maintenance tunnels of [station_name()].", "Lifesign Alert")
+
+ qdel(src)
+
+/obj/structure/ghost_pod/ghost_activated/maintpred/no_announce
+ announce_prob = 0
+
+/obj/structure/ghost_pod/ghost_activated/morphspawn
+ name = "weird goo"
+ desc = "A pile of weird gunk... Wait, is it actually moving?"
+ icon = 'icons/mob/animal_vr.dmi'
+ icon_state = "morph"
+ icon_state_opened = "morph_dead"
+ density = FALSE
+ ghost_query_type = /datum/ghost_query/morph
+ anchored = TRUE
+ invisibility = INVISIBILITY_OBSERVER
+ spawn_active = TRUE
+ var/announce_prob = 50
+
+/obj/structure/ghost_pod/ghost_activated/morphspawn/create_occupant(var/mob/M)
+ ..()
+ var/mob/living/simple_mob/vore/hostile/morph/newMorph = new /mob/living/simple_mob/vore/hostile/morph(get_turf(src))
+ if(M.mind)
+ M.mind.transfer_to(newMorph)
+ to_chat(M, "You are a Morph, somehow having gotten aboard the station in your wandering. \
+ You are wary of environment around you, but your primal hunger still calls for you to find prey. Seek a convincing disguise, \
+ using your amorphous form to traverse vents to find and consume weak prey.")
+ to_chat(M, "You can use shift + click on objects to disguise yourself as them, but your strikes are nearly useless when you are disguised. \
+ You can undisguise yourself by shift + clicking yourself, but disguise being switched, or turned on and off has a short cooldown. You can also ventcrawl, \
+ by using alt + click on the vent or scrubber.")
+ newMorph.ckey = M.ckey
+ newMorph.visible_message("A morph appears to crawl out of somewhere.")
+
+ if(prob(announce_prob))
+ spawn(2 MINUTES)
+ command_announcement.Announce("Unexpected biosignature detected in the maintenance tunnels of [station_name()].", "Lifesign Alert")
+
+ qdel(src)
+
+/obj/structure/ghost_pod/ghost_activated/morphspawn/no_announce
+ announce_prob = 0
\ No newline at end of file
diff --git a/code/game/objects/structures/ghost_pods/ghost_pods.dm b/code/game/objects/structures/ghost_pods/ghost_pods.dm
index 12cfe24dc2..386d493d2d 100644
--- a/code/game/objects/structures/ghost_pods/ghost_pods.dm
+++ b/code/game/objects/structures/ghost_pods/ghost_pods.dm
@@ -36,6 +36,10 @@
// Override this to create whatever mob you need. Be sure to call ..() if you don't want it to make infinite mobs.
/obj/structure/ghost_pod/proc/create_occupant(var/mob/M)
used = TRUE
+ //VOREStation Addition Start
+ if(src in active_ghost_pods)
+ active_ghost_pods -= src
+ //VOREStation Addition End
return TRUE
@@ -52,6 +56,7 @@
// VOREStation Addition Start
if(!used)
activated = TRUE
+ ghostpod_startup(FALSE)
// VOREStation Addition End
/obj/structure/ghost_pod/manual/attack_ai(var/mob/living/silicon/user)
diff --git a/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm b/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm
index 9eedbb453c..2d8f8198c5 100644
--- a/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm
+++ b/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm
@@ -1,3 +1,11 @@
+/obj/structure/ghost_pod/Destroy()
+ if(src in active_ghost_pods)
+ active_ghost_pods -= src
+ ..()
+
+/obj/structure/ghost_pod
+ var/spawn_active = FALSE
+
/obj/structure/ghost_pod/manual
var/remains_active = FALSE
var/activated = FALSE
@@ -28,4 +36,14 @@
busy = FALSE
- create_occupant(user)
\ No newline at end of file
+ create_occupant(user)
+
+/obj/structure/ghost_pod/proc/ghostpod_startup(var/notify = FALSE)
+ if(!(src in active_ghost_pods))
+ active_ghost_pods += src
+ if(notify)
+ trigger()
+
+/obj/structure/ghost_pod/ghost_activated/Initialize()
+ ..()
+ ghostpod_startup(spawn_active)
\ No newline at end of file
diff --git a/code/modules/events/maintenance_predator_vr.dm b/code/modules/events/maintenance_predator_vr.dm
index 6aa505a2a9..b9b370f7e0 100644
--- a/code/modules/events/maintenance_predator_vr.dm
+++ b/code/modules/events/maintenance_predator_vr.dm
@@ -1,21 +1,6 @@
/datum/event/maintenance_predator
startWhen = 1
- announceWhen = 50
- endWhen = 100
- var/announceProb = 35
- var/list/possible_mobs = list("Space Bumblebee" = /mob/living/simple_mob/vore/bee,
- "Voracious Lizard" = /mob/living/simple_mob/vore/aggressive/dino,
- "Giant Frog" = /mob/living/simple_mob/vore/aggressive/frog,
- "Giant Rat" = /mob/living/simple_mob/vore/aggressive/rat,
- "Juvenile Solargrub" = /mob/living/simple_mob/vore/solargrub,
- "Red Panda" = /mob/living/simple_mob/vore/redpanda,
- "Fennec" = /mob/living/simple_mob/vore/fennec,
- "Fennix" = /mob/living/simple_mob/vore/fennix,
- "Jelly Blob" = /mob/living/simple_mob/animal/space/jelly,
- "Wolf" = /mob/living/simple_mob/animal/wolf,
- "Sect Queen" = /mob/living/simple_mob/vore/sect_queen,
- "Defanged Xenomorph" = /mob/living/simple_mob/vore/xeno_defanged,
- )
+ endWhen = 30
/datum/event/maintenance_predator/start()
@@ -34,44 +19,4 @@
kill() // To prevent fake announcements
return
- var/datum/ghost_query/Q = new /datum/ghost_query/maints_pred()
- var/list/winner = Q.query()
-
- if(winner.len)
- var/mob/observer/dead/D = winner[1]
- var/choice
- var/randomize
- var/finalized = "No"
-
- while(finalized == "No" && D.client)
- choice = input(D,"What type of predator do you want to play as?") as null|anything in possible_mobs
- if(!choice)
- randomize = TRUE
- break
-
- if(choice)
- finalized = alert(D, "Are you sure you want to play as [choice]?","Confirmation","No","Yes")
-
- if(randomize)
- choice = pick(possible_mobs)
-
- var/mobtype = possible_mobs[choice]
- var/mob/living/simple_mob/newPred = new mobtype(get_turf(spawnspot))
- qdel(newPred.ai_holder)
- newPred.ai_holder = null
- //newPred.movement_cooldown = 0 // The "needless artificial speed cap" exists for a reason
- if(D.mind)
- D.mind.transfer_to(newPred)
- to_chat(D, "You are [newPred], somehow having gotten aboard the station in search of food. \
- You are wary of environment around you, but you do feel rather peckish. Stick around dark, secluded places to avoid danger or, \
- if you are cute enough, try to make friends with this place's inhabitants.")
- newPred.ckey = D.ckey
- newPred.visible_message("[newPred] emerges from somewhere!")
- else
- kill() // To prevent fake announcements
- return
-
-
-/datum/event/maintenance_predator/announce()
- if(prob(announceProb))
- command_announcement.Announce("Unexpected biosignature detected in the maintenance tunnels of [station_name()].", "Lifesign Alert")
+ new /obj/structure/ghost_pod/ghost_activated/maintpred(get_turf(spawnspot))
diff --git a/code/modules/events/morph_spawn_vr.dm b/code/modules/events/morph_spawn_vr.dm
index 04b3b63898..82dfe2e2e0 100644
--- a/code/modules/events/morph_spawn_vr.dm
+++ b/code/modules/events/morph_spawn_vr.dm
@@ -1,8 +1,6 @@
/datum/event/morph_spawn
startWhen = 1
- announceWhen = 20
endWhen = 30
- var/announceProb = 50
/datum/event/morph_spawn/start()
@@ -21,31 +19,9 @@
kill() // To prevent fake announcements
return
- var/datum/ghost_query/Q = new /datum/ghost_query/morph()
- var/list/winner = Q.query()
+ new /obj/structure/ghost_pod/ghost_activated/morphspawn(get_turf(spawnspot))
- if(winner.len)
- var/mob/living/simple_mob/vore/hostile/morph/newMorph = new /mob/living/simple_mob/vore/hostile/morph(get_turf(spawnspot))
- var/mob/observer/dead/D = winner[1]
- if(D.mind)
- D.mind.transfer_to(newMorph)
- to_chat(D, "You are a Morph, somehow having gotten aboard the station in your wandering. \
- You are wary of environment around you, but your primal hunger still calls for you to find prey. Seek a convincing disguise, \
- using your amorphous form to traverse vents to find and consume weak prey.")
- to_chat(D, "You can use shift + click on objects to disguise yourself as them, but your strikes are nearly useless when you are disguised. \
- You can undisguise yourself by shift + clicking yourself, but disguise being switched, or turned on and off has a short cooldown. You can also ventcrawl, \
- by using alt + click on the vent or scrubber.")
- newMorph.ckey = D.ckey
- newMorph.visible_message("A morph appears to crawl out of somewhere.")
- else
- kill() // To prevent fake announcements
- return
-
-
-/datum/event/morph_spawn/announce()
- if(prob(announceProb))
- command_announcement.Announce("Unknown entitity detected boarding [station_name()]. Exercise extra caution.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
//YW Addition: Adding named landmark for events
/obj/effect/landmark/event_spawn/morphspawn
- name = "morphspawn"
\ No newline at end of file
+ name = "morphspawn"
diff --git a/code/modules/mob/dead/observer/observer_vr.dm b/code/modules/mob/dead/observer/observer_vr.dm
index 2be0c90b80..7abad3ef09 100644
--- a/code/modules/mob/dead/observer/observer_vr.dm
+++ b/code/modules/mob/dead/observer/observer_vr.dm
@@ -73,4 +73,31 @@
record.last_notification = world.time
to_chat(src, "New notification has been sent.")
else
- to_chat(src, "No mind record found!")
\ No newline at end of file
+ to_chat(src, "No mind record found!")
+
+/mob/observer/dead/verb/findghostpod() //Moves the ghost instead of just changing the ghosts's eye -Nodrak
+ set category = "Ghost"
+ set name = "Find Ghost Pod"
+ set desc = "Find an active ghost pod"
+ set popup_menu = FALSE
+
+ if(!istype(usr, /mob/observer/dead)) //Make sure they're an observer!
+ return
+
+ var/input = input(usr, "Select a ghost pod:", "Ghost Jump") as null|anything in observe_list_format(active_ghost_pods)
+ if(!input)
+ to_chat(src, "No active ghost pods detected.")
+ return
+
+ var/target = observe_list_format(active_ghost_pods)[input]
+ if (!target)//Make sure we actually have a target
+ return
+ else
+ var/obj/O = target //Destination mob
+ var/turf/T = get_turf(O) //Turf of the destination mob
+
+ if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination.
+ forceMove(T)
+ stop_following()
+ else
+ to_chat(src, "This ghost pod is not located in the game world.")
\ No newline at end of file
diff --git a/vorestation.dme b/vorestation.dme
index aceffcc24f..b14250f9dd 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -1575,6 +1575,7 @@
#include "code\game\objects\structures\flora\flora_vr.dm"
#include "code\game\objects\structures\flora\grass.dm"
#include "code\game\objects\structures\flora\trees.dm"
+#include "code\game\objects\structures\ghost_pods\event_vr.dm"
#include "code\game\objects\structures\ghost_pods\ghost_pods.dm"
#include "code\game\objects\structures\ghost_pods\ghost_pods_vr.dm"
#include "code\game\objects\structures\ghost_pods\human.dm"