From 62b0b4965907cc3e979a14d109eaa59f70019e67 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Thu, 19 Dec 2013 03:32:19 -0500 Subject: [PATCH] Brain Borer Overhaul --- baystation12.dme | 1 + .../gamemodes/changeling/changeling_powers.dm | 4 + code/game/gamemodes/wizard/soulstone.dm | 5 + code/game/machinery/adv_med.dm | 3 + .../machinery/computer/HolodeckControl.dm | 4 + code/game/machinery/cryo.dm | 2 +- code/game/mecha/medical/odysseus.dm | 6 + code/game/objects/items/toys.dm | 5 + .../objects/items/weapons/swords_axes_etc.dm | 12 ++ code/game/objects/structures/grille.dm | 5 +- code/game/objects/structures/tables_racks.dm | 22 ++-- code/game/objects/structures/window.dm | 3 +- code/modules/DetectiveWork/scanner.dm | 2 +- code/modules/admin/secrets.dm | 3 +- code/modules/admin/topic.dm | 6 + code/modules/clothing/glasses/hud.dm | 6 + code/modules/events/borers.dm | 38 ++++++ code/modules/mob/dead/observer/observer.dm | 6 + .../carbon/alien/humanoid/caste/drone.dm | 3 + code/modules/mob/living/carbon/carbon.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 11 ++ code/modules/mob/living/silicon/pai/hud.dm | 6 + .../modules/mob/living/simple_animal/borer.dm | 113 +++++++++++++++++- code/modules/organs/organ.dm | 12 +- code/modules/surgery/braincore.dm | 6 + icons/mob/hud.dmi | Bin 3113 -> 3184 bytes 26 files changed, 256 insertions(+), 30 deletions(-) create mode 100644 code/modules/events/borers.dm 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 752359124145f8dd05d1959403b080f7c31d5e58..b815945b6422e2e8bb54b066d0c9fef0ed473d43 100644 GIT binary patch delta 2795 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