mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-22 04:22:39 +01:00
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:
@@ -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
|
||||
|
||||
@@ -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]\"")
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(.)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user