diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 9efffefce5..3fb149d071 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -465,7 +465,7 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
#define EGG_LAYING_MESSAGES list("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.")
// list of all null rod weapons
-#define HOLY_WEAPONS /obj/item/nullrod, /obj/item/twohanded/dualsaber/hypereutactic/chaplain, /obj/item/gun/energy/laser/redtag/hitscan/chaplain, /obj/item/multitool/chaplain, /obj/item/melee/baseball_bat/chaplain
+#define HOLY_WEAPONS /obj/item/nullrod, /obj/item/twohanded/dualsaber/hypereutactic/chaplain, /obj/item/gun/energy/laser/redtag/hitscan/chaplain, /obj/item/multitool/chaplain, /obj/item/clothing/gloves/fingerless/pugilist/chaplain, /obj/item/melee/baseball_bat/chaplain
// Used by PDA and cartridge code to reduce repetitiveness of spritesheets
#define PDAIMG(what) {""}
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 476d99fd9b..e70e0ba743 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -147,6 +147,8 @@
#define TRAIT_NOPULSE "nopulse" // Your heart doesn't beat.
#define TRAIT_EXEMPT_HEALTH_EVENTS "exempt-health-events"
#define TRAIT_NO_MIDROUND_ANTAG "no-midround-antag" //can't be turned into an antag by random events
+#define TRAIT_PUGILIST "pugilist" //This guy punches people for a living
+#define TRAIT_KI_VAMPIRE "ki-vampire" //when someone with this trait rolls maximum damage on a punch and stuns the target, they regain some stamina and do clone damage
#define TRAIT_PASSTABLE "passtable"
// mobility flag traits
@@ -240,8 +242,8 @@
#define GHOSTROLE_TRAIT "ghostrole"
#define APHRO_TRAIT "aphro"
#define BLOODSUCKER_TRAIT "bloodsucker"
-#define CLOTHING_TRAIT "clothing" //used for quirky carrygloves
#define SHOES_TRAIT "shoes" //inherited from your sweet kicks
+#define GLOVE_TRAIT "glove" //inherited by your cool gloves
// unique trait sources, still defines
#define STATUE_MUTE "statue"
@@ -275,6 +277,7 @@
#define LOCKED_HELMET_TRAIT "locked-helmet"
#define NINJA_SUIT_TRAIT "ninja-suit"
#define ANTI_DROP_IMPLANT_TRAIT "anti-drop-implant"
+#define MARTIAL_ARTIST_TRAIT "martial_artist"
#define SLEEPING_CARP_TRAIT "sleeping_carp"
#define RISING_BASS_TRAIT "rising_bass"
#define ABDUCTOR_ANTAGONIST "abductor-antagonist"
diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm
index 0d854371aa..87158f021e 100644
--- a/code/controllers/subsystem/traumas.dm
+++ b/code/controllers/subsystem/traumas.dm
@@ -172,7 +172,7 @@ SUBSYSTEM_DEF(traumas)
/obj/item/ammo_box/magazine/pistolm9mm, /obj/item/ammo_box/a357, /obj/item/ammo_box/magazine/m12g, /obj/item/ammo_box/magazine/mm195x129, /obj/item/antag_spawner/nuke_ops, /obj/mecha/combat/gygax/dark, /obj/mecha/combat/marauder/mauler, /obj/item/soap/syndie, /obj/item/gun/syringe/syndicate, /obj/item/cartridge/virus/syndicate,
/obj/item/cartridge/virus/frame, /obj/item/chameleon, /obj/item/storage/box/syndie_kit/cutouts, /obj/item/clothing/suit/space/hardsuit/syndi, /obj/item/card/emag, /obj/item/storage/toolbox/syndicate, /obj/item/storage/book/bible/syndicate, /obj/item/encryptionkey/binary, /obj/item/encryptionkey/syndicate, /obj/item/aiModule/syndicate,
/obj/item/clothing/shoes/magboots/syndie, /obj/item/powersink, /obj/item/sbeacondrop, /obj/item/sbeacondrop/bomb, /obj/item/syndicatedetonator, /obj/item/shield/energy, /obj/item/assault_pod, /obj/item/slimepotion/slime/sentience/nuclear, /obj/item/stack/telecrystal, /obj/item/jammer, /obj/item/codespeak_manual/unlimited,
- /obj/item/toy/cards/deck/syndicate, /obj/item/storage/secure/briefcase/syndie, /obj/item/storage/fancy/cigarettes/cigpack_syndicate, /obj/item/toy/syndicateballoon, /obj/item/clothing/gloves/rapid, /obj/item/paper/fluff/ruins/thederelict/syndie_mission, /obj/item/organ/cyberimp/eyes/hud/security/syndicate, /obj/item/clothing/head/HoS/syndicate,
+ /obj/item/toy/cards/deck/syndicate, /obj/item/storage/secure/briefcase/syndie, /obj/item/storage/fancy/cigarettes/cigpack_syndicate, /obj/item/toy/syndicateballoon, /obj/item/clothing/gloves/fingerless/pugilist/rapid, /obj/item/paper/fluff/ruins/thederelict/syndie_mission, /obj/item/organ/cyberimp/eyes/hud/security/syndicate, /obj/item/clothing/head/HoS/syndicate,
/obj/machinery/computer/pod/old/syndicate, /obj/machinery/vending/medical/syndicate_access, /obj/item/mmi/syndie, /obj/item/target/syndicate, /obj/machinery/vending/cigarette/syndicate, /obj/item/robot_module/syndicate, /obj/item/clothing/mask/gas/syndicate, /obj/machinery/power/singularity_beacon/syndicate, /obj/item/clothing/head/syndicatefake,
/obj/item/radio/headset/syndicate, /obj/item/gun/ballistic/automatic/pistol/antitank/syndicate, /obj/item/pda/syndicate, /obj/item/clothing/suit/armor/vest/capcarapace/syndicate, /obj/item/gun/ballistic/automatic/flechette, /obj/item/ammo_box/magazine/flechette, /obj/item/clothing/suit/toggle/lawyer/black/syndie, /obj/item/melee/transforming/energy/sword/cx/traitor,
/obj/structure/sign/poster/contraband/syndicate_pistol, /obj/structure/sign/poster/contraband/syndicate_recruitment, /obj/item/bedsheet/syndie, /obj/item/borg/upgrade/syndicate, /obj/item/tank/jetpack/oxygen/harness, /obj/item/firing_pin/implant/pindicate, /obj/item/reagent_containers/glass/bottle/traitor, /obj/item/storage/belt/military,
diff --git a/code/datums/martial/_martial.dm b/code/datums/martial/_martial.dm
index 7b7975bedb..d8a888871e 100644
--- a/code/datums/martial/_martial.dm
+++ b/code/datums/martial/_martial.dm
@@ -35,6 +35,17 @@
current_target = new_target
streak = ""
+/datum/martial_art/proc/damage_roll(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ //Here we roll for our damage to be added into the damage var in the various attack procs. This is changed depending on whether we are in combat mode, lying down, or if our target is in combat mode.
+ var/damage = rand(A.dna.species.punchdamagelow, A.dna.species.punchdamagehigh)
+ if(!(D.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
+ damage *= 1.5
+ if(!CHECK_MOBILITY(A, MOBILITY_STAND))
+ damage *= 0.5
+ if(!(A.combat_flags & COMBAT_FLAG_COMBAT_ACTIVE))
+ damage *= 0.25
+ return damage
+
/datum/martial_art/proc/teach(mob/living/carbon/human/H, make_temporary = FALSE)
if(!istype(H) || !H.mind)
return FALSE
@@ -50,6 +61,7 @@
if(help_verb)
H.verbs += help_verb
H.mind.martial_art = src
+ ADD_TRAIT(H, TRAIT_PUGILIST, MARTIAL_ARTIST_TRAIT)
return TRUE
/datum/martial_art/proc/store(datum/martial_art/M,mob/living/carbon/human/H)
@@ -68,7 +80,8 @@
else
var/datum/martial_art/X = H.mind.default_martial_art
X.teach(H)
-
+ REMOVE_TRAIT(H, TRAIT_PUGILIST, MARTIAL_ARTIST_TRAIT)
+
/datum/martial_art/proc/on_remove(mob/living/carbon/human/H)
if(help_verb)
H.verbs -= help_verb
diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm
index 16d61c29f9..93d70c12cc 100644
--- a/code/datums/martial/boxing.dm
+++ b/code/datums/martial/boxing.dm
@@ -16,16 +16,13 @@
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
var/atk_verb = pick("left hook","right hook","straight punch")
-
- var/damage = rand(10, 13)
- var/extra_damage = rand(A.dna.species.punchdamagelow, A.dna.species.punchdamagehigh)
+ var/extra_damage = damage_roll(A,D)
if(extra_damage == A.dna.species.punchdamagelow)
playsound(D.loc, A.dna.species.miss_sound, 25, 1, -1)
D.visible_message("[A] has attempted to [atk_verb] [D]!", \
"[A] has attempted to [atk_verb] [D]!", null, COMBAT_MESSAGE_RANGE)
log_combat(A, D, "attempted to hit", atk_verb)
return TRUE
- damage += extra_damage
var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected))
var/armor_block = D.run_armor_check(affecting, "melee")
@@ -35,7 +32,7 @@
D.visible_message("[A] has [atk_verb]ed [D]!", \
"[A] has [atk_verb]ed [D]!", null, COMBAT_MESSAGE_RANGE)
- D.apply_damage(damage, STAMINA, affecting, armor_block)
+ D.apply_damage(rand(10,13) + extra_damage, STAMINA, affecting, armor_block)
log_combat(A, D, "punched (boxing) ")
if(D.getStaminaLoss() > 100 && istype(D.mind?.martial_art, /datum/martial_art/boxing))
var/knockout_prob = (D.getStaminaLoss() + rand(-15,15))*0.75
diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm
index 0871cf7eaa..39fac11129 100644
--- a/code/datums/martial/cqc.dm
+++ b/code/datums/martial/cqc.dm
@@ -42,11 +42,12 @@
/datum/martial_art/cqc/proc/Slam(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(!can_use(A))
return FALSE
+ var/damage = (damage_roll(A,D) + 5)
if(CHECK_MOBILITY(D, MOBILITY_STAND))
D.visible_message("[A] slams [D] into the ground!", \
"[A] slams you into the ground!")
playsound(get_turf(A), 'sound/weapons/slam.ogg', 50, 1, -1)
- D.apply_damage(10, BRUTE)
+ D.apply_damage(damage, BRUTE)
D.DefaultCombatKnockdown(120)
log_combat(A, D, "slammed (CQC)")
return TRUE
@@ -54,29 +55,33 @@
/datum/martial_art/cqc/proc/Kick(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(!can_use(A))
return FALSE
- if(CHECK_MOBILITY(D, MOBILITY_STAND))
- D.visible_message("[A] kicks [D] back!", \
- "[A] kicks you back!")
- playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
- var/atom/throw_target = get_edge_target_turf(D, A.dir)
- D.throw_at(throw_target, 1, 14, A)
- D.apply_damage(10, BRUTE)
- log_combat(A, D, "kicked (CQC)")
+ var/damage = damage_roll(A,D)
if(!CHECK_MOBILITY(D, MOBILITY_STAND) && CHECK_MOBILITY(D, MOBILITY_USE))
log_combat(A, D, "knocked out (Head kick)(CQC)")
D.visible_message("[A] kicks [D]'s head, knocking [D.p_them()] out!", \
"[A] kicks your head, knocking you out!")
playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1)
D.SetSleeping(300)
- D.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 150)
+ D.apply_damage(damage + 5, BRUTE)
+ var/atom/throw_target = get_edge_target_turf(D, A.dir)
+ D.throw_at(throw_target, 1, 14, A)
+ D.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage + 10, 150)
+ else
+ D.visible_message("[A] kicks [D]!", \
+ "[A] kicks you!")
+ playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
+ D.Dizzy(damage)
+ D.apply_damage(damage + 15, BRUTE)
+ log_combat(A, D, "kicked (CQC)")
return TRUE
/datum/martial_art/cqc/proc/Pressure(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(!can_use(A))
return FALSE
+ var/damage = (damage_roll(A,D) + 55)
log_combat(A, D, "pressured (CQC)")
D.visible_message("[A] punches [D]'s neck!")
- D.adjustStaminaLoss(60)
+ D.apply_damage(damage, STAMINA)
playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
return TRUE
@@ -85,11 +90,12 @@
return
if(!can_use(A))
return FALSE
+ var/damage = (damage_roll(A,D) + 15)
if(!D.stat)
log_combat(A, D, "restrained (CQC)")
D.visible_message("[A] locks [D] into a restraining position!", \
"[A] locks you into a restraining position!")
- D.adjustStaminaLoss(20)
+ D.apply_damage(damage, STAMINA)
D.Stun(100)
restraining = TRUE
addtimer(VARSET_CALLBACK(src, restraining, FALSE), 50, TIMER_UNIQUE)
@@ -98,6 +104,7 @@
/datum/martial_art/cqc/proc/Consecutive(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(!can_use(A))
return FALSE
+ var/damage = damage_roll(A,D)
if(!D.stat)
log_combat(A, D, "consecutive CQC'd (CQC)")
D.visible_message("[A] strikes [D]'s abdomen, neck and back consecutively", \
@@ -106,8 +113,8 @@
var/obj/item/I = D.get_active_held_item()
if(I && D.temporarilyRemoveItemFromInventory(I))
A.put_in_hands(I)
- D.adjustStaminaLoss(50)
- D.apply_damage(25, BRUTE)
+ D.apply_damage(damage + 45, STAMINA)
+ D.apply_damage(damage + 20, BRUTE)
return TRUE
/datum/martial_art/cqc/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
@@ -135,7 +142,7 @@
log_combat(A, D, "attacked (CQC)")
A.do_attack_animation(D)
var/picked_hit_type = pick("CQC'd", "Big Bossed")
- var/bonus_damage = 13
+ var/bonus_damage = (damage_roll(A,D) + 7)
if(!CHECK_MOBILITY(D, MOBILITY_STAND))
bonus_damage += 5
picked_hit_type = "stomps on"
@@ -151,7 +158,7 @@
D.visible_message("[A] leg sweeps [D]!", \
"[A] leg sweeps you!")
playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1)
- D.apply_damage(10, BRUTE)
+ D.apply_damage(bonus_damage, BRUTE)
D.DefaultCombatKnockdown(60)
log_combat(A, D, "sweeped (CQC)")
return TRUE
@@ -161,6 +168,7 @@
return FALSE
add_to_streak("D",D)
var/obj/item/I = null
+ var/damage = (damage_roll(A,D)*0.5)
if(check_streak(A,D))
return TRUE
if(prob(65))
@@ -172,7 +180,7 @@
if(I && D.temporarilyRemoveItemFromInventory(I))
A.put_in_hands(I)
D.Jitter(2)
- D.apply_damage(5, BRUTE)
+ D.apply_damage(damage, BRUTE)
else
D.visible_message("[A] attempted to disarm [D]!", \
"[A] attempted to disarm [D]!")
diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm
index 1a244f911e..8ea1c2efca 100644
--- a/code/datums/martial/krav_maga.dm
+++ b/code/datums/martial/krav_maga.dm
@@ -84,64 +84,71 @@
if("neck_chop")
streak = ""
neck_chop(A,D)
- return 1
+ return TRUE
if("leg_sweep")
streak = ""
leg_sweep(A,D)
- return 1
+ return TRUE
if("quick_choke")//is actually lung punch
streak = ""
quick_choke(A,D)
- return 1
- return 0
+ return TRUE
+ return FALSE
/datum/martial_art/krav_maga/proc/leg_sweep(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ var/obj/item/bodypart/affecting = D.get_bodypart(BODY_ZONE_CHEST)
+ var/armor_block = D.run_armor_check(affecting, "melee")
+ var/damage = damage_roll(A,D)
if(!CHECK_MOBILITY(D, MOBILITY_STAND))
- return 0
+ return FALSE
D.visible_message("[A] leg sweeps [D]!", \
"[A] leg sweeps you!")
playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1)
- D.apply_damage(5, BRUTE)
- D.DefaultCombatKnockdown(40, override_hardstun = 0.01, override_stamdmg = 25)
+ D.apply_damage(damage + 25, STAMINA, affecting, armor_block)
+ D.DefaultCombatKnockdown(80, override_hardstun = 1, override_stamdmg = 0)
log_combat(A, D, "leg sweeped")
- return 1
+ return TRUE
/datum/martial_art/krav_maga/proc/quick_choke(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)//is actually lung punch
+ var/damage = damage_roll(A,D)
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)
if(D.losebreath <= 10)
D.losebreath = CLAMP(D.losebreath + 5, 0, 10)
- D.adjustOxyLoss(10)
+ D.adjustOxyLoss(damage + 5)
log_combat(A, D, "quickchoked")
- return 1
+ return TRUE
/datum/martial_art/krav_maga/proc/neck_chop(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
+ var/damage = (damage_roll(A,D)*0.5)
D.visible_message("[A] karate chops [D]'s neck!", \
"[A] karate chops your neck, rendering you unable to speak!")
playsound(get_turf(A), 'sound/effects/hit_punch.ogg', 50, 1, -1)
- D.apply_damage(5, BRUTE)
+ D.apply_damage(damage, BRUTE)
if(D.silent <= 10)
D.silent = CLAMP(D.silent + 10, 0, 10)
log_combat(A, D, "neck chopped")
- return 1
+ return TRUE
/datum/martial_art/krav_maga/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(check_streak(A,D))
- return 1
+ return TRUE
log_combat(A, D, "grabbed (Krav Maga)")
..()
/datum/martial_art/krav_maga/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
+ var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected))
+ var/armor_block = D.run_armor_check(affecting, "melee")
if(check_streak(A,D))
- return 1
+ return TRUE
log_combat(A, D, "punched")
var/picked_hit_type = pick("punches", "kicks")
- var/bonus_damage = 10
+ var/bonus_damage = damage_roll(A,D)
if(CHECK_MOBILITY(D, MOBILITY_STAND))
- bonus_damage += 5
+ bonus_damage += 10
picked_hit_type = "stomps on"
- D.apply_damage(bonus_damage, BRUTE)
+ D.apply_damage(bonus_damage, BRUTE, affecting, armor_block)
if(picked_hit_type == "kicks" || picked_hit_type == "stomps on")
A.do_attack_animation(D, ATTACK_EFFECT_KICK)
playsound(get_turf(D), 'sound/effects/hit_kick.ogg', 50, 1, -1)
@@ -151,24 +158,34 @@
D.visible_message("[A] [picked_hit_type] [D]!", \
"[A] [picked_hit_type] you!")
log_combat(A, D, "[picked_hit_type] with [name]")
- return 1
+ return TRUE
-/datum/martial_art/krav_maga/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
- var/obj/item/I = null
- if(prob(60))
- I = D.get_active_held_item()
- if(I)
- if(D.temporarilyRemoveItemFromInventory(I))
- A.put_in_hands(I)
- D.visible_message("[A] has disarmed [D]!", \
- "[A] has disarmed [D]!")
- playsound(D, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+/datum/martial_art/krav_maga/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ if(check_streak(A,D))
+ return TRUE
+ var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected))
+ var/armor_block = D.run_armor_check(affecting, "melee")
+ var/damage = damage_roll(A,D)
+ if(D.mobility_flags & MOBILITY_STAND)
+ D.visible_message("[A] reprimands [D]!", \
+ "You're slapped by [A]!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A)
+ to_chat(A, "You jab [D]!")
+ A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
+ playsound(D, 'sound/effects/hit_punch.ogg', 50, TRUE, -1)
+ D.apply_damage(damage + 5, STAMINA, affecting, armor_block)
+ log_combat(A, D, "punched nonlethally")
else
- D.visible_message("[A] attempted to disarm [D]!", \
- "[A] attempted to disarm [D]!")
- playsound(D, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
- log_combat(A, D, "disarmed (Krav Maga)", "[I ? " removing \the [I]" : ""]")
- return 1
+ D.visible_message("[A] reprimands [D]!", \
+ "You're manhandled by [A]!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A)
+ to_chat(A, "You stomp [D]!")
+ A.do_attack_animation(D, ATTACK_EFFECT_KICK)
+ playsound(D, 'sound/effects/hit_punch.ogg', 50, TRUE, -1)
+ D.apply_damage(damage + 10, STAMINA, affecting, armor_block)
+ log_combat(A, D, "stomped nonlethally")
+ if(prob(D.getStaminaLoss()))
+ D.visible_message("[D] sputters and recoils in pain!", "You recoil in pain as you are jabbed in a nerve!")
+ D.drop_all_held_items()
+ return TRUE
//Krav Maga Gloves
diff --git a/code/datums/martial/mushpunch.dm b/code/datums/martial/mushpunch.dm
index fe9f0d77d6..3fd0a637c2 100644
--- a/code/datums/martial/mushpunch.dm
+++ b/code/datums/martial/mushpunch.dm
@@ -4,6 +4,7 @@
/datum/martial_art/mushpunch/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
var/atk_verb
+ var/damage = (damage_roll(A,D)*3)
to_chat(A, "You begin to wind up an attack...")
if(!do_after(A, 25, target = D))
to_chat(A, "Your attack was interrupted!")
@@ -12,7 +13,7 @@
atk_verb = pick("punches", "smashes", "ruptures", "cracks")
D.visible_message("[A] [atk_verb] [D] with inhuman strength, sending [D.p_them()] flying backwards!", \
"[A] [atk_verb] you with inhuman strength, sending you flying backwards!")
- D.apply_damage(rand(15,30), BRUTE)
+ D.apply_damage(damage, BRUTE) //KAPOW
playsound(D, 'sound/effects/meteorimpact.ogg', 25, 1, -1)
var/throwtarget = get_edge_target_turf(A, get_dir(A, get_step_away(D, A)))
D.throw_at(throwtarget, 4, 2, A)//So stuff gets tossed around at the same time.
diff --git a/code/datums/martial/plasma_fist.dm b/code/datums/martial/plasma_fist.dm
index 71fb00c467..c751d3b146 100644
--- a/code/datums/martial/plasma_fist.dm
+++ b/code/datums/martial/plasma_fist.dm
@@ -44,11 +44,13 @@
return
/datum/martial_art/plasma_fist/proc/Throwback(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ var/damage = (damage_roll(A,D)*3)
D.visible_message("[A] has hit [D] with Plasma Punch!", \
"[A] has hit [D] with Plasma Punch!")
playsound(D.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
var/atom/throw_target = get_edge_target_turf(D, get_dir(D, get_step_away(D, A)))
D.throw_at(throw_target, 200, 4,A)
+ D.apply_damage(damage, BRUTE)
A.say("HYAH!", forced="plasma fist")
log_combat(A, D, "threw back (Plasma Fist)")
return
diff --git a/code/datums/martial/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm
index 75053dbbfc..06d07260ed 100644
--- a/code/datums/martial/psychotic_brawl.dm
+++ b/code/datums/martial/psychotic_brawl.dm
@@ -14,6 +14,7 @@
/datum/martial_art/psychotic_brawling/proc/psycho_attack(mob/living/carbon/human/A, mob/living/carbon/human/D)
var/atk_verb
+ var/damage = damage_roll(A,D)
switch(rand(1,8))
if(1)
D.help_shake_act(A)
@@ -44,10 +45,10 @@
D.visible_message("[A] [atk_verb] [D]!", \
"[A] [atk_verb] you!")
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 40, 1, -1)
- D.apply_damage(rand(5,10), BRUTE, BODY_ZONE_HEAD)
- A.apply_damage(rand(5,10), BRUTE, BODY_ZONE_HEAD)
+ D.apply_damage(damage*1.5, BRUTE, BODY_ZONE_HEAD)
+ A.apply_damage(damage, BRUTE, BODY_ZONE_HEAD)
if(!istype(D.head,/obj/item/clothing/head/helmet/) && !istype(D.head,/obj/item/clothing/head/hardhat))
- D.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5)
+ D.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage)
A.Stun(rand(10,45))
D.DefaultCombatKnockdown(rand(5,30))//CIT CHANGE - makes stuns from martial arts always use Knockdown instead of Stun for the sake of consistency
if(5,6)
@@ -55,7 +56,7 @@
atk_verb = pick("punches", "kicks", "hits", "slams into")
D.visible_message("[A] [atk_verb] [D] with inhuman strength, sending [D.p_them()] flying backwards!", \
"[A] [atk_verb] you with inhuman strength, sending you flying backwards!")
- D.apply_damage(rand(15,30), BRUTE)
+ D.apply_damage(damage*2, BRUTE)
playsound(get_turf(D), 'sound/effects/meteorimpact.ogg', 25, 1, -1)
var/throwtarget = get_edge_target_turf(A, get_dir(A, get_step_away(D, A)))
D.throw_at(throwtarget, 4, 2, A)//So stuff gets tossed around at the same time.
diff --git a/code/datums/martial/rising_bass.dm b/code/datums/martial/rising_bass.dm
index 8055bd54e9..1b767df52c 100644
--- a/code/datums/martial/rising_bass.dm
+++ b/code/datums/martial/rising_bass.dm
@@ -78,6 +78,7 @@
return TRUE
/datum/martial_art/the_rising_bass/proc/sideKick(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ var/damage = (damage_roll(A,D)*0.5)
if(CHECK_MOBILITY(D, MOBILITY_STAND))
var/dir = A.dir & (NORTH | SOUTH) ? pick(EAST, WEST) : pick(NORTH, SOUTH)
var/oppdir = dir == NORTH ? SOUTH : dir == SOUTH ? NORTH : dir == EAST ? WEST : EAST
@@ -87,7 +88,7 @@
D.visible_message("[A] kicks [D] in the side, sliding them over!", \
"[A] kicks you in the side, forcing you to step away!")
playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- D.apply_damage(5, BRUTE, BODY_ZONE_CHEST)
+ D.apply_damage(damage, BRUTE, BODY_ZONE_CHEST)
D.DefaultCombatKnockdown(60)
var/L = !checkfordensity(H,D) ? (!checkfordensity(K,D) ? D.loc : K) : H
D.forceMove(L)
@@ -96,6 +97,7 @@
return TRUE
/datum/martial_art/the_rising_bass/proc/shoulderFlip(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ var/damage = (damage_roll(A,D) + 25)
if(CHECK_MOBILITY(D, MOBILITY_STAND))
var/turf/H = get_step(A, get_dir(D,A))
var/L = checkfordensity(H,D) ? H : A.loc
@@ -104,8 +106,8 @@
"[A] flips you over their shoulder, slamming you into the ground!")
playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
D.emote("scream")
- D.apply_damage(10, BRUTE, BODY_ZONE_CHEST)
- D.apply_damage(30, BRUTE, BODY_ZONE_HEAD)
+ D.apply_damage(damage, BRUTE, BODY_ZONE_CHEST)
+ D.apply_damage(damage, BRUTE, BODY_ZONE_HEAD)
D.Sleeping(60)
D.DefaultCombatKnockdown(300)
D.forceMove(L)
@@ -114,6 +116,7 @@
return FALSE
/datum/martial_art/the_rising_bass/proc/repulsePunch(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ var/damage = damage_roll(A,D)
if(CHECK_MOBILITY(D, MOBILITY_STAND) && repulsecool < world.time)
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
D.visible_message("[A] smashes [D] in the chest, throwing them away!", \
@@ -121,7 +124,7 @@
playsound(get_turf(A), 'sound/weapons/punch1.ogg', 50, 1, -1)
var/atom/F = get_edge_target_turf(D, get_dir(A, get_step_away(D, A)))
D.throw_at(F, 10, 1)
- D.apply_damage(10, BRUTE, BODY_ZONE_CHEST)
+ D.apply_damage(damage, BRUTE, BODY_ZONE_CHEST)
D.DefaultCombatKnockdown(90)
log_combat(A, D, "repulse punched (Rising Bass)")
repulsecool = world.time + 3 SECONDS
@@ -129,12 +132,13 @@
return FALSE
/datum/martial_art/the_rising_bass/proc/footSmash(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ var/damage = (damage_roll(A,D)*0.5)
if(CHECK_MOBILITY(D, MOBILITY_STAND))
A.do_attack_animation(D, ATTACK_EFFECT_KICK)
D.visible_message("[A] smashes their foot down on [D]'s foot!", \
"[A] smashes your foot!")
playsound(get_turf(A), 'sound/weapons/punch1.ogg', 50, 1, -1)
- D.apply_damage(5, BRUTE, pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
+ D.apply_damage(damage, BRUTE, pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
D.dropItemToGround(D.get_active_held_item())
log_combat(A, D, "foot smashed (Rising Bass)")
return TRUE
@@ -181,7 +185,7 @@
. = ..()
if(A.incapacitated(FALSE, TRUE)) //NO STUN
return BULLET_ACT_HIT
- if(!(A.mobility_flags & MOBILITY_USE)) //NO UNABLE TO USE
+ if(CHECK_ALL_MOBILITY(A, MOBILITY_USE|MOBILITY_STAND)) //NO UNABLE TO USE, NO DODGING ON THE FLOOR
return BULLET_ACT_HIT
if(A.dna && A.dna.check_mutation(HULK)) //NO HULK
return BULLET_ACT_HIT
diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm
index 050743fd36..41479c57bd 100644
--- a/code/datums/martial/sleeping_carp.dm
+++ b/code/datums/martial/sleeping_carp.dm
@@ -31,45 +31,48 @@
var/atk_verb = pick("precisely kick", "brutally chop", "cleanly hit", "viciously slam")
///this is the critical hit damage added to the attack if it rolls, it starts at 0 because it'll be changed when rolled
var/crit_damage = 0
+ var/damage = damage_roll(A,D)
D.visible_message("[A] [atk_verb]s [D]!", \
"[A] [atk_verb]s you!", null, null, A)
to_chat(A, "You [atk_verb] [D]!")
if(prob(10))
- crit_damage += 20
+ crit_damage += (damage*2 + 15)
playsound(get_turf(D), 'sound/weapons/bite.ogg', 50, TRUE, -1)
- D.visible_message("[D] sputters blood as the blow strikes them with inhuman force!", "You are struck with incredible precision by [A]!")
+ D.visible_message("[D] staggers as the blow strikes them with inhuman force!", "You are struck with incredible precision by [A]!")
log_combat(A, D, "critcal strong punched (Sleeping Carp)")//log it here because a critical can swing for 40 force and it's important for the sake of how hard they hit
else
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, TRUE, -1)
log_combat(A, D, "strong punched (Sleeping Carp)")//so as to not double up on logging
- D.apply_damage(20 + crit_damage, BRUTE, affecting)
+ D.apply_damage((damage + 15) + crit_damage, BRUTE, affecting)
return
///Crashing Wave Kick: Harm Disarm combo, throws people seven tiles backwards
/datum/martial_art/the_sleeping_carp/proc/launchKick(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ var/damage = (damage_roll(A,D) + 15)
A.do_attack_animation(D, ATTACK_EFFECT_KICK)
D.visible_message("[A] kicks [D] square in the chest, sending them flying!", \
"You are kicked square in the chest by [A], sending you flying!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A)
playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, TRUE, -1)
var/atom/throw_target = get_edge_target_turf(D, A.dir)
D.throw_at(throw_target, 7, 14, A)
- D.apply_damage(15, BRUTE, BODY_ZONE_CHEST)
+ D.apply_damage(damage, BRUTE, BODY_ZONE_CHEST)
log_combat(A, D, "launchkicked (Sleeping Carp)")
return
///Keelhaul: Harm Grab combo, knocks people down, deals stamina damage while they're on the floor
/datum/martial_art/the_sleeping_carp/proc/dropKick(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ var/damage = damage_roll(A,D)
A.do_attack_animation(D, ATTACK_EFFECT_KICK)
playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, TRUE, -1)
if((D.mobility_flags & MOBILITY_STAND))
- D.apply_damage(10, BRUTE, BODY_ZONE_HEAD)
+ D.apply_damage(damage, BRUTE, BODY_ZONE_HEAD)
D.DefaultCombatKnockdown(50, override_hardstun = 0.01, override_stamdmg = 0)
- D.adjustStaminaLoss(40) //A cit specific change form the tg port to really punish anyone who tries to stand up
+ D.apply_damage(damage + 35, STAMINA, BODY_ZONE_HEAD) //A cit specific change form the tg port to really punish anyone who tries to stand up
D.visible_message("[A] kicks [D] in the head, sending them face first into the floor!", \
"You are kicked in the head by [A], sending you crashing to the floor!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A)
- else if(!(D.mobility_flags & MOBILITY_STAND))
- D.apply_damage(5, BRUTE, BODY_ZONE_HEAD)
- D.adjustStaminaLoss(40)
+ else
+ D.apply_damage(damage*0.5, BRUTE, BODY_ZONE_HEAD)
+ D.apply_damage(damage + 35, STAMINA, BODY_ZONE_HEAD)
D.drop_all_held_items()
D.visible_message("[A] kicks [D] in the head!", \
"You are kicked in the head by [A]!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A)
@@ -85,6 +88,7 @@
/datum/martial_art/the_sleeping_carp/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
add_to_streak("H",D)
+ var/damage = (damage_roll(A,D) + 5)
if(check_streak(A,D))
return TRUE
var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected))
@@ -93,7 +97,7 @@
D.visible_message("[A] [atk_verb]s [D]!", \
"[A] [atk_verb]s you!", null, null, A)
to_chat(A, "You [atk_verb] [D]!")
- D.apply_damage(rand(10,15), BRUTE, affecting)
+ D.apply_damage(damage, BRUTE, affecting)
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, TRUE, -1)
log_combat(A, D, "punched (Sleeping Carp)")
return TRUE
@@ -110,7 +114,7 @@
. = ..()
if(A.incapacitated(FALSE, TRUE)) //NO STUN
return BULLET_ACT_HIT
- if(!(A.mobility_flags & MOBILITY_USE)) //NO UNABLE TO USE
+ if(CHECK_ALL_MOBILITY(A, MOBILITY_USE|MOBILITY_STAND)) //NO UNABLE TO USE, NO DEFLECTION ON THE FLOOR
return BULLET_ACT_HIT
if(A.dna && A.dna.check_mutation(HULK)) //NO HULK
return BULLET_ACT_HIT
@@ -121,6 +125,7 @@
playsound(get_turf(A), pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, TRUE)
P.firer = A
P.setAngle(rand(0, 360))//SHING
+ A.adjustStaminaLossBuffered (3) //Citadel change to stop infinite bullet sponging as you run away, but it is buffered!
return BULLET_ACT_FORCE_PIERCE
return BULLET_ACT_HIT
@@ -133,7 +138,6 @@
ADD_TRAIT(H, TRAIT_NODISMEMBER, SLEEPING_CARP_TRAIT)
H.physiology.brute_mod *= 0.4 //brute is really not gonna cut it
H.physiology.burn_mod *= 0.7 //burn is distinctly more useful against them than brute but they're still resistant
- H.physiology.stamina_mod *= 0.5 //stun batons prove to be one of the few ways to fight them. They have stun resistance already, so I think doubling down too hard on this resistance is a bit much.
H.physiology.stun_mod *= 0.3 //for those rare stuns
H.physiology.pressure_mod *= 0.3 //go hang out with carp
H.physiology.cold_mod *= 0.3 //cold mods are different to burn mods, they do stack however
@@ -148,7 +152,6 @@
REMOVE_TRAIT(H, TRAIT_NODISMEMBER, SLEEPING_CARP_TRAIT)
H.physiology.brute_mod = initial(H.physiology.brute_mod)
H.physiology.burn_mod = initial(H.physiology.burn_mod)
- H.physiology.stamina_mod = initial(H.physiology.stamina_mod)
H.physiology.stun_mod = initial(H.physiology.stun_mod)
H.physiology.pressure_mod = initial(H.physiology.pressure_mod) //no more carpies
H.physiology.cold_mod = initial(H.physiology.cold_mod)
diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm
index 349efdd342..f7923d029f 100644
--- a/code/datums/martial/wrestling.dm
+++ b/code/datums/martial/wrestling.dm
@@ -19,29 +19,29 @@
/datum/martial_art/wrestling/proc/check_streak(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(!can_use(A, D))
- return 0
+ return FALSE
switch(streak)
if("drop")
streak = ""
drop(A,D)
- return 1
+ return TRUE
if("strike")
streak = ""
strike(A,D)
- return 1
+ return TRUE
if("kick")
streak = ""
kick(A,D)
- return 1
+ return TRUE
if("throw")
streak = ""
throw_wrassle(A,D)
- return 1
+ return TRUE
if("slam")
streak = ""
slam(A,D)
- return 1
- return 0
+ return TRUE
+ return FALSE
/datum/action/slam
name = "Slam (Cinch) - Slam a grappled opponent into the floor."
@@ -138,7 +138,7 @@
/datum/martial_art/wrestling/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(check_streak(A,D))
- return 1
+ return TRUE
log_combat(A, D, "punched with wrestling")
..()
@@ -173,11 +173,11 @@
if (get_dist(A, D) > 1)
to_chat(A, "[D] is too far away!")
- return 0
+ return FALSE
if (!isturf(A.loc) || !isturf(D.loc))
to_chat(A, "You can't throw [D] from here!")
- return 0
+ return FALSE
A.setDir(turn(A.dir, 90))
var/turf/T = get_step(A, A.dir)
@@ -186,7 +186,7 @@
D.forceMove(T)
D.setDir(get_dir(D, A))
else
- return 0
+ return FALSE
sleep(delay)
@@ -195,11 +195,11 @@
if (get_dist(A, D) > 1)
to_chat(A, "[D] is too far away!")
- return 0
+ return FALSE
if (!isturf(A.loc) || !isturf(D.loc))
to_chat(A, "You can't throw [D] from here!")
- return 0
+ return FALSE
D.forceMove(A.loc) // Maybe this will help with the wallthrowing bug.
@@ -211,7 +211,7 @@
D.emote("scream")
D.throw_at(T, 10, 4, A, TRUE, TRUE, callback = CALLBACK(D, /mob/living/carbon/human.proc/DefaultCombatKnockdown, 20))
log_combat(A, D, "has thrown with wrestling")
- return 0
+ return FALSE
/datum/martial_art/wrestling/proc/FlipAnimation(mob/living/carbon/human/D)
set waitfor = FALSE
@@ -227,6 +227,7 @@
if(!A.pulling || A.pulling != D)
to_chat(A, "You need to have [D] in a cinch!")
return
+ var/damage = damage_roll(A,D)
D.forceMove(A.loc)
A.setDir(get_dir(A, D))
D.setDir(get_dir(D, A))
@@ -258,7 +259,7 @@
A.pixel_y = 0
D.pixel_x = 0
D.pixel_y = 0
- return 0
+ return FALSE
if (!isturf(A.loc) || !isturf(D.loc))
to_chat(A, "You can't slam [D] here!")
@@ -266,7 +267,7 @@
A.pixel_y = 0
D.pixel_x = 0
D.pixel_y = 0
- return 0
+ return FALSE
else
if (A)
A.pixel_x = 0
@@ -274,7 +275,7 @@
if (D)
D.pixel_x = 0
D.pixel_y = 0
- return 0
+ return FALSE
sleep(1)
@@ -286,11 +287,11 @@
if (get_dist(A, D) > 1)
to_chat(A, "[D] is too far away!")
- return 0
+ return FALSE
if (!isturf(A.loc) || !isturf(D.loc))
to_chat(A, "You can't slam [D] here!")
- return 0
+ return FALSE
D.forceMove(A.loc)
@@ -309,11 +310,11 @@
switch(rand(1,3))
if (2)
- D.adjustBruteLoss(rand(20,30))
+ D.apply_damage(damage + 25, BRUTE)
if (3)
D.ex_act(EXPLODE_LIGHT)
else
- D.adjustBruteLoss(rand(10,20))
+ D.apply_damage(damage + 15, BRUTE)
else
D.ex_act(EXPLODE_LIGHT)
@@ -327,7 +328,7 @@
log_combat(A, D, "body-slammed")
- return 0
+ return FALSE
/datum/martial_art/wrestling/proc/CheckStrikeTurf(mob/living/carbon/human/A, turf/T)
if (A && (T && isturf(T) && get_dist(A, T) <= 1))
@@ -337,6 +338,7 @@
if(!D)
return
var/turf/T = get_turf(A)
+ var/damage = damage_roll(A,D)
if (T && isturf(T) && D && isturf(D.loc))
for (var/i = 0, i < 4, i++)
A.setDir(turn(A.dir, 90))
@@ -345,7 +347,7 @@
addtimer(CALLBACK(src, .proc/CheckStrikeTurf, A, T), 4)
A.visible_message("[A] headbutts [D]!")
- D.adjustBruteLoss(rand(10,20))
+ D.apply_damage(damage + 15, BRUTE)
playsound(A.loc, "swing_hit", 50, 1)
D.Unconscious(20)
log_combat(A, D, "headbutted")
@@ -353,13 +355,14 @@
/datum/martial_art/wrestling/proc/kick(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(!D)
return
+ var/damage = damage_roll(A,D)
A.emote("scream")
A.emote("flip")
A.setDir(turn(A.dir, 90))
A.visible_message("[A] roundhouse-kicks [D]!")
playsound(A.loc, "swing_hit", 50, 1)
- D.adjustBruteLoss(rand(10,20))
+ D.apply_damage(damage + 15, STAMINA)
var/turf/T = get_edge_target_turf(A, get_dir(A, get_step_away(D, A)))
if (T && isturf(T))
@@ -373,7 +376,8 @@
var/obj/surface = null
var/turf/ST = null
var/falling = 0
-
+ var/damage = damage_roll(A,D)
+
for (var/obj/O in oview(1, A))
if (O.density == 1)
if (O == A)
@@ -401,15 +405,15 @@
A.pixel_y = 0
if (falling == 1)
A.visible_message("...and dives head-first into the ground, ouch!")
- A.adjustBruteLoss(rand(10,20))
+ A.apply_damage(damage + 15, BRUTE)
A.DefaultCombatKnockdown(60)
to_chat(A, "[D] is too far away!")
- return 0
+ return FALSE
if (!isturf(A.loc) || !isturf(D.loc))
A.pixel_y = 0
to_chat(A, "You can't drop onto [D] from here!")
- return 0
+ return FALSE
if(A)
animate(A, transform = matrix(90, MATRIX_ROTATE), time = 1, loop = 0)
@@ -427,9 +431,9 @@
if (prob(33) || D.stat)
D.ex_act(EXPLODE_LIGHT)
else
- D.adjustBruteLoss(rand(20,30))
+ D.apply_damage(damage + 25, BRUTE)
else
- D.adjustBruteLoss(rand(20,30))
+ D.apply_damage(damage + 25, BRUTE)
D.DefaultCombatKnockdown(40)
@@ -442,14 +446,16 @@
return
/datum/martial_art/wrestling/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ damage_roll(A,D)
if(check_streak(A,D))
- return 1
+ return TRUE
log_combat(A, D, "wrestling-disarmed")
..()
/datum/martial_art/wrestling/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
+ damage_roll(A,D)
if(check_streak(A,D))
- return 1
+ return TRUE
if(!can_use(A,D))
return ..()
if(A.pulling == D || A == D) // don't stun grab yoursel
@@ -459,7 +465,7 @@
"[A] gets [D] in a cinch!")
D.Stun(rand(60,100))
log_combat(A, D, "cinched")
- return 1
+ return TRUE
/obj/item/storage/belt/champion/wrestling
name = "Wrestling Belt"
@@ -492,7 +498,7 @@
//Make sure that moves can only be used on people wearing the holodeck belt
/datum/martial_art/wrestling/holodeck/can_use(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(!(istype(D.mind?.martial_art, /datum/martial_art/wrestling/holodeck)))
- return 0
+ return FALSE
else
return ..()
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index b561224668..f78a05244e 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -55,7 +55,7 @@
/obj/item/stack/tile/fakespace/loaded = ARCADE_WEIGHT_TRICK,
/obj/item/stack/tile/fakepit/loaded = ARCADE_WEIGHT_TRICK,
/obj/item/restraints/handcuffs/fake = ARCADE_WEIGHT_TRICK,
- /obj/item/clothing/gloves/rapid/hug = ARCADE_WEIGHT_TRICK,
+ /obj/item/clothing/gloves/fingerless/pugilist/rapid/hug = ARCADE_WEIGHT_TRICK,
/obj/item/grenade/chem_grenade/glitter/pink = ARCADE_WEIGHT_TRICK,
/obj/item/grenade/chem_grenade/glitter/blue = ARCADE_WEIGHT_TRICK,
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
index 9a086b75a2..c4a8c1e827 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -656,6 +656,7 @@
C.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), SLOT_WEAR_SUIT)
C.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), SLOT_SHOES)
C.equip_to_slot_or_del(new /obj/item/storage/backpack/cultpack(user), SLOT_BACK)
+ C.equip_to_slot_or_del(new /obj/item/clothing/gloves/fingerless/pugilist/hungryghost(user), SLOT_GLOVES)
if(C == user)
qdel(src) //Clears the hands
C.put_in_hands(new /obj/item/melee/cultblade(user))
diff --git a/code/modules/cargo/exports/gear.dm b/code/modules/cargo/exports/gear.dm
index 10b3d4f707..4db7c68efd 100644
--- a/code/modules/cargo/exports/gear.dm
+++ b/code/modules/cargo/exports/gear.dm
@@ -309,7 +309,7 @@
/datum/export/gear/combatgloves
cost = 80
unit_name = "combat gloves"
- export_types = list(/obj/item/clothing/gloves/combat, /obj/item/clothing/gloves/rapid, /obj/item/clothing/gloves/krav_maga)
+ export_types = list(/obj/item/clothing/gloves/combat, /obj/item/clothing/gloves/fingerless/pugilist/rapid, /obj/item/clothing/gloves/krav_maga)
include_subtypes = TRUE
/datum/export/gear/bonegloves
diff --git a/code/modules/cargo/exports/weapons.dm b/code/modules/cargo/exports/weapons.dm
index 836dc044b7..2342603bde 100644
--- a/code/modules/cargo/exports/weapons.dm
+++ b/code/modules/cargo/exports/weapons.dm
@@ -287,7 +287,7 @@
/datum/export/weapon/gloves
cost = 90
unit_name = "star struck gloves"
- export_types = list(/obj/item/clothing/gloves/rapid)
+ export_types = list(/obj/item/clothing/gloves/fingerless/pugilist/rapid)
/datum/export/weapon/l6
cost = 500
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index cf3541fd89..e2af067e8c 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -207,11 +207,11 @@
/obj/item/clothing/gloves/color/latex/equipped(mob/user, slot)
..()
if(slot == SLOT_GLOVES)
- ADD_TRAIT(user, carrytrait, CLOTHING_TRAIT)
+ ADD_TRAIT(user, carrytrait, GLOVE_TRAIT)
/obj/item/clothing/gloves/color/latex/dropped(mob/user)
..()
- REMOVE_TRAIT(user, carrytrait, CLOTHING_TRAIT)
+ REMOVE_TRAIT(user, carrytrait, GLOVE_TRAIT)
/obj/item/clothing/gloves/color/latex/nitrile
name = "nitrile gloves"
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index 9f4b89f607..3d7315b88d 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -12,6 +12,135 @@
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
strip_mod = 0.9
+/obj/item/clothing/gloves/fingerless/pugilist
+ name = "armwraps"
+ desc = "A series of armwraps. Makes you pretty keen to start punching people."
+ icon_state = "armwraps"
+ item_state = "armwraps"
+ body_parts_covered = ARMS
+ cold_protection = ARMS
+ strip_delay = 300 //you can't just yank them off
+ ///Extra damage through the punch.
+ var/enhancement = 0 //it's a +0 to your punches because it isn't magical
+ ///Main trait added by the gloves to the user on wear.
+ var/inherited_trait = TRAIT_NOGUNS //what are you, dishonoroable?
+ ///Secondary trait added by the gloves to the user on wear.
+ var/secondary_trait = TRAIT_FEARLESS //what are you, a coward?
+
+/obj/item/clothing/gloves/fingerless/pugilist/equipped(mob/user, slot)
+ . = ..()
+ if(slot == SLOT_GLOVES)
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ ADD_TRAIT(H, TRAIT_PUGILIST, GLOVE_TRAIT)
+ ADD_TRAIT(H, inherited_trait, GLOVE_TRAIT)
+ ADD_TRAIT(H, secondary_trait, GLOVE_TRAIT)
+ H.dna.species.punchdamagehigh += enhancement
+ H.dna.species.punchdamagelow += enhancement
+
+/obj/item/clothing/gloves/fingerless/pugilist/dropped(mob/user)
+
+ REMOVE_TRAIT(user, TRAIT_PUGILIST, GLOVE_TRAIT)
+ REMOVE_TRAIT(user, inherited_trait, GLOVE_TRAIT)
+ REMOVE_TRAIT(user, secondary_trait, GLOVE_TRAIT)
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ H.dna.species.punchdamagehigh = initial(H.dna.species.punchdamagehigh)
+ H.dna.species.punchdamagelow = initial(H.dna.species.punchdamagelow)
+ return ..()
+
+/obj/item/clothing/gloves/fingerless/pugilist/chaplain
+ name = "armwraps of unyielding resolve"
+ desc = "A series of armwraps, soaked in holy water. Makes you pretty keen to smite evil magic users."
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ enhancement = 1 //It is not magic that makes you punch harder, but force of will. Trust me.
+ secondary_trait = TRAIT_ANTIMAGIC
+ var/chaplain_spawnable = TRUE
+
+/obj/item/clothing/gloves/fingerless/pugilist/chaplain/Initialize()
+ . = ..()
+ AddComponent(/datum/component/anti_magic, TRUE, TRUE, FALSE, null, null, FALSE)
+
+/obj/item/clothing/gloves/fingerless/pugilist/magic
+ name = "armwraps of mighty fists"
+ desc = "A series of armwraps. Makes you pretty keen to go adventuring and punch dragons."
+ resistance_flags = FIRE_PROOF | ACID_PROOF //magic items are harder to damage with energy this is a dnd joke okay?
+ enhancement = 1 //They're +1!
+
+/obj/item/clothing/gloves/fingerless/pugilist/hungryghost
+ name = "armwraps of the hungry ghost"
+ desc = "A series of blackened, bloodstained armwraps stitched with strange geometric symbols. Makes you pretty keen to commit horrible acts against the living through bloody carnage."
+ icon_state = "narsiearmwraps"
+ item_state = "narsiearmwraps"
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 35, "rad" = 0, "fire" = 50, "acid" = 50)
+ enhancement = 3
+ secondary_trait = TRAIT_KI_VAMPIRE
+
+/obj/item/clothing/gloves/fingerless/pugilist/brassmountain
+ name = "armbands of the brass mountain"
+ desc = "A series of scolding hot brass armbands. Makes you pretty keen to bring the light to the unenlightened through unmitigated violence."
+ icon_state = "ratvararmwraps"
+ item_state = "ratvararmwraps"
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ armor = list("melee" = 10, "bullet" = 0, "laser" = -10, "energy" = 0, "bomb" = 0, "bio" = 35, "rad" = 0, "fire" = 50, "acid" = 50)
+ enhancement = 4 //The artifice of Ratvar is unmatched except when it is.
+ secondary_trait = TRAIT_STRONG_GRABBER
+
+/obj/item/clothing/gloves/fingerless/pugilist/rapid
+ name = "Bands of the North Star"
+ desc = "The armbands of a deadly martial artist. Makes you pretty keen to put an end to evil in an extremely violent manner."
+ icon_state = "rapid"
+ item_state = "rapid"
+ enhancement = 10 //omae wa mou shindeiru
+ var/warcry = "AT"
+ secondary_trait = TRAIT_NOSOFTCRIT //basically extra health
+
+/obj/item/clothing/gloves/fingerless/pugilist/rapid/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, GLOVE_TRAIT)
+
+/obj/item/clothing/gloves/fingerless/pugilist/rapid/Touch(atom/target, proximity = TRUE)
+ if(!isliving(target))
+ return
+
+ var/mob/living/M = loc
+ M.changeNext_move(CLICK_CD_RAPID)
+ if(warcry)
+ M.say("[warcry]", ignore_spam = TRUE, forced = TRUE)
+
+ return FALSE
+
+/obj/item/clothing/gloves/fingerless/pugilist/rapid/AltClick(mob/user)
+ var/input = stripped_input(user,"What do you want your battlecry to be? Max length of 6 characters.", ,"", 7)
+ if(input)
+ warcry = input
+
+/obj/item/clothing/gloves/fingerless/pugilist/rapid/hug
+ name = "Hugs of the North Star"
+ desc = "The armbands of a humble friend. Makes you pretty keen to go let everyone know how much you appreciate them!"
+ warcry = "owo" //Shouldn't ever come into play
+ enhancement = 0
+ secondary_trait = TRAIT_PACIFISM //You are only here to hug and be friends!
+
+/obj/item/clothing/gloves/fingerless/pugilist/rapid/hug/Touch(mob/target, proximity = TRUE)
+ if(!isliving(target))
+ return
+
+ var/mob/living/M = loc
+
+ if(M.a_intent != INTENT_HELP)
+ return FALSE
+ if(target.stat != CONSCIOUS) //Can't hug people who are dying/dead
+ return FALSE
+ else
+ M.changeNext_move(CLICK_CD_RAPID)
+
+ return FALSE
+
+/obj/item/clothing/gloves/fingerless/pugilist/rapid/hug/AltClick(mob/user)
+ return FALSE
+
/obj/item/clothing/gloves/botanic_leather
name = "botanist's leather gloves"
desc = "These leather gloves protect against thorns, barbs, prickles, spikes and other harmful objects of floral origin. They're also quite warm."
@@ -59,54 +188,6 @@
resistance_flags = NONE
armor = list("melee" = 15, "bullet" = 35, "laser" = 35, "energy" = 20, "bomb" = 35, "bio" = 35, "rad" = 35, "fire" = 0, "acid" = 0)
-/obj/item/clothing/gloves/rapid
- name = "Gloves of the North Star"
- desc = "Just looking at these fills you with an urge to beat the shit out of people. Violently."
- icon_state = "rapid"
- item_state = "rapid"
- transfer_prints = TRUE
- var/warcry = "AT"
-
-/obj/item/clothing/gloves/rapid/Touch(mob/living/target,proximity = TRUE)
- if(!istype(target))
- return
-
- var/mob/living/M = loc
- M.changeNext_move(CLICK_CD_RAPID)
- M.adjustStaminaLoss(-3.5) // used to be -2 with some comment about stamina buffer management but *shrug -hatterhat
- if(warcry)
- M.say("[warcry]", ignore_spam = TRUE, forced = "north star warcry")
-
- .= FALSE
-
-
-/obj/item/clothing/gloves/rapid/attack_self(mob/user)
- var/input = stripped_input(user,"What do you want your battlecry to be? Max length of 6 characters.", ,"", 7)
- if(input)
- warcry = input
-
-/obj/item/clothing/gloves/rapid/hug
- name = "Hugs of the North Star"
- desc = "Just looking at these fills you with an urge to hug the shit out of people. In a very friendly manner."
- warcry = "owo" //Shouldn't ever come into play
-
-/obj/item/clothing/gloves/rapid/hug/Touch(mob/living/target,proximity = TRUE)
- if(!istype(target))
- return
-
- var/mob/living/M = loc
-
- if(M.a_intent == INTENT_HELP)
- if(target.health >= 0 && !HAS_TRAIT(target, TRAIT_FAKEDEATH)) //Can't hug people who are dying/dead
- if(target.on_fire || target.lying) //No spamming extinguishing, helping them up, or other non-hugging/patting help interactions
- return
- else
- M.changeNext_move(CLICK_CD_RAPID)
- . = FALSE
-
-/obj/item/clothing/gloves/rapid/hug/attack_self(mob/user)
- return FALSE
-
/obj/item/clothing/gloves/thief
name = "black gloves"
desc = "Gloves made with completely frictionless, insulated cloth, easier to steal from people with."
@@ -117,4 +198,4 @@
strip_delay = 80
transfer_prints = FALSE
strip_mod = 5
- strip_silence = TRUE
\ No newline at end of file
+ strip_silence = TRUE
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index c2f6ac28c6..d541ff1066 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1456,6 +1456,12 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(target.check_martial_melee_block())
target.visible_message("[target] blocks [user]'s attack!")
return FALSE
+
+ if(HAS_TRAIT(user, TRAIT_PUGILIST))//CITADEL CHANGE - makes punching cause staminaloss but funny martial artist types get a discount
+ user.adjustStaminaLossBuffered(1.5)
+ else
+ user.adjustStaminaLossBuffered(3.5)
+
if(attacker_style && attacker_style.harm_act(user,target))
return TRUE
else
@@ -1474,8 +1480,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
else
user.do_attack_animation(target, ATTACK_EFFECT_PUNCH)
- user.adjustStaminaLossBuffered(3.5) //CITADEL CHANGE - makes punching cause staminaloss
-
var/damage = rand(user.dna.species.punchdamagelow, user.dna.species.punchdamagehigh)
var/puncherstam = user.getStaminaLoss()
var/puncherbrute = user.getBruteLoss()
@@ -1534,13 +1538,24 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if((target.stat != DEAD) && damage >= user.dna.species.punchstunthreshold)
if((punchedstam > 50) && prob(punchedstam*0.5)) //If our punch victim has been hit above the threshold, and they have more than 50 stamina damage, roll for stun, probability of 1% per 2 stamina damage
+
target.visible_message("[user] knocks [target] down!", \
"You're knocked down by [user]!", "You hear aggressive shuffling followed by a loud thud!", COMBAT_MESSAGE_RANGE, user)
to_chat(user, "You knock [target] down!")
+
var/knockdown_duration = 40 + (punchedstam + (punchedbrute*0.5))*0.8 - armor_block
target.DefaultCombatKnockdown(knockdown_duration)
target.forcesay(GLOB.hit_appends)
log_combat(user, target, "got a stun punch with their previous punch")
+
+ if(HAS_TRAIT(user, TRAIT_KI_VAMPIRE) && !HAS_TRAIT(target, TRAIT_NOBREATH) && (punchedbrute < 100)) //If we're a ki vampire we also sap them of lifeforce, but only if they're not too beat up. Also living organics only.
+ user.adjustBruteLoss(-5)
+ user.adjustFireLoss(-5)
+ user.adjustStaminaLoss(-20)
+
+ target.adjustCloneLoss(10)
+ target.adjustBruteLoss(10)
+
else if(!(target.mobility_flags & MOBILITY_STAND))
target.forcesay(GLOB.hit_appends)
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index 446e726256..4ee069afe8 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -11,7 +11,7 @@
siemens_coeff = 0
punchdamagelow = 5
punchdamagehigh = 14
- punchstunthreshold = 11 //about 40% chance to stun
+ punchstunthreshold = 10
no_equip = list(SLOT_WEAR_MASK, SLOT_WEAR_SUIT, SLOT_GLOVES, SLOT_SHOES, SLOT_W_UNIFORM, SLOT_S_STORE)
nojumpsuit = 1
sexes = 1
@@ -168,7 +168,7 @@
name = "Silver Golem"
id = "silver golem"
fixed_mut_color = "ddd"
- punchstunthreshold = 9 //60% chance, from 40%
+ punchstunthreshold = 9
meat = /obj/item/stack/ore/silver
info_text = "As a Silver Golem, your attacks have a higher chance of stunning. Being made of silver, your body is immune to most types of magic."
prefix = "Silver"
@@ -190,7 +190,7 @@
stunmod = 0.4
punchdamagelow = 12
punchdamagehigh = 21
- punchstunthreshold = 18 //still 40% stun chance
+ punchstunthreshold = 18
speedmod = 4 //pretty fucking slow
meat = /obj/item/stack/ore/iron
info_text = "As a Plasteel Golem, you are slower, but harder to stun, and hit very hard when punching."
diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
index 3c17ef9066..cb8fdbf101 100644
--- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
@@ -12,9 +12,9 @@
inherent_traits = list(TRAIT_NOBREATH)
speedmod = 1.5 //faster than golems but not by much
- punchdamagelow = 6
- punchdamagehigh = 14
- punchstunthreshold = 14 //about 44% chance to stun
+ punchdamagelow = 2
+ punchdamagehigh = 12 //still better than humans
+ punchstunthreshold = 10
no_equip = list(SLOT_WEAR_MASK, SLOT_WEAR_SUIT, SLOT_GLOVES, SLOT_SHOES, SLOT_W_UNIFORM)
diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm
index 1700927a24..6c42e622fe 100644
--- a/code/modules/mob/living/carbon/human/species_types/synths.dm
+++ b/code/modules/mob/living/carbon/human/species_types/synths.dm
@@ -23,7 +23,7 @@
armor = 25
punchdamagelow = 10
punchdamagehigh = 19
- punchstunthreshold = 14 //about 50% chance to stun
+ punchstunthreshold = 14
disguise_fail_health = 50
/datum/species/synth/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
index bf090302c8..e7229b5abf 100644
--- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
@@ -467,9 +467,9 @@
if(H.physiology)
H.physiology.stamina_mod *= 0.5
if(H.dna && H.dna.species)
- H.dna.species.punchdamagehigh *= 4
- H.dna.species.punchdamagelow *= 4
- H.dna.species.punchstunthreshold *= 2
+ H.dna.species.punchdamagehigh += 4
+ H.dna.species.punchdamagelow += 4
+ H.dna.species.punchstunthreshold -= 2
/datum/reagent/drug/skooma/on_mob_end_metabolize(mob/living/L)
. = ..()
@@ -480,9 +480,9 @@
if(H.physiology)
H.physiology.stamina_mod *= 2
if(H.dna && H.dna.species)
- H.dna.species.punchdamagehigh *= 0.25
- H.dna.species.punchdamagelow *= 0.25
- H.dna.species.punchstunthreshold *= 0.5
+ H.dna.species.punchdamagehigh -= 4
+ H.dna.species.punchdamagelow -= 4
+ H.dna.species.punchstunthreshold += 2
/datum/reagent/drug/skooma/on_mob_life(mob/living/carbon/M)
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1*REM)
diff --git a/code/modules/uplink/uplink_items/uplink_dangerous.dm b/code/modules/uplink/uplink_items/uplink_dangerous.dm
index 819ba51623..b0395af7c9 100644
--- a/code/modules/uplink/uplink_items/uplink_dangerous.dm
+++ b/code/modules/uplink/uplink_items/uplink_dangerous.dm
@@ -174,10 +174,13 @@
include_modes = list(/datum/game_mode/nuclear)
/datum/uplink_item/dangerous/rapid
- name = "Gloves of the North Star"
- desc = "These gloves let the user punch people very fast. Does not improve weapon attack speed or the meaty fists of a hulk."
- item = /obj/item/clothing/gloves/rapid
- cost = 8
+ name = "Bands of the North Star"
+ desc = "These armbands let the user punch people very fast and with the lethality of a legendary martial artist. \
+ Does not improve weapon attack speed or the meaty fists of a hulk, but you will be unmatched in martial power. \
+ Combines with all martial arts, but the user will be unable to bring themselves to use guns, nor remove the armbands."
+ item = /obj/item/clothing/gloves/fingerless/pugilist/rapid
+ cost = 30
+ include_modes = list(/datum/game_mode/nuclear)
/datum/uplink_item/dangerous/guardian
name = "Holoparasites"
diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi
index e7068a1854..74aabf6021 100644
Binary files a/icons/mob/hands.dmi and b/icons/mob/hands.dmi differ
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index e937842275..d53f53c029 100644
Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ