diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index f0102a17730..03609a29cb6 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -112,27 +112,24 @@ var/mob/living/L = M var/contact = 1 + var/target_zone if(user.a_intent == "harm") contact = ..() agony *= 0.5 //whacking someone causes a much poorer contact than prodding them. stun *= 0.5 + //we can't really extract the actual hit zone from ..(), unfortunately. Just act like they prodded the chest. + target_zone = "chest" else - //copied from human_defense.dm + //copied from human_defense.dm - human defence code should really be refactored some time. if (ishuman(L)) user.lastattacked = L //are these used at all, if we have logs? L.lastattacker = user - var/target_zone = get_zone_with_miss_chance(user.zone_sel.selecting, L) + target_zone = get_zone_with_miss_chance(user.zone_sel.selecting, L) if(user == L) // Attacking yourself can't miss - target_zone = user.zone_sel.selecting + target_zone = check_zone(user.zone_sel.selecting) if(!target_zone) contact = 0 - else - switch (target_zone) - if("head") - agony *= 1.25 - //if("l_hand", "r_hand") //TODO - //if("l_foot", "r_foot") //TODO //put this here to avoid duplicate messages and logs from ..() above if (!contact) @@ -141,30 +138,20 @@ if(!status) L.visible_message("[L] has been prodded with [src] by [user]. Luckily it was off.") else - L.visible_message("[L] has been prodded with [src] by [user]!") + //unfortunately we can't tuck this away into human/stun_effect_act()... + if (ishuman(L)) + var/mob/living/carbon/human/H = L + var/datum/organ/external/affecting = H.get_organ(target_zone) + if (affecting) + H.visible_message("[L] has been prodded in the [affecting.display_name] with [src] by [user]!") + else + L.visible_message("[L] has been prodded with [src] by [user]!") //stun effects if (contact) msg_admin_attack("[key_name(user)] attempted to stun [key_name(L)] with the [src].") - if (ishuman(L)) - var/mob/living/carbon/human/H = L - var/datum/organ/external/affected = get_organ(def_zone) - var/siemens_coeff = H.get_siemens_coefficient_organ(affected) - stun *= siemens_coeff - agony *= siemens_coeff - - if (stun) - L.Stun(stun) - L.Weaken(stun) - L.apply_effect(STUTTER, stun) - - if (agony) - //perhaps this could be merged with taser effects? - L.apply_effect(agony,AGONY,0) - L.apply_effect(STUTTER, agony/10) - L.apply_effect(EYE_BLUR, agony/10) - L.flash_pain() + L.stun_effect_act(stun, agony, target_zone) playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) msg_admin_attack("[key_name(user)] stunned [key_name(L)] with the [src].") diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 9cb8f8cc097..9bf59b27e7f 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -59,18 +59,7 @@ emp_act //BEGIN BOOK'S TASER NERF. if(istype(P, /obj/item/projectile/beam/stun)) - var/datum/organ/external/select_area = get_organ(def_zone) // We're checking the outside, buddy! - var/list/clothing_items = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes) // What all are we checking? - - for(var/obj/item/clothing/CL in clothing_items) //Make an unregulated var to pass around. - if(!istype(CL)) //This isn't necessary, is it? - continue - if(CL.body_parts_covered & select_area.body_part) // Is that body part being targeted covered by CL? - P.agony *= CL.siemens_coefficient - - //blocked = 0 here as we've already adjused based on siemens_coefficient. - apply_effect(P.agony,AGONY,0) - flash_pain() + stun_effect_act(0, P.agony, def_zone) src <<"\red You have been hit by [P]!" del P return @@ -88,6 +77,19 @@ emp_act return (..(P , def_zone)) +/mob/living/carbon/human/stun_effect_act(var/stun_amount, var/agony_amount, var/def_zone) + switch (def_zone) + if("head") + agony_amount *= 1.25 + //if("l_hand", "r_hand") //TODO + //if("l_foot", "r_foot") //TODO + + var/datum/organ/external/affected = get_organ(check_zone(def_zone)) + var/siemens_coeff = get_siemens_coefficient_organ(affected) + stun_amount *= siemens_coeff + agony_amount *= siemens_coeff + + ..(stun_amount, agony_amount, def_zone) /mob/living/carbon/human/getarmor(var/def_zone, var/type) var/armorval = 0 @@ -191,7 +193,7 @@ emp_act /mob/living/carbon/human/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone) if(!I || !user) return 0 - var/target_zone = def_zone? def_zone : get_zone_with_miss_chance(user.zone_sel.selecting, src) + var/target_zone = def_zone? check_zone(def_zone) : get_zone_with_miss_chance(user.zone_sel.selecting, src) if(user == src) // Attacking yourself can't miss target_zone = user.zone_sel.selecting diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 4cfad2504a5..3ab8632e8ec 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -202,15 +202,6 @@ return 0 -/mob/living/proc/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0) - return 0 //only carbon liveforms have this proc - -/mob/living/emp_act(severity) - var/list/L = src.get_contents() - for(var/obj/O in L) - O.emp_act(severity) - ..() - /mob/living/proc/can_inject() return 1 diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 8b9bfccb879..e5c965c8b1f 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -65,6 +65,30 @@ P.on_hit(src, absorb, def_zone) return absorb +//Handles the effects of "stun" weapons +/mob/living/proc/stun_effect_act(var/stun_amount, var/agony_amount, var/def_zone) + flash_pain() + + if (stun_amount) + Stun(stun_amount) + Weaken(stun_amount) + apply_effect(STUTTER, stun_amount) + apply_effect(EYE_BLUR, stun_amount) + + if (agony_amount) + apply_effect(agony_amount, AGONY,0) + apply_effect(STUTTER, agony_amount/10) + apply_effect(EYE_BLUR, agony_amount/10) + +/mob/living/proc/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0) + return 0 //only carbon liveforms have this proc + +/mob/living/emp_act(severity) + var/list/L = src.get_contents() + for(var/obj/O in L) + O.emp_act(severity) + ..() + //this proc handles being hit by a thrown atom /mob/living/hitby(atom/movable/AM as mob|obj,var/speed = 5)//Standardization and logging -Sieve if(istype(AM,/obj/)) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index d730bd9b5f7..b08345ff5ed 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -34,6 +34,9 @@ src << "\red Warning: Electromagnetic pulse detected." ..() +/mob/living/silicon/stun_effect_act(var/stun_amount, var/agony_amount) + return //immune + /mob/living/silicon/proc/damage_mob(var/brute = 0, var/fire = 0, var/tox = 0) return diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index a8210acfd96..388f2bf7a4b 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -129,17 +129,6 @@ proc/hasorgans(A) zone = "head" if("mouth") zone = "head" -/* if("l_hand") - zone = "l_arm" - if("r_hand") - zone = "r_arm" - if("l_foot") - zone = "l_leg" - if("r_foot") - zone = "r_leg" - if("groin") - zone = "chest" -*/ return zone // Returns zone with a certain probability.