From ac9b7c2fd8f7aebbe7c78d1b5cee8ec543cd70c7 Mon Sep 17 00:00:00 2001 From: MrZoraman Date: Sat, 9 Aug 2025 19:11:47 -0700 Subject: [PATCH] Allow command to have missing limbs on roundstart. (#4311) ## About The Pull Request As the code currently is, if any missing limb is selected, command is locked. This PR adjusts the logic so that command is locked only if both arms are missing. ## Why It's Good For The Game Disabled captains and other heads of staff offer more character creation and roleplay opportunities. This change removes such logic discrepancies such as a paraplegic captain being fine bug a legless captain being disallowed. Crew with one hand are still very capable and do not need to be blocked from command roles. ## Proof Of Testing Code compiles with 0 errors, 0 warnings. Tested locally and working as expected.
Screenshots/Videos
## Changelog :cl: balance: Heads of staff are free to be missing as many roundstart limbs as they want, as long as they have at least one hand. /:cl: --- code/__DEFINES/~skyrat_defines/jobs.dm | 2 +- code/__DEFINES/~~bubber_defines/jobs.dm | 2 +- code/controllers/subsystem/job.dm | 5 ++- .../modules/mob/dead/new_player/new_player.dm | 2 + .../customization/modules/jobs/_job.dm | 43 ++++++++++++++----- 5 files changed, 40 insertions(+), 14 deletions(-) diff --git a/code/__DEFINES/~skyrat_defines/jobs.dm b/code/__DEFINES/~skyrat_defines/jobs.dm index e0b79a7d668..456a8a955d7 100644 --- a/code/__DEFINES/~skyrat_defines/jobs.dm +++ b/code/__DEFINES/~skyrat_defines/jobs.dm @@ -4,6 +4,7 @@ #define JOB_UNAVAILABLE_LANGUAGE (JOB_UNAVAILABLE_SPECIES + 1) #define JOB_UNAVAILABLE_FLAVOUR (JOB_UNAVAILABLE_LANGUAGE + 1) #define JOB_UNAVAILABLE_AUGMENT (JOB_UNAVAILABLE_FLAVOUR + 1) +#define JOB_UNAVAILABLE_NOHANDS (JOB_UNAVAILABLE_AUGMENT + 1) #define SEC_RESTRICTED_QUIRKS "Blind" = TRUE, "Brain Tumor" = TRUE, "Deaf" = TRUE, "Paraplegic" = TRUE, "Hemiplegic" = TRUE, "Mute" = TRUE, "Foreigner" = TRUE, "Pacifist" = TRUE, "No Guns" = TRUE, "Illiterate" = TRUE, "Nerve Stapled" = TRUE //#define HEAD_RESTRICTED_QUIRKS "Blind" = TRUE, "Deaf" = TRUE, "Mute" = TRUE, "Foreigner" = TRUE, "Brain Tumor" = TRUE, "Illiterate" = TRUE //Bubberstation edit original @@ -12,5 +13,4 @@ #define RESTRICTED_QUIRKS_EXCEPTIONS list("Mute" = "Signer") -#define HEAD_RESTRICTED_AUGMENTS /obj/item/bodypart/arm/left/self_destruct, /obj/item/bodypart/arm/right/self_destruct, /obj/item/bodypart/leg/left/self_destruct, /obj/item/bodypart/leg/right/self_destruct #define SEC_RESTRICTED_AUGMENTS /obj/item/bodypart/arm/left/self_destruct, /obj/item/bodypart/arm/right/self_destruct, /obj/item/bodypart/leg/left/self_destruct, /obj/item/bodypart/leg/right/self_destruct diff --git a/code/__DEFINES/~~bubber_defines/jobs.dm b/code/__DEFINES/~~bubber_defines/jobs.dm index 332d6bdf7ac..e5553db4f3e 100644 --- a/code/__DEFINES/~~bubber_defines/jobs.dm +++ b/code/__DEFINES/~~bubber_defines/jobs.dm @@ -1,5 +1,5 @@ #define RECORDS_TEXT_CHAR_REQUIREMENT 15 -#define JOB_UNAVAILABLE_FLAVOUR_SILICON (JOB_UNAVAILABLE_AUGMENT + 1) +#define JOB_UNAVAILABLE_FLAVOUR_SILICON (JOB_UNAVAILABLE_NOHANDS + 1) //A proc to determine if a job is a silicon job. #define is_silicon_job(A) (istype(A, /datum/job/ai) || istype(A, /datum/job/cyborg)) diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 3863ae8f202..725a0ab8bc4 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -1004,11 +1004,14 @@ SUBSYSTEM_DEF(job) job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_FLAVOUR)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") return JOB_UNAVAILABLE_FLAVOUR + if (!possible_job.has_enough_hands(player.client.prefs)) + job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_NOHANDS)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") + return JOB_UNAVAILABLE_NOHANDS + if(possible_job.has_banned_augment(player.client.prefs)) job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_AUGMENT)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]") return JOB_UNAVAILABLE_AUGMENT - //SKYRAT EDIT END diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 6bf2227118a..e12abfd9647 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -138,6 +138,8 @@ //BUBBER EDIT END: Silicon flavor text if(JOB_UNAVAILABLE_AUGMENT) return "[jobtitle] is restricted due to your selected body augments." + if(JOB_UNAVAILABLE_NOHANDS) + return "[jobtitle] requires at least one hand." //SKYRAT EDIT END if(JOB_UNAVAILABLE_ANTAG_INCOMPAT) return "[jobtitle] is not compatible with some antagonist role assigned to you." diff --git a/modular_skyrat/modules/customization/modules/jobs/_job.dm b/modular_skyrat/modules/customization/modules/jobs/_job.dm index c2abae7d9e8..46d882cf71f 100644 --- a/modular_skyrat/modules/customization/modules/jobs/_job.dm +++ b/modular_skyrat/modules/customization/modules/jobs/_job.dm @@ -7,6 +7,8 @@ var/list/banned_quirks /// List of banned augments var/list/banned_augments + /// Whether or not a hand is required + var/is_hand_required = FALSE ///A list of slots that can't have loadout items assigned to them if no_dresscode is applied, used for important items such as ID, PDA, backpack and headset var/list/blacklist_dresscode_slots //Whitelist of allowed species for this job. If not specified then all roundstart races can be used. Associative with TRUE @@ -53,6 +55,19 @@ return FALSE +/datum/job/proc/has_enough_hands(datum/preferences/pref) + if(!pref) + return TRUE + + var/list/player_augments = pref.augments + var/is_missing_left_arm = player_augments["Left Arm"] == /obj/item/bodypart/arm/left/self_destruct + var/is_missing_right_arm = player_augments["Right Arm"] == /obj/item/bodypart/arm/right/self_destruct + + if(is_hand_required && is_missing_left_arm && is_missing_right_arm) + return FALSE + + return TRUE + // Misc /datum/job/assistant no_dresscode = TRUE @@ -66,55 +81,61 @@ /datum/job/security_officer banned_quirks = list(SEC_RESTRICTED_QUIRKS) banned_augments = list(SEC_RESTRICTED_AUGMENTS) + is_hand_required = TRUE /datum/job/detective banned_quirks = list(SEC_RESTRICTED_QUIRKS) banned_augments = list(SEC_RESTRICTED_AUGMENTS) + is_hand_required = TRUE /datum/job/warden banned_quirks = list(SEC_RESTRICTED_QUIRKS) banned_augments = list(SEC_RESTRICTED_AUGMENTS) + is_hand_required = TRUE /datum/job/blueshield banned_quirks = list(SEC_RESTRICTED_QUIRKS) banned_augments = list(SEC_RESTRICTED_AUGMENTS) + is_hand_required = TRUE /datum/job/corrections_officer banned_quirks = list(SEC_RESTRICTED_QUIRKS) banned_augments = list(SEC_RESTRICTED_AUGMENTS) + is_hand_required = TRUE // Command /datum/job/captain banned_quirks = list(HEAD_RESTRICTED_QUIRKS) - banned_augments = list(HEAD_RESTRICTED_AUGMENTS) + is_hand_required = TRUE /datum/job/nanotrasen_consultant banned_quirks = list(HEAD_RESTRICTED_QUIRKS) - banned_augments = list(HEAD_RESTRICTED_AUGMENTS) + is_hand_required = TRUE /datum/job/head_of_security banned_quirks = list(SEC_RESTRICTED_QUIRKS, HEAD_RESTRICTED_QUIRKS) banned_augments = list(SEC_RESTRICTED_AUGMENTS) + is_hand_required = TRUE /datum/job/chief_medical_officer banned_quirks = list(HEAD_RESTRICTED_QUIRKS) - banned_augments = list(HEAD_RESTRICTED_AUGMENTS) + is_hand_required = TRUE /datum/job/chief_engineer banned_quirks = list(HEAD_RESTRICTED_QUIRKS, "Paraplegic" = TRUE) - banned_augments = list(HEAD_RESTRICTED_AUGMENTS) + is_hand_required = TRUE /datum/job/research_director banned_quirks = list(HEAD_RESTRICTED_QUIRKS) - banned_augments = list(HEAD_RESTRICTED_AUGMENTS) + is_hand_required = TRUE /datum/job/head_of_personnel banned_quirks = list(HEAD_RESTRICTED_QUIRKS) - banned_augments = list(HEAD_RESTRICTED_AUGMENTS) + is_hand_required = TRUE /datum/job/quartermaster banned_quirks = list(HEAD_RESTRICTED_QUIRKS) - banned_augments = list(HEAD_RESTRICTED_AUGMENTS) + is_hand_required = TRUE //Silicon /datum/job/ai @@ -239,16 +260,16 @@ // Nanotrasen Fleet /datum/job/fleetmaster banned_quirks = list(HEAD_RESTRICTED_QUIRKS) - banned_augments = list(HEAD_RESTRICTED_AUGMENTS) + is_hand_required = TRUE /datum/job/operations_inspector banned_quirks = list(HEAD_RESTRICTED_QUIRKS) - banned_augments = list(HEAD_RESTRICTED_AUGMENTS) + is_hand_required = TRUE /datum/job/deck_crew banned_quirks = list(HEAD_RESTRICTED_QUIRKS) - banned_augments = list(HEAD_RESTRICTED_AUGMENTS) + is_hand_required = TRUE /datum/job/bridge_officer banned_quirks = list(HEAD_RESTRICTED_QUIRKS) - banned_augments = list(HEAD_RESTRICTED_AUGMENTS) + is_hand_required = TRUE