From 176ed8f3ea34d5418640f7faf5b3ba5aafeaf8a5 Mon Sep 17 00:00:00 2001 From: Ren Erthilo Date: Thu, 22 Mar 2012 20:41:09 +0000 Subject: [PATCH] Adds facial reconstruction surgery. Config change for custom items. --- code/defines/mob/living/carbon/carbon.dm | 1 + .../objects/items/weapons/surgery_tools.dm | 373 ++++++++++++++++-- code/modules/mob/living/carbon/human/life.dm | 1 + config/custom_items.txt | 5 +- 4 files changed, 353 insertions(+), 27 deletions(-) diff --git a/code/defines/mob/living/carbon/carbon.dm b/code/defines/mob/living/carbon/carbon.dm index 3e8250b4b33..7715ce30bfb 100644 --- a/code/defines/mob/living/carbon/carbon.dm +++ b/code/defines/mob/living/carbon/carbon.dm @@ -6,6 +6,7 @@ var/eye_op_stage = 0.0 var/appendix_op_stage = 0.0 var/embryo_op_stage = 0.0 + var/face_op_stage = 0.0 var/datum/disease2/disease/virus2 = null var/list/datum/disease2/disease/resistances2 = list() diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index f254589663c..c00997e3504 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -102,6 +102,97 @@ CIRCULAR SAW 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 ..() @@ -265,6 +356,111 @@ CIRCULAR SAW 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 ..() @@ -493,7 +689,6 @@ CIRCULAR SAW return 1 - /////////// //Cautery// /////////// @@ -577,6 +772,73 @@ CIRCULAR SAW 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 ..() @@ -662,8 +924,8 @@ CIRCULAR SAW if(3.0) if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is beginning to have \his stomach cut open with [src] by [user].", 1) - M << "\red [user] begins to cut open your stomach with [src]!" + 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)) @@ -686,8 +948,8 @@ CIRCULAR SAW if(3.0) if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is beginning to have \his appendix seperated with [src] by [user].", 1) - M << "\red [user] begins to seperate your appendix with [src]!" + 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 @@ -721,8 +983,8 @@ CIRCULAR SAW 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] is beginning to have its flesh cut open with [src] by [user].", 1) - M << "\red [user] begins to cut open your flesh with [src]!" + 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 @@ -730,12 +992,12 @@ CIRCULAR SAW if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is beginning to have \his head cut open with [src] by [user].", 1) - M << "\red [user] begins to cut open your head with [src]!" + 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 cut open \his skull with [src]!", \ + "\red [user] begins to cuts open \his skull with [src]!", \ "\red You begin to cut open your head with [src]!" \ ) @@ -762,8 +1024,8 @@ CIRCULAR SAW 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] is having its silky inndards cut apart with [src] by [user].", 1) - M << "\red [user] begins to cut apart your innards with [src]!" + 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 @@ -778,12 +1040,12 @@ CIRCULAR SAW if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is having \his connections to the brain delicately severed with [src] by [user].", 1) - M << "\red [user] begins to cut open your head with [src]!" - user << "\red You cut [M]'s head open with [src]!" + 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] begin to delicately remove the connections to \his brain with [src]!", \ + "\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)) @@ -807,7 +1069,6 @@ CIRCULAR SAW return if(user.zone_sel.selecting == "eyes") - user << "\blue So far so good." var/mob/living/carbon/human/H = M if(istype(H) && ( \ @@ -833,8 +1094,8 @@ CIRCULAR SAW if(0.0) if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is beginning to have \his eyes incised with [src] by [user].", 1) - M << "\red [user] begins to cut open your eyes with [src]!" + 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( \ @@ -849,14 +1110,72 @@ CIRCULAR SAW else M.take_organ_damage(15) - user << "\blue So far so good before." M.updatehealth() M:eye_op_stage = 1.0 - user << "\blue So far so good after." 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 ..() @@ -933,6 +1252,7 @@ CIRCULAR SAW //////////////// //CIRCULAR SAW// //////////////// + /obj/item/weapon/circular_saw/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) if(!istype(M)) return ..() @@ -1042,7 +1362,7 @@ CIRCULAR SAW 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)])" @@ -1065,7 +1385,7 @@ CIRCULAR SAW 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) + 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) @@ -1083,6 +1403,10 @@ CIRCULAR SAW */ return +////////////////////////////// +// Bone Gel and Bone Setter // +////////////////////////////// + /obj/item/weapon/surgical_tool name = "surgical tool" var/list/stage = list() //Stage to act on @@ -1218,7 +1542,6 @@ CIRCULAR SAW return z - /obj/item/weapon/boneinjector name = "Bone-repairing Nanites Injector" desc = "This injects the person with nanites that repair bones." diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 8ccef01b7bb..7ec31ec32bb 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -918,6 +918,7 @@ emote("scream") real_name = "Unknown" src << "\red Your face has become disfigured." + face_op_stage = 0.0 warn_flavor_changed() for(var/name in organs) var/datum/organ/external/temp = organs[name] diff --git a/config/custom_items.txt b/config/custom_items.txt index 71c1d6da5df..8d42197bf41 100644 --- a/config/custom_items.txt +++ b/config/custom_items.txt @@ -1,10 +1,11 @@ skymarshal: Phillip Oswald: /obj/item/weapon/coin/silver spaceman96: Trenna Seber: /obj/item/weapon/pen/multi, /obj/item/clothing/suit/storage/labcoat/pink -asanadas: Book Berner: /obj/item/clothing/under/chameleon/psyche +asanadas: Book Berner: /obj/item/clothing/under/chameleon/psyche, /obj/item/clothing/glasses/meson/fluff/book_berner_1 tastyfish: Cindy Robertson: /obj/item/weapon/wrapping_paper eternal248: Maximilian Haynes: /obj/item/weapon/paper/certificate searif: Yuki Matsuda: /obj/item/weapon/paper/certificate, /obj/item/clothing/under/jumpsuitdown erthilo: Farah Lants: /obj/item/clothing/under/rank/medical_sleeve, /obj/item/clothing/suit/storage/labcoat/red, /obj/item/weapon/storage/backpack/medicalsatchel compactninja: Ysyr Rylias: /obj/item/weapon/reagent_containers/food/drinks/dry_ramen, /obj/item/weapon/reagent_containers/food/drinks/dry_ramen, /obj/item/weapon/reagent_containers/food/drinks/dry_ramen, /obj/item/weapon/reagent_containers/food/drinks/dry_ramen tzefa: Wes Solari: /obj/item/fluff/wes_solari_1 -misterfox: Rashid Siraj: /obj/item/weapon/storage/bible/tajaran \ No newline at end of file +misterfox: Rashid Siraj: /obj/item/weapon/storage/bible/tajaran +chinsky: Victor Kaminski: /obj/item/fluff/victor_kaminsky_1 \ No newline at end of file