From 9f9b5285d85f6949b089a464605a6f698fbe30a7 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 18 Dec 2013 00:24:21 +1030 Subject: [PATCH 01/21] Fixes #4058 --- code/modules/reagents/reagent_containers/glass.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index b4a7ecf2095..382eacbf02d 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -66,7 +66,8 @@ update_icon() afterattack(obj/target, mob/user , flag) - if (!is_open_container()) + + if (!is_open_container() || get_dist(get_turf(src),get_turf(target))>1) return for(var/type in src.can_be_placed_into) From 0695774d249de3fa512caa28d1c7c681b77a31c6 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 18 Dec 2013 01:04:52 +1030 Subject: [PATCH 02/21] Fixes #4050 --- code/game/objects/structures/window.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 7d1041aaab3..62556db7bd4 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 From 8d76690f444761057442407a03dc050c85f10ec6 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 18 Dec 2013 10:30:59 +1030 Subject: [PATCH 03/21] Fixes #4042 --- .../machinery/computer/HolodeckControl.dm | 6 ++++++ code/game/objects/items/toys.dm | 6 ++++++ .../objects/items/weapons/swords_axes_etc.dm | 20 +++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index f9d765de6a5..bdd313853f3 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -532,6 +532,12 @@ 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/objects/items/toys.dm b/code/game/objects/items/toys.dm index c4578808cfb..f02824576cb 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -337,6 +337,12 @@ 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 2e40b1fb9af..e6a1a4dff81 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -40,6 +40,7 @@ w_class = 4 playsound(user, 'sound/weapons/saberon.ogg', 50, 1) user << "\blue [src] is now active." + else force = 3 if(istype(src,/obj/item/weapon/melee/energy/sword/pirate)) @@ -49,6 +50,12 @@ 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 @@ -137,6 +144,12 @@ 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) @@ -242,11 +255,18 @@ w_class = 4 playsound(user, 'sound/weapons/saberon.ogg', 50, 1) user << "\blue [src] is now active." + else force = 3 icon_state = "eshield[active]" 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 \ No newline at end of file From e110b51337ffb32a7f0490bd937e8d35b6ae5280 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 18 Dec 2013 11:09:13 +1030 Subject: [PATCH 04/21] Allows gibs to be scanned for DNA. --- code/modules/detectivework/scanner.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index 52568ad005b..d898495697a 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -70,6 +70,7 @@ return if(istype(A,/obj/machinery/computer/forensic_scanning)) //breaks shit. return + if(istype(A,/obj/item/weapon/f_card)) user << "The scanner displays on the screen: \"ERROR 43: Object on Excluded Object List.\"" flick("forensic0",src) @@ -77,9 +78,8 @@ add_fingerprint(user) - - //Special case for blood splaters. - if (istype(A, /obj/effect/decal/cleanable/blood) || istype(A, /obj/effect/rune)) + //Special case for blood splatters, runes and gibs. + 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]" From 6984ba3fecb735cbe6e5e93dc8cc46653612a20c Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 18 Dec 2013 11:10:00 +1030 Subject: [PATCH 05/21] Fixes #4040 --- code/game/objects/structures/grille.dm | 5 +++-- code/game/objects/structures/window.dm | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 04f18fe3b6a..0096d763eab 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -145,9 +145,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 @@ -155,6 +155,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/window.dm b/code/game/objects/structures/window.dm index 62556db7bd4..482fdea6c09 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -338,6 +338,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) From 924a7af50a91e180a57a550f87bf40e5de2bf491 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 18 Dec 2013 11:17:17 +1030 Subject: [PATCH 06/21] Fixes #4034 --- code/game/objects/structures/tables_racks.dm | 24 ++++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index e5dc20b3e13..81c017def59 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -46,6 +46,10 @@ density = 0 del(src) +/obj/structure/rack/proc/destroy() + new parts(loc) + density = 0 + del(src) /obj/structure/table/update_icon() spawn(2) //So it properly updates when deleting @@ -572,6 +576,7 @@ 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/ex_act(severity) switch(severity) @@ -634,33 +639,22 @@ 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 \ No newline at end of file From b4e11a6ff9b494150ba424960518172e51943781 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 18 Dec 2013 11:51:20 +1030 Subject: [PATCH 07/21] Possible fix for #3712 --- code/game/machinery/cryo.dm | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 073c1b8fe40..6c6fc53f61a 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -5,7 +5,7 @@ density = 1 anchored = 1.0 layer = 2.8 - + var/on = 0 var/temperature_archived var/mob/living/carbon/occupant = null @@ -68,7 +68,7 @@ * ui_interact is currently defined for /atom/movable * * @param user /mob The mob who is interacting with this ui - * @param ui_key string A string key to use for this ui. Allows for multiple unique uis on one obj/mob (defaut value "main") + * @param ui_key string A string key to use for this ui. Allows for multiple unique uis on one obj/mob (defaut value "main") * @param ui /datum/nanoui This parameter is passed by the nanoui process() proc when updating an open ui * * @return nothing @@ -79,7 +79,7 @@ return // this is the data which will be sent to the ui - var/data[0] + var/data[0] data["isOperating"] = on data["hasOccupant"] = occupant ? 1 : 0 @@ -115,7 +115,7 @@ else if(air_contents.temperature > 225) data["cellTemperatureStatus"] = "average" - data["isBeakerLoaded"] = beaker ? 1 : 0 + data["isBeakerLoaded"] = beaker ? 1 : 0 /* // Removing beaker contents list from front-end, replacing with a total remaining volume var beakerContents[0] if(beaker && beaker.reagents && beaker.reagents.reagent_list.len) @@ -130,12 +130,12 @@ if (beaker.reagents && beaker.reagents.reagent_list.len) for(var/datum/reagent/R in beaker.reagents.reagent_list) data["beakerVolume"] += R.volume - + if (!ui) // no ui has been passed, so we'll search for one { ui = nanomanager.get_open_ui(user, src, ui_key) - } - if (!ui) + } + if (!ui) // the ui does not exist, so we'll create a new one ui = new(user, src, ui_key, "cryo.tmpl", "Cryo Cell Control System", 520, 410) // When the UI is first opened this is the data it will use @@ -159,7 +159,7 @@ if(href_list["switchOn"]) on = 1 update_icon() - + if(href_list["switchOff"]) on = 0 update_icon() @@ -168,12 +168,12 @@ if(beaker) beaker.loc = get_step(loc, SOUTH) beaker = null - + if(href_list["ejectOccupant"]) if(!occupant || isslime(usr) || ispAI(usr)) return 0 // don't update UIs attached to this object go_out() - + add_fingerprint(usr) return 1 // update UIs attached to this object @@ -268,15 +268,15 @@ 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 - occupant.bodytemperature = 261 + if (occupant.bodytemperature < 261 && occupant.bodytemperature >= 70) //Patch by Aranclanos to stop people from taking burn damage after being ejected + occupant.bodytemperature = 261 // Changed to 70 from 140 by Zuhayr due to reoccurance of bug. // occupant.metabslow = 0 occupant = null update_icon() return /obj/machinery/atmospherics/unary/cryo_cell/proc/put_mob(mob/living/carbon/M as mob) if (!istype(M)) - usr << "\red The cryo cell cannot handle such liveform!" + usr << "\red The cryo cell cannot handle such a lifeform!" return if (occupant) usr << "\red The cryo cell is already occupied!" From f8ebd9d5de50d6352be46bb0c30a22ef175038f7 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 18 Dec 2013 13:49:10 +1030 Subject: [PATCH 08/21] Added checks for borers to various key-swapping powers to prevent weirdness. --- .../gamemodes/changeling/changeling_powers.dm | 20 +++++++++++-------- code/game/gamemodes/wizard/soulstone.dm | 4 ++++ .../carbon/alien/humanoid/caste/drone.dm | 4 ++++ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index 96deb59554d..a552ac1cd74 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -205,6 +205,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() @@ -370,24 +374,24 @@ if(changeling_power(20,1,100,DEAD)) // charge the changeling chemical cost for stasis changeling.chem_charges -= 20 - + // restore us to health C.rejuvenate() - + // remove our fake death flag C.status_flags &= ~(FAKEDEATH) - + // let us move again C.update_canmove() - + // re-add out changeling powers - C.make_changeling() - + C.make_changeling() + // sending display messages C << "We have regenerated." C.visible_message("[src] appears to wake from the dead, having healed all wounds.") - - + + feedback_add_details("changeling_powers","FD") return 1 diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 70c655ce576..ddda65952e2 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -19,6 +19,10 @@ 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])") msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to capture the soul of [M.name] ([M.ckey]) (JMP)") 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 7487ffa6313..2b084ce8b5c 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,10 @@ 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!" From 9fe07feb95d19467378aa4154444797e872c56c0 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 18 Dec 2013 13:49:35 +1030 Subject: [PATCH 09/21] Prevented staff of change from working on infested mobs. --- code/modules/projectiles/projectile/change.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index 31c7389fefd..9f5036dea17 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -13,6 +13,8 @@ /obj/item/projectile/change/proc/wabbajack (mob/M as mob in living_mob_list) if(istype(M, /mob/living) && M.stat != DEAD) if(M.monkeyizing) return + if(M.has_brain_worms()) return //Borer stuff - RR + M.monkeyizing = 1 M.canmove = 0 M.icon = null From 822b5729624d8ee2d032c775d89b6592cb0c3c5c Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 18 Dec 2013 13:50:11 +1030 Subject: [PATCH 10/21] Plopped the borer out of the skull when the brain is removed. --- code/modules/surgery/braincore.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/modules/surgery/braincore.dm b/code/modules/surgery/braincore.dm index d94615c953f..b9f3fe24a4f 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. From 65eb6354c5d308e81ceb018f8854d407bc6e8879 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 18 Dec 2013 13:50:58 +1030 Subject: [PATCH 11/21] Various tweaks to cortical borers taken from the /tg/ discussion on the potential port. --- code/modules/mob/living/carbon/carbon.dm | 2 +- code/modules/mob/living/simple_animal/borer.dm | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index dbca1091c63..f841b09d13d 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -532,7 +532,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/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm index d3166dd974f..b8a98895921 100644 --- a/code/modules/mob/living/simple_animal/borer.dm +++ b/code/modules/mob/living/simple_animal/borer.dm @@ -140,12 +140,16 @@ 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 + 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." From c5849aaa96656c614eada14e435d32ba4d988207 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 18 Dec 2013 14:03:04 +1030 Subject: [PATCH 12/21] Added cortical borers to the various HUDs. --- code/game/mecha/medical/odysseus.dm | 2 ++ code/modules/clothing/glasses/hud.dm | 2 ++ code/modules/mob/dead/observer/observer.dm | 18 ++++++++++-------- code/modules/mob/living/silicon/pai/hud.dm | 2 ++ icons/mob/hud.dmi | Bin 2902 -> 2951 bytes 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm index 008b5d819ab..a344b6f43e5 100644 --- a/code/game/mecha/medical/odysseus.dm +++ b/code/game/mecha/medical/odysseus.dm @@ -104,6 +104,8 @@ holder = patient.hud_list[STATUS_HUD] if(patient.stat == 2) holder.icon_state = "huddead" + else if(patient.has_brain_worms()) + holder.icon_state = "hudbrainworm" else if(patient.status_flags & XENO_HOST) holder.icon_state = "hudxeno" else if(foundVirus) diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index e3fff70f366..682e815b5f4 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -69,6 +69,8 @@ holder = patient.hud_list[STATUS_HUD] if(patient.stat == 2) holder.icon_state = "huddead" + else if(patient.has_brain_worms()) + holder.icon_state = "hudbrainworm" else if(patient.status_flags & XENO_HOST) holder.icon_state = "hudxeno" else if(foundVirus) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 759ce23fc3a..da39bb6c83b 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -26,7 +26,7 @@ see_invisible = SEE_INVISIBLE_OBSERVER see_in_dark = 100 verbs += /mob/dead/observer/proc/dead_tele - + stat = DEAD var/turf/T @@ -93,12 +93,12 @@ Works together with spawning an observer, noted above. /mob/dead/observer/Life() ..() - if(!loc) return + if(!loc) return if(!client) return 0 if(client.images.len) - for(var/image/hud in client.images) + for(var/image/hud in client.images) if(copytext(hud.icon_state,1,4) == "hud") client.images.Remove(hud) if(antagHUD) @@ -145,7 +145,7 @@ Works together with spawning an observer, noted above. var/foundVirus = 0 if(patient.virus2.len) foundVirus = 1 - if(!C) return + if(!C) return holder = patient.hud_list[HEALTH_HUD] if(patient.stat == 2) holder.icon_state = "hudhealth-100" @@ -156,14 +156,16 @@ Works together with spawning an observer, noted above. holder = patient.hud_list[STATUS_HUD] if(patient.stat == 2) holder.icon_state = "huddead" + else if(patient.has_brain_worms()) + holder.icon_state = "hudbrainworm" else if(patient.status_flags & XENO_HOST) holder.icon_state = "hudxeno" else if(foundVirus) holder.icon_state = "hudill" else holder.icon_state = "hudhealthy" - C.images += holder - + C.images += holder + /mob/dead/proc/assess_targets(list/target_list, mob/dead/observer/U) var/icon/tempHud = 'icons/mob/hud.dmi' @@ -319,7 +321,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(jobban_isbanned(M, "AntagHUD")) src << "\red You have been banned from using this feature" return - if(config.antag_hud_restricted && !M.has_enabled_antagHUD &&!client.holder) + if(config.antag_hud_restricted && !M.has_enabled_antagHUD &&!client.holder) var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No") if(response == "No") return M.can_reenter_corpse = 0 @@ -455,7 +457,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/response = alert(src, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?","Squeek!","Nope!") if(response != "Squeek!") return //Hit the wrong key...again. - + //find a viable mouse candidate var/mob/living/simple_animal/mouse/host diff --git a/code/modules/mob/living/silicon/pai/hud.dm b/code/modules/mob/living/silicon/pai/hud.dm index 74d5ec8f878..ff073dcb3c4 100644 --- a/code/modules/mob/living/silicon/pai/hud.dm +++ b/code/modules/mob/living/silicon/pai/hud.dm @@ -76,6 +76,8 @@ holder = patient.hud_list[STATUS_HUD] if(patient.stat == 2) holder.icon_state = "huddead" + else if(patient.has_brain_worms()) + holder.icon_state = "hudbrainworm" else if(patient.status_flags & XENO_HOST) holder.icon_state = "hudxeno" else if(foundVirus) diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 0502c01147dccacc311e72977314974e725be839..006a6c64b13c30782241ad090ec269f0b302d34f 100644 GIT binary patch delta 2721 zcmY+Ec{tPy7sr2NG9zPeG9npLL`*1!FhjDBElot0>|2%*Nq%FymZA|t6S*;=k!+ce zMn#CSU0aejVvMD(b!;>9cAxjT_j&L6=X;*>*XMhl?>WPgDJZg{fs?J(1(Vj+)|8YK z2cnU&u`vd~pfP}BsyN;g;prmiWd`T*xI6%erh15qiY_cH=m9`iFvBbWXlnzqT%=S~ z^yK{&gV?=p1qDD40K^#bCrR{yt2>>$1QD(<$$9f8?`vu`=ybHqc+ z6j|g*?0@R?Mix$qfFbUNr>g0~iys@>8)1^BlR87C(>eqF_s3~Vh8wp4xgBhUrs5qt z>i4$v>df~6E5O8Bql}tKxP_4U82>jg(*cvF5s`z)ZgNLAKhQwUTEaG_lxM5!7syZPI-Gch4!A4I+c|m@(V=@&vEa&gZjVI=*b}9yU9> z)HgvWH6g8AffAE>FD6v7;`d7xNzyhAv)E9BPE5CeatJcYN&cqr5nOA4v3U9Okx*Po zYqrp|Lyu{~=jpT%+jnWFyC=GZn!nxD3JI#x2JiBFWd}kPz>4%4E|NErj3Kb^MwKxH z84!n!r)^1BuI~c?_;d4fxC_w_mnN17`%ICrKPzeV)?PRI2hJaRVQn7hCiS@1){kgx zoDjT+W`z4zUP>(=y3ggw>1xTm&|$SiWy@ponWnF!LpHpNTC^5)n*CH}+U;|+G-`iz zbZ(DHIT@nB!wbTPKRVCn{HW8(WQlFw1NE_&pc zc7SfGQ{t0Iqc2EG|K20{p0}o7n;{@9*n?R~R!u=y!JgYho&Uo1(KOs0A+5Y>!HPx7k_&JFolyH&?8tM~WKy}V zZn^uuDLudP5%lo^FyY4SD!00rD1(2{e`>Qh`MBqk)lGz6iqc@uxNwt!(jU~Nc22}K zg4wzZ0%4(coP3!0>~`-H-(Z7S*T$hSx@u6Njv<@Wvspk|`5;7!YnHzTomvP=8D-jk z+1Qo25?1*2s}9Ylx&rR8@4RHR)^B=zO?E?ZK^$N?mz(^OZDm5{LR zt+lE9JJ~8$+Jb9844H-kUy0va1 z=%cEN{H3F+e{e`47EEUN?)ijFXs9!oC}AZYB79GG^hXhG6@?b*49mJMr2K~89qK+p z-m}BhE9cSsAtvg-xXUQg~AoZ+m;}<6^?r2{39wIi%3L7;?N>6^w?SnWD-vV2VVD&YPH`qUB zXJIWoXFCwAoszla2``97>N|EWJ+41b-< zXXK(pBpFHWebTWkCue4x~X#k4(M7k?Mw zQ!y2g{;~oH>MRNS;6}w z&G>PQ-hXAHsh8dvUJ+2VsolHfp#};B9y(wfNqa># zbbNXx-HqbGcj5J?)DSxz^aP0`RDMyoMP(4z1QJCxWIcbgVLY@|+3}{67Lm8~I${jk zlSBrztl;%CVq{K2H!^U(xM)?s8J1fS6KRRTUhY9=Lp>Lks&M+u6c4fA4(YcB*O@h2 zX|UR9+CM$@nLGPApnUhxz;$!5Q^X>a;_E9Vl$y1vHklRosH0UnjVFA1&$$C>ysTe> zgYON3dk8=F$hv>$62}1X_ijj0V?U}c>*vOdVu$2T5u0wQyr9z=3{2tqyhVe!o}<+} z-_yu_@2sF2Z%vzp&l!noEsvkF=}OuVonKF!j02fAC71CEXg!0Y=*vvLm;l@HvJDXt z(e*Me96U5Jb+&yCu;wWrMGqRL?@e85{e#loG|Tbm;+Ongq~MkI3{ zEb3%!T)9g6j?5~{FZ6K1uIHs-7S;($;Y}^5=kh_=hWI&>W)OVdWbV&gE^AQYdsR(n zr>>30ih2Y4F_*ykxs6~aWloQ?YF0BpuWW1E2;08;Xc%0~x6S-`mo^<;%RWiA1+@SG delta 2707 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 s)SC5a3mihEmQc@>5UJbzTko?IWNTRL{AA#q-QQ Date: Wed, 18 Dec 2013 14:10:43 +1030 Subject: [PATCH 13/21] Added ghost eavesdropping for borertalk. --- code/modules/mob/living/simple_animal/borer.dm | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/code/modules/mob/living/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm index b8a98895921..744ff039ce6 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 @@ -104,6 +110,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") From 58ec6756df4bd35101f5bbf78e5c107699c40f28 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 18 Dec 2013 14:25:38 +1030 Subject: [PATCH 14/21] Added cortical borer spawn event and admin verbs. --- baystation12.dme | 1 + code/modules/admin/admin.dm | 3 ++- code/modules/admin/topic.dm | 13 ++++++++---- code/modules/events/borers.dm | 38 +++++++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 code/modules/events/borers.dm diff --git a/baystation12.dme b/baystation12.dme index bfa7dff4dd6..f1d94bde1d2 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -782,6 +782,7 @@ #include "code\modules\economy\TradeDestinations.dm" #include "code\modules\events\alien_infestation.dm" #include "code\modules\events\blob.dm" +#include "code\modules\events\borers.dm" #include "code\modules\events\brand_intelligence.dm" #include "code\modules\events\carp_migration.dm" #include "code\modules\events\comms_blackout.dm" diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index c6dcc662a6f..097cf4cc271 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -581,7 +581,8 @@ var/global/floorIsLava = 0 Spawn a gravitational anomaly (aka lagitational anomolag)
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 43dc61c73f9..54a865955ad 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -511,10 +511,10 @@ jobs += "" counter = 0 - if(jobban_isbanned(M, "Internal Affairs Agent")) + if(jobban_isbanned(M, "Internal Affairs Agent")) jobs += "Internal Affairs Agent" else - jobs += "Internal Affairs Agent" + jobs += "Internal Affairs Agent" jobs += "" @@ -539,7 +539,7 @@ counter = 0 //pAI isn't technically a job, but it goes in here. - + if(jobban_isbanned(M, "pAI")) jobs += "pAI" else @@ -1773,7 +1773,12 @@ log_admin("[key_name(usr)] spawned an alien infestation", 1) message_admins("\blue [key_name_admin(usr)] attempted an alien infestation", 1) new /datum/event/alien_infestation - + 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("power") feedback_inc("admin_secrets_fun_used",1) 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 From 501f94d39946bc881e74d30dc0797632798344aa Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 18 Dec 2013 14:38:00 +1030 Subject: [PATCH 15/21] Added sugar docility to borers. --- .../modules/mob/living/simple_animal/borer.dm | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm index 744ff039ce6..8e8ad86f9e9 100644 --- a/code/modules/mob/living/simple_animal/borer.dm +++ b/code/modules/mob/living/simple_animal/borer.dm @@ -51,23 +51,47 @@ 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)]" @@ -157,6 +181,10 @@ 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)) @@ -187,6 +215,10 @@ 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!" @@ -211,6 +243,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 From cc2dc32f1b01a5bc3aa0373b759c5a28821e4058 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 18 Dec 2013 14:53:56 +1030 Subject: [PATCH 16/21] Added short-range paralysis proc for unhosted borers. --- .../modules/mob/living/simple_animal/borer.dm | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm index 8e8ad86f9e9..a0db352d7fe 100644 --- a/code/modules/mob/living/simple_animal/borer.dm +++ b/code/modules/mob/living/simple_animal/borer.dm @@ -46,6 +46,7 @@ wander = 0 pass_flags = PASSTABLE + 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. @@ -164,6 +165,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" @@ -222,7 +263,7 @@ 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 From 59f35ade32f5a56d6f351490009e160fad2edb0d Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 18 Dec 2013 15:05:32 +1030 Subject: [PATCH 17/21] Added borer checks to handheld and advanced scanners. --- code/game/machinery/adv_med.dm | 3 +++ code/game/objects/items/devices/scanners.dm | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 4b2fb50c54e..bd44ba4e7d2 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -250,6 +250,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/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index a5a4093028f..7e616a8f35a 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -143,7 +143,9 @@ REAGENT SCANNER user.show_message(text("\red Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]")) if (M.reagents && M.reagents.get_reagent_amount("inaprovaline")) user.show_message("\blue Bloodstream Analysis located [M.reagents:get_reagent_amount("inaprovaline")] units of rejuvenation chemicals.") - if (M.getBrainLoss() >= 100 || istype(M, /mob/living/carbon/human) && M:brain_op_stage == 4.0) + if (M.has_brain_worms()) + user.show_message("\red Subject suffering from aberrant brain activity. Recommend further scanning.") + else if (M.getBrainLoss() >= 100 || istype(M, /mob/living/carbon/human) && M:brain_op_stage == 4.0) user.show_message("\red Subject is brain dead.") else if (M.getBrainLoss() >= 60) user.show_message("\red Severe brain damage detected. Subject likely to have mental retardation.") From c4b847e9c6ea2bdb563360a69fe7adcbcb50c45e Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 18 Dec 2013 23:54:11 +1030 Subject: [PATCH 18/21] Amendment to chemistry beaker range fix. --- code/modules/reagents/reagent_containers/glass.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 382eacbf02d..21384ffd59d 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -67,7 +67,7 @@ afterattack(obj/target, mob/user , flag) - if (!is_open_container() || get_dist(get_turf(src),get_turf(target))>1) + if (!is_open_container() || !flag) return for(var/type in src.can_be_placed_into) From f936dbda319130ffb447bffce52d0cd3e668a47a Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Thu, 19 Dec 2013 00:00:28 +1030 Subject: [PATCH 19/21] Possible fix for borers teleporting through windows. --- code/modules/mob/living/simple_animal/borer.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm index a0db352d7fe..8a9bf699b48 100644 --- a/code/modules/mob/living/simple_animal/borer.dm +++ b/code/modules/mob/living/simple_animal/borer.dm @@ -355,13 +355,15 @@ 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 From 44ef03e43964ec6c745ad3ab167afb4b945a4ae8 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Thu, 19 Dec 2013 10:38:21 +1030 Subject: [PATCH 20/21] Prevents borers from getting through head coverage. --- code/modules/mob/living/carbon/human/human_defense.dm | 10 ++++++++++ code/modules/mob/living/simple_animal/borer.dm | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 16a4733b276..b1a20b144ed 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -134,6 +134,16 @@ 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/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm index 8a9bf699b48..d3e0ea9518e 100644 --- a/code/modules/mob/living/simple_animal/borer.dm +++ b/code/modules/mob/living/simple_animal/borer.dm @@ -368,6 +368,12 @@ mob/living/simple_animal/borer/proc/detatch() 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..." From b0b038873faa7bf927147d004e681df95cc803f0 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Thu, 19 Dec 2013 11:00:21 +1030 Subject: [PATCH 21/21] Medical HUDs will now only show brainworms if the worm is controlling the host. --- code/game/mecha/medical/odysseus.dm | 9 +++++++-- code/modules/clothing/glasses/hud.dm | 8 ++++++-- code/modules/mob/dead/observer/observer.dm | 9 +++++++-- code/modules/mob/living/silicon/pai/hud.dm | 8 ++++++-- 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm index a344b6f43e5..5c188802e3e 100644 --- a/code/game/mecha/medical/odysseus.dm +++ b/code/game/mecha/medical/odysseus.dm @@ -104,12 +104,17 @@ holder = patient.hud_list[STATUS_HUD] if(patient.stat == 2) holder.icon_state = "huddead" - else if(patient.has_brain_worms()) - holder.icon_state = "hudbrainworm" else if(patient.status_flags & XENO_HOST) 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/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 682e815b5f4..aedb20c70d6 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -69,12 +69,16 @@ holder = patient.hud_list[STATUS_HUD] if(patient.stat == 2) holder.icon_state = "huddead" - else if(patient.has_brain_worms()) - holder.icon_state = "hudbrainworm" else if(patient.status_flags & XENO_HOST) 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/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index da39bb6c83b..f8368fdff4b 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -156,14 +156,19 @@ Works together with spawning an observer, noted above. holder = patient.hud_list[STATUS_HUD] if(patient.stat == 2) holder.icon_state = "huddead" - else if(patient.has_brain_worms()) - holder.icon_state = "hudbrainworm" else if(patient.status_flags & XENO_HOST) 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/silicon/pai/hud.dm b/code/modules/mob/living/silicon/pai/hud.dm index ff073dcb3c4..07df7cd9ead 100644 --- a/code/modules/mob/living/silicon/pai/hud.dm +++ b/code/modules/mob/living/silicon/pai/hud.dm @@ -76,12 +76,16 @@ holder = patient.hud_list[STATUS_HUD] if(patient.stat == 2) holder.icon_state = "huddead" - else if(patient.has_brain_worms()) - holder.icon_state = "hudbrainworm" else if(patient.status_flags & XENO_HOST) 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