diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index d1a357e5a7..2b3fc33bd9 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -292,3 +292,57 @@ veil_msg = "You sense an adorable presence lurking just beyond the veil..." objective_verb = "Hug and Tickle" demon_type = /mob/living/simple_animal/slaughter/laughter + + +////////////Syndicate Cortical Borer +obj/item/weapon/antag_spawner/syndi_borer + name = "syndicate brain-slug container" + desc = "Releases a modified cortical borer to assist the user." + icon = 'icons/obj/device.dmi' //Temporary? Doesn't really look like a container for xenofauna... but IDK what else could work. + icon_state = "locator" + +obj/item/weapon/antag_spawner/syndi_borer/spawn_antag(client/C, turf/T, mob/owner) + var/mob/living/simple_animal/borer/syndi_borer/B = new /mob/living/simple_animal/borer/syndi_borer(T) + + B.key = C.key + if (owner) + B.owner = owner + B.faction = B.faction | owner.faction.Copy() + + B.mind.assigned_role = B.name + B.mind.special_role = B.name + ticker.mode.traitors += B.mind + var/datum/objective/syndi_borer/new_objective + new_objective = new /datum/objective/syndi_borer + new_objective.owner = B.mind + new_objective.target = owner.mind + new_objective.explanation_text = "You are a modified cortical borer. You obey [owner.real_name] and must assist them in completing their objectives." + B.mind.objectives += new_objective + + to_chat(B, "You are awake at last! Seek out whoever released you and aid them as best you can!") + if(new_objective) + to_chat(B, "Objective #[1]: [new_objective.explanation_text]") + +/obj/item/weapon/antag_spawner/syndi_borer/proc/check_usability(mob/user) + if(used) + to_chat(user, "[src] appears to be empty!") + return 0 + return 1 + +/obj/item/weapon/antag_spawner/syndi_borer/attack_self(mob/user) + if(!(check_usability(user))) + return + + var/list/borer_candidates = pollCandidatesForMob("Do you want to play as a syndicate cortical borer?", ROLE_BORER, null, ROLE_BORER, 150, src) + if(borer_candidates.len) + if(!(check_usability(user))) + return + used = 1 + var/mob/dead/observer/theghost = pick(borer_candidates) + spawn_antag(theghost.client, get_turf(src), user) + var/datum/effect_system/spark_spread/S = new /datum/effect_system/spark_spread + S.set_up(4, 1, src) + S.start() + qdel(src) + else + to_chat(user, "Unable to connect to release specimen. Please wait and try again later or use the container on your uplink to get your points refunded.") diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index a4dda8145f..26ec704c7a 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -110,10 +110,14 @@ var/total_borer_hosts_needed = 10 var/datum/action/innate/borer/punish_victim/punish_victim_action = new var/datum/action/innate/borer/jumpstart_host/jumpstart_host_action = new + var/is_team_borer = TRUE + var/borer_alert = "Become a cortical borer? (Warning, You can no longer be cloned!)" + /mob/living/simple_animal/borer/Initialize(mapload, gen=1) ..() generation = gen - notify_ghosts("A cortical borer has been created in [get_area(src)]!", enter_link = "(Click to enter)", source = src, action = NOTIFY_ATTACK) + if(is_team_borer) + notify_ghosts("A cortical borer has been created in [get_area(src)]!", enter_link = "(Click to enter)", source = src, action = NOTIFY_ATTACK) real_name = "Cortical Borer [rand(1000,9999)]" truename = "[borer_names[min(generation, borer_names.len)]] [rand(1000,9999)]" borer_chems += /datum/borer_chem/epinephrine @@ -128,8 +132,9 @@ var/total_borer_hosts_needed = 10 //borer_chems += /datum/borer_chem/creagent borer_chems += /datum/borer_chem/ethanol borer_chems += /datum/borer_chem/rezadone - - borers += src + + if(is_team_borer) + borers += src GrantBorerActions() @@ -146,7 +151,7 @@ var/total_borer_hosts_needed = 10 return if(stat != CONSCIOUS) return - var/be_borer = alert("Become a cortical borer? (Warning, You can no longer be cloned!)",,"Yes","No") + var/be_borer = alert(borer_alert,,"Yes","No") if(be_borer == "No" || !src || QDELETED(src)) return if(key) @@ -696,7 +701,8 @@ var/total_borer_hosts_needed = 10 controlling = TRUE victim.verbs += /mob/living/carbon/proc/release_control - victim.verbs += /mob/living/carbon/proc/spawn_larvae + if(is_team_borer) + victim.verbs += /mob/living/carbon/proc/spawn_larvae victim.verbs -= /mob/living/proc/borer_comm victim.verbs += /mob/living/proc/trapped_mind_comm GrantControlActions() @@ -821,7 +827,8 @@ var/total_borer_hosts_needed = 10 controlling = FALSE victim.verbs -= /mob/living/carbon/proc/release_control - victim.verbs -= /mob/living/carbon/proc/spawn_larvae + if(is_team_borer) + victim.verbs -= /mob/living/carbon/proc/spawn_larvae victim.verbs += /mob/living/proc/borer_comm victim.verbs -= /mob/living/proc/trapped_mind_comm RemoveControlActions() diff --git a/code/game/gamemodes/miniantags/borer/syndi_borer.dm b/code/game/gamemodes/miniantags/borer/syndi_borer.dm new file mode 100644 index 0000000000..dc095c084c --- /dev/null +++ b/code/game/gamemodes/miniantags/borer/syndi_borer.dm @@ -0,0 +1,20 @@ +/mob/living/simple_animal/borer/syndi_borer + var/mob/owner = null + is_team_borer = FALSE + borer_alert = "Serve as a syndicate cortical borer? (Warning, You can no longer be cloned!)" + +/mob/living/simple_animal/borer/syndi_borer/Initialize(mapload, gen=1) + ..() + real_name = "Syndicate Borer [rand(1000,9999)]" + truename = "[borer_names[min(generation, borer_names.len)]] [rand(1000,9999)]" + + GrantBorerActions() + make_larvae_action.Remove(src) + +/mob/living/simple_animal/borer/syndi_borer/GrantControlActions() + talk_to_brain_action.Grant(victim) + give_back_control_action.Grant(victim) + +/mob/living/simple_animal/borer/syndi_borer/RemoveControlActions() + talk_to_brain_action.Remove(victim) + give_back_control_action.Remove(victim) \ No newline at end of file diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index e4b44fa4aa..43244f8d32 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -902,4 +902,16 @@ var/global/list/possible_items_special = list() command_staff_only = TRUE +//Syndicate borer objective, relies on their owner getting a greentext, no matter if they themselves did anything really. +/datum/objective/syndi_borer + explanation_text = "You are a modified syndicate cortical borer, assist your owner with their objectives." + martyr_compatible = 1 +/datum/objective/syndi_borer/check_completion() + if(target) + for(var/datum/objective/objective in target.objectives) + if(!objective.check_completion()) + return 0 + return 1 + else + return 1 //Not sure if we should greentext if we somehow don't even have an owner. diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm index 67fc9ea1b5..ae884e6362 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -822,6 +822,17 @@ var/list/uplink_items = list() // Global list so we only initialize this once. cost = 1 surplus = 1 +/datum/uplink_item/stealthy_tools/syndi_borer + name = "Syndicate Brain Slug" + desc = "A small cortical borer, modified to be completely loyal to the owner. \ + Genetically infertile, these brain slugs can assist medically in a support role, or take direct action \ + to assist their host." + item = /obj/item/weapon/antag_spawner/syndi_borer + refundable = TRUE + cost = 10 + surplus = 20 //Let's not have this be too common + exclude_modes = list(/datum/game_mode/nuclear) + //Space Suits and Hardsuits /datum/uplink_item/suits category = "Space Suits and Hardsuits" diff --git a/tgstation.dme b/tgstation.dme index 46d56db0e0..2494eb4489 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -489,6 +489,7 @@ #include "code\game\gamemodes\miniantags\borer\borer_event.dm" #include "code\game\gamemodes\miniantags\borer\borer_html.dm" #include "code\game\gamemodes\miniantags\borer\borer_topic.dm" +#include "code\game\gamemodes\miniantags\borer\syndi_borer.dm" #include "code\game\gamemodes\miniantags\bot_swarm\swarmer.dm" #include "code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm" #include "code\game\gamemodes\miniantags\monkey\monkey.dm"