Krav Maga > Kaza Ruk: Tail sweep criminals (#93773)

This commit is contained in:
necromanceranne
2025-11-05 11:41:41 +11:00
committed by GitHub
parent 3170b5ad06
commit 0234874f65
10 changed files with 161 additions and 117 deletions

View File

@@ -152,7 +152,7 @@
/area/awaymission/caves/bmp_asteroid/level_four)
"ba" = (
/obj/structure/table/wood/fancy,
/obj/item/clothing/gloves/krav_maga/combatglovesplus,
/obj/item/clothing/gloves/kaza_ruk/combatglovesplus,
/turf/open/floor/engine/cult,
/area/awaymission/caves/bmp_asteroid/level_four)
"bf" = (

View File

@@ -4,7 +4,7 @@
#define MARTIALART_CQC "CQC"
#define MARTIALART_EVIL_BOXING "evil boxing"
#define MARTIALART_HUNTER_BOXING "hunter boxing"
#define MARTIALART_KRAVMAGA "krav maga"
#define MARTIALART_KAZA_RUK "Kaza Ruk"
#define MARTIALART_MUSHPUNCH "mushroom punch"
#define MARTIALART_PLASMAFIST "plasma fist"
#define MARTIALART_PSYCHOBRAWL "psychotic brawling"

View File

@@ -1,19 +1,29 @@
/datum/martial_art/krav_maga
name = "Krav Maga"
id = MARTIALART_KRAVMAGA
/datum/martial_art/kaza_ruk
name = "Kaza Ruk"
id = MARTIALART_KAZA_RUK
grab_damage_modifier = 5
grab_escape_chance_modifier = -10
VAR_PRIVATE/datum/action/neck_chop/neckchop
VAR_PRIVATE/datum/action/leg_sweep/legsweep
VAR_PRIVATE/datum/action/low_sweep/lowsweep
VAR_PRIVATE/datum/action/lung_punch/lungpunch
/datum/martial_art/krav_maga/New()
/datum/martial_art/kaza_ruk/activate_style(mob/living/new_holder)
. = ..()
RegisterSignal(new_holder, COMSIG_HUMAN_PUNCHED, PROC_REF(blow_followup))
/datum/martial_art/kaza_ruk/deactivate_style(mob/living/old_holder)
. = ..()
UnregisterSignal(old_holder, COMSIG_HUMAN_PUNCHED)
/datum/martial_art/kaza_ruk/New()
. = ..()
neckchop = new(src)
legsweep = new(src)
lowsweep = new(src)
lungpunch = new(src)
/datum/martial_art/krav_maga/Destroy()
/datum/martial_art/kaza_ruk/Destroy()
neckchop = null
legsweep = null
lowsweep = null
lungpunch = null
return ..()
@@ -36,24 +46,24 @@
owner.visible_message(span_danger("[owner] assumes the Neck Chop stance!"), "<b><i>Your next attack will be a Neck Chop.</i></b>")
source.streak = "neck_chop"
/datum/action/leg_sweep
name = "Leg Sweep"
/datum/action/low_sweep
name = "Low Sweep"
desc = "Trips the victim, knocking them down for a brief moment."
button_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "legsweep"
check_flags = AB_CHECK_INCAPACITATED|AB_CHECK_HANDS_BLOCKED|AB_CHECK_CONSCIOUS
/datum/action/leg_sweep/Trigger(mob/clicker, trigger_flags)
/datum/action/low_sweep/Trigger(mob/clicker, trigger_flags)
. = ..()
if(!.)
return
var/datum/martial_art/source = target
if (source.streak == "leg_sweep")
if (source.streak == "low_sweep")
owner.visible_message(span_danger("[owner] assumes a neutral stance."), "<b><i>Your next attack is cleared.</i></b>")
source.streak = ""
else
owner.visible_message(span_danger("[owner] assumes the Leg Sweep stance!"), "<b><i>Your next attack will be a Leg Sweep.</i></b>")
source.streak = "leg_sweep"
owner.visible_message(span_danger("[owner] assumes the Low Sweep stance!"), "<b><i>Your next attack will be a Low Sweep.</i></b>")
source.streak = "low_sweep"
/datum/action/lung_punch//referred to internally as 'quick choke'
name = "Lung Punch"
@@ -74,30 +84,30 @@
owner.visible_message(span_danger("[owner] assumes the Lung Punch stance!"), "<b><i>Your next attack will be a Lung Punch.</i></b>")
source.streak = "quick_choke"//internal name for lung punch
/datum/martial_art/krav_maga/activate_style(mob/living/new_holder)
/datum/martial_art/kaza_ruk/activate_style(mob/living/new_holder)
. = ..()
to_chat(new_holder, span_userdanger("You know the arts of [name]!"))
to_chat(new_holder, span_danger("Place your cursor over a move at the top of the screen to see what it does."))
neckchop.Grant(new_holder)
legsweep.Grant(new_holder)
lowsweep.Grant(new_holder)
lungpunch.Grant(new_holder)
/datum/martial_art/krav_maga/deactivate_style(mob/living/remove_from)
/datum/martial_art/kaza_ruk/deactivate_style(mob/living/remove_from)
to_chat(remove_from, span_userdanger("You suddenly forget the arts of [name]..."))
neckchop?.Remove(remove_from)
legsweep?.Remove(remove_from)
lowsweep?.Remove(remove_from)
lungpunch?.Remove(remove_from)
return ..()
/datum/martial_art/krav_maga/proc/check_streak(mob/living/attacker, mob/living/defender)
/datum/martial_art/kaza_ruk/proc/check_streak(mob/living/attacker, mob/living/defender)
switch(streak)
if("neck_chop")
streak = ""
neck_chop(attacker, defender)
return TRUE
if("leg_sweep")
if("low_sweep")
streak = ""
leg_sweep(attacker, defender)
low_sweep(attacker, defender)
return TRUE
if("quick_choke")//is actually lung punch
streak = ""
@@ -105,26 +115,40 @@
return TRUE
return FALSE
/datum/martial_art/krav_maga/proc/leg_sweep(mob/living/attacker, mob/living/defender)
/datum/martial_art/kaza_ruk/proc/low_sweep(mob/living/attacker, mob/living/defender)
if(defender.stat != CONSCIOUS || defender.IsParalyzed())
return MARTIAL_ATTACK_INVALID
if(HAS_TRAIT(attacker, TRAIT_PACIFISM))
return MARTIAL_ATTACK_INVALID // Does 5 damage, so we can't let pacifists leg sweep.
var/tail_sweeping = FALSE
var/sweeping_language = "leg"
if(ishuman(attacker))
var/mob/living/carbon/possible_human = attacker
var/obj/item/organ/tail/lizard/possible_lizard_tail = possible_human.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
if(possible_lizard_tail)
tail_sweeping = TRUE
sweeping_language = "tail"
defender.visible_message(
span_warning("[attacker] leg sweeps [defender]!"),
span_warning("[attacker] [sweeping_language] sweeps [defender]!"),
span_userdanger("Your legs are sweeped by [attacker]!"),
span_hear("You hear a sickening sound of flesh hitting flesh!"),
null,
attacker,
)
to_chat(attacker, span_danger("You leg sweep [defender]!"))
to_chat(attacker, span_danger("You [sweeping_language] sweep [defender]!"))
playsound(attacker, 'sound/effects/hit_kick.ogg', 50, TRUE, -1)
if(tail_sweeping)
attacker.emote("spin")
defender.apply_damage(5, BRUTE, BODY_ZONE_CHEST)
defender.Knockdown(6 SECONDS)
log_combat(attacker, defender, "leg sweeped")
return MARTIAL_ATTACK_SUCCESS
/datum/martial_art/krav_maga/proc/quick_choke(mob/living/attacker, mob/living/defender)//is actually lung punch
/datum/martial_art/kaza_ruk/proc/quick_choke(mob/living/attacker, mob/living/defender)//is actually lung punch
attacker.do_attack_animation(defender)
defender.visible_message(
span_warning("[attacker] pounds [defender] on the chest!"),
@@ -141,7 +165,7 @@
log_combat(attacker, defender, "quickchoked")
return MARTIAL_ATTACK_SUCCESS
/datum/martial_art/krav_maga/proc/neck_chop(mob/living/attacker, mob/living/defender)
/datum/martial_art/kaza_ruk/proc/neck_chop(mob/living/attacker, mob/living/defender)
if(HAS_TRAIT(attacker, TRAIT_PACIFISM))
return MARTIAL_ATTACK_INVALID // Does 10 damage, so we can't let pacifists neck chop.
attacker.do_attack_animation(defender)
@@ -159,39 +183,16 @@
log_combat(attacker, defender, "neck chopped")
return MARTIAL_ATTACK_SUCCESS
/datum/martial_art/krav_maga/harm_act(mob/living/attacker, mob/living/defender)
var/picked_hit_type = pick("punch", "kick")
var/bonus_damage = 0
if(defender.body_position == LYING_DOWN)
bonus_damage += 5
picked_hit_type = "stomp"
if(defender.check_block(attacker, 10 + bonus_damage, "[attacker]'s [picked_hit_type]", UNARMED_ATTACK))
/datum/martial_art/kaza_ruk/harm_act(mob/living/attacker, mob/living/defender)
if(defender.check_block(attacker, 10, attacker.name, UNARMED_ATTACK))
return MARTIAL_ATTACK_FAIL
if(check_streak(attacker, defender))
return MARTIAL_ATTACK_SUCCESS
log_combat(attacker, defender, "[picked_hit_type]ed")
var/obj/item/bodypart/affecting = defender.get_bodypart(defender.get_random_valid_zone(attacker.zone_selected))
defender.apply_damage(10 + bonus_damage, attacker.get_attack_type(), affecting)
if(picked_hit_type == "kick" || picked_hit_type == "stomp")
attacker.do_attack_animation(defender, ATTACK_EFFECT_KICK)
playsound(defender, 'sound/effects/hit_kick.ogg', 50, TRUE, -1)
else
attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH)
playsound(defender, 'sound/effects/hit_punch.ogg', 50, TRUE, -1)
defender.visible_message(
span_danger("[attacker] [picked_hit_type]s [defender]!"),
span_userdanger("You're [picked_hit_type]ed by [attacker]!"),
span_hear("You hear a sickening sound of flesh hitting flesh!"),
COMBAT_MESSAGE_RANGE,
attacker,
)
to_chat(attacker, span_danger("You [picked_hit_type] [defender]!"))
log_combat(attacker, defender, "[picked_hit_type] with [name]")
return MARTIAL_ATTACK_SUCCESS
return MARTIAL_ATTACK_INVALID
/datum/martial_art/krav_maga/disarm_act(mob/living/attacker, mob/living/defender)
/datum/martial_art/kaza_ruk/disarm_act(mob/living/attacker, mob/living/defender)
if(defender.check_block(attacker, 0, attacker.name, UNARMED_ATTACK))
return MARTIAL_ATTACK_FAIL
if(check_streak(attacker, defender))
@@ -208,22 +209,65 @@
)
to_chat(attacker, span_danger("You disarm [defender]!"))
playsound(defender, 'sound/items/weapons/thudswoosh.ogg', 50, TRUE, -1)
log_combat(attacker, defender, "disarmed (Krav Maga)", addition = "(disarmed of [stuff_in_hand])")
log_combat(attacker, defender, "disarmed (Kaza Ruk)", addition = "(disarmed of [stuff_in_hand])")
return MARTIAL_ATTACK_INVALID // normal shove
//Krav Maga Gloves
/// First, determine if we're going to execute our followup attack
/obj/item/clothing/gloves/krav_maga
abstract_type = /obj/item/clothing/gloves/krav_maga
/datum/martial_art/kaza_ruk/proc/blow_followup(mob/living/source, mob/living/target, damage, attack_type, obj/item/bodypart/affecting, final_armor_block, kicking, limb_sharpness)
SIGNAL_HANDLER
if(!prob(50))
return
addtimer(CALLBACK(src, PROC_REF(execute_followup), source, target, damage, attack_type, affecting, final_armor_block, kicking, limb_sharpness), 0.25 SECONDS)
/// After our delay, do the followup.
/datum/martial_art/kaza_ruk/proc/execute_followup(mob/living/source, mob/living/target, damage, attack_type, obj/item/bodypart/affecting, final_armor_block, kicking, limb_sharpness)
if(QDELETED(source) || QDELETED(target))
return
if(!source.Adjacent(target))
return
var/tail_usage = FALSE
var/kick_language = "an axe kick"
var/strike_language = "an elbow strike"
if(ishuman(source))
var/mob/living/carbon/possible_human = source
var/obj/item/organ/tail/lizard/possible_lizard_tail = possible_human.get_organ_slot(ORGAN_SLOT_EXTERNAL_TAIL)
if(possible_lizard_tail)
tail_usage = TRUE
kick_language = "a helmsplitter tail strike"
strike_language = "a whiplash tail spin"
source.visible_message(
span_warning("[source] follows up with [kicking ? kick_language : strike_language] against [target]!"),
span_notice("You deliver [kicking ? kick_language : strike_language] against [target]!"),
span_hear("You hear a sickening sound of flesh hitting flesh!"),
)
if(tail_usage)
source.emote(kicking ? "flip" : "spin")
playsound(source, 'sound/effects/hit_punch.ogg', 50, TRUE, -1)
source.do_attack_animation(target, ATTACK_EFFECT_KICK)
target.apply_damage(round(damage/3,1), attack_type, affecting, final_armor_block, wound_bonus = damage) //Ostensibly, apply a third of our damage again // We're not being too fussy about limb bonuses for this
log_combat(source, target, "auto-followup strike (Kaza Ruk)")
//Kaza Ruk Gloves
/obj/item/clothing/gloves/kaza_ruk
abstract_type = /obj/item/clothing/gloves/kaza_ruk
clothing_traits = list(TRAIT_FAST_CUFFING)
/obj/item/clothing/gloves/krav_maga/Initialize(mapload)
/obj/item/clothing/gloves/kaza_ruk/Initialize(mapload)
. = ..()
AddComponent(/datum/component/martial_art_giver, /datum/martial_art/krav_maga)
AddComponent(/datum/component/martial_art_giver, /datum/martial_art/kaza_ruk)
/obj/item/clothing/gloves/krav_maga/sec//more obviously named, given to sec
name = "krav maga gloves"
desc = "These gloves can teach you to perform Krav Maga using nanochips."
/obj/item/clothing/gloves/kaza_ruk/sec//more obviously named, given to sec
name = "kaza ruk gloves"
desc = "These gloves seem to guide you through a non-lizardperson friendly variant of the Tiziran martial art, Kaza Ruk. \
You're not entirely sure how they do that. Probably nanites."
icon_state = "fightgloves"
greyscale_colors = "#c41e0d"
cold_protection = HANDS
@@ -232,9 +276,9 @@
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
resistance_flags = NONE
/obj/item/clothing/gloves/krav_maga/combatglovesplus
/obj/item/clothing/gloves/kaza_ruk/combatglovesplus
name = "combat gloves plus"
desc = "These tactical gloves are fireproof and electrically insulated, and through the use of nanochip technology will teach you the martial art of krav maga."
desc = "These tactical gloves are fireproof and electrically insulated. These gloves seem to guide you through a non-lizardperson friendly variant of the Tiziran martial art, Kaza Ruk."
icon_state = "black"
greyscale_colors = "#2f2e31"
siemens_coefficient = 0
@@ -244,9 +288,9 @@
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
resistance_flags = NONE
armor_type = /datum/armor/krav_maga_combatglovesplus
armor_type = /datum/armor/kaza_ruk_combatglovesplus
/datum/armor/krav_maga_combatglovesplus
/datum/armor/kaza_ruk_combatglovesplus
bio = 90
fire = 80
acid = 50

View File

@@ -0,0 +1,41 @@
/obj/item/implant/kaza_ruk
name = "kaza ruk implant"
desc = "Teaches you the Tiziran martial arts of Kaza Ruk in 5 short instructional videos beamed directly into your eyeballs."
icon = 'icons/obj/scrolls.dmi'
icon_state ="scroll2"
/// The martial art style this implant teaches.
var/datum/martial_art/kaza_ruk/style
/obj/item/implant/kaza_ruk/get_data()
var/dat = {"<b>Implant Specifications:</b><BR>
<b>Name:</b> Kaza Ruk Implant<BR>
<b>Life:</b> 4 hours after death of host<BR>
<b>Implant Details:</b> <BR>
<b>Function:</b> Teaches even the clumsiest host the arts of Kaza Ruk."}
return dat
/obj/item/implant/kaza_ruk/Initialize(mapload)
. = ..()
style = new(src)
/obj/item/implant/kaza_ruk/Destroy()
QDEL_NULL(style)
return ..()
/obj/item/implant/kaza_ruk/activate()
. = ..()
if(isnull(imp_in.mind))
return
if(style.unlearn(imp_in))
return
style.teach(imp_in)
/obj/item/implanter/kaza_ruk
name = "implanter (kaza ruk)"
imp_type = /obj/item/implant/kaza_ruk
/obj/item/implantcase/kaza_ruk
name = "implant case - 'Kaza Ruk'"
desc = "A glass case containing an implant that can teach the user the Tiziran martial arts of Kaza Ruk."
imp_type = /obj/item/implant/kaza_ruk

View File

@@ -1,41 +0,0 @@
/obj/item/implant/krav_maga
name = "krav maga implant"
desc = "Teaches you the arts of Krav Maga in 5 short instructional videos beamed directly into your eyeballs."
icon = 'icons/obj/scrolls.dmi'
icon_state ="scroll2"
/// The martial art style this implant teaches.
var/datum/martial_art/krav_maga/style
/obj/item/implant/krav_maga/get_data()
var/dat = {"<b>Implant Specifications:</b><BR>
<b>Name:</b> Krav Maga Implant<BR>
<b>Life:</b> 4 hours after death of host<BR>
<b>Implant Details:</b> <BR>
<b>Function:</b> Teaches even the clumsiest host the arts of Krav Maga."}
return dat
/obj/item/implant/krav_maga/Initialize(mapload)
. = ..()
style = new(src)
/obj/item/implant/krav_maga/Destroy()
QDEL_NULL(style)
return ..()
/obj/item/implant/krav_maga/activate()
. = ..()
if(isnull(imp_in.mind))
return
if(style.unlearn(imp_in))
return
style.teach(imp_in)
/obj/item/implanter/krav_maga
name = "implanter (krav maga)"
imp_type = /obj/item/implant/krav_maga
/obj/item/implantcase/krav_maga
name = "implant case - 'Krav Maga'"
desc = "A glass case containing an implant that can teach the user the arts of Krav Maga."
imp_type = /obj/item/implant/krav_maga

View File

@@ -100,7 +100,7 @@
new /obj/item/clothing/suit/armor/vest/warden/alt(src)
new /obj/item/clothing/under/rank/security/warden/formal(src)
new /obj/item/clothing/under/rank/security/warden/skirt(src)
new /obj/item/clothing/gloves/krav_maga/sec(src)
new /obj/item/clothing/gloves/kaza_ruk/sec(src)
new /obj/item/clothing/glasses/hud/security/sunglasses(src)
new /obj/item/clothing/mask/gas/sechailer(src)

View File

@@ -301,7 +301,7 @@
new /obj/item/clothing/head/helmet/marine/pmc(src)
new /obj/item/clothing/mask/gas/sechailer(src)
new /obj/item/clothing/glasses/night(src) // 3~ TC
new /obj/item/clothing/gloves/krav_maga/combatglovesplus(src) //5TC
new /obj/item/clothing/gloves/kaza_ruk/combatglovesplus(src) //5TC
new /obj/item/clothing/shoes/jackboots(src)
new /obj/item/storage/belt/military/assault/fisher(src) //items in this belt easily costs 18 TC

View File

@@ -580,7 +580,7 @@
name = "Random martial arts"
description = "Everyone learns a random martial art!"
blacklisted_maps = list(/datum/lazy_template/deathmatch/meatower)
// krav maga excluded because its too common and too simple, mushpunch excluded because its horrible and not even funny
// kaza ruk excluded because its too common and too simple, mushpunch excluded because its horrible and not even funny
var/static/list/weighted_martial_arts = list(
// common
/datum/martial_art/cqc = 30,

View File

@@ -31,10 +31,10 @@
item = /obj/item/clothing/gloves/combat
cost = 1
/datum/uplink_item/spy_unique/krav_maga
/datum/uplink_item/spy_unique/kaza_ruk
name = "Combat Gloves Plus"
desc = "A pair of combat gloves plus. They're insulated AND you can do martial arts with it!"
item = /obj/item/clothing/gloves/krav_maga/combatglovesplus
item = /obj/item/clothing/gloves/kaza_ruk/combatglovesplus
/datum/uplink_item/spy_unique/tackle_gloves
name = "Guerrilla Gloves"

View File

@@ -1757,7 +1757,7 @@
#include "code\datums\martial\boxing.dm"
#include "code\datums\martial\cqc.dm"
#include "code\datums\martial\junglearts.dm"
#include "code\datums\martial\krav_maga.dm"
#include "code\datums\martial\kaza_ruk.dm"
#include "code\datums\martial\mushpunch.dm"
#include "code\datums\martial\plasma_fist.dm"
#include "code\datums\martial\psychotic_brawl.dm"
@@ -2735,7 +2735,7 @@
#include "code\game\objects\items\implants\implant_deathrattle.dm"
#include "code\game\objects\items\implants\implant_explosive.dm"
#include "code\game\objects\items\implants\implant_freedom.dm"
#include "code\game\objects\items\implants\implant_krav_maga.dm"
#include "code\game\objects\items\implants\implant_kaza_ruk.dm"
#include "code\game\objects\items\implants\implant_mindshield.dm"
#include "code\game\objects\items\implants\implant_misc.dm"
#include "code\game\objects\items\implants\implant_spell.dm"