diff --git a/code/controllers/subsystems/job.dm b/code/controllers/subsystems/job.dm
index e03c0da2f79..fd89a180e8b 100644
--- a/code/controllers/subsystems/job.dm
+++ b/code/controllers/subsystems/job.dm
@@ -102,9 +102,7 @@
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))
+ if(!(rank in player.client.prefs.GetValidTitles(job)))
to_chat(player, "Your character is too young!")
return FALSE
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index 365680984b5..19bd4a22558 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -19,6 +19,7 @@
var/department = null // Does this position have a department tag?
var/head_position = 0 // Is this position Command?
var/minimum_character_age = 17
+ var/list/alt_ages = null // assoc list of alt titles to minimum character ages
var/ideal_character_age = 30
var/latejoin_at_spawnpoints = FALSE //If this job should use roundstart spawnpoints for latejoin (offstation jobs etc)
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index 2253402debb..82394084d6d 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -61,6 +61,7 @@
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")
+ alt_ages = list("Nurse" = 25)
outfit = /datum/outfit/job/doctor
alt_outfits = list(
"Emergency Physician"=/datum/outfit/job/doctor/emergency_physician,
@@ -210,7 +211,8 @@
economic_modifier = 4
minimum_character_age = 24
-
+ alt_ages = list("Emergency Medical Technician" = 20)
+
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")
@@ -253,7 +255,9 @@
selection_color = "#FF97D1"
access = list(access_medical, access_surgery, access_medical_equip)
minimal_access = list(access_medical, access_surgery, access_medical_equip)
+ minimum_character_age = 25
alt_titles = list("Medical Intern")
+ alt_ages = list("Medical Intern" = 18)
outfit = /datum/outfit/job/intern_med
/datum/outfit/job/intern_med
diff --git a/code/modules/client/preference_setup/occupation/occupation.dm b/code/modules/client/preference_setup/occupation/occupation.dm
index c854ad618a6..e1b95d92625 100644
--- a/code/modules/client/preference_setup/occupation/occupation.dm
+++ b/code/modules/client/preference_setup/occupation/occupation.dm
@@ -136,6 +136,9 @@
var/alt_title = pref.player_alt_titles[job.title]
if(alt_title && !(alt_title in job.alt_titles))
pref.player_alt_titles -= job.title
+ var/list/available = pref.GetValidTitles(job)
+ if(LAZYLEN(available) == 1)
+ SetPlayerAltTitle(job, LAZYACCESS(available, 1))
sanitize_faction()
@@ -171,29 +174,28 @@
dat += "
"
var/rank = job.title
lastJob = job
+ var/dispRank = LAZYACCESS(pref.GetValidTitles(job), 1) || rank
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] | \[WHITELISTED] |
"
+ dat += "[dispRank] \[WHITELISTED] | "
continue
else if (ban_reason == "AGE WHITELISTED")
var/available_in_days = player_old_enough_for_role(user.client, rank)
- dat += "[rank] \[IN [(available_in_days)] DAYS] | "
+ dat += "[dispRank] \[IN [(available_in_days)] DAYS] | "
+ continue
+ else if(!LAZYLEN(pref.GetValidTitles(job))) // we have no available jobs the character is old enough for
+ dat += "[dispRank] \[MINIMUM AGE: [LAZYLEN(job.alt_ages) ? min(job.alt_ages[min(job.alt_ages)], job.minimum_character_age) : job.minimum_character_age]] | "
continue
else if (ban_reason)
- dat += "[rank] \[BANNED] | "
- continue
- else if((character_age < job.minimum_character_age) && !(species.spawn_flags & NO_AGE_MINIMUM))
- dat += "[rank] \[MINIMUM AGE: [job.minimum_character_age]] | "
+ dat += "[dispRank] \[BANNED] | "
continue
if((pref.job_civilian_low & ASSISTANT) && (rank != "Assistant"))
- dat += "[rank] | "
+ dat += "[dispRank] | "
continue
if((rank in command_positions) || (rank == "AI"))//Bold head jobs
- dat += "[rank]"
+ dat += "[dispRank]"
else
- dat += "[rank]"
+ dat += "[dispRank]"
dat += ""
@@ -217,7 +219,7 @@
dat += " \[Low]"
else
dat += " \[NEVER]"
- if(job.alt_titles)
+ if(job.alt_titles && (LAZYLEN(pref.GetValidTitles(job)) > 1))
dat += " | |   | \[[pref.GetPlayerAltTitle(job)]\] |
"
dat += ""
@@ -236,7 +238,7 @@
. = dat.Join()
-/datum/category_item/player_setup_item/occupation/OnTopic(href, href_list, user)
+/datum/category_item/player_setup_item/occupation/OnTopic(href, href_list, mob/user)
if(href_list["reset_jobs"])
ResetJobs()
return TOPIC_REFRESH
@@ -250,12 +252,15 @@
else if(href_list["select_alt_title"])
var/datum/job/job = locate(href_list["select_alt_title"])
- if (job)
- var/choices = list(job.title) + job.alt_titles
- var/choice = input("Choose an title for [job.title].", "Choose Title", pref.GetPlayerAltTitle(job)) as anything in choices|null
- if(choice && CanUseTopic(user))
- SetPlayerAltTitle(job, choice)
- return TOPIC_REFRESH
+ if (!job)
+ return ..()
+ var/list/choices = pref.GetValidTitles(job)
+ if(!LAZYLEN(choices))
+ return ..()// should never happen
+ var/choice = input("Choose an title for [job.title].", "Choose Title", pref.GetPlayerAltTitle(job)) as anything in choices|null
+ if(choice && CanUseTopic(user))
+ SetPlayerAltTitle(job, choice)
+ return TOPIC_REFRESH
else if(href_list["set_job"])
if(SetJob(user, href_list["set_job"]))
@@ -425,6 +430,18 @@
/datum/preferences/proc/GetPlayerAltTitle(datum/job/job)
return player_alt_titles[job.title] || job.title
+/datum/preferences/proc/GetValidTitles(datum/job/job)
+ if (!job)
+ return
+ var/choices = list(job.title) + job.alt_titles
+ if((global.all_species[src.species].spawn_flags & NO_AGE_MINIMUM))
+ return choices
+ for(var/t in choices)
+ if (src.age >= (LAZYACCESS(job.alt_ages, t) || job.minimum_character_age))
+ continue
+ choices -= t
+ return choices
+
/datum/preferences/proc/GetJobDepartment(var/datum/job/job, var/level)
if(!job || !level) return 0
switch(job.department_flag)
diff --git a/code/modules/mob/abstract/new_player/new_player.dm b/code/modules/mob/abstract/new_player/new_player.dm
index fcfaa399ba5..69194473257 100644
--- a/code/modules/mob/abstract/new_player/new_player.dm
+++ b/code/modules/mob/abstract/new_player/new_player.dm
@@ -283,9 +283,7 @@ INITIALIZE_IMMEDIATE(/mob/abstract/new_player)
if (!(job.type in faction.allowed_role_types))
return FALSE
- var/character_age = client.prefs.age
- var/datum/species/species = global.all_species[client.prefs.species]
- if((character_age < job.minimum_character_age) && !(species.spawn_flags & NO_AGE_MINIMUM))
+ if(!(rank in client.prefs.GetValidTitles(job))) // does age/species check for us!
return FALSE
return TRUE
@@ -388,9 +386,9 @@ INITIALIZE_IMMEDIATE(/mob/abstract/new_player)
var/active = 0
// Only players with the job assigned and AFK for less than 10 minutes count as active
for(var/mob/M in player_list) //Added isliving check here, so it won't check ghosts and qualify them as active
- if(isliving(M) && M.mind && M.client && M.mind.assigned_role == job.title && M.client.inactivity <= 10 * 60 * 10)
+ if(isliving(M) && M.mind && M.client && M.mind.assigned_role == job.title && M.client.inactivity <= 10 MINUTES)
active++
- dat += "[job.title] ([job.current_positions]) (Active: [active])
"
+ dat += "[client.prefs.GetPlayerAltTitle(job)] ([job.current_positions]) (Active: [active])
"
dat += ""
send_theme_resources(src)
diff --git a/html/changelogs/MDP-fineokay.yml b/html/changelogs/MDP-fineokay.yml
new file mode 100644
index 00000000000..94a1c2f586c
--- /dev/null
+++ b/html/changelogs/MDP-fineokay.yml
@@ -0,0 +1,7 @@
+author: MoondancerPony
+delete-after: True
+changes:
+ - bugfix: "Job age requirements now take into account alt titles. Alt titles are automatically limited to only ones a character is old enough for."
+ - bugfix: "The latejoin screen now shows what alt-title you have selected."
+ - tweak: "The occupation preferences screen now functions differently if only one alt-title is available, or if the base job is not available."
+ - backend: "Tidies up the job age requirement system."
\ No newline at end of file