From 81bcad2b332e74fc8695b5fe5e2397eb63ab6baf Mon Sep 17 00:00:00 2001 From: mwerezak Date: Tue, 7 Apr 2015 15:12:32 -0400 Subject: [PATCH 1/3] attackhand cleanup --- .../living/carbon/human/human_attackhand.dm | 88 +++++++++---------- code/modules/organs/organ_external.dm | 2 +- 2 files changed, 44 insertions(+), 46 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index ebdfbd8b5a..0d01429ea6 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -214,25 +214,18 @@ w_uniform.add_fingerprint(M) var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting)) - if(istype(r_hand,/obj/item/weapon/gun) || istype(l_hand,/obj/item/weapon/gun)) - var/obj/item/weapon/gun/W = null - var/chance = 0 + var/list/holding = list(get_active_hand() = 40, get_inactive_hand = 20) - if (istype(l_hand,/obj/item/weapon/gun)) - W = l_hand - chance = hand ? 40 : 20 - - if (istype(r_hand,/obj/item/weapon/gun)) - W = r_hand - chance = !hand ? 40 : 20 - - if (prob(chance)) - visible_message("[src]'s [W] goes off during struggle!") + //See if they have any guns that might go off + for(var/obj/item/weapon/gun/W in holding) + if(W && prob(holding[W])) var/list/turfs = list() for(var/turf/T in view()) turfs += T - var/turf/target = pick(turfs) - return W.afterattack(target,src) + if(turfs.len) + var/turf/target = pick(turfs) + visible_message("[src]'s [W] goes off during the struggle!") + return W.afterattack(target,src) var/randn = rand(1, 100) if(!(species.flags & NO_SLIP) && randn <= 25) @@ -245,38 +238,19 @@ visible_message("[M] attempted to push [src]!") return - var/talked = 0 // BubbleWrap - if(randn <= 60) - //BubbleWrap: Disarming breaks a pull - if(pulling) - visible_message("\red [M] has broken [src]'s grip on [pulling]!") - talked = 1 - stop_pulling() - - //BubbleWrap: Disarming also breaks a grab - this will also stop someone being choked, won't it? - if(istype(l_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/lgrab = l_hand - if(lgrab.affecting) - visible_message("\red [M] has broken [src]'s grip on [lgrab.affecting]!") - talked = 1 - spawn(1) - del(lgrab) - if(istype(r_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/rgrab = r_hand - if(rgrab.affecting) - visible_message("\red [M] has broken [src]'s grip on [rgrab.affecting]!") - talked = 1 - spawn(1) - del(rgrab) - //End BubbleWrap - - if(!talked) //BubbleWrap - drop_item() - visible_message("\red [M] has disarmed [src]!") - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - return + //See about breaking grips or pulls + if(break_all_grabs(M)) + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + return + //Actually disarm them + for(var/obj/item/I in holding) + if(I) + drop_from_inventory(I) + visible_message("[M] has disarmed [src]!") + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + return playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) visible_message("\red [M] attempted to disarm [src]!") @@ -315,3 +289,27 @@ dislocation_str = "[src]'s [organ.joint] [pick("gives way","caves in","crumbles","collapses")] with a grisly crunch!" organ.dislocate() return dislocation_str + +//Breaks all grips and pulls that the mob currently has. +/mob/living/carbon/human/proc/break_all_grabs(mob/living/carbon/user) + var/success = 0 + if(pulling) + visible_message("\red [user] has broken [src]'s grip on [pulling]!") + success = 1 + stop_pulling() + + if(istype(l_hand, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/lgrab = l_hand + if(lgrab.affecting) + visible_message("\red [user] has broken [src]'s grip on [lgrab.affecting]!") + success = 1 + spawn(1) + del(lgrab) + if(istype(r_hand, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/rgrab = r_hand + if(rgrab.affecting) + visible_message("\red [user] has broken [src]'s grip on [rgrab.affecting]!") + success = 1 + spawn(1) + del(rgrab) + return success diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index d8ba25d750..43132ecb0b 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -813,7 +813,7 @@ Note that amputating the affected organ does in fact remove the infection from t name = "[R.company] [initial(name)]" desc = "[R.desc]" - dislocated = -1 + dislocated = -1 //TODO, make robotic limbs a separate type, remove snowflake cannot_break = 1 get_icon() for (var/obj/item/organ/external/T in children) From d683bb07af2b59924ab4421ae60ff055d3a85fb4 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Tue, 7 Apr 2015 15:46:42 -0400 Subject: [PATCH 2/3] Allows dislocating joints using a neck grab + disarm --- .../living/carbon/human/human_attackhand.dm | 43 ++++++++++++++++--- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 0d01429ea6..d822df8c79 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -251,6 +251,11 @@ visible_message("[M] has disarmed [src]!") playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) return + + //if M (and only M) has a grab on src, start dislocating limbs + if(grab_joint(M)) + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + return playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) visible_message("\red [M] attempted to disarm [src]!") @@ -276,7 +281,9 @@ return 1 /mob/living/carbon/human/proc/attack_joint(var/obj/item/W, var/mob/living/user, var/def_zone) - var/target_zone = def_zone? check_zone(def_zone) : get_zone_with_miss_chance(user.zone_sel.selecting, src) + if(!def_zone) def_zone = user.zone_sel.selecting + var/target_zone = get_zone_with_miss_chance(check_zone(def_zone), src) + if(user == src) // Attacking yourself can't miss target_zone = user.zone_sel.selecting if(!target_zone) @@ -286,29 +293,55 @@ return null var/dislocation_str if(prob(W.force)) - dislocation_str = "[src]'s [organ.joint] [pick("gives way","caves in","crumbles","collapses")] with a grisly crunch!" + dislocation_str = "[src]'s [organ.joint] [pick("gives way","caves in","crumbles","collapses")]!" organ.dislocate() return dislocation_str +//Used to attack a joint through grabbing +/mob/living/carbon/human/proc/grab_joint(var/mob/living/user, var/def_zone) + var/has_grab = 0 + for(var/obj/item/weapon/grab/G in list(user.l_hand, user.r_hand)) + if(G.affecting == src && G.state == GRAB_NECK) + has_grab = 1 + break + + if(!has_grab) + return 0 + + if(!def_zone) def_zone = user.zone_sel.selecting + var/target_zone = check_zone(def_zone) + if(!target_zone) + return 0 + var/obj/item/organ/external/organ = get_organ(check_zone(target_zone)) + if(!organ || organ.is_dislocated() || organ.dislocated == -1) + return 0 + + user.visible_message("[user] begins to dislocate [src]'s [organ.joint]!") + if(do_after(user, 100)) + organ.dislocate() + src.visible_message("[src]'s [organ.joint] [pick("gives way","caves in","crumbles","collapses")]!") + return 1 + return 0 + //Breaks all grips and pulls that the mob currently has. /mob/living/carbon/human/proc/break_all_grabs(mob/living/carbon/user) var/success = 0 if(pulling) - visible_message("\red [user] has broken [src]'s grip on [pulling]!") + visible_message("[user] has broken [src]'s grip on [pulling]!") success = 1 stop_pulling() if(istype(l_hand, /obj/item/weapon/grab)) var/obj/item/weapon/grab/lgrab = l_hand if(lgrab.affecting) - visible_message("\red [user] has broken [src]'s grip on [lgrab.affecting]!") + visible_message("[user] has broken [src]'s grip on [lgrab.affecting]!") success = 1 spawn(1) del(lgrab) if(istype(r_hand, /obj/item/weapon/grab)) var/obj/item/weapon/grab/rgrab = r_hand if(rgrab.affecting) - visible_message("\red [user] has broken [src]'s grip on [rgrab.affecting]!") + visible_message("[user] has broken [src]'s grip on [rgrab.affecting]!") success = 1 spawn(1) del(rgrab) From da5518f8b239213fb8761f9d8286c7b07f6045bd Mon Sep 17 00:00:00 2001 From: mwerezak Date: Mon, 13 Apr 2015 16:38:33 -0400 Subject: [PATCH 3/3] Updates various dependencies on organ brokenness to use the is_broken() proc. Updates external organ brokenness to ensure broken description is set. --- code/modules/mob/living/carbon/human/human_organs.dm | 2 +- code/modules/mob/living/carbon/shock.dm | 6 +----- code/modules/organs/organ.dm | 2 +- code/modules/organs/organ_external.dm | 6 +++++- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index de7a982b1a..a2bd080f84 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -74,7 +74,7 @@ stance_damage += 2 else if (E.status & ORGAN_DESTROYED) stance_damage += 2 // let it fail even if just foot&leg - else if (E.is_malfunctioning() || (E.is_broken() && !(E.status & ORGAN_SPLINTED)) || !E.is_usable()) + else if (E.is_malfunctioning() || E.is_broken() || !E.is_usable()) stance_damage += 1 // Canes and crutches help you stand (if the latter is ever added) diff --git a/code/modules/mob/living/carbon/shock.dm b/code/modules/mob/living/carbon/shock.dm index a83e76ef76..b020bf0a54 100644 --- a/code/modules/mob/living/carbon/shock.dm +++ b/code/modules/mob/living/carbon/shock.dm @@ -36,12 +36,8 @@ if(istype(src,/mob/living/carbon/human)) var/mob/living/carbon/human/M = src for(var/obj/item/organ/external/organ in M.organs) - if (!organ) - continue - else if(organ.status & ORGAN_BROKEN || organ.open) + if(organ && (organ.is_broken() || organ.open)) src.traumatic_shock += 30 - if(organ.status & ORGAN_SPLINTED) - src.traumatic_shock -= 25 if(src.traumatic_shock < 0) src.traumatic_shock = 0 diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index f97df89080..640daa3e7d 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -145,7 +145,7 @@ var/list/organ_cache = list() return damage >= min_bruised_damage /obj/item/organ/proc/is_broken() - return (damage >= min_broken_damage || (status & ORGAN_CUT_AWAY) || ((status & ORGAN_BROKEN) && !(status & ORGAN_SPLINTED))) + return (damage >= min_broken_damage || (status & ORGAN_CUT_AWAY) || (status & ORGAN_BROKEN)) //Germs /obj/item/organ/proc/handle_antibiotics() diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 43132ecb0b..e047699334 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -333,8 +333,12 @@ This function completely restores a damaged organ to perfect condition. PROCESSING & UPDATING ****************************************************/ -//Determines if we even need to process this organ. +//external organs handle brokenness a bit differently when it comes to damage. Instead brute_dam is checked inside process() +//this also ensures that an external organ cannot be "broken" without broken_description being set. +/obj/item/organ/external/is_broken() + return ((status & ORGAN_CUT_AWAY) || ((status & ORGAN_BROKEN) && !(status & ORGAN_SPLINTED))) +//Determines if we even need to process this organ. /obj/item/organ/external/proc/need_process() if(status && status != ORGAN_ROBOT) // If it's robotic, that's fine it will have a status. return 1