diff --git a/code/__defines/gamemode.dm b/code/__defines/gamemode.dm
index c1606e77f6..bc4a655d3b 100644
--- a/code/__defines/gamemode.dm
+++ b/code/__defines/gamemode.dm
@@ -43,6 +43,7 @@
#define BE_MORPH 0x40000
#define BE_CORGI 0x80000
#define BE_CURSEDSWORD 0x100000
+#define BE_SURVIVOR 0x200000
//VOREStation Add End
var/list/be_special_flags = list(
@@ -68,6 +69,7 @@ var/list/be_special_flags = list(
"Morph" = BE_MORPH,
"Corgi" = BE_CORGI,
"Cursed Sword" = BE_CURSEDSWORD,
+ "Ship Survivor" = BE_SURVIVOR
//VOREStation Add End
)
@@ -111,6 +113,7 @@ var/list/be_special_flags = list(
#define MODE_INFILTRATOR "infiltrator"
#define MODE_THUG "thug"
#define MODE_STOWAWAY "stowaway"
+#define MODE_SURVIVOR "Shipwreck Survivor"
#define DEFAULT_TELECRYSTAL_AMOUNT 120
@@ -176,4 +179,4 @@ var/list/be_special_flags = list(
#define ASPECT_EMP "emp" //Unused now.
#define ASPECT_UNSTABLE "unstable" //Heavily RNG-based, causes instability to the victim.
#define ASPECT_CHROMATIC "chromatic" //Used to combine with other spells.
-#define ASPECT_UNHOLY "unholy" //Involves the dead, blood, and most things against divine beings.
\ No newline at end of file
+#define ASPECT_UNHOLY "unholy" //Involves the dead, blood, and most things against divine beings.
diff --git a/code/datums/ghost_query.dm b/code/datums/ghost_query.dm
index 6a342f5820..47519813e8 100644
--- a/code/datums/ghost_query.dm
+++ b/code/datums/ghost_query.dm
@@ -198,3 +198,12 @@
Would you like to play as the soul imprisoned within?"
be_special_flag = BE_CURSEDSWORD
cutoff_number = 1
+
+/datum/ghost_query/shipwreck_survivor
+ role_name = "Shipwreck survivor"
+ question = "A person suspended in cryosleep has been discovered by a crewmember \
+ aboard a wrecked spaceship \
+ and they are attempting to open the cryopod.\n \
+ Would you like to play as the occupant? \n \
+ You MUST NOT use your station character!!!"
+ cutoff_number = 1
diff --git a/code/game/antagonist/outsider/shipwreck_survivor.dm b/code/game/antagonist/outsider/shipwreck_survivor.dm
new file mode 100644
index 0000000000..6fdcc47b97
--- /dev/null
+++ b/code/game/antagonist/outsider/shipwreck_survivor.dm
@@ -0,0 +1,45 @@
+var/datum/antagonist/shipwreck_survivor/survivors
+
+//Shipwreck survivors can only spawn from ghost_pods at time of this commit.
+//These are NOT meant to be real antagonists
+//They are, at best, comparable to ERT.
+/datum/antagonist/SURVIVOR
+ id = MODE_SURVIVOR
+ role_type = BE_SURVIVOR
+ role_text = "Shipwreck Survivor"
+ role_text_plural = "Shipwreck Survivors"
+ bantype = "Shipwreck Survivor" //also blocked by GhostRoles ban, in current implementation at least
+ welcome_text = "Something disastrous happened to the ship you were on! You awaken to your supposed rescuers in pain..."
+ antag_text = "You are a NOT an antagonist! All rules apply to you as well. Your job is to help make the world seem more alive. \n \
+ You are not an existing station character, but some average person who has suffered a terrible accident. \
+ Feel free to make up what happened to the ship you awakened on as you please, \
+ but listening to your rescuers for context might help improve your mutual immersion! \n \
+ Please play along. It is OK to not be co-operative, but 'yes, and' and \
+ 'no, but' are better ways to approach things than to shut them down outright.\n\n \
+ Please ahelp if you are uncertain about anything pertaining to this role. \
+ It is always better to be safe than sorry! \n\n \
+ You will receive the option to set your ambitions. Please remember the server rules \
+ abuse can mean being banned from ghost roles \n \
+ You should use your ambitions to flesh out why your ship got wrecked \
+ and how you wish to proceed now that you were rescued. \n \
+ You DON'T need to set your ambitions. Feel free to ignore them."
+
+ antag_sound = 'sound/voice/hiss1.ogg'
+
+ can_speak_aooc = FALSE
+ can_hear_aooc = FALSE
+
+/datum/antagonist/SURVIVOR/greet(var/datum/mind/player)
+ to_chat(player.current, SPAN_WARNING("You are a NOT an antagonist! All rules apply to you as well. Your job is to help make the world seem more alive. \n \
+ You are not an existing station character, but some average person who has suffered a terrible accident. \
+ Feel free to make up what happened to the ship you awakened on as you please, \
+ but listening to your rescuers for context might help improve your mutual immersion! \n \
+ Please play along. It is OK to not be co-operative, but 'yes, and' and \
+ 'no, but' are better ways to approach things than to shut them down outright.\n\n \
+ Please ahelp if you are uncertain about anything pertaining to this role. \
+ It is always better to be safe than sorry! \n\n \
+ You will receive the option to set your ambitions. Please remember the server rules \
+ abuse can mean being banned from ghost roles \n \
+ You should use your ambitions to flesh out why your ship got wrecked \
+ and how you wish to proceed now that you were rescued. \n \
+ You DON'T need to set your ambitions. Feel free to ignore them."))
diff --git a/code/game/objects/structures/ghost_pods/survivor.dm b/code/game/objects/structures/ghost_pods/survivor.dm
new file mode 100644
index 0000000000..62dbc2441d
--- /dev/null
+++ b/code/game/objects/structures/ghost_pods/survivor.dm
@@ -0,0 +1,138 @@
+//Based on /manual/human but not created as a child for better control over how we create a mob.
+/obj/structure/ghost_pod/manual/survivor
+ name = "Emergency Cryopod"
+ desc = "A damaged cryopod smeared with blood. An injured body seems frozen in time within."
+ description_info = "This contains a body, which may wake at any time. The external controls\
+ seem to be functioning, though the warning lights that flash give no solace.."
+ ghost_query_type = /datum/ghost_query/shipwreck_survivor
+ var/occupant_type = "shipwreck survivor"
+
+ icon = 'icons/obj/Cryogenic2.dmi'
+ icon_state = "sleeper_1"
+ icon_state_opened = "sleeper_0"
+ density = TRUE
+
+ var/allow_appearance_change = TRUE
+ var/special_role = MODE_SURVIVOR //Set this to NULL as GM if you don't want the "survivor" stuff to fire.
+ var/list/clothing_possibilities
+
+ var/start_injured = FALSE //failsafe to prevent accidentally making a pod that deals damage when not intended
+
+ var/suffer_brute = FALSE
+ var/brute_severity = 20 //We inflict UP TO this much damage. Range is 1 to this value
+ var/brute_instances = 3 //We inflict damage this many times. Helps spread it around multiple limbs!
+
+
+ var/suffer_burn = FALSE
+ var/burn_severity = 20
+ var/burn_instances = 3
+
+ var/suffer_toxloss = FALSE
+ var/tox_severity = 20
+
+ var/suffer_oxloss = FALSE
+ var/oxy_severity = 20
+
+ var/suffer_cloneloss = FALSE
+ var/clone_severity = 5
+
+/obj/structure/ghost_pod/manual/survivor/Initialize()
+ . = ..()
+
+ handle_clothing_setup()
+
+/obj/structure/ghost_pod/manual/survivor/proc/handle_clothing_setup()
+ clothing_possibilities = list()
+
+ clothing_possibilities |= subtypesof(/obj/item/clothing/under/utility)
+ clothing_possibilities |= subtypesof(/obj/item/clothing/head/beret)
+ clothing_possibilities |= /obj/item/clothing/shoes/black
+ clothing_possibilities |= /obj/item/device/radio/headset
+
+/obj/structure/ghost_pod/manual/survivor/create_occupant(var/mob/M)
+ ..()
+ var/turf/T = get_turf(src)
+ var/mob/living/carbon/human/H = new(src)
+ if(M.mind)
+ M.mind.transfer_to(H)
+ to_chat(M, "You are a [occupant_type]!")
+ H.ckey = M.ckey
+ visible_message("As \the [src] opens, the pipes on \the [src] surge, before it grows dark.")
+ log_and_message_admins("successfully opened \a [src] and got a [occupant_type].")
+
+ var/list/uniform_options
+ var/list/shoe_options
+ var/list/head_options
+ var/list/headset_options
+
+ if(clothing_possibilities && clothing_possibilities.len)
+ for(var/path in clothing_possibilities)
+ if(ispath(path, /obj/item/clothing/under))
+ if(!uniform_options)
+ uniform_options = list()
+ uniform_options |= path
+ if(ispath(path, /obj/item/clothing/shoes))
+ if(!shoe_options)
+ shoe_options = list()
+ shoe_options |= path
+ if(ispath(path, /obj/item/clothing/head))
+ if(!head_options)
+ head_options = list()
+ head_options |= path
+ if(ispath(path, /obj/item/device/radio/headset))
+ if(!headset_options)
+ headset_options = list()
+ headset_options |= path
+
+ if(uniform_options && uniform_options.len)
+ var/newpath = pick(uniform_options)
+ var/obj/item/clothing/C = new newpath(H)
+ H.equip_to_appropriate_slot(C)
+
+ if(shoe_options && shoe_options.len)
+ var/newpath = pick(shoe_options)
+ var/obj/item/clothing/C = new newpath(H)
+ H.equip_to_appropriate_slot(C)
+
+ if(head_options && head_options.len)
+ var/newpath = pick(head_options)
+ var/obj/item/clothing/C = new newpath(H)
+ H.equip_to_appropriate_slot(C)
+
+ if(headset_options && headset_options.len)
+ var/newpath = pick(headset_options)
+ var/obj/item/C = new newpath(H)
+ H.equip_to_appropriate_slot(C)
+
+ var/newname = sanitize(tgui_input_text(H, "Your mind feels foggy, and you recall your name might be [H.real_name]. Would you like to change your name?", "Name change", null, MAX_NAME_LEN), MAX_NAME_LEN)
+ if (newname)
+ H.real_name = newname
+
+ icon_state = icon_state_opened
+
+ H.forceMove(T)
+
+ if(special_role)
+ var/datum/antagonist/role = all_antag_types[special_role] //Explicitly NOT an antagonist.
+ if(role)
+ if(role.add_antagonist(H.mind, 1, 1, 0, 1, 1))
+ log_admin("\The [src] made [key_name(src)] into a [role.role_text].")
+
+ if(start_injured) //Doublechecking if we actually want them to be injured
+ if(suffer_brute)
+ for(var/br = 1, br < brute_instances, br++)
+ H.adjustBruteLoss(rand(1,brute_severity))
+ if(suffer_burn)
+ for(var/bu = 1, bu < burn_instances, bu++)
+ H.adjustFireLoss(rand(1,burn_severity))
+ if(suffer_oxloss)
+ H.adjustOxyLoss(rand(1,oxy_severity))
+ if(suffer_toxloss)
+ H.adjustToxLoss(rand(1,tox_severity))
+ if(suffer_cloneloss)
+ H.adjustCloneLoss(rand(1,clone_severity))
+
+ if(allow_appearance_change)
+ H.change_appearance(APPEARANCE_ALL, H, check_species_whitelist = 1)
+
+ visible_message("\The [src] [pick("gurgles", "seizes", "clangs")] before releasing \the [H]!")
diff --git a/vorestation.dme b/vorestation.dme
index fe9dba0be0..1167d4f64d 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -572,6 +572,7 @@
#include "code\game\antagonist\outsider\mercenary.dm"
#include "code\game\antagonist\outsider\ninja.dm"
#include "code\game\antagonist\outsider\raider.dm"
+#include "code\game\antagonist\outsider\shipwreck_survivor.dm"
#include "code\game\antagonist\outsider\technomancer.dm"
#include "code\game\antagonist\outsider\trader.dm"
#include "code\game\antagonist\outsider\wizard.dm"
@@ -1577,6 +1578,7 @@
#include "code\game\objects\structures\ghost_pods\mysterious.dm"
#include "code\game\objects\structures\ghost_pods\silicon.dm"
#include "code\game\objects\structures\ghost_pods\silicon_vr.dm"
+#include "code\game\objects\structures\ghost_pods\survivor.dm"
#include "code\game\objects\structures\props\alien_props.dm"
#include "code\game\objects\structures\props\alien_props_vr.dm"
#include "code\game\objects\structures\props\beam_prism.dm"
@@ -4196,6 +4198,7 @@
#include "maps\southern_cross\loadout\loadout_suit.dm"
#include "maps\southern_cross\loadout\loadout_uniform.dm"
#include "maps\southern_cross\loadout\loadout_vr.dm"
+#include "maps\stellar_delight\stellar_delight.dm"
#include "maps\submaps\_helpers.dm"
#include "maps\submaps\_readme.dm"
#include "maps\submaps\engine_submaps\engine.dm"
@@ -4205,6 +4208,5 @@
#include "maps\submaps\space_submaps\debrisfield\debrisfield.dm"
#include "maps\submaps\surface_submaps\wilderness\wilderness.dm"
#include "maps\submaps\surface_submaps\wilderness\wilderness_areas.dm"
-#include "maps\tether\tether.dm"
#include "maps\~map_system\maps.dm"
// END_INCLUDE