From 06f5ce64012cc278874d1111b3e8110e9779a016 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 2 Aug 2020 09:30:09 -0700 Subject: [PATCH] buffs shoving (#12925) * ^w^ * ok * ok --- code/__DEFINES/combat.dm | 7 ++++--- code/__DEFINES/movespeed_modification.dm | 1 - code/__DEFINES/status_effects.dm | 3 +++ code/datums/status_effects/debuffs.dm | 15 +++++++++++++++ code/modules/clothing/shoes/_shoes.dm | 6 ++---- code/modules/mob/living/carbon/human/human.dm | 6 ------ code/modules/mob/living/carbon/human/species.dm | 6 +++--- code/modules/mob/living/status_procs.dm | 9 +++++++++ code/modules/movespeed/modifiers/mobs.dm | 3 --- code/modules/recycling/disposal/bin.dm | 1 - 10 files changed, 36 insertions(+), 21 deletions(-) diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 1bf9b01403..6a60768875 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -154,9 +154,10 @@ #define SHOVE_KNOCKDOWN_HUMAN 30 #define SHOVE_KNOCKDOWN_TABLE 30 #define SHOVE_KNOCKDOWN_COLLATERAL 10 -//for the shove slowdown, see __DEFINES/movespeed_modification.dm -#define SHOVE_SLOWDOWN_LENGTH 30 -#define SHOVE_SLOWDOWN_STRENGTH 0.85 //multiplier +/// how long they're staggered for +#define SHOVE_STAGGER_DURATION 35 +/// how long they're off balance for +#define SHOVE_OFFBALANCE_DURATION 30 //Shove disarming item list GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( /obj/item/gun))) diff --git a/code/__DEFINES/movespeed_modification.dm b/code/__DEFINES/movespeed_modification.dm index 699f39e79f..5e7d0a2cca 100644 --- a/code/__DEFINES/movespeed_modification.dm +++ b/code/__DEFINES/movespeed_modification.dm @@ -63,7 +63,6 @@ #define MOVESPEED_ID_TASED_STATUS "TASED" #define MOVESPEED_ID_ELECTROSTAFF "ELECTROSTAFF" -#define MOVESPEED_ID_SHOVE "SHOVE" #define MOVESPEED_ID_FAT "FAT" #define MOVESPEED_ID_COLD "COLD" #define MOVESPEED_ID_HUNGRY "HUNGRY" diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 14cc7c9e5e..9a3b5d55f4 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -111,6 +111,9 @@ #define STATUS_EFFECT_LIMP /datum/status_effect/limp //For when you have a busted leg (or two!) and want additional slowdown when walking on that leg +/// shoves inflict this to indicate the next shove while this is in effect should disarm guns +#define STATUS_EFFECT_OFF_BALANCE /datum/status_effect/off_balance + ///////////// // NEUTRAL // ///////////// diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index aa27c6424e..407047410b 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -97,6 +97,21 @@ duration = set_duration return ..() +/datum/status_effect/off_balance + id = "offbalance" + alert_type = null + +/datum/status_effect/off_balance/on_creation(mob/living/new_owner, set_duration) + if(isnum(set_duration)) + duration = set_duration + return ..() + +/datum/status_effect/off_balance/on_remove() + var/active_item = owner.get_active_held_item() + if(is_type_in_typecache(active_item, GLOB.shove_disarming_types)) + owner.visible_message("[owner.name] regains their grip on \the [active_item]!", "You regain your grip on \the [active_item]", null, COMBAT_MESSAGE_RANGE) + return ..() + /obj/screen/alert/status_effect/asleep name = "Asleep" desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are." diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 746bd3458a..49256b490d 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -257,10 +257,8 @@ if(14 to 25) // 1.3ish% chance to stumble and be a bit off balance (like being disarmed) to_chat(our_guy, "You stumble a bit on your untied shoelaces!") - if(!our_guy.has_movespeed_modifier(/datum/movespeed_modifier/shove)) - our_guy.add_movespeed_modifier(/datum/movespeed_modifier/shove) - addtimer(CALLBACK(our_guy, /mob/living/carbon/human/proc/clear_shove_slowdown), SHOVE_SLOWDOWN_LENGTH) - + our_guy.ShoveOffBalance(SHOVE_OFFBALANCE_DURATION) + our_guy.Stagger(SHOVE_OFFBALANCE_DURATION) //yes, same. if(26 to 1000) wiser = FALSE if(wiser) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 145db1be1e..b402260611 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1040,12 +1040,6 @@ return TRUE return FALSE -/mob/living/carbon/human/proc/clear_shove_slowdown() - remove_movespeed_modifier(/datum/movespeed_modifier/shove) - var/active_item = get_active_held_item() - if(is_type_in_typecache(active_item, GLOB.shove_disarming_types)) - visible_message("[src.name] regains their grip on \the [active_item]!", "You regain your grip on \the [active_item]", null, COMBAT_MESSAGE_RANGE) - /mob/living/carbon/human/updatehealth() . = ..() diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 430227a39c..59c7c39e35 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1942,11 +1942,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) target.visible_message("[user.name] shoves [target.name]!", "[user.name] shoves you!", null, COMBAT_MESSAGE_RANGE, null, user, "You shove [target.name]!") + target.Stagger(SHOVE_STAGGER_DURATION) var/obj/item/target_held_item = target.get_active_held_item() if(!is_type_in_typecache(target_held_item, GLOB.shove_disarming_types)) target_held_item = null - if(!target.has_movespeed_modifier(/datum/movespeed_modifier/shove)) - target.add_movespeed_modifier(/datum/movespeed_modifier/shove) + if(!target.has_status_effect(STATUS_EFFECT_OFF_BALANCE)) if(target_held_item) if(!HAS_TRAIT(target_held_item, TRAIT_NODROP)) target.visible_message("[target.name]'s grip on \the [target_held_item] loosens!", @@ -1954,12 +1954,12 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) append_message += ", loosening their grip on [target_held_item]" else append_message += ", but couldn't loose their grip on [target_held_item]" - addtimer(CALLBACK(target, /mob/living/carbon/human/proc/clear_shove_slowdown), SHOVE_SLOWDOWN_LENGTH) else if(target_held_item) if(target.dropItemToGround(target_held_item)) target.visible_message("[target.name] drops \the [target_held_item]!!", "You drop \the [target_held_item]!!", null, COMBAT_MESSAGE_RANGE) append_message += ", causing them to drop [target_held_item]" + target.ShoveOffBalance(SHOVE_OFFBALANCE_DURATION) log_combat(user, target, "shoved", append_message) /datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = FALSE) diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 0029300936..87fd0cf609 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -500,6 +500,15 @@ S = apply_status_effect(STATUS_EFFECT_SLEEPING, amount, updating) return S +///////////////////////////////// OFF BALANCE/SHOVIES //////////////////////// +/mob/living/proc/ShoveOffBalance(amount) + var/datum/status_effect/off_balance/B = has_status_effect(STATUS_EFFECT_OFF_BALANCE) + if(B) + B.duration = max(world.time + amount, B.duration) + else if(amount > 0) + B = apply_status_effect(STATUS_EFFECT_OFF_BALANCE, amount) + return B + ///////////////////////////////// FROZEN ///////////////////////////////////// /mob/living/proc/IsFrozen() diff --git a/code/modules/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm index a2176ca95e..d17767bb1f 100644 --- a/code/modules/movespeed/modifiers/mobs.dm +++ b/code/modules/movespeed/modifiers/mobs.dm @@ -78,9 +78,6 @@ blacklisted_movetypes = FLOATING variable = TRUE -/datum/movespeed_modifier/shove - multiplicative_slowdown = SHOVE_SLOWDOWN_STRENGTH - /datum/movespeed_modifier/human_carry variable = TRUE diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 64fe786219..ba4870903e 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -375,7 +375,6 @@ log_combat(user, target, "shoved", "into [src] (disposal bin)") return TRUE - /obj/machinery/disposal/bin/flush() ..() full_pressure = FALSE