From ce9042ae20099ecebd836065a9c48a2e02d49b5c Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Sun, 8 Jan 2012 20:05:54 -0500 Subject: [PATCH] bones and dismemberment --- code/defines/obj.dm | 1 - code/defines/obj/weapon.dm | 8 - code/game/gamemodes/cult/cult_items.dm | 1 - code/game/objects/items/item.dm | 4 + .../objects/items/weapons/surgery_tools.dm | 407 ++++++++++++++++-- .../objects/items/weapons/swords_axes_etc.dm | 2 - code/game/objects/items/weapons/tools.dm | 1 - code/modules/admin/verbs/randomverbs.dm | 18 + code/modules/mining/mine_items.dm | 1 - code/modules/mob/living/carbon/human/human.dm | 93 +++- .../mob/living/carbon/human/human_damage.dm | 6 +- .../mob/living/carbon/human/human_defense.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 12 +- code/modules/mob/organ/organ.dm | 32 +- code/modules/mob/organ/organ_external.dm | 33 +- code/unused/_debug.dm | 4 + icons/mob/human.dmi | Bin 17296 -> 18586 bytes icons/mob/limb_mask.dmi | Bin 0 -> 5667 bytes 18 files changed, 527 insertions(+), 98 deletions(-) create mode 100644 icons/mob/limb_mask.dmi diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 9f67387a9c..dd156c1695 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -294,7 +294,6 @@ var/icon_old = null // For when weapons get bloodied this saves their old icon. var/abstract = 0 var/force = 0 - var/slash = 0 var/item_state = null var/damtype = "brute" var/r_speed = 1.0 diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 6e39b5b352..d01409c9e4 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -208,7 +208,6 @@ throw_speed = 1 throw_range = 5 w_class = 3.0 - slash = 1 flags = FPRINT | CONDUCT | NOSHIELD | TABLEPASS origin_tech = "combat=3" @@ -244,7 +243,6 @@ throw_speed = 1 throw_range = 1 w_class = 4.0//So you can't hide it in your pocket or some such. - slash = 1 flags = FPRINT | TABLEPASS | NOSHIELD var/datum/effect/effect/system/spark_spread/spark_system @@ -624,7 +622,6 @@ desc = "A tool for breaking down those obstructions that stop you from fighting that fire." //Less ROBUST. --SkyMarshal force = 5 w_class = 4.0 - slash = 1 flags = ONBACK twohanded = 1 force_unwielded = 5 @@ -967,7 +964,6 @@ flags = FPRINT | TABLEPASS| CONDUCT force = 5.0 w_class = 1.0 - slash = 1 throwforce = 5.0 throw_speed = 3 throw_range = 5 @@ -981,7 +977,6 @@ desc = "Could probably be used as ... a throwing weapon?" w_class = 1.0 force = 5.0 - slash = 1 throwforce = 15.0 item_state = "shard-glass" g_amt = 3750 @@ -1358,7 +1353,6 @@ icon_state = "knife" force = 10.0 throwforce = 10.0 - slash = 1 /obj/item/weapon/kitchen/utensil/spoon name = "spoon" @@ -1373,7 +1367,6 @@ flags = FPRINT | TABLEPASS | CONDUCT force = 10.0 w_class = 1.0 - slash = 1 throwforce = 5.0 throw_speed = 3 throw_range = 5 @@ -1415,7 +1408,6 @@ icon_state = "drill" flags = FPRINT | TABLEPASS | CONDUCT w_class = 1.0 - slash = 1 origin_tech = "materials=1;biotech=1" /obj/item/weapon/circular_saw diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index efe21d281c..60bc235f93 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -6,7 +6,6 @@ flags = FPRINT | ONBELT | TABLEPASS force = 40 throwforce = 10 - slash = 1 /obj/item/clothing/head/culthood diff --git a/code/game/objects/items/item.dm b/code/game/objects/items/item.dm index 1892faa175..e57fada614 100644 --- a/code/game/objects/items/item.dm +++ b/code/game/objects/items/item.dm @@ -133,6 +133,8 @@ user.l_hand = src else user << "\blue You pick \the [src] up with your ha- wait a minute." + if(loc == user) + user.drop_from_slot(src) return else user.l_hand = src @@ -143,6 +145,8 @@ user.r_hand = src else user << "\blue You pick \the [src] up with your ha- wait a minute." + if(loc == user) + user.drop_from_slot(src) return else user.r_hand = src diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index 8c36fee1ca..be9bc29096 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -83,12 +83,12 @@ CIRCULAR SAW if(1.0) if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is having his eyes retracted by [user].", 1) + O.show_message("\red [M] is having \his eyes retracted by [user].", 1) M << "\red [user] begins to seperate your eyes with [src]!" user << "\red You seperate [M]'s eyes with [src]!" else user.visible_message( \ - "\red [user] begins to have his eyes retracted.", \ + "\red [user] begins to have \his eyes retracted.", \ "\red You begin to pry open your eyes with [src]!" \ ) if(M == user && prob(25)) @@ -102,10 +102,56 @@ CIRCULAR SAW M:eye_op_stage = 2.0 - else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human)))) - return ..() + else + // bone surgery doable? + if(!try_bone_surgery(M, user)) + return ..() - return +/obj/item/weapon/retractor/proc/try_bone_surgery(mob/living/carbon/human/H as mob, mob/living/user as mob) + if(!istype(H)) + return 0 + var/datum/organ/external/S = H.organs[user.zone_sel.selecting] + if(!S || !istype(S)) + return 0 + + if(S.destroyed) + user << "What [S.display_name]?" + if(!S.open) + user << "\red There is skin in the way!" + return 0 + if(S.bleeding) + user << "\red [H] is profusely bleeding in \his [S.display_name]!" + return 0 + + if(H != user) + H.visible_message( \ + "\red [user] is beginning to retract the flap in the wound in [H]'s [S.display_name] with [src].", \ + "\red [user] begins to retract the flap in the wound in your [S.display_name] with [src]!") + else + H.visible_message( \ + "\red [user] begins to retract the flap in the wound in \his [S.display_name] with [src]!", \ + "\red You begin to retract the flap in the wound in your [S.display_name] with [src]!") + + if(do_mob(user, H, 30)) + if(H != user) + H.visible_message( \ + "\red [user] retracts the flap in the wound in [H]'s [S.display_name] with [src]!", \ + "\red [user] retracts the flap in the wound in your [S.display_name] with [src]!") + else + H.visible_message( \ + "\red [user] retracts the flap in the wound in \his [S.display_name] with [src]!", \ + "\red You retract the flap in the wound in your [S.display_name] with [src]!") + + if(H == user && prob(25)) + user << "\red You mess up!" + S.take_damage(15) + + S.open = 2 + + H.updatehealth() + H.UpdateDamageIcon() + + return 1 //////////// //Hemostat// @@ -189,12 +235,12 @@ CIRCULAR SAW if(2.0) if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is having his eyes mended by [user].", 1) + O.show_message("\red [M] is having \his eyes mended by [user].", 1) M << "\red [user] begins to mend your eyes with [src]!" user << "\red You mend [M]'s eyes with [src]!" else user.visible_message( \ - "\red [user] begins to have his eyes mended.", \ + "\red [user] begins to have \his eyes mended.", \ "\red You begin to mend your eyes with [src]!" \ ) if(M == user && prob(25)) @@ -206,11 +252,68 @@ CIRCULAR SAW else M.take_organ_damage(15) M:eye_op_stage = 3.0 + else if(user.zone_sel.selecting == "head") + if(istype(M, /mob/living/carbon/human) && M:brain_op_stage == 1) + M:brain_op_stage = 0 + var/datum/organ/external/S = M:organs["head"] + if(!S || !istype(S)) + return ..() + M:brain_op_stage = 0 + S.open = 1 + if(!try_bone_surgery(M, user)) + return ..() + else + return ..() + else + // bone surgery doable? + if(!try_bone_surgery(M, user)) + return ..() - else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human)))) - return ..() +/obj/item/weapon/hemostat/proc/try_bone_surgery(mob/living/carbon/human/H as mob, mob/living/user as mob) + if(!istype(H)) + return 0 + var/datum/organ/external/S = H.organs[user.zone_sel.selecting] + if(!S || !istype(S)) + return 0 - return + if(S.destroyed) + user << "What [S.display_name]?" + if(!S.open) + user << "\red There is skin in the way!" + return 0 + if(!S.bleeding) + user << "\red [H] is not bleeding in \his [S.display_name]!" + return 0 + + if(H != user) + H.visible_message( \ + "\red [user] is beginning to clamp bleeders in the wound in [H]'s [S.display_name] with [src].", \ + "\red [user] begins to clamp bleeders in the wound in your [S.display_name] with [src]!") + else + H.visible_message( \ + "\red [user] begins to clamp bleeders in the wound in \his [S.display_name] with [src]!", \ + "\red You begin to clamp bleeders in the wound in your [S.display_name] with [src]!") + + if(do_mob(user, H, 50)) + if(H != user) + H.visible_message( \ + "\red [user] clamps bleeders in the wound in [H]'s [S.display_name] with [src]!", \ + "\red [user] clamps bleeders in the wound in your [S.display_name] with [src]!") + else + H.visible_message( \ + "\red [user] clamps bleeders in the wound in \his [S.display_name] with [src]!", \ + "\red You clamp bleeders in the wound in your [S.display_name] with [src]!") + + if(H == user && prob(25)) + user << "\red You mess up!" + S.take_damage(15) + + S.bleeding = 0 + + H.updatehealth() + H.UpdateDamageIcon() + + return 1 /////////// //Cautery// @@ -233,6 +336,8 @@ CIRCULAR SAW user << "\red You cauterize the incision in [M]'s torso with [src]!" M:embryo_op_stage = 0.0 return + else + try_bone_surgery(M, user) if(user.zone_sel.selecting == "groin") if(istype(M, /mob/living/carbon/human)) @@ -247,6 +352,8 @@ CIRCULAR SAW for(var/datum/disease/appendicitis in M.viruses) appendicitis.cure() M.resistances += appendicitis + else + try_bone_surgery(M, user) return if (user.zone_sel.selecting == "eyes") @@ -275,12 +382,12 @@ CIRCULAR SAW if(3.0) if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is having his eyes cauterized by [user].", 1) + O.show_message("\red [M] is having \his eyes cauterized by [user].", 1) M << "\red [user] begins to cauterize your eyes!" user << "\red You cauterize [M]'s eyes with [src]!" else user.visible_message( \ - "\red [user] begins to have his eyes cauterized.", \ + "\red [user] begins to have \his eyes cauterized.", \ "\red You begin to cauterize your eyes!" \ ) if(M == user && prob(25)) @@ -294,11 +401,53 @@ CIRCULAR SAW M.sdisabilities &= ~1 M:eye_op_stage = 0.0 - else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human)))) - return ..() + else + // bone surgery doable? + if(!try_bone_surgery(M, user)) + return ..() - return +/obj/item/weapon/cautery/proc/try_bone_surgery(mob/living/carbon/human/H as mob, mob/living/user as mob) + if(!istype(H)) + return 0 + var/datum/organ/external/S = H.organs[user.zone_sel.selecting] + if(!S || !istype(S)) + return 0 + if(S.destroyed) + user << "What [S.display_name]?" + if(!S.open) + user << "\red There is no wound to close up!" + return 0 + + if(H != user) + H.visible_message( \ + "\red [user] is beginning to cauterize the incision in [H]'s [S.display_name] with [src].", \ + "\red [user] begins to cut open the wound in your [S.display_name] with [src]!") + else + H.visible_message( \ + "\red [user] begins to cauterize the incision in \his [S.display_name] with [src]!", \ + "\red You begin to cauterize the incision in your [S.display_name] with [src]!") + + if(do_mob(user, H, 100)) + if(H != user) + H.visible_message( \ + "\red [user] cauterizes the incision in [H]'s [S.display_name] with [src]!", \ + "\red [user] cauterizes the incision in your [S.display_name] with [src]!") + else + H.visible_message( \ + "\red [user] cauterizes the incision in \his [S.display_name] with [src]!", \ + "\red You cauterize the incision in your [S.display_name] with [src]!") + + if(H == user && prob(25)) + user << "\red You mess up!" + S.take_damage(15) + + S.open = 0 + + H.updatehealth() + H.UpdateDamageIcon() + + return 1 //obj/item/weapon/surgicaldrill @@ -327,7 +476,7 @@ CIRCULAR SAW if(0.0) if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is beginning to have his torso cut open with [src] by [user].", 1) + O.show_message("\red [M] is beginning to have \his torso cut open with [src] by [user].", 1) M << "\red [user] begins to cut open your torso with [src]!" user << "\red You cut [M]'s torso open with [src]!" M:embryo_op_stage = 1.0 @@ -335,7 +484,7 @@ CIRCULAR SAW if(3.0) if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is beginning to have his stomach cut open with [src] by [user].", 1) + O.show_message("\red [M] is beginning to have \his stomach cut open with [src] by [user].", 1) M << "\red [user] begins to cut open your stomach with [src]!" user << "\red You cut [M]'s stomach open with [src]!" for(var/datum/disease/D in M.viruses) @@ -352,14 +501,14 @@ CIRCULAR SAW if(0.0) if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is beginning to have his abdomen cut open with [src] by [user].", 1) + O.show_message("\red [M] is beginning to have \his abdomen cut open with [src] by [user].", 1) M << "\red [user] begins to cut open your abdomen with [src]!" user << "\red You cut [M]'s abdomen open with [src]!" M:appendix_op_stage = 1.0 if(3.0) if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is beginning to have his appendix seperated with [src] by [user].", 1) + O.show_message("\red [M] is beginning to have \his appendix seperated with [src] by [user].", 1) M << "\red [user] begins to seperate your appendix with [src]!" user << "\red You seperate [M]'s appendix with [src]!" M:appendix_op_stage = 4.0 @@ -397,12 +546,12 @@ CIRCULAR SAW if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is beginning to have his head cut open with [src] by [user].", 1) + O.show_message("\red [M] is beginning to have \his head cut open with [src] by [user].", 1) M << "\red [user] begins to cut open your head with [src]!" user << "\red You cut [M]'s head open with [src]!" else user.visible_message( \ - "\red [user] begins to cut open his skull with [src]!", \ + "\red [user] begins to cut open \his skull with [src]!", \ "\red You begin to cut open your head with [src]!" \ ) @@ -443,12 +592,12 @@ CIRCULAR SAW if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is having his connections to the brain delicately severed with [src] by [user].", 1) + O.show_message("\red [M] is having \his connections to the brain delicately severed with [src] by [user].", 1) M << "\red [user] begins to cut open your head with [src]!" user << "\red You cut [M]'s head open with [src]!" else user.visible_message( \ - "\red [user] begin to delicately remove the connections to his brain with [src]!", \ + "\red [user] begin to delicately remove the connections to \his brain with [src]!", \ "\red You begin to cut open your head with [src]!" \ ) if(M == user && prob(25)) @@ -498,12 +647,12 @@ CIRCULAR SAW if(0.0) if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] is beginning to have his eyes incised with [src] by [user].", 1) + O.show_message("\red [M] is beginning to have \his eyes incised with [src] by [user].", 1) M << "\red [user] begins to cut open your eyes with [src]!" user << "\red You make an incision around [M]'s eyes with [src]!" else user.visible_message( \ - "\red [user] begins to cut around his eyes with [src]!", \ + "\red [user] begins to cut around \his eyes with [src]!", \ "\red You begin to cut open your eyes with [src]!" \ ) if(M == user && prob(25)) @@ -519,13 +668,78 @@ CIRCULAR SAW M:eye_op_stage = 1.0 user << "\blue So far so good after." else - return ..() + // bone surgery doable? + if(!try_bone_surgery(M, user)) + return ..() + /* wat else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human)))) return ..() */ return +/obj/item/weapon/scalpel/proc/try_bone_surgery(mob/living/carbon/human/H as mob, mob/living/user as mob) + if(!istype(H)) + return 0 + var/datum/organ/external/S = H.organs[user.zone_sel.selecting] + if(!S || !istype(S)) + return 0 + + if(S.destroyed) + user << "What [S.display_name]?" + if(S.open) + user << "\red The wound is already open!" + return 0 + + if(H != user) + H.visible_message( \ + "\red [user] is beginning to cut open the wound in [H]'s [S.display_name] with [src].", \ + "\red [user] begins to cut open the wound in your [S.display_name] with [src]!") + else + H.visible_message( \ + "\red [user] begins to cut open the wound in \his [S.display_name] with [src]!", \ + "\red You begin to cut open the wound in your [S.display_name] with [src]!") + + if(do_mob(user, H, 100)) + if(H != user) + H.visible_message( \ + "\red [user] cuts open the wound in [H]'s [S.display_name] with [src]!", \ + "\red [user] cuts open the wound in your [S.display_name] with [src]!") + else + H.visible_message( \ + "\red [user] cuts open the wound in \his [S.display_name] with [src]!", \ + "\red You cut open the wound in your [S.display_name] with [src]!") + + if(H == user && prob(25)) + user << "\red You mess up!" + S.take_damage(15) + + S.open = 1 + S.bleeding = 1 + + H.updatehealth() + H.UpdateDamageIcon() + else + var/a = pick(1,2,3) + var/msg + if(a == 1) + msg = "\red [user]'s move slices open [H]'s wound, causing massive bleeding" + S.brute_dam += 35 + S.createwound(rand(1,3)) + else if(a == 2) + msg = "\red [user]'s move slices open [H]'s wound, and causes \him to accidentally stab himself" + S.brute_dam += 35 + var/datum/organ/external/userorgan = user:organs["chest"] + if(userorgan) + userorgan.brute_dam += 35 + else + user.take_organ_damage(35) + else if(a == 3) + msg = "\red [user] quickly stops the surgery" + for(var/mob/O in viewers(H)) + O.show_message(msg, 1) + + return 1 //////////////// //CIRCULAR SAW// @@ -567,12 +781,12 @@ CIRCULAR SAW return if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] has his skull sawed open with [src] by [user].", 1) + O.show_message("\red [M] has \his skull sawed open with [src] by [user].", 1) M << "\red [user] begins to saw open your head with [src]!" user << "\red You saw [M]'s head open with [src]!" else user.visible_message( \ - "\red [user] saws open his skull with [src]!", \ + "\red [user] saws open \his skull with [src]!", \ "\red You begin to saw open your head with [src]!" \ ) if(M == user && prob(25)) @@ -615,12 +829,12 @@ CIRCULAR SAW if(3.0) if(M != user) for(var/mob/O in (viewers(M) - user - M)) - O.show_message("\red [M] has his spine's connection to the brain severed with [src] by [user].", 1) + O.show_message("\red [M] has \his spine's connection to the brain severed with [src] by [user].", 1) M << "\red [user] severs your brain's connection to the spine with [src]!" user << "\red You sever [M]'s brain's connection to the spine with [src]!" else user.visible_message( \ - "\red [user] severs his brain's connection to the spine with [src]!", \ + "\red [user] severs \his brain's connection to the spine with [src]!", \ "\red You sever your brain's connection to the spine with [src]!" \ ) @@ -645,6 +859,7 @@ CIRCULAR SAW 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 ..() @@ -653,3 +868,135 @@ CIRCULAR SAW return ..() */ return + +/obj/item/weapon/surgical_tool + name = "surgical tool" + var/list/stage = list() //Stage to act on + var/time = 50 //Time it takes to use + var/wound //Wound type to act on + + proc/get_message(var/mnumber,var/M,var/user,var/datum/organ/external/organ)//=Start,2=finish,3=walk away,4=screw up, 5 = closed wound + proc/screw_up(mob/living/carbon/M as mob,mob/living/carbon/user as mob,var/datum/organ/external/organ) + organ.brute_dam += 30 +/obj/item/weapon/surgical_tool/proc/IsFinalStage(var/stage) + var/a + switch(wound) + if("broken") //Basic broken bone + a=3 + if("blood") + a=3 + return stage == a + +/obj/item/weapon/surgical_tool/attack(mob/living/carbon/human/M as mob, mob/living/carbon/user as mob) + if(!istype(M, /mob)) + return + if((usr.mutations & 16) && prob(50)) + M << "\red You stab yourself in the eye." + M.disabilities |= 128 + M.weakened += 4 + M.bruteloss += 10 + + src.add_fingerprint(user) + + if(!(locate(/obj/machinery/optable, M.loc) && M.resting)) + return ..() + + var/zone = user.zone_sel.selecting + if (istype(M.organs[zone], /datum/organ/external)) + var/datum/organ/external/temp = M.organs[zone] + var/msg + + // quickly convert embryo removal to bone surgery + if(zone == "chest" && M.embryo_op_stage == 3) + M.embryo_op_stage = 0 + temp.open = 2 + temp.bleeding = 0 + + // quickly convert appendectomy to bone surgery + if(zone == "groin" && M.appendix_op_stage == 3) + M.appendix_op_stage = 0 + temp.open = 2 + temp.bleeding = 0 + + msg = get_message(1,M,user,temp) + for(var/mob/O in viewers(M,null)) + O.show_message("\red [msg]",1) + if(do_mob(user,M,time)) + if(temp.open == 2 && !temp.bleeding) + if(temp.wound == wound) + if(temp.stage in stage) + temp.stage += 1 + + if(IsFinalStage(temp.stage)) + temp.broken = 0 + temp.stage = 0 + temp.perma_injury = 0 + temp.brute_dam = temp.min_broken_damage -1 + msg = get_message(2,M,user,temp) + else + msg = get_message(4,M,user,temp) + screw_up(M,user,temp) + else + msg = get_message(5,M,user,temp) + else + msg = get_message(3,M,user,temp) + + for(var/mob/O in viewers(M,null)) + O.show_message("\red [msg]",1) + + +//Broken bone +//Basic +//Open -> Clean -> Bone-gel -> pop-into-place -> Bone-gel -> close -> glue -> clean + +//Split +//Open -> Clean -> Tweasers -> bone-glue -> close -> glue -> clean + +// + +/obj/item/weapon/surgical_tool/bonegel + name = "Bone-gel" + icon = 'janitor.dmi' + icon_state = "cleaner" + +/obj/item/weapon/surgical_tool/bonegel/New() + stage += 0 + stage += 2 + wound = "broken" +/obj/item/weapon/surgical_tool/bonegel/get_message(var/n,var/m,var/usr,var/datum/organ/external/organ) + var/z + switch(n) + if(1) + z="[usr] starts applying bone-gel to [m]'s [organ.display_name]" + if(2) + z="[usr] finishes applying bone-gel to [m]'s [organ.display_name]" + if(3) + z="[usr] stops applying bone-gel to [m]'s [organ.display_name]" + if(4) + z="[usr] applies bone-gel incorrectly to [m]'s [organ.display_name]" + if(5) + z="[usr] lubricates [m]'s [organ.display_name]" + return z + +/obj/item/weapon/surgical_tool/bonecracker + name = "Bone-cracker" + icon = 'items.dmi' + icon_state = "wrench" + +/obj/item/weapon/surgical_tool/bonecracker/New() + stage += 1 + wound = "broken" +/obj/item/weapon/surgical_tool/bonecracker/get_message(var/n,var/m,var/usr,var/datum/organ/external/organ) + var/z + switch(n) + if(1) + z="[usr] starts popping [m]'s [organ.display_name] bone into place" + if(2) + z="[usr] finishes popping [m]'s [organ.display_name] bone into place" + if(3) + z="[usr] stops popping [m]'s [organ.display_name] bone into place" + if(4) + z="[usr] pops [m]'s [organ.display_name] bone into the wrong place" + if(5) + z="[usr] performs chiropractice on [m]'s [organ.display_name]" + return z diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 1ecdff06ca..5f7185d72b 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -33,7 +33,6 @@ STUN BATON else icon_state = "sword[color]" w_class = 4 - slash = 1 playsound(user, 'saberon.ogg', 50, 1) user << "\blue [src] is now active." else @@ -43,7 +42,6 @@ STUN BATON else icon_state = "sword0" w_class = 2 - slash = 0 playsound(user, 'saberoff.ogg', 50, 1) user << "\blue [src] can now be concealed." add_fingerprint(user) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 232a374f48..a6f00c091a 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -290,7 +290,6 @@ WELDINGTOOOL icon_state = "cutters" flags = FPRINT | TABLEPASS| CONDUCT force = 6.0 - slash = 1 throw_speed = 2 throw_range = 9 w_class = 2.0 diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 1fd57987e3..680122d016 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -494,6 +494,24 @@ Traitors and the like can also be revived with the previous role mostly intact. //M.updatehealth() M.buckled = initial(M.buckled) M.handcuffed = initial(M.handcuffed) + if(istype(M,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + for(var/name in H.organs) + var/datum/organ/external/e = H.organs[name] + e.brute_dam = 0.0 + e.burn_dam = 0.0 + e.bandaged = 0.0 + e.wound_size = 0.0 + e.max_damage = initial(e.max_damage) + e.bleeding = 0 + e.open = 0 + e.broken = 0 + e.destroyed = 0 + e.perma_injury = 0 + e.update_icon() + H.update_body() + H.update_face() + H.UpdateDamageIcon() if (M.stat > 1) M.stat=0 ..() diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index b527f6cb0a..a49b639c21 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -131,7 +131,6 @@ proc/move_mining_shuttle() throwforce = 4.0 item_state = "pickaxe" w_class = 4.0 - slash = 1 m_amt = 3750 //one sheet, but where can you make them? var/digspeed = 40 //moving the delay to an item var so R&D can make improved picks. --NEO origin_tech = "materials=1;engineering=1" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 8eeb9b7cdb..0e629c7f27 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -891,17 +891,33 @@ //because theyre located on the 'other' inventory bar. // Gloves - if (gloves) - var/t1 = gloves.item_state - if (!t1) - t1 = gloves.icon_state - overlays += image("icon" = 'hands.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER) - if (gloves.blood_DNA) + var/datum/organ/external/lo = organs["l_hand"] + var/datum/organ/external/ro = organs["r_hand"] + if (!lo.destroyed || !ro.destroyed) + if (gloves) + var/t1 = gloves.item_state + if (!t1) + t1 = gloves.icon_state + var/icon/gloves_icon = new /icon("icon" = 'hands.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2"))) + if(lo.destroyed) + gloves_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY) + else if(ro.destroyed) + gloves_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY) + overlays += image(gloves_icon, "layer" = MOB_LAYER) + if (gloves.blood_DNA) + var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]") + if(lo.destroyed) + stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY) + else if(ro.destroyed) + stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY) + overlays += image("icon" = stain_icon, "layer" = MOB_LAYER) + else if (blood_DNA) var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]") + if(lo.destroyed) + stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY) + else if(ro.destroyed) + stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY) overlays += image("icon" = stain_icon, "layer" = MOB_LAYER) - else if (blood_DNA) - var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]") - overlays += image("icon" = stain_icon, "layer" = MOB_LAYER) // Glasses if (glasses) var/t1 = glasses.icon_state @@ -914,11 +930,22 @@ var/t1 = r_ear.icon_state overlays += image("icon" = 'ears.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER) // Shoes - if (shoes) + lo = organs["l_foot"] + ro = organs["r_foot"] + if ((!lo.destroyed || !ro.destroyed) && shoes) var/t1 = shoes.icon_state - overlays += image("icon" = 'feet.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER) + var/icon/shoes_icon = new /icon("icon" = 'feet.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2"))) + if(lo.destroyed && !lying) + shoes_icon.Blend(new /icon('limb_mask.dmi', "right[lying?"_l":""]"), ICON_MULTIPLY) + else if(ro.destroyed && !lying) + shoes_icon.Blend(new /icon('limb_mask.dmi', "left[lying?"_l":""]"), ICON_MULTIPLY) + overlays += image(shoes_icon, "layer" = MOB_LAYER) if (shoes.blood_DNA) var/icon/stain_icon = icon('blood.dmi', "shoesblood[!lying ? "" : "2"]") + if(lo.destroyed) + stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY) + else if(ro.destroyed) + stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY) overlays += image("icon" = stain_icon, "layer" = MOB_LAYER) // Radio /* if (w_radio) overlays += image("icon" = 'ears.dmi', "icon_state" = "headset[!lying ? "" : "2"]", "layer" = MOB_LAYER) */ @@ -1248,26 +1275,50 @@ else if (gender == FEMALE) g = "f" - stand_icon = new /icon('human.dmi', "body_[g]_s") - lying_icon = new /icon('human.dmi', "body_[g]_l") + stand_icon = new /icon('human.dmi', "torso_s") + lying_icon = new /icon('human.dmi', "torso_l") var/husk = (mutations & HUSK) //var/obese = (mutations & FAT) + stand_icon.Blend(new /icon('human.dmi', "chest_[g]_s"), ICON_OVERLAY) + lying_icon.Blend(new /icon('human.dmi', "chest_[g]_l"), ICON_OVERLAY) + + var/datum/organ/external/head = organs["head"] + if(!head.destroyed) + stand_icon.Blend(new /icon('human.dmi', "head_[g]_s"), ICON_OVERLAY) + lying_icon.Blend(new /icon('human.dmi', "head_[g]_l"), ICON_OVERLAY) + + for(var/name in organs) + var/datum/organ/external/part = organs[name] + if(!istype(part, /datum/organ/external/groin) \ + && !istype(part, /datum/organ/external/chest) \ + && !istype(part, /datum/organ/external/head) \ + && !part.destroyed) + stand_icon.Blend(new /icon('human.dmi', "[part.icon_name]_s"), ICON_OVERLAY) + lying_icon.Blend(new /icon('human.dmi', "[part.icon_name]_l"), ICON_OVERLAY) + + stand_icon.Blend(new /icon('human.dmi', "groin_[g]_s"), ICON_OVERLAY) + lying_icon.Blend(new /icon('human.dmi', "groin_[g]_l"), ICON_OVERLAY) + if (husk) - stand_icon.Blend(new /icon('human.dmi', "husk_s"), ICON_OVERLAY) - lying_icon.Blend(new /icon('human.dmi', "husk_l"), ICON_OVERLAY) - /*else if(obese) - stand_icon.Blend(new /icon('human.dmi', "fatbody_s"), ICON_OVERLAY) - lying_icon.Blend(new /icon('human.dmi', "fatbody_l"), ICON_OVERLAY)*/ - else + var/icon/husk_s = new /icon('human.dmi', "husk_s") + var/icon/husk_l = new /icon('human.dmi', "husk_l") + for(var/name in organs) var/datum/organ/external/part = organs[name] if(!istype(part, /datum/organ/external/groin) \ && !istype(part, /datum/organ/external/chest) \ + && !istype(part, /datum/organ/external/head) \ && part.destroyed) - stand_icon.Blend(new /icon('dam_mask.dmi', "[part.icon_name]"), ICON_OVERLAY) - lying_icon.Blend(new /icon('dam_mask.dmi', "[part.icon_name]2"), ICON_OVERLAY) + husk_s.Blend(new /icon('dam_mask.dmi', "[part.icon_name]"), ICON_SUBTRACT) + husk_l.Blend(new /icon('dam_mask.dmi', "[part.icon_name]2"), ICON_SUBTRACT) + + stand_icon.Blend(husk_s, ICON_OVERLAY) + lying_icon.Blend(husk_l, ICON_OVERLAY) + /*else if(obese) + stand_icon.Blend(new /icon('human.dmi', "fatbody_s"), ICON_OVERLAY) + lying_icon.Blend(new /icon('human.dmi', "fatbody_l"), ICON_OVERLAY)*/ // Skin tone if (s_tone >= 0) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index bd9dff3281..e0f779fb7a 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -39,7 +39,7 @@ return null -/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/slash = 0) +/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0) if((damagetype != BRUTE) && (damagetype != BURN)) ..(damage, damagetype, def_zone, blocked) return 1 @@ -58,9 +58,9 @@ switch(damagetype) if(BRUTE) - organ.take_damage(damage, 0, slash) + organ.take_damage(damage, 0, sharp) if(BURN) - organ.take_damage(0, damage, slash) + organ.take_damage(0, damage, sharp) UpdateDamageIcon() updatehealth() return 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index bf5e3345e1..e03e9c1504 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -96,7 +96,7 @@ emp_act var/armor = run_armor_check(affecting, "melee", "Your armor has protected you from a hit to the [hit_area].", "Your armor has softened hit to your [hit_area].") if(armor >= 2) return 0 if(!I.force) return 0 - apply_damage(I.force, I.damtype, affecting, armor, I.slash) + apply_damage(I.force, I.damtype, affecting, armor, is_cut(I)) var/bloody = 0 if((I.damtype == BRUTE) && prob(25 + (I.force * 2))) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index fb0a22a050..1df70ac599 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -669,10 +669,11 @@ return //TODO: DEFERRED handle_regular_status_updates() + var/leg_tally = 2 for(var/name in organs) var/datum/organ/external/E = organs[name] E.process() - if(E.broken) + if(E.broken || E.destroyed) if(E.name == "l_hand" || E.name == "l_arm") if(hand && equipped()) drop_item() @@ -681,12 +682,21 @@ if(!hand && equipped()) drop_item() emote("scream") + else if(E.name == "l_leg" || E.name == "l_foot" \ + || E.name == "r_leg" || E.name == "r_foot" && !lying) + leg_tally-- // let it fail even if just foot&leg if(E.open && (!resting) && (!sleeping)) emote("scream") E.take_damage(20,0) emote("collapse") paralysis = 10 + // can't stand + if(leg_tally == 0) + emote("scream") + emote("collapse") + paralysis = 10 + updatehealth() // health = 100 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()) diff --git a/code/modules/mob/organ/organ.dm b/code/modules/mob/organ/organ.dm index 6404cac623..845ec7dc8a 100644 --- a/code/modules/mob/organ/organ.dm +++ b/code/modules/mob/organ/organ.dm @@ -41,10 +41,8 @@ damage_msg = "\red You feel a intense pain" var/open = 0 - var/clean = 1 var/stage = 0 var/wound = 0 - var/split = 0 New(mob/living/carbon/human/H) ..(H) @@ -54,14 +52,14 @@ owner = H H.organs[name] = src - proc/take_damage(brute, burn, slash) + proc/take_damage(brute, burn, sharp) if((brute <= 0) && (burn <= 0)) return 0 if(destroyed) return 0 if(owner) owner.pain(display_name, (brute+burn)*3, 1) - if(slash) + if(sharp) var/chance = rand(1,5) var/nux = brute * chance if(brute_dam >= max_damage) @@ -190,19 +188,25 @@ switch(body_part) if(UPPER_TORSO) owner.gib() + if(LOWER_TORSO) + owner << "\red You are now sterile." if(HEAD) - var/obj/item/weapon/organ/head/H = new(owner.loc) + var/obj/item/weapon/organ/head/H = new(owner.loc, owner) + if(owner.gender == FEMALE) + H.icon_state = "head_f_l" + H.overlays += owner.face_lying + var/lol = pick(cardinal) step(H,lol) - owner:update_face() - owner:update_body() - return + owner.update_face() + owner.update_body() + owner.death() if(ARM_RIGHT) var/obj/item/weapon/organ/r_arm/H = new(owner.loc) if(owner:organs["r_hand"]) var/datum/organ/external/S = owner:organs["r_hand"] if(!S.destroyed) - var/obj/item/weapon/organ/r_hand/X = new(owner.loc) + var/obj/item/weapon/organ/r_hand/X = new(owner.loc, owner) for(var/mob/M in viewers(owner)) M.show_message("\red [owner.name]'s [X.name] flies off.") var/lol2 = pick(cardinal) @@ -210,13 +214,12 @@ var/lol = pick(cardinal) step(H,lol) destroyed = 1 - return if(ARM_LEFT) var/obj/item/weapon/organ/l_arm/H = new(owner.loc) if(owner:organs["l_hand"]) var/datum/organ/external/S = owner:organs["l_hand"] if(!S.destroyed) - var/obj/item/weapon/organ/l_hand/X = new(owner.loc) + var/obj/item/weapon/organ/l_hand/X = new(owner.loc, owner) for(var/mob/M in viewers(owner)) M.show_message("\red [owner.name]'s [X.name] flies off in arc.") var/lol2 = pick(cardinal) @@ -224,13 +227,12 @@ var/lol = pick(cardinal) step(H,lol) destroyed = 1 - return if(LEG_RIGHT) var/obj/item/weapon/organ/r_leg/H = new(owner.loc) if(owner:organs["r_foot"]) var/datum/organ/external/S = owner:organs["r_foot"] if(!S.destroyed) - var/obj/item/weapon/organ/l_foot/X = new(owner.loc) + var/obj/item/weapon/organ/l_foot/X = new(owner.loc, owner) for(var/mob/M in viewers(owner)) M.show_message("\red [owner.name]'s [X.name] flies off flies off in arc.") var/lol2 = pick(cardinal) @@ -238,13 +240,12 @@ var/lol = pick(cardinal) step(H,lol) destroyed = 1 - return if(LEG_LEFT) var/obj/item/weapon/organ/l_leg/H = new(owner.loc) if(owner:organs["l_foot"]) var/datum/organ/external/S = owner:organs["l_foot"] if(!S.destroyed) - var/obj/item/weapon/organ/l_foot/X = new(owner.loc) + var/obj/item/weapon/organ/l_foot/X = new(owner.loc, owner) for(var/mob/M in viewers(owner)) M.show_message("\red [owner.name]'s [X.name] flies off.") var/lol2 = pick(cardinal) @@ -252,7 +253,6 @@ var/lol = pick(cardinal) step(H,lol) destroyed = 1 - return proc/createwound(var/size = 1) if(ishuman(src.owner)) diff --git a/code/modules/mob/organ/organ_external.dm b/code/modules/mob/organ/organ_external.dm index 6fdeb413cd..6043c05ae9 100644 --- a/code/modules/mob/organ/organ_external.dm +++ b/code/modules/mob/organ/organ_external.dm @@ -15,8 +15,8 @@ /datum/organ/external/head name = "head" icon_name = "head" - max_damage = 125 - min_broken_damage = 70 + max_damage = 75 + min_broken_damage = 40 body_part = HEAD var/disfigured = 0 @@ -84,32 +84,41 @@ min_broken_damage = 15 body_part = HAND_LEFT -obj/item/weapon/organ/ +obj/item/weapon/organ icon = 'human.dmi' + +obj/item/weapon/organ/New(loc, mob/living/carbon/human/H) + ..(loc) + if(!istype(H)) + return + if(H.dna) + blood_DNA = H.dna.unique_enzymes + blood_type = H.b_type + obj/item/weapon/organ/head name = "head" - icon_state = "head_l" + icon_state = "head_m_l" obj/item/weapon/organ/l_arm name = "left arm" - icon_state = "arm_left_l" + icon_state = "l_arm_l" obj/item/weapon/organ/l_foot name = "left foot" - icon_state = "foot_left_l" + icon_state = "l_foot_l" obj/item/weapon/organ/l_hand name = "left hand" - icon_state = "hand_left_l" + icon_state = "l_hand_l" obj/item/weapon/organ/l_leg name = "left leg" - icon_state = "leg_left_l" + icon_state = "l_leg_l" obj/item/weapon/organ/r_arm name = "right arm" - icon_state = "arm_right_l" + icon_state = "r_arm_l" obj/item/weapon/organ/r_foot name = "right foot" - icon_state = "foot_right_l" + icon_state = "r_foot_l" obj/item/weapon/organ/r_hand name = "right hand" - icon_state = "hand_right_l" + icon_state = "r_hand_l" obj/item/weapon/organ/r_leg name = "right leg" - icon_state = "leg_right_l" + icon_state = "r_leg_l" diff --git a/code/unused/_debug.dm b/code/unused/_debug.dm index 61ec522c9c..b9cbcdf430 100644 --- a/code/unused/_debug.dm +++ b/code/unused/_debug.dm @@ -486,9 +486,13 @@ Doing this because FindTurfs() isn't even used e.bandaged = 0.0 e.wound_size = 0.0 e.max_damage = initial(e.max_damage) + e.broken = 0 + e.destroyed = 0 + e.perma_injury = 0 e.update_icon() if(src.type == /mob/living/carbon/human) var/mob/living/carbon/human/H = src + H.update_body() H.UpdateDamageIcon() else alert("Debugging off") diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi index e355f58934d9f73f31d3ff3b4226e46126ed1b75..ae8fd76d54b376ea2813c8eb346cbce52dc38026 100644 GIT binary patch literal 18586 zcmce;WmJ{j-z~f;5s{YeMp8heL)<8mQqmzUT>?@YP?1I&q`N`7yGy#eySvZY_x=3O z8E1?$-uFE3hxdcAy*7Ja*IK`rzd7g9?}OYsj3*>dAP@+~dr7Dw1cHzZetABA1pZ~` zcZD^0q2Qvd<^VOaH?aF`Z?rp;H^*qd^$obsgr0DDUZ37BDZXwGihA<Z3c^7)QhRx)&%&bURAjioh;oUsP~?Ri`L=iS*jKS5gA@Xc4` zwZ$iw?cBzx>5ggR4FzWF?Flb!&1I9G&!ry=ePOU?qvw|C>=BcX?FlvPGNOsY#h(df zMNDNxrrJ&=kQtrynx7QA~qSJFl1*?~G5zSkd&|a?&&gAX2 z@B#ZwiGf@h@sv;zVeDyhAvq{ECF>;>|t&4jzQ=}*T8lKe4fNdvgha8&%XZB&>; z-5`tn_5qR%=4+@Bufh3LVY}F)JK5=$iCNO~iHqe>8BTCI)`T=TE|KlCWApXP2=Ghm$Ur-InJHp``&D}vfSAY7F* zxZX=n(IJO^*Sg0{|2DI9?8Nk51m$Q!*x%w>074blQ26o+T6hQ^N!}LipwqZ z*i6A(i4GbWPW6h?onWTn0psqRV?M8L=LGh!;^=0)Pk3E%0DIFo;&lo3FKv0@{LY$5 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%0A@VBVN1w;K&~nfGW0RlDl>5aKqeX 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 E17(Ls!vFvP literal 0 HcmV?d00001