diff --git a/baystation12.dme b/baystation12.dme
index 7704973b732..5d6ca4934a5 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -931,6 +931,7 @@
#include "code\modules\mob\organ\organ.dm"
#include "code\modules\mob\organ\organ_external.dm"
#include "code\modules\mob\organ\organ_internal.dm"
+#include "code\modules\mob\organ\pain.dm"
#include "code\modules\power\apc.dm"
#include "code\modules\power\cable.dm"
#include "code\modules\power\cell.dm"
diff --git a/code/WorkInProgress/organs/organs.dm b/code/WorkInProgress/organs/organs.dm
index 896f8eca06a..f2011005b45 100644
--- a/code/WorkInProgress/organs/organs.dm
+++ b/code/WorkInProgress/organs/organs.dm
@@ -52,7 +52,8 @@
set background = 1
var/list/organs = GetAllContents()
- for(var/obj/organ/organ in organs)
+ for(var/name in organs)
+ var/obj/organ/organ = organs[name]
organ.ProcessOrgan()
return
diff --git a/code/WorkInProgress/virus2/base.dm b/code/WorkInProgress/virus2/base.dm
index 00897198d49..039aa7934a5 100644
--- a/code/WorkInProgress/virus2/base.dm
+++ b/code/WorkInProgress/virus2/base.dm
@@ -336,12 +336,6 @@ proc/airborne_can_reach(turf/source, turf/target)
activate(var/mob/living/carbon/mob,var/multiplier)
mob.toxloss += (2*multiplier)
-/datum/disease2/effect/greater/scream
- name = "Random screaming syndrome"
- stage = 3
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.say("*scream")
-
/datum/disease2/effect/greater/drowsness
name = "Automated sleeping syndrome"
stage = 3
diff --git a/code/defines/obj/hydro.dm b/code/defines/obj/hydro.dm
index 9a85cb59cb9..dbb26d4de1f 100644
--- a/code/defines/obj/hydro.dm
+++ b/code/defines/obj/hydro.dm
@@ -1139,7 +1139,7 @@
bitesize = 1+round(reagents.total_volume / 2, 1)
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosiavulgaris
- seed = "/obj/item/seeds/ambrosiavulgaris"
+ seed = "/obj/item/seeds/ambrosiavulgarisseed"
name = "Ambrosia Vulgaris"
desc = "A plant containing various healing chemicals."
icon_state = "ambrosiavulgaris"
diff --git a/code/defines/obj/supplypacks.dm b/code/defines/obj/supplypacks.dm
index 14570f59757..5ae12cd307e 100644
--- a/code/defines/obj/supplypacks.dm
+++ b/code/defines/obj/supplypacks.dm
@@ -31,6 +31,18 @@
containertype = "/obj/structure/closet/crate"
containername = "Empty Box crate"
+/datum/supply_packs/body_bags
+ name = "Body Bag supplies"
+ contains = list(
+ "/obj/item/weapon/bodybag",
+ "/obj/item/weapon/bodybag",
+ "/obj/item/weapon/bodybag",
+ "/obj/item/weapon/bodybag",
+ )
+ cost = 10
+ containertype = "/obj/structure/closet/crate"
+ containername = "Body Bag crate"
+
/datum/supply_packs/stationary
name = "Stationary supplies"
contains = list("/obj/item/device/taperecorder",
@@ -54,7 +66,6 @@
/datum/supply_packs/artscrafts
name = "Arts and Crafts supplies"
contains = list("/obj/item/toy/crayonbox",
- "/obj/item/weapon/c_tube",
"/obj/item/weapon/camera_test",
"/obj/item/weapon/storage/photo_album",
"/obj/item/weapon/packageWrap",
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index 694fed28ba9..60bc235f938 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -8,7 +8,6 @@
throwforce = 10
-
/obj/item/clothing/head/culthood
name = "cult hood"
icon_state = "culthood"
diff --git a/code/game/magic/cultist/runes.dm b/code/game/magic/cultist/runes.dm
index eb7d0d12f7d..c92c206c71d 100644
--- a/code/game/magic/cultist/runes.dm
+++ b/code/game/magic/cultist/runes.dm
@@ -281,7 +281,8 @@ var/list/sacrificed = list()
corpse_to_raise.mind.key = ghost.key
corpse_to_raise.key = ghost.key
del(ghost)
- for(var/datum/organ/external/affecting in corpse_to_raise.organs)
+ for(var/name in corpse_to_raise.organs)
+ var/datum/organ/external/affecting = corpse_to_raise.organs[name]
affecting.heal_damage(1000, 1000)
corpse_to_raise.setToxLoss(0)
corpse_to_raise.setOxyLoss(0)
diff --git a/code/game/objects/items/item.dm b/code/game/objects/items/item.dm
index 7b0a74cdf44..e57fada6147 100644
--- a/code/game/objects/items/item.dm
+++ b/code/game/objects/items/item.dm
@@ -127,9 +127,29 @@
user.next_move = world.time + 2
if (user.hand)
- user.l_hand = src
+ if(ishuman(user))
+ var/datum/organ/external/temp = user:organs["l_hand"]
+ if(!temp.destroyed)
+ user.l_hand = src
+ else
+ user << "\blue You pick \the [src] up with your ha- wait a minute."
+ if(loc == user)
+ user.drop_from_slot(src)
+ return
+ else
+ user.l_hand = src
else
- user.r_hand = src
+ if(ishuman(user))
+ var/datum/organ/external/temp = user:organs["r_hand"]
+ if(!temp.destroyed)
+ user.r_hand = src
+ else
+ user << "\blue You pick \the [src] up with your ha- wait a minute."
+ if(loc == user)
+ user.drop_from_slot(src)
+ return
+ else
+ user.r_hand = src
src.loc = user
src.layer = 20
add_fingerprint(user)
diff --git a/code/game/objects/items/weapons/medical.dm b/code/game/objects/items/weapons/medical.dm
index 1d5b7452068..6c114d72e32 100644
--- a/code/game/objects/items/weapons/medical.dm
+++ b/code/game/objects/items/weapons/medical.dm
@@ -15,7 +15,7 @@ MEDICAL
t_him = "her"
user << "\red \The [M] is dead, you cannot help [t_him]!"
return
- if (M.health < 50)
+ if (M.health < 0)
var/t_him = "it"
if (M.gender == MALE)
t_him = "him"
@@ -66,6 +66,30 @@ MEDICAL
if (affecting.heal_damage(src.heal_brute, src.heal_burn))
H.UpdateDamageIcon()
+
+ if(H.bloodloss > 0 && heal_brute > 0) // fix wounds too if bruise pack
+ var/stoped = 0
+ for(var/datum/organ/external/wound/W in affecting.wounds)
+ if(W.bleeding)
+ W.stopbleeding()
+ stoped = 0
+ break
+ if(!stoped)
+ // user << "There is no bleeding wound at [t]" //code no longer in a dedicated obj, thus this doesn't really matter
+ return
+ if (user)
+ if (M != user)
+ for (var/mob/O in viewers(H, null))
+ O.show_message("\red [H] has been bandaged with [src] by [user]", 1)
+ else
+ var/t_himself = "itself"
+ if (user.gender == MALE)
+ t_himself = "himself"
+ else if (user.gender == FEMALE)
+ t_himself = "herself"
+ for (var/mob/O in viewers(H, null))
+ O.show_message("\red [H] bandaged [t_himself] with [src]", 1)
+
M.updatehealth()
else
M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2))
diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm
index ed7acecb1f9..4fa9c44cdf8 100644
--- a/code/game/objects/items/weapons/surgery_tools.dm
+++ b/code/game/objects/items/weapons/surgery_tools.dm
@@ -83,12 +83,12 @@ CIRCULAR SAW
if(1.0)
if(M != user)
for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is having his eyes retracted by [user].", 1)
+ O.show_message("\red [M] is having \his eyes retracted by [user].", 1)
M << "\red [user] begins to seperate your eyes with [src]!"
user << "\red You seperate [M]'s eyes with [src]!"
else
user.visible_message( \
- "\red [user] begins to have his eyes retracted.", \
+ "\red [user] begins to have \his eyes retracted.", \
"\red You begin to pry open your eyes with [src]!" \
)
if(M == user && prob(25))
@@ -102,10 +102,56 @@ CIRCULAR SAW
M:eye_op_stage = 2.0
- else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
- return ..()
+ else
+ // bone surgery doable?
+ if(!try_bone_surgery(M, user))
+ return ..()
- return
+/obj/item/weapon/retractor/proc/try_bone_surgery(mob/living/carbon/human/H as mob, mob/living/user as mob)
+ if(!istype(H))
+ return 0
+ var/datum/organ/external/S = H.organs[user.zone_sel.selecting]
+ if(!S || !istype(S))
+ return 0
+
+ if(S.destroyed)
+ user << "What [S.display_name]?"
+ if(!S.open)
+ user << "\red There is skin in the way!"
+ return 0
+ if(S.bleeding)
+ user << "\red [H] is profusely bleeding in \his [S.display_name]!"
+ return 0
+
+ if(H != user)
+ H.visible_message( \
+ "\red [user] is beginning to retract the flap in the wound in [H]'s [S.display_name] with [src].", \
+ "\red [user] begins to retract the flap in the wound in your [S.display_name] with [src]!")
+ else
+ H.visible_message( \
+ "\red [user] begins to retract the flap in the wound in \his [S.display_name] with [src]!", \
+ "\red You begin to retract the flap in the wound in your [S.display_name] with [src]!")
+
+ if(do_mob(user, H, 30))
+ if(H != user)
+ H.visible_message( \
+ "\red [user] retracts the flap in the wound in [H]'s [S.display_name] with [src]!", \
+ "\red [user] retracts the flap in the wound in your [S.display_name] with [src]!")
+ else
+ H.visible_message( \
+ "\red [user] retracts the flap in the wound in \his [S.display_name] with [src]!", \
+ "\red You retract the flap in the wound in your [S.display_name] with [src]!")
+
+ if(H == user && prob(25))
+ user << "\red You mess up!"
+ S.take_damage(15)
+
+ S.open = 2
+
+ H.updatehealth()
+ H.UpdateDamageIcon()
+
+ return 1
////////////
//Hemostat//
@@ -189,12 +235,12 @@ CIRCULAR SAW
if(2.0)
if(M != user)
for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is having his eyes mended by [user].", 1)
+ O.show_message("\red [M] is having \his eyes mended by [user].", 1)
M << "\red [user] begins to mend your eyes with [src]!"
user << "\red You mend [M]'s eyes with [src]!"
else
user.visible_message( \
- "\red [user] begins to have his eyes mended.", \
+ "\red [user] begins to have \his eyes mended.", \
"\red You begin to mend your eyes with [src]!" \
)
if(M == user && prob(25))
@@ -206,11 +252,68 @@ CIRCULAR SAW
else
M.take_organ_damage(15)
M:eye_op_stage = 3.0
+ else if(user.zone_sel.selecting == "head")
+ if(istype(M, /mob/living/carbon/human) && M:brain_op_stage == 1)
+ M:brain_op_stage = 0
+ var/datum/organ/external/S = M:organs["head"]
+ if(!S || !istype(S))
+ return ..()
+ M:brain_op_stage = 0
+ S.open = 1
+ if(!try_bone_surgery(M, user))
+ return ..()
+ else
+ return ..()
+ else
+ // bone surgery doable?
+ if(!try_bone_surgery(M, user))
+ return ..()
- else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
- return ..()
+/obj/item/weapon/hemostat/proc/try_bone_surgery(mob/living/carbon/human/H as mob, mob/living/user as mob)
+ if(!istype(H))
+ return 0
+ var/datum/organ/external/S = H.organs[user.zone_sel.selecting]
+ if(!S || !istype(S))
+ return 0
- return
+ if(S.destroyed)
+ user << "What [S.display_name]?"
+ if(!S.open)
+ user << "\red There is skin in the way!"
+ return 0
+ if(!S.bleeding)
+ user << "\red [H] is not bleeding in \his [S.display_name]!"
+ return 0
+
+ if(H != user)
+ H.visible_message( \
+ "\red [user] is beginning to clamp bleeders in the wound in [H]'s [S.display_name] with [src].", \
+ "\red [user] begins to clamp bleeders in the wound in your [S.display_name] with [src]!")
+ else
+ H.visible_message( \
+ "\red [user] begins to clamp bleeders in the wound in \his [S.display_name] with [src]!", \
+ "\red You begin to clamp bleeders in the wound in your [S.display_name] with [src]!")
+
+ if(do_mob(user, H, 50))
+ if(H != user)
+ H.visible_message( \
+ "\red [user] clamps bleeders in the wound in [H]'s [S.display_name] with [src]!", \
+ "\red [user] clamps bleeders in the wound in your [S.display_name] with [src]!")
+ else
+ H.visible_message( \
+ "\red [user] clamps bleeders in the wound in \his [S.display_name] with [src]!", \
+ "\red You clamp bleeders in the wound in your [S.display_name] with [src]!")
+
+ if(H == user && prob(25))
+ user << "\red You mess up!"
+ S.take_damage(15)
+
+ S.bleeding = 0
+
+ H.updatehealth()
+ H.UpdateDamageIcon()
+
+ return 1
///////////
//Cautery//
@@ -233,6 +336,8 @@ CIRCULAR SAW
user << "\red You cauterize the incision in [M]'s torso with [src]!"
M:embryo_op_stage = 0.0
return
+ else
+ try_bone_surgery(M, user)
if(user.zone_sel.selecting == "groin")
if(istype(M, /mob/living/carbon/human))
@@ -247,6 +352,8 @@ CIRCULAR SAW
for(var/datum/disease/appendicitis in M.viruses)
appendicitis.cure()
M.resistances += appendicitis
+ else
+ try_bone_surgery(M, user)
return
if (user.zone_sel.selecting == "eyes")
@@ -275,12 +382,12 @@ CIRCULAR SAW
if(3.0)
if(M != user)
for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is having his eyes cauterized by [user].", 1)
+ O.show_message("\red [M] is having \his eyes cauterized by [user].", 1)
M << "\red [user] begins to cauterize your eyes!"
user << "\red You cauterize [M]'s eyes with [src]!"
else
user.visible_message( \
- "\red [user] begins to have his eyes cauterized.", \
+ "\red [user] begins to have \his eyes cauterized.", \
"\red You begin to cauterize your eyes!" \
)
if(M == user && prob(25))
@@ -294,11 +401,53 @@ CIRCULAR SAW
M.sdisabilities &= ~1
M:eye_op_stage = 0.0
- else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
- return ..()
+ else
+ // bone surgery doable?
+ if(!try_bone_surgery(M, user))
+ return ..()
- return
+/obj/item/weapon/cautery/proc/try_bone_surgery(mob/living/carbon/human/H as mob, mob/living/user as mob)
+ if(!istype(H))
+ return 0
+ var/datum/organ/external/S = H.organs[user.zone_sel.selecting]
+ if(!S || !istype(S))
+ return 0
+ if(S.destroyed)
+ user << "What [S.display_name]?"
+ if(!S.open)
+ user << "\red There is no wound to close up!"
+ return 0
+
+ if(H != user)
+ H.visible_message( \
+ "\red [user] is beginning to cauterize the incision in [H]'s [S.display_name] with [src].", \
+ "\red [user] begins to cut open the wound in your [S.display_name] with [src]!")
+ else
+ H.visible_message( \
+ "\red [user] begins to cauterize the incision in \his [S.display_name] with [src]!", \
+ "\red You begin to cauterize the incision in your [S.display_name] with [src]!")
+
+ if(do_mob(user, H, 100))
+ if(H != user)
+ H.visible_message( \
+ "\red [user] cauterizes the incision in [H]'s [S.display_name] with [src]!", \
+ "\red [user] cauterizes the incision in your [S.display_name] with [src]!")
+ else
+ H.visible_message( \
+ "\red [user] cauterizes the incision in \his [S.display_name] with [src]!", \
+ "\red You cauterize the incision in your [S.display_name] with [src]!")
+
+ if(H == user && prob(25))
+ user << "\red You mess up!"
+ S.take_damage(15)
+
+ S.open = 0
+
+ H.updatehealth()
+ H.UpdateDamageIcon()
+
+ return 1
//obj/item/weapon/surgicaldrill
@@ -327,7 +476,7 @@ CIRCULAR SAW
if(0.0)
if(M != user)
for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is beginning to have his torso cut open with [src] by [user].", 1)
+ O.show_message("\red [M] is beginning to have \his torso cut open with [src] by [user].", 1)
M << "\red [user] begins to cut open your torso with [src]!"
user << "\red You cut [M]'s torso open with [src]!"
M:embryo_op_stage = 1.0
@@ -335,7 +484,7 @@ CIRCULAR SAW
if(3.0)
if(M != user)
for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is beginning to have his stomach cut open with [src] by [user].", 1)
+ O.show_message("\red [M] is beginning to have \his stomach cut open with [src] by [user].", 1)
M << "\red [user] begins to cut open your stomach with [src]!"
user << "\red You cut [M]'s stomach open with [src]!"
for(var/datum/disease/D in M.viruses)
@@ -352,14 +501,14 @@ CIRCULAR SAW
if(0.0)
if(M != user)
for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is beginning to have his abdomen cut open with [src] by [user].", 1)
+ O.show_message("\red [M] is beginning to have \his abdomen cut open with [src] by [user].", 1)
M << "\red [user] begins to cut open your abdomen with [src]!"
user << "\red You cut [M]'s abdomen open with [src]!"
M:appendix_op_stage = 1.0
if(3.0)
if(M != user)
for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is beginning to have his appendix seperated with [src] by [user].", 1)
+ O.show_message("\red [M] is beginning to have \his appendix seperated with [src] by [user].", 1)
M << "\red [user] begins to seperate your appendix with [src]!"
user << "\red You seperate [M]'s appendix with [src]!"
M:appendix_op_stage = 4.0
@@ -368,6 +517,12 @@ CIRCULAR SAW
if(user.zone_sel.selecting == "head" || istype(M, /mob/living/carbon/metroid))
var/mob/living/carbon/human/H = M
+
+ if(istype(H) && H.organs["head"])
+ var/datum/organ/external/affecting = H.organs["head"]
+ if(affecting.destroyed)
+ return ..()
+
if(istype(H) && ( \
(H.head && H.head.flags & HEADCOVERSEYES) || \
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
@@ -397,12 +552,12 @@ CIRCULAR SAW
if(M != user)
for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is beginning to have his head cut open with [src] by [user].", 1)
+ O.show_message("\red [M] is beginning to have \his head cut open with [src] by [user].", 1)
M << "\red [user] begins to cut open your head with [src]!"
user << "\red You cut [M]'s head open with [src]!"
else
user.visible_message( \
- "\red [user] begins to cut open his skull with [src]!", \
+ "\red [user] begins to cut open \his skull with [src]!", \
"\red You begin to cut open your head with [src]!" \
)
@@ -443,12 +598,12 @@ CIRCULAR SAW
if(M != user)
for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is having his connections to the brain delicately severed with [src] by [user].", 1)
+ O.show_message("\red [M] is having \his connections to the brain delicately severed with [src] by [user].", 1)
M << "\red [user] begins to cut open your head with [src]!"
user << "\red You cut [M]'s head open with [src]!"
else
user.visible_message( \
- "\red [user] begin to delicately remove the connections to his brain with [src]!", \
+ "\red [user] begin to delicately remove the connections to \his brain with [src]!", \
"\red You begin to cut open your head with [src]!" \
)
if(M == user && prob(25))
@@ -498,12 +653,12 @@ CIRCULAR SAW
if(0.0)
if(M != user)
for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] is beginning to have his eyes incised with [src] by [user].", 1)
+ O.show_message("\red [M] is beginning to have \his eyes incised with [src] by [user].", 1)
M << "\red [user] begins to cut open your eyes with [src]!"
user << "\red You make an incision around [M]'s eyes with [src]!"
else
user.visible_message( \
- "\red [user] begins to cut around his eyes with [src]!", \
+ "\red [user] begins to cut around \his eyes with [src]!", \
"\red You begin to cut open your eyes with [src]!" \
)
if(M == user && prob(25))
@@ -519,13 +674,78 @@ CIRCULAR SAW
M:eye_op_stage = 1.0
user << "\blue So far so good after."
else
- return ..()
+ // bone surgery doable?
+ if(!try_bone_surgery(M, user))
+ return ..()
+
/* wat
else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
return ..()
*/
return
+/obj/item/weapon/scalpel/proc/try_bone_surgery(mob/living/carbon/human/H as mob, mob/living/user as mob)
+ if(!istype(H))
+ return 0
+ var/datum/organ/external/S = H.organs[user.zone_sel.selecting]
+ if(!S || !istype(S))
+ return 0
+
+ if(S.destroyed)
+ user << "What [S.display_name]?"
+ if(S.open)
+ user << "\red The wound is already open!"
+ return 0
+
+ if(H != user)
+ H.visible_message( \
+ "\red [user] is beginning to cut open the wound in [H]'s [S.display_name] with [src].", \
+ "\red [user] begins to cut open the wound in your [S.display_name] with [src]!")
+ else
+ H.visible_message( \
+ "\red [user] begins to cut open the wound in \his [S.display_name] with [src]!", \
+ "\red You begin to cut open the wound in your [S.display_name] with [src]!")
+
+ if(do_mob(user, H, 100))
+ if(H != user)
+ H.visible_message( \
+ "\red [user] cuts open the wound in [H]'s [S.display_name] with [src]!", \
+ "\red [user] cuts open the wound in your [S.display_name] with [src]!")
+ else
+ H.visible_message( \
+ "\red [user] cuts open the wound in \his [S.display_name] with [src]!", \
+ "\red You cut open the wound in your [S.display_name] with [src]!")
+
+ if(H == user && prob(25))
+ user << "\red You mess up!"
+ S.take_damage(15)
+
+ S.open = 1
+ S.bleeding = 1
+
+ H.updatehealth()
+ H.UpdateDamageIcon()
+ else
+ var/a = pick(1,2,3)
+ var/msg
+ if(a == 1)
+ msg = "\red [user]'s move slices open [H]'s wound, causing massive bleeding"
+ S.brute_dam += 35
+ S.createwound(rand(1,3))
+ else if(a == 2)
+ msg = "\red [user]'s move slices open [H]'s wound, and causes \him to accidentally stab himself"
+ S.brute_dam += 35
+ var/datum/organ/external/userorgan = user:organs["chest"]
+ if(userorgan)
+ userorgan.brute_dam += 35
+ else
+ user.take_organ_damage(35)
+ else if(a == 3)
+ msg = "\red [user] quickly stops the surgery"
+ for(var/mob/O in viewers(H))
+ O.show_message(msg, 1)
+
+ return 1
////////////////
//CIRCULAR SAW//
@@ -562,17 +782,28 @@ CIRCULAR SAW
return
switch(M:brain_op_stage)
+ if(0)
+ if(!istype(H))
+ return ..()
+ var/datum/organ/external/S = H.organs["head"]
+ if(S.destroyed)
+ return
+ for(var/mob/O in viewers(H, null))
+ O.show_message(text("\red [H] gets \his [S.display_name] sawed off with [src] by [user]."), 1)
+ S.destroyed = 1
+ S.droplimb()
+ H.update_body()
if(1.0)
if(istype(M, /mob/living/carbon/metroid))
return
if(M != user)
for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] has his skull sawed open with [src] by [user].", 1)
+ O.show_message("\red [M] has \his skull sawed open with [src] by [user].", 1)
M << "\red [user] begins to saw open your head with [src]!"
user << "\red You saw [M]'s head open with [src]!"
else
user.visible_message( \
- "\red [user] saws open his skull with [src]!", \
+ "\red [user] saws open \his skull with [src]!", \
"\red You begin to saw open your head with [src]!" \
)
if(M == user && prob(25))
@@ -615,12 +846,12 @@ CIRCULAR SAW
if(3.0)
if(M != user)
for(var/mob/O in (viewers(M) - user - M))
- O.show_message("\red [M] has his spine's connection to the brain severed with [src] by [user].", 1)
+ O.show_message("\red [M] has \his spine's connection to the brain severed with [src] by [user].", 1)
M << "\red [user] severs your brain's connection to the spine with [src]!"
user << "\red You sever [M]'s brain's connection to the spine with [src]!"
else
user.visible_message( \
- "\red [user] severs his brain's connection to the spine with [src]!", \
+ "\red [user] severs \his brain's connection to the spine with [src]!", \
"\red You sever your brain's connection to the spine with [src]!" \
)
@@ -637,6 +868,16 @@ CIRCULAR SAW
..()
return
+ else if(user.zone_sel.selecting != "chest" && user.zone_sel.selecting != "groin" && istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ var/datum/organ/external/S = H.organs[user.zone_sel.selecting]
+ if(S.destroyed)
+ return
+ for(var/mob/O in viewers(H, null))
+ O.show_message(text("\red [H] gets \his [S.display_name] sawed off with [src] by [user]."), 1)
+ S.destroyed = 1
+ S.droplimb()
+ H.update_body()
else
return ..()
/*
@@ -644,3 +885,135 @@ CIRCULAR SAW
return ..()
*/
return
+
+/obj/item/weapon/surgical_tool
+ name = "surgical tool"
+ var/list/stage = list() //Stage to act on
+ var/time = 50 //Time it takes to use
+ var/wound //Wound type to act on
+
+ proc/get_message(var/mnumber,var/M,var/user,var/datum/organ/external/organ)//=Start,2=finish,3=walk away,4=screw up, 5 = closed wound
+ proc/screw_up(mob/living/carbon/M as mob,mob/living/carbon/user as mob,var/datum/organ/external/organ)
+ organ.brute_dam += 30
+/obj/item/weapon/surgical_tool/proc/IsFinalStage(var/stage)
+ var/a
+ switch(wound)
+ if("broken") //Basic broken bone
+ a=3
+ if("blood")
+ a=3
+ return stage == a
+
+/obj/item/weapon/surgical_tool/attack(mob/living/carbon/human/M as mob, mob/living/carbon/user as mob)
+ if(!istype(M, /mob))
+ return
+ if((usr.mutations & 16) && prob(50))
+ M << "\red You stab yourself in the eye."
+ M.disabilities |= 128
+ M.weakened += 4
+ M.bruteloss += 10
+
+ src.add_fingerprint(user)
+
+ if(!(locate(/obj/machinery/optable, M.loc) && M.resting))
+ return ..()
+
+ var/zone = user.zone_sel.selecting
+ if (istype(M.organs[zone], /datum/organ/external))
+ var/datum/organ/external/temp = M.organs[zone]
+ var/msg
+
+ // quickly convert embryo removal to bone surgery
+ if(zone == "chest" && M.embryo_op_stage == 3)
+ M.embryo_op_stage = 0
+ temp.open = 2
+ temp.bleeding = 0
+
+ // quickly convert appendectomy to bone surgery
+ if(zone == "groin" && M.appendix_op_stage == 3)
+ M.appendix_op_stage = 0
+ temp.open = 2
+ temp.bleeding = 0
+
+ msg = get_message(1,M,user,temp)
+ for(var/mob/O in viewers(M,null))
+ O.show_message("\red [msg]",1)
+ if(do_mob(user,M,time))
+ if(temp.open == 2 && !temp.bleeding)
+ if(temp.wound == wound)
+ if(temp.stage in stage)
+ temp.stage += 1
+
+ if(IsFinalStage(temp.stage))
+ temp.broken = 0
+ temp.stage = 0
+ temp.perma_injury = 0
+ temp.brute_dam = temp.min_broken_damage -1
+ msg = get_message(2,M,user,temp)
+ else
+ msg = get_message(4,M,user,temp)
+ screw_up(M,user,temp)
+ else
+ msg = get_message(5,M,user,temp)
+ else
+ msg = get_message(3,M,user,temp)
+
+ for(var/mob/O in viewers(M,null))
+ O.show_message("\red [msg]",1)
+
+
+//Broken bone
+//Basic
+//Open -> Clean -> Bone-gel -> pop-into-place -> Bone-gel -> close -> glue -> clean
+
+//Split
+//Open -> Clean -> Tweasers -> bone-glue -> close -> glue -> clean
+
+//
+
+/obj/item/weapon/surgical_tool/bonegel
+ name = "Bone-gel"
+ icon = 'janitor.dmi'
+ icon_state = "cleaner"
+
+/obj/item/weapon/surgical_tool/bonegel/New()
+ stage += 0
+ stage += 2
+ wound = "broken"
+/obj/item/weapon/surgical_tool/bonegel/get_message(var/n,var/m,var/usr,var/datum/organ/external/organ)
+ var/z
+ switch(n)
+ if(1)
+ z="[usr] starts applying bone-gel to [m]'s [organ.display_name]"
+ if(2)
+ z="[usr] finishes applying bone-gel to [m]'s [organ.display_name]"
+ if(3)
+ z="[usr] stops applying bone-gel to [m]'s [organ.display_name]"
+ if(4)
+ z="[usr] applies bone-gel incorrectly to [m]'s [organ.display_name]"
+ if(5)
+ z="[usr] lubricates [m]'s [organ.display_name]"
+ return z
+
+/obj/item/weapon/surgical_tool/bonecracker
+ name = "Bone-cracker"
+ icon = 'items.dmi'
+ icon_state = "wrench"
+
+/obj/item/weapon/surgical_tool/bonecracker/New()
+ stage += 1
+ wound = "broken"
+/obj/item/weapon/surgical_tool/bonecracker/get_message(var/n,var/m,var/usr,var/datum/organ/external/organ)
+ var/z
+ switch(n)
+ if(1)
+ z="[usr] starts popping [m]'s [organ.display_name] bone into place"
+ if(2)
+ z="[usr] finishes popping [m]'s [organ.display_name] bone into place"
+ if(3)
+ z="[usr] stops popping [m]'s [organ.display_name] bone into place"
+ if(4)
+ z="[usr] pops [m]'s [organ.display_name] bone into the wrong place"
+ if(5)
+ z="[usr] performs chiropractice on [m]'s [organ.display_name]"
+ return z
diff --git a/code/game/objects/storage/bible.dm b/code/game/objects/storage/bible.dm
index d9e216e2b04..71232179582 100644
--- a/code/game/objects/storage/bible.dm
+++ b/code/game/objects/storage/bible.dm
@@ -6,20 +6,21 @@
new /obj/item/weapon/spacecash(src)
new /obj/item/weapon/spacecash(src)
-/*/obj/item/weapon/storage/bible/proc/bless(mob/living/carbon/M as mob)
+/obj/item/weapon/storage/bible/proc/bless(mob/living/carbon/M as mob)
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/heal_amt = 10
- for(var/datum/organ/external/affecting in H.organs)
+ for(var/name in H.organs)
+ var/datum/organ/external/affecting = H.organs[name]
if(affecting.heal_damage(heal_amt, heal_amt))
H.UpdateDamageIcon()
- return */
+ return
/obj/item/weapon/storage/bible/attack(mob/M as mob, mob/living/user as mob)
-// var/chaplain = 0
-// if(user.mind && (user.mind.assigned_role == "Chaplain"))
-// chaplain = 1
+ var/chaplain = 0
+ if(user.mind && (user.mind.assigned_role == "Chaplain"))
+ chaplain = 1
M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])")
@@ -28,10 +29,10 @@
if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
user << "\red You don't have the dexterity to do this!"
return
-// if(!chaplain)
-// user << "\red The book sizzles in your hands."
-// user.take_organ_damage(0,10)
-// return
+ if(!chaplain)
+ user << "\red The book sizzles in your hands."
+ user.take_organ_damage(0,10)
+ return
if ((user.mutations & CLUMSY) && prob(50))
user << "\red The [src] slips out of your hand and hits your head."
@@ -47,7 +48,7 @@
M << "\red The power of [src.deity_name] clears your mind of heresy!"
user << "\red You see how [M]'s eyes become clear, the cult no longer holds control over him!"
ticker.mode.remove_cultist(M.mind)
-/* if ((istype(M, /mob/living/carbon/human) && prob(60)))
+ if ((istype(M, /mob/living/carbon/human) && prob(60)))
bless(M)
for(var/mob/O in viewers(M, null))
O.show_message(text("\red [] heals [] with the power of [src.deity_name]!", user, M), 1)
@@ -59,7 +60,7 @@
M << "\red You feel dumber."
for(var/mob/O in viewers(M, null))
O.show_message(text("\red [] beats [] over the head with []!", user, M, src), 1)
- playsound(src.loc, "punch", 25, 1, -1) */
+ playsound(src.loc, "punch", 25, 1, -1)
else if(M.stat == 2)
for(var/mob/O in viewers(M, null))
O.show_message(text("\red [] smacks []'s lifeless corpse with [].", user, M, src), 1)
diff --git a/code/game/objects/storage/firstaid.dm b/code/game/objects/storage/firstaid.dm
index f8b777bf3ff..4930f569d22 100644
--- a/code/game/objects/storage/firstaid.dm
+++ b/code/game/objects/storage/firstaid.dm
@@ -81,6 +81,20 @@
new /obj/item/weapon/reagent_containers/pill/kelotane( src )
new /obj/item/weapon/reagent_containers/pill/kelotane( src )
+/obj/item/weapon/storage/pill_bottle/tramadol
+ name = "Pill bottle (tramadol)"
+ desc = "Contains painkiller pills."
+
+/obj/item/weapon/storage/pill_bottle/kelotane/New()
+ ..()
+ new /obj/item/weapon/reagent_containers/pill/tramadol( src )
+ new /obj/item/weapon/reagent_containers/pill/tramadol( src )
+ new /obj/item/weapon/reagent_containers/pill/tramadol( src )
+ new /obj/item/weapon/reagent_containers/pill/tramadol( src )
+ new /obj/item/weapon/reagent_containers/pill/tramadol( src )
+ new /obj/item/weapon/reagent_containers/pill/tramadol( src )
+ new /obj/item/weapon/reagent_containers/pill/tramadol( src )
+
/obj/item/weapon/storage/pill_bottle/antitox
name = "Pill bottle (Anti-toxin)"
desc = "Contains pills used to counter toxins."
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 1fd57987e36..680122d0167 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -494,6 +494,24 @@ Traitors and the like can also be revived with the previous role mostly intact.
//M.updatehealth()
M.buckled = initial(M.buckled)
M.handcuffed = initial(M.handcuffed)
+ if(istype(M,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ for(var/name in H.organs)
+ var/datum/organ/external/e = H.organs[name]
+ e.brute_dam = 0.0
+ e.burn_dam = 0.0
+ e.bandaged = 0.0
+ e.wound_size = 0.0
+ e.max_damage = initial(e.max_damage)
+ e.bleeding = 0
+ e.open = 0
+ e.broken = 0
+ e.destroyed = 0
+ e.perma_injury = 0
+ e.update_icon()
+ H.update_body()
+ H.update_face()
+ H.UpdateDamageIcon()
if (M.stat > 1)
M.stat=0
..()
diff --git a/code/modules/chemical/Chemistry-Reagents.dm b/code/modules/chemical/Chemistry-Reagents.dm
index 683fcd0ab3e..358423a88ce 100644
--- a/code/modules/chemical/Chemistry-Reagents.dm
+++ b/code/modules/chemical/Chemistry-Reagents.dm
@@ -667,8 +667,9 @@ datum
return
if(prob(15) && istype(M, /mob/living/carbon/human) && volume >= 30)
- var/datum/organ/external/affecting = M:get_organ("head")
+ var/datum/organ/external/head/affecting = M:get_organ("head")
if(affecting)
+ affecting.disfigured = 1
affecting.take_damage(25, 0)
M:UpdateDamageIcon()
M:emote("scream")
@@ -714,7 +715,8 @@ datum
del (M:head)
M << "\red Your helmet melts into uselessness!"
return
- var/datum/organ/external/affecting = M:get_organ("head")
+ var/datum/organ/external/head/affecting = M:get_organ("head")
+ affecting.disfigured = 1
affecting.take_damage(35, 0)
M:UpdateDamageIcon()
M:emote("scream")
@@ -729,7 +731,8 @@ datum
M.take_organ_damage(min(15, volume * 4)) // same deal as sulphuric acid
else
if(istype(M, /mob/living/carbon/human))
- var/datum/organ/external/affecting = M:get_organ("head")
+ var/datum/organ/external/head/affecting = M:get_organ("head")
+ affecting.disfigured = 1
affecting.take_damage(30, 0)
M:UpdateDamageIcon()
M:emote("scream")
@@ -1308,6 +1311,19 @@ datum
..()
return
+ tramadol
+ name = "Tramadol"
+ id = "tramadol"
+ description = "A simple, yet effective painkiller."
+ reagent_state = LIQUID
+ color = "#C8A5DC"
+
+ oxycodone
+ name = "Oxycodone"
+ id = "oxycodone"
+ description = "An effective and very addictive painkiller."
+ reagent_state = LIQUID
+ color = "#C805DC"
impedrezene
name = "Impedrezene"
diff --git a/code/modules/chemical/Chemistry-Recipes.dm b/code/modules/chemical/Chemistry-Recipes.dm
index cba158e9b0e..250c3222221 100644
--- a/code/modules/chemical/Chemistry-Recipes.dm
+++ b/code/modules/chemical/Chemistry-Recipes.dm
@@ -70,6 +70,13 @@ datum
required_reagents = list("radium" = 1, "phosphorus" = 1, "chlorine" = 1)
result_amount = 3
+ tramadol
+ name = "Tramadol"
+ id = "tramadol"
+ result = "tramadol"
+ required_reagents = list("inaprovaline" = 1, "ethanol" = 1, "oxygen" = 1)
+ result_amount = 3
+
//cyanide
// name = "Cyanide"
// id = "cyanide"
diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm
index aab93540302..bfe65f3b686 100644
--- a/code/modules/chemical/Chemistry-Tools.dm
+++ b/code/modules/chemical/Chemistry-Tools.dm
@@ -2726,6 +2726,14 @@
..()
reagents.add_reagent("kelotane", 30)
+/obj/item/weapon/reagent_containers/pill/tramadol
+ name = "Tramadol pill"
+ desc = "A simple painkiller."
+ icon_state = "pill8"
+ New()
+ ..()
+ reagents.add_reagent("tramadol", 30)
+
/obj/item/weapon/reagent_containers/pill/inaprovaline
name = "Inaprovaline pill"
desc = "Used to stabilize patients."
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 1029a993577..71e9ba890d5 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -151,7 +151,31 @@
if (!src.client)
usr << "\red [src.name] doesn't seem as though they want to talk."
+ for(var/name in organs)
+ var/datum/organ/external/temp = organs[name]
+ if(temp.destroyed)
+ usr << "\red [name] is missing [t_his] [temp.display_name]."
+ if(temp.wounds)
+ for(var/datum/organ/external/wound/w in temp.wounds)
+ var/size = w.wound_size
+ var/sizetext
+ switch(size)
+ if(1)
+ sizetext = "cut"
+ if(2)
+ sizetext = "deep cut"
+ if(3)
+ sizetext = "flesh wound"
+ if(4)
+ sizetext = "gaping wound"
+ if(5)
+ sizetext = "big gaping wound"
+ if(6)
+ sizetext = "massive wound"
+ if(w.bleeding)
+ usr << "\red [name] is bleeding from a [sizetext] on [t_his] [temp.display_name]."
+ continue
+
print_flavor_text()
usr << "\blue *---------*"
-
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index ec6c2ee981d..30545cd6513 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -55,6 +55,9 @@
var/mutantrace = null
var/list/organs = list()
+ var/bloodloss = 0
+ var/debug_leftarm
+ var/debug_lefthand
/mob/living/carbon/human/dummy
real_name = "Test Dummy"
@@ -69,24 +72,25 @@
if(!dna) dna = new /datum/dna(null)
- var/datum/organ/external/chest/chest = new /datum/organ/external/chest(src)
- var/datum/organ/external/head/head = new /datum/organ/external/head(src)
- var/datum/organ/external/l_arm/l_arm = new /datum/organ/external/l_arm(src)
- var/datum/organ/external/r_arm/r_arm = new /datum/organ/external/r_arm(src)
- var/datum/organ/external/r_leg/r_leg = new /datum/organ/external/r_leg(src)
- var/datum/organ/external/l_leg/l_leg = new /datum/organ/external/l_leg(src)
- chest.owner = src
- head.owner = src
- r_arm.owner = src
- l_arm.owner = src
- r_leg.owner = src
- l_leg.owner = src
- organs += chest
- organs += head
- organs += r_arm
- organs += l_arm
- organs += r_leg
- organs += l_leg
+ new /datum/organ/external/chest(src)
+ new /datum/organ/external/groin(src)
+ new /datum/organ/external/head(src)
+ new /datum/organ/external/l_arm(src)
+ new /datum/organ/external/r_arm(src)
+ new /datum/organ/external/r_leg(src)
+ new /datum/organ/external/l_leg(src)
+
+ var/datum/organ/external/part = new /datum/organ/external/l_hand(src)
+ part.parent = organs["l_arm"]
+ part = new /datum/organ/external/l_foot(src)
+ part.parent = organs["l_leg"]
+ part = new /datum/organ/external/r_hand(src)
+ part.parent = organs["r_arm"]
+ part = new /datum/organ/external/r_foot(src)
+ part.parent = organs["r_leg"]
+
+ debug_leftarm = organs["l_arm"]
+ debug_lefthand = organs["l_hand"]
var/g = "m"
if (gender == MALE)
@@ -170,6 +174,11 @@
var/hungry = (500 - nutrition)/5 // So overeat would be 100 and default level would be 80
if (hungry >= 70) tally += hungry/50
+ for(var/organ in list("l_leg","l_foot","r_leg","r_foot"))
+ var/datum/organ/external/o = organs["[organ]"]
+ if(o.broken)
+ tally += 6
+
if(wear_suit)
tally += wear_suit.slowdown
@@ -270,7 +279,8 @@
if (prob(50) && !shielded)
Paralyse(10)
- for(var/datum/organ/external/temp in organs)
+ for(var/name in organs)
+ var/datum/organ/external/temp = organs[name]
switch(temp.name)
if("head")
temp.take_damage(b_loss * 0.2, f_loss * 0.2)
@@ -653,7 +663,7 @@
M.show_message(text("\red [] has been hit by []", src, O), 1)
if (health > 0)
var/datum/organ/external/affecting = get_organ(pick("chest", "chest", "chest", "head"))
- if(!affecting) return
+ if(!affecting || affecting.destroyed) return
if (istype(O, /obj/effect/immovablerod))
affecting.take_damage(101, 0)
else
@@ -881,17 +891,33 @@
//because theyre located on the 'other' inventory bar.
// Gloves
- if (gloves)
- var/t1 = gloves.item_state
- if (!t1)
- t1 = gloves.icon_state
- overlays += image("icon" = 'hands.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
- if (gloves.blood_DNA)
+ var/datum/organ/external/lo = organs["l_hand"]
+ var/datum/organ/external/ro = organs["r_hand"]
+ if (!lo.destroyed || !ro.destroyed)
+ if (gloves)
+ var/t1 = gloves.item_state
+ if (!t1)
+ t1 = gloves.icon_state
+ var/icon/gloves_icon = new /icon("icon" = 'hands.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")))
+ if(lo.destroyed)
+ gloves_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
+ else if(ro.destroyed)
+ gloves_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
+ overlays += image(gloves_icon, "layer" = MOB_LAYER)
+ if (gloves.blood_DNA)
+ var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]")
+ if(lo.destroyed)
+ stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
+ else if(ro.destroyed)
+ stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
+ overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
+ else if (blood_DNA)
var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]")
+ if(lo.destroyed)
+ stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
+ else if(ro.destroyed)
+ stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
- else if (blood_DNA)
- var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]")
- overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
// Glasses
if (glasses)
var/t1 = glasses.icon_state
@@ -904,11 +930,22 @@
var/t1 = r_ear.icon_state
overlays += image("icon" = 'ears.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
// Shoes
- if (shoes)
+ lo = organs["l_foot"]
+ ro = organs["r_foot"]
+ if ((!lo.destroyed || !ro.destroyed) && shoes)
var/t1 = shoes.icon_state
- overlays += image("icon" = 'feet.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
+ var/icon/shoes_icon = new /icon("icon" = 'feet.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")))
+ if(lo.destroyed && !lying)
+ shoes_icon.Blend(new /icon('limb_mask.dmi', "right[lying?"_l":""]"), ICON_MULTIPLY)
+ else if(ro.destroyed && !lying)
+ shoes_icon.Blend(new /icon('limb_mask.dmi', "left[lying?"_l":""]"), ICON_MULTIPLY)
+ overlays += image(shoes_icon, "layer" = MOB_LAYER)
if (shoes.blood_DNA)
var/icon/stain_icon = icon('blood.dmi', "shoesblood[!lying ? "" : "2"]")
+ if(lo.destroyed)
+ stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
+ else if(ro.destroyed)
+ stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER) // Radio
/* if (w_radio)
overlays += image("icon" = 'ears.dmi', "icon_state" = "headset[!lying ? "" : "2"]", "layer" = MOB_LAYER) */
@@ -1238,28 +1275,50 @@
else if (gender == FEMALE)
g = "f"
- stand_icon = new /icon('human.dmi', "blank")
- lying_icon = new /icon('human.dmi', "blank")
+ stand_icon = new /icon('human.dmi', "torso_s")
+ lying_icon = new /icon('human.dmi', "torso_l")
var/husk = (mutations & HUSK)
//var/obese = (mutations & FAT)
+ stand_icon.Blend(new /icon('human.dmi', "chest_[g]_s"), ICON_OVERLAY)
+ lying_icon.Blend(new /icon('human.dmi', "chest_[g]_l"), ICON_OVERLAY)
+
+ var/datum/organ/external/head = organs["head"]
+ if(!head.destroyed)
+ stand_icon.Blend(new /icon('human.dmi', "head_[g]_s"), ICON_OVERLAY)
+ lying_icon.Blend(new /icon('human.dmi', "head_[g]_l"), ICON_OVERLAY)
+
+ for(var/name in organs)
+ var/datum/organ/external/part = organs[name]
+ if(!istype(part, /datum/organ/external/groin) \
+ && !istype(part, /datum/organ/external/chest) \
+ && !istype(part, /datum/organ/external/head) \
+ && !part.destroyed)
+ stand_icon.Blend(new /icon('human.dmi', "[part.icon_name]_s"), ICON_OVERLAY)
+ lying_icon.Blend(new /icon('human.dmi', "[part.icon_name]_l"), ICON_OVERLAY)
+
+ stand_icon.Blend(new /icon('human.dmi', "groin_[g]_s"), ICON_OVERLAY)
+ lying_icon.Blend(new /icon('human.dmi', "groin_[g]_l"), ICON_OVERLAY)
+
if (husk)
- stand_icon.Blend(new /icon('human.dmi', "husk_s"), ICON_OVERLAY)
- lying_icon.Blend(new /icon('human.dmi', "husk_l"), ICON_OVERLAY)
+ var/icon/husk_s = new /icon('human.dmi', "husk_s")
+ var/icon/husk_l = new /icon('human.dmi', "husk_l")
+
+ for(var/name in organs)
+ var/datum/organ/external/part = organs[name]
+ if(!istype(part, /datum/organ/external/groin) \
+ && !istype(part, /datum/organ/external/chest) \
+ && !istype(part, /datum/organ/external/head) \
+ && part.destroyed)
+ husk_s.Blend(new /icon('dam_mask.dmi', "[part.icon_name]"), ICON_SUBTRACT)
+ husk_l.Blend(new /icon('dam_mask.dmi', "[part.icon_name]2"), ICON_SUBTRACT)
+
+ stand_icon.Blend(husk_s, ICON_OVERLAY)
+ lying_icon.Blend(husk_l, ICON_OVERLAY)
/*else if(obese)
stand_icon.Blend(new /icon('human.dmi', "fatbody_s"), ICON_OVERLAY)
lying_icon.Blend(new /icon('human.dmi', "fatbody_l"), ICON_OVERLAY)*/
- else
- stand_icon.Blend(new /icon('human.dmi', "chest_[g]_s"), ICON_OVERLAY)
- lying_icon.Blend(new /icon('human.dmi', "chest_[g]_l"), ICON_OVERLAY)
-
- for (var/part in list("head", "arm_left", "arm_right", "hand_left", "hand_right", "leg_left", "leg_right", "foot_left", "foot_right"))
- stand_icon.Blend(new /icon('human.dmi', "[part]_s"), ICON_OVERLAY)
- lying_icon.Blend(new /icon('human.dmi', "[part]_l"), ICON_OVERLAY)
-
- stand_icon.Blend(new /icon('human.dmi', "groin_[g]_s"), ICON_OVERLAY)
- lying_icon.Blend(new /icon('human.dmi', "groin_[g]_l"), ICON_OVERLAY)
// Skin tone
if (s_tone >= 0)
@@ -1275,6 +1334,14 @@
lying_icon.Blend(new /icon('human.dmi', "underwear[underwear]_[g]_l"), ICON_OVERLAY)
/mob/living/carbon/human/proc/update_face()
+ if(organs)
+ var/datum/organ/external/head = organs["head"]
+ if(head)
+ if(head.destroyed)
+ del(face_standing)
+ del(face_lying)
+ return
+
if(!facial_hair_style || !hair_style) return//Seems people like to lose their icons, this should stop the runtimes for now
del(face_standing)
del(face_lying)
@@ -1978,7 +2045,7 @@ It can still be worn/put on as normal.
//SN src = null
del(src)
return
- if ((target.health >= -99.0 && target.health < 0))
+ if ((target.health >= -99.0 && target.health < config.health_threshold_dead))
target.cpr_time = world.time
var/suff = min(target.getOxyLoss(), 7)
target.oxyloss -= suff
@@ -2176,14 +2243,16 @@ It can still be worn/put on as normal.
/mob/living/carbon/human/proc/get_damaged_organs(var/brute, var/burn)
var/list/datum/organ/external/parts = list()
- for(var/datum/organ/external/organ in organs)
+ for(var/name in organs)
+ var/datum/organ/external/organ = organs[name]
if((brute && organ.brute_dam) || (burn && organ.burn_dam))
parts += organ
return parts
/mob/living/carbon/human/proc/get_damageable_organs()
var/list/datum/organ/external/parts = list()
- for(var/datum/organ/external/organ in organs)
+ for(var/name in organs)
+ var/datum/organ/external/organ = organs[name]
if(organ.brute_dam + organ.burn_dam < organ.max_damage)
parts += organ
return parts
@@ -2311,7 +2380,8 @@ It can still be worn/put on as normal.
/mob/living/carbon/human/getBruteLoss()
var/amount = 0.0
- for(var/datum/organ/external/O in organs)
+ for(var/name in organs)
+ var/datum/organ/external/O = organs[name]
amount+= O.brute_dam
return amount
@@ -2323,7 +2393,8 @@ It can still be worn/put on as normal.
/mob/living/carbon/human/getFireLoss()
var/amount = 0.0
- for(var/datum/organ/external/O in organs)
+ for(var/name in organs)
+ var/datum/organ/external/O = organs[name]
amount+= O.burn_dam
return amount
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index 0cc56c0070b..e0f779fb7a2 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -15,26 +15,31 @@
body_standing = list()
del(body_lying)
body_lying = list()
- for(var/datum/organ/external/O in organs)
- var/icon/DI = new /icon('dam_human.dmi', O.damage_state) // the damage icon for whole human
- DI.Blend(new /icon('dam_mask.dmi', O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels
- // world << "[O.icon_name] [O.damage_state] \icon[DI]"
- body_standing += DI
- DI = new /icon('dam_human.dmi', "[O.damage_state]-2") // repeat for lying icons
- DI.Blend(new /icon('dam_mask.dmi', "[O.icon_name]2"), ICON_MULTIPLY)
- // world << "[O.r_name]2 [O.d_i_state]-2 \icon[DI]"
- body_lying += DI
+
+ for(var/name in organs)
+ var/datum/organ/external/O = organs[name]
+ if(!O.destroyed)
+ O.update_icon()
+ var/icon/DI = new /icon('dam_human.dmi', O.damage_state) // the damage icon for whole human
+ DI.Blend(new /icon('dam_mask.dmi', O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels
+ // world << "[O.icon_name] [O.damage_state] \icon[DI]"
+ body_standing += DI
+ DI = new /icon('dam_human.dmi', "[O.damage_state]-2") // repeat for lying icons
+ DI.Blend(new /icon('dam_mask.dmi', "[O.icon_name]2"), ICON_MULTIPLY)
+ // world << "[O.r_name]2 [O.d_i_state]-2 \icon[DI]"
+ body_lying += DI
/mob/living/carbon/human/proc/get_organ(var/zone)
if(!zone) zone = "chest"
- for(var/datum/organ/external/O in organs)
+ for(var/name in organs)
+ var/datum/organ/external/O = organs[name]
if(O.name == zone)
return O
return null
-/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0)
+/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0)
if((damagetype != BRUTE) && (damagetype != BURN))
..(damage, damagetype, def_zone, blocked)
return 1
@@ -47,15 +52,15 @@
else
if(!def_zone) def_zone = ran_zone(def_zone)
organ = get_organ(check_zone(def_zone))
- if(!organ) return 0
+ if(!organ || organ.destroyed) return 0
if(blocked)
damage = (damage/(blocked+1))
switch(damagetype)
if(BRUTE)
- organ.take_damage(damage, 0)
+ organ.take_damage(damage, 0, sharp)
if(BURN)
- organ.take_damage(0, damage)
+ organ.take_damage(0, damage, sharp)
UpdateDamageIcon()
updatehealth()
return 1
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 55e53680200..e03e9c15043 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -27,7 +27,8 @@ emp_act
//If a specific bodypart is targetted, check how that bodypart is protected and return the value.
//If you don't specify a bodypart, it checks ALL your bodyparts for protection, and averages out the values
- for(var/datum/organ/external/organ in organs)
+ for(var/name in organs)
+ var/datum/organ/external/organ = organs[name]
armorval += checkarmor(organ, type)
organnum++
return (armorval/max(organnum, 1))
@@ -95,7 +96,7 @@ emp_act
var/armor = run_armor_check(affecting, "melee", "Your armor has protected you from a hit to the [hit_area].", "Your armor has softened hit to your [hit_area].")
if(armor >= 2) return 0
if(!I.force) return 0
- apply_damage(I.force, I.damtype, affecting, armor)
+ apply_damage(I.force, I.damtype, affecting, armor, is_cut(I))
var/bloody = 0
if((I.damtype == BRUTE) && prob(25 + (I.force * 2)))
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 60780b57203..8ecb1cb853a 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -1,4 +1,4 @@
-#define HUMAN_MAX_OXYLOSS 12 //Defines how much oxyloss humans can get per tick. No air applies this value.
+#define HUMAN_MAX_OXYLOSS 3 //Defines how much oxyloss humans can get per tick. No air applies this value.
/mob/living/carbon/human
var
@@ -73,6 +73,8 @@
UpdateLuminosity()
handle_regular_status_updates()
+ handle_pain()
+
// Update clothing
update_clothing()
@@ -227,7 +229,7 @@
var/datum/gas_mixture/environment = loc.return_air()
var/datum/air_group/breath
// HACK NEED CHANGING LATER
- if(health < 0)
+ if(health < config.health_threshold_dead)
losebreath++
if(losebreath>0) //Suffocating so do not take a breath
@@ -667,6 +669,30 @@
return //TODO: DEFERRED
handle_regular_status_updates()
+ var/leg_tally = 2
+ for(var/name in organs)
+ var/datum/organ/external/E = organs[name]
+ E.process()
+ if(E.broken || E.destroyed)
+ if(E.name == "l_hand" || E.name == "l_arm")
+ if(hand && equipped())
+ drop_item()
+ emote("scream")
+ else if(E.name == "r_hand" || E.name == "r_arm")
+ if(!hand && equipped())
+ drop_item()
+ emote("scream")
+ else if(E.name == "l_leg" || E.name == "l_foot" \
+ || E.name == "r_leg" || E.name == "r_foot" && !lying)
+ leg_tally-- // let it fail even if just foot&leg
+
+ // can't stand
+ if(leg_tally == 0)
+ emote("scream")
+ emote("collapse")
+ paralysis = 10
+
+ updatehealth()
// health = 100 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss())
@@ -729,6 +755,28 @@
if (stuttering) stuttering--
if (slurring) slurring--
+ var/datum/organ/external/head/head = organs["head"]
+ if(head && !head.disfigured)
+ if(head.brute_dam >= 45 || head.burn_dam >= 45)
+ head.disfigured = 1
+ emote("scream")
+ real_name = "Unknown"
+ src << "\red Your face has become disfigured."
+ warn_flavor_changed()
+ for(var/name in organs)
+ var/datum/organ/external/temp = organs[name]
+ if(!temp.bleeding)
+ continue
+ else
+ if(prob(35))
+ bloodloss += rand(1,10)
+ if(temp.wounds)
+ for(var/datum/organ/external/wound/W in temp.wounds)
+ if(!temp.bleeding)
+ continue
+ else
+ if(prob(25))
+ bloodloss++
if (eye_blind)
eye_blind--
blinded = 1
@@ -1053,9 +1101,14 @@
handle_shock()
..()
+ if(health < 0)
+ // health 0 makes you immediately collapse
+ shock_stage = max(shock_stage, 61)
+
if(traumatic_shock >= 80)
shock_stage += 1
else
+ if(shock_stage > 100) shock_stage = 100
shock_stage--
shock_stage = max(shock_stage, 0)
return
diff --git a/code/modules/mob/living/carbon/shock.dm b/code/modules/mob/living/carbon/shock.dm
index c3539233692..07a49bb12be 100644
--- a/code/modules/mob/living/carbon/shock.dm
+++ b/code/modules/mob/living/carbon/shock.dm
@@ -7,9 +7,26 @@
if(reagents.has_reagent("alkysine"))
src.traumatic_shock -= 10
if(reagents.has_reagent("inaprovaline"))
- src.traumatic_shock -= 15
- if(reagents.has_reagent("synaptizine"))
- src.traumatic_shock -= 50
+ src.traumatic_shock -= 25
+ if(reagents.has_reagent("tramadol"))
+ src.traumatic_shock -= 80 // make synaptizine function as good painkiller
+ if(reagents.has_reagent("oxycodone"))
+ src.traumatic_shock -= 200 // make synaptizine function as good painkiller
+ if(src.slurring)
+ src.traumatic_shock -= 20
+
+ // broken or ripped off organs will add quite a bit of pain
+ if(istype(src,/mob/living/carbon/human))
+ var/mob/living/carbon/human/M = src
+ for(var/name in M.organs)
+ var/datum/organ/external/organ = M.organs[name]
+ if(organ.destroyed || organ.open)
+ src.traumatic_shock += 60
+ else if(organ.broken)
+ src.traumatic_shock += 30
+
+ if(src.traumatic_shock < 0)
+ src.traumatic_shock = 0
return src.traumatic_shock
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index 2293f00dd3a..b253c4de1c8 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -8,7 +8,7 @@
Returns
standard 0 if fail
*/
-/mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0)
+/mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/slash = 0)
if(!damage || (blocked >= 2)) return 0
switch(damagetype)
if(BRUTE)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 7561307562c..24a2083bf8f 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -23,7 +23,8 @@
var/mob/living/carbon/human/H = src //make this damage method divide the damage to be done among all the body parts, then burn each body part for that much damage. will have better effect then just randomly picking a body part
var/divided_damage = (burn_amount)/(H.organs.len)
var/extradam = 0 //added to when organ is at max dam
- for(var/datum/organ/external/affecting in H.organs)
+ for(var/name in H.organs)
+ var/datum/organ/external/affecting = H.organs[name]
if(!affecting) continue
if(affecting.take_damage(0, divided_damage+extradam))
extradam = 0
@@ -134,6 +135,20 @@
src.updatehealth()
/mob/living/proc/revive()
+ if(istype(src, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = src
+ for(var/A in H.organs)
+ var/datum/organ/external/affecting = null
+ if(!H.organs[A]) continue
+ affecting = H.organs[A]
+ if(!istype(affecting, /datum/organ/external)) continue
+ affecting.heal_damage(1000, 1000) //fixes getting hit after ingestion, killing you when game updates organ health
+ affecting.broken = 0
+ affecting.destroyed = 0
+ for(var/datum/organ/external/wound/W in affecting.wounds)
+ W.stopbleeding()
+ H.UpdateDamageIcon()
+ H.update_body()
//src.fireloss = 0
src.setToxLoss(0)
//src.bruteloss = 0
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index c96a9080eef..e37db79675d 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -320,7 +320,8 @@
W |= M.contents
if(ishuman(M))
var/mob/living/carbon/human/G = M
- for(var/datum/organ/external/F in G.organs)
+ for(var/name in G.organs)
+ var/datum/organ/external/F = G.organs[name]
W |= F.implant
for (var/obj/item/device/pda/M in W)
diff --git a/code/modules/mob/organ/organ.dm b/code/modules/mob/organ/organ.dm
index 0de3cd6ede2..c2370b5b10e 100644
--- a/code/modules/mob/organ/organ.dm
+++ b/code/modules/mob/organ/organ.dm
@@ -1,18 +1,15 @@
/datum/organ
var
name = "organ"
- owner = null
+ mob/living/carbon/human/owner = null
proc/process()
return 0
-
proc/receive_chem(chemical as obj)
return 0
-
-
/****************************************************
EXTERNAL ORGANS
****************************************************/
@@ -29,11 +26,53 @@
max_damage = 0
wound_size = 0
max_size = 0
- var/obj/item/weapon/implant/implant = null
+ obj/item/weapon/implant/implant = null
+ display_name
+ list/wounds = list()
+ bleeding = 0
+ perma_injury = 0
+ perma_dmg = 0
+ broken = 0
+ destroyed = 0
+ destspawn
+ min_broken_damage = 30
+ datum/organ/external/parent
+ damage_msg = "\red You feel a intense pain"
+
+ var/open = 0
+ var/stage = 0
+ var/wound = 0
+
+ New(mob/living/carbon/human/H)
+ ..(H)
+ if(!display_name)
+ display_name = name
+ if(istype(H))
+ owner = H
+ H.organs[name] = src
+
+ proc/take_damage(brute, burn, sharp)
+ if((brute <= 0) && (burn <= 0))
+ return 0
+ if(destroyed)
+ return 0
+
+ if(owner) owner.pain(display_name, (brute+burn)*3, 1)
+ if(sharp)
+ var/chance = rand(1,5)
+ var/nux = brute * chance
+ if(brute_dam >= max_damage)
+ if(prob(5 * brute))
+ for(var/mob/M in viewers(owner))
+ M.show_message("\red [owner.name]'s [display_name] flies off.")
+ destroyed = 1
+ droplimb()
+ return
+ else if(prob(nux))
+ createwound(rand(1,5))
+ owner << "You feel something wet on your [display_name]"
- proc/take_damage(brute, burn)
- if((brute <= 0) && (burn <= 0)) return 0
if((src.brute_dam + src.burn_dam + brute + burn) < src.max_damage)
src.brute_dam += brute
src.burn_dam += burn
@@ -56,19 +95,57 @@
else
return 0
+ if(broken)
+ owner.emote("scream")
+
var/result = src.update_icon()
return result
- proc/heal_damage(brute, burn)
- src.brute_dam = max(0, src.brute_dam - brute)
- src.burn_dam = max(0, src.burn_dam - burn)
+ proc/heal_damage(brute, burn, internal = 0)
+ brute_dam = max(0, brute_dam - brute)
+ burn_dam = max(0, burn_dam - burn)
+ if(internal)
+ broken = 0
+ perma_injury = 0
return update_icon()
proc/get_damage() //returns total damage
- return src.brute_dam + src.burn_dam //could use src.health?
+ return max(brute_dam + burn_dam - perma_injury,perma_injury) //could use health?
+ proc/get_damage_brute()
+ return max(brute_dam+perma_injury,perma_injury)
+
+ proc/get_damage_fire()
+ return burn_dam
+
+ process()
+ if(destroyed)
+ if(destspawn)
+ droplimb()
+ return
+ if(broken == 0)
+ perma_dmg = 0
+ if(parent)
+ if(parent.destroyed)
+ destroyed = 1
+ owner:update_body()
+ return
+ if(brute_dam > min_broken_damage)
+ if(broken == 0)
+ var/dmgmsg = "[damage_msg] in your [display_name]"
+ owner << dmgmsg
+ //owner.unlock_medal("Broke Yarrr Bones!", 0, "Break a bone.", "easy")
+ for(var/mob/M in viewers(owner))
+ if(M != owner)
+ M.show_message("\red You hear a loud cracking sound coming from [owner.name].")
+ owner.emote("scream")
+ broken = 1
+ wound = "broken" //Randomise in future
+ perma_injury = brute_dam
+ return
+ return
// new damage icon system
// returns just the brute/burn damage code
@@ -105,7 +182,102 @@
return 1
return 0
+ proc/droplimb()
+ if(destroyed)
+ //owner.unlock_medal("Lost something?", 0, "Lose a limb.", "easy")
+ switch(body_part)
+ if(UPPER_TORSO)
+ owner.gib()
+ if(LOWER_TORSO)
+ owner << "\red You are now sterile."
+ if(HEAD)
+ var/obj/item/weapon/organ/head/H = new(owner.loc, owner)
+ if(owner.gender == FEMALE)
+ H.icon_state = "head_f_l"
+ H.overlays += owner.face_lying
+ H.transfer_identity(owner)
+ var/lol = pick(cardinal)
+ step(H,lol)
+ owner.update_face()
+ owner.update_body()
+ owner.death()
+ if(ARM_RIGHT)
+ var/obj/item/weapon/organ/r_arm/H = new(owner.loc, owner)
+ if(owner:organs["r_hand"])
+ var/datum/organ/external/S = owner:organs["r_hand"]
+ if(!S.destroyed)
+ var/obj/item/weapon/organ/r_hand/X = new(owner.loc, owner)
+ for(var/mob/M in viewers(owner))
+ M.show_message("\red [owner.name]'s [X.name] flies off.")
+ var/lol2 = pick(cardinal)
+ step(X,lol2)
+ var/lol = pick(cardinal)
+ step(H,lol)
+ destroyed = 1
+ if(ARM_LEFT)
+ var/obj/item/weapon/organ/l_arm/H = new(owner.loc, owner)
+ if(owner:organs["l_hand"])
+ var/datum/organ/external/S = owner:organs["l_hand"]
+ if(!S.destroyed)
+ var/obj/item/weapon/organ/l_hand/X = new(owner.loc, owner)
+ for(var/mob/M in viewers(owner))
+ M.show_message("\red [owner.name]'s [X.name] flies off in arc.")
+ var/lol2 = pick(cardinal)
+ step(X,lol2)
+ var/lol = pick(cardinal)
+ step(H,lol)
+ destroyed = 1
+ if(LEG_RIGHT)
+ var/obj/item/weapon/organ/r_leg/H = new(owner.loc, owner)
+ if(owner:organs["r_foot"])
+ var/datum/organ/external/S = owner:organs["r_foot"]
+ if(!S.destroyed)
+ var/obj/item/weapon/organ/l_foot/X = new(owner.loc, owner)
+ for(var/mob/M in viewers(owner))
+ M.show_message("\red [owner.name]'s [X.name] flies off flies off in arc.")
+ var/lol2 = pick(cardinal)
+ step(X,lol2)
+ var/lol = pick(cardinal)
+ step(H,lol)
+ destroyed = 1
+ if(LEG_LEFT)
+ var/obj/item/weapon/organ/l_leg/H = new(owner.loc, owner)
+ if(owner:organs["l_foot"])
+ var/datum/organ/external/S = owner:organs["l_foot"]
+ if(!S.destroyed)
+ var/obj/item/weapon/organ/l_foot/X = new(owner.loc, owner)
+ for(var/mob/M in viewers(owner))
+ M.show_message("\red [owner.name]'s [X.name] flies off.")
+ var/lol2 = pick(cardinal)
+ step(X,lol2)
+ var/lol = pick(cardinal)
+ step(H,lol)
+ destroyed = 1
+
+ proc/createwound(var/size = 1)
+ if(ishuman(src.owner))
+ var/datum/organ/external/wound/W = new(src)
+ W.bleeding = 1
+ src.owner:bloodloss += 10 * size
+ W.wound_size = size
+ W.owner = src.owner
+ src.wounds += W
+
+/datum/organ/external/wound
+ name = "wound"
+ wound_size = 1
+ icon_name = "wound"
+ display_name = "wound"
+ parent = null
+
+ proc/stopbleeding()
+ if(!src.bleeding)
+ return
+ var/t = 10 * src.wound_size
+ src.owner:bloodloss -= t
+ src.bleeding = 0
+ del(src)
/****************************************************
INTERNAL ORGANS
diff --git a/code/modules/mob/organ/organ_external.dm b/code/modules/mob/organ/organ_external.dm
index 029d28aa721..974ed3b3955 100644
--- a/code/modules/mob/organ/organ_external.dm
+++ b/code/modules/mob/organ/organ_external.dm
@@ -2,61 +2,189 @@
name = "chest"
icon_name = "chest"
max_damage = 150
+ min_broken_damage = 75
body_part = UPPER_TORSO
-/*/datum/organ/external/groin
+/datum/organ/external/groin
name = "groin"
- icon_name = "groin"
+ icon_name = "diaper"
+ max_damage = 115
+ min_broken_damage = 70
body_part = LOWER_TORSO
-*/
+
/datum/organ/external/head
name = "head"
icon_name = "head"
- max_damage = 125
+ max_damage = 75
+ min_broken_damage = 40
body_part = HEAD
+ var/disfigured = 0
/datum/organ/external/l_arm
name = "l_arm"
+ display_name = "left arm"
icon_name = "l_arm"
max_damage = 75
+ min_broken_damage = 30
body_part = ARM_LEFT
/datum/organ/external/l_leg
name = "l_leg"
+ display_name = "left leg"
icon_name = "l_leg"
max_damage = 75
+ min_broken_damage = 30
body_part = LEG_LEFT
/datum/organ/external/r_arm
name = "r_arm"
+ display_name = "right arm"
icon_name = "r_arm"
max_damage = 75
+ min_broken_damage = 30
body_part = ARM_RIGHT
/datum/organ/external/r_leg
name = "r_leg"
+ display_name = "right leg"
icon_name = "r_leg"
max_damage = 75
+ min_broken_damage = 30
body_part = LEG_RIGHT
-/*Leaving these here in case we want to use them later
/datum/organ/external/l_foot
- name = "l foot"
+ name = "l_foot"
+ display_name = "left foot"
icon_name = "l_foot"
+ max_damage = 40
+ min_broken_damage = 15
body_part = FOOT_LEFT
/datum/organ/external/r_foot
- name = "r foot"
+ name = "r_foot"
+ display_name = "right foot"
icon_name = "r_foot"
+ max_damage = 40
+ min_broken_damage = 15
body_part = FOOT_RIGHT
/datum/organ/external/r_hand
- name = "r hand"
+ name = "r_hand"
+ display_name = "right hand"
icon_name = "r_hand"
+ max_damage = 40
+ min_broken_damage = 15
body_part = HAND_RIGHT
/datum/organ/external/l_hand
- name = "l hand"
+ name = "l_hand"
+ display_name = "left hand"
icon_name = "l_hand"
+ max_damage = 40
+ min_broken_damage = 15
body_part = HAND_LEFT
-*/
\ No newline at end of file
+
+obj/item/weapon/organ
+ icon = 'human.dmi'
+
+obj/item/weapon/organ/New(loc, mob/living/carbon/human/H)
+ ..(loc)
+ if(!istype(H))
+ return
+ if(H.dna)
+ blood_DNA = H.dna.unique_enzymes
+ blood_type = H.b_type
+
+ var/icon/I = new /icon(icon, icon_state)
+
+ if (H.s_tone >= 0)
+ I.Blend(rgb(H.s_tone, H.s_tone, H.s_tone), ICON_ADD)
+ else
+ I.Blend(rgb(-H.s_tone, -H.s_tone, -H.s_tone), ICON_SUBTRACT)
+ icon = I
+
+obj/item/weapon/organ/head
+ name = "head"
+ icon_state = "head_m_l"
+ var/mob/living/carbon/brain/brainmob
+ var/brain_op_stage = 0
+
+obj/item/weapon/organ/head/proc/transfer_identity(var/mob/living/carbon/human/H)//Same deal as the regular brain proc. Used for human-->head
+ brainmob = new(src)
+ brainmob.name = H.real_name
+ brainmob.real_name = H.real_name
+ brainmob.dna = H.dna
+ if(H.mind)
+ H.mind.transfer_to(brainmob)
+
+obj/item/weapon/organ/head/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype(W,/obj/item/weapon/scalpel))
+ switch(brain_op_stage)
+ if(0)
+ for(var/mob/O in (oviewers(brainmob) - user))
+ O.show_message("\red [brainmob] is beginning to have \his head cut open with [src] by [user].", 1)
+ brainmob << "\red [user] begins to cut open your head with [src]!"
+ user << "\red You cut [brainmob]'s head open with [src]!"
+
+ brain_op_stage = 1
+
+ if(2)
+ for(var/mob/O in (oviewers(brainmob) - user))
+ O.show_message("\red [brainmob] is having \his connections to the brain delicately severed with [src] by [user].", 1)
+ brainmob << "\red [user] begins to cut open your head with [src]!"
+ user << "\red You cut [brainmob]'s head open with [src]!"
+
+ brain_op_stage = 3.0
+ else
+ ..()
+ else if(istype(W,/obj/item/weapon/circular_saw))
+ switch(brain_op_stage)
+ if(1)
+ for(var/mob/O in (oviewers(brainmob) - user))
+ O.show_message("\red [brainmob] has \his skull sawed open with [src] by [user].", 1)
+ brainmob << "\red [user] begins to saw open your head with [src]!"
+ user << "\red You saw [brainmob]'s head open with [src]!"
+
+ brain_op_stage = 2
+ if(3)
+ for(var/mob/O in (oviewers(brainmob) - user))
+ O.show_message("\red [brainmob] has \his spine's connection to the brain severed with [src] by [user].", 1)
+ brainmob << "\red [user] severs your brain's connection to the spine with [src]!"
+ user << "\red You sever [brainmob]'s brain's connection to the spine with [src]!"
+
+ user.attack_log += "\[[time_stamp()]\] Debrained [brainmob.name] ([brainmob.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])"
+ brainmob.attack_log += "\[[time_stamp()]\] Debrained by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])"
+
+ var/obj/item/brain/B = new(loc)
+ B.transfer_identity(brainmob)
+
+ brain_op_stage = 4.0
+ else
+ ..()
+ else
+ ..()
+
+obj/item/weapon/organ/l_arm
+ name = "left arm"
+ icon_state = "l_arm_l"
+obj/item/weapon/organ/l_foot
+ name = "left foot"
+ icon_state = "l_foot_l"
+obj/item/weapon/organ/l_hand
+ name = "left hand"
+ icon_state = "l_hand_l"
+obj/item/weapon/organ/l_leg
+ name = "left leg"
+ icon_state = "l_leg_l"
+obj/item/weapon/organ/r_arm
+ name = "right arm"
+ icon_state = "r_arm_l"
+obj/item/weapon/organ/r_foot
+ name = "right foot"
+ icon_state = "r_foot_l"
+obj/item/weapon/organ/r_hand
+ name = "right hand"
+ icon_state = "r_hand_l"
+obj/item/weapon/organ/r_leg
+ name = "right leg"
+ icon_state = "r_leg_l"
diff --git a/code/modules/mob/organ/pain.dm b/code/modules/mob/organ/pain.dm
new file mode 100644
index 00000000000..5fcefd73c67
--- /dev/null
+++ b/code/modules/mob/organ/pain.dm
@@ -0,0 +1,48 @@
+mob/proc/flash_pain()
+ flick("pain",pain)
+
+mob/var/list/pain_stored = list()
+mob/var/last_pain_message = ""
+mob/var/next_pain_time = 0
+
+// partname is the name of a body part
+// amount is a num from 1 to 100
+mob/proc/pain(var/partname, var/amount, var/force)
+ if(stat >= 2) return
+ if(world.time < next_pain_time && !force)
+ return
+ if(amount > 10 && istype(src,/mob/living/carbon/human))
+ if(src:paralysis)
+ src:paralysis = max(0, src:paralysis-round(amount/10))
+ if(amount > 50 && prob(amount / 5))
+ src:drop_item()
+ var/msg
+ switch(amount)
+ if(1 to 10)
+ msg = "Your [partname] hurts a bit."
+ if(11 to 90)
+ flash_weak_pain()
+ msg = "Ouch! Your [partname] hurts."
+ if(91 to 10000)
+ flash_pain()
+ msg = "OH GOD! Your [partname] is hurting terribly!"
+ if(msg && (msg != last_pain_message || prob(10)))
+ last_pain_message = msg
+ src << msg
+ next_pain_time = world.time + (100 - amount)
+
+mob/living/carbon/human/proc/handle_pain()
+ // not when sleeping
+ if(stat >= 2) return
+ var/maxdam = 0
+ var/datum/organ/external/damaged_organ = null
+ for(var/name in organs)
+ var/datum/organ/external/E = organs[name]
+ var/dam = E.get_damage()
+ // make the choice of the organ depend on damage,
+ // but also sometimes use one of the less damaged ones
+ if(dam > maxdam && (maxdam == 0 || prob(70)) )
+ damaged_organ = E
+ maxdam = dam
+ if(damaged_organ)
+ pain(damaged_organ.display_name, maxdam, 0)
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 4e2ab637348..601f0cc256c 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -10,8 +10,8 @@
canmove = 0
icon = null
invisibility = 101
- for(var/t in organs)
- del(t)
+ for(var/name in organs)
+ del(organs[name])
var/atom/movable/overlay/animation = new /atom/movable/overlay( loc )
animation.icon_state = "blank"
animation.icon = 'mob.dmi'
@@ -51,8 +51,8 @@
/mob/living/carbon/human/AIize()
if (monkeyizing)
return
- for(var/t in organs)
- del(t)
+ for(var/name in organs)
+ del(organs[name])
return ..()
/mob/living/carbon/AIize()
@@ -153,8 +153,8 @@
canmove = 0
icon = null
invisibility = 101
- for(var/t in organs)
- del(t)
+ for(var/name in organs)
+ del(organs[name])
if(client)
//client.screen -= main_hud1.contents
client.screen -= hud_used.contents
@@ -216,8 +216,8 @@
canmove = 0
icon = null
invisibility = 101
- for(var/t in organs)
- del(t)
+ for(var/name in organs)
+ del(organs[name])
var/alien_caste = pick("Hunter","Sentinel","Drone")
var/mob/living/carbon/alien/humanoid/new_xeno
@@ -256,8 +256,8 @@
canmove = 0
icon = null
invisibility = 101
- for(var/t in organs)
- del(t)
+ for(var/name in organs)
+ del(organs[name])
if(reproduce)
var/number = pick(2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,4)
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 2a7d8813eb8..f2250483465 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -708,6 +708,36 @@
H.merge(H2)
H.loc = P
+
+ if((P.dir & (P.dir - 1)) || istype(P,/obj/structure/disposalpipe/junction) || istype(P,/obj/structure/disposalpipe/sortjunction))
+ for(var/mob/M in H)
+ M.weakened += 2
+ if(prob(20))
+ M.paralysis += 2
+ if(istype(M,/mob/living/carbon/human))
+ var/name = pick(M:organs)
+ var/datum/organ/external/temp = M:organs[name]
+ if (istype(temp, /datum/organ/external))
+ temp.take_damage(4, 0)
+ if(temp.name == "head")
+ M.paralysis += 4
+ M << "\red Your head smashes into a rogue piece of metal!"
+ else if(temp.name == "groin")
+ M.weakened += 4
+ M << "\red You're gonna remember that one in the morning!"
+ M:UpdateDamageIcon()
+ //M:UpdateDamage() //doesnt fucking exist if you arent a blob
+ else
+ M.bruteloss += 4
+ if(prob(2))
+ M << "\red Your elbow doesn't bend that way, dammit!"
+ //else
+ // M << "\red You are tossed about in the pipes!"
+ M << 'clang.ogg'
+ for (var/mob/O in hearers(get_turf(src)))
+ O << "CLONG!"
+
+ playsound(src.loc, 'clang.ogg', 50, 0, 0)
else // if wasn't a pipe, then set loc to turf
H.loc = T
return null
@@ -750,7 +780,7 @@
H.active = 0
H.loc = src
return
- if(T.intact && istype(T,/turf/simulated/floor)) //intact floor, pop the tile
+ if(istype(T,/turf/simulated/floor) && T.intact) //intact floor, pop the tile
var/turf/simulated/floor/F = T
//F.health = 100
F.burnt = 1
diff --git a/code/unused/_debug.dm b/code/unused/_debug.dm
index 61ec522c9c2..b9cbcdf4306 100644
--- a/code/unused/_debug.dm
+++ b/code/unused/_debug.dm
@@ -486,9 +486,13 @@ Doing this because FindTurfs() isn't even used
e.bandaged = 0.0
e.wound_size = 0.0
e.max_damage = initial(e.max_damage)
+ e.broken = 0
+ e.destroyed = 0
+ e.perma_injury = 0
e.update_icon()
if(src.type == /mob/living/carbon/human)
var/mob/living/carbon/human/H = src
+ H.update_body()
H.UpdateDamageIcon()
else
alert("Debugging off")
diff --git a/config/config.txt b/config/config.txt
index 7f3083f2b1e..61a91abec04 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -43,7 +43,7 @@ SQL_ENABLED 0
PROBABILITY EXTENDED 0
PROBABILITY TRAITOR 4
PROBABILITY METEOR 0
-PROBABILITY MALFUNCTION 1
+PROBABILITY MALFUNCTION 0
PROBABILITY BLOB 1
PROBABILITY NUCLEAR 0
PROBABILITY SANDBOX 0
diff --git a/config/game_options.txt b/config/game_options.txt
index 6521afe1867..64b4abbc031 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -1,7 +1,7 @@
### HEALTH ###
## level of health at which a mob becomes unconscious (crit)
-HEALTH_THRESHOLD_CRIT 0
+HEALTH_THRESHOLD_CRIT -50
## level of health at which a mob becomes dead
HEALTH_THRESHOLD_DEAD -100
diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi
index e355f58934d..ae8fd76d54b 100644
Binary files a/icons/mob/human.dmi and b/icons/mob/human.dmi differ
diff --git a/icons/mob/limb_mask.dmi b/icons/mob/limb_mask.dmi
new file mode 100644
index 00000000000..ba4d0e34566
Binary files /dev/null and b/icons/mob/limb_mask.dmi differ
diff --git a/maps/tgstation.2.0.8.dmm b/maps/tgstation.2.0.8.dmm
index 48338488f1f..c787822be5d 100644
--- a/maps/tgstation.2.0.8.dmm
+++ b/maps/tgstation.2.0.8.dmm
@@ -2748,7 +2748,7 @@
"baR" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/maintcentral)
"baS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor/plating,/area/maintenance/maintcentral)
"baT" = (/obj/structure/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/extinguisher,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/maintenance/maintcentral)
-"baU" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/table,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
+"baU" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/table,/obj/item/weapon/storage/pill_bottle/tramadol{pixel_x = 8},/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/ointment,/obj/item/stack/medical/ointment,/obj/item/stack/medical/ointment,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
"baV" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
"baW" = (/obj/structure/morgue,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue)
"baX" = (/turf/simulated/floor{icon_state = "dark"},/area/medical/morgue)
@@ -3621,7 +3621,7 @@
"brG" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/crew_quarters/bar)
"brH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/sortjunction{sortType = list("Bar")},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor/plating,/area/maintenance/maintcentral)
"brI" = (/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 8; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/maintcentral)
-"brJ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/table,/obj/item/weapon/storage/backpack/medic{pixel_x = 3; pixel_y = 6},/obj/item/weapon/storage/backpack/medic{pixel_x = 3; pixel_y = 6},/obj/item/weapon/cleaner,/obj/machinery/light{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
+"brJ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/table,/obj/item/weapon/storage/backpack/medic{pixel_x = 3; pixel_y = 6},/obj/item/weapon/storage/backpack/medic{pixel_x = 3; pixel_y = 6},/obj/item/weapon/cleaner,/obj/machinery/light{dir = 8},/obj/item/weapon/storage/pill_bottle/tramadol,/obj/item/weapon/storage/pill_bottle/tramadol,/obj/item/weapon/storage/pill_bottle/tramadol,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
"brK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
"brL" = (/obj/structure/closet/secure_closet/medical1{pixel_x = 5},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/medical/medbay)
"brM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
@@ -4468,60 +4468,60 @@
"bHV" = (/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Obshutter"; name = "Observation Shutters"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/medical/surgery)
"bHW" = (/obj/structure/table,/obj/item/weapon/cigpacket,/obj/machinery/atmospherics/pipe/manifold{color = "red"; icon_state = "manifold-r-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"bHX" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
-"bHY" = (/obj/machinery/optable{id = "medbay"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
-"bHZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
-"bIa" = (/obj/structure/table,/obj/item/weapon/circular_saw,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
-"bIb" = (/obj/machinery/r_n_d/server{id_with_download_string = "1"; id_with_upload_string = "1"; name = "Core R&D Server"; server_id = 1},/obj/machinery/atmospherics/pipe/simple,/turf/simulated/floor/grid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server)
-"bIc" = (/obj/machinery/camera{c_tag = "Server Room"; dir = 2; network = "SS13"; pixel_x = 22},/turf/simulated/floor/grid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server)
-"bId" = (/obj/machinery/camera{c_tag = "Server Room"; dir = 2; network = "RD"},/turf/simulated/floor/grid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server)
-"bIe" = (/obj/machinery/blackbox_recorder,/obj/machinery/atmospherics/pipe/simple,/turf/simulated/floor/grid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server)
-"bIf" = (/obj/structure/disposalpipe/segment{dir = 1},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"bIg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/sign/biohazard{pixel_x = 28},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"bIh" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/requests_console{department = "Xenobiology"; departmentType = 0; pixel_x = -30; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
-"bIi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
-"bIj" = (/obj/structure/stool/chair,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
-"bIk" = (/obj/machinery/atmospherics/valve,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
-"bIl" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
-"bIm" = (/obj/machinery/atmospherics/pipe/simple{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"bIn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"bIo" = (/turf/simulated/wall,/area/assembly/chargebay)
-"bIp" = (/obj/machinery/recharge_station,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "bot"},/area/assembly/chargebay)
-"bIq" = (/obj/machinery/recharge_station,/turf/simulated/floor{icon_state = "bot"},/area/assembly/chargebay)
-"bIr" = (/obj/machinery/door/airlock/maintenance{name = "Assembly Line Maintenance"; req_access_txt = "12;29"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"bIs" = (/obj/effect/showcase{icon_state = "showcase_3"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/assembly/chargebay)
-"bIt" = (/obj/machinery/light,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/assembly/chargebay)
-"bIu" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor{icon_state = "arrival"; dir = 8},/area/hallway/primary/aft)
-"bIv" = (/obj/machinery/atmospherics/pipe/simple{color = "cyan"; dir = 10; icon_state = "intact-c"; initialize_directions = 10; level = 2},/turf/simulated/wall,/area/maintenance/asmaint)
-"bIw" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor{icon_state = "bot"},/area/atmos)
-"bIx" = (/obj/machinery/light/small,/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{icon_state = "bot"},/area/atmos)
-"bIy" = (/obj/machinery/dispenser{pltanks = 0},/turf/simulated/floor,/area/atmos)
-"bIz" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/atmos)
-"bIA" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor{icon_state = "warning"},/area/atmos)
-"bIB" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor{icon_state = "warning"},/area/atmos)
-"bIC" = (/obj/machinery/portable_atmospherics/canister/air,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/atmos)
-"bID" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/simulated/floor,/area/atmos)
-"bIE" = (/obj/structure/table,/obj/item/weapon/packageWrap,/obj/item/device/destTagger{pixel_x = 4; pixel_y = 3},/turf/simulated/floor,/area/atmos)
-"bIF" = (/obj/machinery/door/airlock/maintenance{name = "Atmospherics Access"; req_access_txt = "24"},/turf/simulated/floor,/area/atmos)
-"bIG" = (/obj/machinery/atmospherics/pipe/manifold{color = "yellow"; dir = 8; icon_state = "manifold-y"; level = 2},/turf/simulated/floor,/area/atmos)
-"bIH" = (/obj/machinery/atmospherics/pipe/manifold{color = "yellow"; icon_state = "manifold-y"; level = 2},/turf/simulated/floor,/area/atmos)
-"bII" = (/obj/machinery/atmospherics/pipe/simple{color = "yellow"; dir = 4; icon_state = "intact-y"; level = 2},/obj/machinery/atmospherics/pipe/simple{color = "yellow"; icon_state = "intact-y"; level = 2},/turf/simulated/floor,/area/atmos)
-"bIJ" = (/obj/machinery/atmospherics/pipe/simple{color = "yellow"; dir = 4; icon_state = "intact-y"; level = 2},/obj/machinery/atmospherics/pipe/simple{color = "red"; icon_state = "intact-r"; level = 2},/turf/simulated/floor,/area/atmos)
-"bIK" = (/obj/machinery/atmospherics/pipe/simple{color = "yellow"; icon_state = "intact-y"; level = 2},/obj/machinery/atmospherics/pipe/simple{color = "yellow"; dir = 4; icon_state = "intact-y"; level = 2},/turf/simulated/floor,/area/atmos)
-"bIL" = (/obj/machinery/atmospherics/pipe/simple{color = "green"; icon_state = "intact-g"; level = 2},/obj/machinery/atmospherics/binary/pump{dir = 8; icon_state = "intact_on"; name = "Mix to Tank/Distro"; on = 1},/turf/simulated/floor,/area/atmos)
-"bIM" = (/obj/machinery/atmospherics/valve/digital{color = "yellow"; dir = 4; name = "Gas Mix Outlet Valve"},/turf/simulated/floor{icon_state = "green"; dir = 6},/area/atmos)
-"bIN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple{color = "yellow"; dir = 4; icon_state = "intact-y"; initialize_directions = 12; level = 1},/obj/machinery/atmospherics/pipe/simple{color = "cyan"; icon_state = "intact-c"},/turf/simulated/floor/plating,/area/atmos)
-"bIO" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple{color = "yellow"; dir = 4; icon_state = "intact-y"; initialize_directions = 12; level = 1},/turf/space,/area)
-"bIP" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id_tag = "waste_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos)
-"bIQ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"bIR" = (/obj/structure/stool/chair{dir = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo)
-"bIS" = (/obj/structure/stool/chair{dir = 1},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo)
-"bIT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/cmo)
-"bIU" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/medical{name = "Surgery Observation"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "dark"},/area/medical/surgery)
-"bIV" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "dark"},/area/medical/surgery)
-"bIW" = (/obj/structure/stool/chair{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/medical/surgery)
-"bIX" = (/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Obshutter"; name = "Observation Shutters"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/medical/surgery)
-"bIY" = (/obj/structure/table,/obj/item/weapon/surgicaldrill,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
-"bIZ" = (/obj/structure/closet/secure_closet/medical2,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
+"bHY" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
+"bHZ" = (/obj/structure/table,/obj/item/weapon/circular_saw,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
+"bIa" = (/obj/machinery/r_n_d/server{id_with_download_string = "1"; id_with_upload_string = "1"; name = "Core R&D Server"; server_id = 1},/obj/machinery/atmospherics/pipe/simple,/turf/simulated/floor/grid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server)
+"bIb" = (/obj/machinery/camera{c_tag = "Server Room"; dir = 2; network = "SS13"; pixel_x = 22},/turf/simulated/floor/grid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server)
+"bIc" = (/obj/machinery/camera{c_tag = "Server Room"; dir = 2; network = "RD"},/turf/simulated/floor/grid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server)
+"bId" = (/obj/machinery/blackbox_recorder,/obj/machinery/atmospherics/pipe/simple,/turf/simulated/floor/grid{name = "Server Base"; nitrogen = 500; oxygen = 0; temperature = 80},/area/toxins/server)
+"bIe" = (/obj/structure/disposalpipe/segment{dir = 1},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/pipe/manifold{color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"bIf" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/sign/biohazard{pixel_x = 28},/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"bIg" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/requests_console{department = "Xenobiology"; departmentType = 0; pixel_x = -30; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
+"bIh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
+"bIi" = (/obj/structure/stool/chair,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
+"bIj" = (/obj/machinery/atmospherics/valve,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
+"bIk" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology)
+"bIl" = (/obj/machinery/atmospherics/pipe/simple{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"bIm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = "Streight"},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"bIn" = (/turf/simulated/wall,/area/assembly/chargebay)
+"bIo" = (/obj/machinery/recharge_station,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "bot"},/area/assembly/chargebay)
+"bIp" = (/obj/machinery/recharge_station,/turf/simulated/floor{icon_state = "bot"},/area/assembly/chargebay)
+"bIq" = (/obj/machinery/door/airlock/maintenance{name = "Assembly Line Maintenance"; req_access_txt = "12;29"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"bIr" = (/obj/effect/showcase{icon_state = "showcase_3"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/assembly/chargebay)
+"bIs" = (/obj/machinery/light,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/assembly/chargebay)
+"bIt" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor{icon_state = "arrival"; dir = 8},/area/hallway/primary/aft)
+"bIu" = (/obj/machinery/atmospherics/pipe/simple{color = "cyan"; dir = 10; icon_state = "intact-c"; initialize_directions = 10; level = 2},/turf/simulated/wall,/area/maintenance/asmaint)
+"bIv" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor{icon_state = "bot"},/area/atmos)
+"bIw" = (/obj/machinery/light/small,/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{icon_state = "bot"},/area/atmos)
+"bIx" = (/obj/machinery/dispenser{pltanks = 0},/turf/simulated/floor,/area/atmos)
+"bIy" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/atmos)
+"bIz" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor{icon_state = "warning"},/area/atmos)
+"bIA" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor{icon_state = "warning"},/area/atmos)
+"bIB" = (/obj/machinery/portable_atmospherics/canister/air,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/atmos)
+"bIC" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/simulated/floor,/area/atmos)
+"bID" = (/obj/structure/table,/obj/item/weapon/packageWrap,/obj/item/device/destTagger{pixel_x = 4; pixel_y = 3},/turf/simulated/floor,/area/atmos)
+"bIE" = (/obj/machinery/door/airlock/maintenance{name = "Atmospherics Access"; req_access_txt = "24"},/turf/simulated/floor,/area/atmos)
+"bIF" = (/obj/machinery/atmospherics/pipe/manifold{color = "yellow"; dir = 8; icon_state = "manifold-y"; level = 2},/turf/simulated/floor,/area/atmos)
+"bIG" = (/obj/machinery/atmospherics/pipe/manifold{color = "yellow"; icon_state = "manifold-y"; level = 2},/turf/simulated/floor,/area/atmos)
+"bIH" = (/obj/machinery/atmospherics/pipe/simple{color = "yellow"; dir = 4; icon_state = "intact-y"; level = 2},/obj/machinery/atmospherics/pipe/simple{color = "yellow"; icon_state = "intact-y"; level = 2},/turf/simulated/floor,/area/atmos)
+"bII" = (/obj/machinery/atmospherics/pipe/simple{color = "yellow"; dir = 4; icon_state = "intact-y"; level = 2},/obj/machinery/atmospherics/pipe/simple{color = "red"; icon_state = "intact-r"; level = 2},/turf/simulated/floor,/area/atmos)
+"bIJ" = (/obj/machinery/atmospherics/pipe/simple{color = "yellow"; icon_state = "intact-y"; level = 2},/obj/machinery/atmospherics/pipe/simple{color = "yellow"; dir = 4; icon_state = "intact-y"; level = 2},/turf/simulated/floor,/area/atmos)
+"bIK" = (/obj/machinery/atmospherics/pipe/simple{color = "green"; icon_state = "intact-g"; level = 2},/obj/machinery/atmospherics/binary/pump{dir = 8; icon_state = "intact_on"; name = "Mix to Tank/Distro"; on = 1},/turf/simulated/floor,/area/atmos)
+"bIL" = (/obj/machinery/atmospherics/valve/digital{color = "yellow"; dir = 4; name = "Gas Mix Outlet Valve"},/turf/simulated/floor{icon_state = "green"; dir = 6},/area/atmos)
+"bIM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple{color = "yellow"; dir = 4; icon_state = "intact-y"; initialize_directions = 12; level = 1},/obj/machinery/atmospherics/pipe/simple{color = "cyan"; icon_state = "intact-c"},/turf/simulated/floor/plating,/area/atmos)
+"bIN" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple{color = "yellow"; dir = 4; icon_state = "intact-y"; initialize_directions = 12; level = 1},/turf/space,/area)
+"bIO" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; icon_state = "in"; id_tag = "waste_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos)
+"bIP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
+"bIQ" = (/obj/structure/stool/chair{dir = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo)
+"bIR" = (/obj/structure/stool/chair{dir = 1},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/medical/cmo)
+"bIS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/cmo)
+"bIT" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/medical{name = "Surgery Observation"; req_access_txt = "5"},/turf/simulated/floor{icon_state = "dark"},/area/medical/surgery)
+"bIU" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "dark"},/area/medical/surgery)
+"bIV" = (/obj/structure/stool/chair{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/medical/surgery)
+"bIW" = (/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Obshutter"; name = "Observation Shutters"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/medical/surgery)
+"bIX" = (/obj/structure/table,/obj/item/weapon/surgicaldrill,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
+"bIY" = (/obj/machinery/optable{id = "medbay"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
+"bIZ" = (/obj/structure/table,/obj/item/weapon/surgical_tool/bonegel,/obj/item/weapon/surgical_tool/bonecracker,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"bJa" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
"bJb" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
"bJc" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; icon_state = "in"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
@@ -4645,7 +4645,7 @@
"bLq" = (/obj/structure/grille,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Obshutter"; name = "Observation Shutters"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/surgery)
"bLr" = (/obj/structure/table,/obj/item/weapon/cautery{pixel_x = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"bLs" = (/obj/structure/table,/obj/machinery/light,/obj/item/device/radio/intercom{pixel_y = -25},/obj/item/weapon/cleaner,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
-"bLt" = (/obj/machinery/vending/wallmed2{pixel_y = -28},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
+"bLt" = (/obj/machinery/vending/wallmed2{pixel_y = -28},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/closet/secure_closet/medical2,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"bLu" = (/obj/structure/closet/crate/freezer,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"bLv" = (/turf/simulated/wall/r_wall,/area/medical/virology)
"bLw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/window/reinforced,/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/medical/research{name = "Research Division"})
@@ -7954,16 +7954,16 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDPbwhbDQbwhbDRaaaaaeaaaaaebsnbsnbAebDSbDSbDSbDSbAfbDTaaaaaaaaaboMbDUbDVbDWbDXbDYbDZbEabEbbEbbEcbEdbEebEfbEbbEgbEgbEhbEibEjbEkbALbElbCVbEmbCWbEnbEobCVbCVbEobCVbDdbDebEpbEqbErbEsbEtbEubEvbEwbCVbExaaeaaaaaaaaaaaaaaaaaeaaaaaaaaaaaabsAbEybEzbEAbEBbEBbEBbEBbEBbECbkXbEDbEEbEFbEGbEHbEIbEJbzBbEKbEKbELbEMbENbEObEPbEQbERbESbETbEUbEVbEWbEXbEYbETbEZbFabFbbFabCqbhebllaYdaYdbtlbtlbtlbtlbtlaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaabtqbFcbyHbyHbyHbyHbyHbFdbuLbyGbyHbFebuLbuLbuLbuLbtqaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaaaaaaaaaaeaaeaaaaaeaaaaaaaaaboMboMbDVbFfbFgbCNboMboMboMboMbFhbFibCPbFibFjbFkbFlbFmbFnbplbFobsAbFpbCVbCVbFqbCVbCVbCVbCVbFrbFsbFtbFubCVbEqbFvbFwbFxbCVbFybFzbFAbExaaebFBbFBbFBbFBbFBaaeaaeaaeaaeaaebsAbsAbFCbFDbEBbFEbFFbFGbFHbFIbFJbxdbxdbxdbFKbFLbFMbxdbxdbxdbzBbFNbFObFPbFQbFRbEQboCbFSbCqbFTbFbbFUbFbbFVbCqbFWbFXbFYbFZbCqbGabllbGbaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaebtqbuLbuLbuLbuLbuLbuLbBsbuLbFebuLbuLbuLbuLbuLbtqbtqaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaeaaaaaeaaaaaaaaaaaeboMbDVbGcbGdbGebGdbGdbGfboMbGgbGhbGibGhbGjbFkbGkbGlbswbGmbGnbsAbGobCVbGpbCWbGqbCVbCVbCVbDebGrbGsbGtbFAbEqbGubGvbGwbGxbGybGzbGAbGBbGCbGDbGEbGFbGGbFBaaeaaaaaaaaaaaaaaebGHbFCbFDbEBbGIbGJbGKbGLbGMbGNbxdbGObGPbGQbGRbAUbGSbGTbGUbzBbGVbEQbGWbEQbGVbEQboCbGXbGYbGZbHabHbbHbbHbbHcbHbbDEbHdbHebCqbCqbllbHfaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaabtqbtqbzZbuLbuLbuLbuLbHgbuLbuLbuLbuLbuLbuLbtqbtqaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeboMbHhbHiboMbCNboMboMbHjbHkbGdbGdbHlbqfbqfbFkbHmbGlbpcbplbpcbHnbCVbCVbCVbHobHpbHqbHrbHsbHtbGrbHubHvbHwbHxbHybHzbHAbHBbHCbHDbHEbExaaebHFbHGbGGbHHbFBaaeaaaaaaaaaaaaaaebHIbHJbHKbHLbHMbHNbHObHPbHQbHRbHSbHTbHUbHVbHWbHXbHYbHZbIabzBbIbbIcbFPbIdbIebEQbIfbIgbETbIhbIibFbbIjbFbbIibFbbFbbIkbIkbIlbCqbllaYdaYdaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaebtqbtqbCxbCvbCvbuLbuLbuLbuLbuLbuLbuLbuLbtqbtqaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaeaaeaaeaaaaaaaaabImbDVbInbIobIpbIqboMboMboMboMboMboMbIrboMbFkbIsbItbpcbplbIubIvbIwbIxbIybHobIzbIAbIBbICbHtbBLbIDbIEbCVbIFbIGbIHbIIbIJbIKbILbIMbINbIObGDbIPbGGbGGbFBaaeaaeaaeaaeaaeaaebHIbFCbIQbEBbIRbISbGKbITbsVaZtbIUbIVbIWbIXbIYbAUbAUbAUbIZbzBbJabFPbJbbFPbJcbEQbJdbJebCqbJfbJgbJhbJibJjbJkbJlbJmbJnbJobJpbJqbJrbJsbJtaYdaYdaaaaaaaaeaaaaaaaaebJubJubJuaaaaaaaaeaaaaaaaaeaaaaaaaaeaaaaaabtqbtqbwcbtqbtqbuLbuLbuLbuLbuLbuLbuLbtqbtqaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaeaaaaaaaaabJvbDVbFfbIobJwbJxbJybJxbJzbJxbJybJxbJAbIobFkbFkbJBbJCbJDbJEbJFbsAbJGbJGbCWbJGbJGbJGbJGbJHbJIbDkbDkbDkbJJbJKbJLbJKbJMbJNbJObJLbJPaaebFBbFBbFBbFBbFBaaeaaaaaaaaaaaaaaebHIbFCbJQbJRbJSbJTbJUbJVbJWbqDbJXbJYbJZbKabKbbKcbKcbKdbKebzBbKfbKgbKhbKgbKibEQbKjbKkbCqbKlbKmbKnbKobKpbKqbKrbKobKsbKpbKlbCqbKtbKubKvbKubKvbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKxbKybKzbKAbtqbtqbuLbuLbKBbuLbuLbtqbtqaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeboMbHhbHiboMbCNboMboMbHjbHkbGdbGdbHlbqfbqfbFkbHmbGlbpcbplbpcbHnbCVbCVbCVbHobHpbHqbHrbHsbHtbGrbHubHvbHwbHxbHybHzbHAbHBbHCbHDbHEbExaaebHFbHGbGGbHHbFBaaeaaaaaaaaaaaaaaebHIbHJbHKbHLbHMbHNbHObHPbHQbHRbHSbHTbHUbHVbHWbHXbHXbHYbHZbzBbIabIbbFPbIcbIdbEQbIebIfbETbIgbIhbFbbIibFbbIhbFbbFbbIjbIjbIkbCqbllaYdaYdaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaebtqbtqbCxbCvbCvbuLbuLbuLbuLbuLbuLbuLbuLbtqbtqaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaeaaeaaeaaaaaaaaabIlbDVbImbInbIobIpboMboMboMboMboMboMbIqboMbFkbIrbIsbpcbplbItbIubIvbIwbIxbHobIybIzbIAbIBbHtbBLbICbIDbCVbIEbIFbIGbIHbIIbIJbIKbILbIMbINbGDbIObGGbGGbFBaaeaaeaaeaaeaaeaaebHIbFCbIPbEBbIQbIRbGKbISbsVaZtbITbIUbIVbIWbIXbAUbIYbAUbIZbzBbJabFPbJbbFPbJcbEQbJdbJebCqbJfbJgbJhbJibJjbJkbJlbJmbJnbJobJpbJqbJrbJsbJtaYdaYdaaaaaaaaeaaaaaaaaebJubJubJuaaaaaaaaeaaaaaaaaeaaaaaaaaeaaaaaabtqbtqbwcbtqbtqbuLbuLbuLbuLbuLbuLbuLbtqbtqaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaeaaaaaaaaabJvbDVbFfbInbJwbJxbJybJxbJzbJxbJybJxbJAbInbFkbFkbJBbJCbJDbJEbJFbsAbJGbJGbCWbJGbJGbJGbJGbJHbJIbDkbDkbDkbJJbJKbJLbJKbJMbJNbJObJLbJPaaebFBbFBbFBbFBbFBaaeaaaaaaaaaaaaaaebHIbFCbJQbJRbJSbJTbJUbJVbJWbqDbJXbJYbJZbKabKbbKcbKcbKdbKebzBbKfbKgbKhbKgbKibEQbKjbKkbCqbKlbKmbKnbKobKpbKqbKrbKobKsbKpbKlbCqbKtbKubKvbKubKvbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKwbKxbKybKzbKAbtqbtqbuLbuLbKBbuLbuLbtqbtqaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaboMboMboMboMboMbKCbKDbKEbKFbKGbKHbKIbJAbKGbKHbKIbJAbKJbKKbKLbKMbpcbplbKNbKObKPbKQbKRbKSbKTbKUbKVbKWbKXbCVbCVbKYbCVbKZbLabLbbLcbLdbHybLebLfbLgbGCbGDbLhbLibLibFBaaeaaaaaaaaaaaaaaebHIbFCbFDbEBbLjbLkbLlbLmbsVbLnbxdbLobLpbLqbLrbAUbLsbLtbLubzBbLvbLvbLvbLvbEQbEQbKjbLwbCqbCqbCqbLxbLybLybLybLzbLybLybCqbCqbCqbLAaZMaYdaYdaYdaaaaaaabVaaaaaaaaebJubJubJuaaaaaaaaeaaaaaaaaeaaaaaaaaeaaeaaebLBbLCbLDbLEbtqbtqbtqbuLbuMbuLbtqbtqaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaabImbLFbqfbLGbLHbLIbLJbLKbLLbJAbJAbJAbJAbJAbJAbJAbJAbKJbKKbpcbKMbpcbplbLMbLNbLObLPbLQbLRbLSbFrbLTbLUbLVbCVbLWbLXbCVbLYbLZbMabCVbMbbLabMcbMdbExaaebHFbMebMfbMgbFBaaeaaeaaeaaeaaeaaebMhbFCbFDbEBbEBbEBbEBbEBbsVaZtbxdbxdbxdbxdbxdbFMbLvbLvbLvbLvbMibMjbMkbLvbMlbMmbMnbMobMpbMqbCqbLybLybLybLybMrbLybLybCqbMsbMtbMubMvaYdaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaebMwbtobtobtpbtqbtqbtqbtqbtqbtqbtqaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaeaaabJvbqebqfbMxbqfbDVboMbIobMybJxbJxbJxbJAbJxbJxbJxbMzbIobIobIobMAbMBbplbMCbMDbMEbMFbMGbMHbMIbMJbMKbMFbMLbMMbLPbLPbLPbMNbMObMObMPbMbbIGbMQbMRbMSbMTbGDbMUbLibLibFBaaeaaaaaaaaaaaaaaebsAbFCbFDbMVbMWaZtbMXaZtbsVaZtbMYbMZbNabNbbNcbAUbNdbNebNfbNgbNhbNibNjbNkbNlbNmbNnbNobNpbNqbCqbNrbNsbLybLybLybNsbNtbCqbLAbNubNvbNwbJuaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaisaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaabNxbNxbNxboMbqfbNyboMbHhboMbIqbJAbKGbKHbNzbJAbKGbKHbKIbJAbJAbNAbJAbNBbpcbplbNCbsxbNDbLPbNEbNFbNGbNHbNIbJGbNJbMbbNKbLPbNLbNMbMPbNMbNNbMbbHybMcbNObExaaebFBbFBbFBbFBbFBaaeaaaaaaaaaaaaaaebsAbFCbFDbsAaZrbNPbNQbNRbNSaZtbNTbAUbAUbCebAUbAUbNUbNVbNWbNXbNYbNVbNZbLvbOabOabObbOcbOabOabCqbLybLybLybOdbLybLybLybCqbLAbOeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaabNxbOfbOgboMbqfbMxboMbOhbOibIqbJAbJAbOjbJAbOkbJAbOlbJAbJAbJAbOlbJAbNBbpcbplbpcbOmbOnbOobOpbJGbGqbLRbOqbJGbHtbMbbNKbLPbNLbNMbNNbNMbNNbOrbHybOsbOtbLgbGCbGDbOubOvbOwbFBaaeaaeaaeaaeaaeaaebsAbOxbOybOzbfvbfvbfvbOAbsVbOBbMYbOCbODbOEbOFbODbNdbOGbOHbLvbOIbNVbOJbLvbLvbLvbLvbLvbLvbLvbLvbCqbCqbCqbCqbCqbCqbCqbCqbOKaYdaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaisaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaabIlbLFbqfbLGbLHbLIbLJbLKbLLbJAbJAbJAbJAbJAbJAbJAbJAbKJbKKbpcbKMbpcbplbLMbLNbLObLPbLQbLRbLSbFrbLTbLUbLVbCVbLWbLXbCVbLYbLZbMabCVbMbbLabMcbMdbExaaebHFbMebMfbMgbFBaaeaaeaaeaaeaaeaaebMhbFCbFDbEBbEBbEBbEBbEBbsVaZtbxdbxdbxdbxdbxdbFMbLvbLvbLvbLvbMibMjbMkbLvbMlbMmbMnbMobMpbMqbCqbLybLybLybLybMrbLybLybCqbMsbMtbMubMvaYdaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaebMwbtobtobtpbtqbtqbtqbtqbtqbtqbtqaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaeaaabJvbqebqfbMxbqfbDVboMbInbMybJxbJxbJxbJAbJxbJxbJxbMzbInbInbInbMAbMBbplbMCbMDbMEbMFbMGbMHbMIbMJbMKbMFbMLbMMbLPbLPbLPbMNbMObMObMPbMbbIFbMQbMRbMSbMTbGDbMUbLibLibFBaaeaaaaaaaaaaaaaaebsAbFCbFDbMVbMWaZtbMXaZtbsVaZtbMYbMZbNabNbbNcbAUbNdbNebNfbNgbNhbNibNjbNkbNlbNmbNnbNobNpbNqbCqbNrbNsbLybLybLybNsbNtbCqbLAbNubNvbNwbJuaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaisaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaabNxbNxbNxboMbqfbNyboMbHhboMbIpbJAbKGbKHbNzbJAbKGbKHbKIbJAbJAbNAbJAbNBbpcbplbNCbsxbNDbLPbNEbNFbNGbNHbNIbJGbNJbMbbNKbLPbNLbNMbMPbNMbNNbMbbHybMcbNObExaaebFBbFBbFBbFBbFBaaeaaaaaaaaaaaaaaebsAbFCbFDbsAaZrbNPbNQbNRbNSaZtbNTbAUbAUbCebAUbAUbNUbNVbNWbNXbNYbNVbNZbLvbOabOabObbOcbOabOabCqbLybLybLybOdbLybLybLybCqbLAbOeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaabNxbOfbOgboMbqfbMxboMbOhbOibIpbJAbJAbOjbJAbOkbJAbOlbJAbJAbJAbOlbJAbNBbpcbplbpcbOmbOnbOobOpbJGbGqbLRbOqbJGbHtbMbbNKbLPbNLbNMbNNbNMbNNbOrbHybOsbOtbLgbGCbGDbOubOvbOwbFBaaeaaeaaeaaeaaeaaebsAbOxbOybOzbfvbfvbfvbOAbsVbOBbMYbOCbODbOEbOFbODbNdbOGbOHbLvbOIbNVbOJbLvbLvbLvbLvbLvbLvbLvbLvbCqbCqbCqbCqbCqbCqbCqbCqbOKaYdaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaisaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaabNxbOfbOLbOMbGdbONboMbOObOObOPbOPbOPbOPbOPbOPbOPbOPbOQbOQbOPbOPbOPbORbOSbOTbpcbswbpcbpcbOUbOVbOWbOXbOYbOVbHtbOZbLPbLPbLPbPabNNbNMbNNbMbbHybMcbPbbExaaebHFbPcbPdbPebFBaaeaaaaaaaaaaaaaaebsAbPfbAJbPgbPhbPibcEbcEbPjbPkbxdbxdbxdbxdbxdbxdbLvbLvbPlbPmbPnbPobPpbPqbPrbPsbPtbPubPtbPvbPwbPxbPybPzbMtbMtbMtbMtbMtbMuaYdaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaadaadaagaadaadaadahOaadaadaadaagaagaaaaaaaaeaaeaaaaaaaaaaaaaaaaaabNxbOfbPAbOPbOPbPBbOPbPCbPDbOPbPEbPFbPGbOPbPHbPIbPJbPKbPKbPLbPMbEkbPNbpcbplbPObsxbPPbPQbPRbPSbJGbNFbBRbJGbNJbMbbLWbPTbPUbPVbMObPWbPXbMbbIGbPYbPZbMSbMTbGDbQabOvbOvbFBaaeaaaaaaaaaaaaaaeaaebsAbsAbsAbsAbxWbxXbxXbQbbvwbvwbvwbvwbvwbQcbvwbvwbvwbQdbQebQfbNVbQgbQhbQibNVbQjbQibQkbQlbQmbllbQnbNubQoaYdaYdaYdaYdaYdaYdaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaadaadaagaadaadaadahOaadaadaadaagaagaaaaaaaaeaaeaaaaaaaaaaaaaaaaaabNxbOfbPAbOPbOPbPBbOPbPCbPDbOPbPEbPFbPGbOPbPHbPIbPJbPKbPKbPLbPMbEkbPNbpcbplbPObsxbPPbPQbPRbPSbJGbNFbBRbJGbNJbMbbLWbPTbPUbPVbMObPWbPXbMbbIFbPYbPZbMSbMTbGDbQabOvbOvbFBaaeaaaaaaaaaaaaaaeaaebsAbsAbsAbsAbxWbxXbxXbQbbvwbvwbvwbvwbvwbQcbvwbvwbvwbQdbQebQfbNVbQgbQhbQibNVbQjbQibQkbQlbQmbllbQnbNubQoaYdaYdaYdaYdaYdaYdaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaeaaeaaaaaeaaeaaaaaaaaeaaeaaeaaaaagaaaaaeaaeaaaaaaaaaaaaaaaaaaaaabNxbOfbPAbQpbQqbPKbQrbQsbPKbQtbQubQvbPKbQwbPKbQvbPKbPKbPKbQxbQybpcbQzbQAbplbQBbQCbnXbnXbnXbnXbQDbQEbQFbJGbQGbQHbCVbHwbQIbCVbHAbQJbQKbQLbHCbMcbCVbExaaebFBbFBbFBbFBbFBaaeaaaaaaaaaaaaaaaaaeaaeaaaaaebJubsAbsAbsJbsJbsJbQMbQNbQNbQNbQObQNbQNbQNbllbQebQPbNVbQQbQRbQibQSbQTbQUbQVbQWbQmbllbQnbnFaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaabQXbQYbQZaaabQXbQYbQZaaabQXbQYbQZaaebRaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaabNxbOfbPAbRbbRcbPKbQubQsbPKbRdbRebRebRebRebRebRebRfbRebRgbQxbRhbpcbKMbpcbplbRibnYbRjbRkbRlbRmbRnbRobRpbBObRqbGvbPVbPVbPXbRrbRsbRtbGwbRubHybRvbRwbLgbGCbGDbRxbRybRybFBaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaebsAbRzbRAbABbAAbQNbRBbRCbRDbREbRFbQNbllbQebRGbRHbRIbRJbRKbRLbRMbRNbRObRPbQmbllbRQbnFaaaaaaaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaabQXbRRbQZaaabQXbRRbQZaaabQXbRRbQZaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaabNxbOfbPAbOPbOPbRSbPKbQsbRTbRUbRUbRVbRWbPKbPKbRXbPKbPKbRYbRZbSabpcbSbbpcbplbScbnYbSdbRnbSebSfbSgbShbSibJGbCVbMbbDjbDmbDkbSjbSkbEubSlbSmbHybMcbSnbExaaebHFbSobSpbSqbFBaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaebQNbQNbQNbQNbQNbQNbSrbSrbRDbSrbSsbQNbllbStbSubNVbRIbNVbSvbNVbNVbNVbNVbSwbQmbllbQnbnFaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa