(EXPERIMENTAL) Memetic Anomaly (#340)

An extensive project, trying to bring this to a functional state.
This commit is contained in:
Lord Lag
2016-05-30 23:24:35 +03:00
committed by skull132
parent 4c225f8bd8
commit 8a465a9dea
7 changed files with 800 additions and 10 deletions
+10 -10
View File
@@ -6,14 +6,14 @@
name = "Memetic Anomaly"
config_tag = "meme"
required_players = 3
restricted_jobs = list("AI", "Cyborg")
recommended_enemies = 2 // need at least a meme and a host
//restricted_jobs = list("AI", "Cyborg")
//recommended_enemies = 2 // need at least a meme and a host
votable = 0 // temporarily disable this mode for voting
end_on_antag_death = 1
var/var/list/datum/mind/first_hosts = list()
var/var/list/assigned_hosts = list()
/* no objectives
var/const/prob_int_murder_target = 50 // intercept names the assassination target half the time
var/const/prob_right_murder_target_l = 25 // lower bound on probability of naming right assassination target
var/const/prob_right_murder_target_h = 50 // upper bound on probability of naimg the right assassination target
@@ -30,9 +30,9 @@
var/const/prob_right_killer_h = 50 //upper bound on probability of naming the right operative
var/const/prob_right_objective_l = 25 //lower bound on probability of determining the objective correctly
var/const/prob_right_objective_h = 50 //upper bound on probability of determining the objective correctly
var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
*/
//var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
//var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
/datum/game_mode/meme/announce()
world << "<B>The current game mode is - Meme!</B>"
@@ -44,7 +44,7 @@
// for every 10 players, get 1 meme, and for each meme, get a host
// also make sure that there's at least one meme and one host
recommended_enemies = max(src.num_players() / 20 * 2, 2)
//recommended_enemies = max(src.num_players() / 20 * 2, 2)
var/list/datum/mind/possible_memes = get_players_for_role(BE_MEME)
@@ -90,7 +90,7 @@
first_host = pick(first_hosts)
first_hosts.Remove(first_host)
M.enter_host(first_host.current)
forge_meme_objectives(meme, first_host)
//forge_meme_objectives(meme, first_host)
qdel(original)
@@ -101,7 +101,7 @@
..()
return
/* no objectives
/datum/game_mode/proc/forge_meme_objectives(var/datum/mind/meme, var/datum/mind/first_host)
if (config.objectives_disabled)
return
@@ -122,7 +122,7 @@
greet_meme(meme)
return
*/
/datum/game_mode/proc/greet_meme(var/datum/mind/meme, var/you_are=1)
if (you_are)
meme.current << "<B>\red You are a meme!</B>"
+1
View File
@@ -173,6 +173,7 @@ proc/admin_notice(var/message, var/rights)
<A href='?src=\ref[src];simplemake=constructbuilder;mob=\ref[M]'>Builder</A> ,
<A href='?src=\ref[src];simplemake=constructwraith;mob=\ref[M]'>Wraith</A> \]
<A href='?src=\ref[src];simplemake=shade;mob=\ref[M]'>Shade</A>
<A href='?src=\ref[src];simplemake=meme;mob=\ref[M]'>Meme</A>
<br>
"}
body += {"<br><br>
+19
View File
@@ -307,7 +307,26 @@
if("constructbuilder") M.change_mob_type( /mob/living/simple_animal/construct/builder , null, null, delmob )
if("constructwraith") M.change_mob_type( /mob/living/simple_animal/construct/wraith , null, null, delmob )
if("shade") M.change_mob_type( /mob/living/simple_animal/shade , null, null, delmob )
if("meme")
var/mob/living/parasite/meme/newmeme = new
M.mind.transfer_to(newmeme)
newmeme.clearHUD()
var/found = 0
for(var/mob/living/carbon/human/H in world) if(H.client && !H.parasites.len)
found = 1
newmeme.enter_host(H)
message_admins("[H] has become [newmeme.key]'s host")
break
// if there was no host, abort
if(!found)
newmeme.mind.transfer_to(M)
message_admins("Failed to find host for meme [M.key]. Aborting.")
qdel(M)
/////////////////////////////////////new ban stuff
else if(href_list["unbanf"])
+702
View File
@@ -0,0 +1,702 @@
// === MEMETIC ANOMALY ===
// =======================
//Taken from ancient baystation code- LL
/**
This life form is a form of parasite that can gain a certain level of control
over its host. Its player will share vision and hearing with the host, and it'll
be able to influence the host through various commands.
**/
// The maximum amount of points a meme can gather.
var/global/const/MAXIMUM_MEME_POINTS = 750
var/global/const/MINIMUM_MEME_POINTS = 0
var/mob/living/parasite/host_brain
var/controlling
// === PARASITE ===
// ================
// a list of all the parasites in the mob
/mob/living/carbon/var/list/parasites = list()
/mob/living/parasite
var
mob/living/carbon/host // the host that this parasite occupies
Login()
..()
// make the client see through the host instead
client.eye = host
client.perspective = EYE_PERSPECTIVE
/mob/living/parasite/proc/enter_host(mob/living/carbon/host)
// by default, parasites can't share a body with other life forms
if(host.parasites.len > 0)
return 0
src.host = host
src.loc = host
host.parasites.Add(src)
if(client) client.eye = host
return 1
/mob/living/parasite/proc/exit_host()
src.host.parasites.Remove(src)
src.host = null
src.loc = null
return 1
// === MEME ===
// ============
// Memes use points for many actions
/mob/living/parasite/meme/var/meme_points = 100
/mob/living/parasite/meme/var/dormant = 0
/mob/living/parasite/meme/var/possessing = 0
// Memes have a list of indoctrinated hosts
/mob/living/parasite/meme/var/list/indoctrinated = list()
/mob/living/parasite/meme/Life()
..()
if(client)
if(blinded) client.eye = null
else client.eye = host
if(!host) return
if(possessing == 1 && meme_points == 0)
detatch()
// recover meme points slowly
var/gain = 3
if(dormant) gain = 9 // dormant recovers points faster
//if(possessing) meme_points = min(meme_points - loss, MAXIMUM_MEME_POINTS)
meme_points = min(meme_points + gain, MAXIMUM_MEME_POINTS)
if(possessing == 1) meme_points = min(meme_points - gain, MINIMUM_MEME_POINTS)
if(possessing == 0) meme_points = min(meme_points + gain, MAXIMUM_MEME_POINTS)
// if there are sleep toxins in the host's body, that's bad
if(host.reagents.has_reagent("stoxin"))
src << "\red <b>Something in your host's blood makes you lose consciousness.. you fade away..</b>"
src.death()
return
// a host without brain is no good
if(!host.mind)
src << "\red <b>Your host has no mind.. you fade away..</b>"
src.death()
return
if(host.stat == 2)
src << "\red <b>Your host has died.. you fade away..</b>"
src.death()
return
if(host.blinded && host.stat != 1) src.blinded = 1
else src.blinded = 0
if(possessing == 1 && meme_points == 0)
detatch()
/mob/living/parasite/meme/death()
// make sure the mob is on the actual map before gibbing
if(host) src.loc = host.loc
src.stat = 2
..()
del src
// When a meme speaks, it speaks through its host
/mob/living/parasite/meme/say(message as text)
if(dormant)
usr << "\red You're dormant!"
return
if(!host)
usr << "\red You can't speak without host!"
return
return host.say(message)
// Same as speak, just with whisper
/mob/living/parasite/meme/whisper(message as text)
if(dormant)
usr << "\red You're dormant!"
return
if(!host)
usr << "\red You can't speak without host!"
return
return host.whisper(message)
// Make the host do things
/mob/living/parasite/meme/me_verb(message as text)
set name = "Me"
if(dormant)
usr << "\red You're dormant!"
return
if(!host)
usr << "\red You can't emote without host!"
return
return host.me_verb(message)
// A meme understands everything their host understands
/mob/living/parasite/meme/say_understands(mob/other)
if(!host) return 0
return host.say_understands(other)
// Try to use amount points, return 1 if successful
/mob/living/parasite/meme/proc/use_points(amount)
if(dormant)
usr << "\red You're dormant!"
return
if(src.meme_points < amount)
src << "<b>* You don't have enough meme points(need [amount]).</b>"
return 0
src.meme_points -= round(amount)
return 1
// Let the meme choose one of his indoctrinated mobs as target
/mob/living/parasite/meme/proc/select_indoctrinated(var/title, var/message)
var/list/candidates
// Can only affect other mobs thant he host if not blinded
if(blinded)
candidates = list()
src << "\red You are blinded, so you can not affect mobs other than your host."
else
candidates = indoctrinated.Copy()
candidates.Add(src.host)
var/mob/target = null
if(candidates.len == 1)
target = candidates[1]
else
var/selected
var/list/text_candidates = list()
var/list/map_text_to_mob = list()
for(var/mob/living/carbon/human/M in candidates)
text_candidates += M.real_name
map_text_to_mob[M.real_name] = M
selected = input(message,title) as null|anything in text_candidates
if(!selected) return null
target = map_text_to_mob[selected]
return target
// A meme can make people hear things with the thought ability
/mob/living/parasite/meme/verb/Thought()
set category = "Meme"
set name = "Thought(150)"
set desc = "Implants a thought into the target, making them think they heard someone talk."
if(meme_points < 150)
// just call use_points() to give the standard failure message
use_points(150)
return
var/list/candidates = indoctrinated.Copy()
if(!(src.host in candidates))
candidates.Add(src.host)
var/mob/target = select_indoctrinated("Thought", "Select a target which will hear your thought.")
if(!target) return
var/speaker = input("Select the voice in which you would like to make yourself heard.", "Voice") as text
//if(!speaker) return
var/message = input("What would you like to say?", "Message") as text
if(!message) return
// Use the points at the end rather than the beginning, because the user might cancel
if(!use_points(150)) return
message = say_quote(message)
var/rendered = "<span class='game say'><span class='name'>[speaker]</span> <span class='message'>[message]</span></span>"
target.show_message(rendered)
usr << "<i>You make [target] hear:</i> [rendered]"
// Mutes the host
/mob/living/parasite/meme/verb/Mute()
set category = "Meme"
set name = "Mute(250)"
set desc = "Prevents your host from talking for a while."
if(!src.host) return
/*if(!host.silent)
usr << "\red Your host already can't speak.."
return*/
if(!use_points(250)) return
spawn
// backup the host incase we switch hosts after using the verb
//var/mob/host = src.host
host << "\red Your tongue feels numb.. You lose your ability to speak."
usr << "\red Your host can't speak anymore."
host.silent += 60
sleep(1200)
host << "\red Your tongue has feeling again.."
usr << "\red [host] can speak again."
// Makes the host unable to emote
/mob/living/parasite/meme/verb/Paralyze()
set category = "Meme"
set name = "Paralyze(250)"
set desc = "Prevents your host from using emote for a while."
if(!src.host) return
/*if(!host.Weaken())
usr << "\red Your host already can't use body language.."
return*/
if(!use_points(250)) return
spawn
// backup the host incase we switch hosts after using the verb
var/mob/host = src.host
host << "\red Your body feels numb.. You lose your ability to use body language."
usr << "\red Your host can't use body language anymore."
host.Weaken(60)
sleep(1200)
host << "\red Your body has feeling again.."
usr << "\red [host] can use body language again."
// Cause great agony with the host, used for conditioning the host
/mob/living/parasite/meme/verb/Agony()
set category = "Meme"
set name = "Agony(200)"
set desc = "Causes significant pain in your host."
if(!src.host) return
if(!use_points(200)) return
spawn
// backup the host incase we switch hosts after using the verb
var/mob/host = src.host
host.paralysis = max(host.paralysis, 2)
host.flash_weak_pain()
host << "\red <font size=5>You feel excrutiating pain all over your body! It is so bad you can't think or articulate yourself properly..</font>"
usr << "<b>You send a jolt of agonizing pain through [host], they should be unable to concentrate on anything else for half a minute.</b>"
host.emote("scream")
for(var/i=0, i<10, i++)
host.stuttering = 2
sleep(50)
if(prob(80)) host.flash_weak_pain()
if(prob(10)) host.paralysis = max(host.paralysis, 2)
if(prob(15)) host.emote("twitch")
else if(prob(15)) host.emote("scream")
else if(prob(10)) host.emote("collapse")
if(i == 10)
host << "\red THE PAIN! AGHH, THE PAIN! MAKE IT STOP! ANYTHING TO MAKE IT STOP!"
host << "\red The pain subsides.."
// Cause great joy with the host, used for conditioning the host
/mob/living/parasite/meme/verb/Joy()
set category = "Meme"
set name = "Joy(200)"
set desc = "Causes significant joy in your host."
if(!src.host) return
if(!use_points(200)) return
spawn
var/mob/host = src.host
host.druggy = max(host.druggy, 50)
host.slurring = max(host.slurring, 10)
usr << "<b>You stimulate [host.name]'s brain, injecting waves of endorphines and dopamine into the tissue. They should now forget all their worries, particularly relating to you, for around a minute."
host << "\red You are feeling wonderful! Your head is numb and drowsy, and you can't help forgetting all the worries in the world."
while(host.druggy > 0)
sleep(10)
host << "\red You are feeling clear-headed again.."
// Cause the target to hallucinate.
/mob/living/parasite/meme/verb/Hallucinate(mob/living/carbon/human/target as mob in world)
set category = "Meme"
set name = "Hallucinate(300)"
set desc = "Makes your host hallucinate, has a short delay."
if(!istype(target, /mob/living/carbon/human) || !target.mind)
src << "<b>You can't remotely ruin this ones mind.</b>"
return
if(!(target in view(host)))
src << "<b>You need to make eye-contact with the target.</b>"
return
if(!(target in indoctrinated))
src << "<b>You need to attune the target first.</b>"
return
if(!target) return
if(!use_points(300)) return
spawn(rand(300,600))
if(target) target.hallucination += 400
usr << "<b>You make [target] hallucinate.</b>"
// Jump to a closeby target through a whisper
/mob/living/parasite/meme/verb/SubtleJump(mob/living/carbon/human/target as mob in world)
set category = "Meme"
set name = "Subtle Jump(350)"
set desc = "Move to a closeby human through a whisper."
if(!istype(target, /mob/living/carbon/human) || !target.mind)
src << "<b>You can't jump to this creature..</b>"
return
if(!(target in view(1, host)+src))
src << "<b>The target is not close enough.</b>"
return
// Find out whether we can speak
if (host.silent || (host.disabilities & 64))
src << "<b>Your host can't speak..</b>"
return
if(!use_points(350)) return
for(var/mob/M in view(1, host))
M.show_message("<B>[host]</B> whispers something incoherent.",2) // 2 stands for hearable message
// Find out whether the target can hear
if(target.disabilities & 32 || target.ear_deaf)
src << "<b>Your target doesn't seem to hear you..</b>"
return
if(target.parasites.len > 0)
src << "<b>Your target already is possessed by something..</b>"
return
src.exit_host()
src.enter_host(target)
usr << "<b>You successfully jumped to [target]."
log_admin("[src.key] has jumped to [target]")
message_admins("[src.key] has jumped to [target]")
// Jump to a distant target through a shout
/mob/living/parasite/meme/verb/ObviousJump(mob/living/carbon/human/target as mob in world)
set category = "Meme"
set name = "Obvious Jump(750)"
set desc = "Move to any mob in view through a shout."
if(!istype(target, /mob/living/carbon/human) || !target.mind)
src << "<b>You can't jump to this creature..</b>"
return
if(!(target in view(host)))
src << "<b>The target is not close enough.</b>"
return
// Find out whether we can speak
if (host.silent || (host.disabilities & 64))
src << "<b>Your host can't speak..</b>"
return
if(!use_points(750)) return
for(var/mob/M in view(host)+src)
M.show_message("<B>[host]</B> screams something incoherent!",2) // 2 stands for hearable message
// Find out whether the target can hear
if(target.disabilities & 32 || target.ear_deaf)
src << "<b>Your target doesn't seem to hear you..</b>"
return
if(target.parasites.len > 0)
src << "<b>Your target already is possessed by something..</b>"
return
src.exit_host()
src.enter_host(target)
usr << "<b>You successfully jumped to [target]."
log_admin("[src.key] has jumped to [target]")
message_admins("[src.key] has jumped to [target]")
// Jump to an attuned mob for free
/mob/living/parasite/meme/verb/AttunedJump(mob/living/carbon/human/target as mob in world)
set category = "Meme"
set name = "Attuned Jump(0)"
set desc = "Move to a mob in sight that you have already attuned."
if(!istype(target, /mob/living/carbon/human) || !target.mind)
src << "<b>You can't jump to this creature..</b>"
return
if(!(target in view(host)))
src << "<b>You need to make eye-contact with the target.</b>"
return
if(!(target in indoctrinated))
src << "<b>You need to attune the target first.</b>"
return
src.exit_host()
src.enter_host(target)
usr << "<b>You successfully jumped to [target]."
log_admin("[src.key] has jumped to [target]")
message_admins("[src.key] has jumped to [target]")
// ATTUNE a mob, adding it to the indoctrinated list
/mob/living/parasite/meme/verb/Attune()
set category = "Meme"
set name = "Attune(400)"
set desc = "Change the host's brain structure, making it easier for you to manipulate him."
if(host in src.indoctrinated)
usr << "<b>You have already attuned this host.</b>"
return
if(!host) return
if(!use_points(400)) return
src.indoctrinated.Add(host)
usr << "<b>You successfully indoctrinated [host]."
host << "\red Your head feels a bit roomier.."
log_admin("[src.key] has attuned [host]")
message_admins("[src.key] has attuned [host]")
// Enables the mob to take a lot more damage
/mob/living/parasite/meme/verb/Analgesic()
set category = "Meme"
set name = "Analgesic(500)"
set desc = "Combat drug that allows the host to move normally, even under life-threatening pain."
if(!host) return
if(!(host in indoctrinated))
usr << "\red You need to attune the host first."
return
if(!use_points(500)) return
usr << "<b>You inject drugs into [host]."
host << "\red You feel your body strengthen and your pain subside.."
host.analgesic = 60
while(host.analgesic > 0)
sleep(60)
host << "\red The dizziness wears off, and you can feel pain again.."
/mob/proc/clearHUD()
//update_clothing()
if(client) client.screen.Cut()
// Take control of the mob
/mob/living/parasite/meme/verb/Possession()
set category = "Meme"
set name = "Possession(500)"
set desc = "Take direct control of the host for a while."
if(!use_points(500)) return
if(!host)
src << "You have discovered a severe bug - NO HOST. CONTACT DEVELOPER."
return
if(src.stat)
src << "You cannot do that in your current state."
return
src << "You begin assuming direct control..."
spawn()
if(!host || !src || controlling)
return
else
src << "\red <B>You shroud your hosts brain, assuming control</B>"
host << "\red <B>You can feel thoughts that arent your own begin to dictate your body's actions.</B>"
// 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)
host_brain.ckey = host.ckey
host_brain.name = host.name
if(!host_brain.computer_id)
host_brain.computer_id = h2b_id
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
host.ckey = src.ckey
if(!host.computer_id)
host.computer_id = s2h_id
if(!host.lastKnownIP)
host.lastKnownIP = s2h_ip
controlling = 1
possessing = 1
host.verbs += /mob/living/parasite/meme/proc/release_control
return
/mob/living/parasite/meme/proc/release_control()
set category = "Meme"
set name = "Release Control"
set desc = "Release control of your host's body."
//var/mob/living/parasite/meme/ME = has_brain_worms() god fucking dammit
/*
if(ME && host_brain)
src << "\red <B>You retract, releasing control of [host_brain]</B>"
*/
detatch()
verbs -= /mob/living/parasite/meme/proc/release_control
/*
else ALL THE FUCKING CODING SCAFFOLDING
src << "\red <B>ERROR NO MEME DETECTED IN THIS MOB, THIS IS A BUG !</B>"
*/
/mob/living/parasite/meme/proc/detatch()
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("head")
head.implants -= src
controlling = 0
possessing = 0
host.verbs -= /mob/living/parasite/meme/proc/release_control
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
// host -> self
var/h2s_id = host.computer_id
var/h2s_ip= host.lastKnownIP
host.computer_id = null
host.lastKnownIP = null
src.ckey = host.ckey
if(!src.computer_id)
src.computer_id = h2s_id
if(!host_brain.lastKnownIP)
src.lastKnownIP = h2s_ip
// brain -> host
var/b2h_id = host_brain.computer_id
var/b2h_ip= host_brain.lastKnownIP
host_brain.computer_id = null
host_brain.lastKnownIP = null
host.ckey = host_brain.ckey
if(!host.computer_id)
host.computer_id = b2h_id
if(!host.lastKnownIP)
host.lastKnownIP = b2h_ip
qdel(host_brain)
// Enter dormant mode, increases meme point gain
/mob/living/parasite/meme/verb/Dormant()
set category = "Meme"
set name = "Dormant(100)"
set desc = "Speed up point recharging, will force you to cease all actions until all points are recharged."
if(!host) return
if(!use_points(100)) return
usr << "<b>You enter dormant mode.. You won't be able to take action until all your points have recharged.</b>"
dormant = 1
while(meme_points < MAXIMUM_MEME_POINTS)
sleep(10)
dormant = 0
usr << "\red You have regained all points and exited dormant mode!"
/mob/living/parasite/meme/verb/Show_Points()
set category = "Meme"
usr << "<b>Meme Points: [src.meme_points]/[MAXIMUM_MEME_POINTS]</b>"
// Stat panel to show meme points, copypasted from alien
/mob/living/parasite/meme/Stat()
..()
statpanel("Status")
if (client && client.holder)
stat(null, "([x], [y], [z])")
if (client && client.statpanel == "Status")
stat(null, "Meme Points: [src.meme_points]")
/*
// Game mode helpers, used for theft objectives-NOT USED, NO OBJECTIVES
// --------------------------------------------
/mob/living/parasite/check_contents_for(t)
if(!host) return 0
return host.check_contents_for(t)
/mob/living/parasite/check_contents_for_reagent(t)
if(!host) return 0
return host.check_contents_for_reagent(t)
*/
@@ -0,0 +1,60 @@
/mob/living/parasite/captive_brain
name = "host brain"
real_name = "host brain"
universal_understand = 1
/mob/living/parasite/captive_brain/say(var/message)
if (src.client)
if(client.prefs.muted & MUTE_IC)
src << "\red You cannot speak in IC (muted)."
return
if (src.client.handle_spam_prevention(message,MUTE_IC))
return
if(istype(src.loc,/mob/living/parasite/meme))
message = sanitize(message)
if (!message)
return
log_say("[key_name(src)] : [message]")
if (stat == 2)
return say_dead(message)
var/mob/living/parasite/meme/ME = src.loc
src << "You whisper silently, \"[message]\""
ME.host << "The captive mind of [src] whispers, \"[message]\""
for (var/mob/M in player_list)
if (istype(M, /mob/new_player))
continue
else if(M.stat == 2 && M.client.prefs.toggles & CHAT_GHOSTEARS)
M << "The captive mind of [src] whispers, \"[message]\""
/mob/living/parasite/captive_brain/emote(var/message)
return
/* In the event we want to add the ability to resist, its here.
/mob/living/parasite/captive_brain/process_resist()
//Resisting control by an alien mind.
if(istype(src.loc,/mob/living/simple_animal/borer))
var/mob/living/simple_animal/borer/B = src.loc
var/mob/living/captive_brain/H = src
H << "<span class='danger'>You begin doggedly resisting the parasite's control (this will take approximately sixty seconds).</span>"
B.host << "<span class='danger'>You feel the captive mind of [src] begin to resist your control.</span>"
spawn(rand(200,250)+B.host.brainloss)
if(!B || !B.controlling) return
B.host.adjustBrainLoss(rand(5,10))
H << "<span class='danger'>With an immense exertion of will, you regain control of your body!</span>"
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
return
..()
*/