Skip to content

Commit

Permalink
Adds Punching Mitts: Become a One-Spacemen Planetary Ecological Disas…
Browse files Browse the repository at this point in the history
…ter. Available in any mining loot chests (and portals) (tgstation#85820)

<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->

## About The Pull Request

Adds Punching Mitts, which grant the wearer Hunter Boxing. Hunter Boxing
works similar to boxing, but rather than just targeting those who are
boxing ready, it also allows you to apply your boxing skills to various
wildlife and creatures that deserve to be wiped off the face of the
earth in a violent manner.

While the gloves function as a lethal pair of boxing gloves, you still
cannot apply the new effects to normal humans. Even against other
boxers, the gloves operate as normal save that you are dealing Brute
damage instead of Stamina. This is NOT Evil Boxing.

Against wildlife, you gain an extra amount of damage and a much faster
punch speed. You also rebuke the targets that you crit, rather than
staggering/knockout. You also do three times the damage against wildlife
when you crit. You also..yell out your attacks. Loudly.

You can get these gloves from tendril chests and from demonic portals. I
replaced the Nuka Cola from the portals with these gloves. You're
welcome.

Megafauna can now be targeted by martial arts. This is really isn't a
major concern, since even if our martial artist had, say, Gloves of the
North Star, the highest damaging martial arts most people could access,
Sleeping Carp, does pathetically small amounts of damage to megafauna.
And you're in melee. And colossi eat you. This shouldn't be a problem.


![image](https://github.com/user-attachments/assets/53f74568-0a87-4d27-a413-b0ee73e6ebcf)

## Why It's Good For The Game

I just really, really, REALLY wanted to punch the absolute SHIT out of
Bubblegum while screaming the whole time, and by god I should be allowed
to do that because that's awesome as fuck.

Adds a very practical but very rare method of applying your athletics to
some very self-contained content. I was tempted to have this
increase/become stronger with mining skill instead of athletics, but I
actually thought it would be funny if miners were taking the time to
work out before heading down to throttle drakes.

## Changelog

<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and its effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->

:cl:
add: Punching mitts! Punch wildlife to death and scream the whole time.
ADVENTURE!
balance: Megafauna can be affected by martial arts.
/:cl:

<!-- Both :cl:'s are required for the changelog to work! You can put
your name to the right of the first :cl: if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->

---------

Co-authored-by: ATH1909 <[email protected]>
Co-authored-by: Jacquerel <[email protected]>
  • Loading branch information
3 people authored Aug 22, 2024
1 parent 3bbbc88 commit 0eb16b4
Show file tree
Hide file tree
Showing 12 changed files with 129 additions and 22 deletions.
3 changes: 2 additions & 1 deletion code/__DEFINES/melee.dm
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
//Martial arts defines

#define MARTIALART_BOXING "boxing"
#define MARTIALART_EVIL_BOXING "evil boxing"
#define MARTIALART_CQC "CQC"
#define MARTIALART_EVIL_BOXING "evil boxing"
#define MARTIALART_HUNTER_BOXING "hunter boxing"
#define MARTIALART_KRAVMAGA "krav maga"
#define MARTIALART_MUSHPUNCH "mushroom punch"
#define MARTIALART_PLASMAFIST "plasma fist"
Expand Down
107 changes: 92 additions & 15 deletions code/datums/martial/boxing.dm
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@
name = "Boxing"
id = MARTIALART_BOXING
pacifist_style = TRUE
///Boolean on whether we are sportsmanlike in our tussling; TRUE means we have restrictions
/// Boolean on whether we are sportsmanlike in our tussling; TRUE means we have restrictions
var/honorable_boxer = TRUE
/// Default damage type for our boxing.
var/default_damage_type = STAMINA
/// 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
Expand Down Expand Up @@ -40,10 +42,16 @@

if(findtext(streak, LEFT_RIGHT_COMBO) || findtext(streak, RIGHT_LEFT_COMBO))
reset_streak()
// If we have an extra effect from the combo, perform it here. By default, we have no extra effect.
perform_extra_effect(attacker, defender)
return combo_multiplier * 1.5

return combo_multiplier

/// An extra effect on some moves and attacks.
/datum/martial_art/boxing/proc/perform_extra_effect(mob/living/attacker, mob/living/defender)
return

/datum/martial_art/boxing/disarm_act(mob/living/attacker, mob/living/defender)
if(honor_check(defender))
add_to_streak("D", defender)
Expand Down Expand Up @@ -88,8 +96,8 @@
// 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()
// What type of damage does our kind of boxing do? Defaults to STAMINA for normal boxing, unless you're performing EVIL BOXING. Subtypes use different damage types.
var/damage_type = honorable_boxer ? default_damage_type : attacker.get_attack_type()

attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH)

Expand Down Expand Up @@ -147,12 +155,12 @@

log_combat(attacker, defender, "punched (boxing) ")

if(defender.stat == DEAD || !honor_check(defender)) //early returning here so we don't worry about knockout probs or experience gain
return TRUE

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)

Expand All @@ -165,6 +173,18 @@
if(!prob(final_knockout_probability))
return TRUE

crit_effect(attacker, defender, armor_block, damage_type, damage)

experience_earned *= 2 //Double our experience gain on a crit hit

playsound(defender, 'sound/effects/coin2.ogg', 40, TRUE)
new /obj/effect/temp_visual/crit(get_turf(defender))
skill_experience_adjustment(attacker, experience_earned) //double experience for a successful crit

return TRUE

/// Our crit effect. For normal boxing, this applies a stagger, then applies a knockout if they're staggered. Other types of boxing apply different kinds of effects.
/datum/martial_art/boxing/proc/crit_effect(mob/living/attacker, mob/living/defender, armor_block = 0, damage_type = STAMINA, damage = 0)
if(defender.get_timed_status_effect_duration(/datum/status_effect/staggered))
defender.visible_message(
span_danger("[attacker] knocks [defender] out with a haymaker!"),
Expand All @@ -189,14 +209,6 @@
to_chat(attacker, span_danger("You stagger [defender] with a haymaker!"))
log_combat(attacker, defender, "staggered (boxing) ")

experience_earned *= 2 //Double our experience gain on a crit hit

playsound(defender, 'sound/effects/coin2.ogg', 40, TRUE)
new /obj/effect/temp_visual/crit(get_turf(defender))
skill_experience_adjustment(attacker, experience_earned) //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)
Expand Down Expand Up @@ -254,8 +266,9 @@
return NONE

if(istype(attacker) && boxer.Adjacent(attacker))
attacker.apply_damage(10, STAMINA)
attacker.apply_damage(10, default_damage_type)
boxer.apply_damage(5, STAMINA)
perform_extra_effect(boxer, attacker)

boxer.visible_message(
span_danger("[boxer] [block_text]s [attack_text]!"),
Expand All @@ -271,6 +284,8 @@
return FALSE
return ..()

// Boxing Variants!

/// 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.

Expand All @@ -281,6 +296,68 @@
honorable_boxer = FALSE
boxing_traits = list(TRAIT_BOXING_READY, TRAIT_STRENGTH, TRAIT_STIMMED)

/// Hunter Boxing: for the uncaring, completely deranged one-spacer ecological disaster.
/// The honor check accepts boxing ready targets, OR various biotypes as valid targets. Uses a special crit effect rather than the standard one (against monsters).
/// I guess technically, this allows for lethal boxing. If you want.
/datum/martial_art/boxing/hunter
name = "Hunter Boxing"
id = MARTIALART_HUNTER_BOXING
pacifist_style = FALSE
default_damage_type = BRUTE
boxing_traits = list(TRAIT_BOXING_READY)
/// The mobs we are looking for to pass the honor check
var/honorable_mob_biotypes = MOB_BEAST | MOB_SPECIAL | MOB_PLANT | MOB_BUG
/// Our crit shout words. First word is then paired with a second word to form an attack name.
var/list/first_word_strike = list("Extinction", "Brutalization", "Explosion", "Adventure", "Thunder", "Lightning", "Sonic", "Atomizing", "Whirlwind", "Tornado", "Shark", "Falcon")
var/list/second_word_strike = list(" Punch", " Pawnch", "-punch", " Jab", " Hook", " Fist", " Uppercut", " Straight", " Strike", " Lunge")

/datum/martial_art/boxing/hunter/honor_check(mob/living/possible_boxer)
if(HAS_TRAIT(possible_boxer, TRAIT_BOXING_READY))
return TRUE

if(possible_boxer.mob_biotypes & MOB_HUMANOID && !istype(possible_boxer, /mob/living/simple_animal/hostile/megafauna)) //We're after animals, not people. Unless they want to box. (Or a megafauna)
return FALSE

if(possible_boxer.mob_biotypes & honorable_mob_biotypes) //We're after animals, not people
return TRUE

return FALSE //rather than default assume TRUE, we default assume FALSE. After all, there could be mobs that are none of our biotypes and also not humanoid. By default, they would be valid for being boxed if TRUE.

// Our hunter boxer applies a rebuke and double damage against the target of their crit. If the target is humanoid, we just perform our regular crit effect instead.

/datum/martial_art/boxing/hunter/crit_effect(mob/living/attacker, mob/living/defender, armor_block = 0, damage_type = STAMINA, damage = 0)
if(defender.mob_biotypes & MOB_HUMANOID && !istype(defender, /mob/living/simple_animal/hostile/megafauna))
return ..() //Applies the regular crit effect if it is a normal human, and not a megafauna

var/first_word_pick = pick(first_word_strike)
var/second_word_pick = pick(second_word_strike)

defender.visible_message(
span_danger("[attacker] knocks the absolute bajeezus out of [defender] utilizing the terrifying [first_word_pick][second_word_pick]!!!"),
span_userdanger("You have the absolute bajeezus knocked out of you by [attacker]!!!"),
span_hear("You hear a sickening sound of flesh hitting flesh!"),
COMBAT_MESSAGE_RANGE,
attacker,
)
to_chat(attacker, span_danger("You knock the absolute bajeezus out of [defender] out with the terrifying [first_word_pick][second_word_pick]!!!"))
if(ishuman(attacker))
var/mob/living/carbon/human/human_attacker = attacker
human_attacker.force_say()
human_attacker.say("[first_word_pick][second_word_pick]!!!", forced = "hunter boxing enthusiastic battlecry")
defender.apply_status_effect(/datum/status_effect/rebuked)
defender.apply_damage(damage * 2, default_damage_type, BODY_ZONE_CHEST, armor_block) //deals double our damage AGAIN
attacker.reagents.add_reagent(/datum/reagent/medicine/omnizine/godblood, 3) //Get a little healing in return for a successful crit
log_combat(attacker, defender, "hunter crit punched (boxing)")

// Our hunter boxer speeds up their attacks when completing a combo against a valid target, and does a sizable amount of extra damage.

/datum/martial_art/boxing/hunter/perform_extra_effect(mob/living/attacker, mob/living/defender)
if(defender.mob_biotypes & MOB_HUMANOID && !istype(defender, /mob/living/simple_animal/hostile/megafauna))
return // Does not apply to humans (who aren't megafauna)

attacker.changeNext_move(CLICK_CD_RAPID)
defender.apply_damage(rand(15,20), default_damage_type, BODY_ZONE_CHEST)

#undef LEFT_RIGHT_COMBO
#undef RIGHT_LEFT_COMBO
#undef LEFT_LEFT_COMBO
Expand Down
3 changes: 2 additions & 1 deletion code/game/objects/structures/icemoon/cave_entrance.dm
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,8 @@ GLOBAL_LIST_INIT(ore_probability, list(
if(16)
new /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/doom(loc)
if(17)
new /obj/item/reagent_containers/cup/glass/drinkingglass/filled/nuka_cola(loc)
new /obj/item/clothing/gloves/fingerless/punch_mitts(loc)
new /obj/item/clothing/head/cowboy(loc)
if(18)
new /obj/item/soulstone/anybody(loc)
if(19)
Expand Down
24 changes: 24 additions & 0 deletions code/modules/clothing/gloves/punch_mitts.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/obj/item/clothing/gloves/fingerless/punch_mitts
name = "punching mitts"
desc = "Fingerless gloves with nasty spikes attached. Allows the wearer to utilize the ill-reputed fighting technique known as Hunter Boxing. The style \
allows the user to punch wildlife rapidly to death. Supposedly, this is an incredible workout, but few people are insane enough to attempt to \
punch every dangerous creature they encounter in the wild to death with their bare hands. Also kinda works against humanoids as well. \
Not that you would... right?"
icon_state = "punch_mitts"
body_parts_covered = HANDS|ARMS
resistance_flags = LAVA_PROOF | FIRE_PROOF
armor_type = /datum/armor/gloves_mitts

/obj/item/clothing/gloves/fingerless/punch_mitts/Initialize(mapload)
. = ..()

AddComponent(/datum/component/martial_art_giver, /datum/martial_art/boxing/hunter)

/datum/armor/gloves_mitts
melee = 25
bullet = 5
laser = 5
energy = 5
bomb = 100
fire = 100
acid = 30
5 changes: 4 additions & 1 deletion code/modules/mining/lavaland/necropolis_chests.dm
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
/obj/structure/closet/crate/necropolis/tendril/attackby(obj/item/item, mob/user, params)
if(!istype(item, /obj/item/skeleton_key) || spawned_loot)
return ..()
var/loot = rand(1,20)
var/loot = rand(1,21)
var/mod
switch(loot)
if(1)
Expand Down Expand Up @@ -71,6 +71,9 @@
new /obj/item/bedsheet/cult(src)
if(20)
new /obj/item/clothing/neck/necklace/memento_mori(src)
if(21)
new /obj/item/clothing/gloves/fingerless/punch_mitts(src)
new /obj/item/clothing/head/cowboy(src)
if(!contents.len)
to_chat(user, span_warning("[src] makes a clunking sound as you try to open it. You feel compelled to let the gods know! (Please open an adminhelp and try again!)"))
CRASH("Failed to generate loot. loot number: [loot][mod ? "subloot: [mod]" : null]")
Expand Down
2 changes: 1 addition & 1 deletion code/modules/mob/living/basic/lavaland/legion/legion.dm
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
icon_living = "legion"
icon_dead = "legion"
icon_gib = "syndicate_gib"
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
mob_biotypes = MOB_ORGANIC|MOB_SPECIAL|MOB_UNDEAD
basic_mob_flags = DEL_ON_DEATH
speed = 3
maxHealth = 75
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@
if(gps_name && true_spawn)
AddComponent(/datum/component/gps, gps_name)
ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
add_traits(list(TRAIT_NO_TELEPORT, TRAIT_MARTIAL_ARTS_IMMUNE), MEGAFAUNA_TRAIT)
add_traits(list(TRAIT_NO_TELEPORT), MEGAFAUNA_TRAIT)
grant_actions_by_list(attack_action_types)

/mob/living/simple_animal/hostile/megafauna/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ Difficulty: Medium
icon_living = "miner"
icon = 'icons/mob/simple/broadMobs.dmi'
health_doll_icon = "miner"
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_SPECIAL
light_color = COLOR_LIGHT_GRAYISH_RED
speak_emote = list("roars")
speed = 3
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Difficulty: Extremely Hard
attack_verb_continuous = "pummels"
attack_verb_simple = "pummels"
attack_sound = 'sound/weapons/sonic_jackhammer.ogg'
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_SPECIAL
light_color = COLOR_LIGHT_GRAYISH_RED
movement_type = GROUND
weather_immunities = list(TRAIT_SNOWSTORM_IMMUNE)
Expand Down
Binary file modified icons/mob/clothing/hands.dmi
Binary file not shown.
Binary file modified icons/obj/clothing/gloves.dmi
Binary file not shown.
1 change: 1 addition & 0 deletions tgstation.dme
Original file line number Diff line number Diff line change
Expand Up @@ -3867,6 +3867,7 @@
#include "code\modules\clothing\gloves\costume.dm"
#include "code\modules\clothing\gloves\insulated.dm"
#include "code\modules\clothing\gloves\plasmaman.dm"
#include "code\modules\clothing\gloves\punch_mitts.dm"
#include "code\modules\clothing\gloves\special.dm"
#include "code\modules\clothing\gloves\tacklers.dm"
#include "code\modules\clothing\head\_head.dm"
Expand Down

0 comments on commit 0eb16b4

Please sign in to comment.