From d06d8f6db633c3c7ff6d504b1fdf9cc5a48335cd Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 13 Aug 2020 05:24:25 +0200 Subject: [PATCH] [MIRROR] Floored trait (#329) * Floored trait (#52884) Refactors mobility, so we respond to more things as events. One has_legs and has_arms are turned into events we'll be close to be able to eschew update_mobility() * Floored trait Co-authored-by: Rohesie --- code/__DEFINES/traits.dm | 3 ++- code/datums/status_effects/debuffs.dm | 17 +++++++++++++++++ code/game/atoms_movable.dm | 2 ++ code/modules/mob/living/living.dm | 12 ++++++++---- 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 60153034da0..080559a25f7 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -78,6 +78,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai //mob traits #define TRAIT_KNOCKEDOUT "knockedout" //Forces the user to stay unconscious. #define TRAIT_IMMOBILIZED "immobilized" //Prevents voluntary movement. +#define TRAIT_FLOORED "floored" //Prevents standing or staying up on its own. #define TRAIT_INCAPACITATED "incapacitated" #define TRAIT_BLIND "blind" #define TRAIT_MUTE "mute" @@ -246,7 +247,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai // common trait sources #define TRAIT_GENERIC "generic" #define GENERIC_ITEM_TRAIT "generic_item" -#define UNCONSCIOUS_BLIND "unconscious_blind" +#define UNCONSCIOUS_TRAIT "unconscious" #define EYE_DAMAGE "eye_damage" #define EAR_DAMAGE "ear_damage" #define GENETIC_MUTATION "genetic" diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 3a13359f572..e1ff728cac9 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -24,6 +24,7 @@ owner.update_stat() return ..() + //STUN /datum/status_effect/incapacitating/stun id = "stun" @@ -40,10 +41,21 @@ REMOVE_TRAIT(owner, TRAIT_IMMOBILIZED, TRAIT_STATUS_EFFECT(id)) return ..() + //KNOCKDOWN /datum/status_effect/incapacitating/knockdown id = "knockdown" +/datum/status_effect/incapacitating/knockdown/on_apply() + . = ..() + if(!.) + return + ADD_TRAIT(owner, TRAIT_FLOORED, TRAIT_STATUS_EFFECT(id)) + +/datum/status_effect/incapacitating/knockdown/on_remove() + REMOVE_TRAIT(owner, TRAIT_FLOORED, TRAIT_STATUS_EFFECT(id)) + return ..() + //IMMOBILIZED /datum/status_effect/incapacitating/immobilized @@ -60,6 +72,7 @@ return ..() +//PARALYZED /datum/status_effect/incapacitating/paralyzed id = "paralyzed" @@ -69,12 +82,15 @@ return ADD_TRAIT(owner, TRAIT_INCAPACITATED, TRAIT_STATUS_EFFECT(id)) ADD_TRAIT(owner, TRAIT_IMMOBILIZED, TRAIT_STATUS_EFFECT(id)) + ADD_TRAIT(owner, TRAIT_FLOORED, TRAIT_STATUS_EFFECT(id)) /datum/status_effect/incapacitating/paralyzed/on_remove() REMOVE_TRAIT(owner, TRAIT_INCAPACITATED, TRAIT_STATUS_EFFECT(id)) REMOVE_TRAIT(owner, TRAIT_IMMOBILIZED, TRAIT_STATUS_EFFECT(id)) + REMOVE_TRAIT(owner, TRAIT_FLOORED, TRAIT_STATUS_EFFECT(id)) return ..() + //UNCONSCIOUS /datum/status_effect/incapacitating/unconscious id = "unconscious" @@ -94,6 +110,7 @@ if(owner.getStaminaLoss()) owner.adjustStaminaLoss(-0.3) //reduce stamina loss by 0.3 per tick, 6 per 2 seconds + //SLEEPING /datum/status_effect/incapacitating/sleeping id = "sleeping" diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 74eb31fa938..448e37312e3 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -995,10 +995,12 @@ if(GRAB_PASSIVE, GRAB_AGGRESSIVE) if(grab_state >= GRAB_NECK) ADD_TRAIT(pulling, TRAIT_IMMOBILIZED, CHOKEHOLD_TRAIT) + ADD_TRAIT(pulling, TRAIT_FLOORED, CHOKEHOLD_TRAIT) switch(grab_state) //Current state. if(GRAB_PASSIVE, GRAB_AGGRESSIVE) if(. >= GRAB_NECK) REMOVE_TRAIT(pulling, TRAIT_IMMOBILIZED, CHOKEHOLD_TRAIT) + REMOVE_TRAIT(pulling, TRAIT_FLOORED, CHOKEHOLD_TRAIT) /obj/item/proc/do_pickup_animation(atom/target) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 204847e54f5..624d6222843 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1204,14 +1204,13 @@ var/has_legs = get_num_legs() var/has_arms = get_num_arms() var/paralyzed = IsParalyzed() - var/knockdown = IsKnockdown() var/ignore_legs = get_leg_ignore() var/canmove = !HAS_TRAIT(src, TRAIT_IMMOBILIZED) && (has_arms || ignore_legs || has_legs) if(canmove) mobility_flags |= MOBILITY_MOVE else mobility_flags &= ~MOBILITY_MOVE - var/canstand_involuntary = stat_conscious && !stat_softcrit && !knockdown && !chokehold && !paralyzed && (ignore_legs || has_legs) && !(buckled && buckled.buckle_lying) + var/canstand_involuntary = !HAS_TRAIT(src, TRAIT_FLOORED) && (ignore_legs || has_legs) var/canstand = canstand_involuntary && !resting if(buckled && buckled.buckle_lying != -1) @@ -1636,24 +1635,26 @@ if(CONSCIOUS) if(stat >= UNCONSCIOUS) ADD_TRAIT(src, TRAIT_IMMOBILIZED, TRAIT_KNOCKEDOUT) + ADD_TRAIT(src, TRAIT_FLOORED, UNCONSCIOUS_TRAIT) if(SOFT_CRIT) if(stat >= UNCONSCIOUS) ADD_TRAIT(src, TRAIT_IMMOBILIZED, TRAIT_KNOCKEDOUT) //adding trait sources should come before removing to avoid unnecessary updates if(pulledby) REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, PULLED_WHILE_SOFTCRIT_TRAIT) if(UNCONSCIOUS) - cure_blind(UNCONSCIOUS_BLIND) + cure_blind(UNCONSCIOUS_TRAIT) switch(stat) //Current stat. if(CONSCIOUS) if(. >= UNCONSCIOUS) REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, TRAIT_KNOCKEDOUT) + REMOVE_TRAIT(src, TRAIT_FLOORED, UNCONSCIOUS_TRAIT) if(SOFT_CRIT) if(pulledby) ADD_TRAIT(src, TRAIT_IMMOBILIZED, PULLED_WHILE_SOFTCRIT_TRAIT) //adding trait sources should come before removing to avoid unnecessary updates if(. >= UNCONSCIOUS) REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, TRAIT_KNOCKEDOUT) if(UNCONSCIOUS) - become_blind(UNCONSCIOUS_BLIND) + become_blind(UNCONSCIOUS_TRAIT) ///Reports the event of the change in value of the buckled variable. @@ -1666,8 +1667,11 @@ if(buckled) if(!.) ADD_TRAIT(src, TRAIT_IMMOBILIZED, BUCKLED_TRAIT) + if(buckled.buckle_lying) + ADD_TRAIT(src, TRAIT_FLOORED, BUCKLED_TRAIT) else if(.) REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, BUCKLED_TRAIT) + REMOVE_TRAIT(src, TRAIT_FLOORED, BUCKLED_TRAIT) /mob/living/set_pulledby(new_pulledby)