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