From 8120a9b77fd323765df3534a5ca00e20188129ee Mon Sep 17 00:00:00 2001 From: Hubblenaut Date: Mon, 15 Dec 2014 18:54:07 +0100 Subject: [PATCH] Makes kicks and stomps their own unarmed_attack types --- .../living/carbon/human/human_attackhand.dm | 28 +++--- .../mob/living/carbon/human/species.dm | 10 +- .../mob/living/carbon/human/unarmed_attack.dm | 97 +++++++++++++++---- 3 files changed, 101 insertions(+), 34 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index f7bd79268b0..32751ec8249 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -94,17 +94,6 @@ attack_generic(H,rand(1,3),"punched") return - // See if they can attack, and which attacks to use. - var/datum/unarmed_attack/attack = null - for(var/datum/unarmed_attack/u_attack in H.species.unarmed) - if(!u_attack.is_usable(H, src)) - continue - else - attack = u_attack - break - if(!attack) - return 0 - var/damage = rand(1, 5) var/block = 0 var/accurate = 0 @@ -159,7 +148,11 @@ if(prob(80)) hit_zone = ran_zone(hit_zone) if(prob(15) && hit_zone != "chest") // Missed! - attack_message = "[H] attempted to strike [src], but missed!" + if(!src.lying) + attack_message = "[H] attempted to strike [src], but missed!" + else + attack_message = "[H] attempted to strike [src], but \he rolled out of the way!" + src.dir = pick(1, 2, 4, 8) miss_type = 1 else hit_zone = ran_zone(hit_zone) @@ -168,6 +161,17 @@ attack_message = "[H] went for [src]'s [affecting.display_name] but was blocked!" miss_type = 2 + // See what attack they use + var/datum/unarmed_attack/attack = null + for(var/datum/unarmed_attack/u_attack in H.species.unarmed) + if(!u_attack.is_usable(H, src, hit_zone)) + continue + else + attack = u_attack + break + if(!attack) + return 0 + if(!attack_message) attack.show_attack(H, src, hit_zone, damage) else diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index d9a0822f7bd..da26c606c35 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -207,7 +207,7 @@ name_plural = "Humans" language = "Sol Common" primitive = /mob/living/carbon/monkey - unarmed_type = list(/datum/unarmed_attack/punch, /datum/unarmed_attack/bite) + unarmed_type = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite) flags = HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR @@ -221,7 +221,7 @@ deform = 'icons/mob/human_races/r_def_lizard.dmi' language = "Sinta'unathi" tail = "sogtail" - unarmed_type = list(/datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) + unarmed_type = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) primitive = /mob/living/carbon/monkey/unathi darksight = 3 gluttonous = 1 @@ -248,7 +248,7 @@ deform = 'icons/mob/human_races/r_def_tajaran.dmi' language = "Siik'tajr" tail = "tajtail" - unarmed_type = list(/datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) + unarmed_type = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) darksight = 8 cold_level_1 = 200 //Default 260 @@ -290,7 +290,7 @@ deform = 'icons/mob/human_races/r_def_vox.dmi' default_language = "Vox-pidgin" language = "Galactic Common" - unarmed_type = list(/datum/unarmed_attack/claws/strong, /datum/unarmed_attack/bite/strong) + unarmed_type = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/strong, /datum/unarmed_attack/bite/strong) rarity_value = 2 speech_sounds = list('sound/voice/shriek1.ogg') @@ -377,7 +377,7 @@ icobase = 'icons/mob/human_races/r_diona.dmi' deform = 'icons/mob/human_races/r_def_plant.dmi' language = "Rootspeak" - unarmed_type = list(/datum/unarmed_attack/diona) + unarmed_type = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/diona) primitive = /mob/living/carbon/alien/diona slowdown = 7 rarity_value = 3 diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm index 45bd0a70d87..e644afdebb0 100644 --- a/code/modules/mob/living/carbon/human/unarmed_attack.dm +++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm @@ -9,7 +9,7 @@ var/sharp = 0 var/edge = 0 -/datum/unarmed_attack/proc/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/victim) +/datum/unarmed_attack/proc/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) if(user.restrained()) return 0 @@ -91,9 +91,11 @@ sharp = 1 edge = 1 -/datum/unarmed_attack/bite/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/victim) +/datum/unarmed_attack/bite/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) if (user.wear_mask && istype(user.wear_mask, /obj/item/clothing/mask/muzzle)) return 0 + if (zone == "head" || zone == "eyes" || zone == "mouth") + return 0 return 1 /datum/unarmed_attack/punch @@ -119,28 +121,89 @@ if(1 to 2) user.visible_message("[user] slapped [target] across \his cheek!") if(3 to 4) user.visible_message("[user] struck [target] in the head[pick("", " with a closed fist")]!") if(5) user.visible_message("[user] gave [target] a resounding slap to the face!") - if("chest", "l_arm", "r_arm", "l_hand", "r_hand") - // -- UPPER BODY -- // + if("chest", "l_arm", "r_arm", "l_hand", "r_hand", "groin", "l_leg", "r_let", "l_foot", "r_foot") + // ----- BODY ----- // switch(attack_damage) if(1 to 2) user.visible_message("[user] slapped [target]'s [organ]!") if(3 to 4) user.visible_message("[user] [pick(attack_verb)] [target] in \his [organ]!") if(5) user.visible_message("[user] slammed \his [pick(attack_noun)] into [target]'s [organ]!") - if("groin", "l_leg", "r_leg") - // -- LOWER BODY -- // - switch(attack_damage) - if(1 to 2) user.visible_message("[user] gave [target] a light kick to the [organ]!") - if(3 to 4) user.visible_message("[user] [pick("kicked", "kneed")] [target] in \his [organ]!") - if(5) user.visible_message("[user] landed a strong kick against [target]'s [organ]!") - if("l_foot", "r_foot") - // ----- FEET ----- // - switch(attack_damage) - if(1 to 4) user.visible_message("[user] kicked [target] in \his [organ]!") - if(5) user.visible_message("[user] stomped down hard on [target]'s [organ]!") - else if (user.loc != target.loc) - user.visible_message("[user] [pick("stomped down hard on", "kicked against", "gave a strong kick against", "slammed their foot into")] [target]'s [organ]!") else user.visible_message("[user] [pick("punched", "threw a punch", "struck", "slapped", "rammed their [pick(attack_noun)] into")] [target]'s [organ]!") +/datum/unarmed_attack/kick + attack_verb = list("kicked", "kneed") + attack_noun = list("kick") + attack_sound = "swing_hit" + damage = 1 + +/datum/unarmed_attack/kick/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) + if (target.legcuffed) + return 0 + + if(!(zone == "l_leg" || zone == "r_leg" || zone == "l_foot" || zone == "r_foot" || zone == "groin")) + return 0 + + var/datum/organ/external/E = user.organs_by_name["l_foot"] + if(E && !(E.status & ORGAN_DESTROYED)) + return 1 + + E = user.organs_by_name["r_foot"] + if(E && !(E.status & ORGAN_DESTROYED)) + return 1 + + return 0 + +/datum/unarmed_attack/kick/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) + var/datum/organ/external/affecting = target.get_organ(zone) + var/organ = affecting.display_name + + attack_damage = Clamp(attack_damage, 1, 5) + + switch(zone) + if("groin", "l_leg", "r_leg") + // -- LOWER BODY -- // + switch(attack_damage) + if(1 to 2) user.visible_message("[user] gave [target] a light [pick(attack_noun)] to the [organ]!") + if(3 to 4) user.visible_message("[user] [pick(attack_verb)] [target] in \his [organ]!") + if(5) user.visible_message("[user] landed a strong [pick(attack_noun)] against [target]'s [organ]!") + if("l_foot", "r_foot") + // ----- FEET ----- // + switch(attack_damage) + if(1 to 4) user.visible_message("[user] kicked [target] in \his [organ]!") + if(5) user.visible_message("[user] stomped down hard on [target]'s [organ]!") + +/datum/unarmed_attack/stomp + attack_verb = null + attack_noun = list("kick") + attack_sound = "swing_hit" + damage = 3 + +/datum/unarmed_attack/stomp/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone) + if (target.legcuffed) + return 0 + + if (target.lying && !user.lying) + var/datum/organ/external/E = user.organs_by_name["l_foot"] + if(E && !(E.status & ORGAN_DESTROYED)) + return 1 + + E = user.organs_by_name["r_foot"] + if(E && !(E.status & ORGAN_DESTROYED)) + return 1 + + return 0 + +/datum/unarmed_attack/stomp/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) + var/datum/organ/external/affecting = target.get_organ(zone) + var/organ = affecting.display_name + + attack_damage = Clamp(attack_damage, 1, 5) + + switch(attack_damage) + if(1 to 3) + user.visible_message("[user] [pick("gave a kick against", "kicked against", "stomped down on", "slammed their foot into")] [target]'s [organ]!") + if(4 to 5) + user.visible_message("[user] [pick("landed a strong kick against", "kicked against", "stomped down hard on", "rammed their foot into")] [target]'s [organ]!") /datum/unarmed_attack/diona attack_verb = list("lashed", "bludgeoned")