Adds Bughunt, Incursion, Spy vs Spy, Tower Defense (#7698)

rscadd: "Added three new gamemodes: Tower Defense, Bughunt, Spy vs. Spy."
    rscadd: "Bughunt, mercenary and borer, needs twenty required players and five required enemies."
    tweak: "Borers have received some miscellaneous fixes and tweaks across the board. They should overall work better now."
    rscadd: "Borers can now awaken psionics in their hosts. Maybe it's not a bad idea to get a brain slug after all..."
    rscadd: "Spy vs. Spy, traitor and renegade, needs four required players."
    tweak: "Changed how renegades work a bit. You're not traitors! You're paranoid people who smuggled a gun to work and are working to keep themselves safe."
    rscadd: "Tower Defense, mercenary, heist and ninjas, needs thirty required players and ten required enemies. Good luck!"
This commit is contained in:
Matt Atlas
2020-01-04 17:47:02 +02:00
committed by Erki
parent 6d8d2df86a
commit a02e6e7e81
25 changed files with 496 additions and 329 deletions
+11 -5
View File
@@ -15,27 +15,33 @@
/datum/language/corticalborer
name = LANGUAGE_BORER
desc = "Cortical borers possess a strange link between their tiny minds."
desc = "A language Cortical Borers use to influence the minds of those nearby, or those they infest."
speech_verb = "sings"
ask_verb = "sings"
exclaim_verb = "sings"
colour = "alien"
key = "v"
flags = RESTRICTED
/datum/language/corticalborer/hivemind
name = LANGUAGE_BORER_HIVEMIND
desc = "Cortical Borers possess a strange link between their tiny minds, allowing them to communicate telepathically."
key = "x"
flags = RESTRICTED | HIVEMIND
/datum/language/corticalborer/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
/datum/language/corticalborer/hivemind/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
var/mob/living/simple_animal/borer/B
if(istype(speaker,/mob/living/carbon))
if(istype(speaker, /mob/living/carbon))
var/mob/living/carbon/M = speaker
B = M.has_brain_worms()
else if(istype(speaker,/mob/living/simple_animal/borer))
else if(istype(speaker, /mob/living/simple_animal/borer))
B = speaker
if(B)
speaker_mask = B.truename
..(speaker,message,speaker_mask)
..(speaker, message, speaker_mask)
/datum/language/vox
name = LANGUAGE_VOX
-1
View File
@@ -56,7 +56,6 @@
if((user in contents) && istype(user))
if(user.last_special <= world.time)
user.last_special = world.time + 50
src.visible_message(span("danger", "You hear something rumbling inside [src]'s stomach..."))
var/obj/item/I = user.get_active_hand()
if(I && I.force)
var/d = rand(round(I.force / 4), I.force)
@@ -1,68 +1,3 @@
//Brain slug proc for voluntary removal of control.
/mob/living/carbon/proc/release_control()
set category = "Abilities"
set name = "Release Control"
set desc = "Release control of your host's body."
var/mob/living/simple_animal/borer/B = has_brain_worms()
if(B && B.host_brain)
to_chat(src, "<span class='danger'>You withdraw your probosci, releasing control of [B.host_brain]</span>")
B.detatch()
verbs -= /mob/living/carbon/proc/release_control
verbs -= /mob/living/carbon/proc/punish_host
verbs -= /mob/living/carbon/proc/spawn_larvae
else
to_chat(src, "<span class='danger'>ERROR NO BORER OR BRAINMOB DETECTED IN THIS MOB, THIS IS A BUG !</span>")
//Brain slug proc for tormenting the host.
/mob/living/carbon/proc/punish_host()
set category = "Abilities"
set name = "Torment host"
set desc = "Punish your host with agony."
var/mob/living/simple_animal/borer/B = has_brain_worms()
if(!B)
return
if(B.host_brain.ckey)
to_chat(src, "<span class='warning'>You send a punishing spike of psychic agony lancing into your host's brain.</span>")
if (!can_feel_pain())
to_chat(B.host_brain, "<span class='warning'>You feel a strange sensation as a foreign influence prods your mind.</span>")
to_chat(src, "<span class='warning'>It doesn't seem to be as effective as you hoped.</span>")
else
to_chat(B.host_brain, "<span class='danger'><FONT size=3>Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!</FONT></span>")
/mob/living/carbon/proc/spawn_larvae()
set category = "Abilities"
set name = "Reproduce"
set desc = "Spawn several young."
var/mob/living/simple_animal/borer/B = has_brain_worms()
if(!B)
return
if(B.chemicals >= 100)
to_chat(src, "<span class='warning'>Your host twitches and quivers as you rapidly excrete a larva from your sluglike body.</span>")
visible_message("<span class='warning'>[src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!</span>")
B.chemicals -= 100
B.has_reproduced = 1
new /obj/effect/decal/cleanable/vomit(get_turf(src))
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
new /mob/living/simple_animal/borer(get_turf(src))
else
to_chat(src, "You do not have enough chemicals stored to reproduce.")
return
/**
* Attempt to devour victim
*
@@ -1714,6 +1714,8 @@
/mob/living/carbon/human/proc/get_traumas()
. = list()
var/obj/item/organ/internal/brain/B = internal_organs_by_name[BP_BRAIN]
if(istype(B, /obj/item/organ/borer))
return
if(B && should_have_organ(BP_BRAIN) && !isipc(src))
. = B.traumas
@@ -150,6 +150,13 @@ emp_act
return 1
return 0
/mob/living/carbon/human/proc/check_head_airtight_coverage()
var/list/clothing = list(head, wear_mask, wear_suit)
for(var/obj/item/clothing/C in clothing)
if((C.body_parts_covered & HEAD) && (C.item_flags & (AIRTIGHT|STOPPRESSUREDAMAGE)))
return TRUE
return FALSE
//Used to check if they can be fed food/drinks/pills
/mob/living/carbon/human/proc/check_mouth_coverage()
var/list/protective_gear = list(head, wear_mask, wear_suit, w_uniform)
@@ -154,5 +154,27 @@
return O
/mob/living/carbon/human/proc/awaken_psi_basic(var/source)
var/static/list/psi_operancy_messages = list(
"There's something in your skull!",
"Something is eating your thoughts!",
"You can feel your brain being rewritten!",
"Something is crawling over your frontal lobe!",
"Something is drilling through your skull!",
"Your head feels like it's going to implode!",
"Thousands of ants are tunneling in your head!"
)
to_chat(src, span("danger", "An indescribable, brain-tearing sound hisses from [source], and you collapse in a seizure!"))
seizure()
var/new_latencies = rand(2,4)
var/list/faculties = list(PSI_COERCION, PSI_REDACTION, PSI_ENERGISTICS, PSI_PSYCHOKINESIS)
for(var/i = 1 to new_latencies)
to_chat(src, span("danger", "<font size = 3>[pick(psi_operancy_messages)]</font>"))
set_psi_rank(pick_n_take(faculties), 1)
sleep(30)
psi.update()
sleep(45)
psi.check_latency_trigger(100, source, TRUE)
/mob/living/carbon/human/get_resist_power()
return species.resist_mod
@@ -36,7 +36,7 @@
var/roundstart
/mob/living/simple_animal/borer/roundstart
roundstart = 1
roundstart = TRUE
/mob/living/simple_animal/borer/Login()
..()
@@ -46,50 +46,45 @@
/mob/living/simple_animal/borer/Initialize()
. = ..()
add_language("Cortical Link")
add_language(LANGUAGE_BORER)
add_language(LANGUAGE_BORER_HIVEMIND)
verbs += /mob/living/proc/ventcrawl
verbs += /mob/living/proc/hide
truename = "[pick("Primary","Secondary","Tertiary","Quaternary")] [rand(1000,9999)]"
if(!roundstart) request_player()
truename = "[pick("Primary","Secondary","Tertiary","Quaternary")]-[rand(1000,9999)]"
if(!roundstart)
request_player()
/mob/living/simple_animal/borer/Life()
..()
if(host)
if(!stat && !host.stat)
if(host.reagents.has_reagent("sugar"))
if(!docile)
if(controlling)
to_chat(host, "<span class='notice'>You feel the soporific flow of sugar in your host's blood, lulling you into docility.</span>")
to_chat(host, span("notice", "You feel the soporific flow of sugar in your host's blood, lulling you into docility."))
else
to_chat(src, "<span class='notice'>You feel the soporific flow of sugar in your host's blood, lulling you into docility.</span>")
docile = 1
to_chat(src, span("notice", "You feel the soporific flow of sugar in your host's blood, lulling you into docility."))
docile = TRUE
else
if(docile)
if(controlling)
to_chat(host, "<span class='notice'>You shake off your lethargy as the sugar leaves your host's blood.</span>")
to_chat(host, span("notice", "You shake off your lethargy as the sugar leaves your host's blood."))
else
to_chat(src, "<span class='notice'>You shake off your lethargy as the sugar leaves your host's blood.</span>")
docile = 0
to_chat(src, span("notice", "You shake off your lethargy as the sugar leaves your host's blood."))
docile = FALSE
if(chemicals < 250)
chemicals++
if(controlling)
if(controlling)
if(docile)
to_chat(host, "<span class='notice'>You are feeling far too docile to continue controlling your host...</span>")
to_chat(host, span("notice", "You are feeling far too docile to continue controlling your host..."))
host.release_control()
return
if(prob(5))
host.adjustBrainLoss(rand(1,2), 55)
if(prob(host.getBrainLoss()/20))
host.say("*[pick(list("blink","blink_r","choke","aflap","drool","twitch","twitch_s","gasp"))]")
host.say("*[pick(list("blink","blink_r","choke","drool","twitch","twitch_s","gasp"))]")
/mob/living/simple_animal/borer/Stat()
..()
@@ -100,19 +95,19 @@
if(eta_status)
stat(null, eta_status)
if (client.statpanel == "Status")
if(client.statpanel == "Status")
stat("Chemicals", chemicals)
/mob/living/simple_animal/borer/proc/detatch()
if(!host || !controlling) return
/mob/living/simple_animal/borer/proc/detach()
if(!host || !controlling)
return
if(istype(host,/mob/living/carbon/human))
var/mob/living/carbon/human/H = host
var/obj/item/organ/external/head = H.get_organ(BP_HEAD)
head.implants -= src
controlling = 0
controlling = FALSE
host.remove_language("Cortical Link")
host.verbs -= /mob/living/carbon/proc/release_control
@@ -120,7 +115,6 @@
host.verbs -= /mob/living/carbon/proc/spawn_larvae
if(host_brain)
// these are here so bans and multikey warnings are not triggered on the wrong people when ckey is changed.
// computer_id and IP are not updated magically on their own in offline mobs -walter0o
@@ -155,13 +149,14 @@
qdel(host_brain)
/mob/living/simple_animal/borer/proc/leave_host()
if(!host) return
if(!host)
return
if(host.mind)
borers.clear_indicators(host.mind)
borers.remove_antagonist(host.mind)
src.forceMove(get_turf(host))
forceMove(get_turf(host))
reset_view(null)
machine = null
@@ -180,4 +175,4 @@
G.request_player(src, "A cortical borer needs a player.")
/mob/living/simple_animal/borer/cannot_use_vents()
return
return
@@ -1,26 +1,25 @@
/mob/living/captive_brain
name = "host brain"
real_name = "host brain"
universal_understand = 1
universal_understand = TRUE
/mob/living/captive_brain/say(var/message)
if(istype(src.loc,/mob/living/simple_animal/borer))
message = sanitize(message)
if (!message)
if(!message)
return
log_say("[key_name(src)] : [message]",ckey=key_name(src))
if (stat == 2)
log_say("[key_name(src)] : [message]", ckey=key_name(src))
if(stat == DEAD)
return say_dead(message)
var/mob/living/simple_animal/borer/B = src.loc
to_chat(src, "You whisper silently, \"[message]\"")
to_chat(B.host, "The captive mind of [src] whispers, \"[message]\"")
for (var/mob/M in player_list)
if (istype(M, /mob/abstract/new_player))
for(var/mob/M in player_list)
if(istype(M, /mob/abstract/new_player))
continue
else if(M.stat == 2 && M.client.prefs.toggles & CHAT_GHOSTEARS)
else if(M.stat == DEAD && M.client.prefs.toggles & CHAT_GHOSTEARS)
to_chat(M, "The captive mind of [src] whispers, \"[message]\"")
/mob/living/captive_brain/emote(var/message)
@@ -32,20 +31,21 @@
var/mob/living/simple_animal/borer/B = src.loc
var/mob/living/captive_brain/H = src
to_chat(H, "<span class='danger'>You begin doggedly resisting the parasite's control (this will take approximately sixty seconds).</span>")
to_chat(B.host, "<span class='danger'>You feel the captive mind of [src] begin to resist your control.</span>")
spawn(rand(200,250)+B.host.getBrainLoss())
if(!B || !B.controlling) return
B.host.adjustBrainLoss(rand(5,10), 55)
to_chat(H, "<span class='danger'>With an immense exertion of will, you regain control of your body!</span>")
to_chat(B.host, "<span class='danger'>You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you.</span>")
B.detatch()
verbs -= /mob/living/carbon/proc/release_control
verbs -= /mob/living/carbon/proc/punish_host
verbs -= /mob/living/carbon/proc/spawn_larvae
to_chat(H, span("danger", "You begin doggedly resisting the parasite's control (this will take approximately sixty seconds)."))
to_chat(B.host, span("danger", "You feel the captive mind of [src] begin to resist your control."))
addtimer(CALLBACK(src, .proc/eject_borer, B, H), rand(200, 250) + B.host.getBrainLoss())
return
..()
/mob/living/captive_brain/proc/eject_borer(var/mob/living/simple_animal/borer/borer, var/mob/living/captive_brain/host)
if(!borer?.controlling)
return
to_chat(host, span("danger", "With an immense exertion of will, you regain control of your body!"))
to_chat(borer.host, span("danger", "You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you."))
borer.detach()
verbs -= /mob/living/carbon/proc/release_control
verbs -= /mob/living/carbon/proc/punish_host
verbs -= /mob/living/carbon/proc/spawn_larvae
@@ -1,41 +1,42 @@
/mob/living/simple_animal/borer/verb/release_host()
set category = "Abilities"
set name = "Release Host"
set name = "Exit Host"
set desc = "Slither out of your host."
if(!host)
to_chat(src, "You are not inside a host body.")
to_chat(src, span("notice", "You are not inside a host body."))
return
if(stat)
to_chat(src, span("notice", "You cannot leave your host in your current state."))
return
if(docile)
to_chat(src, span("notice", "You are feeling far too docile to do that."))
return
to_chat(src, span("notice", "You begin disconnecting from [host]'s synapses and prodding at their internal ear canal."))
if(!host.stat)
to_chat(host, span("warning", "An odd, uncomfortable pressure begins to build inside your skull, behind your ear..."))
addtimer(CALLBACK(src, .proc/exit_host), 100)
/mob/living/simple_animal/borer/proc/exit_host()
if(!host || !src)
return
if(stat)
to_chat(src, "You cannot leave your host in your current state.")
to_chat(src, span("notice", "You cannot release your host in your current state."))
return
if(docile)
to_chat(src, "<span class='notice'>You are feeling far too docile to do that.</span>")
return
to_chat(src, span("notice", "You wiggle out of [host]'s ear and plop to the ground."))
if(host.mind)
if(!host.stat)
to_chat(host, span("danger", "Something slimy wiggles out of your ear and plops to the ground!"))
to_chat(host, span("danger", "As though waking from a dream, you shake off the insidious mind control of the brain worm. Your thoughts are your own again."))
to_chat(src, "You begin disconnecting from [host]'s synapses and prodding at their internal ear canal.")
detach()
leave_host()
if(!host.stat)
to_chat(host, "An odd, uncomfortable pressure begins to build inside your skull, behind your ear...")
spawn(100)
if(!host || !src) return
if(src.stat)
to_chat(src, "You cannot release your host in your current state.")
return
to_chat(src, "You wiggle out of [host]'s ear and plop to the ground.")
if(host.mind)
if(!host.stat)
to_chat(host, "<span class='danger'>Something slimy wiggles out of your ear and plops to the ground!</span>")
to_chat(host, "<span class='danger'>As though waking from a dream, you shake off the insidious mind control of the brain worm. Your thoughts are your own again.</span>")
detatch()
leave_host()
/mob/living/simple_animal/borer/verb/infest()
set category = "Abilities"
@@ -43,11 +44,10 @@
set desc = "Infest a suitable humanoid host."
if(host)
to_chat(src, "You are already within a host.")
to_chat(src, span("notice", "You are already within a host."))
return
if(stat)
to_chat(src, "You cannot infest a target in your current state.")
to_chat(src, span("notice", "You cannot infest a target in your current state."))
return
var/list/choices = list()
@@ -56,17 +56,17 @@
choices += C
if(!choices.len)
to_chat(src, "There are no viable hosts within range...")
to_chat(src, span("notice", "There are no viable hosts within range."))
return
var/mob/living/carbon/M = input(src,"Who do you wish to infest?") in null|choices
if(!M || !src) return
if(!(src.Adjacent(M))) return
if(!M || !src)
return
if(!(src.Adjacent(M)))
return
if(M.has_brain_worms())
to_chat(src, "You cannot infest someone who is already infested!")
to_chat(src, span("warning", "You cannot infest someone who is already infested!"))
return
if(istype(M,/mob/living/carbon/human))
@@ -74,38 +74,34 @@
var/obj/item/organ/external/E = H.organs_by_name[BP_HEAD]
if(!E || E.is_stump())
to_chat(src, "\The [H] does not have a head!")
to_chat(src, span("warning", "\The [H] does not have a head!"))
return
if(!H.species.has_organ[BP_BRAIN])
to_chat(src, "\The [H] does not seem to have an ear canal to breach.")
to_chat(src, span("warning", "\The [H] does not seem to have an ear canal to breach."))
return
if(H.isSynthetic())
to_chat(src, "<span class='warning'>You can't affect synthetics.</span>")
to_chat(src, span("notice", "You can't affect synthetics."))
return
if(H.check_head_airtight_coverage())
to_chat(src, span("warning", "You cannot get through that host's protective gear."))
return
if(H.check_head_coverage())
to_chat(src, "You cannot get through that host's protective gear.")
return
to_chat(M, "Something slimy begins probing at the opening of your ear canal...")
to_chat(src, "You slither up [M] and begin probing at their ear canal...")
to_chat(M, span("warning", "Something slimy begins probing at the opening of your ear canal..."))
to_chat(src, span("warning", "You slither up [M] and begin probing at their ear canal..."))
if(!do_after(src,30))
to_chat(src, "As [M] moves away, you are dislodged and fall to the ground.")
to_chat(src, span("warning", "As [M] moves away, you are dislodged and fall to the ground."))
return
if(!M || !src)
return
if(!M || !src) return
if(src.stat)
to_chat(src, "You cannot infest a target in your current state.")
to_chat(src, span("notice", "You cannot infest a target in your current state."))
return
if(M in view(1, src))
to_chat(src, "You wiggle into [M]'s ear.")
to_chat(src, span("notice", "You wiggle into [M]'s ear."))
if(!M.stat)
to_chat(M, "Something disgusting and slimy wiggles into your ear!")
to_chat(M, span("danger", "Something disgusting and slimy wiggles into your ear!"))
src.host = M
src.host.status_flags |= PASSEMOTES
@@ -127,48 +123,43 @@
return
else
to_chat(src, "They are no longer in range!")
to_chat(src, span("warning", "They are no longer in range!"))
return
/mob/living/simple_animal/borer/verb/devour_brain()
set category = "Abilities"
set name = "Devour Brain"
set desc = "Take permanent control of a dead host."
set desc = "Replace the brain of your host by devouring it, forming a husk."
if(!host)
to_chat(src, "You are not inside a host body.")
to_chat(src, span("notice", "You are not inside a host body."))
return
if(stat)
to_chat(src, "You cannot do that in your current state.")
to_chat(src, span("notice", "You cannot do that in your current state."))
return
if(host.stat != 2)
to_chat(src, "Your host is still alive.")
if(host.stat != DEAD)
to_chat(src, span("warning", "Your host is still alive."))
return
if(docile)
to_chat(src, "<span class='notice'>You are feeling far too docile to do that.</span>")
to_chat(src, span("warning", "You are feeling far too docile to do that."))
return
to_chat(src, "<span class = 'danger'>It only takes a few moments to render the dead host brain down into a nutrient-rich slurry...</span>")
to_chat(src, span("danger", "It only takes a few moments to render the dead brain down into a nutrient-rich slurry..."))
replace_brain()
// BRAIN WORM ZOMBIES AAAAH.
/mob/living/simple_animal/borer/proc/replace_brain()
var/mob/living/carbon/human/H = host
if(!istype(host))
to_chat(src, "This host does not have a suitable brain.")
to_chat(src, span("warning", "This host does not have a suitable brain."))
return
to_chat(src, "<span class = 'danger'>You settle into the empty brainpan and begin to expand, fusing inextricably with the dead flesh of [H].</span>")
to_chat(src, span("warning", "You settle into the empty brainpan and begin to expand, fusing inextricably with the dead flesh of [H]."))
H.add_language("Cortical Link")
if(host.stat == 2)
if(host.stat == DEAD)
H.verbs |= /mob/living/carbon/human/proc/jumpstart
H.verbs |= /mob/living/carbon/human/proc/psychic_whisper
@@ -176,14 +167,12 @@
H.verbs |= /mob/living/carbon/proc/spawn_larvae
if(H.client)
H.ghostize(0)
H.ghostize(FALSE)
if(src.mind)
src.mind.special_role = "Borer Husk"
src.mind.transfer_to(host)
H.ChangeToHusk()
var/obj/item/organ/borer/B = new(H)
H.internal_organs_by_name[BP_BRAIN] = B
H.internal_organs |= B
@@ -202,35 +191,37 @@
if(!H.lastKnownIP)
H.lastKnownIP = s2h_ip
// Since the host is dead, we want to kick it back into action immediately, then redo it to ensure they're good to go
H.rejuvenate()
addtimer(CALLBACK(H, .proc/rejuvenate), 30)
/mob/living/simple_animal/borer/verb/secrete_chemicals()
set category = "Abilities"
set name = "Secrete Chemicals"
set desc = "Push some chemicals into your host's bloodstream."
set name = "Secrete Chemicals (20)"
set desc = "Push 5u of chemicals into your host's bloodstream."
if(!host)
to_chat(src, "You are not inside a host body.")
to_chat(src, span("notice", "You are not inside a host body."))
return
if(stat)
to_chat(src, "You cannot secrete chemicals in your current state.")
to_chat(src, span("notice", "You cannot secrete chemicals in your current state."))
return
if(docile)
to_chat(src, "<span class='notice'>You are feeling far too docile to do that.</span>")
to_chat(src, span("notice", "You are feeling far too docile to do that."))
return
if(chemicals < 20)
to_chat(src, span("warning", "You don't have enough chemicals!"))
return
if(chemicals < 50)
to_chat(src, "You don't have enough chemicals!")
var/chem = input("Select a chemical to secrete.", "Chemicals") as null|anything in list("Inaprovaline", "Bicaridine", "Hyperzine", "Synaptizine", "Peridaxon", "Tramadol", "Oxycodone", "Fluvoxamine")
if(!chem || docile || chemicals < 20 || !host || controlling || !src || stat) //Sanity check.
return
var/chem = input("Select a chemical to secrete.", "Chemicals") as null|anything in list("alkysine","bicaridine","hyperzine","tramadol")
if(!chem || docile || chemicals < 50 || !host || controlling || !src || stat) //Sanity check.
return
to_chat(src, "<span class='danger'>You squirt a measure of [chem] from your reservoirs into [host]'s bloodstream.</span>")
host.reagents.add_reagent(chem, 10)
chemicals -= 50
to_chat(src, span("notice", "You squirt a measure of [chem] from your reservoirs into [host]'s bloodstream."))
to_chat(host, span("warning", "You feel cold fluid enter your bloodstream."))
host.reagents.add_reagent(lowertext(chem), 5)
chemicals -= 20
/mob/living/simple_animal/borer/verb/dominate_victim()
set category = "Abilities"
@@ -238,15 +229,13 @@
set desc = "Freeze the limbs of a potential host with supernatural fear."
if(world.time - used_dominate < 150)
to_chat(src, "You cannot use that ability again so soon.")
to_chat(src, span("notice", "You cannot use that ability again so soon."))
return
if(host)
to_chat(src, "You cannot do that from within a host body.")
to_chat(src, span("notice", "You cannot do that from within a host body."))
return
if(src.stat)
to_chat(src, "You cannot do that in your current state.")
to_chat(src, span("notice", "You cannot do that in your current state."))
return
var/list/choices = list()
@@ -255,23 +244,22 @@
choices += C
if(world.time - used_dominate < 150)
to_chat(src, "You cannot use that ability again so soon.")
to_chat(src, span("notice", "You cannot use that ability again so soon."))
return
var/mob/living/carbon/M = input(src,"Who do you wish to dominate?") in null|choices
if(!M || !src) return
if(!M || !src)
return
if(M.isSynthetic())
to_chat(src, "<span class='warning'>You can't affect synthetics.</span>")
to_chat(src, span("warning", "You can't affect synthetics."))
return
if(M.has_brain_worms())
to_chat(src, "You cannot infest someone who is already infested!")
to_chat(src, span("warning", "You cannot infest someone who is already infested!"))
return
to_chat(src, "<span class='warning'>You focus your psychic lance on [M] and freeze their limbs with a wave of terrible dread.</span>")
to_chat(M, "<span class='warning'>You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing.</span>")
to_chat(src, span("warning", "You focus your psionic lance on [M] and freeze their limbs with a wave of terrible dread."))
to_chat(M, span("warning", "You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing."))
M.Weaken(10)
used_dominate = world.time
@@ -282,83 +270,215 @@
set desc = "Fully connect to the brain of your host."
if(!host)
to_chat(src, "You are not inside a host body.")
to_chat(src, span("notice", "You are not inside a host body."))
return
if(src.stat)
to_chat(src, "You cannot do that in your current state.")
to_chat(src, span("notice", "You cannot do that in your current state."))
return
if(docile)
to_chat(src, "<span class='notice'>You are feeling far too docile to do that.</span>")
to_chat(src, span("notice", "You are feeling far too docile to do that."))
return
to_chat(src, "You begin delicately adjusting your connection to the host brain...")
to_chat(src, span("warning", "You begin delicately adjusting your connection to the host brain..."))
to_chat(host, span("warning", "You feel a tingling sensation at the back of your head."))
spawn(100+(host.getBrainLoss()*5))
addtimer(CALLBACK(src, .proc/host_takeover), 100+(host.getBrainLoss()*5))
if(!host || !src || controlling)
return
else
/mob/living/simple_animal/borer/proc/host_takeover()
if(!host || !src || controlling)
return
to_chat(src, "<span class='danger'>You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system.</span>")
to_chat(host, "<span class='danger'>You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours.</span>")
host.add_language("Cortical Link")
to_chat(src, span("danger", "You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system."))
to_chat(host, span("danger", "You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours."))
host.add_language("Cortical Link")
// host -> brain
var/h2b_id = host.computer_id
var/h2b_ip= host.lastKnownIP
host.computer_id = null
host.lastKnownIP = null
// host -> brain
var/h2b_id = host.computer_id
var/h2b_ip= host.lastKnownIP
host.computer_id = null
host.lastKnownIP = null
qdel(host_brain)
host_brain = new(src)
qdel(host_brain)
host_brain = new(src)
host_brain.ckey = host.ckey
host_brain.ckey = host.ckey
host_brain.name = host.name
host_brain.name = host.name
if(!host_brain.computer_id)
host_brain.computer_id = h2b_id
if(!host_brain.computer_id)
host_brain.computer_id = h2b_id
if(!host_brain.lastKnownIP)
host_brain.lastKnownIP = h2b_ip
if(!host_brain.lastKnownIP)
host_brain.lastKnownIP = h2b_ip
// self -> host
var/s2h_id = src.computer_id
var/s2h_ip= src.lastKnownIP
src.computer_id = null
src.lastKnownIP = null
// self -> host
var/s2h_id = src.computer_id
var/s2h_ip= src.lastKnownIP
src.computer_id = null
src.lastKnownIP = null
host.ckey = src.ckey
host.ckey = src.ckey
if(!host.computer_id)
host.computer_id = s2h_id
if(!host.computer_id)
host.computer_id = s2h_id
if(!host.lastKnownIP)
host.lastKnownIP = s2h_ip
if(!host.lastKnownIP)
host.lastKnownIP = s2h_ip
controlling = 1
controlling = TRUE
host.verbs += /mob/living/carbon/proc/release_control
host.verbs += /mob/living/carbon/proc/punish_host
host.verbs += /mob/living/carbon/proc/spawn_larvae
return
host.verbs += /mob/living/carbon/proc/release_control
host.verbs += /mob/living/carbon/proc/punish_host
host.verbs += /mob/living/carbon/proc/spawn_larvae
/mob/living/carbon/human/proc/jumpstart()
set category = "Abilities"
set name = "Revive Host"
set desc = "Send a jolt of electricity through your host, reviving them."
set desc = "Muster all psionic energies to pulse through a dead host, restoring them to a prime state."
if(stat != 2)
to_chat(usr, "Your host is already alive.")
if(stat != DEAD)
to_chat(usr, span("warning", "Your host is already alive."))
return
verbs -= /mob/living/carbon/human/proc/jumpstart
visible_message("<span class='warning'>With a hideous, rattling moan, [src] shudders back to life!</span>")
visible_message(span("warning", "With a hideous, rattling moan, [src] shudders back to life!"))
rejuvenate()
vessel.add_reagent("blood",560-vessel.total_volume)
fixblood()
update_canmove()
update_canmove()
//Brain slug proc for voluntary removal of control.
/mob/living/carbon/proc/release_control()
set category = "Abilities"
set name = "Release Control"
set desc = "Release control of your host's body."
var/mob/living/simple_animal/borer/B = has_brain_worms()
if(B?.host_brain)
to_chat(src, span("warning", "You withdraw your probosci, releasing control of [B.host_brain]"))
B.detach()
verbs -= /mob/living/carbon/proc/release_control
verbs -= /mob/living/carbon/proc/punish_host
verbs -= /mob/living/carbon/proc/spawn_larvae
else
to_chat(src, span("danger", "Something has gone terribly wrong, as your host's brain does not seem to contain you. Make a Github report and ahelp to get out."))
//Brain slug proc for tormenting the host.
/mob/living/carbon/proc/punish_host()
set category = "Abilities"
set name = "Torment host"
set desc = "Punish your host with agony."
var/mob/living/simple_animal/borer/B = has_brain_worms()
if(!B)
return
if(B.host_brain.ckey)
to_chat(src, span("warning", "You send a punishing spike of psionic agony lancing into your host's brain."))
if(!can_feel_pain())
to_chat(B.host_brain, span("warning", "You feel a strange sensation as a foreign influence prods your mind."))
to_chat(src, span("warning", "It doesn't seem to be as effective as you hoped."))
else
to_chat(B.host_brain, span("danger", "<FONT size=3>Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!</FONT>"))
/mob/living/carbon/proc/spawn_larvae()
set category = "Abilities"
set name = "Reproduce (100)"
set desc = "Spawn several young."
var/mob/living/simple_animal/borer/B = has_brain_worms()
if(!B)
return
if(B.chemicals >= 100)
to_chat(src, span("warning", "Your host twitches and quivers as you rapidly excrete a larva from your sluglike body."))
visible_message(span("warning", "[src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!"))
B.chemicals -= 100
B.has_reproduced = TRUE
new /obj/effect/decal/cleanable/vomit(get_turf(src))
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
new /mob/living/simple_animal/borer(get_turf(src))
else
to_chat(src, span("notice", "You do not have enough chemicals stored to reproduce."))
return
/mob/living/simple_animal/borer/verb/awaken_psionics()
set category = "Abilities"
set name = "Awaken Host Psionics (100)"
set desc = "Probe into your host an unlock their psionic potential."
if(!host)
to_chat(src, span("notice", "You are not inside a host body."))
return
if(host.psi)
to_chat(src, span("warning", "Your host is already psionically active!"))
return
if(stat)
to_chat(src, span("notice", "You cannot do that in your current state."))
return
if(docile)
to_chat(src, span("notice", "You are feeling far too docile to do that."))
return
if(chemicals < 100)
to_chat(src, span("warning", "You don't have enough chemicals!"))
return
chemicals -= 100
to_chat(src, span("notice", "You probe your tendrils deep within your host's zona bovinae, seeking to unleash their potential."))
to_chat(host, span("warning", "You feel a burning tingling sensation at the back of your head."))
addtimer(CALLBACK(src, .proc/jumpstart_psi), 100)
/mob/living/simple_animal/borer/proc/jumpstart_psi()
to_chat(src, span("notice", "You succeed in interfacing with the host's zona bovinae, this will be a painful process for them."))
host.awaken_psi_basic("something in your head")
/mob/living/simple_animal/borer/verb/advance_faculty()
set category = "Abilities"
set name = "Advance Psionic Faculty (75)"
set desc = "Advance one of your host's psionic faculties' by one step."
if(!host)
to_chat(src, span("notice", "You are not inside a host body."))
return
if(!host.psi)
to_chat(src, span("warning", "Your host has not been psionically awakened!"))
return
if(stat)
to_chat(src, span("notice", "You cannot do that in your current state."))
return
if(docile)
to_chat(src, span("notice", "You are feeling far too docile to do that."))
return
if(chemicals < 75)
to_chat(src, span("warning", "You don't have enough chemicals!"))
return
var/list/faculties = list(capitalize(PSI_COERCION), capitalize(PSI_REDACTION), capitalize(PSI_ENERGISTICS), capitalize(PSI_PSYCHOKINESIS))
var/selected_faculty = input(src, "Choose a faculty to upgrade.") as null|anything in faculties
if(!selected_faculty)
return
selected_faculty = lowertext(selected_faculty)
if(host.psi.get_rank(selected_faculty) >= PSI_RANK_GRANDMASTER)
to_chat(src, span("notice", "This faculty has already been pushed to the max potential you can achieve!"))
return
chemicals -= 75
to_chat(src, span("notice", "You probe your tendrils deep within your host's zona bovinae, seeking to upgrade their abilities."))
to_chat(host, span("warning", "You feel a burning, tingling sensation at the back of your head..."))
addtimer(CALLBACK(src, .proc/faculty_upgrade, selected_faculty), 100)
/mob/living/simple_animal/borer/proc/faculty_upgrade(var/selected_faculty)
host.psi.set_rank(selected_faculty, host.psi.get_rank(selected_faculty) + 1)
host.psi.update()
to_chat(src, span("notice", "You successfully manage to upgrade your host's [selected_faculty] faculty."))
to_chat(host, span("good", "A breeze of fresh air washes over your mind, you feel powerful!"))
to_chat(host, span("notice", "You have been psionically enlightened. You are now a [psychic_ranks_to_strings[host.psi.ranks[selected_faculty]]] in the [selected_faculty] faculty."))
@@ -1,35 +1,48 @@
/mob/living/simple_animal/borer/say(var/message)
message = sanitize(message)
message = capitalize(message)
if(!message)
return
if (stat == 2)
if(stat == DEAD)
return say_dead(message)
if (stat)
if(stat)
return
if (copytext(message, 1, 2) == "*")
var/static/list/correct_punctuation = list("!" = TRUE, "." = TRUE, "?" = TRUE, "-" = TRUE, "~" = TRUE, "*" = TRUE, "/" = TRUE, ">" = TRUE, "\"" = TRUE, "'" = TRUE, "," = TRUE, ":" = TRUE, ";" = TRUE)
var/ending = copytext(message, length(message), (length(message) + 1))
if(ending && !correct_punctuation[ending])
message += "."
if(copytext(message, 1, 2) == "*")
return emote(copytext(message, 2))
var/datum/language/L = parse_language(message)
if(L && L.flags & HIVEMIND)
L.broadcast(src,trim(copytext(message,3)),src.truename)
if(L?.flags & HIVEMIND)
L.broadcast(src, trim(copytext(message,3)), src.truename)
return
if(!host)
//TODO: have this pick a random mob within 3 tiles to speak for the borer.
to_chat(src, "You have no host to speak to.")
return //No host, no audible speech.
var/list/viable_sayers = list()
for(var/mob/living/carbon/human/H in range(3, src))
if(H.stat)
continue
viable_sayers += H
if(!length(viable_sayers))
to_chat(src, span("notice", "There are no viable hosts to speak with."))
else
var/mob/living/carbon/human/chosen_sayer = pick(viable_sayers)
log_say("[key_name(src)] : ([name]) [message]", ckey=key_name(src))
chosen_sayer.say(message)
return
to_chat(src, "You drop words into [host]'s mind: \"[message]\"")
to_chat(host, "Your own thoughts speak: \"[message]\"")
for (var/mob/M in player_list)
if (istype(M, /mob/abstract/new_player))
for(var/mob/M in player_list)
if(istype(M, /mob/abstract/new_player))
continue
else if(M.stat == 2 && M.client.prefs.toggles & CHAT_GHOSTEARS)
else if(M.stat == DEAD && M.client.prefs.toggles & CHAT_GHOSTEARS)
to_chat(M, "[src.truename] whispers to [host], \"[message]\"")
+1 -1
View File
@@ -52,7 +52,7 @@
var/mob/living/simple_animal/borer/borer = owner.has_brain_worms()
if(borer)
borer.detatch() //Should remove borer if the brain is removed - RR
borer.detach() //Should remove borer if the brain is removed - RR
var/obj/item/organ/internal/brain/B = src
if(istype(B) && istype(owner))
+3 -27
View File
@@ -1,26 +1,4 @@
//CORTICAL BORER ORGANS.
/obj/item/organ/borer/process()
// Borer husks regenerate health, feel no pain, and are resistant to stuns and brainloss.
for(var/chem in list("tricordrazine","tramadol","hyperzine","alkysine"))
if(owner.reagents.get_reagent_amount(chem) < 3)
owner.reagents.add_reagent(chem, 5)
// They're also super gross and ooze ichor.
if(prob(5))
var/mob/living/carbon/human/H = owner
if(!istype(H))
return
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in H.vessel.reagent_list
blood_splatter(H,B,1)
var/obj/effect/decal/cleanable/blood/splatter/goo = locate() in get_turf(owner)
if(goo)
goo.name = "husk ichor"
goo.desc = "It's thick and stinks of decay."
goo.basecolor = "#412464"
goo.update_icon()
// This borer is the worm that replaced the host's brain, not the brainworm latched onto a brain
/obj/item/organ/borer
name = "cortical borer"
icon = 'icons/obj/objects.dmi'
@@ -28,10 +6,9 @@
organ_tag = BP_BRAIN
desc = "A disgusting space slug."
parent_organ = BP_HEAD
vital = 1
vital = TRUE
/obj/item/organ/borer/removed(var/mob/living/user)
..()
var/mob/living/simple_animal/borer/B = owner.has_brain_worms()
@@ -39,8 +16,7 @@
B.leave_host()
B.ckey = owner.ckey
spawn(0)
qdel(src)
qdel(src)
//VOX ORGANS.
/obj/item/organ/internal/stack
+1 -1
View File
@@ -287,7 +287,7 @@
use_description = "Activate an empty hand on disarm intent to detect nearby psionic signatures."
/datum/psionic_power/coercion/psiping/invoke(var/mob/living/user, var/mob/living/target)
if((target && user != target) && user.a_intent != I_HELP)
if((target && user != target) || user.a_intent != I_HELP)
return FALSE
. = ..()
if(.)
@@ -37,11 +37,11 @@
cost = 5
cooldown = 10
min_rank = PSI_RANK_MASTER
use_description = "Click on or otherwise activate an empty hand while on help intent to manifest a psychokinetic tool. Use it in-hand to switch between tool types."
use_description = "Click on or otherwise activate an empty hand while on grab intent to manifest a psychokinetic tool. Use it in-hand to switch between tool types."
admin_log = FALSE
/datum/psionic_power/psychokinesis/tinker/invoke(var/mob/living/user, var/mob/living/target)
if((target && user != target) || user.a_intent != I_HELP)
if((target && user != target) || user.a_intent != I_GRAB)
return FALSE
. = ..()
if(.)
+1 -1
View File
@@ -197,7 +197,7 @@
var/mob/living/simple_animal/borer/worm = obj
if(worm.controlling)
target.release_control()
worm.detatch()
worm.detach()
worm.leave_host()
playsound(target.loc, 'sound/effects/squelch1.ogg', 50, 1)