From 3dd20078aefe68f252bc385a1663f88abe5ca5a9 Mon Sep 17 00:00:00 2001 From: PKPenguin321 Date: Fri, 15 Apr 2016 17:32:05 -0700 Subject: [PATCH] big update removes all counter/blocking related code and the related sound effect makes krav maga use action buttons instead of verbs renamed quick choke to lung punch reduced stun time on leg sweep removed head elbow, removed the help button (obsoleted by tooltips) --- code/datums/martial.dm | 17 +- code/datums/martial/krav_maga.dm | 149 ++++++------------ .../mob/living/carbon/human/species.dm | 10 +- sound/effects/hit_block.ogg | Bin 10056 -> 0 bytes 4 files changed, 57 insertions(+), 119 deletions(-) delete mode 100644 sound/effects/hit_block.ogg diff --git a/code/datums/martial.dm b/code/datums/martial.dm index dae5cba6967..d69b28cd0b1 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -7,7 +7,6 @@ var/datum/martial_art/base = null // The permanent style var/deflection_chance = 0 //Chance to deflect projectiles var/help_verb = null - var/counter_prob = 0//probability to counter direct melee attacks /datum/martial_art/proc/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) return 0 @@ -18,9 +17,6 @@ /datum/martial_art/proc/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) return 0 -/datum/martial_art/proc/on_hit(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) - return 0 - /datum/martial_art/proc/add_to_streak(element,mob/living/carbon/human/D) if(D != current_target) current_target = D @@ -51,9 +47,7 @@ playsound(D.loc, A.dna.species.attack_sound, 25, 1, -1) D.visible_message("[A] has [atk_verb]ed [D]!", \ "[A] has [atk_verb]ed [D]!") - var/datum/martial_art/MA = D.martial_art - if(MA.on_hit(D,A))//they countered with something - return 1 + D.apply_damage(damage, BRUTE, affecting, armor_block) add_logs(A, D, "punched") @@ -116,9 +110,7 @@ var/armor_block = D.run_armor_check(affecting, "melee") playsound(D.loc, A.dna.species.attack_sound, 25, 1, -1) - var/datum/martial_art/MA = D.martial_art - if(MA.on_hit(D,A)) // they countered with something - return 1 + D.visible_message("[A] has hit [D] with a [atk_verb]!", \ "[A] has hit [D] with a [atk_verb]!") @@ -398,9 +390,6 @@ add_to_streak("H",D) if(check_streak(A,D)) return 1 - var/datum/martial_art/MA = D.martial_art - if(MA.on_hit(D,A)) // they countered with something - return 1 A.do_attack_animation(D) var/atk_verb = pick("punches", "kicks", "chops", "hits", "slams") D.visible_message("[A] [atk_verb] [D]!", \ @@ -587,4 +576,4 @@ /obj/item/weapon/twohanded/bostaff/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance) if(wielded) return ..() - return 0 + return 0 \ No newline at end of file diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index 2561961770b..3dc54dd3f15 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -1,57 +1,65 @@ /datum/martial_art/krav_maga name = "Krav Maga" - counter_prob = 25 + var/datum/action/neck_chop/neckchop = new/datum/action/neck_chop() + var/datum/action/leg_sweep/legsweep = new/datum/action/leg_sweep() + var/datum/action/lung_punch/lungpunch = new/datum/action/lung_punch() -/datum/martial_art/krav_maga/on_hit(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) - if(prob(counter_prob)) - if(prob(50)) - A.visible_message("[A] counters [D]'s hit!", \ - "You counter the hit!") - sleep(5) - playsound(get_turf(A), 'sound/effects/hit_block.ogg', 50, 1, -1) - D.apply_damage(10, BRUTE) - return 1 +/datum/action/neck_chop + name = "Neck Chop - Injures the neck, stopping the victim from speaking for a while." + button_icon_state = "neckchop" - else - A.visible_message("[A] blocks [D]'s hit!", \ - "You block the hit!") - playsound(get_turf(A), 'sound/effects/hit_block.ogg', 50, 1, -1) - return 1 - return 0 +/datum/action/neck_chop/Trigger() + owner << "Your next attack will be a Neck Chop." + owner.visible_message("[owner] assumes the Neck Chop stance!") + var/mob/living/carbon/human/H = owner + H.martial_art.streak = "neck_chop" +/datum/action/leg_sweep + name = "Leg Sweep - Trips the victim, rendering them prone and unable to move for a short time." + button_icon_state = "legsweep" + +/datum/action/leg_sweep/Trigger() + owner << "Your next attack will be a Leg Sweep." + owner.visible_message("[owner] assumes the Leg Sweep stance!") + var/mob/living/carbon/human/H = owner + H.martial_art.streak = "leg_sweep" + +/datum/action/lung_punch//referred to internally as 'quick choke' + name = "Lung Punch - Delivers a strong punch just above the victim's abdomen, constraining the lungs. The victim will be unable to breathe for a short time." + button_icon_state = "lungpunch" + +/datum/action/lung_punch/Trigger() + owner << "Your next attack will be a Lung Punch." + owner.visible_message("[owner] assumes the Lung Punch stance!") + var/mob/living/carbon/human/H = owner + H.martial_art.streak = "quick_choke"//internal name for lung punch /datum/martial_art/krav_maga/teach(var/mob/living/carbon/human/H,var/make_temporary=0) ..() H << "You know the arts of Krav Maga!" - H << "Recall your teachings using the Access Tutorial verb in the Krav Maga menu, in your verbs menu." - H.verbs += /mob/living/carbon/human/proc/krav_maga_help - H.verbs += /mob/living/carbon/human/proc/neck_chop - H.verbs += /mob/living/carbon/human/proc/head_elbow - H.verbs += /mob/living/carbon/human/proc/leg_sweep - H.verbs += /mob/living/carbon/human/proc/quick_choke + H << "Place your cursor over a move at the top of the screen to see what it does." + neckchop.Grant(H) + legsweep.Grant(H) + lungpunch.Grant(H) /datum/martial_art/krav_maga/remove(var/mob/living/carbon/human/H) ..() - H.verbs -= /mob/living/carbon/human/proc/krav_maga_help - H.verbs -= /mob/living/carbon/human/proc/neck_chop - H.verbs -= /mob/living/carbon/human/proc/head_elbow - H.verbs -= /mob/living/carbon/human/proc/leg_sweep - H.verbs -= /mob/living/carbon/human/proc/quick_choke + H << "You suddenly forget the arts of Krav Maga..." + neckchop.Remove(H) + legsweep.Remove(H) + lungpunch.Remove(H) + /datum/martial_art/krav_maga/proc/check_streak(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) switch(streak) if("neck_chop") streak = "" neck_chop(A,D) return 1 - if("head_elbow") - streak = "" - head_elbow(A,D) - return 1 if("leg_sweep") streak = "" leg_sweep(A,D) return 1 - if("quick_choke") + if("quick_choke")//is actually lung punch streak = "" quick_choke(A,D) return 1 @@ -64,27 +72,17 @@ "[A] leg sweeps you!") playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1) D.apply_damage(5, BRUTE) - D.Weaken(6) + D.Weaken(4)//originally was 6, lowered since you could kill somebody in one stun return 1 -/datum/martial_art/krav_maga/proc/quick_choke(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) - D.visible_message("[A] grabs and chokes [D]!", \ - "[A] grabs and chokes you!") +/datum/martial_art/krav_maga/proc/quick_choke(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)//is actually lung punch + D.visible_message("[A] pounds [D] on the chest!", \ + "[A] slams your chest! You can't breathe!") playsound(get_turf(A), 'sound/effects/hit_punch.ogg', 50, 1, -1) D.losebreath += 5 D.adjustOxyLoss(10) return 1 -/datum/martial_art/krav_maga/proc/head_elbow(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) - if(D.stat || D.weakened) - return 0 - D.visible_message("[A] elbows [D] in the face, stunning them!", \ - "[A] elbows you in the face, stunning you!") - playsound(get_turf(A), 'sound/effects/hit_punch.ogg', 50, 1, -1) - D.apply_damage(10, BRUTE) - D.Stun(3) - return 1 - /datum/martial_art/krav_maga/proc/neck_chop(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) D.visible_message("[A] karate chops [D]'s neck!", \ "[A] karate chops your neck, rendering you unable to speak for a short time!") @@ -103,25 +101,20 @@ datum/martial_art/krav_maga/grab_act(var/mob/living/carbon/human/A, var/mob/livi return 1 add_logs(A, D, "punched") A.do_attack_animation(D) - if(D.martial_art) - var/datum/martial_art/MA = D.martial_art - if(MA.on_hit(D,A)) // they countered with something - add_logs(A, D, "countered or blocked") - return 1 var/picked_hit_type = pick("punches", "kicks") - if(picked_hit_type == "kicks") + var/bonus_damage = 10 + if(D.weakened || D.resting || D.lying) + bonus_damage += 5 + picked_hit_type = "stomps on" + D.apply_damage(bonus_damage, BRUTE) + if(picked_hit_type == "kicks" || picked_hit_type == "stomps") playsound(get_turf(D), 'sound/effects/hit_kick.ogg', 50, 1, -1) else playsound(get_turf(D), 'sound/effects/hit_punch.ogg', 50, 1, -1) D.visible_message("[A] [picked_hit_type] [D]!", \ - "[A] hits you!") - var/bonus_damage = 10 - if(D.weakened) - bonus_damage += 5 - D.apply_damage(bonus_damage, BRUTE) + "[A] [picked_hit_type] you!") return 1 - /datum/martial_art/krav_maga/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) if(check_streak(A,D)) return 1 @@ -145,45 +138,7 @@ datum/martial_art/krav_maga/grab_act(var/mob/living/carbon/human/A, var/mob/livi playsound(D, 'sound/weapons/punchmiss.ogg', 25, 1, -1) return 1 -/mob/living/carbon/human/proc/krav_maga_help() - set name = "Access Tutorial" - set desc = "Access the Krav Maga tutorial." - set category = "Krav Maga" - - usr << "You recall your Krav Maga teachings..." - usr << "Leg Sweep: Performs a leg sweep, knocking down the target and making him vulnerable to attack." - usr << "Quick Choke: Grabs and chokes the target. Good for speeding up a kill" - usr << "Head Elbow: Elbows the opponent in the face, stunning them, leaving them vulnerable to attacks." - usr << "Neck Chop: Karate chops the opponent's neck, rendering them unable to speak for a short period of time." - usr << "Trigger your moves by activating them with the verb, and then clicking on an opponent with a hostile intent." - -/mob/living/carbon/human/proc/neck_chop() - set name = "Neck Chop" - set desc = "Sets your next move to the Neck Chop." - set category = "Krav Maga" - usr << "Your next attack will be a Neck Chop." - martial_art.streak = "neck_chop" - -/mob/living/carbon/human/proc/head_elbow() - set name = "Head Elbow" - set desc = "Sets your next move to the Head Elbow." - set category = "Krav Maga" - usr << "Your next attack will be a Head Elbow." - martial_art.streak = "head_elbow" - -/mob/living/carbon/human/proc/leg_sweep() - set name = "Leg Sweep" - set desc = "Sets your next move to the Leg Sweep." - set category = "Krav Maga" - usr << "Your next attack will be a Leg Sweep." - martial_art.streak = "leg_sweep" - -/mob/living/carbon/human/proc/quick_choke() - set name = "Quick Choke" - set desc = "Sets your next move to the Quick Choke." - set category = "Krav Maga" - usr << "Your next attack will be a Quick Choke." - martial_art.streak = "quick_choke" +//Krav Maga Gloves /obj/item/clothing/gloves/krav_maga desc = "These gloves can teach you to perform Krav Maga using nanochips." diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index f2bf4718c14..638a318f7f0 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -875,9 +875,7 @@ var/armor_block = H.run_armor_check(affecting, "melee") playsound(H.loc, M.dna.species.attack_sound, 25, 1, -1) - var/datum/martial_art/MA = H.martial_art - if(MA.on_hit(H,M)) // they countered with something - return + H.visible_message("[M] has [atk_verb]ed [H]!", \ "[M] has [atk_verb]ed [H]!") @@ -954,10 +952,7 @@ user.do_attack_animation(H) if(H.check_shields(I.force, "the [I.name]", I, MELEE_ATTACK, I.armour_penetration)) return 0 - var/datum/martial_art/MA = H.martial_art - if(MA.on_hit(H,user)) // they countered with something - add_logs(user, H, "countered or blocked") - return 0 + if(I.attack_verb && I.attack_verb.len) H.visible_message("[user] has [pick(I.attack_verb)] [H] in the [hit_area] with [I]!", \ "[user] has [pick(I.attack_verb)] [H] in the [hit_area] with [I]!") @@ -1394,4 +1389,3 @@ #undef COLD_GAS_DAMAGE_LEVEL_1 #undef COLD_GAS_DAMAGE_LEVEL_2 #undef COLD_GAS_DAMAGE_LEVEL_3 - diff --git a/sound/effects/hit_block.ogg b/sound/effects/hit_block.ogg deleted file mode 100644 index 74210e59b580e706995c900a9e6855eda0c34763..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10056 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