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/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/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/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/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!"
diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm
index 008b5d819ab..5c188802e3e 100644
--- a/code/game/mecha/medical/odysseus.dm
+++ b/code/game/mecha/medical/odysseus.dm
@@ -108,6 +108,13 @@
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/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.")
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
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/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
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 7d1041aaab3..482fdea6c09 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
@@ -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)
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/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/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]"
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 759ce23fc3a..f8368fdff4b 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"
@@ -160,10 +160,17 @@ 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
-
+
+ C.images += holder
+
/mob/dead/proc/assess_targets(list/target_list, mob/dead/observer/U)
var/icon/tempHud = 'icons/mob/hud.dmi'
@@ -319,7 +326,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 +462,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/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!"
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/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/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 d3166dd974f..d3e0ea9518e 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
@@ -40,28 +46,53 @@
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.
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)]"
@@ -104,6 +135,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")
@@ -127,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"
@@ -140,12 +218,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."
@@ -170,10 +256,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
@@ -194,6 +284,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
@@ -262,17 +355,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/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
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index b4a7ecf2095..21384ffd59d 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() || !flag)
return
for(var/type in src.can_be_placed_into)
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.
diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi
index 0502c01147d..006a6c64b13 100644
Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ