From 3ac40451e19918f7faf441a0efcce14ce39d3637 Mon Sep 17 00:00:00 2001 From: Matt Atlas Date: Sun, 6 Oct 2019 20:47:04 +0200 Subject: [PATCH] Mechanically enforces minimum age requirements for jobs (#7106) Pretty much a port of Baystation12/Baystation12#27197 --- code/__defines/species_languages.dm | 1 + code/controllers/subsystems/job.dm | 6 +++ code/game/jobs/job/captain.dm | 4 ++ code/game/jobs/job/civilian.dm | 21 ++++++++++ code/game/jobs/job/engineering.dm | 8 ++++ code/game/jobs/job/medical.dm | 15 +++++++ code/game/jobs/job/outsider/representative.dm | 3 ++ code/game/jobs/job/science.dm | 12 ++++++ code/game/jobs/job/security.dm | 16 +++++++- .../preference_setup/occupation/occupation.dm | 5 +++ .../mob/abstract/new_player/new_player.dm | 5 +++ .../human/species/station/diona/diona.dm | 2 +- .../carbon/human/species/station/ipc/ipc.dm | 2 +- .../human/species/station/vaurca/vaurca.dm | 2 +- html/changelogs/mattatlas-autobots.yml | 41 +++++++++++++++++++ 15 files changed, 139 insertions(+), 4 deletions(-) create mode 100644 html/changelogs/mattatlas-autobots.yml diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm index e7805a286a2..dac3613318e 100644 --- a/code/__defines/species_languages.dm +++ b/code/__defines/species_languages.dm @@ -19,6 +19,7 @@ #define IS_WHITELISTED 0x1 // Must be whitelisted to play. #define CAN_JOIN 0x2 // Species is selectable in chargen. #define IS_RESTRICTED 0x4 // Is not a core/normally playable species. (castes, mutantraces) +#define NO_AGE_MINIMUM 0x8 // Doesn't respect minimum job age requirements. // Species appearance flags #define HAS_SKIN_TONE 0x1 // Skin tone selectable in chargen. (0-255) diff --git a/code/controllers/subsystems/job.dm b/code/controllers/subsystems/job.dm index cd4aefb7681..e03c0da2f79 100644 --- a/code/controllers/subsystems/job.dm +++ b/code/controllers/subsystems/job.dm @@ -102,6 +102,12 @@ if(jobban_isbanned(player, rank)) return FALSE + var/character_age = player.client.prefs.age + var/datum/species/species = global.all_species[player.client.prefs.species] + if((character_age < job.minimum_character_age) && !(species.spawn_flags & NO_AGE_MINIMUM)) + to_chat(player, "Your character is too young!") + return FALSE + var/position_limit = job.total_positions if(!latejoin) position_limit = job.spawn_positions diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index 78f681e07af..11d96461966 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -16,6 +16,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) minimal_player_age = 14 economic_modifier = 20 + minimum_character_age = 35 + ideal_character_age = 70 // Old geezer captains ftw outfit = /datum/outfit/job/captain @@ -76,6 +78,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) economic_modifier = 10 ideal_character_age = 50 + minimum_character_age = 30 + outfit = /datum/outfit/job/hop access = list(access_sec_doors, access_medical, access_engine, access_change_ids, access_eva, access_heads, diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index 941b5de55db..3c689644572 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -9,6 +9,9 @@ spawn_positions = 1 supervisors = "the head of personnel" selection_color = "#C0C0C0" + + minimum_character_age = 18 + access = list(access_hydroponics, access_bar, access_kitchen) minimal_access = list(access_bar) alt_titles = list("Barista") @@ -34,6 +37,9 @@ spawn_positions = 2 supervisors = "the head of personnel" selection_color = "#C0C0C0" + + minimum_character_age = 18 + access = list(access_hydroponics, access_bar, access_kitchen) minimal_access = list(access_kitchen) alt_titles = list("Cook") @@ -64,6 +70,9 @@ spawn_positions = 1 supervisors = "the head of personnel" selection_color = "#C0C0C0" + + minimum_character_age = 18 + access = list(access_hydroponics, access_bar, access_kitchen) minimal_access = list(access_hydroponics) alt_titles = list("Hydroponicist") @@ -107,6 +116,9 @@ supervisors = "the head of personnel" selection_color = "#C0C0C0" economic_modifier = 5 + + minimum_character_age = 22 + access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station) minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station) @@ -136,6 +148,9 @@ spawn_positions = 3 supervisors = "the quartermaster and the head of personnel" selection_color = "#C0C0C0" + + minimum_character_age = 18 + access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station) minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting) outfit = /datum/outfit/job/cargo_tech @@ -161,6 +176,9 @@ supervisors = "the quartermaster and the head of personnel" selection_color = "#C0C0C0" economic_modifier = 5 + + minimum_character_age = 18 + access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station) minimal_access = list(access_mining, access_mining_station, access_mailsorting) outfit = /datum/outfit/job/mining @@ -219,6 +237,9 @@ spawn_positions = 1 supervisors = "the head of personnel" selection_color = "#C0C0C0" + + minimum_character_age = 20 + access = list(access_journalist, access_maint_tunnels) minimal_access = list(access_journalist, access_maint_tunnels) alt_titles = list("Freelance Journalist") diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index dfa0afb81e7..4d4cf69bf14 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -11,6 +11,8 @@ selection_color = "#FFD737" economic_modifier = 10 + minimum_character_age = 30 + ideal_character_age = 50 @@ -62,6 +64,9 @@ supervisors = "the chief engineer" selection_color = "#FFEA95" economic_modifier = 5 + + minimum_character_age = 25 + access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics) minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction) alt_titles = list("Maintenance Technician","Engine Technician","Electrician") @@ -95,6 +100,9 @@ supervisors = "the chief engineer" selection_color = "#FFEA95" economic_modifier = 5 + + minimum_character_age = 25 + access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_external_airlocks) minimal_access = list(access_eva, access_engine, access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction, access_external_airlocks) outfit = /datum/outfit/job/atmos diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 95765590f96..2253402debb 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -10,6 +10,9 @@ supervisors = "the captain" selection_color = "#FF56B4" economic_modifier = 10 + + minimum_character_age = 35 + access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads, access_pharmacy, access_virology, access_cmo, access_surgery, access_RC_announce, access_engine, access_construction, access_keycard_auth, access_sec_doors, access_psychiatrist, access_eva, access_external_airlocks, access_research, @@ -52,6 +55,9 @@ supervisors = "the chief medical officer" selection_color = "#FF97D1" economic_modifier = 7 + + minimum_character_age = 30 + access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_pharmacy, access_virology, access_genetics, access_eva) minimal_access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_genetics, access_eva) alt_titles = list("Surgeon","Emergency Physician","Nurse") @@ -115,6 +121,9 @@ supervisors = "the chief medical officer" selection_color = "#FF97D1" economic_modifier = 5 + + minimum_character_age = 26 + access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_pharmacy, access_virology, access_genetics) minimal_access = list(access_medical, access_medical_equip, access_pharmacy, access_virology) alt_titles = list("Biochemist") @@ -159,6 +168,9 @@ total_positions = 1 spawn_positions = 1 economic_modifier = 5 + + minimum_character_age = 30 + supervisors = "the chief medical officer" selection_color = "#FF97D1" access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_pharmacy, access_virology, access_genetics, access_psychiatrist) @@ -196,6 +208,9 @@ supervisors = "the chief medical officer" selection_color = "#FF97D1" economic_modifier = 4 + + minimum_character_age = 24 + access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_pharmacy, access_virology, access_eva, access_maint_tunnels, access_external_airlocks, access_psychiatrist, access_paramedic) minimal_access = list(access_medical, access_medical_equip, access_morgue, access_eva, access_maint_tunnels, access_external_airlocks, access_paramedic) alt_titles = list("Emergency Medical Technician") diff --git a/code/game/jobs/job/outsider/representative.dm b/code/game/jobs/job/outsider/representative.dm index 5d703192687..38df22e8dee 100644 --- a/code/game/jobs/job/outsider/representative.dm +++ b/code/game/jobs/job/outsider/representative.dm @@ -10,6 +10,9 @@ selection_color = "#C0C0C0" economic_modifier = 7 latejoin_at_spawnpoints = TRUE + + minimum_character_age = 25 + access = list(access_lawyer, access_maint_tunnels) minimal_access = list(access_lawyer) outfit = /datum/outfit/job/representative diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index a026e241a61..f5e64e6be02 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -10,6 +10,9 @@ supervisors = "the captain" selection_color = "#FF40FF" economic_modifier = 15 + + minimum_character_age = 30 + access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, access_eva, access_external_airlocks, access_tox_storage, access_teleporter, access_sec_doors, access_medical, access_engine, access_construction, access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage, @@ -51,6 +54,9 @@ supervisors = "the research director" selection_color = "#FFAAFF" economic_modifier = 7 + + minimum_character_age = 25 + access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch) minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch) alt_titles = list("Xenoarcheologist", "Anomalist", "Phoron Researcher") @@ -84,6 +90,9 @@ supervisors = "the research director" selection_color = "#FFAAFF" economic_modifier = 7 + + minimum_character_age = 25 + access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_hydroponics) minimal_access = list(access_research, access_xenobiology, access_hydroponics, access_tox_storage) alt_titles = list("Xenobotanist") @@ -107,6 +116,9 @@ supervisors = "research director" selection_color = "#FFAAFF" economic_modifier = 5 + + minimum_character_age = 25 + access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access. minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access. alt_titles = list("Biomechanical Engineer","Mechatronic Engineer") diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 291e60fb85a..a896e8c4c99 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -10,6 +10,9 @@ supervisors = "the captain" selection_color = "#FF6363" economic_modifier = 10 + + minimum_character_age = 30 + access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, @@ -68,6 +71,9 @@ supervisors = "the head of security" selection_color = "#FFA4A4" economic_modifier = 5 + + minimum_character_age = 25 + access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_morgue, access_external_airlocks, access_weapons) minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_external_airlocks, access_weapons) minimal_player_age = 7 @@ -114,6 +120,9 @@ supervisors = "the head of security" selection_color = "#FFA4A4" economic_modifier = 5 + + minimum_character_age = 25 + access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_detective, access_weapons) minimal_access = list(access_security, access_sec_doors, access_morgue, access_maint_tunnels, access_detective, access_weapons) minimal_player_age = 7 @@ -152,6 +161,9 @@ supervisors = "the head of security" selection_color = "#FFA4A4" economic_modifier = 5 + + minimum_character_age = 25 + access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_weapons) minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_weapons) alt_titles = list("Crime Scene Investigator") @@ -198,8 +210,10 @@ spawn_positions = 4 supervisors = "the head of security" selection_color = "#FFA4A4" -// alt_titles = list("Junior Officer") //aurora already has security cadets economic_modifier = 4 + + minimum_character_age = 18 + access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_morgue, access_external_airlocks, access_weapons) minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_external_airlocks, access_weapons) minimal_player_age = 7 diff --git a/code/modules/client/preference_setup/occupation/occupation.dm b/code/modules/client/preference_setup/occupation/occupation.dm index a77c3821470..c854ad618a6 100644 --- a/code/modules/client/preference_setup/occupation/occupation.dm +++ b/code/modules/client/preference_setup/occupation/occupation.dm @@ -172,6 +172,8 @@ var/rank = job.title lastJob = job var/ban_reason = jobban_isbanned(user, rank) + var/character_age = user.client.prefs.age + var/datum/species/species = global.all_species[user.client.prefs.species] if(ban_reason == "WHITELISTED") dat += "[rank] \[WHITELISTED]" continue @@ -182,6 +184,9 @@ else if (ban_reason) dat += "[rank] \[BANNED]" continue + else if((character_age < job.minimum_character_age) && !(species.spawn_flags & NO_AGE_MINIMUM)) + dat += "[rank] \[MINIMUM AGE: [job.minimum_character_age]]" + continue if((pref.job_civilian_low & ASSISTANT) && (rank != "Assistant")) dat += "[rank]" continue diff --git a/code/modules/mob/abstract/new_player/new_player.dm b/code/modules/mob/abstract/new_player/new_player.dm index 87f164b6009..fcfaa399ba5 100644 --- a/code/modules/mob/abstract/new_player/new_player.dm +++ b/code/modules/mob/abstract/new_player/new_player.dm @@ -283,6 +283,11 @@ INITIALIZE_IMMEDIATE(/mob/abstract/new_player) if (!(job.type in faction.allowed_role_types)) return FALSE + var/character_age = client.prefs.age + var/datum/species/species = global.all_species[client.prefs.species] + if((character_age < job.minimum_character_age) && !(species.spawn_flags & NO_AGE_MINIMUM)) + return FALSE + return TRUE diff --git a/code/modules/mob/living/carbon/human/species/station/diona/diona.dm b/code/modules/mob/living/carbon/human/species/station/diona/diona.dm index 6e1e2e823b2..b99be9ae5c4 100644 --- a/code/modules/mob/living/carbon/human/species/station/diona/diona.dm +++ b/code/modules/mob/living/carbon/human/species/station/diona/diona.dm @@ -77,7 +77,7 @@ flags = NO_BREATHE | NO_SCAN | IS_PLANT | NO_BLOOD | NO_PAIN | NO_SLIP | NO_CHUBBY appearance_flags = 0 - spawn_flags = CAN_JOIN | IS_WHITELISTED + spawn_flags = CAN_JOIN | IS_WHITELISTED | NO_AGE_MINIMUM blood_color = "#97dd7c" flesh_color = "#907E4A" diff --git a/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm b/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm index 2f4430a028b..1f2270ba4fd 100644 --- a/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm +++ b/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm @@ -67,7 +67,7 @@ flags = IS_IPC appearance_flags = HAS_SKIN_COLOR | HAS_HAIR_COLOR - spawn_flags = CAN_JOIN | IS_WHITELISTED + spawn_flags = CAN_JOIN | IS_WHITELISTED | NO_AGE_MINIMUM blood_color = "#1F181F" flesh_color = "#575757" diff --git a/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca.dm b/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca.dm index de176d1a110..0c3cd67ac91 100644 --- a/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca.dm +++ b/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca.dm @@ -58,7 +58,7 @@ heat_level_2 = 380 //Default 400 heat_level_3 = 600 //Default 1000 flags = NO_SLIP | NO_CHUBBY - spawn_flags = CAN_JOIN | IS_WHITELISTED + spawn_flags = CAN_JOIN | IS_WHITELISTED | NO_AGE_MINIMUM appearance_flags = HAS_SKIN_COLOR | HAS_HAIR_COLOR blood_color = "#E6E600" // dark yellow flesh_color = "#E6E600" diff --git a/html/changelogs/mattatlas-autobots.yml b/html/changelogs/mattatlas-autobots.yml new file mode 100644 index 00000000000..6f87f9772b0 --- /dev/null +++ b/html/changelogs/mattatlas-autobots.yml @@ -0,0 +1,41 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +# balance +# admin +# backend +# security +# refactor +################################# + +# Your name. +author: MattAtlas + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "You can no longer select jobs that your character is too young for." \ No newline at end of file