mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2025-12-27 18:51:53 +00:00
2965 lines
102 KiB
Plaintext
2965 lines
102 KiB
Plaintext
/*
|
|
CONTAINS:
|
|
RETRACTOR
|
|
HEMOSTAT
|
|
CAUTERY
|
|
SURGICAL DRILL
|
|
SCALPEL
|
|
CIRCULAR SAW
|
|
|
|
*/
|
|
|
|
/////////////
|
|
//RETRACTOR//
|
|
/////////////
|
|
/obj/item/weapon/retractor/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
|
if(!istype(M))
|
|
return
|
|
|
|
if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/stool/bed/roller, M.loc) && (M.buckled || M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat)) && prob(75) || (locate(/obj/structure/table/, M.loc) && (M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat) && prob(66))))
|
|
return ..()
|
|
|
|
if(user.zone_sel.selecting == "chest")
|
|
if(istype(M, /mob/living/carbon/human))
|
|
switch(M:embryo_op_stage)
|
|
if(2.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [user] retracts the flap in [M]'s cut open torso with [src].", 1)
|
|
M << "\red [user] begins to retracts the flap in your chest with [src]!"
|
|
user << "\red You retract the flap in [M]'s torso with [src]!"
|
|
M:embryo_op_stage = 3.0
|
|
return
|
|
if(4.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [user] rips the larva out of [M]'s torso!", 1)
|
|
M << "\red [user] begins to rip the larva out of [M]'s torso!"
|
|
user << "\red You rip the larva out of [M]'s torso!"
|
|
var/mob/living/carbon/alien/larva/stupid = new(M.loc)
|
|
stupid.death(0)
|
|
//Make a larva and kill it. -- SkyMarshal
|
|
M:embryo_op_stage = 5.0
|
|
for(var/datum/disease/alien_embryo in M.viruses)
|
|
alien_embryo.cure()
|
|
return
|
|
|
|
if(user.zone_sel.selecting == "groin")
|
|
if(istype(M, /mob/living/carbon/human))
|
|
switch(M:appendix_op_stage)
|
|
if(2.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [user] retracts the flap in [M]'s abdomen cut open with [src].", 1)
|
|
M << "\red [user] begins to retract the flap in your abdomen with [src]!"
|
|
user << "\red You retract the flap in [M]'s abdomen with [src]!"
|
|
M:appendix_op_stage = 3.0
|
|
return
|
|
|
|
if (user.zone_sel.selecting == "eyes")
|
|
|
|
var/mob/living/carbon/human/H = M
|
|
if(istype(H) && ( \
|
|
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
|
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
|
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
var/mob/living/carbon/monkey/Mo = M
|
|
if(istype(Mo) && ( \
|
|
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/metroid))//Aliens don't have eyes./N
|
|
user << "\red You cannot locate any eyes on this creature!"
|
|
return
|
|
|
|
switch(M.eye_op_stage)
|
|
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)
|
|
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 You begin to pry open your eyes with [src]!" \
|
|
)
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(15)
|
|
M.updatehealth()
|
|
else
|
|
M.take_organ_damage(15)
|
|
|
|
M:eye_op_stage = 2.0
|
|
return
|
|
|
|
if(user.zone_sel.selecting == "mouth")
|
|
|
|
var/mob/living/carbon/human/H = M
|
|
if(istype(H) && ( \
|
|
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
|
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
|
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
var/mob/living/carbon/monkey/Mo = M
|
|
if(istype(Mo) && ( \
|
|
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/metroid))//Aliens don't have eyes./N
|
|
user << "\red You cannot locate any eyes on this creature!"
|
|
return
|
|
|
|
switch(M:face_op_stage)
|
|
if(2.0)
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] is beginning to retract the skin on [M]'s face and neck with [src].", \
|
|
"\red [user] begins to retract the flap on your face and neck with [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] begins to retract the skin on their face and neck with [src]!", \
|
|
"\red You begin to retract the skin on your face and neck with [src]!")
|
|
|
|
if(do_mob(user, M, 60))
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] retracts the skin on [M]'s face and neck with [src]!", \
|
|
"\red [user] retracts the skin on your face and neck with [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] retracts the skin on their face and neck with [src]!", \
|
|
"\red You retract the skin on your face and neck with [src]!")
|
|
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(15)
|
|
M.updatehealth()
|
|
else
|
|
M.take_organ_damage(15)
|
|
M.face_op_stage = 3.0
|
|
|
|
M.updatehealth()
|
|
M.UpdateDamageIcon()
|
|
return
|
|
if(4.0)
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] is beginning to pull skin back into place on [M]'s face with [src].", \
|
|
"\red [user] begins to pull skin back into place on your face with [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] begins to pull skin back into place on their face with [src]!", \
|
|
"\red You begin to pull skin back into place on your face with [src]!")
|
|
|
|
if(do_mob(user, M, 90))
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] pulls the skin back into place on [M]'s face with [src]!", \
|
|
"\red [user] pulls the skin back into place on your face and neck with [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] pulls the skin back into place on their face and neck with [src]!", \
|
|
"\red You pull the skin back into place on your face and neck with [src]!")
|
|
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(15)
|
|
M.updatehealth()
|
|
else
|
|
M.take_organ_damage(15)
|
|
M.face_op_stage = 5.0
|
|
|
|
M.updatehealth()
|
|
M.UpdateDamageIcon()
|
|
return
|
|
|
|
// Retractor Bone Surgery
|
|
// bone surgery doable?
|
|
if(!try_bone_surgery(M, user))
|
|
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//
|
|
////////////
|
|
|
|
/obj/item/weapon/hemostat/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
|
if(!istype(M))
|
|
return
|
|
|
|
if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/stool/bed/roller, M.loc) && (M.buckled || M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat)) && prob(75) || (locate(/obj/structure/table/, M.loc) && (M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat) && prob(66))))
|
|
return ..()
|
|
|
|
if(user.zone_sel.selecting == "chest")
|
|
if(istype(M, /mob/living/carbon/human))
|
|
switch(M:embryo_op_stage)
|
|
if(1.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [user] is beginning to clamp bleeders in [M]'s cut open torso with [src].", 1)
|
|
M << "\red [user] begins to torso bleeders in your chest with [src]!"
|
|
user << "\red You clamp bleeders in [M]'s torso with [src]!"
|
|
M:embryo_op_stage = 2.0
|
|
return
|
|
if(5.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [user] cleans out the debris from [M]'s cut open torso with [src].", 1)
|
|
M << "\red [user] begins to clean out the debris in your torso with [src]!"
|
|
user << "\red You clean out the debris from in [M]'s torso with [src]!"
|
|
M:embryo_op_stage = 6.0
|
|
return
|
|
|
|
if(user.zone_sel.selecting == "groin")
|
|
if(istype(M, /mob/living/carbon/human))
|
|
switch(M:appendix_op_stage)
|
|
if(1.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [user] is beginning to clamp bleeders in [M]'s abdomen cut open with [src].", 1)
|
|
M << "\red [user] begins to clamp bleeders in your abdomen with [src]!"
|
|
user << "\red You clamp bleeders in [M]'s abdomen with [src]!"
|
|
M:appendix_op_stage = 2.0
|
|
return
|
|
if(4.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [user] is removing [M]'s appendix with [src].", 1)
|
|
M << "\red [user] begins to remove your appendix with [src]!"
|
|
user << "\red You remove [M]'s appendix with [src]!"
|
|
for(var/datum/disease/D in M.viruses)
|
|
if(istype(D, /datum/disease/appendicitis))
|
|
new /obj/item/weapon/reagent_containers/food/snacks/appendixinflamed(get_turf(M))
|
|
M:appendix_op_stage = 5.0
|
|
return
|
|
new /obj/item/weapon/reagent_containers/food/snacks/appendix(get_turf(M))
|
|
M:appendix_op_stage = 5.0
|
|
return
|
|
|
|
if (user.zone_sel.selecting == "eyes")
|
|
|
|
var/mob/living/carbon/human/H = M
|
|
if(istype(H) && ( \
|
|
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
|
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
|
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
var/mob/living/carbon/monkey/Mo = M
|
|
if(istype(Mo) && ( \
|
|
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
if(istype(M, /mob/living/carbon/alien))//Aliens don't have eyes./N
|
|
user << "\red You cannot locate any eyes on this creature!"
|
|
return
|
|
|
|
switch(M.eye_op_stage)
|
|
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)
|
|
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 You begin to mend your eyes with [src]!" \
|
|
)
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(15)
|
|
M.updatehealth()
|
|
else
|
|
M.take_organ_damage(15)
|
|
M:eye_op_stage = 3.0
|
|
return
|
|
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 ..()
|
|
|
|
if(user.zone_sel.selecting == "mouth")
|
|
|
|
var/mob/living/carbon/human/H = M
|
|
if(istype(H) && ( \
|
|
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
|
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
|
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
var/mob/living/carbon/monkey/Mo = M
|
|
if(istype(Mo) && ( \
|
|
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
if(istype(M, /mob/living/carbon/alien))//Aliens don't have mouths either.
|
|
user << "\red You cannot locate any mouth on this creature!"
|
|
return
|
|
|
|
if(istype(M, /mob/living/carbon/human))
|
|
switch(M:face_op_stage)
|
|
if(1.0)
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] is beginning is beginning to clamp bleeders in [M]'s face and neck with [src].", \
|
|
"\red [user] begins to clamp bleeders on your face and neck with [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] begins to clamp bleeders on their face and neck with [src]!", \
|
|
"\red You begin to clamp bleeders on your face and neck with [src]!")
|
|
|
|
if(do_mob(user, M, 50))
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] stops the bleeding on [M]'s face and neck with [src]!", \
|
|
"\red [user] stops the bleeding on your face and neck with [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] stops the bleeding on their face and neck with [src]!", \
|
|
"\red You stop the bleeding on your face and neck with [src]!")
|
|
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(15)
|
|
M.updatehealth()
|
|
else
|
|
M.take_organ_damage(15)
|
|
|
|
M.face_op_stage = 2.0
|
|
|
|
M.updatehealth()
|
|
M.UpdateDamageIcon()
|
|
return
|
|
if(3.0)
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] is beginning to reshape [M]'s vocal chords and face with [src].", \
|
|
"\red [user] begins to reshape your vocal chords and face [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] begins to reshape their vocal chords and face and face with [src]!", \
|
|
"\red You begin to reshape your vocal chords and face with [src]!")
|
|
|
|
if(do_mob(user, M, 120))
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red Halfway there...", \
|
|
"\red Halfway there...")
|
|
else
|
|
M.visible_message( \
|
|
"\red Halfway there...", \
|
|
"\red Halfway there...")
|
|
|
|
if(do_mob(user, M, 120))
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] reshapes [M]'s vocal chords and face with [src]!", \
|
|
"\red [user] reshapes your vocal chords and face with [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] reshapes their vocal chords and face with [src]!", \
|
|
"\red You reshape your vocal chords and face with [src]!")
|
|
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(15)
|
|
M.updatehealth()
|
|
else
|
|
M.take_organ_damage(15)
|
|
|
|
M.face_op_stage = 4.0
|
|
|
|
M.updatehealth()
|
|
M.UpdateDamageIcon()
|
|
return
|
|
|
|
// Hemostat Bone Surgery
|
|
// bone surgery doable?
|
|
if(!try_bone_surgery(M, user))
|
|
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
|
|
|
|
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
|
|
|
|
///////////////////
|
|
//AUTOPSY SCANNER//
|
|
///////////////////
|
|
/obj/item/weapon/autopsy_scanner/var/list/datum/autopsy_data_data/wdata = list()
|
|
/obj/item/weapon/autopsy_scanner/var/list/datum/autopsy_data_data/chemtraces = list()
|
|
/obj/item/weapon/autopsy_scanner/var/target_name = null
|
|
/obj/item/weapon/autopsy_scanner/var/timeofdeath = null
|
|
|
|
/datum/autopsy_data_data
|
|
var
|
|
weapon = null // this is the DEFINITE weapon type that was used
|
|
list/organs_scanned = list() // this maps a number of scanned organs to
|
|
// the wounds to those organs with this data's weapon type
|
|
organ_names = ""
|
|
|
|
/obj/item/weapon/autopsy_scanner/proc/add_data(var/datum/organ/external/O)
|
|
if(!O.autopsy_data.len && !O.trace_chemicals.len) return
|
|
|
|
for(var/V in O.autopsy_data)
|
|
var/datum/autopsy_data/W = O.autopsy_data[V]
|
|
|
|
if(!W.pretend_weapon)
|
|
// the more hits, the more likely it is that we get the right weapon type
|
|
if(prob(50 + W.hits * 10 + W.damage))
|
|
W.pretend_weapon = W.weapon
|
|
else
|
|
W.pretend_weapon = pick("mechanical toolbox", "wirecutters", "revolver", "crowbar", "fire extinguisher", "tomato soup", "oxygen tank", "emergency oxygen tank", "laser", "bullet")
|
|
|
|
|
|
var/datum/autopsy_data_data/D = wdata[V]
|
|
if(!D)
|
|
D = new()
|
|
D.weapon = W.weapon
|
|
wdata[V] = D
|
|
|
|
if(!D.organs_scanned[O.name])
|
|
if(D.organ_names == "")
|
|
D.organ_names = O.display_name
|
|
else
|
|
D.organ_names += ", [O.display_name]"
|
|
|
|
del D.organs_scanned[O.name]
|
|
D.organs_scanned[O.name] = W.copy()
|
|
|
|
for(var/V in O.trace_chemicals)
|
|
if(O.trace_chemicals[V] > 0 && !chemtraces.Find(V))
|
|
chemtraces += V
|
|
|
|
/obj/item/weapon/autopsy_scanner/verb/print_data()
|
|
set src in view(usr, 1)
|
|
set name = "Print Data"
|
|
if(usr.stat)
|
|
usr << "No."
|
|
return
|
|
|
|
if(wdata.len == 0 && chemtraces.len == 0)
|
|
usr << "<b>* There is no data about any wounds in the scanner's database. You may have to scan more bodyparts, or otherwise this wound type may not be in the scanner's database."
|
|
return
|
|
|
|
var/scan_data = ""
|
|
|
|
if(timeofdeath)
|
|
scan_data += "<b>Time since death:</b> [round((world.time - timeofdeath) / (60*10))] minutes<br><br>"
|
|
|
|
var/n = 1
|
|
for(var/wdata_idx in wdata)
|
|
var/datum/autopsy_data_data/D = wdata[wdata_idx]
|
|
var/total_hits = 0
|
|
var/total_score = 0
|
|
var/list/weapon_chances = list() // maps weapon names to a score
|
|
var/age = 0
|
|
|
|
for(var/wound_idx in D.organs_scanned)
|
|
var/datum/autopsy_data/W = D.organs_scanned[wound_idx]
|
|
total_hits += W.hits
|
|
|
|
var/wname = W.pretend_weapon
|
|
|
|
if(wname in weapon_chances) weapon_chances[wname] += W.damage
|
|
else weapon_chances[wname] = max(W.damage, 1)
|
|
total_score+=W.damage
|
|
|
|
|
|
var/wound_age = world.time - W.time_inflicted
|
|
age = max(age, wound_age)
|
|
|
|
var/damage_desc
|
|
|
|
var/damaging_weapon = (total_score != 0)
|
|
|
|
// total score happens to be the total damage
|
|
switch(total_score)
|
|
if(0)
|
|
damage_desc = "Unknown"
|
|
if(1 to 5)
|
|
damage_desc = "<font color='green'>negligible</font>"
|
|
if(5 to 15)
|
|
damage_desc = "<font color='green'>light</font>"
|
|
if(15 to 30)
|
|
damage_desc = "<font color='orange'>moderate</font>"
|
|
if(30 to 1000)
|
|
damage_desc = "<font color='red'>severe</font>"
|
|
|
|
if(!total_score) total_score = D.organs_scanned.len
|
|
|
|
scan_data += "<b>Weapon #[n]</b><br>"
|
|
if(damaging_weapon)
|
|
scan_data += "Severity: [damage_desc]<br>"
|
|
scan_data += "Hits by weapon: [total_hits]<br>"
|
|
scan_data += "Age of wound: [round(age / (60*10))] minutes<br>"
|
|
scan_data += "Affected limbs: [D.organ_names]<br>"
|
|
scan_data += "Possible weapons:<br>"
|
|
for(var/weapon_name in weapon_chances)
|
|
scan_data += "\t[100*weapon_chances[weapon_name]/total_score]% [weapon_name]<br>"
|
|
|
|
scan_data += "<br>"
|
|
|
|
n++
|
|
|
|
if(chemtraces.len)
|
|
scan_data += "<b>Trace Chemicals: </b><br>"
|
|
for(var/chemID in chemtraces)
|
|
scan_data += chemID
|
|
scan_data += "<br>"
|
|
|
|
for(var/mob/O in viewers(usr))
|
|
O.show_message("\red \the [src] rattles and prints out a sheet of paper.", 1)
|
|
|
|
sleep(10)
|
|
|
|
var/obj/item/weapon/paper/P = new(usr.loc)
|
|
P.name = "Autopsy Data ([target_name])"
|
|
P.info = "<tt>[scan_data]</tt>"
|
|
P.overlays += "paper_words"
|
|
|
|
if(istype(usr,/mob/living/carbon))
|
|
// place the item in the usr's hand if possible
|
|
if(!usr.r_hand)
|
|
P.loc = usr
|
|
usr.r_hand = P
|
|
P.layer = 20
|
|
else if(!usr.l_hand)
|
|
P.loc = usr
|
|
usr.l_hand = P
|
|
P.layer = 20
|
|
|
|
usr.update_clothing()
|
|
|
|
/obj/item/weapon/autopsy_scanner/attack(mob/living/carbon/human/M as mob, mob/living/carbon/user as mob)
|
|
if(!istype(M))
|
|
return
|
|
|
|
if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/stool/bed/roller, M.loc) && (M.buckled || M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat)) && prob(75) || (locate(/obj/structure/table/, M.loc) && (M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat) && prob(66))))
|
|
return ..()
|
|
|
|
if(target_name != M.name)
|
|
target_name = M.name
|
|
for(var/V in src.wdata)
|
|
del src.wdata[V]
|
|
src.wdata = list()
|
|
|
|
src.timeofdeath = M.timeofdeath
|
|
|
|
var/datum/organ/external/S = M.organs[user.zone_sel.selecting]
|
|
if(!S)
|
|
usr << "<b>You can't scan this body part.</b>"
|
|
return
|
|
if(!S.open)
|
|
usr << "<b>You have to cut the limb open first!</b>"
|
|
return
|
|
for(var/mob/O in viewers(M))
|
|
O.show_message("\red [user.name] scans the wounds on [M.name]'s [S.display_name] with \the [src.name]", 1)
|
|
|
|
src.add_data(S)
|
|
|
|
return 1
|
|
|
|
///////////
|
|
//Cautery//
|
|
///////////
|
|
|
|
/obj/item/weapon/cautery/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
|
if(!istype(M))
|
|
return
|
|
|
|
if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/stool/bed/roller, M.loc) && (M.buckled || M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat)) && prob(75) || (locate(/obj/structure/table/, M.loc) && (M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat) && prob(66))))
|
|
return ..()
|
|
|
|
if(user.zone_sel.selecting == "chest")
|
|
if(istype(M, /mob/living/carbon/human))
|
|
if(M:embryo_op_stage == 6.0 || M:embryo_op_stage == 3.0 || M:embryo_op_stage == 7.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [user] is beginning to cauterize the incision in [M]'s torso with [src].", 1)
|
|
M << "\red [user] begins to cauterize the incision in your torso with [src]!"
|
|
user << "\red You cauterize the incision in [M]'s torso with [src]!"
|
|
M:embryo_op_stage = 0.0
|
|
return
|
|
|
|
if(user.zone_sel.selecting == "groin")
|
|
if(istype(M, /mob/living/carbon/human))
|
|
switch(M:appendix_op_stage)
|
|
if(5.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [user] is beginning to cauterize the incision in [M]'s abdomen with [src].", 1)
|
|
M << "\red [user] begins to cauterize the incision in your abdomen with [src]!"
|
|
user << "\red You cauterize the incision in [M]'s abdomen with [src]!"
|
|
M:appendix_op_stage = 6.0
|
|
for(var/datum/disease/appendicitis/appendicitis in M.viruses)
|
|
appendicitis.cure()
|
|
M.resistances += appendicitis
|
|
return
|
|
|
|
if (user.zone_sel.selecting == "eyes")
|
|
|
|
var/mob/living/carbon/human/H = M
|
|
if(istype(H) && ( \
|
|
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
|
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
|
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
var/mob/living/carbon/monkey/Mo = M
|
|
if(istype(Mo) && ( \
|
|
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
if(istype(M, /mob/living/carbon/alien))//Aliens don't have eyes./N
|
|
user << "\red You cannot locate any eyes on this creature!"
|
|
return
|
|
|
|
switch(M.eye_op_stage)
|
|
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)
|
|
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 You begin to cauterize your eyes!" \
|
|
)
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(15)
|
|
M.updatehealth()
|
|
else
|
|
M.take_organ_damage(15)
|
|
M.disabilities &= ~128
|
|
M:eye_op_stage = 0.0
|
|
return
|
|
|
|
if (user.zone_sel.selecting == "mouth")
|
|
|
|
|
|
var/mob/living/carbon/human/H = M
|
|
if(istype(H) && ( \
|
|
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
|
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
|
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
var/mob/living/carbon/monkey/Mo = M
|
|
if(istype(Mo) && ( \
|
|
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
if(istype(M, /mob/living/carbon/alien))//Aliens don't have eyes./N
|
|
user << "\red You cannot locate any eyes on this creature!"
|
|
return
|
|
|
|
switch(M.face_op_stage)
|
|
if(5.0)
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] is beginning is cauterize [M]'s face and neck with [src].", \
|
|
"\red [user] begins cauterize your face and neck with [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] begins to cauterize their face and neck with [src]!", \
|
|
"\red You begin to cauterize your face and neck with [src]!")
|
|
|
|
if(do_mob(user, M, 50))
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] cauterizes [M]'s face and neck with [src]!", \
|
|
"\red [user] cauterizes your face and neck with [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] cauterizes their face and neck with [src]!", \
|
|
"\red You cauterize your face and neck with [src]!")
|
|
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(15)
|
|
M.updatehealth()
|
|
else
|
|
M.take_organ_damage(15)
|
|
|
|
for(var/datum/organ/external/head/head)
|
|
if(head && head.disfigured)
|
|
head.disfigured = 0
|
|
M.real_name = "[M.original_name]"
|
|
M.name = "[M.original_name]"
|
|
M << "\blue Your face feels better."
|
|
M.warn_flavor_changed()
|
|
M:face_op_stage = 0.0
|
|
M.updatehealth()
|
|
M.UpdateDamageIcon()
|
|
return
|
|
|
|
//Cautery Bone Surgery
|
|
|
|
if(!try_bone_surgery(M, user))
|
|
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, rand(70,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
|
|
if(S.display_name == "chest" && H:embryo_op_stage == 1.0)
|
|
H:embryo_op_stage = 0.0
|
|
if(S.display_name == "groin" && H:appendix_op_stage == 1.0)
|
|
H:appendix_op_stage = 0.0
|
|
|
|
H.updatehealth()
|
|
H.UpdateDamageIcon()
|
|
|
|
return 1
|
|
|
|
//obj/item/weapon/surgicaldrill
|
|
|
|
|
|
///////////
|
|
//SCALPEL//
|
|
///////////
|
|
/obj/item/weapon/scalpel/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
|
if(!istype(M))
|
|
return ..()
|
|
|
|
//if(M.mutations & HUSK) return ..()
|
|
|
|
if((user.mutations & CLUMSY) && prob(50))
|
|
M = user
|
|
return eyestab(M,user)
|
|
|
|
if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/stool/bed/roller, M.loc) && (M.buckled || M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat)) && prob(75) || (locate(/obj/structure/table/, M.loc) && (M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat) && prob(66))))
|
|
return ..()
|
|
|
|
src.add_fingerprint(user)
|
|
|
|
if(user.zone_sel.selecting == "chest")
|
|
if(istype(M, /mob/living/carbon/human))
|
|
switch(M:embryo_op_stage)
|
|
// 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)
|
|
// 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
|
|
// return
|
|
if(3.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [M] has \his stomach cut open with [src] by [user].", 1)
|
|
M << "\red [user] cuts open your stomach with [src]!"
|
|
user << "\red You cut [M]'s stomach open with [src]!"
|
|
for(var/datum/disease/D in M.viruses)
|
|
if(istype(D, /datum/disease/alien_embryo))
|
|
user << "\blue There's something wiggling in there!"
|
|
M:embryo_op_stage = 4.0
|
|
if(M:embryo_op_stage == 3.0)
|
|
M:embryo_op_stage = 7.0 //Make it not cut their stomach open again and again if no larvae.
|
|
return
|
|
|
|
if(user.zone_sel.selecting == "groin")
|
|
if(istype(M, /mob/living/carbon/human))
|
|
switch(M:appendix_op_stage)
|
|
// 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)
|
|
// 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] has \his appendix seperated with [src] by [user].", 1)
|
|
M << "\red [user] seperates your appendix with [src]!"
|
|
user << "\red You seperate [M]'s appendix with [src]!"
|
|
M:appendix_op_stage = 4.0
|
|
return
|
|
|
|
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) || \
|
|
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
var/mob/living/carbon/monkey/Mo = M
|
|
if(istype(Mo) && ( \
|
|
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
switch(M:brain_op_stage)
|
|
if(0.0)
|
|
if(istype(M, /mob/living/carbon/metroid))
|
|
if(M.stat == 2)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [M.name] has its flesh cut open with [src] by [user].", 1)
|
|
M << "\red [user] cuts open your flesh with [src]!"
|
|
user << "\red You cut [M]'s flesh open with [src]!"
|
|
M:brain_op_stage = 1.0
|
|
|
|
return
|
|
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [M] has \his head cut open with [src] by [user].", 1)
|
|
M << "\red [user] cuts open your head with [src]!"
|
|
user << "\red You cut [M]'s head open with [src]!"
|
|
else
|
|
user.visible_message( \
|
|
"\red [user] begins to cuts open \his skull with [src]!", \
|
|
"\red You begin to cut open your head with [src]!" \
|
|
)
|
|
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(15)
|
|
else
|
|
M.take_organ_damage(15)
|
|
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(7)
|
|
affecting.open = 1
|
|
else
|
|
M.take_organ_damage(7)
|
|
|
|
M.updatehealth()
|
|
M:brain_op_stage = 1.0
|
|
return
|
|
|
|
if(1)
|
|
if(istype(M, /mob/living/carbon/metroid))
|
|
if(M.stat == 2)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [M.name] has its silky inndards cut apart with [src] by [user].", 1)
|
|
M << "\red [user] cuts apart your innards with [src]!"
|
|
user << "\red You cut [M]'s silky innards apart with [src]!"
|
|
M:brain_op_stage = 2.0
|
|
return
|
|
if(2.0)
|
|
if(istype(M, /mob/living/carbon/metroid))
|
|
if(M.stat == 2)
|
|
var/mob/living/carbon/metroid/Metroid = M
|
|
if(Metroid.cores > 0)
|
|
if(istype(M, /mob/living/carbon/metroid))
|
|
user << "\red You attempt to remove [M]'s core, but [src] is ineffective!"
|
|
return
|
|
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [M] has \his connections to the brain delicately severed with [src] by [user].", 1)
|
|
M << "\red [user] delicately severes your brain with [src]!"
|
|
user << "\red You severe [M]'s brain with [src]!"
|
|
else
|
|
user.visible_message( \
|
|
"\red [user] begins 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))
|
|
user << "\red You nick an artery!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(75)
|
|
else
|
|
M.take_organ_damage(75)
|
|
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(7)
|
|
else
|
|
M.take_organ_damage(7)
|
|
|
|
M.updatehealth()
|
|
M:brain_op_stage = 3.0
|
|
else
|
|
..()
|
|
return
|
|
|
|
if(user.zone_sel.selecting == "eyes")
|
|
|
|
var/mob/living/carbon/human/H = M
|
|
if(istype(H) && ( \
|
|
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
|
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
|
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
var/mob/living/carbon/monkey/Mo = M
|
|
if(istype(Mo) && ( \
|
|
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/metroid))//Aliens don't have eyes./N
|
|
user << "\red You cannot locate any eyes on this creature!"
|
|
return
|
|
|
|
switch(M:eye_op_stage)
|
|
if(0.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [M] has \his eyes incised with [src] by [user].", 1)
|
|
M << "\red [user] cuts 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 You begin to cut open your eyes with [src]!" \
|
|
)
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(15)
|
|
else
|
|
M.take_organ_damage(15)
|
|
|
|
M.updatehealth()
|
|
M:eye_op_stage = 1.0
|
|
return
|
|
|
|
if(user.zone_sel.selecting == "mouth")
|
|
|
|
var/mob/living/carbon/human/H = M
|
|
if(istype(H) && ( \
|
|
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
|
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
|
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
var/mob/living/carbon/monkey/Mo = M
|
|
if(istype(Mo) && ( \
|
|
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/metroid))//Aliens don't have eyes./N
|
|
user << "\red You cannot locate any face on this creature!"
|
|
return
|
|
|
|
switch(M:face_op_stage)
|
|
if(0.0)
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] is beginning is cut open [M]'s face and neck with [src].", \
|
|
"\red [user] begins to cut open your face and neck with [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] begins to cut open their face and neck with [src]!", \
|
|
"\red You begin to cut open your face and neck with [src]!")
|
|
|
|
if(do_mob(user, M, 50))
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] cuts open [M]'s face and neck with [src]!", \
|
|
"\red [user] cuts open your face and neck with [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] cuts open their face and neck with [src]!", \
|
|
"\red You cut open your face and neck with [src]!")
|
|
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(15)
|
|
M.updatehealth()
|
|
else
|
|
M.take_organ_damage(15)
|
|
|
|
M.face_op_stage = 1.0
|
|
|
|
M.updatehealth()
|
|
M.UpdateDamageIcon()
|
|
return
|
|
|
|
// Scalpel Bone Surgery
|
|
|
|
if(!try_bone_surgery(M, user) && user.a_intent == "hurt") // if we call ..(), we'll attack them, so require a hurt intent
|
|
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
|
|
if(S.display_name == "chest")
|
|
H:embryo_op_stage = 1.0
|
|
if(S.display_name == "groin")
|
|
H:appendix_op_stage = 1.0
|
|
|
|
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//
|
|
////////////////
|
|
|
|
/obj/item/weapon/circular_saw/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
|
if(!istype(M))
|
|
return ..()
|
|
|
|
if((user.mutations & CLUMSY) && prob(50))
|
|
M = user
|
|
return eyestab(M,user)
|
|
|
|
if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/stool/bed/roller, M.loc) && (M.buckled || M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat)) && prob(75) || (locate(/obj/structure/table/, M.loc) && (M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat) && prob(66))))
|
|
return ..()
|
|
|
|
src.add_fingerprint(user)
|
|
|
|
if(user.zone_sel.selecting == "head" || istype(M, /mob/living/carbon/metroid))
|
|
|
|
var/mob/living/carbon/human/H = M
|
|
if(istype(H) && ( \
|
|
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
|
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
|
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
var/mob/living/carbon/monkey/Mo = M
|
|
if(istype(Mo) && ( \
|
|
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
switch(M:brain_op_stage)
|
|
if(0)
|
|
if(!hasorgans(M))
|
|
return ..()
|
|
var/datum/organ/external/S = M:organs["head"]
|
|
if(S.destroyed)
|
|
return
|
|
for(var/mob/O in viewers(M, null))
|
|
O.show_message(text("\red [M] gets \his [S.display_name] sawed at with [src] by [user].... It looks like [user] is trying to cut it off!"), 1)
|
|
if(!do_after(user,rand(50,70)))
|
|
for(var/mob/O in viewers(M, null))
|
|
O.show_message(text("\red [user] tried to cut [M]'s [S.display_name] off with [src], but failed."), 1)
|
|
return
|
|
for(var/mob/O in viewers(M, null))
|
|
O.show_message(text("\red [M] gets \his [S.display_name] sawed off with [src] by [user]."), 1)
|
|
S.destroyed = 1
|
|
S.droplimb()
|
|
M: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)
|
|
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 You begin to saw open your head with [src]!" \
|
|
)
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(40)
|
|
M.updatehealth()
|
|
else
|
|
M.take_organ_damage(40)
|
|
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(7)
|
|
else
|
|
M.take_organ_damage(7)
|
|
|
|
M.updatehealth()
|
|
M:brain_op_stage = 2.0
|
|
|
|
if(2.0)
|
|
if(istype(M, /mob/living/carbon/metroid))
|
|
if(M.stat == 2)
|
|
var/mob/living/carbon/metroid/Metroid = M
|
|
if(Metroid.cores > 0)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [M.name] is having one of its cores sawed out with [src] by [user].", 1)
|
|
|
|
Metroid.cores--
|
|
M << "\red [user] begins to remove one of your cores with [src]! ([Metroid.cores] cores remaining)"
|
|
user << "\red You cut one of [M]'s cores out with [src]! ([Metroid.cores] cores remaining)"
|
|
|
|
new/obj/item/metroid_core(M.loc)
|
|
|
|
if(Metroid.cores <= 0)
|
|
M.icon_state = "baby metroid dead-nocore"
|
|
|
|
return
|
|
|
|
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)
|
|
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 You sever your brain's connection to the spine with [src]!" \
|
|
)
|
|
|
|
user.attack_log += "\[[time_stamp()]\]<font color='red'> Debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>"
|
|
M.attack_log += "\[[time_stamp()]\]<font color='orange'> Debrained by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>"
|
|
log_admin("ATTACK: [user] ([user.ckey]) debrained [M] ([M.ckey]) with [src].")
|
|
message_admins("ATTACK: [user] ([user.ckey]) debrained [M] ([M.ckey]) with [src].")
|
|
|
|
var/obj/item/brain/B = new(M.loc)
|
|
B.transfer_identity(M)
|
|
|
|
M:brain_op_stage = 4.0
|
|
M.death()//You want them to die after the brain was transferred, so not to trigger client death() twice.
|
|
|
|
else
|
|
..()
|
|
return
|
|
|
|
else if(user.zone_sel.selecting != "chest" && hasorgans(M))
|
|
var/mob/living/carbon/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 at with [src] by [user]... It looks like [user] is trying to cut it off!"), 1)
|
|
if(!do_after(user, rand(20,80)))
|
|
for(var/mob/O in viewers(H, null))
|
|
O.show_message(text("\red [user] tried to cut [H]'s [S.display_name] off with [src], but failed."), 1)
|
|
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.droplimb(1)
|
|
H:update_body()
|
|
else
|
|
return ..()
|
|
/*
|
|
else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
|
|
return ..()
|
|
*/
|
|
return
|
|
|
|
//////////////////////////////
|
|
// Bone Gel and Bone Setter //
|
|
//////////////////////////////
|
|
|
|
/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
|
|
|
|
The above might not apply anymore.
|
|
|
|
*/
|
|
|
|
/obj/item/weapon/surgical_tool/bonegel
|
|
name = "bone gel"
|
|
icon = 'surgery.dmi'
|
|
icon_state = "bone gel"
|
|
|
|
/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/bonesetter
|
|
name = "bone setter"
|
|
icon = 'surgery.dmi'
|
|
icon_state = "bone setter"
|
|
|
|
/obj/item/weapon/surgical_tool/bonesetter/New()
|
|
stage += 1
|
|
wound = "broken"
|
|
/obj/item/weapon/surgical_tool/bonesetter/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
|
|
|
|
|
|
/obj/item/weapon/boneinjector
|
|
name = "Bone-repairing Nanites Injector"
|
|
desc = "This injects the person with nanites that repair bones."
|
|
icon = 'items.dmi'
|
|
icon_state = "implanter1"
|
|
throw_speed = 1
|
|
throw_range = 5
|
|
w_class = 1.0
|
|
var/uses = 5
|
|
|
|
/obj/item/weapon/boneinjector/attack_paw(mob/user as mob)
|
|
return attack_hand(user)
|
|
|
|
/obj/item/weapon/boneinjector/proc/inject(mob/M as mob)
|
|
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]
|
|
if(e.destroyed) // this is nanites, not space magic
|
|
continue
|
|
e.brute_dam = 0.0
|
|
e.burn_dam = 0.0
|
|
e.bandaged = 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()
|
|
|
|
uses--
|
|
if(uses == 0)
|
|
spawn(0)//this prevents the collapse of space-time continuum
|
|
del(src)
|
|
return uses
|
|
|
|
/obj/item/weapon/boneinjector/attack(mob/M as mob, mob/user as mob)
|
|
if (!istype(M, /mob))
|
|
return
|
|
if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
|
|
user << "\red You don't have the dexterity to do this!"
|
|
return
|
|
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been injected with [name] by [user.name] ([user.ckey])</font>")
|
|
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [name] to inject [M.name] ([M.ckey])</font>")
|
|
log_admin("ATTACK: [user] ([user.ckey]) injected [M] ([M.ckey]) with [src].")
|
|
|
|
if (user)
|
|
for(var/mob/O in viewers(M, null))
|
|
O.show_message(text("\red [] has been injected with [] by [].", M, src, user), 1)
|
|
//Foreach goto(192)
|
|
if (!(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/carbon/monkey)))
|
|
user << "\red Apparently it didn't work."
|
|
return
|
|
inject(M)//Now we actually do the heavy lifting.
|
|
|
|
if(!isnull(user))//If the user still exists. Their mob may not.
|
|
user.show_message(text("\red You inject [M]"))
|
|
return
|
|
/* //VERY WIP
|
|
/////////////////////////////////
|
|
//// Makeshift Surgery Tools ////
|
|
/////////////////////////////////
|
|
|
|
/////////////
|
|
//RETRACTOR//
|
|
/////////////
|
|
/obj/item/weapon/crowbar/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
|
if(!istype(M))
|
|
return
|
|
|
|
if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/stool/bed/roller, M.loc) && (M.buckled || M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat)) && prob(75) || (locate(/obj/structure/table/, M.loc) && (M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat) && prob(66))))
|
|
return ..()
|
|
|
|
if(user.zone_sel.selecting == "chest")
|
|
if(istype(M, /mob/living/carbon/human))
|
|
switch(M:embryo_op_stage)
|
|
if(2.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [user] pulls back the skin in [M]'s torso with [src].", 1)
|
|
M << "\red [user] begins to pull back the skin in your chest with [src]!"
|
|
user << "\red You pull back the skin in [M]'s torso with [src]!"
|
|
M:embryo_op_stage = 3.0
|
|
return
|
|
if(4.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [user] pries the the larva out of [M]'s torso!", 1)
|
|
M << "\red [user] pries the larva out of [M]'s torso!"
|
|
user << "\red You pry the larva out of [M]'s torso!"
|
|
var/mob/living/carbon/alien/larva/stupid = new(M.loc)
|
|
stupid.death(0)
|
|
//Make a larva and kill it. -- SkyMarshal
|
|
M:embryo_op_stage = 5.0
|
|
for(var/datum/disease/alien_embryo in M.viruses)
|
|
alien_embryo.cure()
|
|
return
|
|
|
|
if(user.zone_sel.selecting == "groin")
|
|
if(istype(M, /mob/living/carbon/human))
|
|
switch(M:appendix_op_stage)
|
|
if(2.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [user] pulls the skin back on [M]'s abdomen with [src].", 1)
|
|
M << "\red [user] begins to pull back the skin on your abdomen with [src]!"
|
|
user << "\red You pull back the skin on [M]'s abdomen with [src]!"
|
|
M:appendix_op_stage = 3.0
|
|
return
|
|
|
|
if (user.zone_sel.selecting == "eyes")
|
|
|
|
var/mob/living/carbon/human/H = M
|
|
if(istype(H) && ( \
|
|
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
|
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
|
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
var/mob/living/carbon/monkey/Mo = M
|
|
if(istype(Mo) && ( \
|
|
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/metroid))//Aliens don't have eyes./N
|
|
user << "\red You cannot locate any eyes on this creature!"
|
|
return
|
|
|
|
switch(M.eye_op_stage)
|
|
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)
|
|
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 You begin to pry open your eyes with [src]!" \
|
|
)
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(15)
|
|
M.updatehealth()
|
|
else
|
|
M.take_organ_damage(15)
|
|
|
|
M:eye_op_stage = 2.0
|
|
return
|
|
|
|
if(user.zone_sel.selecting == "mouth")
|
|
|
|
var/mob/living/carbon/human/H = M
|
|
if(istype(H) && ( \
|
|
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
|
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
|
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
var/mob/living/carbon/monkey/Mo = M
|
|
if(istype(Mo) && ( \
|
|
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/metroid))//Aliens don't have eyes./N
|
|
user << "\red You cannot locate any eyes on this creature!"
|
|
return
|
|
|
|
switch(M:face_op_stage)
|
|
if(2.0)
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] is beginning to retract the skin on [M]'s face and neck with [src].", \
|
|
"\red [user] begins to retract the flap on your face and neck with [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] begins to retract the skin on their face and neck with [src]!", \
|
|
"\red You begin to retract the skin on your face and neck with [src]!")
|
|
|
|
if(do_mob(user, M, 60))
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] retracts the skin on [M]'s face and neck with [src]!", \
|
|
"\red [user] retracts the skin on your face and neck with [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] retracts the skin on their face and neck with [src]!", \
|
|
"\red You retract the skin on your face and neck with [src]!")
|
|
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(15)
|
|
M.updatehealth()
|
|
else
|
|
M.take_organ_damage(15)
|
|
M.face_op_stage = 3.0
|
|
|
|
M.updatehealth()
|
|
M.UpdateDamageIcon()
|
|
return
|
|
if(4.0)
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] is beginning to pull skin back into place on [M]'s face with [src].", \
|
|
"\red [user] begins to pull skin back into place on your face with [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] begins to pull skin back into place on their face with [src]!", \
|
|
"\red You begin to pull skin back into place on your face with [src]!")
|
|
|
|
if(do_mob(user, M, 90))
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] pulls the skin back into place on [M]'s face with [src]!", \
|
|
"\red [user] pulls the skin back into place on your face and neck with [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] pulls the skin back into place on their face and neck with [src]!", \
|
|
"\red You pull the skin back into place on your face and neck with [src]!")
|
|
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(15)
|
|
M.updatehealth()
|
|
else
|
|
M.take_organ_damage(15)
|
|
M.face_op_stage = 5.0
|
|
|
|
M.updatehealth()
|
|
M.UpdateDamageIcon()
|
|
return
|
|
|
|
// Retractor Bone Surgery
|
|
// bone surgery doable?
|
|
if(!try_bone_surgery(M, user))
|
|
return ..()
|
|
|
|
/obj/item/weapon/crowbar/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//
|
|
////////////
|
|
|
|
/obj/item/weapon/hemostat/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
|
if(!istype(M))
|
|
return
|
|
|
|
if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/stool/bed/roller, M.loc) && (M.buckled || M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat)) && prob(75) || (locate(/obj/structure/table/, M.loc) && (M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat) && prob(66))))
|
|
return ..()
|
|
|
|
if(user.zone_sel.selecting == "chest")
|
|
if(istype(M, /mob/living/carbon/human))
|
|
switch(M:embryo_op_stage)
|
|
if(1.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [user] is beginning to clamp bleeders in [M]'s cut open torso with [src].", 1)
|
|
M << "\red [user] begins to torso bleeders in your chest with [src]!"
|
|
user << "\red You clamp bleeders in [M]'s torso with [src]!"
|
|
M:embryo_op_stage = 2.0
|
|
return
|
|
if(5.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [user] cleans out the debris from [M]'s cut open torso with [src].", 1)
|
|
M << "\red [user] begins to clean out the debris in your torso with [src]!"
|
|
user << "\red You clean out the debris from in [M]'s torso with [src]!"
|
|
M:embryo_op_stage = 6.0
|
|
return
|
|
|
|
if(user.zone_sel.selecting == "groin")
|
|
if(istype(M, /mob/living/carbon/human))
|
|
switch(M:appendix_op_stage)
|
|
if(1.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [user] is beginning to clamp bleeders in [M]'s abdomen cut open with [src].", 1)
|
|
M << "\red [user] begins to clamp bleeders in your abdomen with [src]!"
|
|
user << "\red You clamp bleeders in [M]'s abdomen with [src]!"
|
|
M:appendix_op_stage = 2.0
|
|
return
|
|
if(4.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [user] is removing [M]'s appendix with [src].", 1)
|
|
M << "\red [user] begins to remove your appendix with [src]!"
|
|
user << "\red You remove [M]'s appendix with [src]!"
|
|
for(var/datum/disease/D in M.viruses)
|
|
if(istype(D, /datum/disease/appendicitis))
|
|
new /obj/item/weapon/reagent_containers/food/snacks/appendixinflamed(get_turf(M))
|
|
M:appendix_op_stage = 5.0
|
|
return
|
|
new /obj/item/weapon/reagent_containers/food/snacks/appendix(get_turf(M))
|
|
M:appendix_op_stage = 5.0
|
|
return
|
|
|
|
if (user.zone_sel.selecting == "eyes")
|
|
|
|
var/mob/living/carbon/human/H = M
|
|
if(istype(H) && ( \
|
|
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
|
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
|
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
var/mob/living/carbon/monkey/Mo = M
|
|
if(istype(Mo) && ( \
|
|
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
if(istype(M, /mob/living/carbon/alien))//Aliens don't have eyes./N
|
|
user << "\red You cannot locate any eyes on this creature!"
|
|
return
|
|
|
|
switch(M.eye_op_stage)
|
|
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)
|
|
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 You begin to mend your eyes with [src]!" \
|
|
)
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(15)
|
|
M.updatehealth()
|
|
else
|
|
M.take_organ_damage(15)
|
|
M:eye_op_stage = 3.0
|
|
return
|
|
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 ..()
|
|
|
|
if(user.zone_sel.selecting == "mouth")
|
|
|
|
var/mob/living/carbon/human/H = M
|
|
if(istype(H) && ( \
|
|
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
|
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
|
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
var/mob/living/carbon/monkey/Mo = M
|
|
if(istype(Mo) && ( \
|
|
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
if(istype(M, /mob/living/carbon/alien))//Aliens don't have mouths either.
|
|
user << "\red You cannot locate any mouth on this creature!"
|
|
return
|
|
|
|
if(istype(M, /mob/living/carbon/human))
|
|
switch(M:face_op_stage)
|
|
if(1.0)
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] is beginning is beginning to clamp bleeders in [M]'s face and neck with [src].", \
|
|
"\red [user] begins to clamp bleeders on your face and neck with [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] begins to clamp bleeders on their face and neck with [src]!", \
|
|
"\red You begin to clamp bleeders on your face and neck with [src]!")
|
|
|
|
if(do_mob(user, M, 50))
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] stops the bleeding on [M]'s face and neck with [src]!", \
|
|
"\red [user] stops the bleeding on your face and neck with [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] stops the bleeding on their face and neck with [src]!", \
|
|
"\red You stop the bleeding on your face and neck with [src]!")
|
|
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(15)
|
|
M.updatehealth()
|
|
else
|
|
M.take_organ_damage(15)
|
|
|
|
M.face_op_stage = 2.0
|
|
|
|
M.updatehealth()
|
|
M.UpdateDamageIcon()
|
|
return
|
|
if(3.0)
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] is beginning to reshape [M]'s vocal chords and face with [src].", \
|
|
"\red [user] begins to reshape your vocal chords and face [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] begins to reshape their vocal chords and face and face with [src]!", \
|
|
"\red You begin to reshape your vocal chords and face with [src]!")
|
|
|
|
if(do_mob(user, M, 120))
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red Halfway there...", \
|
|
"\red Halfway there...")
|
|
else
|
|
M.visible_message( \
|
|
"\red Halfway there...", \
|
|
"\red Halfway there...")
|
|
|
|
if(do_mob(user, M, 120))
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] reshapes [M]'s vocal chords and face with [src]!", \
|
|
"\red [user] reshapes your vocal chords and face with [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] reshapes their vocal chords and face with [src]!", \
|
|
"\red You reshape your vocal chords and face with [src]!")
|
|
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(15)
|
|
M.updatehealth()
|
|
else
|
|
M.take_organ_damage(15)
|
|
|
|
M.face_op_stage = 4.0
|
|
|
|
M.updatehealth()
|
|
M.UpdateDamageIcon()
|
|
return
|
|
|
|
// Hemostat Bone Surgery
|
|
// bone surgery doable?
|
|
if(!try_bone_surgery(M, user))
|
|
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
|
|
|
|
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//
|
|
///////////
|
|
|
|
/obj/item/weapon/cautery/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
|
if(!istype(M))
|
|
return
|
|
|
|
if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/stool/bed/roller, M.loc) && (M.buckled || M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat)) && prob(75) || (locate(/obj/structure/table/, M.loc) && (M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat) && prob(66))))
|
|
return ..()
|
|
|
|
if(user.zone_sel.selecting == "chest")
|
|
if(istype(M, /mob/living/carbon/human))
|
|
if(M:embryo_op_stage == 6.0 || M:embryo_op_stage == 3.0 || M:embryo_op_stage == 7.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [user] is beginning to cauterize the incision in [M]'s torso with [src].", 1)
|
|
M << "\red [user] begins to cauterize the incision in your torso with [src]!"
|
|
user << "\red You cauterize the incision in [M]'s torso with [src]!"
|
|
M:embryo_op_stage = 0.0
|
|
return
|
|
|
|
if(user.zone_sel.selecting == "groin")
|
|
if(istype(M, /mob/living/carbon/human))
|
|
switch(M:appendix_op_stage)
|
|
if(5.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [user] is beginning to cauterize the incision in [M]'s abdomen with [src].", 1)
|
|
M << "\red [user] begins to cauterize the incision in your abdomen with [src]!"
|
|
user << "\red You cauterize the incision in [M]'s abdomen with [src]!"
|
|
M:appendix_op_stage = 6.0
|
|
for(var/datum/disease/appendicitis/appendicitis in M.viruses)
|
|
appendicitis.cure()
|
|
M.resistances += appendicitis
|
|
return
|
|
|
|
if (user.zone_sel.selecting == "eyes")
|
|
|
|
var/mob/living/carbon/human/H = M
|
|
if(istype(H) && ( \
|
|
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
|
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
|
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
var/mob/living/carbon/monkey/Mo = M
|
|
if(istype(Mo) && ( \
|
|
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
if(istype(M, /mob/living/carbon/alien))//Aliens don't have eyes./N
|
|
user << "\red You cannot locate any eyes on this creature!"
|
|
return
|
|
|
|
switch(M.eye_op_stage)
|
|
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)
|
|
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 You begin to cauterize your eyes!" \
|
|
)
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(15)
|
|
M.updatehealth()
|
|
else
|
|
M.take_organ_damage(15)
|
|
M.disabilities &= ~128
|
|
M:eye_op_stage = 0.0
|
|
return
|
|
|
|
if (user.zone_sel.selecting == "mouth")
|
|
|
|
|
|
var/mob/living/carbon/human/H = M
|
|
if(istype(H) && ( \
|
|
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
|
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
|
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
var/mob/living/carbon/monkey/Mo = M
|
|
if(istype(Mo) && ( \
|
|
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
if(istype(M, /mob/living/carbon/alien))//Aliens don't have eyes./N
|
|
user << "\red You cannot locate any eyes on this creature!"
|
|
return
|
|
|
|
switch(M.face_op_stage)
|
|
if(5.0)
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] is beginning is cauterize [M]'s face and neck with [src].", \
|
|
"\red [user] begins cauterize your face and neck with [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] begins to cauterize their face and neck with [src]!", \
|
|
"\red You begin to cauterize your face and neck with [src]!")
|
|
|
|
if(do_mob(user, M, 50))
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] cauterizes [M]'s face and neck with [src]!", \
|
|
"\red [user] cauterizes your face and neck with [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] cauterizes their face and neck with [src]!", \
|
|
"\red You cauterize your face and neck with [src]!")
|
|
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(15)
|
|
M.updatehealth()
|
|
else
|
|
M.take_organ_damage(15)
|
|
|
|
for(var/datum/organ/external/head/head)
|
|
if(head && head.disfigured)
|
|
head.disfigured = 0
|
|
M.real_name = "[M.original_name]"
|
|
M.name = "[M.original_name]"
|
|
M << "\blue Your face feels better."
|
|
M.warn_flavor_changed()
|
|
M:face_op_stage = 0.0
|
|
M.updatehealth()
|
|
M.UpdateDamageIcon()
|
|
return
|
|
|
|
//Cautery Bone Surgery
|
|
|
|
if(!try_bone_surgery(M, user))
|
|
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, rand(70,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
|
|
if(S.display_name == "chest" && H:embryo_op_stage == 1.0)
|
|
H:embryo_op_stage = 0.0
|
|
if(S.display_name == "groin" && H:appendix_op_stage == 1.0)
|
|
H:appendix_op_stage = 0.0
|
|
|
|
H.updatehealth()
|
|
H.UpdateDamageIcon()
|
|
|
|
return 1
|
|
|
|
//obj/item/weapon/surgicaldrill
|
|
|
|
|
|
///////////
|
|
//SCALPEL//
|
|
///////////
|
|
/obj/item/weapon/scalpel/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
|
if(!istype(M))
|
|
return ..()
|
|
|
|
//if(M.mutations & HUSK) return ..()
|
|
|
|
if((user.mutations & CLUMSY) && prob(50))
|
|
M = user
|
|
return eyestab(M,user)
|
|
|
|
if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/stool/bed/roller, M.loc) && (M.buckled || M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat)) && prob(75) || (locate(/obj/structure/table/, M.loc) && (M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat) && prob(66))))
|
|
return ..()
|
|
|
|
src.add_fingerprint(user)
|
|
|
|
if(user.zone_sel.selecting == "chest")
|
|
if(istype(M, /mob/living/carbon/human))
|
|
switch(M:embryo_op_stage)
|
|
// 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)
|
|
// 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
|
|
// return
|
|
if(3.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [M] has \his stomach cut open with [src] by [user].", 1)
|
|
M << "\red [user] cuts open your stomach with [src]!"
|
|
user << "\red You cut [M]'s stomach open with [src]!"
|
|
for(var/datum/disease/D in M.viruses)
|
|
if(istype(D, /datum/disease/alien_embryo))
|
|
user << "\blue There's something wiggling in there!"
|
|
M:embryo_op_stage = 4.0
|
|
if(M:embryo_op_stage == 3.0)
|
|
M:embryo_op_stage = 7.0 //Make it not cut their stomach open again and again if no larvae.
|
|
return
|
|
|
|
if(user.zone_sel.selecting == "groin")
|
|
if(istype(M, /mob/living/carbon/human))
|
|
switch(M:appendix_op_stage)
|
|
// 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)
|
|
// 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] has \his appendix seperated with [src] by [user].", 1)
|
|
M << "\red [user] seperates your appendix with [src]!"
|
|
user << "\red You seperate [M]'s appendix with [src]!"
|
|
M:appendix_op_stage = 4.0
|
|
return
|
|
|
|
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) || \
|
|
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
var/mob/living/carbon/monkey/Mo = M
|
|
if(istype(Mo) && ( \
|
|
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
switch(M:brain_op_stage)
|
|
if(0.0)
|
|
if(istype(M, /mob/living/carbon/metroid))
|
|
if(M.stat == 2)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [M.name] has its flesh cut open with [src] by [user].", 1)
|
|
M << "\red [user] cuts open your flesh with [src]!"
|
|
user << "\red You cut [M]'s flesh open with [src]!"
|
|
M:brain_op_stage = 1.0
|
|
|
|
return
|
|
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [M] has \his head cut open with [src] by [user].", 1)
|
|
M << "\red [user] cuts open your head with [src]!"
|
|
user << "\red You cut [M]'s head open with [src]!"
|
|
else
|
|
user.visible_message( \
|
|
"\red [user] begins to cuts open \his skull with [src]!", \
|
|
"\red You begin to cut open your head with [src]!" \
|
|
)
|
|
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(15)
|
|
else
|
|
M.take_organ_damage(15)
|
|
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(7)
|
|
affecting.open = 1
|
|
else
|
|
M.take_organ_damage(7)
|
|
|
|
M.updatehealth()
|
|
M:brain_op_stage = 1.0
|
|
return
|
|
|
|
if(1)
|
|
if(istype(M, /mob/living/carbon/metroid))
|
|
if(M.stat == 2)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [M.name] has its silky inndards cut apart with [src] by [user].", 1)
|
|
M << "\red [user] cuts apart your innards with [src]!"
|
|
user << "\red You cut [M]'s silky innards apart with [src]!"
|
|
M:brain_op_stage = 2.0
|
|
return
|
|
if(2.0)
|
|
if(istype(M, /mob/living/carbon/metroid))
|
|
if(M.stat == 2)
|
|
var/mob/living/carbon/metroid/Metroid = M
|
|
if(Metroid.cores > 0)
|
|
if(istype(M, /mob/living/carbon/metroid))
|
|
user << "\red You attempt to remove [M]'s core, but [src] is ineffective!"
|
|
return
|
|
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [M] has \his connections to the brain delicately severed with [src] by [user].", 1)
|
|
M << "\red [user] delicately severes your brain with [src]!"
|
|
user << "\red You severe [M]'s brain with [src]!"
|
|
else
|
|
user.visible_message( \
|
|
"\red [user] begins 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))
|
|
user << "\red You nick an artery!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(75)
|
|
else
|
|
M.take_organ_damage(75)
|
|
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(7)
|
|
else
|
|
M.take_organ_damage(7)
|
|
|
|
M.updatehealth()
|
|
M:brain_op_stage = 3.0
|
|
else
|
|
..()
|
|
return
|
|
|
|
if(user.zone_sel.selecting == "eyes")
|
|
|
|
var/mob/living/carbon/human/H = M
|
|
if(istype(H) && ( \
|
|
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
|
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
|
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
var/mob/living/carbon/monkey/Mo = M
|
|
if(istype(Mo) && ( \
|
|
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/metroid))//Aliens don't have eyes./N
|
|
user << "\red You cannot locate any eyes on this creature!"
|
|
return
|
|
|
|
switch(M:eye_op_stage)
|
|
if(0.0)
|
|
if(M != user)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [M] has \his eyes incised with [src] by [user].", 1)
|
|
M << "\red [user] cuts 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 You begin to cut open your eyes with [src]!" \
|
|
)
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(15)
|
|
else
|
|
M.take_organ_damage(15)
|
|
|
|
M.updatehealth()
|
|
M:eye_op_stage = 1.0
|
|
return
|
|
|
|
if(user.zone_sel.selecting == "mouth")
|
|
|
|
var/mob/living/carbon/human/H = M
|
|
if(istype(H) && ( \
|
|
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
|
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
|
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
var/mob/living/carbon/monkey/Mo = M
|
|
if(istype(Mo) && ( \
|
|
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/metroid))//Aliens don't have eyes./N
|
|
user << "\red You cannot locate any face on this creature!"
|
|
return
|
|
|
|
switch(M:face_op_stage)
|
|
if(0.0)
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] is beginning is cut open [M]'s face and neck with [src].", \
|
|
"\red [user] begins to cut open your face and neck with [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] begins to cut open their face and neck with [src]!", \
|
|
"\red You begin to cut open your face and neck with [src]!")
|
|
|
|
if(do_mob(user, M, 50))
|
|
if(M != user)
|
|
M.visible_message( \
|
|
"\red [user] cuts open [M]'s face and neck with [src]!", \
|
|
"\red [user] cuts open your face and neck with [src]!")
|
|
else
|
|
M.visible_message( \
|
|
"\red [user] cuts open their face and neck with [src]!", \
|
|
"\red You cut open your face and neck with [src]!")
|
|
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(15)
|
|
M.updatehealth()
|
|
else
|
|
M.take_organ_damage(15)
|
|
|
|
M.face_op_stage = 1.0
|
|
|
|
M.updatehealth()
|
|
M.UpdateDamageIcon()
|
|
return
|
|
|
|
// Scalpel Bone Surgery
|
|
|
|
if(!try_bone_surgery(M, user) && user.a_intent == "hurt") // if we call ..(), we'll attack them, so require a hurt intent
|
|
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
|
|
if(S.display_name == "chest")
|
|
H:embryo_op_stage = 1.0
|
|
if(S.display_name == "groin")
|
|
H:appendix_op_stage = 1.0
|
|
|
|
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//
|
|
////////////////
|
|
|
|
/obj/item/weapon/circular_saw/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
|
|
if(!istype(M))
|
|
return ..()
|
|
|
|
if((user.mutations & CLUMSY) && prob(50))
|
|
M = user
|
|
return eyestab(M,user)
|
|
|
|
if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/stool/bed/roller, M.loc) && (M.buckled || M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat)) && prob(75) || (locate(/obj/structure/table/, M.loc) && (M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat) && prob(66))))
|
|
return ..()
|
|
|
|
src.add_fingerprint(user)
|
|
|
|
if(user.zone_sel.selecting == "head" || istype(M, /mob/living/carbon/metroid))
|
|
|
|
var/mob/living/carbon/human/H = M
|
|
if(istype(H) && ( \
|
|
(H.head && H.head.flags & HEADCOVERSEYES) || \
|
|
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
|
|
(H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
return
|
|
|
|
var/mob/living/carbon/monkey/Mo = M
|
|
if(istype(Mo) && ( \
|
|
(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
|
|
))
|
|
user << "\red You're going to need to remove that mask/helmet/glasses first."
|
|
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 at with [src] by [user].... It looks like [user] is trying to cut it off!"), 1)
|
|
if(!do_after(user,rand(50,70)))
|
|
for(var/mob/O in viewers(H, null))
|
|
O.show_message(text("\red [user] tried to cut [H]'s [S.display_name] off with [src], but failed."), 1)
|
|
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)
|
|
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 You begin to saw open your head with [src]!" \
|
|
)
|
|
if(M == user && prob(25))
|
|
user << "\red You mess up!"
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(40)
|
|
M.updatehealth()
|
|
else
|
|
M.take_organ_damage(40)
|
|
|
|
if(istype(M, /mob/living/carbon/human))
|
|
var/datum/organ/external/affecting = M:get_organ("head")
|
|
affecting.take_damage(7)
|
|
else
|
|
M.take_organ_damage(7)
|
|
|
|
M.updatehealth()
|
|
M:brain_op_stage = 2.0
|
|
|
|
if(2.0)
|
|
if(istype(M, /mob/living/carbon/metroid))
|
|
if(M.stat == 2)
|
|
var/mob/living/carbon/metroid/Metroid = M
|
|
if(Metroid.cores > 0)
|
|
for(var/mob/O in (viewers(M) - user - M))
|
|
O.show_message("\red [M.name] is having one of its cores sawed out with [src] by [user].", 1)
|
|
|
|
Metroid.cores--
|
|
M << "\red [user] begins to remove one of your cores with [src]! ([Metroid.cores] cores remaining)"
|
|
user << "\red You cut one of [M]'s cores out with [src]! ([Metroid.cores] cores remaining)"
|
|
|
|
new/obj/item/metroid_core(M.loc)
|
|
|
|
if(Metroid.cores <= 0)
|
|
M.icon_state = "baby metroid dead-nocore"
|
|
|
|
return
|
|
|
|
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)
|
|
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 You sever your brain's connection to the spine with [src]!" \
|
|
)
|
|
|
|
user.attack_log += "\[[time_stamp()]\]<font color='red'> Debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>"
|
|
M.attack_log += "\[[time_stamp()]\]<font color='orange'> Debrained by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>"
|
|
log_admin("ATTACK: [user] ([user.ckey]) debrained [M] ([M.ckey]) with [src].")
|
|
message_admins("ATTACK: [user] ([user.ckey]) debrained [M] ([M.ckey]) with [src].")
|
|
|
|
var/obj/item/brain/B = new(M.loc)
|
|
B.transfer_identity(M)
|
|
|
|
M:brain_op_stage = 4.0
|
|
M.death()//You want them to die after the brain was transferred, so not to trigger client death() twice.
|
|
|
|
else
|
|
..()
|
|
return
|
|
|
|
else if(user.zone_sel.selecting != "chest" && 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 at with [src] by [user]... It looks like [user] is trying to cut it off!"), 1)
|
|
if(!do_after(user, rand(20,80)))
|
|
for(var/mob/O in viewers(H, null))
|
|
O.show_message(text("\red [user] tried to cut [H]'s [S.display_name] off with [src], but failed."), 1)
|
|
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 ..()
|
|
/*
|
|
else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human))))
|
|
return ..()
|
|
*/
|
|
return
|
|
|
|
//////////////////////////////
|
|
// Bone Gel and Bone Setter //
|
|
//////////////////////////////
|
|
|
|
/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
|
|
|
|
The above might not apply anymore.
|
|
|
|
*/
|
|
|
|
/obj/item/weapon/surgical_tool/bonegel
|
|
name = "bone gel"
|
|
icon = 'surgery.dmi'
|
|
icon_state = "bone gel"
|
|
|
|
/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/bonesetter
|
|
name = "bone setter"
|
|
icon = 'surgery.dmi'
|
|
icon_state = "bone setter"
|
|
|
|
/obj/item/weapon/surgical_tool/bonesetter/New()
|
|
stage += 1
|
|
wound = "broken"
|
|
/obj/item/weapon/surgical_tool/bonesetter/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*/
|