diff --git a/baystation12.dme b/baystation12.dme
index b5236c88e00..012e9819e10 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -836,6 +836,7 @@
#include "code\modules\economy\Job_Departments.dm"
#include "code\modules\economy\TradeDestinations.dm"
#include "code\modules\events\blob.dm"
+#include "code\modules\events\borers.dm"
#include "code\modules\events\carp_migration.dm"
#include "code\modules\events\comms_blackout.dm"
#include "code\modules\events\communications_blackout.dm"
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index 59ac39c54a6..e96fdf4029b 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -206,6 +206,10 @@
var/datum/changeling/changeling = changeling_power(1,0,0)
if(!changeling) return
+ if(src.has_brain_worms())
+ src << "We cannot perform this ability at the present time!"
+ return
+
var/mob/living/carbon/C = src
changeling.chem_charges--
C.remove_changeling_powers()
diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm
index c91452b7992..4ed953d36e4 100644
--- a/code/game/gamemodes/wizard/soulstone.dm
+++ b/code/game/gamemodes/wizard/soulstone.dm
@@ -18,6 +18,11 @@
return ..()
if(istype(M, /mob/living/carbon/human/dummy))
return..()
+
+ if(M.has_brain_worms()) //Borer stuff - RR
+ user << "This being is corrupted by an alien intelligence and cannot be soul trapped."
+ return..()
+
M.attack_log += text("\[[time_stamp()]\] Has had their soul captured with [src.name] by [user.name] ([user.ckey])")
user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to capture the soul of [M.name] ([M.ckey])")
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 28f9bfe4126..dface77429e 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -249,6 +249,9 @@
dat += text("Paralysis Summary %: [] ([] seconds left!)
", occupant.paralysis, round(occupant.paralysis / 4))
dat += text("Body Temperature: [occupant.bodytemperature-T0C]°C ([occupant.bodytemperature*1.8-459.67]°F)
")
+ if(occupant.has_brain_worms())
+ dat += "Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended.
"
+
if(occupant.vessel)
var/blood_volume = round(occupant.vessel.get_reagent_amount("blood"))
var/blood_percent = blood_volume / 560
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index c66aa3a5ee7..069db8ea340 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -523,6 +523,10 @@
w_class = 2
playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
user << "\blue [src] can now be concealed."
+ if(istype(user,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = user
+ H.update_inv_l_hand()
+ H.update_inv_r_hand()
add_fingerprint(user)
return
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 604ee33150c..bd2e25159cc 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -268,7 +268,7 @@
occupant.client.eye = occupant.client.mob
occupant.client.perspective = MOB_PERSPECTIVE
occupant.loc = get_step(loc, SOUTH) //this doesn't account for walls or anything, but i don't forsee that being a problem.
- if (occupant.bodytemperature < 261 && occupant.bodytemperature > 140) //Patch by Aranclanos to stop people from taking burn damage after being ejected
+ if (occupant.bodytemperature < 261 && occupant.bodytemperature >= 70) //Patch by Aranclanos to stop people from taking burn damage after being ejected
occupant.bodytemperature = 261
// occupant.metabslow = 0
occupant = null
diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm
index 008b5d819ab..816c59d86f3 100644
--- a/code/game/mecha/medical/odysseus.dm
+++ b/code/game/mecha/medical/odysseus.dm
@@ -108,6 +108,12 @@
holder.icon_state = "hudxeno"
else if(foundVirus)
holder.icon_state = "hudill"
+ else if(patient.has_brain_worms())
+ var/mob/living/simple_animal/borer/B = patient.has_brain_worms()
+ if(B.controlling)
+ holder.icon_state = "hudbrainworm"
+ else
+ holder.icon_state = "hudhealthy"
else
holder.icon_state = "hudhealthy"
C.images += holder
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 209d085bd72..3f9e050ca7d 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -337,6 +337,11 @@
src.icon_state = "sword0"
src.item_state = "sword0"
src.w_class = 2
+
+ if(istype(user,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = user
+ H.update_inv_l_hand()
+ H.update_inv_r_hand()
src.add_fingerprint(user)
return
diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm
index f96f0955d1d..acf164f0bee 100644
--- a/code/game/objects/items/weapons/swords_axes_etc.dm
+++ b/code/game/objects/items/weapons/swords_axes_etc.dm
@@ -49,6 +49,10 @@
w_class = 2
playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
user << "\blue [src] can now be concealed."
+ if(istype(user,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = user
+ H.update_inv_l_hand()
+ H.update_inv_r_hand()
add_fingerprint(user)
return
@@ -149,6 +153,10 @@
w_class = 2
force = 3//not so robust now
attack_verb = list("hit", "punched")
+ if(istype(user,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = user
+ H.update_inv_l_hand()
+ H.update_inv_r_hand()
playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1)
add_fingerprint(user)
if (!blood_DNA) return
@@ -260,5 +268,9 @@
w_class = 1
playsound(user, 'sound/weapons/saberoff.ogg', 50, 1)
user << "\blue [src] can now be concealed."
+ if(istype(user,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = user
+ H.update_inv_l_hand()
+ H.update_inv_r_hand()
add_fingerprint(user)
return
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index f840e059b61..af44f38e20b 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -171,9 +171,9 @@
return
var/obj/structure/window/WD
if(istype(W,/obj/item/stack/sheet/rglass))
- WD = new/obj/structure/window(loc,1) //reinforced window
+ WD = new/obj/structure/window/reinforced(loc) //reinforced window
else
- WD = new/obj/structure/window(loc,0) //normal window
+ WD = new/obj/structure/window/basic(loc) //normal window
WD.dir = dir_to_set
WD.ini_dir = dir_to_set
WD.anchored = 0
@@ -181,6 +181,7 @@
var/obj/item/stack/ST = W
ST.use(1)
user << "You place the [WD] on [src]."
+ WD.update_icon()
return
//window placing end
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 20360bcf818..9da42756354 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -558,6 +558,12 @@
flags = FPRINT
anchored = 1.0
throwpass = 1 //You can throw objects over this, despite it's density.
+ var/parts = /obj/item/weapon/rack_parts
+
+/obj/structure/rack/proc/destroy()
+ new parts(loc)
+ density = 0
+ del(src)
/obj/structure/rack/ex_act(severity)
switch(severity)
@@ -620,33 +626,25 @@
if(HULK in user.mutations)
visible_message("[user] smashes [src] apart!")
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
- new /obj/item/weapon/rack_parts(loc)
- density = 0
- del(src)
+ destroy()
/obj/structure/rack/attack_paw(mob/user)
if(HULK in user.mutations)
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
visible_message("[user] smashes [src] apart!")
- new /obj/item/weapon/rack_parts(loc)
- density = 0
- del(src)
+ destroy()
/obj/structure/rack/attack_alien(mob/user)
visible_message("[user] slices [src] apart!")
- new /obj/item/weapon/rack_parts(loc)
- density = 0
- del(src)
+ destroy()
/obj/structure/rack/attack_animal(mob/living/simple_animal/user)
if(user.wall_smash)
visible_message("[user] smashes [src] apart!")
- new /obj/item/weapon/rack_parts(loc)
- density = 0
- del(src)
+ destroy()
/obj/structure/rack/attack_tk() // no telehulk sorry
return
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 8108a7c79e5..72eac482276 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -9,7 +9,7 @@
flags = ON_BORDER
var/health = 14.0
var/ini_dir = null
- var/state = 0
+ var/state = 2
var/reinf = 0
var/basestate
var/shardtype = /obj/item/weapon/shard
@@ -404,6 +404,7 @@
spawn(2)
if(!src) return
if(!is_fulltile())
+ icon_state = "[basestate]"
return
var/junction = 0 //will be used to determine from which side the window is connected to other windows
if(anchored)
diff --git a/code/modules/DetectiveWork/scanner.dm b/code/modules/DetectiveWork/scanner.dm
index e57a0ee49a6..48d4812bac1 100644
--- a/code/modules/DetectiveWork/scanner.dm
+++ b/code/modules/DetectiveWork/scanner.dm
@@ -79,7 +79,7 @@
//Special case for blood splaters.
- if (istype(A, /obj/effect/decal/cleanable/blood) || istype(A, /obj/effect/rune))
+ if (istype(A, /obj/effect/decal/cleanable/blood) || istype(A, /obj/effect/rune) || istype(A, /obj/effect/decal/cleanable/blood/gibs))
if(!isnull(A.blood_DNA))
for(var/blood in A.blood_DNA)
user << "\blue Blood type: [A.blood_DNA[blood]]\nDNA: [blood]"
diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm
index e7521400f93..2a852c6b7ef 100644
--- a/code/modules/admin/secrets.dm
+++ b/code/modules/admin/secrets.dm
@@ -78,7 +78,8 @@
Make scrubbers spew chemicals
Spawn wormholes
Spawn blob
- Trigger an Alien infestation
+ Trigger a Xenomorph infestation
+ Trigger a Cortical Borer infestation
Spawn an Alien silently
Trigger a Spider infestation
Send in a space ninja
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index c1b0b41fc1f..f70bd239438 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -2259,6 +2259,12 @@
feedback_add_details("admin_secrets_fun_used","Sp")
new /datum/event/spider_infestation
message_admins("[key_name_admin(usr)] has spawned giant spiders", 1)
+ if("borers")
+ feedback_inc("admin_secrets_fun_used",1)
+ feedback_add_details("admin_secrets_fun_used","Borers")
+ log_admin("[key_name(usr)] spawned a cortical borer infestation.", 1)
+ message_admins("\blue [key_name_admin(usr)] spawned a cortical borer infestation.", 1)
+ new /datum/event/borer_infestation
if("spacevines")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","K")
diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm
index e3fff70f366..aedb20c70d6 100644
--- a/code/modules/clothing/glasses/hud.dm
+++ b/code/modules/clothing/glasses/hud.dm
@@ -73,6 +73,12 @@
holder.icon_state = "hudxeno"
else if(foundVirus)
holder.icon_state = "hudill"
+ else if(patient.has_brain_worms())
+ var/mob/living/simple_animal/borer/B = patient.has_brain_worms()
+ if(B.controlling)
+ holder.icon_state = "hudbrainworm"
+ else
+ holder.icon_state = "hudhealthy"
else
holder.icon_state = "hudhealthy"
C.images += holder
diff --git a/code/modules/events/borers.dm b/code/modules/events/borers.dm
new file mode 100644
index 00000000000..2c6a2820fbb
--- /dev/null
+++ b/code/modules/events/borers.dm
@@ -0,0 +1,38 @@
+//Cortical borer spawn event - care of RobRichards1997 with minor editing by Zuhayr.
+
+/datum/event/borer_infestation
+ oneShot = 1
+
+/datum/event/borer_infestation
+ announceWhen = 400
+
+ var/spawncount = 1
+ var/successSpawn = 0 //So we don't make a command report if nothing gets spawned.
+
+/datum/event/borer_infestation/setup()
+ announceWhen = rand(announceWhen, announceWhen + 50)
+ spawncount = rand(1, 3)
+
+/datum/event/borer_infestation/announce()
+ if(successSpawn)
+ command_alert("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert")
+ world << sound('sound/AI/aliens.ogg')
+
+/datum/event/borer_infestation/start()
+ var/list/vents = list()
+ for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
+ if(temp_vent.loc.z == 1 && !temp_vent.welded && temp_vent.network)
+ //Stops cortical borers getting stuck in small networks. See: Security, Virology
+ if(temp_vent.network.normal_members.len > 50)
+ vents += temp_vent
+
+ var/list/candidates = get_alien_candidates()
+ while(spawncount > 0 && vents.len && candidates.len)
+ var/obj/vent = pick_n_take(vents)
+ var/client/C = pick_n_take(candidates)
+
+ var/mob/living/simple_animal/borer/new_borer = new(vent.loc)
+ new_borer.key = C.key
+
+ spawncount--
+ successSpawn = 1
\ No newline at end of file
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index cccd67909bb..4066de867cc 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -149,6 +149,12 @@ Works together with spawning an observer, noted above.
holder.icon_state = "hudxeno"
else if(foundVirus)
holder.icon_state = "hudill"
+ else if(patient.has_brain_worms())
+ var/mob/living/simple_animal/borer/B = patient.has_brain_worms()
+ if(B.controlling)
+ holder.icon_state = "hudbrainworm"
+ else
+ holder.icon_state = "hudhealthy"
else
holder.icon_state = "hudhealthy"
C.images += holder
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm
index a1e599c5b70..b6507c14a3a 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm
@@ -31,6 +31,9 @@
continue
no_queen = 0
+ if(src.has_brain_worms())
+ src << "We cannot perform this ability at the present time!"
+ return
if(no_queen)
adjustToxLoss(-500)
src << "\green You begin to evolve!"
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 86ac0bb0dbc..f0095ecbe1c 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -530,7 +530,7 @@
B.host_brain << "\red Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!"
//Check for brain worms in head.
-/mob/living/carbon/proc/has_brain_worms()
+/mob/proc/has_brain_worms()
for(var/I in contents)
if(istype(I,/mob/living/simple_animal/borer))
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index ac944b7c070..8d1f37c50d1 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -122,6 +122,17 @@ emp_act
protection += C.armor[type]
return protection
+/mob/living/carbon/human/proc/check_head_coverage()
+
+ var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform)
+ for(var/bp in body_parts)
+ if(!bp) continue
+ if(bp && istype(bp ,/obj/item/clothing))
+ var/obj/item/clothing/C = bp
+ if(C.body_parts_covered & HEAD)
+ return 1
+ return 0
+
/mob/living/carbon/human/proc/check_shields(var/damage = 0, var/attack_text = "the attack")
if(l_hand && istype(l_hand, /obj/item/weapon))//Current base is the prob(50-d/3)
diff --git a/code/modules/mob/living/silicon/pai/hud.dm b/code/modules/mob/living/silicon/pai/hud.dm
index 74d5ec8f878..07df7cd9ead 100644
--- a/code/modules/mob/living/silicon/pai/hud.dm
+++ b/code/modules/mob/living/silicon/pai/hud.dm
@@ -80,6 +80,12 @@
holder.icon_state = "hudxeno"
else if(foundVirus)
holder.icon_state = "hudill"
+ else if(patient.has_brain_worms())
+ var/mob/living/simple_animal/borer/B = patient.has_brain_worms()
+ if(B.controlling)
+ holder.icon_state = "hudbrainworm"
+ else
+ holder.icon_state = "hudhealthy"
else
holder.icon_state = "hudhealthy"
client.images += holder
diff --git a/code/modules/mob/living/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm
index a2c8bd561c2..4bb00a415a7 100644
--- a/code/modules/mob/living/simple_animal/borer.dm
+++ b/code/modules/mob/living/simple_animal/borer.dm
@@ -16,6 +16,12 @@
src << "You whisper silently, \"[message]\""
B.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/captive_brain/emote(var/message)
return
@@ -41,28 +47,53 @@
pass_flags = PASSTABLE
can_hide = 1
+ 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.
var/truename // Name used for brainworm-speak.
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.
/mob/living/simple_animal/borer/Life()
..()
+
+
if(host)
+
if(!stat && !host.stat)
+
+ if(host.reagents.has_reagent("sugar"))
+ if(!docile)
+ if(controlling)
+ host << "\blue You feel the soporific flow of sugar in your host's blood, lulling you into docility."
+ else
+ src << "\blue You feel the soporific flow of sugar in your host's blood, lulling you into docility."
+ docile = 1
+ else
+ if(docile)
+ if(controlling)
+ host << "\blue You shake off your lethargy as the sugar leaves your host's blood."
+ else
+ src << "\blue You shake off your lethargy as the sugar leaves your host's blood."
+ docile = 0
+
if(chemicals < 250)
chemicals++
if(controlling)
+
+ if(docile)
+ host << "\blue You are feeling far too docile to continue controlling your host..."
+ host.release_control()
+ return
+
if(prob(5))
host.adjustBrainLoss(rand(1,2))
if(prob(host.brainloss/20))
host.say("*[pick(list("blink","blink_r","choke","aflap","drool","twitch","twitch_s","gasp"))]")
- //if(host.brainloss > 100)
-
/mob/living/simple_animal/borer/New()
..()
truename = "[pick("Primary","Secondary","Tertiary","Quaternary")] [rand(1000,9999)]"
@@ -105,6 +136,13 @@
src << "You drop words into [host]'s mind: \"[message]\""
host << "Your own thoughts speak: \"[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 << "[src.truename] whispers to [host], \"[message]\""
+
+
/mob/living/simple_animal/borer/Stat()
..()
statpanel("Status")
@@ -128,6 +166,46 @@
if(M.mind && (istype(M, /mob/living/simple_animal/borer) || istype(M, /mob/dead/observer)))
M << "Cortical link, [truename]: [copytext(message, 2)]"
+/mob/living/simple_animal/borer/verb/dominate_victim()
+ set category = "Alien"
+ set name = "Dominate Victim"
+ set desc = "Freeze the limbs of a potential host with supernatural fear."
+
+ if(world.time - used_dominate < 300)
+ src << "You cannot use that ability again so soon."
+ return
+
+ if(host)
+ src << "You cannot do that from within a host body."
+ return
+
+ if(src.stat)
+ src << "You cannot do that in your current state."
+ return
+
+ var/list/choices = list()
+ for(var/mob/living/carbon/C in view(3,src))
+ if(C.stat != 2)
+ choices += C
+
+ if(world.time - used_dominate < 300)
+ src << "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.has_brain_worms())
+ src << "You cannot infest someone who is already infested!"
+ return
+
+ src << "\red You focus your psychic lance on [M] and freeze their limbs with a wave of terrible dread."
+ M << "\red You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing."
+ M.Weaken(3)
+
+ used_dominate = world.time
+
/mob/living/simple_animal/borer/verb/bond_brain()
set category = "Alien"
set name = "Assume Control"
@@ -141,12 +219,20 @@
src << "You cannot do that in your current state."
return
+ if(host.internal_organs_by_name["brain"]) //this should only run in admin-weirdness situations, but it's here non the less - RR
+ src << "There is no brain here for us to command!"
+ return
+
+ if(docile)
+ src << "\blue You are feeling far too docile to do that."
+ return
+
src << "You begin delicately adjusting your connection to the host brain..."
spawn(300+(host.brainloss*5))
- if(!host || !src || controlling) return
-
+ if(!host || !src || controlling)
+ return
else
src << "\red You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system."
host << "\red You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours."
@@ -171,10 +257,14 @@
if(stat)
src << "You cannot secrete chemicals in your current state."
+ if(docile)
+ src << "\blue You are feeling far too docile to do that."
+ return
+
if(chemicals < 50)
src << "You don't have enough chemicals!"
- var/chem = input("Select a chemical to secrete.", "Chemicals") in list("bicaridine","tramadol","hyperzine")
+ var/chem = input("Select a chemical to secrete.", "Chemicals") in list("bicaridine","tramadol","hyperzine","alkysine")
if(chemicals < 50 || !host || controlling || !src || stat) //Sanity check.
return
@@ -195,6 +285,9 @@
if(stat)
src << "You cannot leave your host in your current state."
+ if(docile)
+ src << "\blue You are feeling far too docile to do that."
+ return
if(!host || !src) return
@@ -263,17 +356,25 @@ mob/living/simple_animal/borer/proc/detatch()
var/list/choices = list()
for(var/mob/living/carbon/C in view(1,src))
- if(C.stat != 2)
+ if(C.stat != 2 && src.Adjacent(C))
choices += C
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.has_brain_worms())
src << "You cannot infest someone who is already infested!"
return
+ if(istype(M,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ if(H.check_head_coverage())
+ src << "You cannot get through that host's protective gear."
+ return
+
M << "Something slimy begins probing at the opening of your ear canal..."
src << "You slither up [M] and begin probing at their ear canal..."
diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm
index d64b5c5db00..862fe670eb2 100644
--- a/code/modules/organs/organ.dm
+++ b/code/modules/organs/organ.dm
@@ -35,6 +35,7 @@
/mob/living/carbon/human/var/list/organs = list()
/mob/living/carbon/human/var/list/organs_by_name = list() // map organ names to organs
+/mob/living/carbon/human/var/list/internal_organs_by_name = list() // so internal organs have less ickiness too
//Creates and initializes and connects external and internal organs
/mob/living/carbon/human/proc/make_organs()
@@ -52,11 +53,12 @@
organs_by_name["r_foot"] = new/datum/organ/external/r_foot(organs_by_name["r_leg"])
if (species.name!="Slime People")
- new/datum/organ/internal/heart(src)
- new/datum/organ/internal/lungs(src)
- new/datum/organ/internal/liver(src)
- new/datum/organ/internal/kidney(src)
- new/datum/organ/internal/brain(src)
+ internal_organs_by_name["heart"] = new/datum/organ/internal/heart(src)
+ internal_organs_by_name["lungs"] = new/datum/organ/internal/lungs(src)
+ internal_organs_by_name["liver"] = new/datum/organ/internal/liver(src)
+ internal_organs_by_name["kidney"] = new/datum/organ/internal/kidney(src)
+ internal_organs_by_name["brain"] = new/datum/organ/internal/brain(src)
+// internal_organs_by_name["eyes"] = new/datum/organ/internal/eyes(src)
for(var/name in organs_by_name)
organs += organs_by_name[name]
diff --git a/code/modules/surgery/braincore.dm b/code/modules/surgery/braincore.dm
index f4d81d37f59..c2bd81f5244 100644
--- a/code/modules/surgery/braincore.dm
+++ b/code/modules/surgery/braincore.dm
@@ -85,12 +85,18 @@
user.visible_message("\blue [user] separates [target]'s brain from \his spine with \the [tool].", \
"\blue You separate [target]'s brain from spine with \the [tool].")
+ var/mob/living/simple_animal/borer/borer = target.has_brain_worms()
+
+ if(borer)
+ borer.detatch() //Should remove borer if the brain is removed - RR
+
user.attack_log += "\[[time_stamp()]\] Debrained [target.name] ([target.ckey]) with [tool.name] (INTENT: [uppertext(user.a_intent)])"
target.attack_log += "\[[time_stamp()]\] Debrained by [user.name] ([user.ckey]) with [tool.name] (INTENT: [uppertext(user.a_intent)])"
msg_admin_attack("[user.name] ([user.ckey]) debrained [target.name] ([target.ckey]) with [tool.name] (INTENT: [uppertext(user.a_intent)]) (JMP)")
var/obj/item/brain/B = new(target.loc)
B.transfer_identity(target)
+ target.internal_organs -= B
target:brain_op_stage = 4.0
target.death()//You want them to die after the brain was transferred, so not to trigger client death() twice.
diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi
index 75235912414..b815945b642 100644
Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ