diff --git a/baystation12.dme b/baystation12.dme index 9f7330d684..3edb656645 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -700,6 +700,7 @@ #include "code\game\objects\items\weapons\RCD.dm" #include "code\game\objects\items\weapons\RSF.dm" #include "code\game\objects\items\weapons\stungloves.dm" +#include "code\game\objects\items\weapons\surgery_limbattachment.dm" #include "code\game\objects\items\weapons\surgery_tools.dm" #include "code\game\objects\items\weapons\swords_axes_etc.dm" #include "code\game\objects\items\weapons\syndie.dm" @@ -1088,6 +1089,7 @@ #include "code\WorkInProgress\AI_Visibility.dm" #include "code\WorkInProgress\buildmode.dm" #include "code\WorkInProgress\explosion_particles.dm" +#include "code\WorkInProgress\Cael_Aislinn\Tajara\examine.dm" #include "code\WorkInProgress\Cael_Aislinn\Tajara\say.dm" #include "code\WorkInProgress\Cael_Aislinn\Tajara\tajara_transformation.dm" #include "code\WorkInProgress\Cael_Aislinn\Tajara\tajaran.dm" diff --git a/code/game/objects/items/weapons/surgery_limbattachment.dm b/code/game/objects/items/weapons/surgery_limbattachment.dm new file mode 100644 index 0000000000..7e85d32155 --- /dev/null +++ b/code/game/objects/items/weapons/surgery_limbattachment.dm @@ -0,0 +1,233 @@ +/obj/item/robot_parts/l_arm/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(!istype(M, /mob/living/carbon/human)) + return ..() + + if(user.zone_sel.selecting == "l_arm") + var/mob/living/carbon/human/H = M + var/datum/organ/external/S = H.organs[user.zone_sel.selecting] + if(S.destroyed) + if(!S.attachable) + user << "\red The wound is not ready for a replacement!" + return 0 + if(M != user) + M.visible_message( \ + "\red [user] is beginning to attach a robotic limb where [H]'s [S.display_name] used to be with [src].", \ + "\red [user] begins to attach a robotic limb where [S.display_name] used to be with [src].") + else + M.visible_message( \ + "\red [user] begins to attach a robotic limb where \his [S.display_name] used to be with [src].", \ + "\red You begin to attach a robotic limb where your [S.display_name] used to be with [src].") + + if(do_mob(user, H, 100)) + if(M != user) + M.visible_message( \ + "\red [user] finishes attaching [H]'s new [S.display_name].", \ + "\red [user] finishes attaching your new [S.display_name].") + else + M.visible_message( \ + "\red [user] finishes attaching \his new [S.display_name].", \ + "\red You finish attaching your new [S.display_name].") + + if(H == user && prob(25)) + user << "\red You mess up!" + S.take_damage(15) + + S.broken = 0 + S.attachable = 0 + S.destroyed = 0 + S.robot = 1 + var/datum/organ/external/T = H.organs["l_hand"] + T.attachable = 0 + T.destroyed = 0 + T.robot = 1 + user.drop_item() + M.update_body() + M.updatehealth() + M.UpdateDamageIcon() + + return 1 + else + user << "\red That doesn't fit there!." + return ..() + + +/obj/item/robot_parts/r_arm/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(!istype(M, /mob/living/carbon/human)) + return ..() + + if(user.zone_sel.selecting == "r_arm") + var/mob/living/carbon/human/H = M + var/datum/organ/external/S = H.organs[user.zone_sel.selecting] + if(S.destroyed) + if(!S.attachable) + user << "\red The wound is not ready for a replacement!" + return 0 + if(M != user) + M.visible_message( \ + "\red [user] is beginning to attach a robotic limb where [H]'s [S.display_name] used to be with [src].", \ + "\red [user] begins to attach a robotic limb where [S.display_name] used to be with [src].") + else + M.visible_message( \ + "\red [user] begins to attach a robotic limb where \his [S.display_name] used to be with [src].", \ + "\red You begin to attach a robotic limb where your [S.display_name] used to be with [src].") + + if(do_mob(user, H, 100)) + if(M != user) + M.visible_message( \ + "\red [user] finishes attaching [H]'s new [S.display_name].", \ + "\red [user] finishes attaching your new [S.display_name].") + else + M.visible_message( \ + "\red [user] finishes attaching \his new [S.display_name].", \ + "\red You finish attaching your new [S.display_name].") + + if(H == user && prob(25)) + user << "\red You mess up!" + S.take_damage(15) + + S.broken = 0 + S.attachable = 0 + S.destroyed = 0 + S.robot = 1 + var/datum/organ/external/T = H.organs["r_hand"] + T.attachable = 0 + T.destroyed = 0 + T.robot = 1 + user.drop_item() + M.update_body() + M.updatehealth() + M.UpdateDamageIcon() + + return 1 + else + user << "\red That doesn't fit there!." + return ..() + +/obj/item/robot_parts/l_leg/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(!istype(M, /mob/living/carbon/human)) + return ..() + + if(user.zone_sel.selecting == "l_leg") + var/mob/living/carbon/human/H = M + var/datum/organ/external/S = H.organs[user.zone_sel.selecting] + if(S.destroyed) + if(!S.attachable) + user << "\red The wound is not ready for a replacement!" + return 0 + if(M != user) + M.visible_message( \ + "\red [user] is beginning to attach a robotic limb where [H]'s [S.display_name] used to be with [src].", \ + "\red [user] begins to attach a robotic limb where [S.display_name] used to be with [src].") + else + M.visible_message( \ + "\red [user] begins to attach a robotic limb where \his [S.display_name] used to be with [src].", \ + "\red You begin to attach a robotic limb where your [S.display_name] used to be with [src].") + + if(do_mob(user, H, 100)) + if(M != user) + M.visible_message( \ + "\red [user] finishes attaching [H]'s new [S.display_name].", \ + "\red [user] finishes attaching your new [S.display_name].") + else + M.visible_message( \ + "\red [user] finishes attaching \his new [S.display_name].", \ + "\red You finish attaching your new [S.display_name].") + + if(H == user && prob(25)) + user << "\red You mess up!" + S.take_damage(15) + + S.broken = 0 + S.attachable = 0 + S.destroyed = 0 + S.robot = 1 + var/datum/organ/external/T = H.organs["l_foot"] + T.attachable = 0 + T.destroyed = 0 + T.robot = 1 + user.drop_item() + M.update_body() + M.updatehealth() + M.UpdateDamageIcon() + + return 1 + else + user << "\red That doesn't fit there!." + return ..() + + +/obj/item/robot_parts/r_leg/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(!istype(M, /mob/living/carbon/human)) + return ..() + + if(user.zone_sel.selecting == "r_leg") + var/mob/living/carbon/human/H = M + var/datum/organ/external/S = H.organs[user.zone_sel.selecting] + if(S.destroyed) + if(!S.attachable) + user << "\red The wound is not ready for a replacement!" + return 0 + if(M != user) + M.visible_message( \ + "\red [user] is beginning to attach a robotic limb where [H]'s [S.display_name] used to be with [src].", \ + "\red [user] begins to attach a robotic limb where [S.display_name] used to be with [src].") + else + M.visible_message( \ + "\red [user] begins to attach a robotic limb where \his [S.display_name] used to be with [src].", \ + "\red You begin to attach a robotic limb where your [S.display_name] used to be with [src].") + + if(do_mob(user, H, 100)) + if(M != user) + M.visible_message( \ + "\red [user] finishes attaching [H]'s new [S.display_name].", \ + "\red [user] finishes attaching your new [S.display_name].") + else + M.visible_message( \ + "\red [user] finishes attaching \his new [S.display_name].", \ + "\red You finish attaching your new [S.display_name].") + + if(H == user && prob(25)) + user << "\red You mess up!" + S.take_damage(15) + + S.broken = 0 + S.attachable = 0 + S.destroyed = 0 + S.robot = 1 + var/datum/organ/external/T = H.organs["r_foot"] + T.attachable = 0 + T.destroyed = 0 + T.robot = 1 + user.drop_item() + M.update_body() + M.updatehealth() + M.UpdateDamageIcon() + + return 1 + else + user << "\red That doesn't fit there!." + return ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index 2cfa9f87c8..352edbf882 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -19,6 +19,45 @@ CIRCULAR SAW 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 == "l_arm") || (user.zone_sel.selecting == "r_arm") || (user.zone_sel.selecting == "l_leg") || (user.zone_sel.selecting == "r_leg")) & (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) + if(S.bleeding) + user << "\red There's too much blood here!" + return 0 + if(!S.cutaway) + user << "\red The flesh hasn't been cleanly cut!" + return 0 + if(M != user) + M.visible_message( \ + "\red [user] is beginning reposition flesh and nerve endings where [H]'s [S.display_name] used to be with [src].", \ + "\red [user] begins to reposition flesh and nerve endings where [S.display_name] used to be with [src]!") + else + M.visible_message( \ + "\red [user] begins to reposition flesh and nerve endings where \his [S.display_name] used to be with [src]!", \ + "\red You begin to reposition flesh and nerve endings where your [S.display_name] used to be with [src]!") + + if(do_mob(user, H, 100)) + if(M != user) + M.visible_message( \ + "\red [user] finishes repositioning flesh and nerve endings where [H]'s [S.display_name] used to be with [src]!", \ + "\red [user] finishes repositioning flesh and nerve endings where your [S.display_name] used to be with [src]!") + else + M.visible_message( \ + "\red [user] finishes repositioning flesh and nerve endings where \his [S.display_name] used to be with [src]!", \ + "\red You finish repositioning flesh and nerve endings where your [S.display_name] used to be with [src]!") + + if(H == user && prob(25)) + user << "\red You mess up!" + S.take_damage(15) + + S.open = 3 + M.updatehealth() + M.UpdateDamageIcon() + + return 1 + if(user.zone_sel.selecting == "chest") if(istype(M, /mob/living/carbon/human)) switch(M:embryo_op_stage) @@ -205,7 +244,8 @@ CIRCULAR SAW return 0 if(S.destroyed) - user << "What [S.display_name]?" + return ..() + if(!S.open) user << "\red There is skin in the way!" return 0 @@ -254,6 +294,45 @@ CIRCULAR SAW 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 == "l_arm") || (user.zone_sel.selecting == "r_arm") || (user.zone_sel.selecting == "l_leg") || (user.zone_sel.selecting == "r_leg")) & (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) + if(!S.bleeding) + user << "\red There is nothing bleeding here!" + return 0 + if(!S.cutaway) + user << "\red The flesh hasn't been cleanly cut!" + return 0 + if(M != user) + M.visible_message( \ + "\red [user] is beginning to clamp bleeders in the stump where [H]'s [S.display_name] used to be with [src].", \ + "\red [user] begins to clamp bleeders in the stump where [S.display_name] used to be with [src]!") + else + M.visible_message( \ + "\red [user] begins to clamp bleeders in the stump where \his [S.display_name] used to be with [src]!", \ + "\red You begin to clamp bleeders in the stump where your [S.display_name] used to be with [src]!") + + if(do_mob(user, H, 100)) + if(M != user) + M.visible_message( \ + "\red [user] finishes clamping bleeders in the stump where [H]'s [S.display_name] used to be with [src]!", \ + "\red [user] finishes clamping bleeders in the stump where your [S.display_name] used to be with [src]!") + else + M.visible_message( \ + "\red [user] finishes clamping bleeders in the stump where \his [S.display_name] used to be with [src]!", \ + "\red You finish clamping bleeders in the stump where your [S.display_name] used to be with [src]!") + + if(H == user && prob(25)) + user << "\red You mess up!" + S.take_damage(15) + + S.bleeding = 0 + M.updatehealth() + M.UpdateDamageIcon() + + return 1 + if(user.zone_sel.selecting == "chest") if(istype(M, /mob/living/carbon/human)) switch(M:embryo_op_stage) @@ -470,14 +549,17 @@ CIRCULAR SAW 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]?" + return ..() + 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 @@ -700,6 +782,50 @@ CIRCULAR SAW 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 == "l_arm") || (user.zone_sel.selecting == "r_arm") || (user.zone_sel.selecting == "l_leg") || (user.zone_sel.selecting == "r_leg")) & (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) + if(S.bleeding) + user << "\red There's too much blood here!" + return 0 + if(!S.cutaway) + user << "\red The flesh hasn't been cleanly cut!" + return 0 + if(S.open != 3) + user << "\red The wound hasn't been prepared yet!" + return 0 + if(M != user) + M.visible_message( \ + "\red [user] is adjusting the area around [H]'s [S.display_name] for reattachment with [src].", \ + "\red [user] is adjusting the area around your [S.display_name] for reattachment with [src]!") + else + M.visible_message( \ + "\red [user] begins adjusting the area around \his [S.display_name] for reattachment with [src]!", \ + "\red You begin adjusting the area around your [S.display_name] for reattachment with [src]!") + + if(do_mob(user, H, 100)) + if(M != user) + M.visible_message( \ + "\red [user] finishes adjusting the area around [H]'s [S.display_name]!", \ + "\red [user] finishes adjusting the area around your [S.display_name]!") + else + M.visible_message( \ + "\red [user] finishes adjusting the area around \his [S.display_name]!", \ + "\red You finish adjusting the area around your [S.display_name]!") + + if(H == user && prob(25)) + user << "\red You mess up!" + S.take_damage(15) + + S.open = 0 + S.stage = 0 + S.attachable = 1 + M.updatehealth() + M.UpdateDamageIcon() + + return 1 + 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) @@ -910,6 +1036,53 @@ CIRCULAR SAW src.add_fingerprint(user) + if(((user.zone_sel.selecting == "l_arm") || (user.zone_sel.selecting == "r_arm") || (user.zone_sel.selecting == "l_leg") || (user.zone_sel.selecting == "r_leg")) & (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) + if(M != user) + M.visible_message( \ + "\red [user] is beginning to cut away at the flesh where [H]'s [S.display_name] used to be with [src].", \ + "\red [user] begins to cut away at the flesh where [S.display_name] used to be with [src]!") + else + M.visible_message( \ + "\red [user] begins to cut away at the flesh where \his [S.display_name] used to be with [src]!", \ + "\red You begin to cut away at the flesh where your [S.display_name] used to be with [src]!") + + if(do_mob(user, H, 100)) + if(M != user) + M.visible_message( \ + "\red [user] finishes cutting where [H]'s [S.display_name] used to be with [src]!", \ + "\red [user] finishes cutting where your [S.display_name] used to be with [src]!") + else + M.visible_message( \ + "\red [user] finishes cutting where \his [S.display_name] used to be with [src]!", \ + "\red You finish cutting where your [S.display_name] used to be with [src]!") + + S.cutaway = 1 + S.bleeding = 1 + M.updatehealth() + M.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) + if(user.zone_sel.selecting == "chest") if(istype(M, /mob/living/carbon/human)) switch(M:embryo_op_stage) @@ -1186,11 +1359,13 @@ CIRCULAR SAW 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]?" + return ..() + if(S.open) user << "\red The wound is already open!" return 0 @@ -1224,7 +1399,6 @@ CIRCULAR SAW H:embryo_op_stage = 1.0 if(S.display_name == "groin") H:appendix_op_stage = 1.0 - H.updatehealth() H.UpdateDamageIcon() else @@ -1249,6 +1423,7 @@ CIRCULAR SAW return 1 + //////////////// //CIRCULAR SAW// //////////////// @@ -1435,7 +1610,7 @@ CIRCULAR SAW src.add_fingerprint(user) - if(!(locate(/obj/machinery/optable, M.loc) && M.resting)) + 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 ..() var/zone = user.zone_sel.selecting @@ -1443,6 +1618,9 @@ CIRCULAR SAW var/datum/organ/external/temp = M.organs[zone] var/msg + if(temp.destroyed) + return ..() + // quickly convert embryo removal to bone surgery if(zone == "chest" && M.embryo_op_stage == 3) M.embryo_op_stage = 0 @@ -1603,1362 +1781,3 @@ CIRCULAR SAW 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()]\] Debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])" - M.attack_log += "\[[time_stamp()]\] Debrained by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])" - 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*/ diff --git a/code/modules/mob/organ/organ.dm b/code/modules/mob/organ/organ.dm index f4fe6a551d..9ff680d7ca 100644 --- a/code/modules/mob/organ/organ.dm +++ b/code/modules/mob/organ/organ.dm @@ -58,6 +58,8 @@ tmp/destspawn = 0 //Has it spawned the broken limb? tmp/gauzed = 0 //Has the missing limb been patched? tmp/robot = 0 //ROBOT ARM MAN! + tmp/cutaway = 0 //First part of limb reattachment. + tmp/attachable = 0 //Can limb be attached? min_broken_damage = 30 datum/organ/external/parent list/datum/organ/external/children