diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index a8c0353591..ff59d72929 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
// mobility flag traits
// IN THE FUTURE, IT WOULD BE NICE TO DO SOMETHING SIMILAR TO https://github.com/tgstation/tgstation/pull/48923/files (ofcourse not nearly the same because I have my.. thoughts on it)
@@ -236,8 +238,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"
@@ -271,6 +273,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..dc8418f01c 100644
--- a/code/datums/martial/_martial.dm
+++ b/code/datums/martial/_martial.dm
@@ -10,6 +10,7 @@
var/help_verb
var/pacifism_check = TRUE //are the martial arts combos/attacks unable to be used by pacifist.
var/allow_temp_override = TRUE //if this martial art can be overridden by temporary martial arts
+ var/damage_base //this is set on teach and is a random value between your species punchdamagelow and punchdamagehigh
/datum/martial_art/proc/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
return FALSE
@@ -50,6 +51,8 @@
if(help_verb)
H.verbs += help_verb
H.mind.martial_art = src
+ ADD_TRAIT(H, TRAIT_PUGILIST, MARTIAL_ARTIST_TRAIT)
+ damage_base = rand(H.dna.species.punchdamagelow, H.dna.species.punchdamagehigh)
return TRUE
/datum/martial_art/proc/store(datum/martial_art/M,mob/living/carbon/human/H)
@@ -68,7 +71,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..6b12d1e0e7 100644
--- a/code/datums/martial/boxing.dm
+++ b/code/datums/martial/boxing.dm
@@ -17,15 +17,14 @@
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)
- if(extra_damage == A.dna.species.punchdamagelow)
+ var/extra_damage = rand(10, 13)
+ if(damage_base == 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
+ damage_base += 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 +34,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(damage_base, 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..0055482b6c 100644
--- a/code/datums/martial/cqc.dm
+++ b/code/datums/martial/cqc.dm
@@ -46,7 +46,7 @@
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_base + 5, BRUTE)
D.DefaultCombatKnockdown(120)
log_combat(A, D, "slammed (CQC)")
return TRUE
@@ -60,7 +60,7 @@
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)
+ D.apply_damage(damage_base + 5, BRUTE)
log_combat(A, D, "kicked (CQC)")
if(!CHECK_MOBILITY(D, MOBILITY_STAND) && CHECK_MOBILITY(D, MOBILITY_USE))
log_combat(A, D, "knocked out (Head kick)(CQC)")
@@ -68,7 +68,7 @@
"[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.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage_base + 10, 150)
return TRUE
/datum/martial_art/cqc/proc/Pressure(mob/living/carbon/human/A, mob/living/carbon/human/D)
@@ -76,7 +76,7 @@
return FALSE
log_combat(A, D, "pressured (CQC)")
D.visible_message("[A] punches [D]'s neck!")
- D.adjustStaminaLoss(60)
+ D.apply_damage(damage_base + 55, STAMINA)
playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
return TRUE
@@ -89,7 +89,7 @@
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_base + 15, STAMINA)
D.Stun(100)
restraining = TRUE
addtimer(VARSET_CALLBACK(src, restraining, FALSE), 50, TIMER_UNIQUE)
@@ -106,8 +106,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_base + 45, STAMINA)
+ D.apply_damage(damage_base + 20, BRUTE)
return TRUE
/datum/martial_art/cqc/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
@@ -135,7 +135,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_base + 7)
if(!CHECK_MOBILITY(D, MOBILITY_STAND))
bonus_damage += 5
picked_hit_type = "stomps on"
@@ -151,7 +151,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
@@ -172,7 +172,7 @@
if(I && D.temporarilyRemoveItemFromInventory(I))
A.put_in_hands(I)
D.Jitter(2)
- D.apply_damage(5, BRUTE)
+ D.apply_damage(damage_base*0.5, 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..67a0f539de 100644
--- a/code/datums/martial/krav_maga.dm
+++ b/code/datums/martial/krav_maga.dm
@@ -101,7 +101,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(5, BRUTE)
+ D.apply_damage(damage_base*0.5, BRUTE)
D.DefaultCombatKnockdown(40, override_hardstun = 0.01, override_stamdmg = 25)
log_combat(A, D, "leg sweeped")
return 1
@@ -112,7 +112,7 @@
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_base + 5)
log_combat(A, D, "quickchoked")
return 1
@@ -120,7 +120,7 @@
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_base*0.5, BRUTE)
if(D.silent <= 10)
D.silent = CLAMP(D.silent + 10, 0, 10)
log_combat(A, D, "neck chopped")
@@ -137,7 +137,7 @@
return 1
log_combat(A, D, "punched")
var/picked_hit_type = pick("punches", "kicks")
- var/bonus_damage = 10
+ var/bonus_damage = (damage_base + 5)
if(CHECK_MOBILITY(D, MOBILITY_STAND))
bonus_damage += 5
picked_hit_type = "stomps on"
diff --git a/code/datums/martial/mushpunch.dm b/code/datums/martial/mushpunch.dm
index fe9f0d77d6..8027d8e974 100644
--- a/code/datums/martial/mushpunch.dm
+++ b/code/datums/martial/mushpunch.dm
@@ -12,7 +12,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_base*10, 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/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm
index 75053dbbfc..f96fb34397 100644
--- a/code/datums/martial/psychotic_brawl.dm
+++ b/code/datums/martial/psychotic_brawl.dm
@@ -44,10 +44,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_base*1.5, BRUTE, BODY_ZONE_HEAD)
+ A.apply_damage(damage_base, 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_base)
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 +55,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_base*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..6ba5d2c9a3 100644
--- a/code/datums/martial/rising_bass.dm
+++ b/code/datums/martial/rising_bass.dm
@@ -87,7 +87,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_base*0.5, BRUTE, BODY_ZONE_CHEST)
D.DefaultCombatKnockdown(60)
var/L = !checkfordensity(H,D) ? (!checkfordensity(K,D) ? D.loc : K) : H
D.forceMove(L)
@@ -104,8 +104,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_base, BRUTE, BODY_ZONE_CHEST)
+ D.apply_damage(damage_base + 25, BRUTE, BODY_ZONE_HEAD)
D.Sleeping(60)
D.DefaultCombatKnockdown(300)
D.forceMove(L)
@@ -121,7 +121,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_base, BRUTE, BODY_ZONE_CHEST)
D.DefaultCombatKnockdown(90)
log_combat(A, D, "repulse punched (Rising Bass)")
repulsecool = world.time + 3 SECONDS
@@ -134,7 +134,7 @@
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_base*0.5, 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
diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm
index 2b7d9e0a09..dc0ea1a2b4 100644
--- a/code/datums/martial/sleeping_carp.dm
+++ b/code/datums/martial/sleeping_carp.dm
@@ -42,7 +42,7 @@
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_base*2 + crit_damage, BRUTE, affecting)
return
///Crashing Wave Kick: Harm Disarm combo, throws people seven tiles backwards
@@ -53,7 +53,7 @@
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_base + 15, BRUTE, BODY_ZONE_CHEST)
log_combat(A, D, "launchkicked (Sleeping Carp)")
return
@@ -62,14 +62,14 @@
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_base, BRUTE, BODY_ZONE_HEAD)
D.DefaultCombatKnockdown(50)
- D.adjustStaminaLoss(40) //A cit specific change form the tg port to really punish anyone who tries to stand up
+ D.apply_damage(damage_base + 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)
if(!(D.mobility_flags & MOBILITY_STAND))
- D.apply_damage(5, BRUTE, BODY_ZONE_HEAD)
- D.adjustStaminaLoss(40)
+ D.apply_damage(damage_base*0.5, BRUTE, BODY_ZONE_HEAD)
+ D.apply_damage(damage_base + 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)
@@ -93,7 +93,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_base + 10, BRUTE, affecting)
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, TRUE, -1)
log_combat(A, D, "punched (Sleeping Carp)")
return TRUE
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/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..989a7c3b07 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -12,6 +12,122 @@
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
+ var/enhancement = 0 //it's a +0 to your punches because it isn't magical
+ var/inherited_trait = TRAIT_NOGUNS //what are you, dishonoroable?
+ 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
+ H.dna.species.punchstunthreshold -= 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 -= enhancement
+ H.dna.species.punchdamagelow -= enhancement
+ H.dna.species.punchstunthreshold += enhancement
+
+/obj/item/clothing/gloves/fingerless/pugilist/holy
+ name = "armwraps of unyielding resolve"
+ desc = "A series of armwraps, soaked in holy water. Makes you pretty keen to smite evil magic users."
+ enhancement = 1 //It is not magic that makes you punch harder, but force of will. Trust me.
+ secondary_trait = TRAIT_ANTIMAGIC
+
+/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 scrawled 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 = 7 //omae wa mou shindeiru
+ var/warcry = "AT"
+ secondary_trait = TRAIT_NODROP
+
+/obj/item/clothing/gloves/fingerless/pugilist/rapid/Touch(mob/living/target,proximity = TRUE)
+ if(!istype(target))
+ return
+
+ var/mob/living/M = loc
+ M.changeNext_move(CLICK_CD_RAPID)
+ if(warcry)
+ M.say("[warcry]", ignore_spam = TRUE, forced = "north star warcry")
+
+ .= FALSE
+
+/obj/item/clothing/gloves/fingerless/pugilist/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/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/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/fingerless/pugilist/rapid/hug/attack_self(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 +175,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 +185,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 34c65982dc..0d6a6e64d7 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_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"