[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 <rohesie@gmail.com>
This commit is contained in:
SkyratBot
2020-08-13 05:24:25 +02:00
committed by GitHub
co-authored by Rohesie
parent e3aa9e933b
commit d06d8f6db6
4 changed files with 29 additions and 5 deletions
+2 -1
View File
@@ -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"
+17
View File
@@ -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"
+2
View File
@@ -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)
+8 -4
View File
@@ -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)