diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index d1a357e5a7..94ab50557c 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -292,3 +292,55 @@ 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_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 + 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..a44160619f 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) 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..0678970814 --- /dev/null +++ b/code/game/gamemodes/miniantags/borer/syndi_borer.dm @@ -0,0 +1,19 @@ +/mob/living/simple_animal/borer/syndi_borer + var/mob/owner = null + 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) 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..9ab5d9bc3b 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -822,6 +822,15 @@ 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 = 5 + //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"