diff --git a/baystation12.dme b/baystation12.dme
index e1421ebc1bd..25ee0cd65fa 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -667,6 +667,7 @@
#include "code\game\verbs\who.dm"
#include "code\js\byjax.dm"
#include "code\js\menus.dm"
+#include "code\modules\spawnpoints.dm"
#include "code\modules\admin\admin.dm"
#include "code\modules\admin\admin_investigate.dm"
#include "code\modules\admin\admin_memo.dm"
diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm
index 77f3adfdbde..d64b237034d 100644
--- a/code/controllers/master_controller.dm
+++ b/code/controllers/master_controller.dm
@@ -32,7 +32,7 @@ datum/controller/game_controller
var/last_thing_processed
var/mob/list/expensive_mobs = list()
var/rebuild_active_areas = 0
-
+
var/list/shuttle_list //for debugging and VV
datum/controller/game_controller/New()
@@ -85,6 +85,9 @@ datum/controller/game_controller/proc/setup()
var/datum/ore_distribution/O = new()
O.populate_distribution_map()
+ //Set up spawn points.
+ populate_spawn_points()
+
spawn(0)
if(ticker)
ticker.pregame()
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index ae155f32ade..e287ee845d6 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -40,6 +40,14 @@
latejoin += loc
del(src)
+ if("JoinLateGateway")
+ latejoin_gateway += loc
+ del(src)
+
+ if("JoinLateCryo")
+ latejoin_cryo += loc
+ del(src)
+
//prisoners
if("prisonwarp")
prisonwarp += loc
diff --git a/code/global.dm b/code/global.dm
index 1eb82f08cd7..c938c5b7a91 100644
--- a/code/global.dm
+++ b/code/global.dm
@@ -125,7 +125,12 @@ var/airtunnel_bottom = 72 // default
var/list/monkeystart = list()
var/list/wizardstart = list()
var/list/newplayer_start = list()
+
+//Spawnpoints.
var/list/latejoin = list()
+var/list/latejoin_gateway = list()
+var/list/latejoin_cryo = list()
+
var/list/prisonwarp = list() //prisoners go to these
var/list/holdingfacility = list() //captured people go here
var/list/xeno_spawn = list()//Aliens spawn at these.
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 60d0036c3cc..529746fe583 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -53,6 +53,7 @@ datum/preferences
var/be_random_name = 0 //whether we are a random name every round
var/gender = MALE //gender of character (well duh)
var/age = 30 //age of character
+ var/spawnpoint = "Arrivals Shuttle" //where this character will spawn (0-2).
var/b_type = "A+" //blood type (not-chooseable)
var/underwear = 1 //underwear type
var/undershirt = 1 //undershirt type
@@ -247,6 +248,7 @@ datum/preferences
dat += "Gender: [gender == MALE ? "Male" : "Female"]
"
dat += "Age: [age]"
+ dat += "Spawn Point: [spawnpoint]
"
dat += "
"
dat += "UI Style: [UI_style]
"
@@ -1179,6 +1181,16 @@ datum/preferences
var/skin_style_name = input(user, "Select a new skin style") as null|anything in list("default1", "default2", "default3")
if(!skin_style_name) return
+ if("spawnpoint")
+ var/list/spawnkeys = list()
+ for(var/S in spawntypes)
+ spawnkeys += S
+ var/choice = input(user, "Where would you like to spawn when latejoining?") as null|anything in spawnkeys
+ if(!choice || !spawntypes[choice])
+ spawnpoint = "Arrivals Shuttle"
+ return
+ spawnpoint = choice
+
else
switch(href_list["preference"])
if("gender")
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index d8cbab3f0be..68bb5a9e3eb 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -108,6 +108,7 @@
S["age"] >> age
S["species"] >> species
S["language"] >> language
+ S["spawnpoint"] >> spawnpoint
//colors to be consolidated into hex strings (requires some work with dna code)
S["hair_red"] >> r_hair
@@ -168,6 +169,7 @@
real_name = reject_bad_name(real_name)
if(isnull(species)) species = "Human"
if(isnull(language)) language = "None"
+ if(isnull(spawnpoint)) spawnpoint = "Arrivals Shuttle"
if(isnull(nanotrasen_relation)) nanotrasen_relation = initial(nanotrasen_relation)
if(!real_name) real_name = random_name(gender)
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 1bc7730b362..b4d3f021962 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -159,7 +159,7 @@
src << alert("You are currently not whitelisted to play [client.prefs.species].")
return 0
- AttemptLateSpawn(href_list["SelectedJob"])
+ AttemptLateSpawn(href_list["SelectedJob"],client.prefs.spawnpoint)
return
if(href_list["privacy_poll"])
@@ -270,7 +270,7 @@
return 1
- proc/AttemptLateSpawn(rank)
+ proc/AttemptLateSpawn(rank,var/spawning_at)
if (src != usr)
return 0
if(!ticker || ticker.current_state != GAME_STATE_PLAYING)
@@ -291,7 +291,21 @@
var/mob/living/carbon/human/character = create_character() //creates the human and transfers vars and mind
job_master.EquipRank(character, rank, 1) //equips the human
EquipCustomItems(character)
- character.loc = pick(latejoin)
+
+ //Find our spawning point.
+ var/join_message
+ var/datum/spawnpoint/S
+
+ if(spawning_at)
+ S = spawntypes[spawning_at]
+
+ if(S && istype(S))
+ character.loc = pick(S.turfs)
+ join_message = S.msg
+ else
+ character.loc = pick(latejoin)
+ join_message = "has arrived on the station"
+
character.lastarea = get_area(loc)
// Moving wheelchair if they have one
if(character.buckled && istype(character.buckled, /obj/structure/stool/bed/chair/wheelchair))
@@ -305,18 +319,18 @@
if(character.mind.assigned_role != "Cyborg")
data_core.manifest_inject(character)
ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn
- AnnounceArrival(character, rank)
+ AnnounceArrival(character, rank, join_message)
else
character.Robotize()
del(src)
- proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank)
+ proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank, var/join_message)
if (ticker.current_state == GAME_STATE_PLAYING)
var/obj/item/device/radio/intercom/a = new /obj/item/device/radio/intercom(null)// BS12 EDIT Arrivals Announcement Computer, rather than the AI.
if(character.mind.role_alt_title)
rank = character.mind.role_alt_title
- a.autosay("[character.real_name],[rank ? " [rank]," : " visitor," ] has arrived on the station.", "Arrivals Announcement Computer")
+ a.autosay("[character.real_name],[rank ? " [rank]," : " visitor," ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer")
del(a)
proc/LateChoices()
diff --git a/code/modules/spawnpoints.dm b/code/modules/spawnpoints.dm
new file mode 100644
index 00000000000..71692f01cc4
--- /dev/null
+++ b/code/modules/spawnpoints.dm
@@ -0,0 +1,36 @@
+var/list/spawntypes = list()
+
+/proc/populate_spawn_points()
+ spawntypes = list()
+ for(var/type in typesof(/datum/spawnpoint)-/datum/spawnpoint)
+ var/datum/spawnpoint/S = new type()
+ spawntypes[S.display_name] = S
+
+/datum/spawnpoint
+ var/msg //Message to display on the arrivals computer.
+ var/list/turfs //List of turfs to spawn on.
+ var/display_name //Name used in preference setup.
+
+/datum/spawnpoint/arrivals
+ display_name = "Arrivals Shuttle"
+ msg = "has arrived on the station"
+
+/datum/spawnpoint/arrivals/New()
+ ..()
+ turfs = latejoin
+
+/datum/spawnpoint/gateway
+ display_name = "Gateway"
+ msg = "has completed translation from offsite gateway"
+
+/datum/spawnpoint/gateway/New()
+ ..()
+ turfs = latejoin_gateway
+
+/datum/spawnpoint/cryo
+ display_name = "Cryogenic Storage"
+ msg = "has completed cryogenic revival and clocked in"
+
+/datum/spawnpoint/cryo/New()
+ ..()
+ turfs = latejoin_cryo
\ No newline at end of file