diff --git a/code/controllers/subsystems/job.dm b/code/controllers/subsystems/job.dm
index 55ff3e14a4..f6458efc2a 100644
--- a/code/controllers/subsystems/job.dm
+++ b/code/controllers/subsystems/job.dm
@@ -420,7 +420,7 @@ SUBSYSTEM_DEF(job)
// Hand out random jobs to the people who didn't get any in the last check
// Also makes sure that they got their preference correct
for(var/mob/new_player/player in unassigned)
- if(player.client.prefs.alternate_option == GET_RANDOM_JOB)
+ if(player.client.prefs.read_preference(/datum/preference/numeric/human/alternate_option) == GET_RANDOM_JOB)
give_random_job(player)
job_debug_message("DO, Standard Check end")
@@ -429,13 +429,13 @@ SUBSYSTEM_DEF(job)
// For those who wanted to be assistant if their preferences were filled, here you go.
for(var/mob/new_player/player in unassigned)
- if(player.client.prefs.alternate_option == BE_ASSISTANT)
+ if(player.client.prefs.read_preference(/datum/preference/numeric/human/alternate_option) == BE_ASSISTANT)
job_debug_message("AC2 Assistant located, Player: [player]")
assign_role(player, JOB_ALT_VISITOR) //VOREStation Edit - Visitor not Assistant
//For ones returning to lobby
for(var/mob/new_player/player in unassigned)
- if(player.client.prefs.alternate_option == RETURN_TO_LOBBY)
+ if(player.client.prefs.read_preference(/datum/preference/numeric/human/alternate_option) == RETURN_TO_LOBBY)
player.ready = PLAYER_NOT_READY
unassigned -= player
return TRUE
diff --git a/code/game/antagonist/antagonist_helpers.dm b/code/game/antagonist/antagonist_helpers.dm
index 318554ba16..346559e193 100644
--- a/code/game/antagonist/antagonist_helpers.dm
+++ b/code/game/antagonist/antagonist_helpers.dm
@@ -16,7 +16,7 @@
if(J.mob_type & JOB_SILICON)
return FALSE
else // If SSjob couldn't find a job, they don't have one yet, so the next best thing we can switch on are job preferences
- if((player.current.client.prefs.job_engsec_high | player.current.client.prefs.job_engsec_med | player.current.client.prefs.job_engsec_low) & (AI_DEPT | CYBORG)) // If they have ANY chance of being silicon
+ if((player.current.client.prefs.read_preference(/datum/preference/numeric/human/job_engsec_high) | player.current.client.prefs.read_preference(/datum/preference/numeric/human/job_engsec_med) | player.current.client.prefs.read_preference(/datum/preference/numeric/human/job_engsec_low)) & (AI_DEPT | CYBORG)) // If they have ANY chance of being silicon
return FALSE
return TRUE
diff --git a/code/game/objects/items/weapons/id cards/station_ids.dm b/code/game/objects/items/weapons/id cards/station_ids.dm
index 8723df681b..2e71ae8209 100644
--- a/code/game/objects/items/weapons/id cards/station_ids.dm
+++ b/code/game/objects/items/weapons/id cards/station_ids.dm
@@ -416,8 +416,9 @@
if(!preset_rank)
var/title
- if(user.client.prefs.player_alt_titles[user.job])
- title = user.client.prefs.player_alt_titles[user.job]
+ var/list/alt_titles = user.client.prefs.read_preference(/datum/preference/player_alt_titles)
+ if(islist(alt_titles) && alt_titles[user.job])
+ title = alt_titles[user.job]
else
title = user.job
assignment = title
diff --git a/code/modules/client/preference_setup/occupation/occupation.dm b/code/modules/client/preference_setup/occupation/occupation.dm
deleted file mode 100644
index 4ed98a745b..0000000000
--- a/code/modules/client/preference_setup/occupation/occupation.dm
+++ /dev/null
@@ -1,372 +0,0 @@
-/datum/category_item/player_setup_item/occupation
- name = "Occupation"
- sort_order = 1
-
-/datum/category_item/player_setup_item/occupation/load_character(list/save_data)
- pref.alternate_option = save_data["alternate_option"]
- pref.job_civilian_high = save_data["job_civilian_high"]
- pref.job_civilian_med = save_data["job_civilian_med"]
- pref.job_civilian_low = save_data["job_civilian_low"]
- pref.job_medsci_high = save_data["job_medsci_high"]
- pref.job_medsci_med = save_data["job_medsci_med"]
- pref.job_medsci_low = save_data["job_medsci_low"]
- pref.job_engsec_high = save_data["job_engsec_high"]
- pref.job_engsec_med = save_data["job_engsec_med"]
- pref.job_engsec_low = save_data["job_engsec_low"]
- //VOREStation Add
- pref.job_talon_low = save_data["job_talon_low"]
- pref.job_talon_med = save_data["job_talon_med"]
- pref.job_talon_high = save_data["job_talon_high"]
- //VOREStation Add End
- pref.player_alt_titles = check_list_copy(save_data["player_alt_titles"])
-
-/datum/category_item/player_setup_item/occupation/save_character(list/save_data)
- save_data["alternate_option"] = pref.alternate_option
- save_data["job_civilian_high"] = pref.job_civilian_high
- save_data["job_civilian_med"] = pref.job_civilian_med
- save_data["job_civilian_low"] = pref.job_civilian_low
- save_data["job_medsci_high"] = pref.job_medsci_high
- save_data["job_medsci_med"] = pref.job_medsci_med
- save_data["job_medsci_low"] = pref.job_medsci_low
- save_data["job_engsec_high"] = pref.job_engsec_high
- save_data["job_engsec_med"] = pref.job_engsec_med
- save_data["job_engsec_low"] = pref.job_engsec_low
- //VOREStation Add
- save_data["job_talon_low"] = pref.job_talon_low
- save_data["job_talon_med"] = pref.job_talon_med
- save_data["job_talon_high"] = pref.job_talon_high
- //VOREStation Add End
- save_data["player_alt_titles"] = check_list_copy(pref.player_alt_titles)
-
-/datum/category_item/player_setup_item/occupation/sanitize_character()
- pref.alternate_option = sanitize_integer(pref.alternate_option, 0, 2, initial(pref.alternate_option))
- pref.job_civilian_high = sanitize_integer(pref.job_civilian_high, 0, 65535, initial(pref.job_civilian_high))
- pref.job_civilian_med = sanitize_integer(pref.job_civilian_med, 0, 65535, initial(pref.job_civilian_med))
- pref.job_civilian_low = sanitize_integer(pref.job_civilian_low, 0, 65535, initial(pref.job_civilian_low))
- pref.job_medsci_high = sanitize_integer(pref.job_medsci_high, 0, 65535, initial(pref.job_medsci_high))
- pref.job_medsci_med = sanitize_integer(pref.job_medsci_med, 0, 65535, initial(pref.job_medsci_med))
- pref.job_medsci_low = sanitize_integer(pref.job_medsci_low, 0, 65535, initial(pref.job_medsci_low))
- pref.job_engsec_high = sanitize_integer(pref.job_engsec_high, 0, 65535, initial(pref.job_engsec_high))
- pref.job_engsec_med = sanitize_integer(pref.job_engsec_med, 0, 65535, initial(pref.job_engsec_med))
- pref.job_engsec_low = sanitize_integer(pref.job_engsec_low, 0, 65535, initial(pref.job_engsec_low))
- //VOREStation Add
- pref.job_talon_high = sanitize_integer(pref.job_talon_high, 0, 65535, initial(pref.job_talon_high))
- pref.job_talon_med = sanitize_integer(pref.job_talon_med, 0, 65535, initial(pref.job_talon_med))
- pref.job_talon_low = sanitize_integer(pref.job_talon_low, 0, 65535, initial(pref.job_talon_low))
- //VOREStation Add End
- if(!(pref.player_alt_titles)) pref.player_alt_titles = new()
-
- if(!SSjob)
- return
-
- for(var/datum/job/job in SSjob.occupations)
- var/alt_title = pref.player_alt_titles[job.title]
- if(alt_title && !(alt_title in job.alt_titles))
- pref.player_alt_titles -= job.title
-
-/datum/category_item/player_setup_item/occupation/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
- var/list/data = ..()
-
- var/list/jobs_data = list()
- var/list/all_valid_jobs = list()
- for(var/D in SSjob.department_datums)
- var/datum/department/department = SSjob.department_datums[D]
- if(department.centcom_only) // No joining as a centcom role, if any are ever added.
- continue
-
- for(var/J in department.primary_jobs)
- all_valid_jobs += department.jobs[J]
-
- jobs_data[department.name] = list()
-
- for(var/datum/job/job in all_valid_jobs)
- if(job.latejoin_only)
- continue
- var/datum/department/current_department = SSjob.get_primary_department_of_job(job)
- // for the is_job_whitelisted check..
- usr = user
- var/list/job_data = list(
- "title" = job.title,
- "ref" = REF(job),
- "selection_color" = job.selection_color,
- // reasons you can't select it
- "banned" = !!jobban_isbanned(user, job.title),
- "denylist_days" = !job.player_old_enough(user.client),
- "available_in_days" = job.available_in_days(user.client),
- "denylist_playtime" = !job.player_has_enough_playtime(user.client),
- "available_in_hours" = job.available_in_playhours(user.client),
- "denylist_whitelist" = !is_job_whitelisted(user, job.title),
- // tigercat2000 - these shouldn't exist >:(
- "denylist_character_age" = FALSE,
- "min_age" = job.get_min_age(pref.read_preference(/datum/preference/choiced/species), pref.read_preference(/datum/preference/organ_data)?[O_BRAIN]),
- "special_color" = "",
- "selected" = 0,
- "selected_title" = "",
- "alt_titles" = list(),
- )
-
- if((job.minimum_character_age || job.min_age_by_species) && user.client && (user.read_preference(/datum/preference/numeric/human/age) < job.get_min_age(user.client.prefs.read_preference(/datum/preference/choiced/species), user.client.prefs.read_preference(/datum/preference/organ_data)?[O_BRAIN])))
- job_data["denylist_character_age"] = TRUE
-
- if((pref.job_civilian_low & ASSISTANT) && job.type != /datum/job/assistant)
- job_data["special_color"] = "gray"
- if((job.title in SSjob.get_job_titles_in_department(DEPARTMENT_COMMAND) ) || (job.title == JOB_AI))//Bold head jobs
- job_data["special_color"] = "bold"
-
- if(job.type == /datum/job/assistant)//Assistant is special
- if(pref.job_civilian_low & ASSISTANT)
- job_data["selected"] = 4
- else
- job_data["selected"] = 0
- else if(pref.GetJobDepartment(job, 1) & job.flag)
- job_data["selected"] = 3
- else if(pref.GetJobDepartment(job, 2) & job.flag)
- job_data["selected"] = 2
- else if(pref.GetJobDepartment(job, 3) & job.flag)
- job_data["selected"] = 1
- else
- job_data["selected"] = 0
-
- job_data["selected_title"] = pref.GetPlayerAltTitle(job)
- for(var/title in job.alt_titles)
- job_data["alt_titles"] += title
-
- UNTYPED_LIST_ADD(jobs_data[current_department.name], job_data)
-
- data["jobs"] = jobs_data
- data["alternate_option"] = pref.alternate_option
-
- return data
-
-/datum/category_item/player_setup_item/occupation/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
- . = ..()
- if(.)
- return
-
- var/mob/user = ui.user
-
- switch(action)
- if("reset_jobs")
- ResetJobs()
- return TOPIC_REFRESH_UPDATE_PREVIEW
-
- if("job_alternative")
- if(pref.alternate_option == GET_RANDOM_JOB || pref.alternate_option == BE_ASSISTANT)
- pref.alternate_option += 1
- else if(pref.alternate_option == RETURN_TO_LOBBY)
- pref.alternate_option = 0
- return TOPIC_REFRESH
-
- if("select_alt_title")
- var/datum/job/J = locate(params["job"])
- if(istype(J))
- var/choices = list(J.title) + J.alt_titles
- var/choice = tgui_input_list(user, "Choose a title for [J.title].", "Choose Title", choices, pref.GetPlayerAltTitle(J))
- if(choice)
- SetPlayerAltTitle(J, choice)
- return TOPIC_REFRESH_UPDATE_PREVIEW
-
- if("set_job")
- if(SetJob(user, params["set_job"], text2num(params["level"])))
- return TOPIC_REFRESH_UPDATE_PREVIEW
- return TOPIC_HANDLED
-
- if("job_info")
- var/rank = params["rank"]
- var/datum/job/job = SSjob.get_job(rank)
- if(!istype(job))
- return TOPIC_NOACTION
-
- var/dat = list()
-
- dat += "
"
- if(job.alt_titles)
- dat += span_italics(span_bold("Alternate titles:") + " [english_list(job.alt_titles)].")
- send_rsc(user, job.get_job_icon(), "job[ckey(rank)].png")
- dat += "
"
- if(job.departments)
- dat += span_bold("Departments:") + " [english_list(job.departments)]."
- if(LAZYLEN(job.departments_managed))
- dat += "You manage these departments: [english_list(job.departments_managed)]"
-
- dat += "You answer to " + span_bold("[job.supervisors]") + " normally."
-
- dat += "
"
- if(CONFIG_GET(string/wikiurl))
- dat += "Open wiki page in browser"
-
- var/alt_title = pref.GetPlayerAltTitle(job)
- var/list/description = job.get_description_blurb(alt_title)
- if(LAZYLEN(description))
- dat += html_encode(description[1])
- if(description.len > 1)
- if(!isnull(description[2]))
- dat += "
"
- dat += html_encode(description[2])
-
- var/datum/browser/popup = new(user, "Job Info", "[capitalize(rank)]", 430, 520, src)
- popup.set_content(jointext(dat,"
"))
- popup.open()
- return TOPIC_HANDLED
-
-// must stay for job popup to work
-/datum/category_item/player_setup_item/occupation/OnTopic(href, href_list, user)
- if(href_list["job_wiki"])
- var/rank = href_list["job_wiki"]
- open_link(user,"[CONFIG_GET(string/wikiurl)][rank]")
-
- return ..()
-
-/datum/category_item/player_setup_item/occupation/proc/SetPlayerAltTitle(datum/job/job, new_title)
- // remove existing entry
- pref.player_alt_titles -= job.title
- // add one if it's not default
- if(job.title != new_title)
- pref.player_alt_titles[job.title] = new_title
-
-/datum/category_item/player_setup_item/occupation/proc/SetJob(mob/user, role, level)
- var/datum/job/job = SSjob.get_job(role)
- if(!job)
- return 0
-
- if(job.type == /datum/job/assistant)
- if(pref.job_civilian_low & job.flag)
- pref.job_civilian_low &= ~job.flag
- else
- pref.job_civilian_low |= job.flag
- return 1
-
- SetJobDepartment(job, level)
- return 1
-
-/datum/category_item/player_setup_item/occupation/proc/reset_jobhigh()
- pref.job_civilian_med |= pref.job_civilian_high
- pref.job_medsci_med |= pref.job_medsci_high
- pref.job_engsec_med |= pref.job_engsec_high
- pref.job_talon_med |= pref.job_talon_high //VOREStation Add
- pref.job_civilian_high = 0
- pref.job_medsci_high = 0
- pref.job_engsec_high = 0
- pref.job_talon_high = 0 //VOREStation Add
-
-// Level is equal to the desired new level of the job. So for a value of 4, we want to disable the job.
-/datum/category_item/player_setup_item/occupation/proc/SetJobDepartment(var/datum/job/job, var/level)
- if(!job || !level)
- return 0
-
- switch(job.department_flag)
- if(CIVILIAN)
- pref.job_civilian_low &= ~job.flag
- pref.job_civilian_med &= ~job.flag
- pref.job_civilian_high &= ~job.flag
- switch(level)
- if(1)
- reset_jobhigh()
- pref.job_civilian_high = job.flag
- if(2)
- pref.job_civilian_med |= job.flag
- if(3)
- pref.job_civilian_low |= job.flag
- if(MEDSCI)
- pref.job_medsci_low &= ~job.flag
- pref.job_medsci_med &= ~job.flag
- pref.job_medsci_high &= ~job.flag
- switch(level)
- if(1)
- reset_jobhigh()
- pref.job_medsci_high = job.flag
- if(2)
- pref.job_medsci_med |= job.flag
- if(3)
- pref.job_medsci_low |= job.flag
- if(ENGSEC)
- pref.job_engsec_low &= ~job.flag
- pref.job_engsec_med &= ~job.flag
- pref.job_engsec_high &= ~job.flag
- switch(level)
- if(1)
- reset_jobhigh()
- pref.job_engsec_high = job.flag
- if(2)
- pref.job_engsec_med |= job.flag
- if(3)
- pref.job_engsec_low |= job.flag
- //VOREStation Add
- if(TALON)
- pref.job_talon_low &= ~job.flag
- pref.job_talon_med &= ~job.flag
- pref.job_talon_high &= ~job.flag
- switch(level)
- if(1)
- reset_jobhigh()
- pref.job_talon_high = job.flag
- if(2)
- pref.job_talon_med |= job.flag
- if(3)
- pref.job_talon_low |= job.flag
- //VOREStation Add End
-
- return 1
-
-/datum/category_item/player_setup_item/occupation/proc/ResetJobs()
- pref.job_civilian_high = 0
- pref.job_civilian_med = 0
- pref.job_civilian_low = 0
-
- pref.job_medsci_high = 0
- pref.job_medsci_med = 0
- pref.job_medsci_low = 0
-
- pref.job_engsec_high = 0
- pref.job_engsec_med = 0
- pref.job_engsec_low = 0
-
- //VOREStation Add
- pref.job_talon_high = 0
- pref.job_talon_med = 0
- pref.job_talon_low = 0
- //VOREStation Add End
-
- pref.player_alt_titles.Cut()
-
-/datum/preferences/proc/GetPlayerAltTitle(datum/job/job)
- return (job.title in player_alt_titles) ? player_alt_titles[job.title] : job.title
-
-/datum/preferences/proc/GetJobDepartment(var/datum/job/job, var/level)
- if(!job || !level) return 0
- switch(job.department_flag)
- if(CIVILIAN)
- switch(level)
- if(1)
- return job_civilian_high
- if(2)
- return job_civilian_med
- if(3)
- return job_civilian_low
- if(MEDSCI)
- switch(level)
- if(1)
- return job_medsci_high
- if(2)
- return job_medsci_med
- if(3)
- return job_medsci_low
- if(ENGSEC)
- switch(level)
- if(1)
- return job_engsec_high
- if(2)
- return job_engsec_med
- if(3)
- return job_engsec_low
- //VOREStation Add
- if(TALON)
- switch(level)
- if(1)
- return job_talon_high
- if(2)
- return job_talon_med
- if(3)
- return job_talon_low
- //VOREStation Add End
- return 0
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index ac976eb254..338f8f3e17 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -57,22 +57,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"PMHjiggle" = "character_preview_map:102,7:107",
)
- //Jobs, uses bitflags
- var/job_civilian_high = 0
- var/job_civilian_med = 0
- var/job_civilian_low = 0
-
- var/job_medsci_high = 0
- var/job_medsci_med = 0
- var/job_medsci_low = 0
-
- var/job_engsec_high = 0
- var/job_engsec_med = 0
- var/job_engsec_low = 0
-
- //Keeps track of preferrence for not getting any wanted jobs
- var/alternate_option = 1
-
//character preferences
var/slot_randomized //keeps track of round-to-round randomization of the character slot, prevents overwriting
@@ -80,7 +64,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
// maps each organ to either null(intact), "cyborg" or "amputated"
// will probably not be able to do this for head and torso ;)
- var/list/player_alt_titles = new() // the default name of a job like JOB_MEDICAL_DOCTOR
var/list/body_markings = list() // "name" = "#rgbcolor" //VOREStation Edit: "name" = list(BP_HEAD = list("on" = , "color" = "#rgbcolor"), BP_TORSO = ...)
diff --git a/code/modules/client/preferences/types/character/occupation.dm b/code/modules/client/preferences/types/character/occupation.dm
new file mode 100644
index 0000000000..ffcce77cfb
--- /dev/null
+++ b/code/modules/client/preferences/types/character/occupation.dm
@@ -0,0 +1,545 @@
+// Occupation preferences
+// Stores job priority bitflags, alt titles, and bay UI bridge.
+
+// Job bitflag preferences (0-65535)
+
+/datum/preference/numeric/human/job_civilian_high
+ savefile_key = "job_civilian_high"
+ savefile_identifier = PREFERENCE_CHARACTER
+ category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ can_randomize = FALSE
+ minimum = 0
+ maximum = 65535
+
+/datum/preference/numeric/human/job_civilian_high/create_default_value()
+ return 0
+
+/datum/preference/numeric/human/job_civilian_high/apply_to_human(mob/living/carbon/human/target, value)
+ return
+
+/datum/preference/numeric/human/job_civilian_med
+ savefile_key = "job_civilian_med"
+ savefile_identifier = PREFERENCE_CHARACTER
+ category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ can_randomize = FALSE
+ minimum = 0
+ maximum = 65535
+
+/datum/preference/numeric/human/job_civilian_med/create_default_value()
+ return 0
+
+/datum/preference/numeric/human/job_civilian_med/apply_to_human(mob/living/carbon/human/target, value)
+ return
+
+/datum/preference/numeric/human/job_civilian_low
+ savefile_key = "job_civilian_low"
+ savefile_identifier = PREFERENCE_CHARACTER
+ category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ can_randomize = FALSE
+ minimum = 0
+ maximum = 65535
+
+/datum/preference/numeric/human/job_civilian_low/create_default_value()
+ return 0
+
+/datum/preference/numeric/human/job_civilian_low/apply_to_human(mob/living/carbon/human/target, value)
+ return
+
+/datum/preference/numeric/human/job_medsci_high
+ savefile_key = "job_medsci_high"
+ savefile_identifier = PREFERENCE_CHARACTER
+ category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ can_randomize = FALSE
+ minimum = 0
+ maximum = 65535
+
+/datum/preference/numeric/human/job_medsci_high/create_default_value()
+ return 0
+
+/datum/preference/numeric/human/job_medsci_high/apply_to_human(mob/living/carbon/human/target, value)
+ return
+
+/datum/preference/numeric/human/job_medsci_med
+ savefile_key = "job_medsci_med"
+ savefile_identifier = PREFERENCE_CHARACTER
+ category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ can_randomize = FALSE
+ minimum = 0
+ maximum = 65535
+
+/datum/preference/numeric/human/job_medsci_med/create_default_value()
+ return 0
+
+/datum/preference/numeric/human/job_medsci_med/apply_to_human(mob/living/carbon/human/target, value)
+ return
+
+/datum/preference/numeric/human/job_medsci_low
+ savefile_key = "job_medsci_low"
+ savefile_identifier = PREFERENCE_CHARACTER
+ category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ can_randomize = FALSE
+ minimum = 0
+ maximum = 65535
+
+/datum/preference/numeric/human/job_medsci_low/create_default_value()
+ return 0
+
+/datum/preference/numeric/human/job_medsci_low/apply_to_human(mob/living/carbon/human/target, value)
+ return
+
+/datum/preference/numeric/human/job_engsec_high
+ savefile_key = "job_engsec_high"
+ savefile_identifier = PREFERENCE_CHARACTER
+ category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ can_randomize = FALSE
+ minimum = 0
+ maximum = 65535
+
+/datum/preference/numeric/human/job_engsec_high/create_default_value()
+ return 0
+
+/datum/preference/numeric/human/job_engsec_high/apply_to_human(mob/living/carbon/human/target, value)
+ return
+
+/datum/preference/numeric/human/job_engsec_med
+ savefile_key = "job_engsec_med"
+ savefile_identifier = PREFERENCE_CHARACTER
+ category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ can_randomize = FALSE
+ minimum = 0
+ maximum = 65535
+
+/datum/preference/numeric/human/job_engsec_med/create_default_value()
+ return 0
+
+/datum/preference/numeric/human/job_engsec_med/apply_to_human(mob/living/carbon/human/target, value)
+ return
+
+/datum/preference/numeric/human/job_engsec_low
+ savefile_key = "job_engsec_low"
+ savefile_identifier = PREFERENCE_CHARACTER
+ category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ can_randomize = FALSE
+ minimum = 0
+ maximum = 65535
+
+/datum/preference/numeric/human/job_engsec_low/create_default_value()
+ return 0
+
+/datum/preference/numeric/human/job_engsec_low/apply_to_human(mob/living/carbon/human/target, value)
+ return
+
+// VOREStation Add - Talon job bitflags
+/datum/preference/numeric/human/job_talon_high
+ savefile_key = "job_talon_high"
+ savefile_identifier = PREFERENCE_CHARACTER
+ category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ can_randomize = FALSE
+ minimum = 0
+ maximum = 65535
+
+/datum/preference/numeric/human/job_talon_high/create_default_value()
+ return 0
+
+/datum/preference/numeric/human/job_talon_high/apply_to_human(mob/living/carbon/human/target, value)
+ return
+
+/datum/preference/numeric/human/job_talon_med
+ savefile_key = "job_talon_med"
+ savefile_identifier = PREFERENCE_CHARACTER
+ category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ can_randomize = FALSE
+ minimum = 0
+ maximum = 65535
+
+/datum/preference/numeric/human/job_talon_med/create_default_value()
+ return 0
+
+/datum/preference/numeric/human/job_talon_med/apply_to_human(mob/living/carbon/human/target, value)
+ return
+
+/datum/preference/numeric/human/job_talon_low
+ savefile_key = "job_talon_low"
+ savefile_identifier = PREFERENCE_CHARACTER
+ category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ can_randomize = FALSE
+ minimum = 0
+ maximum = 65535
+
+/datum/preference/numeric/human/job_talon_low/create_default_value()
+ return 0
+
+/datum/preference/numeric/human/job_talon_low/apply_to_human(mob/living/carbon/human/target, value)
+ return
+// VOREStation Add End
+
+// Alternate option preference (0-2)
+
+/datum/preference/numeric/human/alternate_option
+ savefile_key = "alternate_option"
+ savefile_identifier = PREFERENCE_CHARACTER
+ category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ can_randomize = FALSE
+ minimum = 0
+ maximum = 2
+
+/datum/preference/numeric/human/alternate_option/create_default_value()
+ return 1
+
+/datum/preference/numeric/human/alternate_option/apply_to_human(mob/living/carbon/human/target, value)
+ return
+
+// Player alt titles preference (assoc list)
+
+/datum/preference/player_alt_titles
+ savefile_key = "player_alt_titles"
+ savefile_identifier = PREFERENCE_CHARACTER
+ category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ can_randomize = FALSE
+
+/datum/preference/player_alt_titles/create_default_value()
+ return list()
+
+/datum/preference/player_alt_titles/pref_deserialize(input, datum/preferences/preferences)
+ if(!islist(input))
+ return list()
+ return input
+
+/datum/preference/player_alt_titles/pref_serialize(input)
+ if(!islist(input))
+ return list()
+ return check_list_copy(input)
+
+/datum/preference/player_alt_titles/is_valid(value)
+ return islist(value)
+
+/datum/preference/player_alt_titles/apply_to_human(mob/living/carbon/human/target, value)
+ return
+
+/datum/preference/player_alt_titles/apply_to_living(mob/living/target, value)
+ return
+
+/datum/preference/player_alt_titles/apply_to_silicon(mob/living/silicon/target, value)
+ return
+
+/datum/preference/player_alt_titles/apply_to_animal(mob/living/simple_mob/target, value)
+ return
+
+// ---- Bay UI Bridge ----
+
+/datum/category_item/player_setup_item/occupation
+ name = "Occupation"
+ sort_order = 1
+
+/datum/category_item/player_setup_item/occupation/load_character(list/save_data)
+ return // Handled by TG preference system
+
+/datum/category_item/player_setup_item/occupation/save_character(list/save_data)
+ return // Handled by TG preference system
+
+/datum/category_item/player_setup_item/occupation/sanitize_character()
+ return // Handled by TG preference system
+
+/datum/category_item/player_setup_item/occupation/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
+ var/list/data = ..()
+
+ var/list/jobs_data = list()
+ var/list/all_valid_jobs = list()
+ for(var/D in SSjob.department_datums)
+ var/datum/department/department = SSjob.department_datums[D]
+ if(department.centcom_only) // No joining as a centcom role, if any are ever added.
+ continue
+
+ for(var/J in department.primary_jobs)
+ all_valid_jobs += department.jobs[J]
+
+ jobs_data[department.name] = list()
+
+ for(var/datum/job/job in all_valid_jobs)
+ if(job.latejoin_only)
+ continue
+ var/datum/department/current_department = SSjob.get_primary_department_of_job(job)
+ // for the is_job_whitelisted check..
+ usr = user
+ var/list/job_data = list(
+ "title" = job.title,
+ "ref" = REF(job),
+ "selection_color" = job.selection_color,
+ // reasons you can't select it
+ "banned" = !!jobban_isbanned(user, job.title),
+ "denylist_days" = !job.player_old_enough(user.client),
+ "available_in_days" = job.available_in_days(user.client),
+ "denylist_playtime" = !job.player_has_enough_playtime(user.client),
+ "available_in_hours" = job.available_in_playhours(user.client),
+ "denylist_whitelist" = !is_job_whitelisted(user, job.title),
+ // tigercat2000 - these shouldn't exist >:(
+ "denylist_character_age" = FALSE,
+ "min_age" = job.get_min_age(pref.read_preference(/datum/preference/choiced/species), pref.read_preference(/datum/preference/organ_data)?[O_BRAIN]),
+ "special_color" = "",
+ "selected" = 0,
+ "selected_title" = "",
+ "alt_titles" = list(),
+ )
+
+ if((job.minimum_character_age || job.min_age_by_species) && user.client && (user.read_preference(/datum/preference/numeric/human/age) < job.get_min_age(user.client.prefs.read_preference(/datum/preference/choiced/species), user.client.prefs.read_preference(/datum/preference/organ_data)?[O_BRAIN])))
+ job_data["denylist_character_age"] = TRUE
+
+ if((pref.read_preference(/datum/preference/numeric/human/job_civilian_low) & ASSISTANT) && job.type != /datum/job/assistant)
+ job_data["special_color"] = "gray"
+ if((job.title in SSjob.get_job_titles_in_department(DEPARTMENT_COMMAND) ) || (job.title == JOB_AI))//Bold head jobs
+ job_data["special_color"] = "bold"
+
+ if(job.type == /datum/job/assistant)//Assistant is special
+ if(pref.read_preference(/datum/preference/numeric/human/job_civilian_low) & ASSISTANT)
+ job_data["selected"] = 4
+ else
+ job_data["selected"] = 0
+ else if(pref.GetJobDepartment(job, 1) & job.flag)
+ job_data["selected"] = 3
+ else if(pref.GetJobDepartment(job, 2) & job.flag)
+ job_data["selected"] = 2
+ else if(pref.GetJobDepartment(job, 3) & job.flag)
+ job_data["selected"] = 1
+ else
+ job_data["selected"] = 0
+
+ job_data["selected_title"] = pref.GetPlayerAltTitle(job)
+ for(var/title in job.alt_titles)
+ job_data["alt_titles"] += title
+
+ UNTYPED_LIST_ADD(jobs_data[current_department.name], job_data)
+
+ data["jobs"] = jobs_data
+ data["alternate_option"] = pref.read_preference(/datum/preference/numeric/human/alternate_option)
+
+ return data
+
+/datum/category_item/player_setup_item/occupation/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
+ . = ..()
+ if(.)
+ return
+
+ var/mob/user = ui.user
+
+ switch(action)
+ if("reset_jobs")
+ ResetJobs()
+ return TOPIC_REFRESH_UPDATE_PREVIEW
+
+ if("job_alternative")
+ var/current = pref.read_preference(/datum/preference/numeric/human/alternate_option)
+ if(current == GET_RANDOM_JOB || current == BE_ASSISTANT)
+ pref.write_preference_by_type(/datum/preference/numeric/human/alternate_option, current + 1)
+ else if(current == RETURN_TO_LOBBY)
+ pref.write_preference_by_type(/datum/preference/numeric/human/alternate_option, 0)
+ return TOPIC_REFRESH
+
+ if("select_alt_title")
+ var/datum/job/J = locate(params["job"])
+ if(istype(J))
+ var/choices = list(J.title) + J.alt_titles
+ var/choice = tgui_input_list(user, "Choose a title for [J.title].", "Choose Title", choices, pref.GetPlayerAltTitle(J))
+ if(choice)
+ SetPlayerAltTitle(J, choice)
+ return TOPIC_REFRESH_UPDATE_PREVIEW
+
+ if("set_job")
+ if(SetJob(user, params["set_job"], text2num(params["level"])))
+ return TOPIC_REFRESH_UPDATE_PREVIEW
+ return TOPIC_HANDLED
+
+ if("job_info")
+ var/rank = params["rank"]
+ var/datum/job/job = SSjob.get_job(rank)
+ if(!istype(job))
+ return TOPIC_NOACTION
+
+ var/dat = list()
+
+ dat += "
"
+ if(job.alt_titles)
+ dat += span_italics(span_bold("Alternate titles:") + " [english_list(job.alt_titles)].")
+ send_rsc(user, job.get_job_icon(), "job[ckey(rank)].png")
+ dat += "
"
+ if(job.departments)
+ dat += span_bold("Departments:") + " [english_list(job.departments)]."
+ if(LAZYLEN(job.departments_managed))
+ dat += "You manage these departments: [english_list(job.departments_managed)]"
+
+ dat += "You answer to " + span_bold("[job.supervisors]") + " normally."
+
+ dat += "
"
+ if(CONFIG_GET(string/wikiurl))
+ dat += "Open wiki page in browser"
+
+ var/alt_title = pref.GetPlayerAltTitle(job)
+ var/list/description = job.get_description_blurb(alt_title)
+ if(LAZYLEN(description))
+ dat += html_encode(description[1])
+ if(description.len > 1)
+ if(!isnull(description[2]))
+ dat += "
"
+ dat += html_encode(description[2])
+
+ var/datum/browser/popup = new(user, "Job Info", "[capitalize(rank)]", 430, 520, src)
+ popup.set_content(jointext(dat,"
"))
+ popup.open()
+ return TOPIC_HANDLED
+
+// must stay for job popup to work
+/datum/category_item/player_setup_item/occupation/OnTopic(href, href_list, user)
+ if(href_list["job_wiki"])
+ var/rank = href_list["job_wiki"]
+ open_link(user,"[CONFIG_GET(string/wikiurl)][rank]")
+
+ return ..()
+
+// ---- Helper Procs ----
+
+/datum/category_item/player_setup_item/occupation/proc/SetPlayerAltTitle(datum/job/job, new_title)
+ var/list/alt_titles = pref.read_preference(/datum/preference/player_alt_titles)
+ if(!islist(alt_titles))
+ alt_titles = list()
+ // remove existing entry
+ alt_titles -= job.title
+ // add one if it's not default
+ if(job.title != new_title)
+ alt_titles[job.title] = new_title
+ pref.write_preference_by_type(/datum/preference/player_alt_titles, alt_titles)
+
+/datum/category_item/player_setup_item/occupation/proc/SetJob(mob/user, role, level)
+ var/datum/job/job = SSjob.get_job(role)
+ if(!job)
+ return 0
+
+ if(job.type == /datum/job/assistant)
+ var/current = pref.read_preference(/datum/preference/numeric/human/job_civilian_low)
+ if(current & job.flag)
+ pref.write_preference_by_type(/datum/preference/numeric/human/job_civilian_low, current & ~job.flag)
+ else
+ pref.write_preference_by_type(/datum/preference/numeric/human/job_civilian_low, current | job.flag)
+ return 1
+
+ SetJobDepartment(job, level)
+ return 1
+
+/datum/category_item/player_setup_item/occupation/proc/reset_jobhigh()
+ pref.write_preference_by_type(/datum/preference/numeric/human/job_civilian_med, pref.read_preference(/datum/preference/numeric/human/job_civilian_med) | pref.read_preference(/datum/preference/numeric/human/job_civilian_high))
+ pref.write_preference_by_type(/datum/preference/numeric/human/job_medsci_med, pref.read_preference(/datum/preference/numeric/human/job_medsci_med) | pref.read_preference(/datum/preference/numeric/human/job_medsci_high))
+ pref.write_preference_by_type(/datum/preference/numeric/human/job_engsec_med, pref.read_preference(/datum/preference/numeric/human/job_engsec_med) | pref.read_preference(/datum/preference/numeric/human/job_engsec_high))
+ pref.write_preference_by_type(/datum/preference/numeric/human/job_talon_med, pref.read_preference(/datum/preference/numeric/human/job_talon_med) | pref.read_preference(/datum/preference/numeric/human/job_talon_high)) //VOREStation Add
+ pref.write_preference_by_type(/datum/preference/numeric/human/job_civilian_high, 0)
+ pref.write_preference_by_type(/datum/preference/numeric/human/job_medsci_high, 0)
+ pref.write_preference_by_type(/datum/preference/numeric/human/job_engsec_high, 0)
+ pref.write_preference_by_type(/datum/preference/numeric/human/job_talon_high, 0) //VOREStation Add
+
+// Level is equal to the desired new level of the job. So for a value of 4, we want to disable the job.
+/datum/category_item/player_setup_item/occupation/proc/SetJobDepartment(var/datum/job/job, var/level)
+ if(!job || !level)
+ return 0
+
+ var/high_type
+ var/med_type
+ var/low_type
+
+ switch(job.department_flag)
+ if(CIVILIAN)
+ high_type = /datum/preference/numeric/human/job_civilian_high
+ med_type = /datum/preference/numeric/human/job_civilian_med
+ low_type = /datum/preference/numeric/human/job_civilian_low
+ if(MEDSCI)
+ high_type = /datum/preference/numeric/human/job_medsci_high
+ med_type = /datum/preference/numeric/human/job_medsci_med
+ low_type = /datum/preference/numeric/human/job_medsci_low
+ if(ENGSEC)
+ high_type = /datum/preference/numeric/human/job_engsec_high
+ med_type = /datum/preference/numeric/human/job_engsec_med
+ low_type = /datum/preference/numeric/human/job_engsec_low
+ //VOREStation Add
+ if(TALON)
+ high_type = /datum/preference/numeric/human/job_talon_high
+ med_type = /datum/preference/numeric/human/job_talon_med
+ low_type = /datum/preference/numeric/human/job_talon_low
+ //VOREStation Add End
+ else
+ return 0
+
+ // Clear the job flag from all levels
+ pref.write_preference_by_type(low_type, pref.read_preference(low_type) & ~job.flag)
+ pref.write_preference_by_type(med_type, pref.read_preference(med_type) & ~job.flag)
+ pref.write_preference_by_type(high_type, pref.read_preference(high_type) & ~job.flag)
+
+ switch(level)
+ if(1)
+ reset_jobhigh()
+ pref.write_preference_by_type(high_type, job.flag)
+ if(2)
+ pref.write_preference_by_type(med_type, pref.read_preference(med_type) | job.flag)
+ if(3)
+ pref.write_preference_by_type(low_type, pref.read_preference(low_type) | job.flag)
+
+ return 1
+
+/datum/category_item/player_setup_item/occupation/proc/ResetJobs()
+ pref.write_preference_by_type(/datum/preference/numeric/human/job_civilian_high, 0)
+ pref.write_preference_by_type(/datum/preference/numeric/human/job_civilian_med, 0)
+ pref.write_preference_by_type(/datum/preference/numeric/human/job_civilian_low, 0)
+
+ pref.write_preference_by_type(/datum/preference/numeric/human/job_medsci_high, 0)
+ pref.write_preference_by_type(/datum/preference/numeric/human/job_medsci_med, 0)
+ pref.write_preference_by_type(/datum/preference/numeric/human/job_medsci_low, 0)
+
+ pref.write_preference_by_type(/datum/preference/numeric/human/job_engsec_high, 0)
+ pref.write_preference_by_type(/datum/preference/numeric/human/job_engsec_med, 0)
+ pref.write_preference_by_type(/datum/preference/numeric/human/job_engsec_low, 0)
+
+ //VOREStation Add
+ pref.write_preference_by_type(/datum/preference/numeric/human/job_talon_high, 0)
+ pref.write_preference_by_type(/datum/preference/numeric/human/job_talon_med, 0)
+ pref.write_preference_by_type(/datum/preference/numeric/human/job_talon_low, 0)
+ //VOREStation Add End
+
+ pref.write_preference_by_type(/datum/preference/player_alt_titles, list())
+
+/datum/preferences/proc/GetPlayerAltTitle(datum/job/job)
+ var/list/alt_titles = read_preference(/datum/preference/player_alt_titles)
+ return (islist(alt_titles) && (job.title in alt_titles)) ? alt_titles[job.title] : job.title
+
+/datum/preferences/proc/GetJobDepartment(var/datum/job/job, var/level)
+ if(!job || !level) return 0
+ switch(job.department_flag)
+ if(CIVILIAN)
+ switch(level)
+ if(1)
+ return read_preference(/datum/preference/numeric/human/job_civilian_high)
+ if(2)
+ return read_preference(/datum/preference/numeric/human/job_civilian_med)
+ if(3)
+ return read_preference(/datum/preference/numeric/human/job_civilian_low)
+ if(MEDSCI)
+ switch(level)
+ if(1)
+ return read_preference(/datum/preference/numeric/human/job_medsci_high)
+ if(2)
+ return read_preference(/datum/preference/numeric/human/job_medsci_med)
+ if(3)
+ return read_preference(/datum/preference/numeric/human/job_medsci_low)
+ if(ENGSEC)
+ switch(level)
+ if(1)
+ return read_preference(/datum/preference/numeric/human/job_engsec_high)
+ if(2)
+ return read_preference(/datum/preference/numeric/human/job_engsec_med)
+ if(3)
+ return read_preference(/datum/preference/numeric/human/job_engsec_low)
+ //VOREStation Add
+ if(TALON)
+ switch(level)
+ if(1)
+ return read_preference(/datum/preference/numeric/human/job_talon_high)
+ if(2)
+ return read_preference(/datum/preference/numeric/human/job_talon_med)
+ if(3)
+ return read_preference(/datum/preference/numeric/human/job_talon_low)
+ //VOREStation Add End
+ return 0
diff --git a/code/modules/client/preferences_vr.dm b/code/modules/client/preferences_vr.dm
index fdb793a1d7..4be2fbba29 100644
--- a/code/modules/client/preferences_vr.dm
+++ b/code/modules/client/preferences_vr.dm
@@ -10,10 +10,6 @@
var/auto_backup_implant = FALSE //Whether someone starts with a backup implant or not.
var/borg_petting = TRUE //Whether someone can be petted as a borg or not.
- var/job_talon_high = 0
- var/job_talon_med = 0
- var/job_talon_low = 0
-
//Why weren't these in game toggles already?
/client/verb/toggle_capture_crystal()
set name = "Toggle Catchable"
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index 618a9ef971..cfe1c624de 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -191,7 +191,7 @@
var/datum/job/previewJob
// Determine what job is marked as 'High' priority, and dress them up as such.
- if(job_civilian_low & ASSISTANT)
+ if(read_preference(/datum/preference/numeric/human/job_civilian_low) & ASSISTANT)
previewJob = SSjob.get_job(JOB_ALT_VISITOR)
else if(client && ispAI(client.mob))
pass() //Don't do anything!
@@ -200,11 +200,11 @@
var/job_flag
switch(job.department_flag)
if(CIVILIAN)
- job_flag = job_civilian_high
+ job_flag = read_preference(/datum/preference/numeric/human/job_civilian_high)
if(MEDSCI)
- job_flag = job_medsci_high
+ job_flag = read_preference(/datum/preference/numeric/human/job_medsci_high)
if(ENGSEC)
- job_flag = job_engsec_high
+ job_flag = read_preference(/datum/preference/numeric/human/job_engsec_high)
if(job.flag == job_flag)
previewJob = job
break
@@ -239,7 +239,8 @@
if((equip_preview_mob & EQUIP_PREVIEW_JOB) && previewJob)
mannequin.job = previewJob.title
- previewJob.equip_preview(mannequin, player_alt_titles[previewJob.title])
+ var/list/alt_titles = read_preference(/datum/preference/player_alt_titles)
+ previewJob.equip_preview(mannequin, islist(alt_titles) ? alt_titles[previewJob.title] : null)
/datum/preferences/proc/update_preview_icon()
var/mob/living/carbon/human/dummy/mannequin/mannequin = get_mannequin(client_ckey)
@@ -256,18 +257,18 @@
/datum/preferences/proc/get_highest_job()
var/datum/job/highJob
// Determine what job is marked as 'High' priority, and dress them up as such.
- if(job_civilian_low & ASSISTANT)
+ if(read_preference(/datum/preference/numeric/human/job_civilian_low) & ASSISTANT)
highJob = SSjob.get_job(JOB_ALT_ASSISTANT)
else
for(var/datum/job/job in SSjob.occupations)
var/job_flag
switch(job.department_flag)
if(CIVILIAN)
- job_flag = job_civilian_high
+ job_flag = read_preference(/datum/preference/numeric/human/job_civilian_high)
if(MEDSCI)
- job_flag = job_medsci_high
+ job_flag = read_preference(/datum/preference/numeric/human/job_medsci_high)
if(ENGSEC)
- job_flag = job_engsec_high
+ job_flag = read_preference(/datum/preference/numeric/human/job_engsec_high)
if(job.flag == job_flag)
highJob = job
break
diff --git a/vorestation.dme b/vorestation.dme
index 37ae716b4f..4d1d56d1ad 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2502,7 +2502,6 @@
#include "code\modules\client\preference_setup\loadout\loadout_uniform.dm"
#include "code\modules\client\preference_setup\loadout\loadout_utility.dm"
#include "code\modules\client\preference_setup\loadout\loadout_xeno.dm"
-#include "code\modules\client\preference_setup\occupation\occupation.dm"
#include "code\modules\client\preferences\_preference.dm"
#include "code\modules\client\preferences\preferences_tg.dm"
#include "code\modules\client\preferences\middleware\_middleware.dm"
@@ -2518,6 +2517,7 @@
#include "code\modules\client\preferences\types\character\background.dm"
#include "code\modules\client\preferences\types\character\gender.dm"
#include "code\modules\client\preferences\types\character\names.dm"
+#include "code\modules\client\preferences\types\character\occupation.dm"
#include "code\modules\client\preferences\types\character\organ_data.dm"
#include "code\modules\client\preferences\types\character\records.dm"
#include "code\modules\client\preferences\types\character\rlimb_data.dm"