Adds taunting as a replacement for spin/flip in style meter and parrying (#85605)

## About The Pull Request

Replaces spin/flip's uses in mining's style meter and bitrunner's
projectile parrying and instead uses a new emote, taunt. It also does
not play a sound effect for emoting, only when you successfully block a
projectile.

The parrying time from the flip was 1.4 seconds, with taunting it is now
0.9 seconds. Taunting also has a cooldown of 1.5 seconds between uses.

https://www.youtube.com/watch?v=cJGuEqNhqUs


https://github.com/user-attachments/assets/1c6bf8b2-6a0d-4ae2-9b5b-9c6e619e76d6

## Why It's Good For The Game

Spin and flip are emotes that get a little boring and repetitive, which
makes its complete overuse quite annoying to see.
Compared to spin, taunting is a quick turn, which stacked with the
cooldown, makes it a shorter and un-overusable emote.

It also has a cooldown of 1.5s between hits, so players now actually
have a limit to how much they can parry/style. Currently if you have
some way to regenerate stamina damage, you're pretty set to spam parry
all projectiles at essentially no cost, since emotes cost nothing to
use, removing the limit of having to actually time it.
I wouldnt say falling over is necessarily a downside since anyone who
uses these items for a while can quickly figure out exactly hwo to
maximize parrying time.

## Changelog

🆑
add: Added Taunting, a faster and cooldowned version of the Spin emote.
balance: Wizards blocking projectiles with Transparence and the
bitrunner matrix skillchip now have a visible effect of deflecting the
projectile.
balance: The bitrunner skillchip now uses taunt instead of flip.
balance: The style meter now uses taunting instead of flips and spins.
/🆑
This commit is contained in:
John Willard
2024-08-19 01:05:56 +00:00
committed by GitHub
parent db8a44e322
commit b6d3e114da
15 changed files with 85 additions and 64 deletions
+2
View File
@@ -974,6 +974,8 @@ GLOBAL_LIST_INIT(layers_to_offset, list(
/// The duration of the flip emote animation
#define FLIP_EMOTE_DURATION 0.7 SECONDS
///The duration of a taunt emote, so how long they can deflect projectiles
#define TAUNT_EMOTE_DURATION 0.9 SECONDS
// Sprites for photocopying butts
#define BUTT_SPRITE_HUMAN_MALE "human_male"
+2 -2
View File
@@ -362,8 +362,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_GUNFLIP "gunflip"
/// Increases chance of getting special traumas, makes them harder to cure
#define TRAIT_SPECIAL_TRAUMA_BOOST "special_trauma_boost"
/// Doubles the duration and cooldown of a flip
#define TRAIT_SLOW_FLIP "slow_flip"
#define TRAIT_SPACEWALK "spacewalk"
/// Sanity trait to keep track of when we're in hyperspace and add the appropriate element if we werent
#define TRAIT_HYPERSPACED "hyperspaced"
@@ -677,6 +675,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// This movable atom has the explosive block element
#define TRAIT_BLOCKING_EXPLOSIVES "blocking_explosives"
///This mob is currently blocking a projectile.
#define TRAIT_BLOCKING_PROJECTILES "blocking_projectiles"
/// This turf contains something using split visiblity
#define TRAIT_CONTAINS_SPLITVIS "contains_splitvis"
+2 -1
View File
@@ -45,7 +45,8 @@
/// Trait given by an Action datum
#define ACTION_TRAIT "action"
///A trait given by someone blocking.
#define BLOCKING_TRAIT "blocking"
#define CLOTHING_TRAIT "clothing"
#define HELMET_TRAIT "helmet"
/// inherited from the mask
+1 -1
View File
@@ -150,6 +150,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_BIRTHDAY_BOY" = TRAIT_BIRTHDAY_BOY,
"TRAIT_BLOB_ALLY" = TRAIT_BLOB_ALLY,
"TRAIT_BLOCK_SHUTTLE_MOVEMENT" = TRAIT_BLOCK_SHUTTLE_MOVEMENT,
"TRAIT_BLOCKING_PROJECTILES" = TRAIT_BLOCKING_PROJECTILES,
"TRAIT_BLOOD_CLANS" = TRAIT_BLOOD_CLANS,
"TRAIT_BLOODSHOT_EYES" = TRAIT_BLOODSHOT_EYES,
"TRAIT_BLOODY_MESS" = TRAIT_BLOODY_MESS,
@@ -451,7 +452,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE,
"TRAIT_SKITTISH" = TRAIT_SKITTISH,
"TRAIT_SLEEPIMMUNE" = TRAIT_SLEEPIMMUNE,
"TRAIT_SLOW_FLIP" = TRAIT_SLOW_FLIP,
"TRAIT_SMOKER" = TRAIT_SMOKER,
"TRAIT_SNEAK" = TRAIT_SNEAK,
"TRAIT_SNOB" = TRAIT_SNOB,
-1
View File
@@ -259,7 +259,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE,
"TRAIT_SKITTISH" = TRAIT_SKITTISH,
"TRAIT_SLEEPIMMUNE" = TRAIT_SLEEPIMMUNE,
"TRAIT_SLOW_FLIP" = TRAIT_SLOW_FLIP,
"TRAIT_SMOKER" = TRAIT_SMOKER,
"TRAIT_SNOB" = TRAIT_SNOB,
"TRAIT_SOFTSPOKEN" = TRAIT_SOFTSPOKEN,
+3 -11
View File
@@ -98,8 +98,7 @@
RegisterSignal(parent, COMSIG_USER_ITEM_INTERACTION, PROC_REF(hotswap))
RegisterSignal(parent, COMSIG_MOB_MINED, PROC_REF(on_mine))
RegisterSignal(parent, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_take_damage))
RegisterSignal(parent, COMSIG_MOB_EMOTED("flip"), PROC_REF(on_flip))
RegisterSignal(parent, COMSIG_MOB_EMOTED("spin"), PROC_REF(on_spin))
RegisterSignal(parent, COMSIG_MOB_EMOTED("taunt"), PROC_REF(on_taunt))
RegisterSignal(parent, COMSIG_MOB_ITEM_ATTACK, PROC_REF(on_attack))
RegisterSignal(parent, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(on_punch))
RegisterSignal(SSdcs, COMSIG_GLOB_MOB_DEATH, PROC_REF(on_death))
@@ -114,7 +113,7 @@
UnregisterSignal(parent, COMSIG_USER_ITEM_INTERACTION)
UnregisterSignal(parent, COMSIG_MOB_MINED)
UnregisterSignal(parent, COMSIG_MOB_APPLY_DAMAGE)
UnregisterSignal(parent, list(COMSIG_MOB_EMOTED("flip"), COMSIG_MOB_EMOTED("spin")))
UnregisterSignal(parent, COMSIG_MOB_EMOTED("taunt"))
UnregisterSignal(parent, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_LIVING_UNARMED_ATTACK))
UnregisterSignal(SSdcs, COMSIG_GLOB_MOB_DEATH)
UnregisterSignal(parent, COMSIG_LIVING_RESONATOR_BURST)
@@ -407,19 +406,12 @@
// Emote-based multipliers
/datum/component/style/proc/on_flip()
/datum/component/style/proc/on_taunt()
SIGNAL_HANDLER
point_multiplier = round(min(point_multiplier + 0.5, 3), 0.1)
update_screen()
/datum/component/style/proc/on_spin()
SIGNAL_HANDLER
point_multiplier = round(min(point_multiplier + 0.3, 3), 0.1)
update_screen()
// Negative effects
/datum/component/style/proc/on_take_damage(...)
SIGNAL_HANDLER
+1 -1
View File
@@ -32,7 +32,7 @@
desc = "This disk contains a program that lets you shapeshift into a lesser ashdrake, or a polar bear."
/datum/orderable_item/bitrunning_tech/flip_skillchip
item_path = /obj/item/skillchip/matrix_flip
item_path = /obj/item/skillchip/matrix_taunt
cost_per_order = 2000
/datum/orderable_item/bitrunning_tech/pka_mod
@@ -1,40 +0,0 @@
#define FLIP_STAMINA_COST 19
/obj/item/skillchip/matrix_flip
name = "BULLET_DODGER skillchip"
skill_name = "Flip 2 Dodge"
skill_description = "At the cost of stamina, your flips can also be used to dodge incoming projectiles."
skill_icon = FA_ICON_SPINNER
activate_message = span_notice("You feel the urge to flip scenically as if you are the 'Chosen One'.")
deactivate_message = span_notice("The urge to flip goes away.")
/obj/item/skillchip/matrix_flip/on_activate(mob/living/carbon/user, silent = FALSE)
. = ..()
ADD_TRAIT(user, TRAIT_SLOW_FLIP, SKILLCHIP_TRAIT)
RegisterSignal(user, COMSIG_MOB_EMOTED("flip"), PROC_REF(on_flip))
RegisterSignal(user, COMSIG_MOB_PRE_EMOTED, PROC_REF(check_if_we_can_flip))
/obj/item/skillchip/matrix_flip/on_deactivate(mob/living/carbon/user, silent=FALSE)
REMOVE_TRAIT(user, TRAIT_SLOW_FLIP, SKILLCHIP_TRAIT)
UnregisterSignal(user, list(COMSIG_MOB_EMOTED("flip"), COMSIG_MOB_PRE_EMOTED))
return ..()
///Prevent players from stamcritting from INTENTIONAL flips. 1.4s of bullet immunity isn't worth several secs of stun.
/obj/item/skillchip/matrix_flip/proc/check_if_we_can_flip(mob/living/source, key, params, type_override, intentional, datum/emote/emote)
SIGNAL_HANDLER
if(key != "flip" || !intentional)
return
if((source.maxHealth - (source.getStaminaLoss() + FLIP_STAMINA_COST)) <= source.crit_threshold)
source.balloon_alert(source, "too tired!")
return COMPONENT_CANT_EMOTE
/obj/item/skillchip/matrix_flip/proc/on_flip(mob/living/source)
SIGNAL_HANDLER
if(HAS_TRAIT_FROM(source, TRAIT_UNHITTABLE_BY_PROJECTILES, SKILLCHIP_TRAIT))
return
playsound(source, 'sound/weapons/fwoosh.ogg', 90, FALSE, frequency = 0.7)
ADD_TRAIT(source, TRAIT_UNHITTABLE_BY_PROJECTILES, SKILLCHIP_TRAIT)
source.adjustStaminaLoss(FLIP_STAMINA_COST)
addtimer(TRAIT_CALLBACK_REMOVE(source, TRAIT_UNHITTABLE_BY_PROJECTILES, SKILLCHIP_TRAIT), FLIP_EMOTE_DURATION * 2)
#undef FLIP_STAMINA_COST
@@ -0,0 +1,37 @@
#define TAUNT_STAMINA_COST 19
/obj/item/skillchip/matrix_taunt
name = "BULLET_DODGER skillchip"
skill_name = "Taunt 2 Dodge"
skill_description = "At the cost of stamina, your taunts can also be used to dodge incoming projectiles."
skill_icon = FA_ICON_SPINNER
activate_message = span_notice("You feel the urge to taunt scenically as if you are the 'Chosen One'.")
deactivate_message = span_notice("The urge to taunt goes away.")
/obj/item/skillchip/matrix_taunt/on_activate(mob/living/carbon/user, silent = FALSE)
. = ..()
RegisterSignal(user, COMSIG_MOB_EMOTED("taunt"), PROC_REF(on_taunt))
RegisterSignal(user, COMSIG_MOB_PRE_EMOTED, PROC_REF(check_if_we_can_taunt))
/obj/item/skillchip/matrix_taunt/on_deactivate(mob/living/carbon/user, silent=FALSE)
UnregisterSignal(user, list(COMSIG_MOB_EMOTED("taunt"), COMSIG_MOB_PRE_EMOTED))
return ..()
///Prevent players from stamcritting from INTENTIONAL flips. 1.4s of bullet immunity isn't worth several secs of stun.
/obj/item/skillchip/matrix_taunt/proc/check_if_we_can_taunt(mob/living/source, key, params, type_override, intentional, datum/emote/emote)
SIGNAL_HANDLER
if(key != "taunt" || !intentional)
return
if((source.maxHealth - (source.getStaminaLoss() + TAUNT_STAMINA_COST)) <= source.crit_threshold)
source.balloon_alert(source, "too tired!")
return COMPONENT_CANT_EMOTE
/obj/item/skillchip/matrix_taunt/proc/on_taunt(mob/living/source)
SIGNAL_HANDLER
if(HAS_TRAIT_FROM(source, TRAIT_UNHITTABLE_BY_PROJECTILES, SKILLCHIP_TRAIT))
return
ADD_TRAIT(source, TRAIT_UNHITTABLE_BY_PROJECTILES, SKILLCHIP_TRAIT)
source.adjustStaminaLoss(TAUNT_STAMINA_COST)
addtimer(TRAIT_CALLBACK_REMOVE(source, TRAIT_UNHITTABLE_BY_PROJECTILES, SKILLCHIP_TRAIT), TAUNT_EMOTE_DURATION * 1.5)
#undef TAUNT_STAMINA_COST
+1 -6
View File
@@ -83,15 +83,10 @@
/datum/emote/flip/run_emote(mob/user, params , type_override, intentional)
. = ..()
user.SpinAnimation(HAS_TRAIT(user, TRAIT_SLOW_FLIP) ? FLIP_EMOTE_DURATION * 2 : FLIP_EMOTE_DURATION, 1)
user.SpinAnimation(FLIP_EMOTE_DURATION, 1)
/datum/emote/flip/check_cooldown(mob/user, intentional)
var/slow_flipper = HAS_TRAIT(user, TRAIT_SLOW_FLIP)
if(slow_flipper)
cooldown *= 2
. = ..()
if(slow_flipper)
cooldown *= 0.5
if(.)
return
if(!can_run_emote(user, intentional=intentional))
+10
View File
@@ -4,6 +4,16 @@
mob_type_allowed_typecache = /mob/living
mob_type_blacklist_typecache = list(/mob/living/brain)
/datum/emote/living/taunt
key = "taunt"
key_third_person = "taunts"
message = "taunts!"
cooldown = 1.6 SECONDS //note when changing this- this is used by the matrix taunt to block projectiles.
/datum/emote/living/taunt/run_emote(mob/living/user, params, type_override, intentional)
. = ..()
user.spin(TAUNT_EMOTE_DURATION, 0.1 SECONDS)
/datum/emote/living/blush
key = "blush"
key_third_person = "blushes"
+22
View File
@@ -2824,3 +2824,25 @@ GLOBAL_LIST_EMPTY(fire_appearances)
return "[span_notice("You'd estimate [p_their()] fitness level at about...")] [span_boldwarning("What?!? [our_fitness_level]???")]"
return span_notice("You'd estimate [p_their()] fitness level at about [our_fitness_level]. [comparative_fitness <= 0.33 ? "Pathetic." : ""]")
///Performs the aftereffects of blocking a projectile.
/mob/living/proc/block_projectile_effects()
var/static/list/icon/blocking_overlay
if(isnull(blocking_overlay))
blocking_overlay = list(
mutable_appearance('icons/mob/effects/blocking.dmi', "wow"),
mutable_appearance('icons/mob/effects/blocking.dmi', "nice"),
mutable_appearance('icons/mob/effects/blocking.dmi', "good"),
)
ADD_TRAIT(src, TRAIT_BLOCKING_PROJECTILES, BLOCKING_TRAIT)
var/icon/selected_overlay = pick(blocking_overlay)
add_overlay(selected_overlay)
playsound(src, 'sound/weapons/fwoosh.ogg', 90, FALSE, frequency = 0.7)
update_transform(1.25)
addtimer(CALLBACK(src, PROC_REF(end_block_effects), selected_overlay), 0.6 SECONDS)
///Remoevs the effects of blocking a projectile and allows the user to block another.
/mob/living/proc/end_block_effects(selected_overlay)
REMOVE_TRAIT(src, TRAIT_BLOCKING_PROJECTILES, BLOCKING_TRAIT)
cut_overlay(selected_overlay)
update_transform(0.8)
+3
View File
@@ -571,6 +571,9 @@
if((target.pass_flags_self & pass_flags) && !direct_target)
return FALSE
if(HAS_TRAIT(target, TRAIT_UNHITTABLE_BY_PROJECTILES))
if(!HAS_TRAIT(target, TRAIT_BLOCKING_PROJECTILES) && isliving(target))
var/mob/living/living_target = target
living_target.block_projectile_effects()
return FALSE
if(!ignore_source_check && firer)
var/mob/M = firer
Binary file not shown.

After

Width:  |  Height:  |  Size: 815 B

+1 -1
View File
@@ -4484,7 +4484,7 @@
#include "code\modules\library\random_books.dm"
#include "code\modules\library\skill_learning\skill_station.dm"
#include "code\modules\library\skill_learning\skillchip.dm"
#include "code\modules\library\skill_learning\generic_skillchips\matrix_flip.dm"
#include "code\modules\library\skill_learning\generic_skillchips\matrix_taunt.dm"
#include "code\modules\library\skill_learning\generic_skillchips\point.dm"
#include "code\modules\library\skill_learning\generic_skillchips\rod_suplex.dm"
#include "code\modules\library\skill_learning\job_skillchips\_job.dm"