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"