From ca2ff33292cfaa3412d2c476d825cecfe80ea36a Mon Sep 17 00:00:00 2001
From: necromanceranne <40847847+necromanceranne@users.noreply.github.com>
Date: Tue, 23 Apr 2024 01:43:58 +1000
Subject: [PATCH] Rocky DLXIII: Fitness to Athletics, Athletics skill
influences Boxing against Boxers, Boxing overhaul, Evil Boxing (#82611)
## About The Pull Request
### Changes Fitness skill to Athletics skill; Removes the sprite growth
as the only meaningful reward
Basically just a rebranding so that it is more broad in its concept. It
isn't just about peak physique. It's about how you can apply it too.
Reaching Legendary rewards you with the Golden Gloves.
### Boxing Overhaul
I started it in this pr here
https://github.com/tgstation/tgstation/pull/80635
But this is a more significant overhaul of boxing from the ground up.
Namely, it now is majorly influenced by the Athletics skill, and also
more thoroughly aligns with conventional punching in its current state.
However, a major component of this is that boxing's breadth of mechanics
is only relevant when used against another boxer. Non-boxer targets are
only ever going to get smacked by a stamina punch, as it is currently
(and more or less the same values too). Additionally, boxers cannot
punch someone who is either unconscious or in stamina crit, so it can't
be used to maintain stamcrit.
- Boxing now has a One-Two Punch mechanic. Swapping between the left and
right mouse buttons to punch and maintaining this causes every second
punch to do more damage (to boxers). Breaking this chain by punching
with the same button twice will cause you to lose damage (against
boxers).
- Boxing now can have crits occur below 50 stamina damage (against
boxers). However, to knock someone out clean, the target must be
staggered from a previous crit first. (Or I guess be staggered at all,
maybe their shoelaces were tied or something). Crit probabilities are
determined by adding your Athletics probability skill bonuses to your
unarmed effectiveness, and then reduced by the targets own Athletics
skill bonuses. It is hard for two athletes to knock each other out in
one blow. It is trivial for a legendary boxer to knock out a novice in a
single punch. Cybernetically enhanced boxers are dangerously effective
at boxing.
- Boxers can block other boxers by using throw mode, but the chances of
doing so is based on Athletics skill bonuses. A successful block causes
the attacker to take stamina damage (as does the blocker, but less so).
- Participating in boxing increases the Athletics skill. Your gains are
probably slower than normal training, but you at least get some reward
for doing so. Only relevant if your opponent is a boxer. Get a sparring
partner!
### Evil Boxing (Admin Only)
So this is all well and good, but what if you're a scoundrel with no
care for the other person in this equation? Well, that's where Evil
Boxing comes in. Evil Boxing has absolutely no restrictions at all, and
can freely use its boxing abilities against anyone. Even non-boxers. You
can even grab people! Wow, what a scumbag. I bet you even king hit
people. Thankfully, only an admin can make you into an Evil Boxer.
### Strength and Stimmed Mutations now benefit Exercising and Boxing
(against boxers)
Both mutations have a flimsy increase to instability of 5 because of how
incredibly particular the bonus is.
Strength now reduces the amount of stamina damage inflicted via
exercising by half. Strength also adds a +2 damage bonus on boxing
punches while boxing against boxers (this doesn't influence normal
unarmed attacks whatsoever, or boxing against nonboxers). Obviously,
evil boxers just get this benefit against everyone because they're
knaves.
Stimmed increases the duration of the exercised status effect by one
factor. (That is, if you have no other modifiers, it will double the
duration on its own)
## Why It's Good For The Game
@Jacquerel was racking their brain trying to come up with an alternative
to the skill rewards of Fitness. At the moment, sprite growth is not
only a really bad bonus (it does literally nothing but make you big, and
thus is actually a detriment due to how intrusive sprite size is with
interaction, and plays weird with other sprite changing effects), but
isn't really all that interesting for all the effort put in.
Problem is, how do you make Fitness meaningful without making it a
powergame mechanic? Simple! You make it applicable to a really niche,
self-contained but still utilized game mechanic that is engaging to
participate in and makes you meaningfully very good in it. AND scratches
that power scaling itch that many players have.
Boxing is reasonably self-contained as is, but pretty bland due to how
old it is. While maintaining that self-contained nature, I hoped to
expand the interactivity of boxing a little bit by giving it a small
mini-game in of itself. And also introduce ways to simulate the idea of
boxing a bit better.
The idea of being an Evil Boxer is funny. For every Rocky, there is a
[Insert Rocky Villain Here that isn't Creed]. But in this case, it's
probably some Syndicate douchebag looking to punch clowns into a coma
and inspire the mime to take up shadowboxing in revenge.
## Changelog
:cl:
add: Replaces Fitness with Athletics; same skill, but now more
specifically applicable to boxing.
add: Athletics does not increase sprite size.
balance: Overhauls Boxing to add a lot more depth to the interactions.
Only applicable to other boxers, however. You can still punch the snot
out of non-boxers though. But only up to stamcrit or unconsciousness. No
hitting someone who can't fight back!
balance: Adds Evil Boxing, which is the evil and fucked up version of
boxing that you kill people with and are allowed to flout the sacred
rules of boxing as you please. Everyone is a victim!
/:cl:
---
code/__DEFINES/melee.dm | 1 +
code/__DEFINES/traits/declarations.dm | 9 +
code/__DEFINES/traits/sources.dm | 1 +
code/_globalvars/traits/_traits.dm | 3 +
code/datums/martial/boxing.dm | 292 ++++++++++++++----
code/datums/mutations/body.dm | 27 ++
code/datums/skills/athletics.dm | 27 ++
code/datums/skills/fitness.dm | 23 --
code/datums/status_effects/buffs.dm | 11 +-
code/datums/status_effects/debuffs/debuffs.dm | 2 +-
.../objects/structures/gym/punching_bag.dm | 5 +-
.../objects/structures/gym/weight_machine.dm | 10 +-
.../objects/structures/lavaland/gulag_vent.dm | 5 +-
code/modules/clothing/gloves/boxing.dm | 32 ++
code/modules/mob/living/carbon/human/human.dm | 2 +-
icons/mob/clothing/hands.dmi | Bin 17715 -> 17998 bytes
icons/obj/clothing/gloves.dmi | Bin 29739 -> 29425 bytes
tgstation.dme | 2 +-
18 files changed, 362 insertions(+), 90 deletions(-)
create mode 100644 code/datums/skills/athletics.dm
delete mode 100644 code/datums/skills/fitness.dm
diff --git a/code/__DEFINES/melee.dm b/code/__DEFINES/melee.dm
index 2b06303386a..8b3a422fc0b 100644
--- a/code/__DEFINES/melee.dm
+++ b/code/__DEFINES/melee.dm
@@ -1,6 +1,7 @@
//Martial arts defines
#define MARTIALART_BOXING "boxing"
+#define MARTIALART_EVIL_BOXING "evil boxing"
#define MARTIALART_CQC "CQC"
#define MARTIALART_KRAVMAGA "krav maga"
#define MARTIALART_MUSHPUNCH "mushroom punch"
diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm
index 6a83f33083a..f2cb9069fb6 100644
--- a/code/__DEFINES/traits/declarations.dm
+++ b/code/__DEFINES/traits/declarations.dm
@@ -520,6 +520,15 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// Prevents you from twohanding weapons.
#define TRAIT_NO_TWOHANDING "no_twohanding"
+/// Improves boxing damage against boxers and athletics experience gain
+#define TRAIT_STRENGTH "strength"
+
+/// Increases the duration of having exercised
+#define TRAIT_STIMMED "stimmed"
+
+/// Indicates that the target is able to be boxed at a boxer's full power.
+#define TRAIT_BOXING_READY "boxing_ready"
+
/// Halves the time of tying a tie.
#define TRAIT_FAST_TYING "fast_tying"
diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm
index 56bcbf3c90d..278510bd23f 100644
--- a/code/__DEFINES/traits/sources.dm
+++ b/code/__DEFINES/traits/sources.dm
@@ -137,6 +137,7 @@
#define LOCKED_HELMET_TRAIT "locked-helmet"
#define NINJA_SUIT_TRAIT "ninja-suit"
#define SLEEPING_CARP_TRAIT "sleeping_carp"
+#define BOXING_TRAIT "boxing"
#define TIMESTOP_TRAIT "timestop"
#define LIFECANDLE_TRAIT "lifecandle"
#define VENTCRAWLING_TRAIT "ventcrawling"
diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm
index 985fc8ea930..dd0c89c2211 100644
--- a/code/_globalvars/traits/_traits.dm
+++ b/code/_globalvars/traits/_traits.dm
@@ -495,6 +495,9 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_XRAY_VISION" = TRAIT_XRAY_VISION,
"TRAIT_DISCO_DANCER" = TRAIT_DISCO_DANCER,
"TRAIT_MAFIAINITIATE" = TRAIT_MAFIAINITIATE,
+ "TRAIT_STRENGTH" = TRAIT_STRENGTH,
+ "TRAIT_STIMMED" = TRAIT_STIMMED,
+ "TRAIT_BOXING_READY" = TRAIT_BOXING_READY,
),
/obj/item = list(
"TRAIT_APC_SHOCKING" = TRAIT_APC_SHOCKING,
diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm
index ec111fb3cf0..8e20dfbef9c 100644
--- a/code/datums/martial/boxing.dm
+++ b/code/datums/martial/boxing.dm
@@ -1,87 +1,271 @@
+#define LEFT_RIGHT_COMBO "DH"
+#define RIGHT_LEFT_COMBO "HD"
+#define LEFT_LEFT_COMBO "HH"
+#define RIGHT_RIGHT_COMBO "DD"
+
/datum/martial_art/boxing
name = "Boxing"
id = MARTIALART_BOXING
pacifist_style = TRUE
+ ///Boolean on whether we are sportsmanlike in our tussling; TRUE means we have restrictions
+ var/honorable_boxer = TRUE
+ /// List of traits applied to users of this martial art.
+ var/list/boxing_traits = list(TRAIT_BOXING_READY)
+ /// Balloon alert cooldown for warning our boxer to alternate their blows to get more damage
+ COOLDOWN_DECLARE(warning_cooldown)
/datum/martial_art/boxing/teach(mob/living/new_holder, make_temporary)
if(!ishuman(new_holder))
return FALSE
+ new_holder.add_traits(boxing_traits, BOXING_TRAIT)
+ RegisterSignal(new_holder, COMSIG_LIVING_CHECK_BLOCK, PROC_REF(check_block))
return ..()
-/datum/martial_art/boxing/disarm_act(mob/living/carbon/human/attacker, mob/living/defender)
- attacker.balloon_alert(attacker, "can't disarm while boxing!")
- return MARTIAL_ATTACK_FAIL
+/datum/martial_art/boxing/on_remove(mob/living/remove_from)
+ remove_from.remove_traits(boxing_traits, BOXING_TRAIT)
+ UnregisterSignal(remove_from, list(COMSIG_LIVING_CHECK_BLOCK))
+ return ..()
-/datum/martial_art/boxing/grab_act(mob/living/carbon/human/attacker, mob/living/defender)
- attacker.balloon_alert(attacker, "can't grab while boxing!")
- return MARTIAL_ATTACK_FAIL
+///Unlike most instances of this proc, this is actually called in _proc/tussle()
+///Returns a multiplier on our skill damage bonus.
+/datum/martial_art/boxing/proc/check_streak(mob/living/attacker, mob/living/defender)
+ var/combo_multiplier = 1
+
+ if(findtext(streak, LEFT_LEFT_COMBO) || findtext(streak, RIGHT_RIGHT_COMBO))
+ reset_streak()
+ if(COOLDOWN_FINISHED(src, warning_cooldown))
+ COOLDOWN_START(src, warning_cooldown, 2 SECONDS)
+ attacker.balloon_alert(attacker, "weak combo, alternate your hits!")
+ return combo_multiplier * 0.5
+
+ if(findtext(streak, LEFT_RIGHT_COMBO) || findtext(streak, RIGHT_LEFT_COMBO))
+ reset_streak()
+ return combo_multiplier * 1.5
+
+ return combo_multiplier
+
+/datum/martial_art/boxing/disarm_act(mob/living/attacker, mob/living/defender)
+ if(honor_check(defender))
+ add_to_streak("D", defender)
+ tussle(attacker, defender, "right hook", "right hooked")
+ return MARTIAL_ATTACK_SUCCESS
+
+/datum/martial_art/boxing/grab_act(mob/living/attacker, mob/living/defender)
+ if(honorable_boxer)
+ attacker.balloon_alert(attacker, "no grabbing while boxing!")
+ return MARTIAL_ATTACK_FAIL
+ return MARTIAL_ATTACK_INVALID //UNLESS YOU'RE EVIL
+
+/datum/martial_art/boxing/harm_act(mob/living/attacker, mob/living/defender)
+ if(honor_check(defender))
+ add_to_streak("H", defender)
+ tussle(attacker, defender, "left hook", "left hooked")
+ return MARTIAL_ATTACK_SUCCESS
+
+// Our only boxing move, which occurs on literally all attacks; the tussle. However, quite a lot morphs the results of this proc. Combos, unlike most martial arts attacks, are checked in this proc rather than our standard unarmed procs
+/datum/martial_art/boxing/proc/tussle(mob/living/attacker, mob/living/defender, atk_verb = "blind jab", atk_verbed = "blind jabbed")
+
+ if(honorable_boxer) //Being a good sport, you never hit someone on the ground or already knocked down. It shows you're the better person.
+ if(defender.body_position == LYING_DOWN && defender.getStaminaLoss() >= 100 || defender.IsUnconscious()) //If they're in stamcrit or unconscious, don't bloody punch them
+ attacker.balloon_alert(attacker, "unsportsmanlike behaviour!")
+ return FALSE
-/datum/martial_art/boxing/harm_act(mob/living/carbon/human/attacker, mob/living/defender)
var/obj/item/bodypart/arm/active_arm = attacker.get_active_hand()
+
+ //The values between which damage is rolled for punches
+ var/lower_force = active_arm.unarmed_damage_low
+ var/upper_force = active_arm.unarmed_damage_high
+
+ //Determines knockout potential and armor penetration (if that matters)
+ var/base_unarmed_effectiveness = active_arm.unarmed_effectiveness
+
+ //Determines attack sound based on attacker arm
+ var/attack_sound = active_arm.unarmed_attack_sound
+
+ // Out athletics skill is added as a damage bonus
+ var/athletics_skill = attacker.mind?.get_skill_level(/datum/skill/athletics)
+
+ // If true, grants experience for punching; we only gain experience if we punch another boxer.
+ var/grant_experience = FALSE
+
+ // What type of damage does our kind of boxing do? Defaults to STAMINA, unless you're performing EVIL BOXING
+ var/damage_type = honorable_boxer ? STAMINA : attacker.get_attack_type()
+
attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH)
- var/damage = rand(5, 8) + active_arm.unarmed_damage_low
- var/atk_verb = pick("left hook", "right hook", "straight punch")
- if(damage <= 0)
- playsound(defender, active_arm.unarmed_miss_sound, 25, TRUE, -1)
- defender.visible_message(
- span_warning("[attacker]'s [atk_verb] misses [defender]!"),
- span_danger("You avoid [attacker]'s [atk_verb]!"),
- span_hear("You hear a swoosh!"),
- COMBAT_MESSAGE_RANGE,
- attacker,
- )
- to_chat(attacker, span_warning("Your [atk_verb] misses [defender]!"))
- log_combat(attacker, defender, "attempted to hit", atk_verb)
- return MARTIAL_ATTACK_FAIL
+ //Determines damage dealt on a punch. Against a boxing defender, we apply our skill bonus.
+ var/damage = rand(lower_force, upper_force)
- if(defender.check_block(attacker, damage, "[attacker]'s [atk_verb]", UNARMED_ATTACK))
- return MARTIAL_ATTACK_FAIL
+ if(honor_check(defender))
+ var/strength_bonus = HAS_TRAIT(attacker, TRAIT_STRENGTH) ? 2 : 0 //Investing into genetic strength improvements makes you a better boxer
+ damage += round(athletics_skill * check_streak(attacker, defender) + strength_bonus)
+ grant_experience = TRUE
+
+ var/current_atk_verb = atk_verb
+ var/current_atk_verbed = atk_verbed
+
+ if(is_detective_job(attacker.mind?.assigned_role)) //In short: discombobulate
+ current_atk_verb = "discombobulate"
+ current_atk_verbed = "discombulated"
+
+ // Similar to a normal punch, should we have a value of 0 for our lower force, we simply miss outright.
+ if(!lower_force)
+ playsound(defender.loc, active_arm.unarmed_miss_sound, 25, TRUE, -1)
+ defender.visible_message(span_warning("[attacker]'s [current_atk_verb] misses [defender]!"), \
+ span_danger("You avoid [attacker]'s [current_atk_verb]!"), span_hear("You hear a swoosh!"), COMBAT_MESSAGE_RANGE, attacker)
+ to_chat(attacker, span_warning("Your [current_atk_verb] misses [defender]!"))
+ log_combat(attacker, defender, "attempted to hit", current_atk_verb)
+ return FALSE
+
+ if(defender.check_block(attacker, damage, "[attacker]'s [current_atk_verb]", UNARMED_ATTACK))
+ return FALSE
var/obj/item/bodypart/affecting = defender.get_bodypart(defender.get_random_valid_zone(attacker.zone_selected))
- var/armor_block = defender.run_armor_check(affecting, MELEE)
+ var/armor_block = defender.run_armor_check(affecting, MELEE, armour_penetration = base_unarmed_effectiveness)
+
+ playsound(defender, attack_sound, 25, TRUE, -1)
- playsound(defender, active_arm.unarmed_attack_sound, 25, TRUE, -1)
defender.visible_message(
- span_danger("[attacker] [atk_verb]ed [defender]!"),
- span_userdanger("You're [atk_verb]ed by [attacker]!"),
+ span_danger("[attacker] [current_atk_verbed] [defender]!"),
+ span_userdanger("You're [current_atk_verbed] by [attacker]!"),
span_hear("You hear a sickening sound of flesh hitting flesh!"),
COMBAT_MESSAGE_RANGE,
attacker,
)
- to_chat(attacker, span_danger("You [atk_verb]ed [defender]!"))
- defender.apply_damage(damage, STAMINA, affecting, armor_block)
+
+ to_chat(attacker, span_danger("You [current_atk_verbed] [defender]!"))
+
+ defender.apply_damage(damage, damage_type, affecting, armor_block)
+
log_combat(attacker, defender, "punched (boxing) ")
- if(defender.getStaminaLoss() > 50 && istype(defender.mind?.martial_art, /datum/martial_art/boxing))
- var/knockout_prob = defender.getStaminaLoss() + rand(-15, 15)
- if(defender.stat != DEAD && prob(knockout_prob))
- defender.visible_message(
- span_danger("[attacker] knocks [defender] out with a haymaker!"),
- span_userdanger("You're knocked unconscious by [attacker]!"),
- span_hear("You hear a sickening sound of flesh hitting flesh!"),
- COMBAT_MESSAGE_RANGE,
- attacker,
- )
- to_chat(attacker, span_danger("You knock [defender] out with a haymaker!"))
- defender.apply_effect(20 SECONDS, EFFECT_KNOCKDOWN, armor_block)
- defender.SetSleeping(10 SECONDS)
- log_combat(attacker, defender, "knocked out (boxing) ")
- return MARTIAL_ATTACK_SUCCESS
+
+ if(grant_experience)
+ skill_experience_adjustment(attacker, (damage/lower_force))
+
+ if(defender.stat == DEAD || !honor_check(defender)) //early returning here so we don't worry about knockout probs
+ return TRUE
+
+ //Determine our attackers athletics level as a knockout probability bonus
+ var/attacker_athletics_skill = (attacker.mind?.get_skill_modifier(/datum/skill/athletics, SKILL_RANDS_MODIFIER) + base_unarmed_effectiveness)
+
+ // Defender boxing skill and armor block are used as a defense here. This has already factored in base_unarmed_effectiveness from the attacker
+ var/defender_athletics_skill = clamp(defender.mind?.get_skill_modifier(/datum/skill/athletics, SKILL_RANDS_MODIFIER), 0, 100)
+
+ //Determine our final probability, using a clamp to stop any prob() weirdness.
+ var/final_knockout_probability = clamp(round(attacker_athletics_skill - defender_athletics_skill), 0 , 100)
+
+ if(!prob(final_knockout_probability))
+ return TRUE
+
+ if(defender.get_timed_status_effect_duration(/datum/status_effect/staggered))
+ defender.visible_message(
+ span_danger("[attacker] knocks [defender] out with a haymaker!"),
+ span_userdanger("You're knocked unconscious by [attacker]!"),
+ span_hear("You hear a sickening sound of flesh hitting flesh!"),
+ COMBAT_MESSAGE_RANGE,
+ attacker,
+ )
+ to_chat(attacker, span_danger("You knock [defender] out with a haymaker!"))
+ defender.apply_effect(20 SECONDS, EFFECT_KNOCKDOWN, armor_block)
+ defender.SetSleeping(10 SECONDS)
+ log_combat(attacker, defender, "knocked out (boxing) ")
+ else
+ defender.visible_message(
+ span_danger("[attacker] staggers [defender] with a haymaker!"),
+ span_userdanger("You're nearly knocked off your feet by [attacker]!"),
+ span_hear("You hear a sickening sound of flesh hitting flesh!"),
+ COMBAT_MESSAGE_RANGE,
+ attacker,
+ )
+ defender.adjust_staggered_up_to(STAGGERED_SLOWDOWN_LENGTH, 10 SECONDS)
+ to_chat(attacker, span_danger("You stagger [defender] with a haymaker!"))
+ log_combat(attacker, defender, "staggered (boxing) ")
+
+ playsound(defender, 'sound/effects/coin2.ogg', 40, TRUE)
+ new /obj/effect/temp_visual/crit(get_turf(defender))
+ skill_experience_adjustment(attacker, (damage/lower_force)) //double experience for a successful crit
+
+ return TRUE
+
+/// Returns whether whoever is checked by this proc is complying with the rules of boxing. The boxer cannot block non-boxers, and cannot apply their scariest moves against non-boxers.
+/datum/martial_art/boxing/proc/honor_check(mob/living/possible_boxer)
+ if(!honorable_boxer)
+ return TRUE //You scoundrel!!
+
+ if(!HAS_TRAIT(possible_boxer, TRAIT_BOXING_READY))
+ return FALSE
+
+ return TRUE
+
+/// Handles our instances of experience gain while boxing. It also applies the exercised status effect.
+/datum/martial_art/boxing/proc/skill_experience_adjustment(mob/living/boxer, experience_value)
+ //Boxing in heavier gravity gives you more experience
+ var/gravity_modifier = boxer.has_gravity() > STANDARD_GRAVITY ? 1 : 0.5
+
+ //You gotta sleep before you get any experience!
+ boxer.mind?.adjust_experience(/datum/skill/athletics, experience_value * gravity_modifier)
+ boxer.apply_status_effect(/datum/status_effect/exercised)
+
+/// Handles our blocking signals, similar to hit_reaction() on items. Only blocks while the boxer is in throw mode.
+/datum/martial_art/boxing/proc/check_block(mob/living/boxer, atom/movable/hitby, damage, attack_text, attack_type, ...)
+ SIGNAL_HANDLER
+
+ if(!can_use(boxer) || !boxer.throw_mode || boxer.incapacitated(IGNORE_GRAB))
+ return NONE
+
+ if(attack_type != UNARMED_ATTACK)
+ return NONE
+
+ //Determines unarmed defense against boxers using our current active arm.
+ var/obj/item/bodypart/arm/active_arm = boxer.get_active_hand()
+ var/base_unarmed_effectiveness = active_arm.unarmed_effectiveness
+
+ // Out athletics skill is added to our block potential
+ var/athletics_skill_rands = boxer.mind?.get_skill_modifier(/datum/skill/athletics, SKILL_RANDS_MODIFIER)
+
+ var/block_chance = base_unarmed_effectiveness + athletics_skill_rands
+
+ var/block_text = pick("block", "evade")
+
+ if(!prob(block_chance))
+ return NONE
+
+ var/mob/living/attacker = GET_ASSAILANT(hitby)
+
+ if(!honor_check(attacker))
+ return NONE
+
+ if(istype(attacker) && boxer.Adjacent(attacker))
+ attacker.apply_damage(10, STAMINA)
+ boxer.apply_damage(5, STAMINA)
+
+ boxer.visible_message(
+ span_danger("[boxer] [block_text]s [attack_text]!"),
+ span_userdanger("You [block_text] [attack_text]!"),
+ )
+ if(block_text == "evade")
+ playsound(boxer.loc, active_arm.unarmed_miss_sound, 25, TRUE, -1)
+
+ skill_experience_adjustment(boxer, 1) //just getting hit a bunch doesn't net you much experience
+
+ return SUCCESSFUL_BLOCK
/datum/martial_art/boxing/can_use(mob/living/martial_artist)
if(!ishuman(martial_artist))
return FALSE
return ..()
-/obj/item/clothing/gloves/boxing
+/// Evil Boxing; for sick, evil scoundrels. Has no honor, making it more lethal (therefore unable to be used by pacifists).
+/// Grants Strength and Stimmed to speed up any experience gain.
-/obj/item/clothing/gloves/boxing/Initialize(mapload)
- . = ..()
- var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/extendohand_l, /datum/crafting_recipe/extendohand_r)
+/datum/martial_art/boxing/evil
+ name = "Evil Boxing"
+ id = MARTIALART_EVIL_BOXING
+ pacifist_style = FALSE
+ honorable_boxer = FALSE
+ boxing_traits = list(TRAIT_BOXING_READY, TRAIT_STRENGTH, TRAIT_STIMMED)
- AddComponent(
- /datum/component/slapcrafting,\
- slapcraft_recipes = slapcraft_recipe_list,\
- )
-
- AddComponent(/datum/component/martial_art_giver, /datum/martial_art/boxing)
+#undef LEFT_RIGHT_COMBO
+#undef RIGHT_LEFT_COMBO
+#undef LEFT_LEFT_COMBO
+#undef RIGHT_RIGHT_COMBO
diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm
index de77727a3e4..b45d0a6499e 100644
--- a/code/datums/mutations/body.dm
+++ b/code/datums/mutations/body.dm
@@ -267,15 +267,42 @@
desc = "The user's muscles slightly expand."
quality = POSITIVE
text_gain_indication = "You feel strong."
+ instability = 5
difficulty = 16
+/datum/mutation/human/strong/on_acquiring(mob/living/carbon/human/owner)
+ . = ..()
+ if(.)
+ return
+ ADD_TRAIT(owner, TRAIT_STRENGTH, GENETIC_MUTATION)
+
+/datum/mutation/human/strong/on_losing(mob/living/carbon/human/owner)
+ . = ..()
+ if(.)
+ return
+ REMOVE_TRAIT(owner, TRAIT_STRENGTH, GENETIC_MUTATION)
+
+
/datum/mutation/human/stimmed
name = "Stimmed"
desc = "The user's chemical balance is more robust."
quality = POSITIVE
text_gain_indication = "You feel stimmed."
+ instability = 5
difficulty = 16
+/datum/mutation/human/stimmed/on_acquiring(mob/living/carbon/human/owner)
+ . = ..()
+ if(.)
+ return
+ ADD_TRAIT(owner, TRAIT_STIMMED, GENETIC_MUTATION)
+
+/datum/mutation/human/stimmed/on_losing(mob/living/carbon/human/owner)
+ . = ..()
+ if(.)
+ return
+ REMOVE_TRAIT(owner, TRAIT_STIMMED, GENETIC_MUTATION)
+
/datum/mutation/human/insulated
name = "Insulated"
desc = "The affected person does not conduct electricity."
diff --git a/code/datums/skills/athletics.dm b/code/datums/skills/athletics.dm
new file mode 100644
index 00000000000..2ef336e5ba9
--- /dev/null
+++ b/code/datums/skills/athletics.dm
@@ -0,0 +1,27 @@
+/datum/skill/athletics
+ name = "Athletics"
+ title = "Athlete"
+ desc = "Twinkle twinkle little star, hit the gym and lift the bar."
+ // The skill value modifier effects the max duration that is possible for /datum/status_effect/exercised; The rands modifier determines block probability and crit probability while boxing against boxers
+ modifiers = list(
+ SKILL_VALUE_MODIFIER = list(
+ 1 MINUTES,
+ 1.5 MINUTES,
+ 2 MINUTES,
+ 2.5 MINUTES,
+ 3 MINUTES,
+ 3.5 MINUTES,
+ 5 MINUTES
+ ),
+ SKILL_RANDS_MODIFIER = list(
+ 0,
+ 5,
+ 10,
+ 15,
+ 20,
+ 30,
+ 50
+ )
+ )
+
+ skill_item_path = /obj/item/clothing/gloves/boxing/golden
diff --git a/code/datums/skills/fitness.dm b/code/datums/skills/fitness.dm
deleted file mode 100644
index 32be3f9d211..00000000000
--- a/code/datums/skills/fitness.dm
+++ /dev/null
@@ -1,23 +0,0 @@
-/datum/skill/fitness
- name = "Fitness"
- title = "Powerlifter"
- desc = "Twinkle twinkle little star, hit the gym and lift the bar."
- /// The skill value modifier effects the max duration that is possible for /datum/status_effect/exercised
- modifiers = list(SKILL_VALUE_MODIFIER = list(1 MINUTES, 1.5 MINUTES, 2 MINUTES, 2.5 MINUTES, 3 MINUTES, 3.5 MINUTES, 5 MINUTES))
- /// How much bigger your mob becomes per level (these effects don't stack together)
- var/static/size_boost = list(0, 1/16, 1/8, 3/16, 2/8, 3/8, 4/8)
- // skill_item_path - your mob sprite gets bigger to showoff so we don't get a special item
-
-/datum/skill/fitness/level_gained(datum/mind/mind, new_level, old_level, silent)
- . = ..()
- var/old_gym_size = RESIZE_DEFAULT_SIZE + size_boost[old_level]
- var/new_gym_size = RESIZE_DEFAULT_SIZE + size_boost[new_level]
-
- mind.current.update_transform(new_gym_size / old_gym_size)
-
-/datum/skill/fitness/level_lost(datum/mind/mind, new_level, old_level, silent)
- . = ..()
- var/old_gym_size = RESIZE_DEFAULT_SIZE + size_boost[old_level]
- var/new_gym_size = RESIZE_DEFAULT_SIZE + size_boost[new_level]
-
- mind.current.update_transform(new_gym_size / old_gym_size)
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index 6cd180ab597..5784739cd9c 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -195,6 +195,9 @@
if(HAS_TRAIT(new_owner, TRAIT_HULK))
modifier += 0.5
+ if(HAS_TRAIT(new_owner, TRAIT_STIMMED)) // Naturally produces stimulants to help get you PUMPED
+ modifier += 1
+
if(HAS_TRAIT(new_owner, TRAIT_FAT)) // less xp until you get into shape
modifier -= 0.5
@@ -209,10 +212,10 @@
if(new_owner.reagents.has_reagent(workout_reagent))
food_boost += supplementary_reagents_bonus[workout_reagent]
- var/skill_level_boost = (new_owner.mind.get_skill_level(/datum/skill/fitness) - 1) * 2 SECONDS
+ var/skill_level_boost = (new_owner.mind.get_skill_level(/datum/skill/athletics) - 1) * 2 SECONDS
bonus_time = (bonus_time + food_boost + skill_level_boost) * modifier
- var/exhaustion_limit = new_owner.mind.get_skill_modifier(/datum/skill/fitness, SKILL_VALUE_MODIFIER) + world.time
+ var/exhaustion_limit = new_owner.mind.get_skill_modifier(/datum/skill/athletics, SKILL_VALUE_MODIFIER) + world.time
if(duration + bonus_time >= exhaustion_limit)
duration = exhaustion_limit
to_chat(new_owner, span_userdanger("Your muscles are exhausted! Might be a good idea to sleep..."))
@@ -228,10 +231,10 @@
/datum/status_effect/exercised/refresh(mob/living/new_owner, bonus_time)
duration += workout_duration(new_owner, bonus_time)
new_owner.clear_mood_event("exercise") // we need to reset the old mood event in case our fitness skill changes
- new_owner.add_mood_event("exercise", /datum/mood_event/exercise, new_owner.mind.get_skill_level(/datum/skill/fitness))
+ new_owner.add_mood_event("exercise", /datum/mood_event/exercise, new_owner.mind.get_skill_level(/datum/skill/athletics))
/datum/status_effect/exercised/on_apply()
- owner.add_mood_event("exercise", /datum/mood_event/exercise, owner.mind.get_skill_level(/datum/skill/fitness))
+ owner.add_mood_event("exercise", /datum/mood_event/exercise, owner.mind.get_skill_level(/datum/skill/athletics))
return ..()
/datum/status_effect/exercised/on_remove()
diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm
index b2a37356e53..ad5696e787f 100644
--- a/code/datums/status_effects/debuffs/debuffs.dm
+++ b/code/datums/status_effects/debuffs/debuffs.dm
@@ -224,7 +224,7 @@
var/datum/status_effect/exercised/exercised = carbon_owner.has_status_effect(/datum/status_effect/exercised)
if(exercised && carbon_owner.mind)
// the better you sleep, the more xp you gain
- carbon_owner.mind.adjust_experience(/datum/skill/fitness, seconds_between_ticks * sleep_quality * SLEEP_QUALITY_WORKOUT_MULTIPLER)
+ carbon_owner.mind.adjust_experience(/datum/skill/athletics, seconds_between_ticks * sleep_quality * SLEEP_QUALITY_WORKOUT_MULTIPLER)
carbon_owner.adjust_timed_status_effect(-1 * seconds_between_ticks * sleep_quality * SLEEP_QUALITY_WORKOUT_MULTIPLER, /datum/status_effect/exercised)
if(prob(2))
to_chat(carbon_owner, span_notice("You feel your fitness improving!"))
diff --git a/code/game/objects/structures/gym/punching_bag.dm b/code/game/objects/structures/gym/punching_bag.dm
index f441887f2c1..ef0db16e953 100644
--- a/code/game/objects/structures/gym/punching_bag.dm
+++ b/code/game/objects/structures/gym/punching_bag.dm
@@ -57,9 +57,12 @@
stamina_exhaustion = 2
if (is_heavy_gravity)
stamina_exhaustion *= 1.5
+
+ if(HAS_TRAIT(user, TRAIT_STRENGTH)) //The strong get reductions to stamina damage taken while exercising
+ stamina_exhaustion *= 0.5
user.adjustStaminaLoss(stamina_exhaustion)
- user.mind?.adjust_experience(/datum/skill/fitness, is_heavy_gravity ? 0.2 : 0.1)
+ user.mind?.adjust_experience(/datum/skill/athletics, is_heavy_gravity ? 0.2 : 0.1)
user.apply_status_effect(/datum/status_effect/exercised)
/obj/structure/punching_bag/wrench_act_secondary(mob/living/user, obj/item/tool)
diff --git a/code/game/objects/structures/gym/weight_machine.dm b/code/game/objects/structures/gym/weight_machine.dm
index d3614ee6815..3c531f04889 100644
--- a/code/game/objects/structures/gym/weight_machine.dm
+++ b/code/game/objects/structures/gym/weight_machine.dm
@@ -109,7 +109,7 @@
if(do_after(user, 8 SECONDS, src) && user.has_gravity())
// with enough dedication, even clowns can overcome their handicaps
- var/clumsy_chance = 30 - (user.mind.get_skill_level(/datum/skill/fitness) * 5)
+ var/clumsy_chance = 30 - (user.mind.get_skill_level(/datum/skill/athletics) * 5)
if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(clumsy_chance))
playsound(src, 'sound/effects/bang.ogg', 50, TRUE)
to_chat(user, span_warning("Your hand slips, causing the [name] to smash you!"))
@@ -135,7 +135,7 @@
if(iscarbon(user))
var/gravity_modifier = user.has_gravity() > STANDARD_GRAVITY ? 2 : 1
// remember the real xp gain is from sleeping after working out
- user.mind.adjust_experience(/datum/skill/fitness, WORKOUT_XP * gravity_modifier)
+ user.mind.adjust_experience(/datum/skill/athletics, WORKOUT_XP * gravity_modifier)
user.apply_status_effect(/datum/status_effect/exercised, EXERCISE_STATUS_DURATION)
end_workout()
@@ -168,9 +168,13 @@
return TRUE // No weight? I could do this all day
var/gravity_modifier = affected_gravity > STANDARD_GRAVITY ? 0.75 : 1
// the amount of workouts you can do before you hit stamcrit
- var/workout_reps = total_workout_reps[user.mind.get_skill_level(/datum/skill/fitness)] * gravity_modifier
+ var/workout_reps = total_workout_reps[user.mind.get_skill_level(/datum/skill/athletics)] * gravity_modifier
// total stamina drain of 1 workout calculated based on the workout length
var/stamina_exhaustion = FLOOR(user.maxHealth / workout_reps / WORKOUT_LENGTH, 0.1)
+
+ if(HAS_TRAIT(user, TRAIT_STRENGTH)) //The strong get reductions to stamina damage taken while exercising
+ stamina_exhaustion *= 0.5
+
user.adjustStaminaLoss(stamina_exhaustion * seconds_per_tick)
return TRUE
diff --git a/code/game/objects/structures/lavaland/gulag_vent.dm b/code/game/objects/structures/lavaland/gulag_vent.dm
index aa13a1621d8..b564908cdc6 100644
--- a/code/game/objects/structures/lavaland/gulag_vent.dm
+++ b/code/game/objects/structures/lavaland/gulag_vent.dm
@@ -34,9 +34,10 @@
occupied = FALSE
if (!succeeded)
return
- living_user.mind?.adjust_experience(/datum/skill/fitness, 10)
+ var/stamina_damage_to_inflict = HAS_TRAIT(user, TRAIT_STRENGTH) ? 60 : 120 //Decreases the amount of stamina damage inflicted by half if you're STRONG
+ living_user.mind?.adjust_experience(/datum/skill/athletics, 10)
living_user.apply_status_effect(/datum/status_effect/exercised)
new spawned_boulder(get_turf(living_user))
living_user.visible_message(span_notice("[living_user] hauls a boulder out of [src]."))
- living_user.apply_damage(120, STAMINA)
+ living_user.apply_damage(stamina_damage_to_inflict, STAMINA)
playsound(src, 'sound/weapons/genhit.ogg', vol = 50, vary = TRUE)
diff --git a/code/modules/clothing/gloves/boxing.dm b/code/modules/clothing/gloves/boxing.dm
index deed90b1696..03b1cbb5bf7 100644
--- a/code/modules/clothing/gloves/boxing.dm
+++ b/code/modules/clothing/gloves/boxing.dm
@@ -6,6 +6,25 @@
equip_delay_other = 60
species_exception = list(/datum/species/golem) // now you too can be a golem boxing champion
clothing_traits = list(TRAIT_CHUNKYFINGERS)
+ /// Determines the version of boxing (or any martial art for that matter) that the boxing gloves gives
+ var/style_to_give = /datum/martial_art/boxing
+
+/obj/item/clothing/gloves/boxing/Initialize(mapload)
+ . = ..()
+ var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/extendohand_l, /datum/crafting_recipe/extendohand_r)
+
+ AddComponent(
+ /datum/component/slapcrafting,\
+ slapcraft_recipes = slapcraft_recipe_list,\
+ )
+
+ AddComponent(/datum/component/martial_art_giver, style_to_give)
+
+/obj/item/clothing/gloves/boxing/evil
+ name = "evil boxing gloves"
+ desc = "These strange gloves radiate an unsually evil aura."
+ greyscale_colors = "#21211f"
+ style_to_give = /datum/martial_art/boxing/evil
/obj/item/clothing/gloves/boxing/green
icon_state = "boxinggreen"
@@ -18,3 +37,16 @@
/obj/item/clothing/gloves/boxing/yellow
icon_state = "boxingyellow"
greyscale_colors = "#d2a800"
+
+/obj/item/clothing/gloves/boxing/golden
+ name = "golden gloves"
+ desc = "The reigning champ of the station!"
+ icon_state = "boxinggold"
+ custom_materials = list(/datum/material/gold = SHEET_MATERIAL_AMOUNT*1) //LITERALLY GOLD
+ material_flags = MATERIAL_EFFECTS | MATERIAL_AFFECT_STATISTICS
+ equip_delay_other = 120
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE
+
+/obj/item/clothing/gloves/boxing/golden/Initialize(mapload)
+ . = ..()
+ AddElement(/datum/element/skill_reward, /datum/skill/athletics)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index b3e41c89d48..07135351a91 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -915,7 +915,7 @@
var/carrydelay = 5 SECONDS //if you have latex you are faster at grabbing
var/skills_space
- var/fitness_level = mind.get_skill_level(/datum/skill/fitness) - 1
+ var/fitness_level = mind.get_skill_level(/datum/skill/athletics) - 1
if(HAS_TRAIT(src, TRAIT_QUICKER_CARRY))
carrydelay -= 2 SECONDS
else if(HAS_TRAIT(src, TRAIT_QUICK_CARRY))
diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi
index d0e5093d459c50fd89aa23a291fe26ed60b92f95..a670c33b7dcf6d4139a06f28e913962674168a67 100644
GIT binary patch
literal 17998
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
EKj$s_kN^Mx
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index d8a2fc0bd13cd1cb03e215bd6097fdb114f3453e..d5099c64e7f6525c34e80e433178e77fbd2b84e6 100644
GIT binary patch
literal 29425
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