Adds Corporate Judo, an optional alternative to the stun baton (deconflicted edition) (#21229)

* Adds Judo, Judo belt, and increased harm damage

* Judo users can no longer use batons (any type)

* Adds Discombobulate combo

* adds Eye-poke combo

* copy-paste related error fixes

* adds throw (knockdown) combo

* adds Armbar and Fatailty Combos

* assorted changes (spelling, args, unneeded checks)

* minor changes to belt item

* updated desc, fixes belt item pathing

* adds 3 belts to secvend

* Adds sprites courtsey AVeryReulctantSpider

* Assorted code cleanup (thx Henri)

* minor grammatical issues

* Adds Judo, Judo belt, and increased harm damage

* Judo users can no longer use batons (any type)

* Adds Discombobulate combo

* adds Eye-poke combo

* copy-paste related error fixes

* adds throw (knockdown) combo

* adds Armbar and Fatailty Combos

* assorted changes (spelling, args, unneeded checks)

* minor changes to belt item

* updated desc, fixes belt item pathing

* adds 3 belts to secvend

* Adds sprites courtsey AVeryReulctantSpider

* Assorted code cleanup (thx Henri)

* minor grammatical issues

* junk commit to re-open PR

* pronoun consistancy

* Lewc review #1

* de-jankification, buffs eye poke

* Reduces harm intent damage from 10 to 7

* descriptions

* lewc name change

* weight class is now bulky

* wheel throw fix, discombob buff (slight)

* Throw buff (Grab > disarm)

* partial lewcc review

* assorted reviews (HIIYAA edition)

* Eyepoke, discombobulate can be done on the ground

* hal second pass review

---------

Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
This commit is contained in:
Silverplate
2023-07-30 13:08:16 -04:00
committed by GitHub
parent e862b01124
commit 9186b7d421
15 changed files with 162 additions and 2 deletions
@@ -0,0 +1,17 @@
/datum/martial_combo/judo/armbar
name = "Armbar"
steps = list(MARTIAL_COMBO_STEP_DISARM, MARTIAL_COMBO_STEP_DISARM, MARTIAL_COMBO_STEP_GRAB)
explaination_text = "place an opponent who has been knocked down into an armbar, immobilizing them"
combo_text_override = "Disarm, disarm, grab"
/datum/martial_combo/judo/armbar/perform_combo(mob/living/carbon/human/user, mob/living/target, datum/martial_art/MA)
if(!IS_HORIZONTAL(target) || user.IsKnockedDown())
return MARTIAL_COMBO_FAIL
target.visible_message("<span class='warning'>[user] puts [target] into an armbar!</span>", \
"<span class='userdanger'>[user] wrestles you into an armbar!</span>")
playsound(get_turf(user), 'sound/weapons/slashmiss.ogg', 40, TRUE, -1)
target.apply_damage(45, STAMINA)
target.Immobilize(5 SECONDS)
target.KnockDown(5 SECONDS)
add_attack_logs(user, target, "Melee attacked with martial-art [src] : Armbar", ATKLOG_ALL)
return MARTIAL_COMBO_DONE
@@ -0,0 +1,14 @@
/datum/martial_combo/judo/discombobulate
name = "Discombobulate"
steps = list(MARTIAL_COMBO_STEP_DISARM, MARTIAL_COMBO_STEP_GRAB)
explaination_text = "Deliver a palm strike to your opponents ear, briefly confusing them"
combo_text_override = "Disarm, Grab"
/datum/martial_combo/judo/discombobulate/perform_combo(mob/living/carbon/human/user, mob/living/target, datum/martial_art/MA)
target.visible_message("<span class='warning'>[user] strikes [target] in the head with [user.p_their()] palm!</span>", \
"<span class='userdanger'>[user] strikes you with [user.p_their()] palm!</span>")
playsound(get_turf(user), 'sound/weapons/slap.ogg', 40, TRUE, -1)
target.apply_damage(10, STAMINA)
target.AdjustConfused(5 SECONDS)
add_attack_logs(user, target, "Melee attacked with martial-art [src] : Discombobulate", ATKLOG_ALL)
return MARTIAL_COMBO_DONE
@@ -0,0 +1,15 @@
/datum/martial_combo/judo/eyepoke
name = "Eye Poke"
steps = list(MARTIAL_COMBO_STEP_DISARM, MARTIAL_COMBO_STEP_HARM)
explaination_text = "Jab your opponent in the eye, damaging and blinding them breifly. Opponents with eye protection are still affected."
combo_text_override = "Disarm, Harm"
/datum/martial_combo/judo/eyepoke/perform_combo(mob/living/carbon/human/user, mob/living/target, datum/martial_art/MA)
target.visible_message("<span class='warning'>[user] jabs [target] in [user.p_their()] eyes!</span>", \
"<span class='userdanger'>[user] jabs you in the eyes!</span>")
playsound(get_turf(user), 'sound/weapons/whip.ogg', 40, TRUE, -1)
target.apply_damage(10, BRUTE)
target.AdjustEyeBlurry(50, 0, 30 SECONDS)
target.EyeBlind(2 SECONDS)
add_attack_logs(user, target, "Melee attacked with martial-art [src] : Eye Poke", ATKLOG_ALL)
return MARTIAL_COMBO_DONE
@@ -0,0 +1,15 @@
/datum/martial_combo/judo/judothrow
name = "Throw"
steps = list(MARTIAL_COMBO_STEP_GRAB, MARTIAL_COMBO_STEP_DISARM)
explaination_text = "Establish a gripset on your opponent and throw them to the floor, inflicting stamina damage"
combo_text_override = "Grab, Disarm"
/datum/martial_combo/judo/judothrow/perform_combo(mob/living/carbon/human/user, mob/living/target, datum/martial_art/MA)
if(user.IsKnockedDown() || IS_HORIZONTAL(target))
return MARTIAL_COMBO_FAIL
target.visible_message("<span class='warning'>[user] judo throws [target] to ground!</span>", \
"<span class='userdanger'>[user] judo throws you to the ground!</span>")
playsound(get_turf(user), 'sound/weapons/slam.ogg', 40, TRUE, -1)
target.apply_damage(25, STAMINA)
target.KnockDown(7 SECONDS)
add_attack_logs(user, target, "Melee attacked with martial-art [src] : Judo Throw", ATKLOG_ALL)
return MARTIAL_COMBO_DONE
@@ -0,0 +1,18 @@
/datum/martial_combo/judo/wheelthrow
name = "Wheel Throw"
steps = list(MARTIAL_COMBO_STEP_GRAB, MARTIAL_COMBO_STEP_DISARM, MARTIAL_COMBO_STEP_HARM)
explaination_text = "From an armbar, flip your opponent over your shoulder, slamming them onto the floor, leaving them stunned."
combo_text_override = "Grab, Disarm, Harm"
/datum/martial_combo/judo/wheelthrow/perform_combo(mob/living/carbon/human/user, mob/living/target, datum/martial_art/MA)
if(!IS_HORIZONTAL(target) || !target.IsImmobilized())
return MARTIAL_COMBO_FAIL
target.visible_message("<span class='warning'>[user] raises [target] over [user.p_their()] shoulder, and slams [target.p_them()] into the ground!</span>", \
"<span class='userdanger'>[user] throws you over [user.p_their()] shoulder, slamming you into the ground!</span>")
playsound(get_turf(user), 'sound/magic/tail_swing.ogg', 40, TRUE, -1)
target.SpinAnimation(10, 1)
target.apply_damage(200, STAMINA)
target.KnockDown(15 SECONDS)
target.SetConfused(10 SECONDS)
add_attack_logs(user, target, "Melee attacked with martial-art [src] : Wheel Throw", ATKLOG_ALL)
return MARTIAL_COMBO_DONE
+65
View File
@@ -0,0 +1,65 @@
/datum/martial_art/judo
name = "Corporate Judo"
has_explaination_verb = TRUE
no_baton = TRUE
combos = list(/datum/martial_combo/judo/discombobulate, /datum/martial_combo/judo/eyepoke, /datum/martial_combo/judo/judothrow, /datum/martial_combo/judo/armbar, /datum/martial_combo/judo/wheelthrow)
weight = 5 //takes priority over boxing and drunkneness, less priority than krav or CQC/carp
no_baton_reason = "<span class='warning'>The baton feels off balance in your hand due to your judo training!</span>"
//Corporate Judo Belt
/obj/item/judobelt
name = "\improper Corporate Judo Belt"
desc = "Teaches the wearer NT Corporate Judo."
icon = 'icons/obj/clothing/belts.dmi'
lefthand_file = 'icons/mob/inhands/equipment/belt_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/belt_righthand.dmi'
icon_state = "judobelt"
item_state = "judo"
slot_flags = SLOT_BELT
w_class = WEIGHT_CLASS_BULKY
var/datum/martial_art/judo/style
/obj/item/judobelt/Initialize()
. = ..()
style = new()
/obj/item/judobelt/equipped(mob/user, slot)
if(!ishuman(user))
return
if(slot == slot_belt)
var/mob/living/carbon/human/H = user
if(HAS_TRAIT(user, TRAIT_PACIFISM))
to_chat(H, "<span class='warning'>The arts of Corporate Judo echo uselessly in your head, the thought of violence disgusts you!</span>")
return
style.teach(H, 1)
to_chat(H, "<span class='userdanger'>The belt's nanites infuse you with the prowess of a black belt in Corporate Judo!</span>")
to_chat(H, "<span class='danger'>See the martial arts tab for an explanation of combos.</span>")
return
/obj/item/judobelt/dropped(mob/user)
..()
if(!ishuman(user))
return
var/mob/living/carbon/human/H = user
if(H.get_item_by_slot(slot_belt) == src)
style.remove(H)
to_chat(user, "<span class='sciradio'>You suddenly forget the arts of Corporate Judo...</span>")
//Increased harm damage
/datum/martial_art/judo/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
MARTIAL_ARTS_ACT_CHECK
var/picked_hit_type = pick("chops", "slices", "strikes")
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
D.apply_damage(7, BRUTE)
playsound(get_turf(D), 'sound/effects/hit_punch.ogg', 50, TRUE, -1)
D.visible_message("<span class='danger'>[A] [picked_hit_type] [D]!</span>", \
"<span class='userdanger'>[A] [picked_hit_type] you!</span>")
add_attack_logs(A, D, "Melee attacked with [src]")
return TRUE
/datum/martial_art/judo/explaination_header(user)
to_chat(user, "<b><i>You recall the teachings of Corporate Judo.</i></b>")
/datum/martial_art/cqc/explaination_footer(user)
to_chat(user, "<b>Your unarmed strikes hit about twice as hard as your peers, on average.</b>")
+4
View File
@@ -33,8 +33,12 @@
var/in_stance = FALSE
/// If the martial art allows parrying.
var/can_parry = FALSE
/// Set to TRUE to prevent users of this style from using stun batons (and stunprods)
var/no_baton = FALSE
/// The priority of which martial art is picked from all the ones someone knows, the higher the number, the higher the priority.
var/weight = 0
/// Message displayed when someone uses a baton when its forbidden by a martial art
var/no_baton_reason = "Your martial arts training prevents you from wielding batons."
/datum/martial_art/New()
. = ..()