Enhances borers in various ways

- Adds a silent means of two-way conversation between borers and their
  hosts - the borer must make first contact, to avoid spoiling their
  presence

- Borers will now be unable to talk out loud while inside a host, by default -
  they can toggle this with a verb. Borer speech is unaffected.

- Borers will now properly detach from host control upon the death of the
  host

- Borers will now triple their reagent production while sedated by sugar

- Borers infesting and hiding is now silent
This commit is contained in:
Crazylemon64
2016-02-16 01:48:04 -08:00
parent 0ea630f18a
commit 6a75ede14d
3 changed files with 191 additions and 99 deletions
+186 -32
View File
@@ -60,6 +60,7 @@
pass_flags = PASSTABLE
ventcrawler = 2
var/talk_inside_host = 0 // So that borers don't accidentally give themselves away on a botched message
var/used_dominate
var/chemicals = 10 // Chemicals used for reproduction and spitting neurotoxin.
var/mob/living/carbon/human/host // Human host for the brain worm.
@@ -67,6 +68,83 @@
var/mob/living/captive_brain/host_brain // Used for swapping control of the body back and forth.
var/controlling // Used in human death check.
var/docile = 0 // Sugar can stop borers from acting.
var/list/borer_injection_chems = list("mannitol","salglu_solution","methamphetamine", "hydrocodone", "spaceacillin", "mitocholide", "charcoal", "salbutamol", "capulettium_plus")
/mob/living/simple_animal/borer/verb/Communicate()
set category = "Borer"
set name = "Converse with Host"
set desc = "Send a silent message to your host."
if(!host)
src << "You do not have a host to communicate with!"
return
var/input = stripped_input(src, "Please enter a message to tell your host.", "Borer", "")
if(!input) return
var/say_string = (docile) ? "slurs" :"states"
if(host)
host << "<span class='changeling'><i>[src.truename] [say_string]:</i> [input]</span>"
log_say("Borer Communication: [key_name(src)] -> [key_name(host)] : [input]")
for(var/M in dead_mob_list)
if(istype(M, /mob/dead/observer))
M << "<span class='changeling'><i>Borer Communication from <b>[src.truename]</b> ([ghost_follow_link(src, ghost=M)]): [input]</i>"
src << "<span class='changeling'><i>[src.truename] [say_string]:</i> [input]</span>"
host.verbs += /mob/living/proc/borer_comm
/mob/living/simple_animal/borer/verb/toggle_silence_inside_host()
set name = "Toggle speech inside Host"
set category = "Borer"
set desc = "Toggle whether you will be able to say audible messages while inside your host."
if(talk_inside_host)
talk_inside_host = 0
src << "<span class='notice'>You will no longer talk audibly while inside a host.</span>"
else
talk_inside_host = 1
src << "<span class='notice'>You will now be able to audibly speak from inside of a host.</span>"
/mob/living/proc/borer_comm()
set name = "Converse with Borer"
set category = "Borer"
set desc = "Communicate mentally with your borer."
var/mob/living/simple_animal/borer/B = src.has_brain_worms()
if(!B)
return
var/input = stripped_input(src, "Please enter a message to tell the borer.", "Message", "")
if(!input) return
B << "<span class='changeling'><i>[src] says:</i> [input]</span>"
log_say("Borer Communication: [key_name(src)] -> [key_name(B)] : [input]")
for(var/M in dead_mob_list)
if(istype(M, /mob/dead/observer))
M << "<span class='changeling'><i>Borer Communication from <b>[src]</b> ([ghost_follow_link(src, ghost=M)]): [input]</i>"
src << "<span class='changeling'><i>[src] says:</i> [input]</span>"
/mob/living/proc/trapped_mind_comm()
set name = "Converse with Trapped Mind"
set category = "Borer"
set desc = "Communicate mentally with the trapped mind of your host."
var/mob/living/simple_animal/borer/B = src.has_brain_worms()
if(!B || !B.host_brain)
return
var/mob/living/captive_brain/CB = B.host_brain
var/input = stripped_input(src, "Please enter a message to tell the trapped mind.", "Message", "")
if(!input) return
CB << "<span class='changeling'><i>[B.truename] says:</i> [input]</span>"
log_say("Borer Communication: [key_name(src)] -> [key_name(B)] : [input]")
for(var/M in dead_mob_list)
if(istype(M, /mob/dead/observer))
M << "<span class='changeling'><i>Borer Communication from <b>[src]</b> ([ghost_follow_link(src, ghost=M)]): [input]</i>"
src << "<span class='changeling'><i>[B.truename] says:</i> [input]</span>"
/mob/living/simple_animal/borer/Life()
@@ -92,7 +170,10 @@
docile = 0
if(chemicals < 250)
chemicals++
if(docile)
chemicals += 3
else
chemicals++
if(controlling)
if(docile)
@@ -109,11 +190,16 @@
/mob/living/simple_animal/borer/New(var/by_gamemode=0)
..()
add_language("Cortical Link")
truename = "[pick("Primary","Secondary","Tertiary","Quaternary")] [rand(1000,9999)]"
updatename()
if(!by_gamemode)
request_player()
/mob/living/simple_animal/borer/proc/updatename()
var/index_num = rand(1000,9999)
real_name = "Cortical Borer ([index_num])"
truename = "[pick("Primary","Secondary","Tertiary","Quaternary")] [index_num]"
/mob/living/simple_animal/borer/Stat()
..()
statpanel("Status")
@@ -134,7 +220,7 @@
M << "<i>Cortical link, <b>[truename]:</b> [copytext(message, 2)]</i>"
/mob/living/simple_animal/borer/verb/dominate_victim()
set category = "Alien"
set category = "Borer"
set name = "Dominate Victim"
set desc = "Freeze the limbs of a potential host with supernatural fear."
@@ -174,7 +260,7 @@
used_dominate = world.time
/mob/living/simple_animal/borer/verb/bond_brain()
set category = "Alien"
set category = "Borer"
set name = "Assume Control"
set desc = "Fully connect to the brain of your host."
@@ -240,13 +326,15 @@
host.verbs += /mob/living/carbon/proc/release_control
host.verbs += /mob/living/carbon/proc/punish_host
host.verbs += /mob/living/carbon/proc/spawn_larvae
host.verbs -= /mob/living/proc/borer_comm
host.verbs += /mob/living/proc/trapped_mind_comm
if(src && !src.key)
src.key = "@[borer_key]"
return
/mob/living/simple_animal/borer/verb/secrete_chemicals()
set category = "Alien"
set category = "Borer"
set name = "Secrete Chemicals (30)"
set desc = "Push some chemicals into your host's bloodstream."
@@ -266,8 +354,12 @@
if(chemicals < chem_cost)
src << "You don't have enough chemicals!"
var/chem = input("Select a chemical to secrete.", "Chemicals") as null|anything in list("mannitol","salglu_solution","methamphetamine", "hydrocodone", "spaceacillin", "mitocholide", "charcoal", "salbutamol", "capulettium_plus")
var/list/nice_name_chem_list = list()
for(var/rgnt in borer_injection_chems)
var/datum/reagent/R2 = chemical_reagents_list[rgnt]
nice_name_chem_list[R2.name] = rgnt
var/chem_name = input("Select a chemical to secrete.", "Chemicals") as null|anything in nice_name_chem_list
var/chem = nice_name_chem_list[chem_name]
if(!chem || chemicals < chem_cost || !host || controlling || !src || stat) //Sanity check.
return
@@ -278,12 +370,12 @@
src << "<span class='warning'>Doing so would cause grievous harm to your host, reducing ability to reproduce. Aborting.</span>"
return
src << "<span class='notice'>You squirt a measure of [chem] from your reservoirs into [host]'s bloodstream.</span>"
src << "<span class='notice'>You squirt a measure of [chem_name] from your reservoirs into [host]'s bloodstream.</span>"
host.reagents.add_reagent(chem, injection_amount)
chemicals -= chem_cost
/mob/living/simple_animal/borer/verb/release_host()
set category = "Alien"
set category = "Borer"
set name = "Release Host"
set desc = "Slither out of your host."
@@ -332,6 +424,8 @@
host.verbs -= /mob/living/carbon/proc/release_control
host.verbs -= /mob/living/carbon/proc/punish_host
host.verbs -= /mob/living/carbon/proc/spawn_larvae
host.verbs += /mob/living/proc/borer_comm
host.verbs -= /mob/living/proc/trapped_mind_comm
if(host_brain)
@@ -369,6 +463,71 @@
return
//Brain slug proc for voluntary removal of control.
/mob/living/carbon/proc/release_control()
set category = "Borer"
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)
src << "\red <B>You withdraw your probosci, releasing control of [B.host_brain]</B>"
B.detatch()
else
src << "\red <B>ERROR NO BORER OR BRAINMOB DETECTED IN THIS MOB, THIS IS A BUG !</B>"
//Brain slug proc for tormenting the host.
/mob/living/carbon/proc/punish_host()
set category = "Borer"
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)
src << "\red <B>You send a punishing spike of psychic agony lancing into your host's brain.</B>"
B.host_brain << "\red <B><FONT size=3>Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!</FONT></B>"
//Check for brain worms in head.
/mob/proc/has_brain_worms()
for(var/I in contents)
if(istype(I,/mob/living/simple_animal/borer))
return I
return 0
/mob/living/carbon/proc/spawn_larvae()
set category = "Borer"
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)
src << "\red <B>Your host twitches and quivers as you rapdly excrete several larvae from your sluglike body.</B>"
visible_message("\red <B>[src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!</B>")
B.chemicals -= 100
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
src << "You do not have enough chemicals stored to reproduce."
return
/mob/living/simple_animal/borer/proc/leave_host()
if(!host) return
@@ -382,12 +541,13 @@
host.machine = null
var/mob/living/H = host
H.verbs -= /mob/living/proc/borer_comm
H.status_flags &= ~PASSEMOTES
host = null
return
/mob/living/simple_animal/borer/verb/infest()
set category = "Alien"
set category = "Borer"
set name = "Infest"
set desc = "Infest a suitable humanoid host."
@@ -435,18 +595,12 @@
if(M in view(1, src))
src << "You wiggle into [M]'s ear."
/*
if(!M.stat)
M << "Something disgusting and slimy wiggles into your ear!"
*/ // Let's see how stealthborers work out
src.host = M
src.forceMove(M)
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/head = H.get_organ("head")
head.implants += src
host.status_flags |= PASSEMOTES
perform_infestation(M)
return
else
@@ -462,8 +616,6 @@
var/obj/item/organ/external/head = H.get_organ("head")
head.implants += src
host_brain.name = M.name
host_brain.real_name = M.real_name
host.status_flags |= PASSEMOTES
/mob/living/simple_animal/borer/can_use_vents()
@@ -494,13 +646,12 @@
if(!candidate)
return
src.mind = candidate.mob.mind
src.ckey = candidate.ckey
src.key = candidate.key
if(src.mind)
src.mind.assigned_role = "Cortical Borer"
/mob/living/simple_animal/borer/verb/borerhide()
set category = "Alien"
set category = "Borer"
set name = "Hide"
set desc = "Allows to hide beneath tables or certain items. Toggled on or off."
@@ -509,13 +660,16 @@
if (layer != TURF_LAYER+0.2)
layer = TURF_LAYER+0.2
src << text("\green You are now hiding.")
for(var/mob/O in oviewers(src, null))
if ((O.client && !( O.blinded )))
O << text("<B>[] scurries to the ground!</B>", src)
src << "\green You are now hiding."
else
layer = MOB_LAYER
src << text("\green You have stopped hiding.")
for(var/mob/O in oviewers(src, null))
if ((O.client && !( O.blinded )))
O << text("[] slowly peaks up from the ground...", src)
src << "\green You have stopped hiding."
/mob/living/simple_animal/borer/say(var/message)
var/datum/language/dialect = parse_language(message)
if(!dialect)
dialect = get_default_language()
if(!istype(dialect, /datum/language/corticalborer) && loc == host && !talk_inside_host)
src << "<span class='warning'>You've disabled audible speech while inside a host! Re-enable it under the borer tab, or stick to borer communications.</span>"
return
..()
-67
View File
@@ -651,73 +651,6 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
// output for machines^ ^^^^^^^output for people^^^^^^^^^
//Brain slug proc for voluntary removal of control.
/mob/living/carbon/proc/release_control()
set category = "Alien"
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)
src << "\red <B>You withdraw your probosci, releasing control of [B.host_brain]</B>"
B.detatch()
verbs -= /mob/living/carbon/proc/release_control
verbs -= /mob/living/carbon/proc/punish_host
verbs -= /mob/living/carbon/proc/spawn_larvae
else
src << "\red <B>ERROR NO BORER OR BRAINMOB DETECTED IN THIS MOB, THIS IS A BUG !</B>"
//Brain slug proc for tormenting the host.
/mob/living/carbon/proc/punish_host()
set category = "Alien"
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)
src << "\red <B>You send a punishing spike of psychic agony lancing into your host's brain.</B>"
B.host_brain << "\red <B><FONT size=3>Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!</FONT></B>"
//Check for brain worms in head.
/mob/proc/has_brain_worms()
for(var/I in contents)
if(istype(I,/mob/living/simple_animal/borer))
return I
return 0
/mob/living/carbon/proc/spawn_larvae()
set category = "Alien"
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)
src << "\red <B>Your host twitches and quivers as you rapdly excrete several larvae from your sluglike body.</B>"
visible_message("\red <B>[src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!</B>")
B.chemicals -= 100
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
src << "You do not have enough chemicals stored to reproduce."
return
/mob/living/carbon/proc/canBeHandcuffed()
return 0
@@ -278,6 +278,11 @@
cell_status = "[suit.cell.charge]/[suit.cell.maxcharge]"
stat(null, "Suit charge: [cell_status]")
// I REALLY need to split up status panel things into datums
var/mob/living/simple_animal/borer/B = has_brain_worms()
if(B && B.controlling)
stat("Chemicals", B.chemicals)
if(mind)
if(mind.changeling)
stat("Chemical Storage", "[mind.changeling.chem_charges]/[mind.changeling.chem_storage]")