diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm
index e7805a286a2..dac3613318e 100644
--- a/code/__defines/species_languages.dm
+++ b/code/__defines/species_languages.dm
@@ -19,6 +19,7 @@
#define IS_WHITELISTED 0x1 // Must be whitelisted to play.
#define CAN_JOIN 0x2 // Species is selectable in chargen.
#define IS_RESTRICTED 0x4 // Is not a core/normally playable species. (castes, mutantraces)
+#define NO_AGE_MINIMUM 0x8 // Doesn't respect minimum job age requirements.
// Species appearance flags
#define HAS_SKIN_TONE 0x1 // Skin tone selectable in chargen. (0-255)
diff --git a/code/controllers/subsystems/job.dm b/code/controllers/subsystems/job.dm
index cd4aefb7681..e03c0da2f79 100644
--- a/code/controllers/subsystems/job.dm
+++ b/code/controllers/subsystems/job.dm
@@ -102,6 +102,12 @@
if(jobban_isbanned(player, rank))
return FALSE
+ var/character_age = player.client.prefs.age
+ var/datum/species/species = global.all_species[player.client.prefs.species]
+ if((character_age < job.minimum_character_age) && !(species.spawn_flags & NO_AGE_MINIMUM))
+ to_chat(player, "Your character is too young!")
+ return FALSE
+
var/position_limit = job.total_positions
if(!latejoin)
position_limit = job.spawn_positions
diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm
index 78f681e07af..11d96461966 100644
--- a/code/game/jobs/job/captain.dm
+++ b/code/game/jobs/job/captain.dm
@@ -16,6 +16,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
minimal_player_age = 14
economic_modifier = 20
+ minimum_character_age = 35
+
ideal_character_age = 70 // Old geezer captains ftw
outfit = /datum/outfit/job/captain
@@ -76,6 +78,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
economic_modifier = 10
ideal_character_age = 50
+ minimum_character_age = 30
+
outfit = /datum/outfit/job/hop
access = list(access_sec_doors, access_medical, access_engine, access_change_ids, access_eva, access_heads,
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index 941b5de55db..3c689644572 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -9,6 +9,9 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#C0C0C0"
+
+ minimum_character_age = 18
+
access = list(access_hydroponics, access_bar, access_kitchen)
minimal_access = list(access_bar)
alt_titles = list("Barista")
@@ -34,6 +37,9 @@
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#C0C0C0"
+
+ minimum_character_age = 18
+
access = list(access_hydroponics, access_bar, access_kitchen)
minimal_access = list(access_kitchen)
alt_titles = list("Cook")
@@ -64,6 +70,9 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#C0C0C0"
+
+ minimum_character_age = 18
+
access = list(access_hydroponics, access_bar, access_kitchen)
minimal_access = list(access_hydroponics)
alt_titles = list("Hydroponicist")
@@ -107,6 +116,9 @@
supervisors = "the head of personnel"
selection_color = "#C0C0C0"
economic_modifier = 5
+
+ minimum_character_age = 22
+
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
@@ -136,6 +148,9 @@
spawn_positions = 3
supervisors = "the quartermaster and the head of personnel"
selection_color = "#C0C0C0"
+
+ minimum_character_age = 18
+
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting)
outfit = /datum/outfit/job/cargo_tech
@@ -161,6 +176,9 @@
supervisors = "the quartermaster and the head of personnel"
selection_color = "#C0C0C0"
economic_modifier = 5
+
+ minimum_character_age = 18
+
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
minimal_access = list(access_mining, access_mining_station, access_mailsorting)
outfit = /datum/outfit/job/mining
@@ -219,6 +237,9 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#C0C0C0"
+
+ minimum_character_age = 20
+
access = list(access_journalist, access_maint_tunnels)
minimal_access = list(access_journalist, access_maint_tunnels)
alt_titles = list("Freelance Journalist")
diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm
index dfa0afb81e7..4d4cf69bf14 100644
--- a/code/game/jobs/job/engineering.dm
+++ b/code/game/jobs/job/engineering.dm
@@ -11,6 +11,8 @@
selection_color = "#FFD737"
economic_modifier = 10
+ minimum_character_age = 30
+
ideal_character_age = 50
@@ -62,6 +64,9 @@
supervisors = "the chief engineer"
selection_color = "#FFEA95"
economic_modifier = 5
+
+ minimum_character_age = 25
+
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics)
minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction)
alt_titles = list("Maintenance Technician","Engine Technician","Electrician")
@@ -95,6 +100,9 @@
supervisors = "the chief engineer"
selection_color = "#FFEA95"
economic_modifier = 5
+
+ minimum_character_age = 25
+
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_external_airlocks)
minimal_access = list(access_eva, access_engine, access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction, access_external_airlocks)
outfit = /datum/outfit/job/atmos
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index 95765590f96..2253402debb 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -10,6 +10,9 @@
supervisors = "the captain"
selection_color = "#FF56B4"
economic_modifier = 10
+
+ minimum_character_age = 35
+
access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads,
access_pharmacy, access_virology, access_cmo, access_surgery, access_RC_announce, access_engine, access_construction,
access_keycard_auth, access_sec_doors, access_psychiatrist, access_eva, access_external_airlocks, access_research,
@@ -52,6 +55,9 @@
supervisors = "the chief medical officer"
selection_color = "#FF97D1"
economic_modifier = 7
+
+ minimum_character_age = 30
+
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_pharmacy, access_virology, access_genetics, access_eva)
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_genetics, access_eva)
alt_titles = list("Surgeon","Emergency Physician","Nurse")
@@ -115,6 +121,9 @@
supervisors = "the chief medical officer"
selection_color = "#FF97D1"
economic_modifier = 5
+
+ minimum_character_age = 26
+
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_pharmacy, access_virology, access_genetics)
minimal_access = list(access_medical, access_medical_equip, access_pharmacy, access_virology)
alt_titles = list("Biochemist")
@@ -159,6 +168,9 @@
total_positions = 1
spawn_positions = 1
economic_modifier = 5
+
+ minimum_character_age = 30
+
supervisors = "the chief medical officer"
selection_color = "#FF97D1"
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_pharmacy, access_virology, access_genetics, access_psychiatrist)
@@ -196,6 +208,9 @@
supervisors = "the chief medical officer"
selection_color = "#FF97D1"
economic_modifier = 4
+
+ minimum_character_age = 24
+
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_pharmacy, access_virology, access_eva, access_maint_tunnels, access_external_airlocks, access_psychiatrist, access_paramedic)
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_eva, access_maint_tunnels, access_external_airlocks, access_paramedic)
alt_titles = list("Emergency Medical Technician")
diff --git a/code/game/jobs/job/outsider/representative.dm b/code/game/jobs/job/outsider/representative.dm
index 5d703192687..38df22e8dee 100644
--- a/code/game/jobs/job/outsider/representative.dm
+++ b/code/game/jobs/job/outsider/representative.dm
@@ -10,6 +10,9 @@
selection_color = "#C0C0C0"
economic_modifier = 7
latejoin_at_spawnpoints = TRUE
+
+ minimum_character_age = 25
+
access = list(access_lawyer, access_maint_tunnels)
minimal_access = list(access_lawyer)
outfit = /datum/outfit/job/representative
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index a026e241a61..f5e64e6be02 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -10,6 +10,9 @@
supervisors = "the captain"
selection_color = "#FF40FF"
economic_modifier = 15
+
+ minimum_character_age = 30
+
access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, access_eva, access_external_airlocks,
access_tox_storage, access_teleporter, access_sec_doors, access_medical, access_engine, access_construction,
access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage,
@@ -51,6 +54,9 @@
supervisors = "the research director"
selection_color = "#FFAAFF"
economic_modifier = 7
+
+ minimum_character_age = 25
+
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch)
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch)
alt_titles = list("Xenoarcheologist", "Anomalist", "Phoron Researcher")
@@ -84,6 +90,9 @@
supervisors = "the research director"
selection_color = "#FFAAFF"
economic_modifier = 7
+
+ minimum_character_age = 25
+
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_hydroponics)
minimal_access = list(access_research, access_xenobiology, access_hydroponics, access_tox_storage)
alt_titles = list("Xenobotanist")
@@ -107,6 +116,9 @@
supervisors = "research director"
selection_color = "#FFAAFF"
economic_modifier = 5
+
+ minimum_character_age = 25
+
access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
alt_titles = list("Biomechanical Engineer","Mechatronic Engineer")
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index 291e60fb85a..a896e8c4c99 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -10,6 +10,9 @@
supervisors = "the captain"
selection_color = "#FF6363"
economic_modifier = 10
+
+ minimum_character_age = 30
+
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
@@ -68,6 +71,9 @@
supervisors = "the head of security"
selection_color = "#FFA4A4"
economic_modifier = 5
+
+ minimum_character_age = 25
+
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_morgue, access_external_airlocks, access_weapons)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_external_airlocks, access_weapons)
minimal_player_age = 7
@@ -114,6 +120,9 @@
supervisors = "the head of security"
selection_color = "#FFA4A4"
economic_modifier = 5
+
+ minimum_character_age = 25
+
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_detective, access_weapons)
minimal_access = list(access_security, access_sec_doors, access_morgue, access_maint_tunnels, access_detective, access_weapons)
minimal_player_age = 7
@@ -152,6 +161,9 @@
supervisors = "the head of security"
selection_color = "#FFA4A4"
economic_modifier = 5
+
+ minimum_character_age = 25
+
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_weapons)
minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_weapons)
alt_titles = list("Crime Scene Investigator")
@@ -198,8 +210,10 @@
spawn_positions = 4
supervisors = "the head of security"
selection_color = "#FFA4A4"
-// alt_titles = list("Junior Officer") //aurora already has security cadets
economic_modifier = 4
+
+ minimum_character_age = 18
+
access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_morgue, access_external_airlocks, access_weapons)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_external_airlocks, access_weapons)
minimal_player_age = 7
diff --git a/code/modules/client/preference_setup/occupation/occupation.dm b/code/modules/client/preference_setup/occupation/occupation.dm
index a77c3821470..c854ad618a6 100644
--- a/code/modules/client/preference_setup/occupation/occupation.dm
+++ b/code/modules/client/preference_setup/occupation/occupation.dm
@@ -172,6 +172,8 @@
var/rank = job.title
lastJob = job
var/ban_reason = jobban_isbanned(user, rank)
+ var/character_age = user.client.prefs.age
+ var/datum/species/species = global.all_species[user.client.prefs.species]
if(ban_reason == "WHITELISTED")
dat += "[rank]