diff --git a/code/game/machinery/vendors/departmental_vendors.dm b/code/game/machinery/vendors/departmental_vendors.dm index 79ad7839a48..34265a6d650 100644 --- a/code/game/machinery/vendors/departmental_vendors.dm +++ b/code/game/machinery/vendors/departmental_vendors.dm @@ -218,7 +218,8 @@ /obj/item/storage/box/evidence = 6, /obj/item/flashlight/seclite = 4, /obj/item/restraints/legcuffs/bola/energy = 7, - /obj/item/clothing/mask/muzzle/safety = 4) + /obj/item/clothing/mask/muzzle/safety = 4, + /obj/item/judobelt = 3) contraband = list(/obj/item/clothing/glasses/sunglasses = 2, /obj/item/storage/fancy/donut_box = 2, /obj/item/hailer = 5) refill_canister = /obj/item/vending_refill/security prices = list(/obj/item/reagent_containers/food/snacks/donut = 40, diff --git a/code/game/objects/items/weapons/batons.dm b/code/game/objects/items/weapons/batons.dm index 995ff2eff86..99c93f82aa0 100644 --- a/code/game/objects/items/weapons/batons.dm +++ b/code/game/objects/items/weapons/batons.dm @@ -66,6 +66,9 @@ * * user - The attacking user */ /obj/item/melee/classic_baton/proc/baton_knockdown(mob/living/target, mob/living/user) + if(user.mind?.martial_art?.no_baton) + to_chat(user, user.mind.martial_art.no_baton_reason) + return if(issilicon(target)) user.visible_message("[user] pulses [target]'s sensors with [src]!",\ "You pulse [target]'s sensors with [src]!") diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 056aea8644e..ab5a5ba5349 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -165,7 +165,9 @@ user.visible_message("[user] accidentally hits [user.p_themselves()] with [src]!", "You accidentally hit yourself with [src]!") return - + if(user.mind?.martial_art?.no_baton) + to_chat(user, user.mind.martial_art.no_baton_reason) + return if(issilicon(M)) // Can't stunbaton borgs and AIs return ..() diff --git a/code/modules/martial_arts/combos/judo/armbar.dm b/code/modules/martial_arts/combos/judo/armbar.dm new file mode 100644 index 00000000000..79b31497ae4 --- /dev/null +++ b/code/modules/martial_arts/combos/judo/armbar.dm @@ -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("[user] puts [target] into an armbar!", \ + "[user] wrestles you into an armbar!") + 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 diff --git a/code/modules/martial_arts/combos/judo/discombobulate.dm b/code/modules/martial_arts/combos/judo/discombobulate.dm new file mode 100644 index 00000000000..1b11efedb41 --- /dev/null +++ b/code/modules/martial_arts/combos/judo/discombobulate.dm @@ -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("[user] strikes [target] in the head with [user.p_their()] palm!", \ + "[user] strikes you with [user.p_their()] palm!") + 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 diff --git a/code/modules/martial_arts/combos/judo/eyepoke.dm b/code/modules/martial_arts/combos/judo/eyepoke.dm new file mode 100644 index 00000000000..d495e5af391 --- /dev/null +++ b/code/modules/martial_arts/combos/judo/eyepoke.dm @@ -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("[user] jabs [target] in [user.p_their()] eyes!", \ + "[user] jabs you in the eyes!") + 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 diff --git a/code/modules/martial_arts/combos/judo/judothrow.dm b/code/modules/martial_arts/combos/judo/judothrow.dm new file mode 100644 index 00000000000..4939dead2e6 --- /dev/null +++ b/code/modules/martial_arts/combos/judo/judothrow.dm @@ -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("[user] judo throws [target] to ground!", \ + "[user] judo throws you to the ground!") + 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 diff --git a/code/modules/martial_arts/combos/judo/wheelthrow.dm b/code/modules/martial_arts/combos/judo/wheelthrow.dm new file mode 100644 index 00000000000..6759093d136 --- /dev/null +++ b/code/modules/martial_arts/combos/judo/wheelthrow.dm @@ -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("[user] raises [target] over [user.p_their()] shoulder, and slams [target.p_them()] into the ground!", \ + "[user] throws you over [user.p_their()] shoulder, slamming you into the ground!") + 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 diff --git a/code/modules/martial_arts/judo.dm b/code/modules/martial_arts/judo.dm new file mode 100644 index 00000000000..a1b49e86d8c --- /dev/null +++ b/code/modules/martial_arts/judo.dm @@ -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 = "The baton feels off balance in your hand due to your judo training!" + +//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, "The arts of Corporate Judo echo uselessly in your head, the thought of violence disgusts you!") + return + style.teach(H, 1) + to_chat(H, "The belt's nanites infuse you with the prowess of a black belt in Corporate Judo!") + to_chat(H, "See the martial arts tab for an explanation of combos.") + 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, "You suddenly forget the arts of Corporate Judo...") + +//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("[A] [picked_hit_type] [D]!", \ + "[A] [picked_hit_type] you!") + add_attack_logs(A, D, "Melee attacked with [src]") + return TRUE + +/datum/martial_art/judo/explaination_header(user) + to_chat(user, "You recall the teachings of Corporate Judo.") + +/datum/martial_art/cqc/explaination_footer(user) + to_chat(user, "Your unarmed strikes hit about twice as hard as your peers, on average.") diff --git a/code/modules/martial_arts/martial.dm b/code/modules/martial_arts/martial.dm index a34f829b3ea..b23a82911e2 100644 --- a/code/modules/martial_arts/martial.dm +++ b/code/modules/martial_arts/martial.dm @@ -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() . = ..() diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi index b6af4c1de23..6d2180025c0 100644 Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ diff --git a/icons/mob/inhands/equipment/belt_lefthand.dmi b/icons/mob/inhands/equipment/belt_lefthand.dmi index febcdb854b8..8dd98192add 100644 Binary files a/icons/mob/inhands/equipment/belt_lefthand.dmi and b/icons/mob/inhands/equipment/belt_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/belt_righthand.dmi b/icons/mob/inhands/equipment/belt_righthand.dmi index d7b394cc09b..bd71f1aea62 100644 Binary files a/icons/mob/inhands/equipment/belt_righthand.dmi and b/icons/mob/inhands/equipment/belt_righthand.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index df3e2f292c7..6cfabb86554 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/paradise.dme b/paradise.dme index 26bb79cc001..cd256b5044f 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1843,6 +1843,7 @@ #include "code\modules\martial_arts\plasma_fist.dm" #include "code\modules\martial_arts\sleeping_carp.dm" #include "code\modules\martial_arts\wrestling.dm" +#include "code\modules\martial_arts\judo.dm" #include "code\modules\martial_arts\combos\martial_combo.dm" #include "code\modules\martial_arts\combos\adminfu\healing_palm.dm" #include "code\modules\martial_arts\combos\cqc\consecutive.dm" @@ -1862,6 +1863,11 @@ #include "code\modules\martial_arts\combos\sleeping_carp\crashing_kick.dm" #include "code\modules\martial_arts\combos\sleeping_carp\gnashing_teeth.dm" #include "code\modules\martial_arts\combos\sleeping_carp\keelhaul.dm" +#include "code\modules\martial_arts\combos\judo\discombobulate.dm" +#include "code\modules\martial_arts\combos\judo\eyepoke.dm" +#include "code\modules\martial_arts\combos\judo\judothrow.dm" +#include "code\modules\martial_arts\combos\judo\armbar.dm" +#include "code\modules\martial_arts\combos\judo\wheelthrow.dm" #include "code\modules\maze_generation\maze_generator.dm" #include "code\modules\maze_generation\maze_generator_blockwise.dm" #include "code\modules\maze_generation\maze_helper_atoms.dm"