From 4c8dd18d912391454b1136a7fc4f8eead3db9a02 Mon Sep 17 00:00:00 2001 From: MrCastmer <125900379+MrCastmer@users.noreply.github.com> Date: Thu, 8 Feb 2024 04:02:19 +0300 Subject: [PATCH] Reinforcement outfit&customise names for nukeop added (#7) * new_op.nukeop_outfit I think it just works. By the way, called a lot of species and tgui/get_payload runtimes with nukies, probably original code issue. * species and naming nukie tweak If felinid or human - nukie stay felinid/human If another spessspecies - become human (felinid if toggled) Operatives has their own names&nicknames and can customise them Op Leader has his own customizable nick and can customise his squad name * Removing KravMaga from oplead, granting him CQC I`m only operative after all * Update nukeop.dm --------- Co-authored-by: Blundir <100090741+Blundir@users.noreply.github.com> --- code/modules/antagonists/nukeop/nukeop.dm | 2 + .../code/game/gamemodes/nuclear/nuclear.dm | 51 +++++ .../code/game/objects/items/card_ids.dm | 21 ++ .../antagonists/_common/antag_spawner.dm | 26 +++ .../code/modules/antagonists/nukeop/nukeop.dm | 199 ++++++++++++++++++ modular_dripstation/includes.dm | 3 + 6 files changed, 302 insertions(+) create mode 100644 modular_dripstation/code/game/gamemodes/nuclear/nuclear.dm create mode 100644 modular_dripstation/code/modules/antagonists/_common/antag_spawner.dm create mode 100644 modular_dripstation/code/modules/antagonists/nukeop/nukeop.dm diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm index 2e53e926ab3e..7378a9431957 100644 --- a/code/modules/antagonists/nukeop/nukeop.dm +++ b/code/modules/antagonists/nukeop/nukeop.dm @@ -39,6 +39,7 @@ to_chat(owner, span_notice("You are a [nuke_team ? nuke_team.syndicate_name : "syndicate"] agent!")) owner.announce_objectives() +/* //dripstation edit /datum/antagonist/nukeop/on_gain() give_alias() . = ..() @@ -51,6 +52,7 @@ var/datum/component/uplink/U = owner.find_syndicate_uplink() if (U) U.telecrystals += extra_tc +*/ //dripstation edit diff --git a/modular_dripstation/code/game/gamemodes/nuclear/nuclear.dm b/modular_dripstation/code/game/gamemodes/nuclear/nuclear.dm new file mode 100644 index 000000000000..8f1a6a509a25 --- /dev/null +++ b/modular_dripstation/code/game/gamemodes/nuclear/nuclear.dm @@ -0,0 +1,51 @@ +/datum/outfit/syndicate + id = /obj/item/card/id/syndicate/nuke + +/datum/outfit/syndicate/leader + gloves = /obj/item/clothing/gloves/combat + +/datum/outfit/syndicate/leader/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + ..() + var/datum/martial_art/cqc/justanop = new + justanop.teach(H) + +/datum/outfit/syndicate/no_crystals + var/faction = "The Syndicate" + +/datum/outfit/syndicate/no_crystals/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + to_chat(H, span_notice("You're an agent of [faction], sent to accompany the nuclear squad on their mission. \ + Support your allies, and remember: Down with Nanotrasen.")) + . = ..() + +/datum/outfit/syndicate/no_crystals/gorlex + name = "Syndicate Operative - Gorlex Reinforcement" + suit = /obj/item/clothing/suit/armor/vest/alt + head = /obj/item/clothing/head/helmet/swat + neck = /obj/item/clothing/neck/scarf/red + glasses = /obj/item/clothing/glasses/cold + faction = "the Gorlex Marauders" + +/datum/outfit/syndicate/no_crystals/cybersun + name = "Syndicate Operative - Cybersun Reinforcement" + uniform = /obj/item/clothing/under/syndicate/combat + suit = /obj/item/clothing/suit/jacket/leather/overcoat + gloves = /obj/item/clothing/gloves/fingerless + glasses = /obj/item/clothing/glasses/sunglasses + mask = /obj/item/clothing/mask/cigarette/cigar + faction = "Cybersun Industries" + +/datum/outfit/syndicate/no_crystals/donk + name = "Syndicate Operative - Donk Reinforcement" + suit = /obj/item/clothing/suit/hazardvest + head = /obj/item/clothing/head/hardhat/weldhat/orange + shoes = /obj/item/clothing/shoes/workboots + glasses = /obj/item/clothing/glasses/meson + faction = "the Donk Corporation" + +/datum/outfit/syndicate/no_crystals/waffle + name = "Syndicate Operative - Waffle Reinforcement" + uniform = /obj/item/clothing/under/syndicate/combat + suit = /obj/item/clothing/suit/armor/vest + head = /obj/item/clothing/head/helmet/blueshirt + glasses = /obj/item/clothing/glasses/welding + faction = "the Waffle Corporation" \ No newline at end of file diff --git a/modular_dripstation/code/game/objects/items/card_ids.dm b/modular_dripstation/code/game/objects/items/card_ids.dm index 044474b79833..76e5203b9b16 100644 --- a/modular_dripstation/code/game/objects/items/card_ids.dm +++ b/modular_dripstation/code/game/objects/items/card_ids.dm @@ -7,3 +7,24 @@ /obj/item/card/id/departmental_budget/sec icon_state = "sec_budget" + +/obj/item/card/id/syndicate/nuke + name = "operative card" + registered_name = "operative" + assignment = "Nuclear Squad" + originalassignment = "Nuclear Squad" + registered_age = null + forged = TRUE + anyone = TRUE + registered_age = null + +/obj/item/card/id/syndicate/nuke_leader + name = "squad leader card" + registered_name = "leader" + assignment = "Nuclear Squad" + originalassignment = "Nuclear Squad" + registered_age = null + forged = TRUE + anyone = TRUE + access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE, ACCESS_SYNDICATE_LEADER) + registered_age = null \ No newline at end of file diff --git a/modular_dripstation/code/modules/antagonists/_common/antag_spawner.dm b/modular_dripstation/code/modules/antagonists/_common/antag_spawner.dm new file mode 100644 index 000000000000..fd4b48b2c713 --- /dev/null +++ b/modular_dripstation/code/modules/antagonists/_common/antag_spawner.dm @@ -0,0 +1,26 @@ +/obj/item/antag_spawner/nuke_ops + /// Do we use a random subtype of the outfit? + var/use_subtypes = TRUE + /// The applied outfit + var/datum/outfit/syndicate/outfit = /datum/outfit/syndicate/no_crystals + +/obj/item/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T, kind, datum/mind/user) + var/mob/living/carbon/human/M = new/mob/living/carbon/human(T) + C.prefs.apply_prefs_to(M) + M.key = C.key + + var/datum/antagonist/nukeop/new_op = new() + new_op.send_to_spawnpoint = FALSE + new_op.nukeop_outfit = use_subtypes ? pick(subtypesof(outfit)) : outfit + + var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop,TRUE) + if(creator_op) + M.playsound_local(get_turf(M), 'sound/ambience/antag/ops.ogg',100,0) + M.mind.add_antag_datum(new_op,creator_op.nuke_team) + M.mind.special_role = "Nuclear Operative" + +/obj/item/antag_spawner/nuke_ops/clown + use_subtypes = FALSE + +/obj/item/antag_spawner/nuke_ops/borg_tele + use_subtypes = FALSE \ No newline at end of file diff --git a/modular_dripstation/code/modules/antagonists/nukeop/nukeop.dm b/modular_dripstation/code/modules/antagonists/nukeop/nukeop.dm new file mode 100644 index 000000000000..5821f2ed7d03 --- /dev/null +++ b/modular_dripstation/code/modules/antagonists/nukeop/nukeop.dm @@ -0,0 +1,199 @@ +/datum/antagonist/nukeop/on_gain() + . = ..() + equip_op() + give_alias() + memorize_code() + if(send_to_spawnpoint) + move_to_spawnpoint() + // grant extra TC for the people who start in the nukie base ie. not the lone op + var/extra_tc = CEILING(GLOB.joined_player_list.len/5, 5) + var/datum/component/uplink/U = owner.find_syndicate_uplink() + if (U) + U.telecrystals += extra_tc + +//species toggling +/datum/antagonist/nukeop + var/whitelist_species = list("human", "felinid") + +/datum/antagonist/nukeop/equip_op() + if(!ishuman(owner.current)) + return + var/mob/living/carbon/human/H = owner.current + if(isnull(H.client) || !(H.dna.species.id in whitelist_species)) + H.set_species(/datum/species/human) //Plasamen burn up otherwise, and lizards are vulnerable to asimov AIs + if(H.client.prefs.read_preference(/datum/preference/toggle/purrbation)) //Yeah, above is right, but who cares about felinid players? + purrbation_toggle_onlyhumans(H) + var/chosen_name = H.dna.species.random_name(H.gender,0,pick(GLOB.last_names)) + owner.current.real_name = "[chosen_name]" + + H.equipOutfit(nukeop_outfit) + return TRUE + +//naming +/syndicate_name() + var/name = "" + + // Prefix + name += pick("Clandestine", "Prima", "Blue", "Zero-G", "Max", "Blasto", "Waffle", "North", "Omni", "Newton", "Cyber", "Bonk", "Gene", "Gib", "Vahlen") + + // Suffix + if (prob(80)) + name += " " + + // Full + if (prob(60)) + name += pick("Syndicate", "Consortium", "Collective", "Corporation", "Group", "Holdings", "Biotech", "Industries", "Systems", "Products", "Chemicals", "Pharmaceuticals", "Enterprises", "Creations", "International", "Intergalactic", "Interplanetary", "Foundation", "Positronics", "Hive") + // Broken + else + name += pick("Syndi", "Corp", "Bio", "System", "Prod", "Chem", "Inter", "Hive") + name += pick("", "-") + name += pick("Tech", "Sun", "Co", "Tek", "X", "Inc", "Dyne", "Code") + // Small + else + name += pick("-", "") + name += pick("Tech", "Sun", "Co", "Tek", "X", "Inc", "Gen", "Star", "Dyne", "Code", "Hive", "Group") + + return name + + +/datum/antagonist/nukeop/give_alias() + if(nuke_team && nuke_team.syndicate_name) + var/mob/living/carbon/human/H = owner.current + var/number = 1 + number = nuke_team.members.Find(owner) + H.replace_op_id(H,"Operative #[number]", nuke_team.syndicate_name) + addtimer(CALLBACK(src, PROC_REF(op_rename)), 1) + +/datum/antagonist/nukeop/proc/op_rename() + var/mob/living/op_mob = owner.current + var/newname = sanitize_name(reject_bad_text(tgui_input_text(op_mob, "You are the [name] of [nuke_team.syndicate_name]. Would you like to change your name to something else?", "Name change", op_mob.real_name, MAX_NAME_LEN))) + if (!newname) + return + + op_mob.real_name = "[newname]" + + + +/datum/antagonist/nukeop/leader/give_alias() + title = pick("Boss", "Commander", "Chief", "Director", "Overlord") + var/mob/living/carbon/human/H = owner.current + if(nuke_team && nuke_team.syndicate_name) + H.replace_op_id(H, title, nuke_team.syndicate_name) + else + H.replace_op_id(H,title,"Syndicate") + addtimer(CALLBACK(src, PROC_REF(op_rename)), 1) + addtimer(CALLBACK(src, PROC_REF(leader_title_rename)), 1) + +/datum/antagonist/nukeop/leader/proc/leader_title_rename() + switch(tgui_alert(owner.current, "Do you want to change your title?", "Select",list("Manually", "Auto", "No"))) + if("Manually") + var/newtitle = tgui_input_text(owner.current, "Change your title", "Name change", title, MAX_NAME_LEN) + title = newtitle + if("Auto") + var/newtitle = tgui_alert(owner.current, "Choose your destiny","Choice",list("Boss", "Commander", "Chief", "Director", "Overlord")) + title = newtitle + if("No") + return + owner.current.replace_op_id(owner.current, title, nuke_team.syndicate_name) + +/datum/antagonist/nukeop/leader/nuketeam_name_assign() + if(!nuke_team) + return + switch(tgui_alert(owner.current, "Please select how you want to rename your team.", "Select",list("Manually", "Automatic", "Cancel"))) + if("Manually") + nuke_team.rename_team(title,ask_name()) + if("Automatic") + nuke_team.rename_team(title,automatic_select()) + if("Cancel") + return + +/datum/antagonist/nukeop/leader/proc/automatic_select() + var/name = "" + var/list/prefix = list("Clandestine", "Prima", "Blue", "Zero-G", "Max", "Blasto", "Waffle", "Donk", "North", "Omni", "Newton", "Cyber", "Bonk", "Gene", "Gib", "Vahlen") + var/list/fullsuffix = list("Syndicate", "Consortium", "Collective", "Corporation", "Group", "Holdings", "Biotech", "Industries", "Systems", "Products", "Chemicals", "Pharmaceuticals", "Enterprises", "Creations", "International", "Intergalactic", "Interplanetary", "Foundation", "Positronics", "Hive") + var/list/customfirstsuffix = list("Syndi", "Corp", "Bio", "System", "Prod", "Chem", "Inter", "Hive") + var/list/customsecondsuffix = list("Tech", "Sun", "Co", "Tek", "X", "Inc", "Dyne", "Code") + var/list/shortsuffix = list("Tech", "Sun", "Co", "Tek", "X", "Inc", "Gen", "Star", "Dyne", "Code", "Hive", "Group") + + var/name_prefix = tgui_alert(owner.current, "Please select prefix", "Select", prefix) + name += name_prefix + + // Suffix + switch(tgui_alert(owner.current, "Please select suffix", "Select",list("Full", "Custom", "Small"))) + if("Full") + name += " " + var/name_suffix = tgui_alert(owner.current, "Please select suffix", "Select", fullsuffix) + name += name_suffix + if ("Custom") + name += " " + var/name_firstsuffix = tgui_alert(owner.current, "Please select first suffix", "Select", customfirstsuffix) + name += name_firstsuffix + switch(tgui_alert(owner.current, "Please select second suffix", "Select", list("None", "-"))) + if("None") + name += "" + if("-") + name += "-" + var/name_secondsuffix = tgui_alert(owner.current, "Please select second suffix", "Select", customsecondsuffix) + name += name_secondsuffix + if("Small") + switch(tgui_alert(owner.current, "Please select second suffix", "Select", list("None", "-"))) + if("None") + name += "" + if("-") + name += "-" + var/name_shortsuffix = tgui_alert(owner.current, "Please select short suffix", "Select", shortsuffix) + name += name_shortsuffix + + return name + +/datum/antagonist/nukeop/leader/ask_name() + var/oldname = "Syndicate" + if(nuke_team.syndicate_name) + oldname = nuke_team.syndicate_name + var/newname = tgui_input_text(owner.current,"You are the nuke operative [title]. Please choose a last name of your Dream Team.", "Name change",oldname) + if (!newname) + newname = oldname + else + newname = reject_bad_name(newname) + if(!newname) + newname = oldname + + return capitalize(newname) + +/datum/team/nuclear/rename_team(title,new_name) + syndicate_name = new_name + name = "[syndicate_name] Team" + for(var/I in members) + var/datum/mind/synd_mind = I + var/mob/living/carbon/human/H = synd_mind.current + if(!istype(H)) + continue + if(synd_mind.has_antag_datum(/datum/antagonist/nukeop/leader)) + H.replace_op_id(H,title, syndicate_name) + else + var/number = 1 + number = members.Find(synd_mind) + H.replace_op_id(H,"Operative #[number]", syndicate_name) + +/atom/proc/replace_op_id(op,newname,squad_name) + var/mob/living/carbon/oper = op + var/list/searching = oper.get_all_gear() + var/search_id = 1 + + for(var/A in searching) + if( search_id && istype(A, /obj/item/card/id) ) + var/obj/item/card/id/ID = A + ID.registered_name = "[squad_name] [newname]" + ID.assignment = squad_name + ID.originalassignment = squad_name + ID.registered_age = null + if(istype(ID, /obj/item/card/id/syndicate)) + var/obj/item/card/id/syndicate/SID = ID + SID.forged = TRUE + SID.anyone = TRUE + ID.update_label() + if(istype(ID.loc, /obj/item/computer_hardware/card_slot)) + var/obj/item/computer_hardware/card_slot/CS = ID.loc + CS.holder?.update_label() + balloon_alert(op, "name replaced") + search_id = 0 \ No newline at end of file diff --git a/modular_dripstation/includes.dm b/modular_dripstation/includes.dm index 6477a91109b4..aaebd7f2a574 100644 --- a/modular_dripstation/includes.dm +++ b/modular_dripstation/includes.dm @@ -1,3 +1,6 @@ +#include "code\modules\antagonists\_common\antag_spawner.dm" +#include "code\game\gamemodes\nuclear\nuclear.dm" +#include "code\modules\antagonists\nukeop\nukeop.dm" #include "code\controllers\subsystem\blackmarket.dm" #include "code\datum\brain_damage\severe.dm" #include "code\datum\component\transforming.dm"