diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index 4e3fe1927bc..9cfdc92b649 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -326,6 +326,10 @@ GLOBAL_LIST_INIT(human_invader_antagonists, list( #define ANTAG_GROUP_WIZARDS "Wizard Federation" #define ANTAG_GROUP_XENOS "Xenomorph Infestation" + +// If this flag is enabled the antagonist datum allows the antagonist to be inducted into a nuclear operative team. +#define FLAG_ANTAG_CAN_BE_INDUCTED (1 << 0) + #define HUNTER_PACK_COPS "cop_hunters" #define HUNTER_PACK_RUSSIAN "russian_hunters" #define HUNTER_PACK_BOUNTY "bounty_hunters" diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 4cb2edb024f..c9ace922962 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -87,8 +87,10 @@ new /obj/item/sbeacondrop/bomb(src) // 11 tc new /obj/item/grenade/syndieminibomb(src) // 6 tc new /obj/item/sbeacondrop/powersink(src) // 11 tc - new /obj/item/clothing/suit/space/syndicate/black/red(src) // outfit 1 tc - new /obj/item/clothing/head/helmet/space/syndicate/black/red(src) + var/obj/item/clothing/suit/space/syndicate/spess_suit = pick(GLOB.syndicate_space_suits_to_helmets) + new spess_suit(src) // Above allows me to get the helmet from a variable on the object + var/obj/item/clothing/head/helmet/space/syndicate/spess_helmet = GLOB.syndicate_space_suits_to_helmets[spess_suit] + new spess_helmet(src) // 4 TC for the space gear new /obj/item/encryptionkey/syndicate(src) // 2 tc if(KIT_MURDER) @@ -120,8 +122,10 @@ if(KIT_LORD_SINGULOTH) //currently disabled, i might return with another anti-engine kit new /obj/item/sbeacondrop(src) // 10 tc - new /obj/item/clothing/suit/space/syndicate/black/red(src) - new /obj/item/clothing/head/helmet/space/syndicate/black/red(src) + var/obj/item/clothing/suit/space/syndicate/spess_suit = pick(GLOB.syndicate_space_suits_to_helmets) + new spess_suit(src) // Above allows me to get the helmet from a variable on the object + var/obj/item/clothing/head/helmet/space/syndicate/spess_helmet = GLOB.syndicate_space_suits_to_helmets[spess_suit] + new spess_helmet(src) // 4 TC for the space gear new /obj/item/card/emag(src) // 4 tc new /obj/item/storage/toolbox/syndicate(src) // 1 tc new /obj/item/card/id/advanced/mining(src) @@ -409,13 +413,10 @@ atom_storage.set_holdable(list(/obj/item/clothing/suit/space/syndicate, /obj/item/clothing/head/helmet/space/syndicate)) /obj/item/storage/box/syndie_kit/space/PopulateContents() - if(prob(50)) - new /obj/item/clothing/suit/space/syndicate/black/red(src) // Black and red is so in right now - new /obj/item/clothing/head/helmet/space/syndicate/black/red(src) - - else - new /obj/item/clothing/head/helmet/space/syndicate(src) - new /obj/item/clothing/suit/space/syndicate(src) + var/obj/item/clothing/suit/space/syndicate/spess_suit = pick(GLOB.syndicate_space_suits_to_helmets) + new spess_suit(src) // Above allows me to get the helmet from a variable on the object + var/obj/item/clothing/head/helmet/space/syndicate/spess_helmet = GLOB.syndicate_space_suits_to_helmets[spess_suit] + new spess_helmet(src) // 4 TC for the space gear /obj/item/storage/box/syndie_kit/emp name = "EMP kit" @@ -642,6 +643,103 @@ new /obj/item/storage/belt/grenade(src) new /obj/item/storage/belt/military/snack(src) +/obj/item/storage/box/syndie_kit/induction_kit + name = "syndicate induction kit" + desc = "Contains all you need for introducing your newest comrade to the Syndicate and all its worker's benefits." + +/obj/item/storage/box/syndie_kit/induction_kit/PopulateContents() + // Basic weaponry, so they have something to use. + new /obj/item/gun/ballistic/automatic/pistol/clandestine(src) // 6 TC, but free for nukies + new /obj/item/ammo_box/magazine/m10mm/hp(src) // 3 TC, a reward for the teamwork involved + new /obj/item/ammo_box/magazine/m10mm/ap(src) // 3 TC, a reward for the teamwork involved + new /obj/item/pen/edagger(src) // 2 TC + // The necessary equipment to help secure that disky. + new /obj/item/radio/headset/syndicate/alt(src) // 5 TC / Free for nukies + new /obj/item/modular_computer/pda/nukeops(src) // ?? TC / Free for nukies + new /obj/item/card/id/advanced/chameleon(src) // 2 TC / Free for nukies + var/obj/item/clothing/suit/space/syndicate/spess_suit = pick(GLOB.syndicate_space_suits_to_helmets) + new spess_suit(src) // Above allows me to get the helmet from a variable on the object + var/obj/item/clothing/head/helmet/space/syndicate/spess_helmet = GLOB.syndicate_space_suits_to_helmets[spess_suit] + new spess_helmet(src) // 4 TC for the space gear + new /obj/item/tank/jetpack/oxygen/harness(src) // They kinda need this to fly to the cruiser. + // Tacticool gear + new /obj/item/clothing/shoes/combat(src) + new /obj/item/clothing/under/syndicate(src) + new /obj/item/clothing/gloves/fingerless(src) + new /obj/item/book/manual/nuclear(src) // Very important + // The most important part of the kit, the implant that gives them the syndicate faction. + new /obj/item/implanter/induction_implant(src) + // All in all, 6+3+3+2+5+2+4 = ~25 TC of 'miscellaneous' items. + // This is a lot of value for 10 TC, but you have to keep in mind that you NEED someone to get this stuff station-side. + // Pretty much all of it is a bad deal for reinforcements or yourself as they already have similar or good-enough alternatives. + +/obj/item/implanter/induction_implant + name = "implanter (nuclear operative)" + desc = "A sterile automatic implant injector. You can see a tiny, somehow legible sticker on the side: 'NOT A BRAINWASH DEVICE'" + imp_type = /obj/item/implant/nuclear_operative + +/obj/item/implant/nuclear_operative + name = "nuclear operative implant" + desc = "Registers you as a member of a Syndicate nuclear operative team." + implant_color = "r" + +/obj/item/implant/nuclear_operative/get_data() + var/dat = {"Implant Specifications:
+ Name: Suspicious Implant
+ Life: UNKNOWN
+ Implant Details:
+ Function: Strange implant that seems to resist any attempts at scanning it."} + return dat + +/obj/item/implant/nuclear_operative/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE) + . = ..() + if(!. || !ishuman(target) || !(target.mind)) + return FALSE + var/mob/living/carbon/human/human_target = target + + if(IS_NUKE_OP(human_target)) // this wont proc due to ..() but i guess its good as a just-in-case? + if(human_target == user) + to_chat(user, span_userdanger("You're already a nuclear operative, dumbass! The implant disintegrates within you! You feel sick...")) + human_target.Stun(10 SECONDS) + human_target.reagents.add_reagent(/datum/reagent/toxin, 10) + return FALSE + else + to_chat(user, span_notice("You finish implanting [human_target], but you don't really notice a difference. Huh.")) + to_chat(human_target, span_userdanger("Nothing seems to really happen, but you start to feel a little ill..")) + human_target.reagents.add_reagent(/datum/reagent/toxin, 2) + return FALSE + + /// If no antag datums which allow induction are there, disallow induction! No self-antagging. + var/allowed = FALSE + for(var/datum/antagonist/antag_datum as anything in human_target.mind.antag_datums) + if((antag_datum.antag_flags & FLAG_ANTAG_CAN_BE_INDUCTED)) + allowed = TRUE + + if(!allowed) // GTFO. Technically not foolproof but making a heartbreaker or a paradox clone a nuke op sounds hilarious + to_chat(human_target, span_notice("Huh? Nothing happened? But you're starting to feel a little ill...")) + human_target.reagents.add_reagent(/datum/reagent/toxin, 15) + return FALSE + + var/datum/antagonist/nukeop/nuke_datum = new() + nuke_datum.send_to_spawnpoint = FALSE + nuke_datum.nukeop_outfit = null + human_target.mind?.add_antag_datum(nuke_datum) + human_target.faction |= ROLE_SYNDICATE + to_chat(human_target, span_warning("You are now a nuclear operative. Your main objective, if you were an antagonist and willing, is presumably to assist the nuclear operative team and secure the disk.")) + to_chat(human_target, span_userdanger("This implant does NOT, in any way, brainwash you. If you were a normal crew member beforehand, forcibly implanted or otherwise, you are still one and cannot assist the nuclear operatives.")) + return TRUE + +/obj/item/implant/nuclear_operative/removed(mob/target, silent = FALSE, special = FALSE) + . = ..() + if(!. || !isliving(target)) + return FALSE + var/mob/living/living_target = target + living_target.mind.remove_antag_datum(/datum/antagonist/nukeop) + living_target.faction -= ROLE_SYNDICATE + to_chat(target, span_notice("You feel a little less nuclear.")) + to_chat(target, span_userdanger("You're no longer identified as a nuclear operative! You are free to follow any valid goals you wish, even continuing to secure the disk. Just make sure neither any turrets nor operatives kill you on sight.")) + return TRUE + #undef KIT_RECON #undef KIT_BLOODY_SPAI #undef KIT_STEALTHY diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 74a634b83cb..709741abd96 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -50,6 +50,8 @@ GLOBAL_LIST_EMPTY(antagonists) var/show_to_ghosts = FALSE /// The typepath for the outfit to show in the preview for the preferences menu. var/preview_outfit + /// Flags for antags to turn on or off and check! + var/antag_flags = FLAG_ANTAG_CAN_BE_INDUCTED //ANTAG UI diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index ab69df5a61d..c6dd121a8d5 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -12,6 +12,8 @@ antagpanel_category = ANTAG_GROUP_ERT suicide_cry = "FOR NANOTRASEN!!" count_against_dynamic_roll_chance = FALSE + // Not 'true' antags, cannot induct to prevent issues + antag_flags = NONE var/datum/team/ert/ert_team var/leader = FALSE var/datum/outfit/outfit = /datum/outfit/centcom/ert/security diff --git a/code/modules/antagonists/valentines/valentine.dm b/code/modules/antagonists/valentines/valentine.dm index e76292e3d96..8883625fb1a 100644 --- a/code/modules/antagonists/valentines/valentine.dm +++ b/code/modules/antagonists/valentines/valentine.dm @@ -4,6 +4,8 @@ show_in_antagpanel = FALSE prevent_roundtype_conversion = FALSE suicide_cry = "FOR MY LOVE!!" + // Not 'true' antags, cannot induct + antag_flags = NONE var/datum/mind/date count_against_dynamic_roll_chance = FALSE diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm index 000cb298551..d9939a46621 100644 --- a/code/modules/clothing/spacesuits/syndi.dm +++ b/code/modules/clothing/spacesuits/syndi.dm @@ -16,6 +16,22 @@ fire = 80 acid = 85 +// Don't blame me, blame whoever added this many variations +GLOBAL_LIST_INIT(syndicate_space_suits_to_helmets,list( + /obj/item/clothing/suit/space/syndicate = /obj/item/clothing/head/helmet/space/syndicate, + /obj/item/clothing/suit/space/syndicate/green = /obj/item/clothing/head/helmet/space/syndicate/green, + /obj/item/clothing/suit/space/syndicate/green/dark = /obj/item/clothing/head/helmet/space/syndicate/green/dark, + /obj/item/clothing/suit/space/syndicate/orange = /obj/item/clothing/head/helmet/space/syndicate/orange, + /obj/item/clothing/suit/space/syndicate/blue = /obj/item/clothing/head/helmet/space/syndicate/blue, + /obj/item/clothing/suit/space/syndicate/black = /obj/item/clothing/head/helmet/space/syndicate/black, + /obj/item/clothing/suit/space/syndicate/black/green = /obj/item/clothing/head/helmet/space/syndicate/black/green, + /obj/item/clothing/suit/space/syndicate/black/blue = /obj/item/clothing/head/helmet/space/syndicate/black/blue, + /obj/item/clothing/suit/space/syndicate/black/orange = /obj/item/clothing/head/helmet/space/syndicate/black/orange, + /obj/item/clothing/suit/space/syndicate/black/red = /obj/item/clothing/head/helmet/space/syndicate/black/red, + /obj/item/clothing/suit/space/syndicate/black/med = /obj/item/clothing/head/helmet/space/syndicate/black/med, + /obj/item/clothing/suit/space/syndicate/black/engie = /obj/item/clothing/head/helmet/space/syndicate/black/engie, +)) + /obj/item/clothing/suit/space/syndicate name = "red space suit" icon_state = "syndicate" @@ -25,6 +41,7 @@ allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals) armor_type = /datum/armor/space_syndicate cell = /obj/item/stock_parts/cell/hyper + var/helmet_type = /obj/item/clothing/head/helmet/space/syndicate //Green syndicate space suit /obj/item/clothing/head/helmet/space/syndicate/green @@ -36,6 +53,7 @@ name = "green space suit" icon_state = "syndicate-green" inhand_icon_state = "syndicate-green" + helmet_type = /obj/item/clothing/head/helmet/space/syndicate/green //Dark green syndicate space suit @@ -48,6 +66,7 @@ name = "dark green space suit" icon_state = "syndicate-green-dark" inhand_icon_state = "syndicate-green-dark" + helmet_type = /obj/item/clothing/head/helmet/space/syndicate/green/dark //Orange syndicate space suit @@ -60,6 +79,7 @@ name = "orange space suit" icon_state = "syndicate-orange" inhand_icon_state = "syndicate-orange" + helmet_type = /obj/item/clothing/head/helmet/space/syndicate/orange //Blue syndicate space suit /obj/item/clothing/head/helmet/space/syndicate/blue @@ -71,6 +91,7 @@ name = "blue space suit" icon_state = "syndicate-blue" inhand_icon_state = "syndicate-blue" + helmet_type = /obj/item/clothing/head/helmet/space/syndicate/blue //Black syndicate space suit @@ -83,6 +104,7 @@ name = "black space suit" icon_state = "syndicate-black" inhand_icon_state = "syndicate-black" + helmet_type = /obj/item/clothing/head/helmet/space/syndicate/black //Black-green syndicate space suit @@ -95,6 +117,7 @@ name = "black and green space suit" icon_state = "syndicate-black-green" inhand_icon_state = "syndicate-black-green" + helmet_type = /obj/item/clothing/head/helmet/space/syndicate/black/green //Black-blue syndicate space suit @@ -107,6 +130,7 @@ name = "black and blue space suit" icon_state = "syndicate-black-blue" inhand_icon_state = "syndicate-black-blue" + helmet_type = /obj/item/clothing/head/helmet/space/syndicate/black/blue //Black medical syndicate space suit @@ -119,6 +143,7 @@ name = "green space suit" icon_state = "syndicate-black-med" inhand_icon_state = "syndicate-black" + helmet_type = /obj/item/clothing/head/helmet/space/syndicate/black/med //Black-orange syndicate space suit @@ -131,6 +156,7 @@ name = "black and orange space suit" icon_state = "syndicate-black-orange" inhand_icon_state = "syndicate-black" + helmet_type = /obj/item/clothing/head/helmet/space/syndicate/black/orange //Black-red syndicate space suit @@ -143,6 +169,7 @@ name = "black and red space suit" icon_state = "syndicate-black-red" inhand_icon_state = "syndicate-black-red" + helmet_type = /obj/item/clothing/head/helmet/space/syndicate/black/red //Black-red syndicate contract varient /obj/item/clothing/head/helmet/space/syndicate/contract @@ -159,6 +186,7 @@ w_class = WEIGHT_CLASS_SMALL icon_state = "syndicate-contract" inhand_icon_state = null + helmet_type = /obj/item/clothing/head/helmet/space/syndicate/contract //Black with yellow/red engineering syndicate space suit /obj/item/clothing/head/helmet/space/syndicate/black/engie @@ -170,3 +198,4 @@ name = "black engineering space suit" icon_state = "syndicate-black-engie" inhand_icon_state = "syndicate-black" + helmet_type = /obj/item/clothing/head/helmet/space/syndicate/black/engie diff --git a/code/modules/uplink/uplink_items/nukeops.dm b/code/modules/uplink/uplink_items/nukeops.dm index 70ca0377e8c..9d2a32d92ae 100644 --- a/code/modules/uplink/uplink_items/nukeops.dm +++ b/code/modules/uplink/uplink_items/nukeops.dm @@ -46,6 +46,16 @@ cost = 30 purchasable_from = UPLINK_NUKE_OPS +/datum/uplink_item/bundles_tc/induction_kit + name = "Syndicate Induction Kit" + desc = "Met a fellow syndicate agent on the station? Kept some TC in reserve just in case? Or are you communicating with one via the Syndicate channel? \ + Get this kit and you'll be able to induct them into your operative team via a special implant. \ + Additionally, it contains an assortment of useful gear for new operatives, including a space suit, an Ansem pistol, two spare magazines, and more! \ + *NOT* for usage with Reinforcements, and does not brainwash the target!" + item = /obj/item/storage/box/syndie_kit/induction_kit + cost = 10 + purchasable_from = UPLINK_NUKE_OPS + /datum/uplink_item/dangerous/rawketlawnchair name = "84mm Rocket Propelled Grenade Launcher" desc = "A reusable rocket propelled grenade launcher preloaded with a low-yield 84mm HE round. \