From a68bff2ce606ebea22d96824bbb63bf6c2039a60 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 6 Oct 2021 20:43:14 +0200 Subject: [PATCH] [MIRROR] RPG titles wizard event [MDB IGNORE] (#8636) * RPG titles wizard event (#61579) * cool 37 files changed- and not a maintainer in sight! * works for simplemobs too * misused proc * FIXED * WOOOOOOORKS * better zombie name * work smarter * card dmi udpate * RPG titles wizard event Co-authored-by: tralezab <40974010+tralezab@users.noreply.github.com> --- code/__DEFINES/dcs/signals.dm | 2 + code/modules/events/rpgtitles.dm | 116 ++++++++++++++++++ code/modules/jobs/job_types/_job.dm | 3 + code/modules/jobs/job_types/assistant.dm | 2 +- .../jobs/job_types/atmospheric_technician.dm | 2 +- code/modules/jobs/job_types/bartender.dm | 2 +- code/modules/jobs/job_types/botanist.dm | 2 +- code/modules/jobs/job_types/captain.dm | 1 + .../jobs/job_types/cargo_technician.dm | 2 +- code/modules/jobs/job_types/chaplain.dm | 2 +- code/modules/jobs/job_types/chemist.dm | 2 +- code/modules/jobs/job_types/chief_engineer.dm | 2 +- .../jobs/job_types/chief_medical_officer.dm | 2 +- code/modules/jobs/job_types/clown.dm | 2 +- code/modules/jobs/job_types/cook.dm | 2 +- code/modules/jobs/job_types/curator.dm | 2 +- code/modules/jobs/job_types/detective.dm | 2 +- code/modules/jobs/job_types/geneticist.dm | 2 +- .../jobs/job_types/head_of_personnel.dm | 2 +- .../jobs/job_types/head_of_security.dm | 2 +- code/modules/jobs/job_types/janitor.dm | 2 +- code/modules/jobs/job_types/lawyer.dm | 2 +- code/modules/jobs/job_types/medical_doctor.dm | 2 +- code/modules/jobs/job_types/mime.dm | 2 +- code/modules/jobs/job_types/paramedic.dm | 2 +- code/modules/jobs/job_types/prisoner.dm | 2 +- code/modules/jobs/job_types/psychologist.dm | 2 +- code/modules/jobs/job_types/quartermaster.dm | 2 +- .../jobs/job_types/research_director.dm | 2 +- code/modules/jobs/job_types/roboticist.dm | 2 +- code/modules/jobs/job_types/scientist.dm | 2 +- .../jobs/job_types/security_officer.dm | 2 +- code/modules/jobs/job_types/shaft_miner.dm | 2 +- .../jobs/job_types/station_engineer.dm | 2 +- code/modules/jobs/job_types/unassigned.dm | 1 + code/modules/jobs/job_types/virologist.dm | 2 +- code/modules/jobs/job_types/warden.dm | 2 +- code/modules/mob/login.dm | 2 + icons/obj/card.dmi | Bin 15221 -> 18326 bytes tgstation.dme | 1 + 40 files changed, 158 insertions(+), 32 deletions(-) create mode 100644 code/modules/events/rpgtitles.dm diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 3ce2ab60991..3bf5fa341d7 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -53,6 +53,8 @@ #define COMSIG_ALARM_FIRE(alarm_type) "!alarm_fire [alarm_type]" /// An alarm of some form was cleared (datum/alarm_handler/source, alarm_type, area/source_area) #define COMSIG_ALARM_CLEAR(alarm_type) "!alarm_clear [alarm_type]" +///global mob logged in signal! (/mob/added_player) +#define COMSIG_GLOB_MOB_LOGGED_IN "!mob_logged_in" /// signals from globally accessible objects diff --git a/code/modules/events/rpgtitles.dm b/code/modules/events/rpgtitles.dm new file mode 100644 index 00000000000..edde7b87bc0 --- /dev/null +++ b/code/modules/events/rpgtitles.dm @@ -0,0 +1,116 @@ +/datum/round_event_control/wizard/rpgtitles //its time to adventure on boys + name = "RPG Titles" + weight = 3 + typepath = /datum/round_event/wizard/rpgtitles + max_occurrences = 1 + earliest_start = 0 MINUTES + +/datum/round_event/wizard/rpgtitles/start() + GLOB.rpgtitle_controller = new /datum/rpgtitle_controller + +///Holds the global datum for rpgtitle, so anywhere may check for its existence (it signals into whatever it needs to modify, so it shouldn't require fetching) +GLOBAL_DATUM(rpgtitle_controller, /datum/rpgtitle_controller) + +/datum/rpgtitle_controller + +/datum/rpgtitle_controller/New() + . = ..() + RegisterSignal(SSdcs, COMSIG_GLOB_CREWMEMBER_JOINED, .proc/on_crewmember_join) + RegisterSignal(SSdcs, COMSIG_GLOB_MOB_LOGGED_IN, .proc/on_mob_login) + handle_current_jobs() + +/datum/rpgtitle_controller/Destroy(force) + UnregisterSignal(SSdcs, list(COMSIG_GLOB_CREWMEMBER_JOINED, COMSIG_GLOB_MOB_LOGGED_IN)) + . = ..() + +///signal sent by a player list expanding +/datum/rpgtitle_controller/proc/on_mob_login(datum/source, mob/new_login) + SIGNAL_HANDLER + if(isliving(new_login)) + var/mob/living/living_login = new_login + if(living_login.stat != DEAD && !living_login.maptext) + on_crewmember_join(source, living_login, living_login.mind.assigned_role.title) + +///signal sent by a crewmember joining +/datum/rpgtitle_controller/proc/on_crewmember_join(datum/source, mob/living/new_crewmember, rank) + SIGNAL_HANDLER + + var/datum/job/job = SSjob.GetJob(rank) + + //we must prepare for the mother of all strings + new_crewmember.maptext_height = 32 + new_crewmember.maptext_width = 80 + new_crewmember.maptext_x = -24 + new_crewmember.maptext_y = 32 + + //list of lists involving strings related to a biotype flag, their position in the list equal to the position they were defined as bitflags. + //the first list entry is an adjective, the second is a noun. if null, we don't want to describe this biotype, and so even if the mob + //has that biotype, the null is skipped + var/list/biotype_titles = list( + null, //organic is too common to be a descriptor + null, //mineral is only used with carbons + list("Mechanical", "Robot"), + list("Reanimated", "Undead"), + list("Bipedal", "Humanoid"), + list("Insectile", "Bug"), + list("Beastly", "Beast"), + list("Monstrous", "Megafauna"), + list("Reptilian", "Lizard"), + list("Paranormal", "Spirit"), + list("Flowering", "Plant"), + ) + + var/maptext_title = "" + + if(!(isanimal(new_crewmember) || isbasicmob(new_crewmember))) + maptext_title = job.rpg_title || job.title + else + //this following code can only be described as bitflag black magic. ye be warned. i tried to comment excessively to explain what the fuck is happening + var/list/applicable_biotypes = list() + for(var/biotype_flag_position in 0 to 10) + var/biotype_flag = (1 << biotype_flag_position) + if(new_crewmember.mob_biotypes & biotype_flag)//they have this flag + if(biotype_titles[biotype_flag_position+1]) //if there is a fitting verbage for this biotype... + applicable_biotypes += list(biotype_titles[biotype_flag_position+1])//...add it to the list of applicable biotypes + if(!applicable_biotypes.len) //there will never be an adjective anomaly because anomaly is only added when there are no choices + applicable_biotypes += list(null, "Anomaly") + + //shuffle it to allow for some cool combinations of adjectives and nouns + applicable_biotypes = shuffle(applicable_biotypes) + + //okay, out of the black magic area we now have a list of things to describe our mob, yay!!! + for(var/iteration in 1 to applicable_biotypes.len) + if(iteration == applicable_biotypes.len) //last descriptor to add, make it the noun + maptext_title += applicable_biotypes[iteration][2] + break + //there are more descriptors, make it an adjective + maptext_title += "[applicable_biotypes[iteration][1]] " + + //mother of all strings... + new_crewmember.maptext = "Level [rand(1, 100)] [maptext_title]" + + if(!(job.job_flags & JOB_CREW_MEMBER)) + return + + var/obj/item/card/id/card = new_crewmember.get_idcard() + if(!card)//since this is called on current crew, some may not have IDs. shame on them for missing out! + return + card.name = "adventuring license" + card.desc = "A written license from the adventuring guild. You're good to go!" + card.icon_state = "card_rpg" + card.assignment = job.rpg_title + if(istype(card, /obj/item/card/id/advanced)) + var/obj/item/card/id/advanced/advanced_card = card + advanced_card.assigned_icon_state = "rpg_assigned" + card.update_label() + card.update_icon() + +/** + * ### handle_current_jobs + * + * Calls on_crewmember_join on every crewmember + * If the item it is giving fantasy to is a storage item, there's a chance it'll drop in an item fortification scroll. neat! + */ +/datum/rpgtitle_controller/proc/handle_current_jobs() + for(var/mob/living/player as anything in GLOB.alive_player_list) + on_crewmember_join(SSdcs, player, player.mind?.assigned_role.title) diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 34a65c52513..c1ddf2552fa 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -102,6 +102,9 @@ /// String. If set to a non-empty one, it will be the key for the policy text value to show this role on spawn. var/policy_index = "" + ///RPG job names, for the memes + var/rpg_title + /datum/job/New() . = ..() diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm index 1e6757ec836..505f4f5b8e7 100644 --- a/code/modules/jobs/job_types/assistant.dm +++ b/code/modules/jobs/job_types/assistant.dm @@ -30,7 +30,7 @@ Assistant ) job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS - + rpg_title = "Lout" /datum/outfit/job/assistant name = "Assistant" diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index 1f76660223a..483df58feb5 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -27,7 +27,7 @@ family_heirlooms = list(/obj/item/lighter, /obj/item/lighter/greyscale, /obj/item/storage/box/matches) job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS - + rpg_title = "Aeromancer" /datum/outfit/job/atmos name = "Atmospheric Technician" diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm index f2bda2fcf94..4f7bb96e051 100644 --- a/code/modules/jobs/job_types/bartender.dm +++ b/code/modules/jobs/job_types/bartender.dm @@ -29,7 +29,7 @@ ) job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS - + rpg_title = "Tavernkeeper" /datum/job/bartender/award_service(client/winner, award) winner.give_award(award, winner.mob) diff --git a/code/modules/jobs/job_types/botanist.dm b/code/modules/jobs/job_types/botanist.dm index b36fef01d97..c7d4ff730a6 100644 --- a/code/modules/jobs/job_types/botanist.dm +++ b/code/modules/jobs/job_types/botanist.dm @@ -31,7 +31,7 @@ ) job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS - + rpg_title = "Gardener" /datum/outfit/job/botanist name = "Botanist" diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index 5f0566d05fd..493940a7e34 100755 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -36,6 +36,7 @@ ) job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS + rpg_title = "Star Duke" voice_of_god_power = 1.4 //Command staff has authority diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm index a86c19c9b68..6c9233ffc7a 100644 --- a/code/modules/jobs/job_types/cargo_technician.dm +++ b/code/modules/jobs/job_types/cargo_technician.dm @@ -29,7 +29,7 @@ /obj/item/stack/sheet/mineral/diamond = 3, /obj/item/gun/ballistic/rifle/boltaction = 1 ) - + rpg_title = "Merchantman" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS diff --git a/code/modules/jobs/job_types/chaplain.dm b/code/modules/jobs/job_types/chaplain.dm index ef4053654d0..9129b63102f 100644 --- a/code/modules/jobs/job_types/chaplain.dm +++ b/code/modules/jobs/job_types/chaplain.dm @@ -28,7 +28,7 @@ /obj/item/toy/plush/narplush = 2, /obj/item/toy/plush/ratplush = 1 ) - + rpg_title = "Paladin" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS voice_of_god_power = 2 //Chaplains are very good at speaking with the voice of god diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm index 86faed53073..b697ed37812 100644 --- a/code/modules/jobs/job_types/chemist.dm +++ b/code/modules/jobs/job_types/chemist.dm @@ -32,7 +32,7 @@ /obj/item/reagent_containers/glass/bottle/leadacetate = 5, /obj/item/paper/secretrecipe = 1 ) - + rpg_title = "Alchemist" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index 6f9356caba1..1b984e50dfb 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -40,7 +40,7 @@ /obj/item/stack/sheet/mineral/gold = 15, /obj/effect/spawner/random/engineering/tool_advanced = 3 ) - + rpg_title = "Head Crystallomancer" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS voice_of_god_power = 1.4 //Command staff has authority diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index 178b8be5116..32fcc2425f5 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -37,7 +37,7 @@ /obj/effect/spawner/random/medical/surgery_tool_alien = 1 ) family_heirlooms = list(/obj/item/storage/firstaid/ancient/heirloom) - + rpg_title = "High Cleric" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS voice_of_god_power = 1.4 //Command staff has authority diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm index 4a60c1e87c7..0999d4747e4 100644 --- a/code/modules/jobs/job_types/clown.dm +++ b/code/modules/jobs/job_types/clown.dm @@ -30,7 +30,7 @@ ) family_heirlooms = list(/obj/item/bikehorn/golden) - + rpg_title = "Jester" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS veteran_only = TRUE // SKYRAT EDIT ADDITION diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm index 19c0390a4ad..ed5d6df9341 100644 --- a/code/modules/jobs/job_types/cook.dm +++ b/code/modules/jobs/job_types/cook.dm @@ -26,7 +26,7 @@ ) family_heirlooms = list(/obj/item/reagent_containers/food/condiment/saltshaker, /obj/item/kitchen/rollingpin, /obj/item/clothing/head/chefhat) - + rpg_title = "Tavern Chef" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS diff --git a/code/modules/jobs/job_types/curator.dm b/code/modules/jobs/job_types/curator.dm index 518a0622ea8..9f0905040fe 100644 --- a/code/modules/jobs/job_types/curator.dm +++ b/code/modules/jobs/job_types/curator.dm @@ -24,7 +24,7 @@ job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS voice_of_god_silence_power = 3 - + rpg_title = "Veteran Adventurer" /datum/outfit/job/curator name = "Curator" diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm index 33ca15237de..93041d0288c 100644 --- a/code/modules/jobs/job_types/detective.dm +++ b/code/modules/jobs/job_types/detective.dm @@ -38,7 +38,7 @@ ) family_heirlooms = list(/obj/item/reagent_containers/food/drinks/bottle/whiskey) - + rpg_title = "Thiefcatcher" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm index 0ba951a53c5..be34419a068 100644 --- a/code/modules/jobs/job_types/geneticist.dm +++ b/code/modules/jobs/job_types/geneticist.dm @@ -27,7 +27,7 @@ ) family_heirlooms = list(/obj/item/clothing/under/shorts/purple) - + rpg_title = "Genemancer" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index dcc50ffa200..63ca34c4e8e 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -37,7 +37,7 @@ ) family_heirlooms = list(/obj/item/reagent_containers/food/drinks/trophy/silver_cup) - + rpg_title = "Guild Questgiver" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS voice_of_god_power = 1.4 //Command staff has authority diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index a0da8912a0f..c956f20eb1e 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -32,7 +32,7 @@ bounty_types = CIV_JOB_SEC family_heirlooms = list(/obj/item/book/manual/wiki/security_space_law) - + rpg_title = "Guard Leader" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS voice_of_god_power = 1.4 //Command staff has authority diff --git a/code/modules/jobs/job_types/janitor.dm b/code/modules/jobs/job_types/janitor.dm index 8873c8df79d..a6195b05316 100644 --- a/code/modules/jobs/job_types/janitor.dm +++ b/code/modules/jobs/job_types/janitor.dm @@ -26,7 +26,7 @@ /obj/item/storage/box/lights/mixed = 20, /obj/item/lightreplacer = 10 ) - + rpg_title = "Groundskeeper" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm index 5014773fa36..346908dfe68 100644 --- a/code/modules/jobs/job_types/lawyer.dm +++ b/code/modules/jobs/job_types/lawyer.dm @@ -21,7 +21,7 @@ departments_list = list( /datum/job_department/service, ) - + rpg_title = "Magistrate" family_heirlooms = list(/obj/item/gavelhammer, /obj/item/book/manual/wiki/security_space_law) job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm index 02ccb063b6e..4a9048a7608 100644 --- a/code/modules/jobs/job_types/medical_doctor.dm +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -33,7 +33,7 @@ /obj/effect/spawner/random/medical/organs = 5, /obj/effect/spawner/random/medical/memeorgans = 1 ) - + rpg_title = "Cleric" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm index 3ead86904e9..d7cba73b8f3 100644 --- a/code/modules/jobs/job_types/mime.dm +++ b/code/modules/jobs/job_types/mime.dm @@ -27,7 +27,7 @@ /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing = 10, /obj/item/book/mimery = 1, ) - + rpg_title = "Fool" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS voice_of_god_power = 0.5 //Why are you speaking diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm index d57743e445f..3067b5a1fcf 100644 --- a/code/modules/jobs/job_types/paramedic.dm +++ b/code/modules/jobs/job_types/paramedic.dm @@ -32,7 +32,7 @@ /obj/item/reagent_containers/hypospray/medipen/penacid = 10, /obj/item/reagent_containers/hypospray/medipen/survival/luxury = 5 ) - + rpg_title = "Corpse Runner" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS diff --git a/code/modules/jobs/job_types/prisoner.dm b/code/modules/jobs/job_types/prisoner.dm index a299f106307..1457647576d 100644 --- a/code/modules/jobs/job_types/prisoner.dm +++ b/code/modules/jobs/job_types/prisoner.dm @@ -20,7 +20,7 @@ ) family_heirlooms = list(/obj/item/pen/blue) - + rpg_title = "Defeated Miniboss" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_ASSIGN_QUIRKS diff --git a/code/modules/jobs/job_types/psychologist.dm b/code/modules/jobs/job_types/psychologist.dm index 6e1136c453a..ce198a83d23 100644 --- a/code/modules/jobs/job_types/psychologist.dm +++ b/code/modules/jobs/job_types/psychologist.dm @@ -28,7 +28,7 @@ /obj/item/storage/pill_bottle/happy = 5, /obj/item/gun/syringe = 1 ) - + rpg_title = "Snake Oil Salesman" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index f48069f0459..5cc83d416de 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -30,7 +30,7 @@ mail_goodies = list( /obj/item/circuitboard/machine/emitter = 3 ) - + rpg_title = "Steward" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index 89113076336..7a08bce1584 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -37,7 +37,7 @@ ) family_heirlooms = list(/obj/item/toy/plush/slimeplushie) - + rpg_title = "Archmagister" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS voice_of_god_power = 1.4 //Command staff has authority diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm index 2d030e009bd..7007b6f4fcd 100644 --- a/code/modules/jobs/job_types/roboticist.dm +++ b/code/modules/jobs/job_types/roboticist.dm @@ -29,7 +29,7 @@ ) family_heirlooms = list(/obj/item/toy/plush/pkplush) - + rpg_title = "Necromancer" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm index b4437115d1b..a2841468730 100644 --- a/code/modules/jobs/job_types/scientist.dm +++ b/code/modules/jobs/job_types/scientist.dm @@ -29,7 +29,7 @@ /obj/item/disk/tech_disk/spaceloot = 2, /obj/item/camera_bug = 1 ) - + rpg_title = "Thaumaturgist" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index a252d7ab584..0bc23407eec 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -36,7 +36,7 @@ /obj/item/clothing/mask/whistle = 5, /obj/item/melee/baton/security/boomerang/loaded = 1 ) - + rpg_title = "Guard" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index ea3a056eea7..688aee46af6 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -21,7 +21,7 @@ ) family_heirlooms = list(/obj/item/pickaxe/mini, /obj/item/shovel) - + rpg_title = "Adventurer" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm index 65e987e7bd7..95ff95acfcd 100644 --- a/code/modules/jobs/job_types/station_engineer.dm +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -32,7 +32,7 @@ /obj/item/holosign_creator/engineering = 8, /obj/item/clothing/head/hardhat/red/upgraded = 1 ) - + rpg_title = "Crystallomancer" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS diff --git a/code/modules/jobs/job_types/unassigned.dm b/code/modules/jobs/job_types/unassigned.dm index 58288770313..29d9a7bdc4f 100644 --- a/code/modules/jobs/job_types/unassigned.dm +++ b/code/modules/jobs/job_types/unassigned.dm @@ -6,3 +6,4 @@ /datum/job/unassigned title = "Unassigned Crewmember" + rpg_title = "Peasant" diff --git a/code/modules/jobs/job_types/virologist.dm b/code/modules/jobs/job_types/virologist.dm index 047dbef89c2..72ab350c2e0 100644 --- a/code/modules/jobs/job_types/virologist.dm +++ b/code/modules/jobs/job_types/virologist.dm @@ -33,7 +33,7 @@ /obj/item/stack/sheet/mineral/plasma = 10, /obj/item/stack/sheet/mineral/uranium = 5 ) - + rpg_title = "Plague Doctor" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index a127f462b7b..80ac2546f33 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -37,7 +37,7 @@ /obj/item/storage/box/rubbershot = 10, /obj/item/storage/box/lethalshot = 5 ) - + rpg_title = "Jailor" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index dc15ae7f6d7..422493cfdba 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -102,6 +102,8 @@ AddElement(/datum/element/weather_listener, /datum/weather/ash_storm, ZTRAIT_ASHSTORM, GLOB.ash_storm_sounds) + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_MOB_LOGGED_IN, src) + return TRUE diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index ba72f1e8018f8a863c0f981805692cdf43b39e35..41a586800764ee979f9f9a3d69479b0e6f58206a 100644 GIT binary patch literal 18326 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 literal 15221 zcmcJ$2T)Ug*EM?RT@aLBrKw1-(m{$yReA@h(os4j1VjWys`M&IkzNI92}OGEMF_q3 zP9Vt_|IhQ?dFIZ%?|tug=Q0y=&M!G9`{eAs*V=3EMCxd%k`dDr0{}p#_FU-|0AR`g zeGuYfRt979iva+;JV4LLOUdq?&D%E~UT@sp0KhLJGigwZL4mY;c(%}}O|*<~4ai?AFhfJLuu_g+k-DKHd}a6iv4UJf30KT1B*oN<5}$Fw zarGsh7A2M_8Zfl-5T};Jbs5W($>=VxJz$Kswe<{pgk7KR@q%9IQDDvKt2w03@|p!} z%`e%gbt?@C&j$?G4)`zQarFn+L&9>yZ0v0X?DbS>MLd7vV`=7Vu@kMX=n(gD>fXud zrFS2G^_u9Sm+?{RG7&DNzY4oWj09gFSDZuG7D-y+BONX~k&i_^Unir~XA?OO$XTGy0VZxB0!~ahF0;gknw>Q8){ZT9i&ef8>f>kpW# zr}Q>@g?+=sK6={!THMHM?D<5d>EN$2AC%xLO1z=S(!TdfnL2AQyK*0@(@ypX-vkfd z4R+rGvR5}U@TAeh>z_*CVL0Df@RPM*zO}nD9D5-Z!FmuTKKeM2=aY*H&$s)UYl9YXWe?Y_ z_((dN*xDU-kUvfRKY8rcBkfy^-KVB^HR~xQJucA4958>wJ6+D$LUn3P8MJ3qJ4-&E zVlIhy_z3B~v+OKI-&@^0H@hGozCNGtA09HUvNkPvqV?Q%6=$?Mo zZ|ze(dD03X5=Mw6(vZ^=nj^sbgs|wLVhR>hW-6X-*CP=nHF!^6k1up+{(sHmkE z_wL<|eL@?%zK&z3v37R^;!nZBN*N^o>PB_lz)c@sTz)W-w~T7d)|NH*cK6OMelh*y zo%=#L@!I-&2rHqY%FcBQHm(8%SONbzMOdxKQ6OH#=|{B$u17$n-|-5B1@ZLhQ)1xz z_wQG^+7UmZcytY1jmvqON;cnb{zgZT##a9Ru9ooCAsb|nj^8ZWo{_<*iH=icW@DF* zIlAe5gGa||oxZa28jyE#dQ3@0C4+v=a6U}HF73Gzh7ItV)E?O}ElgBk&I?#gCat%3 zcDJ(JMhZ`92v}`C_IM)IKy%fC1dAh$5IlT*Dq321UcGu%+epujy|jq3-mYk9pylM` z3<(RvRsPPRuF?~=c`@%!05qQtNoA$w%p(##?fRBiKg``0UN-?nnwE=KGioG2bxn=U z(6e?fd1$&Uc=ht4`^9(+`oSrek(t?^+Jm)of2y@}8@9XjUsT0FDBE82Ffd7B!;2TL z2}$76eDz9Kx6Yq`=&C9VKA)YCU{iefJ7lPJ?4}KH0Ijn2U*RoS02$u_E}-)X-kD7zi49mdLRmJ` zd_=sFl}boONqJ9v_{x6XG7k^7urFR9 z_j1QG@Fo?D=H5NWZ4!umm<8uQm)qOhJ12W2byvkXNGo4n7-=OC!7LMyl9tVc+?{tb z1mv%e?*Xhjbwra6D9y4baAKfndIhcnTCsEjC6Ah{ka*FN<#1tH%sm4QUtR-F39Q-w zSXNsrl8GA2SJ#~0KWIAqY2rO!>kelgFVGZr$4<{@fd#Txw)3)A)*#)o2$i;DTuVF` ziw-A3hO_{c)72{HFg!fGp25Mg(^kO)oF`P;be~j~6#euNt zGB}_Ax=h9?5`;O`ePDE4&=iJsk?;S`hhn$FNpCaW;Q@|=tN4jGl~-GqwTC+^zdz%s z;FvXfJ;EoYg@oV`taPRbHhSL(@siE|bnSp(;V4c?J$gh0=olH%zUrPnwY9S|77sBV z=jP;8cHXJ^#m43w4YF9ES7YRSl%CZhA3b_hz>Qs4pS{gcKk0}qDlsRr zp$!-atO`2QpW11$3Iz8TR9Vj!c^3Z&yxFf`&GcP-`9M^`A{dQA&On3Z8ohT5CZR{| zB!H79IYah$g(=m|oeh_wFafjlK5a z5^HS{Ttm{?2tm>U?qZ%|zkUrPf+F$^rj`mGS7BA-q#VxQP0cb?u?kPUJ8}N5!&R6XUAQ7j##yxcP@;H-Bzt( zd0iIcjm5S7-M|;MvwUy6<$Qvw;^^hDDZ>gh0;MU~<6k@Y*sD zJ-PEd>>F*^pPT-d=H_4I<)KmxaV7fe86ry?q((ZQr;?TbgSu2kk6}> zR8$n5uz+S+Z&d?7WOLHaM~3dHu$Pu#VRAETEXdg7~ZZ?>cP} zSVilT-+g}=LJZ97aEn9?q0bzKvy}5#$N``{p!UTy!ORccLiv|3XK#*ps z8h#(lUnXT-!chnFpXb5ev*4G;-{*&S8OXOhB6akr)mTy%TA|%6!DiM(I(owc!-Hqs zp-_qTa{BpMv;{33g}kXlT8qfN)b%}C>y3zs>DJYj`QWzD$i~l4{^re_p1!{JjluM| z`1sKE{^Z@Xc7r_0(lffvA!KM8McHVjbw}*_&Sc5QY%qcd7%5uL2O#XK(Mvt~^7{Js zcaR<$ray~cXxe^Z5D!1eGqK+c>k$vBDE4o0sB*Z^AHE(`npnZ{Ypj!x36C<%BVh>ef_{jP*OLL8f$bR=@0 z#v3)ifcpCNt32l0hya^M#ct1QDj0x*MYBI+oV@G}|BK+}a+X!4)s+=&48WQM7f)7m zYh~zQ!qi)>PpzFU=6P^e6rD+5Iwp3r0(Kq&PBhPgf~5QU`vtwWbTqQ0e+?mg`~y!N zdGCLEXgS6_nQTV4-@Pj#Xdh)C0GZ=ZnG*nD;fo9t?Tde~TRvmC0AhdxLySCJoCo8z zH`6J$!*j~Uayf5USZ~_3(nQpHF&RAJuEZ<>hZ90_cC-5^@Mab(Jt2WAm*vM@E)I^F z1Du+4)QcA{fE0#o%WdtjY`M=RCC6)PYpk-e%ou1&k@golIXR&q#g9u$3ZHj}GPPMz ze5U4os|Qs;hD&^Whp5IU)3Gxu_gtO(CK$w|{y8W$x9H>kupBx{#ro{9^~P-=ONL=< z-q5m*EQyboSJ}XTy05Qqq}*I;VOMxq`h9r5enWWK@Wo?MHiIefy(UVRfcq)SVRwO{ zd_Xoa#SF{m9<&}##BPhw%9l%W!{BN=ILUIG|CLFtnP1%XKr->F`8ybin7f>GsXXnPW%!n%H-gA|+Q7Lgwk-7F z!v`ZDYQLgVQlN5=9HQWaY>TT{S`y#!nkj)rHPVJ8JYp3Wr+L8cF^-Fcu7~oe z&_>F_ZwXjM6p~N_h{@NFkjkGtUCc!eD?T67o+l(EytJ^09!wXv8O>Gxo2r3Ruq<~} zMPs8_6PbCAh0DxU3L-IrB|q!7FS%CL+glXHUc-3*{{5@754!;Hh5IL-i5QHW1T3GY zo|bpa-Xd7kQGeyJ@f&~$I}D}lFiUz703zbN0@B{hW<>2MjoW}K0&o;-qb9+Qq z4A#^1aO?u#qo&Sv+&(XI^Lw_tjQz%qx&3-jT9SL!s>JwD$KA=6!Hurb|YLrvzs9oACQbOE+b!b+N` zbFQ#_xH-GWsXZ11dfAI}3kUPCM@<2Aw_?>&?K9gqQkH2@={O5g&&D5*#_H*ZH@~;` z0JC^8SCRR}$96tAef6)mLjCmg^p;jPo3H`5G;c;g#KuJu#eskRsy2I2UsN}k(!m~5 z|L3jx#4gBuqv>bTytSiHg>enOwR^Y~jWD|ei>|x~hFROI(Dq){dsMnM>x{E>Xc2qW z#0>Hy!E!&?$+6A5*mYjLORVbxjCE7!tZtR+{QdXJz5x()kKPx)OVnH3mGZGcoVryY z^%|=VpRn_2zjE)v4toL-wBB+;bxY({3*@aTFDo~8Q z8a}+wN*H=XA|xNm`uziGEGyv~HXIH@MUx(YC^VM(zgSksDQ(?+laI(Ml!5A#DNuyb zq@bu9FuREX6`JIgZvd-POsPeK9n#z^y-Y^5sn==aq#k&A`UxM!Yz1DVh+`%6AEjK{ zOY0s=OiFsad6DTyB5#5wa)h_G@U;JLYX0}xXn zC_K>G+B!n5G32G3NmO{(#y)-K{ej!7!U{VKf0L48u<4F2+wGnYWeU2b8F7xX1j|`9 zcD)~U9Xyu8VdFZ&e7N{};0^ldZBs|tM}{rZBX>)1bc1_(-mb4X01(_^?Ceb_^w3?Q z0E&NQf_}(`%h63No?3noWvTL_0hUz$e4j-6jy>JGS(Wv+uRv7)n?qLDZgXb`RWD+` ztrDi$$0SjR({RGGQghx}5E7zD0$R*C)vrX!| z+_29Z*fKnikEYudr4zn}eKY(ho7qwvtXVx5N6xq%67@n9xlmI~4lKC@XzORFLoAlP zu-Co}x*&o&{YI+%E2tvil{lljR3TfqYjt-Kao`rN*EqM^3OTFp{jpP}bUFs%+0~Hn z`4YXFrgDNsw6k^;c3{d2ZN2>-RW9I`#LxAN8*tL4%?8->-)#;7kY^w7yg7B5BQB)O zp`lHOf!R#4t&a#=SvDN%&G4@{4me(N!ix3Iu@#Z~=bocx0P?(F@4TWt)~s%}*|TUa zFYRS27AukY6p9;xG+u~ptq z{3m=-R6F``@csoKekIlnkl`wg4T9@^9Lw0Zw27B-rtyA&C6v-e*FUf^T!>4n-eZqn zRoPNCg4+^1NFFf;sH>~TB_@8Tt`@3wp4PfV32E|=yUSnN$Va+K&{gHDn^Ug!P%e5WR-mdsWibPt^03R^&p}bnS z2!OHHp_Y0KJ&qW>)3hO`^=^~pz&z7tH@DPiZISj-&~u0dsn5^$&u!)3wGmZ0{30+M zf;+@C%wu3eu_U+7!QQ|lFqg->w_EqEzEC^KEoYX51h_hVHiZilbcmJEs9oXq3_SiL zzvVdd(>2|`xGD=sev*~%wL8@|I{XKUCgjozn3zh&yko|(sHYyCe_@Kwv(oWIWHd0t zV9lpCH+JLGZsD;>Nd?HW{rBWz7}RN0Yl&?G6Fa!1$u=C*Zrpi;BPEU50R98$002W{ z8tux`V56)rzG}!(2NT!Z9zRi)ve-*w>DVcJK1#7ox8RP92_4#*7nKW#&+{j={)1be z4g79rJOTLCu7lgQFbnKMyeFJp0W=_NS zuk<8JKF0eU_cU^~aTOpOPKFxFp;m3!x*&dLFUU3a5+ zr$%H4m%Zf?V!B)yjS7}*M;=1q2yGW>mtyo)Y&6YRa1Yr_Oqzboayxpfb`~eS!bhKm zoBj}8ej7MA=XqbWX>AqOU7ofSibwLbvr`FEoqn9iFDS@uXqeHb3ObIId+2*-|FsG9 z$z@InSA(@$@fiQ?ty-`YN%Su##b#8|_OHgqNo{g(bM&0ILcVbYGwh0gGE}^LY%&}5 z0Ip9pcIMv|{G;sS{9mI=IXE}~z#>}+*O&KCQ3?N}N1l_o%81(li86i{>=-y5i~%Vf zto3q$RY{ztqR9@+2?(i$AXbw+mjL>uiZ$s}^pC1w0 zOYaS9vwKllv#`ET%`tv=rN}8NdLL6|o2=MWSkPKGgl+0$-^=Hf)9CR%#c`sVx#ADu zmzJhZSxyz{Zs{82;0mQH$7ph602YYy>u*AglVU)@TfYf&hm2TKwqX2EWItG!mn-l# zw>k`J-+>RrxFb$BHaVNKy1Qsd)P@}c+)}NKaMt|uvP08PWCRpyxGEkze0Nv&*nbpF zFu^5VgS%nJlEYHa?aVMZtSh{x*}V&vU>PJY(hO+68<2`pvhPk?e$R4Km}gRe-;>rF zgg7nLjy*?5_Q}9za5wrF!a3z@-Y@jyZqW#i?uoW*^!9UkM2YyfXoU^z4NP^bg$?5s zctS+(jFd)qVU0<^NYt{KqqHz8ZkR~OU#H;>jG+FK^&DSYoJj0tV-CLws=UA|9#LIV zk3gvCo}V*CVF5w!KTd?oO#i4*pGdagnVi1Aum7|z_^mnTc+^M)r z>kFo6V(uC5n+@WK@hkl-J8oO)ef%oByJSCDh*nSRF|jNW?uhDb z^0jY=x2(hj_Zy2rHcY#jO19X$IEzd;&DV$!8iXRwT0*vds%gYPOd|a2A&N%c3){-h zA`_Uw8XoQsb;L+lGrY360yuR9*~jP40335ml3?q3ClSjE(iwHoH!Mn&%@l6Z{feKN zoYFO1mB~aS?zYb%g8ujYZigV1ztlCYeo=^iSlH;0oRT6_m+jgRSSC#ZLApM(LVPv< zregcS*Wy<5yp4npsKA_B_CZ~kUftLkR#)gUU3v~pZtEMCoFbM1ZK|BJO&RdHf)KA< z8nTppq(RvtPSBYOFzV0BW`{|Ac@DgIF~BjXpGuYrtNaD>Pm9p=CG;VSgVKc`Az zA>6wcN6MUJ4tHVoFpsc3s@y|#h4g4q^e&l0&ygsUWfNbK$gbV7dc;Esq_V6m6Wbyx zA|3YE3t#$RywK{e7k)K|7ZXvF#fi<|PF>#I1n)~a)WZjE0VixKTsA?$r*|-AK|9HR zTM_(!bjz@q-yF^B*S}6>g12^_k;}>t({a8IO)f0(Lm{EQT3P@r&ROQ>=8z%kc;~^e zcQCrUmpGMmS)5;6^JNlLZt&d#k$B<5%b{K(LNc9#&Csq;R9weL@6+9P;;DR6L0eX) z*|XnlR2iQJ(K1Q;+;c*%PAV60`JJwHe?<_<=;+6jukPM_&hi4G6I#s>lY#Zy8=H2A zV&-Bp=k%u8#)qGT553`-N%x)rr z?xZ*xvkc*Oq-J}jZEp0&Jn|G@{OnGn1+&vlD*3SBKC;Wm$rZf#Sskei2D;)D5<^)@a(gbrZC zN4mAuP_s)x2!U7sq;?UAYqy?+J1j`n@(_RT^vm1;q-9KeCvCE+jO7jTx){2TR3vTq zbuj$?jsuvxym;S@{#>Vg2ABz>U1an35H3$6DcK178>Bm=a@{b2(pV`fVWv>Nihb56`gO!K`lFr%NqOY+wwXvgqE~14eGB)#?`eplS$B%n?&8|{>`yD6io2(jBI2E_l$n_?92Axr{!k^HlPD8YxwetA?j{5qp6BIM0uGir;5m>)EDRCI$6`0 zPlS#CY;a(h2NZ5OKU~{9W%y;pf=UA8Bm@16=I>rAS&DCJ^M^g@=F8ZkvdWzS(exAquN_&}I!!*##qF`ecX%S4j&2<{ah-dDC3Gq%7J~7C+tB^@E9Z2roRzfC zVHP`vhYR5Wu7xUJ0lI;uC_DSpvLWQNbPMFI3ob_8QFEdFsR#`!j{Rc6@YuOVvX&X`j* z+y9Cs`|4`gT62As3|x`8zOnI%EcPh+Z>R}549TZo`7!eF*Pk;t(MU%f3i2fjo<2gT zF)s7`4Lpl%VV$N3Yl45j<~yy|roTj{{wfjN>*`V#VeUiC*ijid`}0oiN)*nEu}NO_trnxZ(oNt-7GVR=|_TXiFMI6{7=*FvJ`D(+XD(N1^@JMy%K4lOD>?&t7 z)s{0hw(M5$DQIbw@8Yb&oJKG0{H+h3R&ZR5w(86{CS##HyE?4tpI*!r=_Xdr^JEU{)j68p!NAX3vi#;{pYHR){u?~Ss6%VtruV*VI92(Y)@^#Lh>@$rC>J&!mHW@kxs5JipcVQOKgKn_4 zF0gJaMWFT*cxbfy1d4b;)?s%nV2wR`_ag@kK{Pe2L}qw+zbg~Ak+<;F;m*Ed!VoCa zNL2mKmzy%NmX-L&{dTi*3s-gxBa!*8(TV3rls^Z%&>fhwE1x>6_%|}UQN4!fb6(3| zG5|%}F)h{ijP&CV5ie%jQmzIH=$507o9c$AcCV7_ix*675{GzDs_C*>QY_AR+HB%d zTg?dUPpy7I*vFwpLJHxAH`(HhHmQb3a~8C5&*xKsg&A}^ZckLq$3*jhRRdK+RuiSj zVHe4y%5-2h8FuxU3Y?zf3Ga@lYa(-RfAH)A8&0`|!4eY9qv}WfHe6VUK{8MPc2NuD z?X&DGHX2=}88wI!?*Q&>t>IN_>ur}yAb%&)YL38BL}3ayIuXM!W)Z#2e?|%mN3K$y zp7dAQ?QzJXa>SDY6`qK+DP4`?Ep_{xf;_t3^4~1os(9V)d82WIkv;|4ZIO_#z`4MC z;iS~Tc}+-_l?1rm62KnNCU#qyM#B!NSl=IFAH7OG zG!ee`Wn|6XyW$e$5$95X#RAj%Y@UA1UvM};W0z`{ju4?X(h)b7tb~XzjN>mev1u;7 z6o%{Z{h-5Ny(hOf|7lV zjH0KSs_u6v`ZpYIISH*6aHH`@`BjG)=RUBIA5dT>FD}vVgW*d>t>&jT1Cq2}dhmm` zZi)ICV^GsZwsQF{#BK42XsZ{tZaa78 zuUxQjH|_t2S|JG^h!q@~HPxACd#7w$-^)c9>X8P6`8`bEkh-B@lp+N$c?&6ovIga2 z0gPx9v_y|T&maqVDp*x}yz%*r2%3+SnMO~EtKq=>7{1EnVO|N2>OUtY{2U# zLEOdT;uj2O_1oI_>9o1##K4i7x@(4upv?@Tf`NIec9HZh2f0 z6{ZVF%F;lIqEcBdqqS}!+47gcI4rtZ@Xqn9Yt9!)3Z)m{OA^MZz1Alu$%K^ zQ#k{H0|Mi-;g4wO=*Ud7d0tJ&4}7*5UV@!z-`E*?ds=TAs>H` zH@Og=wt^TJc_`~^5}Os_bbBS6sKJtAMUn*}`HIQ}0NLffdTyG%d>KG{-lAm--t893 z#mJvbqMuk}MBU6bW7Z?*08{gFvE*62uLjANq`y)gv}<8U-M4kc?k#sWBZq3^RR3?w1vj9bHWaj_jOd{Yx<{q+9oo#Ypr=Bv^$EZi2Q$>;@5xt_ zxbZTcoqZSGeF4uu7H#iR&IzQnAU6rhi+=r$#2mg^PtDf`ZW^HwS*&s+!w;RyB6niX z)Z~)RkX^~15TBc)3?{BX3u56>E`StO$L+{PObQ<9s2rxE2F7x!x0P67jVGB4%`7`y4>2mXykx5U? zR7HwF+u51ddL(b2$LPhb%ygERD}Aa}RBTpOxyG+cIq6Z8s}pqiE&T7yQR<^I>Cx=e zcVHU3ujK-1W=1s59 zwnjho;JRz3+XQg=@jDl})Baln~c7YCn)vqTO z^qWz`Cq$76qK$HOkHyV5a#xSbw^^ioNCC`1iEX1sp;jj2q>I%PjEzi^z6UPXT-+KX zj*U^K;~NjZ%vpvUPRTO7n#KTcgQ#otN)l1?tunP_^gJ0bb6MzIdvd`4!;ZhAXH3Hb z)3pI0V`H!WjyK7d{W#v}+IgX_?plU34=xE1*F5?;@1~0}F!EpXU17~#zkff%bW!q3 z#_yM)+wyqE?qlAx*1Ov9)3>ZwqhZ(kNidSn6*WE_-Q*MsPcqE4e9JJ7$i(Y56K%^j zNn9FglR#H;JWu&JU_MduUQBluJstMA{>S{{O^u~G{ zI&{D_M6Bhtd7=kh+;!E-#&pzMyOsxbn0_^&S7S3S9YmQS6Zlg=Fs&=P`Cn@~8xBMhmd6Qw&Dq2fY$Ka3}5 z6~3aPj#TVLL`xcCzyW6Vh))WgMykEKiP z87bX)&^EKTZmq&4BvR7oX#E3Yn1-#Rfp?sh3-+l1I~AvNi6pzXkbEmVR#W(yZKcr9 zj7;1fma{JV%K4Np1R_c4=Ev*lEyl*iDVV$ZhUJ_26_;n}Sx6t?d_kWMwSZls1xrce zBBCYfSl!(QmXy?D`D@ZK$|{w>)GLbM-_w5i$(#yP;u3)uF6NT838Y`_`N#1nnz-4- zt=|l%+%|^}3^6E@3jCp3#T9BUp%nI<%fRBRKX`A@Zy6@Ut{*uDQ*Xh2l;%SlG zPZKKa#=^%8Xnd=6ou|f3L5MS@Z&ItqFrOo*Suvg17njLCHl3~0($hnIeYuvQorHfE z{eN8pR@{*>F*GR3(6g55X-ZaMsL%e~H}zz`Xkun*KOObxWlF1t5ZLIE`nE;?+SzD| zQc##G(_}4Xie_teB4&Tn_|ijXd;5q#_acZO%8ze235;o|3R%Gb)$@AS`S7SHQpr&Y zHl;rpW`ztys&b^L$RN&lZ>msfpf@^N^?cXGIUggOGX1NHlex=WZ$%Peg;Y9SXq zLXl3)gTJ%Ea3A?SJ;pF?YlDhGymR$%aOAA8KyL5)VmS5E3|MlDNW-Ah6SvWJs$(^7 zEy8T#MCt3N+GixxGEXKf{W{FF&k9{YIz`a+5aFyX@-(>8IEzd`?O2`j7CXhl1}p@} zsLn|ra)z7?K90_*Zg#f>ts}!fki|Sib$?T7ypGIw-`PlZsGArhP-ocLF!jEn35VVY zFbBJCT&m)O+1zZ+1UrGRg0Y2>8gZtae@)r%c zZ@rNf++v^A7SktBHl~Z)qMNY%efYbx;%*!&aosSi^dpmS`Davo+5$f!i2o;?7X(~s zsxPVK$zC>BN~z$;u+$hqCEwnjUCvZHe|Uq;X+0cH(63MunNoCVDIHUG_us~`WI^L!MNpYjN!fWz}A-mM<)Ys zt+s!?u+xcYj$KY7hyS%ZaJ4Ciri0nU$&nigv-pHEb+!;|KxAm>foNtK`oz|U%jU*l zywx{B#d|X3w-BnG0TO>K+)NO2ZNzXe=nklo0H|Dx|B<3Q zPJZ>L-E>#xbR@}1T*P6BbZPrXIuvhzfDFM@)7yCPWOl`r%qNO8efZuiZP9GP^aV=V}FWB8?I}5;*K4?r5ZYo=;B~j z$>x-=5a5!x3U@XcIP-Jil$XMQ9bKA!rtbgk*)?Sws~tn#H7M-$&cFyoV zEtRUYwu~@N<;-y;DshLsK=+;Sc*qR!%WoA4Qcu}=wC*?)2`IKMexI9Jf3HuneLEY# zxFaLIcN0Z)bbRD~x7um^H2~XcOQ`i1b5&NtOzq=d5c{+}^SaxqKJ$Tmn8*g~W_<&c z3f5sl^>wd|(`e`P#CwkwXVL!V0_Gs~gOGsOsVLr>7xH)MfQ;#w2;QB|tV6^o7p$K^ z95$Uk^h3qbG1A?+{#81&jt_xB?VkwG`#V*8df1FIev}5TCQn3U?W1qsy3m;t9VN)i z@16=L^@nXet}OI(1dqb*G;m%{a8d9^O6#Y~PY8($N~QuGJ2-xzytL7Wr^x_|3m9ou|-*~ynk|Z!=_53~*)q2=~ zy4YTcCVP>LKpADME0P}PNE3>miK;$;Ma_AeU|X$Z*0J0xL3H6>*((=;@x))-uRpfh za04N~Eq07v*PNRO`|K_Oa2HE~;_%BdCJLnVS=99K(4R6ELZnh;YsGb2Z<6~o z<%VLeAqq?$6DLjk_}-wpA+e->QGu|avJzq4enY5s`8+! z#PV6`b`55D<4~M8gnOD{(bglff;@YC&{sAuxZ|e};&Zn1;|-fxet)2I6$qIN>BY#q zsyK3fbJgS?h_mfz;`HM_o(jT#HMkryN!Ut2$PJvb^en31B+=RKrdGD7ukQusX8~zv zpegYStZ-*+99UZb!WqZze$82b_6VGm?J{{Tdyeh~i2IJ7HErPX5IGvOpCXv4Go_Jk zIkITM+Sm*fxc3Kp>{1nqDGrz{cY)@Oi$PjRKqvSZW5Jt!d*J(FHtMr4ZsK6LrG>0Z z!wm^qR{}`!HiD~y5CeIQ*H^x0^HnP}NW$nb>d6#CRH=_J?y52=f6-hm`MV7nnh^wm zDKWgi4@lu-vmY4R2`6Q#A$SugqMSEfHZ@iXYq8Gi*YKq8yYRm0NRDD7#<<4P7)BGN9 z^w?pWvj~WuP_rkB59@%B@AUc9)d*IiJ5**nGC(-t zb+3Hb40+2dEzS#8`%LYEkqg74Em!PMC5fC0{}K^!55O3P3t6l+cRplpSs9tip1zMt5yJz8!K7U5*Ho2Ts_ZMK5Hj1$q@-!pWEeO|`JkkxJq2Mz z$9jNMJAT-$OQTyGSU3HIty(gaRWFPvmM+V4uCFktM@L1ow&w}MzP?SESrRxtUO5q-KR8x`ruGtZ$c}VUfl^%1U&e12(70?2 zUc$H-uB@C46l!N5L~ij^G(UL44GKOdQWW#TPsz?coDPTulWtLkxj6d1$GU|wVcHHA z+P?4EY*ic}VL_Nih|n_{1;YP&PW3<7^>y&Mg^8wkgC*vt76728tff@0XchXu00C%W AAOHXW diff --git a/tgstation.dme b/tgstation.dme index 5fb357e2516..a7c90cce90b 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2406,6 +2406,7 @@ #include "code\modules\events\prison_break.dm" #include "code\modules\events\processor_overload.dm" #include "code\modules\events\radiation_storm.dm" +#include "code\modules\events\rpgtitles.dm" #include "code\modules\events\sentience.dm" #include "code\modules\events\shuttle_catastrophe.dm" #include "code\modules\events\shuttle_insurance.dm"