From 9b55d89a8e46a888be06069c27f3b704aa8b6e8d Mon Sep 17 00:00:00 2001 From: Killian Date: Sun, 24 Nov 2024 07:05:19 +0000 Subject: [PATCH 1/9] maint straggler hole --- .../objects/structures/ghost_pods/event_vr.dm | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/code/game/objects/structures/ghost_pods/event_vr.dm b/code/game/objects/structures/ghost_pods/event_vr.dm index 7e718aab89..ce1d269fbe 100644 --- a/code/game/objects/structures/ghost_pods/event_vr.dm +++ b/code/game/objects/structures/ghost_pods/event_vr.dm @@ -172,3 +172,82 @@ ..() if(!(src in active_ghost_pods)) active_ghost_pods += src + +/obj/structure/ghost_pod/ghost_activated/maint_straggler + name = "strange maintenance hole" + desc = "This is my hole! It was made for me!" + icon = 'icons/effects/effects.dmi' + icon_state = "tunnel_hole" + icon_state_opened = "tunnel_hole" + density = FALSE + ghost_query_type = /datum/ghost_query/maints_pred + anchored = TRUE + invisibility = INVISIBILITY_OBSERVER + spawn_active = TRUE + +/obj/structure/ghost_pod/ghost_activated/maint_straggler/attack_ghost(var/mob/observer/dead/user) + if(jobban_isbanned(user, JOB_GHOSTROLES)) + to_chat(user, span_warning("You cannot inhabit this creature because you are banned from playing ghost roles.")) + return + + //No OOC notes + if (not_has_ooc_text(user)) + return + + if(used) + to_chat(user, span_warning("Another spirit appears to have gotten to \the [src] before you. Sorry.")) + return + + var/choice = tgui_alert(user, "Using this pod will spawn you as your currently loaded character slot in a pseudo-Visitor role. Are you sure you wish to continue?", "Straggler Pod", list("Yes", "No")) + + if(!choice || choice == "No") + return + + else if(used) + to_chat(user, span_warning("Another spirit appears to have gotten to \the [src] before you. Sorry.")) + return + + create_occupant(user) + +/obj/structure/ghost_pod/ghost_activated/maint_straggler/create_occupant(var/mob/M) + ..() + + var/picked_ckey = M.ckey + var/picked_slot = M.client.prefs.default_slot + var/mob/living/carbon/human/new_character = new(src.loc) + if(!new_character) + to_chat(src, "Something went wrong and spawning failed.") + return + M.client.prefs.copy_to(new_character) + if(new_character.dna) + new_character.dna.ResetUIFrom(new_character) + new_character.sync_organ_dna() + new_character.key = M.key + if(new_character.mind) + new_character.mind.loaded_from_ckey = picked_ckey + new_character.mind.loaded_from_slot = picked_slot + + job_master.EquipRank(new_character, JOB_ALT_VISITOR, 1) + + for(var/lang in new_character.client.prefs.alternate_languages) + var/datum/language/chosen_language = GLOB.all_languages[lang] + if(chosen_language) + if(is_lang_whitelisted(src,chosen_language) || (new_character.species && (chosen_language.name in new_character.species.secondary_langs))) + new_character.add_language(lang) + + new_character.regenerate_icons() + + new_character.update_transform() + + to_chat(new_character, span_notice("You are a Maintenance Straggler, a loose end... you have no special advantages compared to the rest of the crew, so be cautious! You will spawn with an ID that claims you are a Visitor along with any loadout items a Visitor would be allowed to spawn with, but do not expect any of it to get you very far...")) + to_chat(new_character, span_critical("Please be advised, this role is NOT AN ANTAGONIST.")) + to_chat(new_character, span_notice("Whoever or whatever your chosen character slot is, your role is to facilitate roleplay focused around that character, and under no circumstances should you even attempt to fight the station and kill people. You can of course eat and/or digest people as you like if OOC prefs align, but this should be done as part of roleplay. If you intend to fight the station and kill people and such, you need permission from the staff team. As a straggler, you should probably avoid well-populated areas or else you may be treated as a trespasser and get in trouble with security! Of course, you’re welcome to try to make friends and roleplay how you will in this regard, but something to keep in mind.")) + + new_character.visible_message(span_warning("[new_character] appears to crawl out of somewhere.")) + log_and_message_admins("successfully entered \a [src] and became their loaded character.") + qdel(src) + +/obj/structure/ghost_pod/ghost_activated/maint_straggler/Initialize() + ..() + if(!(src in active_ghost_pods)) + active_ghost_pods += src From 353d53a3854f935391125eb4373c1a2bd68544c0 Mon Sep 17 00:00:00 2001 From: Killian Date: Sun, 24 Nov 2024 08:47:52 +0000 Subject: [PATCH 2/9] straggler pod: prevent whitelist bypass --- code/game/objects/structures/ghost_pods/event_vr.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/game/objects/structures/ghost_pods/event_vr.dm b/code/game/objects/structures/ghost_pods/event_vr.dm index ce1d269fbe..655f9d1ccb 100644 --- a/code/game/objects/structures/ghost_pods/event_vr.dm +++ b/code/game/objects/structures/ghost_pods/event_vr.dm @@ -214,10 +214,18 @@ var/picked_ckey = M.ckey var/picked_slot = M.client.prefs.default_slot + + if(!is_alien_whitelisted(M, GLOB.all_species[M.client.prefs.species])) + to_chat(M, span_warning("You cannot spawn as a species you are not whitelisted for!")) + reset_ghostpod() + return + var/mob/living/carbon/human/new_character = new(src.loc) if(!new_character) to_chat(src, "Something went wrong and spawning failed.") + reset_ghostpod() return + M.client.prefs.copy_to(new_character) if(new_character.dna) new_character.dna.ResetUIFrom(new_character) From 5ab76e74f5044baebc74295f34212d48442b54a9 Mon Sep 17 00:00:00 2001 From: Killian Date: Tue, 26 Nov 2024 18:30:01 +0000 Subject: [PATCH 3/9] straggler pod: text polish --- .../objects/structures/ghost_pods/event_vr.dm | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/code/game/objects/structures/ghost_pods/event_vr.dm b/code/game/objects/structures/ghost_pods/event_vr.dm index 655f9d1ccb..b5f88f1c68 100644 --- a/code/game/objects/structures/ghost_pods/event_vr.dm +++ b/code/game/objects/structures/ghost_pods/event_vr.dm @@ -185,28 +185,22 @@ invisibility = INVISIBILITY_OBSERVER spawn_active = TRUE +//override the standard attack_ghost proc for custom messages /obj/structure/ghost_pod/ghost_activated/maint_straggler/attack_ghost(var/mob/observer/dead/user) if(jobban_isbanned(user, JOB_GHOSTROLES)) - to_chat(user, span_warning("You cannot inhabit this creature because you are banned from playing ghost roles.")) + to_chat(user, span_warning("You cannot use this spawnpoint because you are banned from playing ghost roles.")) return //No OOC notes if (not_has_ooc_text(user)) + to_chat(user, span_warning("You must have OOC notes configured for your current character slot to use this spawnpoint.")) return - if(used) - to_chat(user, span_warning("Another spirit appears to have gotten to \the [src] before you. Sorry.")) - return - - var/choice = tgui_alert(user, "Using this pod will spawn you as your currently loaded character slot in a pseudo-Visitor role. Are you sure you wish to continue?", "Straggler Pod", list("Yes", "No")) + var/choice = tgui_alert(user, "Using this spawner will spawn you as your currently loaded character slot in a pseudo-Visitor role. Are you absolutely sure you wish to continue?", "Maint Straggler Spawner", list("Yes", "No")) if(!choice || choice == "No") return - else if(used) - to_chat(user, span_warning("Another spirit appears to have gotten to \the [src] before you. Sorry.")) - return - create_occupant(user) /obj/structure/ghost_pod/ghost_activated/maint_straggler/create_occupant(var/mob/M) @@ -222,18 +216,16 @@ var/mob/living/carbon/human/new_character = new(src.loc) if(!new_character) - to_chat(src, "Something went wrong and spawning failed.") + to_chat(src, "Something went wrong and spawning failed. Please check your character slot doesn't have any obvious errors, then either try again or send an adminhelp!") reset_ghostpod() return M.client.prefs.copy_to(new_character) - if(new_character.dna) - new_character.dna.ResetUIFrom(new_character) - new_character.sync_organ_dna() + new_character.dna.ResetUIFrom(new_character) + new_character.sync_organ_dna() new_character.key = M.key - if(new_character.mind) - new_character.mind.loaded_from_ckey = picked_ckey - new_character.mind.loaded_from_slot = picked_slot + new_character.mind.loaded_from_ckey = picked_ckey + new_character.mind.loaded_from_slot = picked_slot job_master.EquipRank(new_character, JOB_ALT_VISITOR, 1) @@ -247,12 +239,12 @@ new_character.update_transform() - to_chat(new_character, span_notice("You are a Maintenance Straggler, a loose end... you have no special advantages compared to the rest of the crew, so be cautious! You will spawn with an ID that claims you are a Visitor along with any loadout items a Visitor would be allowed to spawn with, but do not expect any of it to get you very far...")) + to_chat(new_character, span_notice("You are a Maintenance Straggler, a loose end... you have no special advantages compared to the rest of the crew, so be cautious! You will spawn with an ID that claims you are a Visitor along with any loadout items a Visitor would be allowed to spawn with, and anything you can find in maintenance, but do not expect any of it to get you very far!")) to_chat(new_character, span_critical("Please be advised, this role is NOT AN ANTAGONIST.")) - to_chat(new_character, span_notice("Whoever or whatever your chosen character slot is, your role is to facilitate roleplay focused around that character, and under no circumstances should you even attempt to fight the station and kill people. You can of course eat and/or digest people as you like if OOC prefs align, but this should be done as part of roleplay. If you intend to fight the station and kill people and such, you need permission from the staff team. As a straggler, you should probably avoid well-populated areas or else you may be treated as a trespasser and get in trouble with security! Of course, you’re welcome to try to make friends and roleplay how you will in this regard, but something to keep in mind.")) + to_chat(new_character, span_notice("Whoever or whatever your chosen character slot is, your role is to facilitate roleplay focused around that character, and under no circumstances should you even attempt to fight the station and kill people, especially unprovoked. Vorish shenanigans are the exception here, so long as preferences are respected, but this should be done as part of roleplay. As a straggler, you should probably avoid well-populated areas or else you may be treated as a trespasser and get in trouble with security! Of course, you’re welcome to try to make friends and roleplay how you will in this regard, but something to keep in mind.")) new_character.visible_message(span_warning("[new_character] appears to crawl out of somewhere.")) - log_and_message_admins("successfully entered \a [src] and became their loaded character.") + log_and_message_admins("[new_character.ckey] successfully used a Maintenance Straggler spawnpoint and became their loaded character, [new_character.real_name].") qdel(src) /obj/structure/ghost_pod/ghost_activated/maint_straggler/Initialize() From 69a160984864bf38bc5be8ba2e6465a2594b4813 Mon Sep 17 00:00:00 2001 From: Killian Date: Wed, 27 Nov 2024 10:37:57 +0000 Subject: [PATCH 4/9] straggler pod: job/role WIP --- code/__defines/jobs.dm | 1 + code/datums/outfits/misc.dm | 9 +++++++- code/game/jobs/job/special_vr.dm | 21 +++++++++++++++++++ .../objects/structures/ghost_pods/event_vr.dm | 2 +- 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/code/__defines/jobs.dm b/code/__defines/jobs.dm index 70e38c6876..c8c573b72e 100644 --- a/code/__defines/jobs.dm +++ b/code/__defines/jobs.dm @@ -420,3 +420,4 @@ #define JOB_XENOMORPH "Xenomorph" #define JOB_BORER "Borer" #define JOB_EMERGENCY_RESPONSE_TEAM "Emergency Response Team" +#define JOB_MAINT_STRAGGLER "Maintenance Straggler" diff --git a/code/datums/outfits/misc.dm b/code/datums/outfits/misc.dm index 556bf1d052..ed0dd7a136 100644 --- a/code/datums/outfits/misc.dm +++ b/code/datums/outfits/misc.dm @@ -57,4 +57,11 @@ /decl/hierarchy/outfit/zaddat name = "Zaddat Suit" suit = /obj/item/clothing/suit/space/void/zaddat/ - mask = /obj/item/clothing/mask/gas/zaddat \ No newline at end of file + mask = /obj/item/clothing/mask/gas/zaddat + +/decl/hierarchy/outfit/maint_straggler + name = "Maintenance Straggler Outfit" + id_slot = slot_wear_id + id_type = /obj/item/card/id/civilian/straggler + pda_slot = slot_r_store + id_pda_assignment = "NO DATA" diff --git a/code/game/jobs/job/special_vr.dm b/code/game/jobs/job/special_vr.dm index 2d5f291ffc..7d96e2fedf 100644 --- a/code/game/jobs/job/special_vr.dm +++ b/code/game/jobs/job/special_vr.dm @@ -108,3 +108,24 @@ return list(access_maint_tunnels, access_entertainment, access_tomfoolery, access_mime) else return list(access_entertainment, access_tomfoolery, access_mime) + +/obj/item/card/id/civilian/straggler + assignment = "NO DATA" + rank = JOB_MAINT_STRAGGLER + +/datum/job/maint_straggler + title = JOB_MAINT_STRAGGLER + departments = list(DEPARTMENT_CIVILIAN) + faction = FACTION_NONE + total_positions = 1 + spawn_positions = 1 + supervisors = "nobody save your own common sense and good judgement" + selection_color = "#515151" + economic_modifier = 0 + job_description = "An Outsider is exactly that." + whitelist_only = 1 + latejoin_only = 0 + requestable = FALSE + outfit_type = /decl/hierarchy/outfit/maint_straggler + access = list(access_maint_tunnels) + minimal_access = list(access_maint_tunnels) diff --git a/code/game/objects/structures/ghost_pods/event_vr.dm b/code/game/objects/structures/ghost_pods/event_vr.dm index b5f88f1c68..af7a8b4b51 100644 --- a/code/game/objects/structures/ghost_pods/event_vr.dm +++ b/code/game/objects/structures/ghost_pods/event_vr.dm @@ -227,7 +227,7 @@ new_character.mind.loaded_from_ckey = picked_ckey new_character.mind.loaded_from_slot = picked_slot - job_master.EquipRank(new_character, JOB_ALT_VISITOR, 1) + job_master.EquipRank(new_character, JOB_MAINT_STRAGGLER, 1) for(var/lang in new_character.client.prefs.alternate_languages) var/datum/language/chosen_language = GLOB.all_languages[lang] From e01674447456e6e92848b02d9e3a282d30665a9f Mon Sep 17 00:00:00 2001 From: Killian Date: Wed, 27 Nov 2024 12:12:03 +0000 Subject: [PATCH 5/9] straggler pod: job/role finish --- code/datums/outfits/misc.dm | 3 ++- code/game/jobs/job/special_vr.dm | 15 ++++++++------- .../objects/items/weapons/id cards/id_stacks.dm | 6 ++++++ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/code/datums/outfits/misc.dm b/code/datums/outfits/misc.dm index ed0dd7a136..7e524ea2f5 100644 --- a/code/datums/outfits/misc.dm +++ b/code/datums/outfits/misc.dm @@ -63,5 +63,6 @@ name = "Maintenance Straggler Outfit" id_slot = slot_wear_id id_type = /obj/item/card/id/civilian/straggler - pda_slot = slot_r_store + pda_slot = slot_belt + pda_type = /obj/item/pda id_pda_assignment = "NO DATA" diff --git a/code/game/jobs/job/special_vr.dm b/code/game/jobs/job/special_vr.dm index 7d96e2fedf..1c8ba3d789 100644 --- a/code/game/jobs/job/special_vr.dm +++ b/code/game/jobs/job/special_vr.dm @@ -110,21 +110,22 @@ return list(access_entertainment, access_tomfoolery, access_mime) /obj/item/card/id/civilian/straggler + desc = "A rather old and scuffed-looking ID. It seems legit, but something also seems very off somehow. Say, what's the issue/expiry date..?" assignment = "NO DATA" rank = JOB_MAINT_STRAGGLER /datum/job/maint_straggler title = JOB_MAINT_STRAGGLER departments = list(DEPARTMENT_CIVILIAN) - faction = FACTION_NONE - total_positions = 1 - spawn_positions = 1 - supervisors = "nobody save your own common sense and good judgement" + faction = FACTION_STATION + total_positions = -1 + spawn_positions = -1 + supervisors = "nobody save your own common sense and good judgement, though Security may get upset if you're not careful" selection_color = "#515151" - economic_modifier = 0 - job_description = "An Outsider is exactly that." + account_allowed = FALSE //let's not give the game away by creating accounts that someone might stumble across + job_description = "You are a maintenance straggler! You shouldn't be able to see this description anyway! Go prank the CMO or eat the RD's hat or something instead of looking at this." whitelist_only = 1 - latejoin_only = 0 + latejoin_only = 1 requestable = FALSE outfit_type = /decl/hierarchy/outfit/maint_straggler access = list(access_maint_tunnels) diff --git a/code/game/objects/items/weapons/id cards/id_stacks.dm b/code/game/objects/items/weapons/id cards/id_stacks.dm index 3158d93a9b..28497c02a9 100644 --- a/code/game/objects/items/weapons/id cards/id_stacks.dm +++ b/code/game/objects/items/weapons/id cards/id_stacks.dm @@ -336,3 +336,9 @@ /obj/item/card/id/syndicate/officer name = "Syndicate Officer ID" initial_sprite_stack = list("base-stamp-dark", "top-syndicate", "stamp-s", "pips-gold", "stripe-gold") + +//Special + +/obj/item/card/id/civilian/straggler + name = "Outdated ID" + initial_sprite_stack = list("base-stamp", "stamp-silhouette", "top-olive", "digested") From e937788c58b6c0f4020d8b5a9c418465fee69faf Mon Sep 17 00:00:00 2001 From: Killian Date: Wed, 4 Dec 2024 09:27:02 +0000 Subject: [PATCH 6/9] Update event_vr.dm fix up spans for the other pods, some other minor adjustments --- .../objects/structures/ghost_pods/event_vr.dm | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/code/game/objects/structures/ghost_pods/event_vr.dm b/code/game/objects/structures/ghost_pods/event_vr.dm index af7a8b4b51..29ca58e5ca 100644 --- a/code/game/objects/structures/ghost_pods/event_vr.dm +++ b/code/game/objects/structures/ghost_pods/event_vr.dm @@ -108,7 +108,7 @@ //newPred.movement_cooldown = 0 // The "needless artificial speed cap" exists for a reason if(M.mind) M.mind.transfer_to(newPred) - to_chat(M, span_notice("You are [newPred], somehow having gotten aboard the station in search of food. \ + to_chat(M, span_notice("You are " + span_bold(newPred) + ", somehow having gotten aboard the station in search of food. \ You are wary of environment around you, but you do feel rather peckish. Stick around dark, secluded places to avoid danger or, \ if you are cute enough, try to make friends with this place's inhabitants.")) to_chat(M, span_critical("Please be advised, this role is NOT AN ANTAGONIST.")) @@ -144,7 +144,7 @@ var/mob/living/simple_mob/vore/morph/newMorph = new /mob/living/simple_mob/vore/morph(get_turf(src)) if(M.mind) M.mind.transfer_to(newMorph) - to_chat(M, span_notice("You are a Morph, somehow having gotten aboard the station in your wandering. \ + to_chat(M, span_notice("You are a " + span_bold("Morph") + ", somehow having gotten aboard the station in your wandering. \ You are wary of environment around you, but your primal hunger still calls for you to find prey. Seek a convincing disguise, \ using your amorphous form to traverse vents to find and consume weak prey.")) to_chat(M, span_notice("You can use shift + click on objects to disguise yourself as them, but your strikes are nearly useless when you are disguised. \ @@ -191,12 +191,20 @@ to_chat(user, span_warning("You cannot use this spawnpoint because you are banned from playing ghost roles.")) return - //No OOC notes - if (not_has_ooc_text(user)) - to_chat(user, span_warning("You must have OOC notes configured for your current character slot to use this spawnpoint.")) + //No whitelist + if(!is_alien_whitelisted(user, GLOB.all_species[user.client.prefs.species])) + to_chat(user, span_warning("You cannot use this spawnpoint to spawn as a species you are not whitelisted for!")) return - var/choice = tgui_alert(user, "Using this spawner will spawn you as your currently loaded character slot in a pseudo-Visitor role. Are you absolutely sure you wish to continue?", "Maint Straggler Spawner", list("Yes", "No")) + //No OOC notes/FT + if(not_has_ooc_text(user)) + //to_chat(user, span_warning("You must have proper out-of-character notes and flavor text configured for your current character slot to use this spawnpoint.")) + return + + if(not_has_flavor_text(user)) + return + + var/choice = tgui_alert(user, "Using this spawner will spawn you as your currently loaded character slot in a special role. It should not be used with characters you regularly play on station. Are you absolutely sure you wish to continue?", "Maint Straggler Spawner", list("Yes", "No")) if(!choice || choice == "No") return @@ -209,16 +217,12 @@ var/picked_ckey = M.ckey var/picked_slot = M.client.prefs.default_slot - if(!is_alien_whitelisted(M, GLOB.all_species[M.client.prefs.species])) - to_chat(M, span_warning("You cannot spawn as a species you are not whitelisted for!")) - reset_ghostpod() - return - var/mob/living/carbon/human/new_character = new(src.loc) if(!new_character) to_chat(src, "Something went wrong and spawning failed. Please check your character slot doesn't have any obvious errors, then either try again or send an adminhelp!") reset_ghostpod() return + log_and_message_admins("successfully used a Maintenance Straggler spawnpoint and became their loaded character.") M.client.prefs.copy_to(new_character) new_character.dna.ResetUIFrom(new_character) @@ -239,12 +243,11 @@ new_character.update_transform() - to_chat(new_character, span_notice("You are a Maintenance Straggler, a loose end... you have no special advantages compared to the rest of the crew, so be cautious! You will spawn with an ID that claims you are a Visitor along with any loadout items a Visitor would be allowed to spawn with, and anything you can find in maintenance, but do not expect any of it to get you very far!")) - to_chat(new_character, span_critical("Please be advised, this role is NOT AN ANTAGONIST.")) - to_chat(new_character, span_notice("Whoever or whatever your chosen character slot is, your role is to facilitate roleplay focused around that character, and under no circumstances should you even attempt to fight the station and kill people, especially unprovoked. Vorish shenanigans are the exception here, so long as preferences are respected, but this should be done as part of roleplay. As a straggler, you should probably avoid well-populated areas or else you may be treated as a trespasser and get in trouble with security! Of course, you’re welcome to try to make friends and roleplay how you will in this regard, but something to keep in mind.")) + to_chat(new_character, span_notice("You are a " + span_bold(JOB_MAINT_STRAGGLER) + ", a loose end... you have no special advantages compared to the rest of the crew, so be cautious! You have spawned with an ID that will allow you free access to maintenance areas along with any of your chosen loadout items that are not role restricted, and can make use of anything you can find in maintenance.")) + to_chat(new_character, span_critical("Please be advised, this role is " + span_bold("NOT AN ANTAGONIST."))) + to_chat(new_character, span_notice("Whoever or whatever your chosen character slot is, your role is to facilitate roleplay focused around that character; this role is not free license to attack and murder people without provocation or explicit out-of-character consent. You should probably be cautious around high-traffic and highly sensitive areas (e.g. Telecomms) as Security personnel would be well within their rights to treat you as a trespasser. That said, good luck!")) new_character.visible_message(span_warning("[new_character] appears to crawl out of somewhere.")) - log_and_message_admins("[new_character.ckey] successfully used a Maintenance Straggler spawnpoint and became their loaded character, [new_character.real_name].") qdel(src) /obj/structure/ghost_pod/ghost_activated/maint_straggler/Initialize() From 2e91c505c3d2a0c720957a865d80f3a91ef288fd Mon Sep 17 00:00:00 2001 From: Killian Date: Wed, 4 Dec 2024 09:28:49 +0000 Subject: [PATCH 7/9] Update event_vr.dm --- code/game/objects/structures/ghost_pods/event_vr.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/game/objects/structures/ghost_pods/event_vr.dm b/code/game/objects/structures/ghost_pods/event_vr.dm index 29ca58e5ca..f6f418be3c 100644 --- a/code/game/objects/structures/ghost_pods/event_vr.dm +++ b/code/game/objects/structures/ghost_pods/event_vr.dm @@ -201,9 +201,6 @@ //to_chat(user, span_warning("You must have proper out-of-character notes and flavor text configured for your current character slot to use this spawnpoint.")) return - if(not_has_flavor_text(user)) - return - var/choice = tgui_alert(user, "Using this spawner will spawn you as your currently loaded character slot in a special role. It should not be used with characters you regularly play on station. Are you absolutely sure you wish to continue?", "Maint Straggler Spawner", list("Yes", "No")) if(!choice || choice == "No") From 01813cd4d03a942fc40b514633fe6438341918d0 Mon Sep 17 00:00:00 2001 From: Killian Date: Wed, 4 Dec 2024 12:22:40 +0000 Subject: [PATCH 8/9] maint lurker setup --- code/__defines/gamemode.dm | 12 +++++----- code/__defines/jobs.dm | 2 +- code/datums/ghost_query_vr.dm | 10 +++++++-- code/datums/outfits/misc.dm | 10 ++++++--- code/game/jobs/job/special.dm | 12 +++++----- .../items/weapons/id cards/id_stacks.dm | 2 +- .../objects/structures/ghost_pods/event_vr.dm | 18 +++++++-------- .../antagonism/02_candidacy.dm | 9 ++++---- code/modules/events/maint_lurker.dm | 22 +++++++++++++++++++ maps/groundbase/groundbase_events.dm | 1 + .../stellar_delight/stellar_delight_events.dm | 1 + maps/tether/tether_events.dm | 1 + vorestation.dme | 1 + 13 files changed, 70 insertions(+), 31 deletions(-) create mode 100644 code/modules/events/maint_lurker.dm diff --git a/code/__defines/gamemode.dm b/code/__defines/gamemode.dm index 990ddc1fa0..74121881ce 100644 --- a/code/__defines/gamemode.dm +++ b/code/__defines/gamemode.dm @@ -40,11 +40,12 @@ //VOREStation Add #define BE_LOSTDRONE 0x10000 #define BE_MAINTPRED 0x20000 -#define BE_MORPH 0x40000 -#define BE_CORGI 0x80000 -#define BE_CURSEDSWORD 0x100000 -#define BE_SURVIVOR 0x200000 -#define BE_EVENT 0x400000 +#define BE_MAINTLURKER 0x40000 +#define BE_MORPH 0x80000 +#define BE_CORGI 0x100000 +#define BE_CURSEDSWORD 0x200000 +#define BE_SURVIVOR 0x400000 +#define BE_EVENT 0x800000 //VOREStation Add End var/list/be_special_flags = list( @@ -67,6 +68,7 @@ var/list/be_special_flags = list( //VOREStation Add "Lost Drone" = BE_LOSTDRONE, "Maint Pred" = BE_MAINTPRED, + "Maint Lurker" = BE_MAINTLURKER, "Morph" = BE_MORPH, "Corgi" = BE_CORGI, "Cursed Sword" = BE_CURSEDSWORD, diff --git a/code/__defines/jobs.dm b/code/__defines/jobs.dm index c8c573b72e..a4560b36df 100644 --- a/code/__defines/jobs.dm +++ b/code/__defines/jobs.dm @@ -420,4 +420,4 @@ #define JOB_XENOMORPH "Xenomorph" #define JOB_BORER "Borer" #define JOB_EMERGENCY_RESPONSE_TEAM "Emergency Response Team" -#define JOB_MAINT_STRAGGLER "Maintenance Straggler" +#define JOB_MAINT_LURKER "Maintenance Lurker" diff --git a/code/datums/ghost_query_vr.dm b/code/datums/ghost_query_vr.dm index 75356029be..8f29b14bb3 100644 --- a/code/datums/ghost_query_vr.dm +++ b/code/datums/ghost_query_vr.dm @@ -7,5 +7,11 @@ /datum/ghost_query/maints_pred role_name = "Maintenance Predator" be_special_flag = BE_MAINTPRED - question = "It appears a predatory critter is lurking in the maintenance. Do you want to play as it? ((You get to choose type of critter. Expect to be treated as vore predator.))" - cutoff_number = 1 \ No newline at end of file + question = "It appears a predatory critter is lurking in maintenance. Do you want to play as it? ((You get to choose type of critter. Expect to be treated as vore predator.))" + cutoff_number = 1 + +/datum/ghost_query/maints_lurker + role_name = "Maintenance Lurker" + be_special_flag = BE_MAINTLURKER + question = "It appears a strange individual is lurking in maintenance. Do you want to play as them? ((You can spawn as your currently loaded character slot. Expect to be treated as vore predator.))" + cutoff_number = 1 diff --git a/code/datums/outfits/misc.dm b/code/datums/outfits/misc.dm index eb687b275c..13620cbf9a 100644 --- a/code/datums/outfits/misc.dm +++ b/code/datums/outfits/misc.dm @@ -65,10 +65,14 @@ suit = /obj/item/clothing/suit/space/void/zaddat/ mask = /obj/item/clothing/mask/gas/zaddat -/decl/hierarchy/outfit/maint_straggler - name = "Maintenance Straggler Outfit" +/decl/hierarchy/outfit/maint_lurker + name = "Maintenance Lurker Outfit" id_slot = slot_wear_id - id_type = /obj/item/card/id/civilian/straggler + id_type = /obj/item/card/id/civilian/lurker pda_slot = slot_belt pda_type = /obj/item/pda id_pda_assignment = "NO DATA" + + headset = /obj/item/radio/headset + headset_alt = /obj/item/radio/headset/alt + headset_earbud = /obj/item/radio/headset/earbud diff --git a/code/game/jobs/job/special.dm b/code/game/jobs/job/special.dm index 1c8ba3d789..cb54e54117 100644 --- a/code/game/jobs/job/special.dm +++ b/code/game/jobs/job/special.dm @@ -109,13 +109,13 @@ else return list(access_entertainment, access_tomfoolery, access_mime) -/obj/item/card/id/civilian/straggler +/obj/item/card/id/civilian/lurker desc = "A rather old and scuffed-looking ID. It seems legit, but something also seems very off somehow. Say, what's the issue/expiry date..?" assignment = "NO DATA" - rank = JOB_MAINT_STRAGGLER + rank = JOB_MAINT_LURKER -/datum/job/maint_straggler - title = JOB_MAINT_STRAGGLER +/datum/job/maint_lurker + title = JOB_MAINT_LURKER departments = list(DEPARTMENT_CIVILIAN) faction = FACTION_STATION total_positions = -1 @@ -123,10 +123,10 @@ supervisors = "nobody save your own common sense and good judgement, though Security may get upset if you're not careful" selection_color = "#515151" account_allowed = FALSE //let's not give the game away by creating accounts that someone might stumble across - job_description = "You are a maintenance straggler! You shouldn't be able to see this description anyway! Go prank the CMO or eat the RD's hat or something instead of looking at this." + job_description = "You are a maintenance lurker! You shouldn't be able to see this description anyway! Go prank the CMO or eat the RD's hat or something instead of looking at this." whitelist_only = 1 latejoin_only = 1 requestable = FALSE - outfit_type = /decl/hierarchy/outfit/maint_straggler + outfit_type = /decl/hierarchy/outfit/maint_lurker access = list(access_maint_tunnels) minimal_access = list(access_maint_tunnels) diff --git a/code/game/objects/items/weapons/id cards/id_stacks.dm b/code/game/objects/items/weapons/id cards/id_stacks.dm index 28497c02a9..1e0f49133e 100644 --- a/code/game/objects/items/weapons/id cards/id_stacks.dm +++ b/code/game/objects/items/weapons/id cards/id_stacks.dm @@ -339,6 +339,6 @@ //Special -/obj/item/card/id/civilian/straggler +/obj/item/card/id/civilian/lurker name = "Outdated ID" initial_sprite_stack = list("base-stamp", "stamp-silhouette", "top-olive", "digested") diff --git a/code/game/objects/structures/ghost_pods/event_vr.dm b/code/game/objects/structures/ghost_pods/event_vr.dm index f6f418be3c..9c91c4edda 100644 --- a/code/game/objects/structures/ghost_pods/event_vr.dm +++ b/code/game/objects/structures/ghost_pods/event_vr.dm @@ -173,20 +173,20 @@ if(!(src in active_ghost_pods)) active_ghost_pods += src -/obj/structure/ghost_pod/ghost_activated/maint_straggler +/obj/structure/ghost_pod/ghost_activated/maint_lurker name = "strange maintenance hole" desc = "This is my hole! It was made for me!" icon = 'icons/effects/effects.dmi' icon_state = "tunnel_hole" icon_state_opened = "tunnel_hole" density = FALSE - ghost_query_type = /datum/ghost_query/maints_pred + ghost_query_type = /datum/ghost_query/maints_lurker anchored = TRUE invisibility = INVISIBILITY_OBSERVER spawn_active = TRUE //override the standard attack_ghost proc for custom messages -/obj/structure/ghost_pod/ghost_activated/maint_straggler/attack_ghost(var/mob/observer/dead/user) +/obj/structure/ghost_pod/ghost_activated/maint_lurker/attack_ghost(var/mob/observer/dead/user) if(jobban_isbanned(user, JOB_GHOSTROLES)) to_chat(user, span_warning("You cannot use this spawnpoint because you are banned from playing ghost roles.")) return @@ -201,14 +201,14 @@ //to_chat(user, span_warning("You must have proper out-of-character notes and flavor text configured for your current character slot to use this spawnpoint.")) return - var/choice = tgui_alert(user, "Using this spawner will spawn you as your currently loaded character slot in a special role. It should not be used with characters you regularly play on station. Are you absolutely sure you wish to continue?", "Maint Straggler Spawner", list("Yes", "No")) + var/choice = tgui_alert(user, "Using this spawner will spawn you as your currently loaded character slot in a special role. It should not be used with characters you regularly play on station. Are you absolutely sure you wish to continue?", "Maint Lurker Spawner", list("Yes", "No")) if(!choice || choice == "No") return create_occupant(user) -/obj/structure/ghost_pod/ghost_activated/maint_straggler/create_occupant(var/mob/M) +/obj/structure/ghost_pod/ghost_activated/maint_lurker/create_occupant(var/mob/M) ..() var/picked_ckey = M.ckey @@ -219,7 +219,7 @@ to_chat(src, "Something went wrong and spawning failed. Please check your character slot doesn't have any obvious errors, then either try again or send an adminhelp!") reset_ghostpod() return - log_and_message_admins("successfully used a Maintenance Straggler spawnpoint and became their loaded character.") + log_and_message_admins("successfully used a Maintenance Lurker spawnpoint and became their loaded character.") M.client.prefs.copy_to(new_character) new_character.dna.ResetUIFrom(new_character) @@ -228,7 +228,7 @@ new_character.mind.loaded_from_ckey = picked_ckey new_character.mind.loaded_from_slot = picked_slot - job_master.EquipRank(new_character, JOB_MAINT_STRAGGLER, 1) + job_master.EquipRank(new_character, JOB_MAINT_LURKER, 1) for(var/lang in new_character.client.prefs.alternate_languages) var/datum/language/chosen_language = GLOB.all_languages[lang] @@ -240,14 +240,14 @@ new_character.update_transform() - to_chat(new_character, span_notice("You are a " + span_bold(JOB_MAINT_STRAGGLER) + ", a loose end... you have no special advantages compared to the rest of the crew, so be cautious! You have spawned with an ID that will allow you free access to maintenance areas along with any of your chosen loadout items that are not role restricted, and can make use of anything you can find in maintenance.")) + to_chat(new_character, span_notice("You are a " + span_bold(JOB_MAINT_LURKER) + ", a loose end... you have no special advantages compared to the rest of the crew, so be cautious! You have spawned with an ID that will allow you free access to maintenance areas along with any of your chosen loadout items that are not role restricted, and can make use of anything you can find in maintenance.")) to_chat(new_character, span_critical("Please be advised, this role is " + span_bold("NOT AN ANTAGONIST."))) to_chat(new_character, span_notice("Whoever or whatever your chosen character slot is, your role is to facilitate roleplay focused around that character; this role is not free license to attack and murder people without provocation or explicit out-of-character consent. You should probably be cautious around high-traffic and highly sensitive areas (e.g. Telecomms) as Security personnel would be well within their rights to treat you as a trespasser. That said, good luck!")) new_character.visible_message(span_warning("[new_character] appears to crawl out of somewhere.")) qdel(src) -/obj/structure/ghost_pod/ghost_activated/maint_straggler/Initialize() +/obj/structure/ghost_pod/ghost_activated/maint_lurker/Initialize() ..() if(!(src in active_ghost_pods)) active_ghost_pods += src diff --git a/code/modules/client/preference_setup/antagonism/02_candidacy.dm b/code/modules/client/preference_setup/antagonism/02_candidacy.dm index d400047274..5c1c58fc72 100644 --- a/code/modules/client/preference_setup/antagonism/02_candidacy.dm +++ b/code/modules/client/preference_setup/antagonism/02_candidacy.dm @@ -20,10 +20,11 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set //VOREStation Add "lost drone" = 1, // 16 "maint pred" = 1, // 17 - "morph" = 1, // 18 - "corgi" = 1, // 19 - "cursed sword" = 1, // 20 - "Ship Survivor" = 1, // 21 + "maint lurker" = 1, // 18 + "morph" = 1, // 19 + "corgi" = 1, // 20 + "cursed sword" = 1, // 21 + "Ship Survivor" = 1, // 22 //VOREStation Add End ) diff --git a/code/modules/events/maint_lurker.dm b/code/modules/events/maint_lurker.dm new file mode 100644 index 0000000000..e82950fefb --- /dev/null +++ b/code/modules/events/maint_lurker.dm @@ -0,0 +1,22 @@ +/datum/event/maintenance_lurker + startWhen = 1 + endWhen = 30 + +/datum/event/maintenance_lurker/start() + + var/obj/effect/landmark/spawnspot = null + var/list/possibleSpawnspots = list() + for(var/obj/effect/landmark/L in landmarks_list) + if(L.name == "maint_pred") + possibleSpawnspots += L + if(possibleSpawnspots.len) + spawnspot = pick(possibleSpawnspots) + else + kill() // To prevent fake announcements + return + + if(!spawnspot) + kill() // To prevent fake announcements + return + + new /obj/structure/ghost_pod/ghost_activated/maint_lurker(get_turf(spawnspot)) diff --git a/maps/groundbase/groundbase_events.dm b/maps/groundbase/groundbase_events.dm index 905ce89875..e12d41100d 100644 --- a/maps/groundbase/groundbase_events.dm +++ b/maps/groundbase/groundbase_events.dm @@ -70,6 +70,7 @@ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Drone Pod Drop", /datum/event/drone_pod_drop, 40, list(ASSIGNMENT_SCIENTIST = 40), 1), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Morph Spawn", /datum/event/morph_spawn, 75, list(ASSIGNMENT_ANY = 5), 0), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Maintenance Predator", /datum/event/maintenance_predator, 100, list(ASSIGNMENT_ANY = 5), 0), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Maintenance Lurker", /datum/event/maintenance_lurker, 100, list(ASSIGNMENT_ANY = 5), 0), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Roaming Wildlife", /datum/event/roaming_wildlife, 20, list(ASSIGNMENT_SECURITY = 20, ASSIGNMENT_MEDICAL = 5), min_jobs = list(ASSIGNMENT_SECURITY = 2)), ) add_disabled_events(list( diff --git a/maps/stellar_delight/stellar_delight_events.dm b/maps/stellar_delight/stellar_delight_events.dm index 9511d67a04..d524b2bfcd 100644 --- a/maps/stellar_delight/stellar_delight_events.dm +++ b/maps/stellar_delight/stellar_delight_events.dm @@ -86,6 +86,7 @@ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Drone Pod Drop", /datum/event/drone_pod_drop, 40, list(ASSIGNMENT_SCIENTIST = 40), 1), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Morph Spawn", /datum/event/morph_spawn, 75, list(ASSIGNMENT_ANY = 5), 0), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Maintenance Predator", /datum/event/maintenance_predator, 100, list(ASSIGNMENT_ANY = 5), 0), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Maintenance Lurker", /datum/event/maintenance_lurker, 100, list(ASSIGNMENT_ANY = 5), 0), ) add_disabled_events(list( new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, 0, list(ASSIGNMENT_MEDICAL = 30), 1), diff --git a/maps/tether/tether_events.dm b/maps/tether/tether_events.dm index 5ed863881a..543e6002f0 100644 --- a/maps/tether/tether_events.dm +++ b/maps/tether/tether_events.dm @@ -86,6 +86,7 @@ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Drone Pod Drop", /datum/event/drone_pod_drop, 40, list(ASSIGNMENT_SCIENTIST = 40), 1), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Morph Spawn", /datum/event/morph_spawn, 75, list(ASSIGNMENT_ANY = 5), 0), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Maintenance Predator", /datum/event/maintenance_predator, 100, list(ASSIGNMENT_ANY = 5), 0), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Maintenance Lurker", /datum/event/maintenance_lurker, 100, list(ASSIGNMENT_ANY = 5), 0), ) add_disabled_events(list( new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, 0, list(ASSIGNMENT_MEDICAL = 30), 1), diff --git a/vorestation.dme b/vorestation.dme index 057b705786..b49e13ebe1 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -2417,6 +2417,7 @@ #include "code\modules\events\infestation.dm" #include "code\modules\events\ion_storm.dm" #include "code\modules\events\jellyfish_migration.dm" +#include "code\modules\events\maint_lurker.dm" #include "code\modules\events\maintenance_predator_vr.dm" #include "code\modules\events\meteor_strike_vr.dm" #include "code\modules\events\meteors.dm" From 6306e5b6cae2931ffcc1d33fe8b6b2e343776f4d Mon Sep 17 00:00:00 2001 From: Killian Date: Wed, 4 Dec 2024 12:53:11 +0000 Subject: [PATCH 9/9] Update event_vr.dm --- code/game/objects/structures/ghost_pods/event_vr.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/ghost_pods/event_vr.dm b/code/game/objects/structures/ghost_pods/event_vr.dm index 9c91c4edda..fb46fe77b1 100644 --- a/code/game/objects/structures/ghost_pods/event_vr.dm +++ b/code/game/objects/structures/ghost_pods/event_vr.dm @@ -216,7 +216,7 @@ var/mob/living/carbon/human/new_character = new(src.loc) if(!new_character) - to_chat(src, "Something went wrong and spawning failed. Please check your character slot doesn't have any obvious errors, then either try again or send an adminhelp!") + to_chat(M, span_warning("Something went wrong and spawning failed. Please check your character slot doesn't have any obvious errors, then either try again or send an adminhelp!")) reset_ghostpod() return log_and_message_admins("successfully used a Maintenance Lurker spawnpoint and became their loaded character.")