diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index eb07d5d2a9f..90116e971fd 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -19,13 +19,15 @@ #define SHAME (1<<4) #define MANUAL_SUICIDE (1<<5) //suicide_act will do the actual killing. -#define EFFECT_STUN "stun" -#define EFFECT_KNOCKDOWN "knockdown" +#define EFFECT_STUN "stun" +#define EFFECT_KNOCKDOWN "knockdown" #define EFFECT_UNCONSCIOUS "unconscious" +#define EFFECT_PARALYZE "paralyze" +#define EFFECT_IMMOBILIZE "immobilize" #define EFFECT_IRRADIATE "irradiate" #define EFFECT_STUTTER "stutter" #define EFFECT_SLUR "slur" -#define EFFECT_EYE_BLUR "eye_blur" +#define EFFECT_EYE_BLUR "eye_blur" #define EFFECT_DROWSY "drowsy" #define EFFECT_JITTER "jitter" @@ -63,8 +65,10 @@ #define GRAB_NECK 2 #define GRAB_KILL 3 -//slowdown when in softcrit -#define SOFTCRIT_ADD_SLOWDOWN 6 +//slowdown when in softcrit. Note that crawling slowdown will also apply at the same time! +#define SOFTCRIT_ADD_SLOWDOWN 4 +//slowdown when crawling +#define CRAWLING_ADD_SLOWDOWN 2 //Attack types for checking shields/hit reactions #define MELEE_ATTACK 1 diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 58257cd974b..b755c239a20 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -141,6 +141,15 @@ #define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" //from base of mob/living/electrocute_act(): (shock_damage) #define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: () +//ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS! +#define COMSIG_LIVING_STATUS_STUN "living_stun" //from base of mob/living/Stun() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_KNOCKDOWN "living_knockdown" //from base of mob/living/Knockdown() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_PARALYZE "living_paralyze" //from base of mob/living/Paralyze() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_IMMOBILIZE "living_immobilize" //from base of mob/living/Immobilize() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_UNCONSCIOUS "living_unconscious" //from base of mob/living/Unconscious() (amount, update, ignore) +#define COMSIG_LIVING_STATUS_SLEEP "living_sleeping" //from base of mob/living/Sleeping() (amount, update, ignore) + #define COMPONENT_NO_STUN 1 //For all of them + // /mob/living/carbon signals #define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity)) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 6862aab5f78..12e486fa1a3 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -4,6 +4,9 @@ #define ALL (~0) //For convenience. #define NONE 0 +//check if all bitflags specified are present +#define CHECK_MULTIPLE_BITFIELDS(flagvar, flags) ((flagvar & (flags)) == flags) + GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768)) // for /datum/var/datum_flags @@ -79,6 +82,18 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define EMP_PROTECT_CONTENTS (1<<1) #define EMP_PROTECT_WIRES (1<<2) +//Mob mobility var flags +#define MOBILITY_MOVE (1<<0) //can move +#define MOBILITY_STAND (1<<1) //can, and is, standing up +#define MOBILITY_PICKUP (1<<2) //can pickup items +#define MOBILITY_USE (1<<3) //can hold and use items +#define MOBILITY_UI (1<<4) //can use interfaces like machinery +#define MOBILITY_STORAGE (1<<5) //can use storage item +#define MOBILITY_PULL (1<<6) //can pull things + +#define MOBILITY_FLAGS_DEFAULT (MOBILITY_MOVE | MOBILITY_STAND | MOBILITY_PICKUP | MOBILITY_USE | MOBILITY_UI | MOBILITY_STORAGE | MOBILITY_PULL) +#define MOBILITY_FLAGS_INTERACTION (MOBILITY_USE | MOBILITY_PICKUP | MOBILITY_UI | MOBILITY_STORAGE) + // radiation #define RAD_PROTECT_CONTENTS (1<<0) #define RAD_NO_CONTAMINATE (1<<1) diff --git a/code/__DEFINES/movespeed_modification.dm b/code/__DEFINES/movespeed_modification.dm index d3585aab97e..06f20fc56ef 100644 --- a/code/__DEFINES/movespeed_modification.dm +++ b/code/__DEFINES/movespeed_modification.dm @@ -20,6 +20,7 @@ #define MOVESPEED_ID_CARBON_SOFTCRIT "CARBON_SOFTCRIT" #define MOVESPEED_ID_CARBON_OLDSPEED "CARBON_DEPRECATED_SPEED" +#define MOVESPEED_ID_CARBON_CRAWLING "CARBON_CRAWLING" #define MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD "MONKEY_REAGENT_SPEEDMOD" #define MOVESPEED_ID_MONKEY_TEMPERATURE_SPEEDMOD "MONKEY_TEMPERATURE_SPEEDMOD" diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index c08898891eb..53b5ddf6e87 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -36,9 +36,13 @@ // DEBUFFS // ///////////// -#define STATUS_EFFECT_STUN /datum/status_effect/incapacitating/stun //the affected is stunned +#define STATUS_EFFECT_STUN /datum/status_effect/incapacitating/stun //the affected is unable to move or use items -#define STATUS_EFFECT_KNOCKDOWN /datum/status_effect/incapacitating/knockdown //the affected is knocked down +#define STATUS_EFFECT_KNOCKDOWN /datum/status_effect/incapacitating/knockdown //the affected is unable to stand up + +#define STATUS_EFFECT_IMMOBILIZED /datum/status_effect/incapacitating/immobilized //the affected is unable to move + +#define STATUS_EFFECT_PARALYZED /datum/status_effect/incapacitating/paralyzed //the affected is unable to move, use items, or stand up. #define STATUS_EFFECT_UNCONSCIOUS /datum/status_effect/incapacitating/unconscious //the affected is unconscious diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index edb80dc1b01..aa56db61cd7 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -199,7 +199,7 @@ GLOBAL_LIST_EMPTY(species_list) drifting = 0 user_loc = user.loc - if((!drifting && user.loc != user_loc) || target.loc != target_loc || user.get_active_held_item() != holding || user.incapacitated() || user.lying || (extra_checks && !extra_checks.Invoke())) + if((!drifting && user.loc != user_loc) || target.loc != target_loc || user.get_active_held_item() != holding || user.incapacitated() || (extra_checks && !extra_checks.Invoke())) . = 0 break if (progress) @@ -257,10 +257,16 @@ GLOBAL_LIST_EMPTY(species_list) drifting = 0 Uloc = user.loc - if(QDELETED(user) || user.stat || user.IsKnockdown() || user.IsStun() || (!drifting && user.loc != Uloc) || (extra_checks && !extra_checks.Invoke())) + if(QDELETED(user) || user.stat || (!drifting && user.loc != Uloc) || (extra_checks && !extra_checks.Invoke())) . = 0 break + if(isliving(user)) + var/mob/living/L = user + if(L.IsStun() || L.IsParalyzed()) + . = 0 + break + if(!QDELETED(Tloc) && (QDELETED(target) || Tloc != target.loc)) if((Uloc != Tloc || Tloc != user) && !drifting) . = 0 @@ -283,7 +289,7 @@ GLOBAL_LIST_EMPTY(species_list) . = 1 return -/proc/do_after_mob(mob/user, var/list/targets, time = 30, uninterruptible = 0, progress = 1, datum/callback/extra_checks) +/proc/do_after_mob(mob/user, list/targets, time = 30, uninterruptible = 0, progress = 1, datum/callback/extra_checks, required_mobility_flags = MOBILITY_STAND) if(!user || !targets) return 0 if(!islist(targets)) @@ -305,6 +311,9 @@ GLOBAL_LIST_EMPTY(species_list) var/endtime = world.time + time var/starttime = world.time + var/mob/living/L + if(isliving(user)) + L = user . = 1 mainloop: while(world.time < endtime) @@ -321,8 +330,12 @@ GLOBAL_LIST_EMPTY(species_list) drifting = 0 user_loc = user.loc + if(L && !CHECK_MULTIPLE_BITFIELDS(L.mobility_flags, required_mobility_flags)) + . = 0 + break + for(var/atom/target in targets) - if((!drifting && user_loc != user.loc) || QDELETED(target) || originalloc[target] != target.loc || user.get_active_held_item() != holding || user.incapacitated() || user.lying || (extra_checks && !extra_checks.Invoke())) + if((!drifting && user_loc != user.loc) || QDELETED(target) || originalloc[target] != target.loc || user.get_active_held_item() != holding || user.incapacitated() || (extra_checks && !extra_checks.Invoke())) . = 0 break mainloop if(progbar) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index bfc9dc7a257..91d0b9c4f25 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -832,7 +832,7 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list( /*This can be used to add additional effects on interactions between mobs depending on how the mobs are facing each other, such as adding a crit damage to blows to the back of a guy's head. Given how click code currently works (Nov '13), the initiating mob will be facing the target mob most of the time That said, this proc should not be used if the change facing proc of the click code is overridden at the same time*/ - if(!ismob(target) || target.lying) + if(!ismob(target) || !(target.mobility_flags & MOBILITY_STAND)) //Make sure we are not doing this for things that can't have a logical direction to the players given that the target would be on their side return FALSE if(initator.dir == target.dir) //mobs are facing the same direction @@ -906,18 +906,18 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list( //If one of them is a match, then A is facing B /proc/is_A_facing_B(atom/A,atom/B) if(!istype(A) || !istype(B)) - return 0 + return FALSE if(isliving(A)) var/mob/living/LA = A - if(LA.lying) - return 0 + if(!(LA.mobility_flags & MOBILITY_STAND)) + return FALSE var/goal_dir = get_dir(A,B) var/clockwise_A_dir = turn(A.dir, -45) var/anticlockwise_A_dir = turn(A.dir, 45) if(A.dir == goal_dir || clockwise_A_dir == goal_dir || anticlockwise_A_dir == goal_dir) - return 1 - return 0 + return TRUE + return FALSE /* diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 542f6dab40e..7ddb0036282 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -167,8 +167,16 @@ GLOBAL_LIST_INIT(bitfields, list( "car_traits" = list( "CAN_KIDNAP" = CAN_KIDNAP, ), + "mobility_flags" = list( + "MOVE" = MOBILITY_MOVE, + "STAND" = MOBILITY_STAND, + "PICKUP" = MOBILITY_PICKUP, + "USE" = MOBILITY_USE, + "UI" = MOBILITY_UI, + "STORAGE" = MOBILITY_STORAGE + ), "rad_flags" = list( "RAD_PROTECT_CONTENTS" = RAD_PROTECT_CONTENTS, "RAD_NO_CONTAMINATE" = RAD_NO_CONTAMINATE, - ), + ) )) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 006207c3f3b..0f7aae4c897 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -14,7 +14,7 @@ if(check_click_intercept(params,A)) return - if(stat || lockcharge || IsKnockdown() || IsStun() || IsUnconscious()) + if(stat || lockcharge || IsParalyzed() || IsStun() || IsUnconscious()) return var/list/modifiers = params2list(params) diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 25b38b5582c..51f5084a32e 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -257,7 +257,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." if(!istype(L) || !L.can_resist()) return L.changeNext_move(CLICK_CD_RESIST) - if(L.canmove) + if(L.mobility_flags & MOBILITY_MOVE) return L.resist_fire() //I just want to start a flame in your hearrrrrrtttttt. @@ -585,7 +585,7 @@ so as to remain in compliance with the most up-to-date laws." if(!istype(L) || !L.can_resist()) return L.changeNext_move(CLICK_CD_RESIST) - if((L.canmove) && (L.last_special <= world.time)) + if((L.mobility_flags & MOBILITY_MOVE) && (L.last_special <= world.time)) return L.resist_restraints() /obj/screen/alert/restrained/buckled/Click() diff --git a/code/datums/action.dm b/code/datums/action.dm index 0c3d4ba9dcb..8becdd37fac 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -95,20 +95,24 @@ /datum/action/proc/IsAvailable() if(!owner) - return 0 + return FALSE if(check_flags & AB_CHECK_RESTRAINED) if(owner.restrained()) - return 0 + return FALSE if(check_flags & AB_CHECK_STUN) - if(owner.IsKnockdown() || owner.IsStun()) - return 0 + if(isliving(owner)) + var/mob/living/L = owner + if(L.IsParalyzed() || L.IsStun()) + return FALSE if(check_flags & AB_CHECK_LYING) - if(owner.lying) - return 0 + if(isliving(owner)) + var/mob/living/L = owner + if(!(L.mobility_flags & MOBILITY_STAND)) + return FALSE if(check_flags & AB_CHECK_CONSCIOUS) if(owner.stat) - return 0 - return 1 + return FALSE + return TRUE /datum/action/proc/UpdateButtonIcon(status_only = FALSE, force = FALSE) if(button) diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm index ac0318cf2b6..503fb18bba5 100644 --- a/code/datums/brain_damage/mild.dm +++ b/code/datums/brain_damage/mild.dm @@ -140,9 +140,9 @@ var/fall_chance = 1 if(owner.m_intent == MOVE_INTENT_RUN) fall_chance += 2 - if(prob(fall_chance) && !owner.lying && !owner.buckled) + if(prob(fall_chance) && (owner.mobility_flags & MOBILITY_STAND)) to_chat(owner, "Your leg gives out!") - owner.Knockdown(35) + owner.Paralyze(35) else if(owner.get_active_held_item()) var/drop_chance = 1 @@ -167,7 +167,7 @@ if(prob(7)) switch(rand(1,5)) if(1) - if(owner.canmove && !isspaceturf(owner.loc)) + if((owner.mobility_flags & MOBILITY_MOVE) && !isspaceturf(owner.loc)) to_chat(owner, "Your leg spasms!") step(owner, pick(GLOB.cardinals)) if(2) diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index 9c8bfffcb33..0ae2a99f0d2 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -66,11 +66,11 @@ lose_text = "You can feel your limbs again!" /datum/brain_trauma/severe/paralysis/on_life() - owner.Knockdown(200, ignore_canknockdown = TRUE) + owner.Paralyze(200, ignore_canknockdown = TRUE) ..() /datum/brain_trauma/severe/paralysis/on_lose() - owner.SetKnockdown(0) + owner.SetParalyzed(0) ..() /datum/brain_trauma/severe/narcolepsy @@ -204,7 +204,7 @@ /datum/brain_trauma/severe/pacifism/on_lose() owner.remove_trait(TRAIT_PACIFISM, TRAUMA_TRAIT) ..() - + /datum/brain_trauma/severe/hypnotic_stupor name = "Hypnotic Stupor" desc = "Patient is prone to episodes of extreme stupor that leaves them extremely suggestible." @@ -215,9 +215,8 @@ /datum/brain_trauma/severe/hypnotic_stupor/on_lose() //hypnosis must be cleared separately, but brain surgery should get rid of both anyway ..() owner.remove_status_effect(/datum/status_effect/trance) - + /datum/brain_trauma/severe/hypnotic_stupor/on_life() ..() if(prob(1) && !owner.has_status_effect(/datum/status_effect/trance)) owner.apply_status_effect(/datum/status_effect/trance, rand(100,300), FALSE) - \ No newline at end of file diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm index 0bbbf8de08f..adac9fed20d 100644 --- a/code/datums/brain_damage/special.dm +++ b/code/datums/brain_damage/special.dm @@ -13,7 +13,7 @@ /datum/brain_trauma/special/godwoken/on_life() ..() if(prob(4)) - if(prob(33) && (owner.IsStun() || owner.IsKnockdown() || owner.IsUnconscious())) + if(prob(33) && (owner.IsStun() || owner.IsParalyzed() || owner.IsUnconscious())) speak("unstun", TRUE) else if(prob(60) && owner.health <= owner.crit_threshold) speak("heal", TRUE) diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm index 1e1b7a0a482..5c6866533c7 100644 --- a/code/datums/components/caltrop.dm +++ b/code/datums/components/caltrop.dm @@ -59,4 +59,4 @@ "You slide on [A]!") cooldown = world.time - H.Knockdown(60) + H.Paralyze(60) diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm index 013334bc272..d161a9af1d6 100644 --- a/code/datums/components/chasm.dm +++ b/code/datums/components/chasm.dm @@ -100,7 +100,7 @@ AM.forceMove(T) if(isliving(AM)) var/mob/living/L = AM - L.Knockdown(100) + L.Paralyze(100) L.adjustBruteLoss(30) falling_atoms -= AM diff --git a/code/datums/components/cleaning.dm b/code/datums/components/cleaning.dm index 05c26efcc1b..9ab1793fef1 100644 --- a/code/datums/components/cleaning.dm +++ b/code/datums/components/cleaning.dm @@ -24,7 +24,7 @@ M.regenerate_icons() else if(ishuman(A)) var/mob/living/carbon/human/cleaned_human = A - if(cleaned_human.lying) + if(!(cleaned_human.mobility_flags & MOBILITY_STAND)) if(cleaned_human.head) SEND_SIGNAL(cleaned_human.head, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD) if(cleaned_human.wear_suit) diff --git a/code/datums/components/footstep.dm b/code/datums/components/footstep.dm index ccd3d30463e..a1d4b91825e 100644 --- a/code/datums/components/footstep.dm +++ b/code/datums/components/footstep.dm @@ -17,7 +17,7 @@ var/mob/living/LM = parent var/v = volume var/e = e_range - if(!T.footstep || LM.lying || !LM.canmove || LM.resting || LM.buckled || LM.throwing || LM.movement_type & (VENTCRAWLING | FLYING)) + if(!T.footstep || LM.buckled || !CHECK_MULTIPLE_BITFIELDS(LM.mobility_flags, MOBILITY_STAND | MOBILITY_MOVE) || LM.throwing || LM.movement_type & (VENTCRAWLING | FLYING)) return if(iscarbon(LM)) var/mob/living/carbon/C = LM diff --git a/code/datums/components/jousting.dm b/code/datums/components/jousting.dm index d1d0d6d5047..288e9693bc6 100644 --- a/code/datums/components/jousting.dm +++ b/code/datums/components/jousting.dm @@ -54,7 +54,7 @@ msg += " and knocks [target] [target_buckled? "off of [target.buckled]" : "down"]" if(target_buckled) target.buckled.unbuckle_mob(target) - target.Knockdown(knockdown_time) + target.Paralyze(knockdown_time) if(length(msg)) user.visible_message("[msg]!") diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm index 7b80f87657e..5dc0a2faeda 100644 --- a/code/datums/components/riding.dm +++ b/code/datums/components/riding.dm @@ -162,12 +162,12 @@ if(!Process_Spacemove(direction) || !isturf(AM.loc)) return step(AM, direction) - + if((direction & (direction - 1)) && (AM.loc == next)) //moved diagonally last_move_diagonal = TRUE else last_move_diagonal = FALSE - + handle_vehicle_layer() handle_vehicle_offsets() else @@ -213,7 +213,7 @@ /datum/component/riding/human/force_dismount(mob/living/user) var/atom/movable/AM = parent AM.unbuckle_mob(user) - user.Knockdown(60) + user.Paralyze(60) user.visible_message("[AM] pushes [user] off of [AM.p_them()]!") /datum/component/riding/cyborg @@ -271,7 +271,7 @@ M.Move(targetm) M.visible_message("[M] is thrown clear of [AM]!") M.throw_at(target, 14, 5, AM) - M.Knockdown(60) + M.Paralyze(60) /datum/component/riding/proc/equip_buckle_inhands(mob/living/carbon/human/user, amount_required = 1) var/atom/movable/AM = parent diff --git a/code/datums/components/signal_redirect.dm b/code/datums/components/signal_redirect.dm index db98d5664ab..b190ab9efb4 100644 --- a/code/datums/components/signal_redirect.dm +++ b/code/datums/components/signal_redirect.dm @@ -18,7 +18,7 @@ . = COMPONENT_INCOMPATIBLE CRASH("Redirect components must be given instanced callbacks, not proc paths.") _signals[COMSIG_TURF_CHANGE] = CALLBACK(src, .proc/turf_change) - + signals = _signals /datum/component/redirect/RegisterWithParent() diff --git a/code/datums/components/spooky.dm b/code/datums/components/spooky.dm index 8989cb499db..68304e0f941 100644 --- a/code/datums/components/spooky.dm +++ b/code/datums/components/spooky.dm @@ -22,7 +22,7 @@ return //undeads are unaffected by the spook-pocalypse. if(istype(H.dna.species, /datum/species/zombie)) H.adjustStaminaLoss(25) - H.Knockdown(15) //zombies can't resist the doot + H.Paralyze(15) //zombies can't resist the doot C.Jitter(35) C.stuttering = 20 if((!istype(H.dna.species, /datum/species/skeleton)) && (!istype(H.dna.species, /datum/species/golem)) && (!istype(H.dna.species, /datum/species/android)) && (!istype(H.dna.species, /datum/species/jelly))) @@ -36,7 +36,7 @@ /datum/component/spooky/proc/spectral_change(mob/living/carbon/human/H, mob/user) if((H.getStaminaLoss() > 95) && (!istype(H.dna.species, /datum/species/skeleton)) && (!istype(H.dna.species, /datum/species/golem)) && (!istype(H.dna.species, /datum/species/android)) && (!istype(H.dna.species, /datum/species/jelly))) - H.Knockdown(20) + H.Paralyze(20) H.set_species(/datum/species/skeleton) H.visible_message("[H] has given up on life as a mortal.") var/T = get_turf(H) diff --git a/code/datums/components/storage/concrete/bag_of_holding.dm b/code/datums/components/storage/concrete/bag_of_holding.dm index bf97ec65164..251e56f4cc5 100644 --- a/code/datums/components/storage/concrete/bag_of_holding.dm +++ b/code/datums/components/storage/concrete/bag_of_holding.dm @@ -11,7 +11,7 @@ var/turf/loccheck = get_turf(A) if(is_reebe(loccheck.z)) user.visible_message("An unseen force knocks [user] to the ground!", "\"I think not!\"") - user.Knockdown(60) + user.Paralyze(60) return if(istype(loccheck.loc, /area/fabric_of_reality)) to_chat(user, "You can't do that here!") @@ -25,7 +25,7 @@ for(var/mob/living/M in T) if(M.movement_type & FLYING) M.visible_message("The bluespace collapse crushes the air towards it, pulling [M] towards the ground...") - M.Knockdown(5, TRUE, TRUE) //Overrides stun absorbs. + M.Paralyze(5, TRUE, TRUE) //Overrides stun absorbs. T.TerraformTurf(/turf/open/chasm/magic, /turf/open/chasm/magic) for (var/obj/structure/ladder/unbreakable/binary/ladder in GLOB.ladders) ladder.ActivateAlmonds() diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 55af26b6b2e..1531092d004 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -233,7 +233,7 @@ /datum/component/storage/proc/quick_empty(mob/M) var/atom/A = parent - if((!ishuman(M) && (A.loc != M)) || (M.stat != CONSCIOUS) || M.restrained() || !M.canmove) + if((!ishuman(M) && (A.loc != M)) || (M.stat != CONSCIOUS) || M.incapacitated()) return if(locked) to_chat(M, "[parent] seems to be locked!") diff --git a/code/datums/components/waddling.dm b/code/datums/components/waddling.dm index a1f538e4dd7..ce865aed74a 100644 --- a/code/datums/components/waddling.dm +++ b/code/datums/components/waddling.dm @@ -8,7 +8,7 @@ /datum/component/waddling/proc/Waddle() var/mob/living/L = parent - if(L.incapacitated() || L.lying) + if(L.incapacitated() || !(L.mobility_flags & MOBILITY_STAND)) return animate(L, pixel_z = 4, time = 0) animate(pixel_z = 0, transform = turn(matrix(), pick(-12, 0, 12)), time=2) diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 0ace2ca8fd6..ff2cf0ac5c4 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -251,7 +251,7 @@ M.emote("deathgasp") M.fakedeath("regenerative_coma") M.update_stat() - M.update_canmove() + M.update_mobility() addtimer(CALLBACK(src, .proc/uncoma, M), 300) /datum/symptom/heal/coma/proc/uncoma(mob/living/M) @@ -260,7 +260,7 @@ active_coma = FALSE M.cure_fakedeath("regenerative_coma") M.update_stat() - M.update_canmove() + M.update_mobility() /datum/symptom/heal/coma/Heal(mob/living/carbon/M, datum/disease/advance/A, actual_power) var/heal_amt = 4 * actual_power diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm index 22d45ffb29d..96e2d0344e0 100644 --- a/code/datums/diseases/cold.dm +++ b/code/datums/diseases/cold.dm @@ -13,7 +13,7 @@ ..() switch(stage) if(2) - if(affected_mob.lying && prob(40)) //changed FROM prob(10) until sleeping is fixed + if(!(affected_mob.mobility_flags & MOBILITY_STAND) && prob(40)) //changed FROM prob(10) until sleeping is fixed to_chat(affected_mob, "You feel better.") cure() return @@ -30,7 +30,7 @@ if(prob(1)) to_chat(affected_mob, "Mucous runs down the back of your throat.") if(3) - if(affected_mob.lying && prob(25)) //changed FROM prob(5) until sleeping is fixed + if(!(affected_mob.mobility_flags & MOBILITY_STAND) && prob(25)) //changed FROM prob(5) until sleeping is fixed to_chat(affected_mob, "You feel better.") cure() return diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm index e1943937baf..96a36be1538 100644 --- a/code/datums/diseases/flu.dm +++ b/code/datums/diseases/flu.dm @@ -15,7 +15,7 @@ ..() switch(stage) if(2) - if(affected_mob.lying && prob(20)) + if(!(affected_mob.mobility_flags & MOBILITY_STAND) && prob(20)) to_chat(affected_mob, "You feel better.") stage-- return @@ -34,7 +34,7 @@ affected_mob.updatehealth() if(3) - if(affected_mob.lying && prob(15)) + if(!(affected_mob.mobility_flags & MOBILITY_STAND) && prob(15)) to_chat(affected_mob, "You feel better.") stage-- return diff --git a/code/datums/diseases/heart_failure.dm b/code/datums/diseases/heart_failure.dm index 3fbf6ef1776..9fe0c81775e 100644 --- a/code/datums/diseases/heart_failure.dm +++ b/code/datums/diseases/heart_failure.dm @@ -44,7 +44,7 @@ if(prob(25)) affected_mob.vomit(95) H.emote("cough") - H.Knockdown(40) + H.Paralyze(40) H.losebreath += 4 if(prob(3)) to_chat(H, "You feel very weak and dizzy...") diff --git a/code/datums/diseases/retrovirus.dm b/code/datums/diseases/retrovirus.dm index fe099e495ba..47365b3a752 100644 --- a/code/datums/diseases/retrovirus.dm +++ b/code/datums/diseases/retrovirus.dm @@ -31,7 +31,7 @@ switch(stage) if(1) if(restcure) - if(affected_mob.lying && prob(30)) + if(!(affected_mob.mobility_flags & MOBILITY_STAND) && prob(30)) to_chat(affected_mob, "You feel better.") cure() return @@ -43,7 +43,7 @@ to_chat(affected_mob, "You feel angry.") if(2) if(restcure) - if(affected_mob.lying && prob(20)) + if(!(affected_mob.mobility_flags & MOBILITY_STAND) && prob(20)) to_chat(affected_mob, "You feel better.") cure() return @@ -58,7 +58,7 @@ to_chat(affected_mob, "Your stomach churns.") if(3) if(restcure) - if(affected_mob.lying && prob(20)) + if(!(affected_mob.mobility_flags & MOBILITY_STAND) && prob(20)) to_chat(affected_mob, "You feel better.") cure() return @@ -73,7 +73,7 @@ if(4) if(restcure) - if(affected_mob.lying && prob(5)) + if(!(affected_mob.mobility_flags & MOBILITY_STAND) && prob(5)) to_chat(affected_mob, "You feel better.") cure() return diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index 57cdb9bcf51..0e81db43791 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -120,11 +120,14 @@ if(DEAD) to_chat(user, "You cannot [key] while dead.") return FALSE - if(restraint_check && (user.IsStun() || user.IsKnockdown())) - if(!intentional) - return FALSE - to_chat(user, "You cannot [key] while stunned.") - return FALSE + if(restraint_check) + if(isliving(user)) + var/mob/living/L = user + if(L.IsParalyzed() || L.IsStun()) + if(!intentional) + return FALSE + to_chat(user, "You cannot [key] while stunned.") + return FALSE if(restraint_check && user.restrained()) if(!intentional) return FALSE diff --git a/code/datums/martial.dm b/code/datums/martial.dm index 2bc01e0bf61..9a5f8e4aba8 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -38,7 +38,7 @@ var/damage = rand(A.dna.species.punchdamagelow, A.dna.species.punchdamagehigh) var/atk_verb = A.dna.species.attack_verb - if(D.lying) + if(!(D.mobility_flags & MOBILITY_STAND)) atk_verb = "kick" switch(atk_verb) @@ -74,7 +74,7 @@ "[A] has knocked [D] down!") D.apply_effect(40, EFFECT_KNOCKDOWN, armor_block) D.forcesay(GLOB.hit_appends) - else if(D.lying) + else if(!(D.mobility_flags & MOBILITY_STAND)) D.forcesay(GLOB.hit_appends) return 1 diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm index 96431fbe32b..0b159c5e252 100644 --- a/code/datums/martial/boxing.dm +++ b/code/datums/martial/boxing.dm @@ -43,7 +43,7 @@ D.SetSleeping(100) D.forcesay(GLOB.hit_appends) log_combat(A, D, "knocked out (boxing) ") - else if(D.lying) + else if(!(D.mobility_flags & MOBILITY_STAND)) D.forcesay(GLOB.hit_appends) return 1 diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index c2322a3c31a..7b4dea95e72 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -53,19 +53,19 @@ /datum/martial_art/cqc/proc/Slam(mob/living/carbon/human/A, mob/living/carbon/human/D) if(!can_use(A)) return FALSE - if(!D.stat || !D.IsKnockdown()) + if(D.mobility_flags & MOBILITY_STAND) D.visible_message("[A] slams [D] into the ground!", \ "[A] slams you into the ground!") playsound(get_turf(A), 'sound/weapons/slam.ogg', 50, 1, -1) D.apply_damage(10, BRUTE) - D.Knockdown(120) + D.Paralyze(120) log_combat(A, D, "slammed (CQC)") return TRUE /datum/martial_art/cqc/proc/Kick(mob/living/carbon/human/A, mob/living/carbon/human/D) if(!can_use(A)) return FALSE - if(!D.stat || !D.IsKnockdown()) + if(!D.stat || !D.IsParalyzed()) D.visible_message("[A] kicks [D] back!", \ "[A] kicks you back!") playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1) @@ -73,7 +73,7 @@ D.throw_at(throw_target, 1, 14, A) D.apply_damage(10, BRUTE) log_combat(A, D, "kicked (CQC)") - if(D.IsKnockdown() && !D.stat) + if(D.IsParalyzed() && !D.stat) D.visible_message("[A] kicks [D]'s head, knocking [D.p_them()] out!", \ "[A] kicks your head, knocking you out!") playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1) @@ -144,7 +144,7 @@ A.do_attack_animation(D) var/picked_hit_type = pick("CQC'd", "Big Bossed") var/bonus_damage = 13 - if(D.IsKnockdown() || D.resting || D.lying) + if(!(D.mobility_flags & MOBILITY_STAND)) bonus_damage += 5 picked_hit_type = "stomps on" D.apply_damage(bonus_damage, BRUTE) @@ -155,12 +155,12 @@ D.visible_message("[A] [picked_hit_type] [D]!", \ "[A] [picked_hit_type] you!") log_combat(A, D, "[picked_hit_type] (CQC)") - if(A.resting && !D.stat && !D.IsKnockdown()) + if(A.resting && !D.stat && !D.IsParalyzed()) D.visible_message("[A] leg sweeps [D]!", \ "[A] leg sweeps you!") playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1) D.apply_damage(10, BRUTE) - D.Knockdown(60) + D.Paralyze(60) log_combat(A, D, "sweeped (CQC)") return TRUE @@ -172,7 +172,7 @@ if(check_streak(A,D)) return TRUE if(prob(65)) - if(!D.stat || !D.IsKnockdown() || !restraining) + if(!D.stat || !D.IsParalyzed() || !restraining) I = D.get_active_held_item() D.visible_message("[A] strikes [D]'s jaw with their hand!", \ "[A] strikes your jaw, disorienting you!") diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index 8a5f0f9439d..25ae60c6016 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -86,13 +86,13 @@ return 0 /datum/martial_art/krav_maga/proc/leg_sweep(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) - if(D.stat || D.IsKnockdown()) + if(D.stat || D.IsParalyzed()) return 0 D.visible_message("[A] leg sweeps [D]!", \ "[A] leg sweeps you!") playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1) D.apply_damage(5, BRUTE) - D.Knockdown(40) + D.Paralyze(40) log_combat(A, D, "leg sweeped") return 1 @@ -128,7 +128,7 @@ log_combat(A, D, "punched") var/picked_hit_type = pick("punches", "kicks") var/bonus_damage = 10 - if(D.IsKnockdown() || D.resting || D.lying) + if(!(D.mobility_flags & MOBILITY_STAND)) bonus_damage += 5 picked_hit_type = "stomps on" D.apply_damage(bonus_damage, BRUTE) diff --git a/code/datums/martial/mushpunch.dm b/code/datums/martial/mushpunch.dm index 33d5bb51bf8..e38b764ad81 100644 --- a/code/datums/martial/mushpunch.dm +++ b/code/datums/martial/mushpunch.dm @@ -15,7 +15,7 @@ playsound(D, 'sound/effects/meteorimpact.ogg', 25, 1, -1) var/throwtarget = get_edge_target_turf(A, get_dir(A, get_step_away(D, A))) D.throw_at(throwtarget, 4, 2, A)//So stuff gets tossed around at the same time. - D.Knockdown(20) + D.Paralyze(20) if(atk_verb) log_combat(A, D, "[atk_verb] (Mushroom Punch)") return TRUE diff --git a/code/datums/martial/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm index 4a3000548cb..196ec5307e2 100644 --- a/code/datums/martial/psychotic_brawl.dm +++ b/code/datums/martial/psychotic_brawl.dm @@ -57,7 +57,7 @@ playsound(get_turf(D), 'sound/effects/meteorimpact.ogg', 25, 1, -1) var/throwtarget = get_edge_target_turf(A, get_dir(A, get_step_away(D, A))) D.throw_at(throwtarget, 4, 2, A)//So stuff gets tossed around at the same time. - D.Knockdown(60) + D.Paralyze(60) if(7,8) basic_hit(A,D) diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index e9fd9a94f91..aa499f90c2e 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -35,7 +35,7 @@ return 0 /datum/martial_art/the_sleeping_carp/proc/wristWrench(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!D.stat && !D.IsStun() && !D.IsKnockdown()) + if(!D.stat && !D.IsStun() && !D.IsParalyzed()) A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) D.visible_message("[A] grabs [D]'s wrist and wrenches it sideways!", \ "[A] grabs your wrist and violently wrenches it to the side!") @@ -49,19 +49,19 @@ return basic_hit(A,D) /datum/martial_art/the_sleeping_carp/proc/backKick(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(A.dir == D.dir && !D.stat && !D.IsKnockdown()) + if(A.dir == D.dir && !D.stat && !D.IsParalyzed()) A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) D.visible_message("[A] kicks [D] in the back!", \ "[A] kicks you in the back, making you stumble and fall!") step_to(D,get_step(D,D.dir),1) - D.Knockdown(80) + D.Paralyze(80) playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1) return 1 log_combat(A, D, "back-kicked (Sleeping Carp)") return basic_hit(A,D) /datum/martial_art/the_sleeping_carp/proc/kneeStomach(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!D.stat && !D.IsKnockdown()) + if(!D.stat && !D.IsParalyzed()) A.do_attack_animation(D, ATTACK_EFFECT_KICK) D.visible_message("[A] knees [D] in the stomach!", \ "[A] winds you with a knee in the stomach!") @@ -74,7 +74,7 @@ return basic_hit(A,D) /datum/martial_art/the_sleeping_carp/proc/headKick(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!D.stat && !D.IsKnockdown()) + if(!D.stat && !D.IsParalyzed()) A.do_attack_animation(D, ATTACK_EFFECT_KICK) D.visible_message("[A] kicks [D] in the head!", \ "[A] kicks you in the jaw!") @@ -87,7 +87,7 @@ return basic_hit(A,D) /datum/martial_art/the_sleeping_carp/proc/elbowDrop(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(D.IsKnockdown() || D.resting || D.stat) + if(!(D.mobility_flags & MOBILITY_STAND)) A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) D.visible_message("[A] elbow drops [D]!", \ "[A] piledrives you with their elbow!") @@ -130,9 +130,9 @@ "[A] [atk_verb] you!") D.apply_damage(rand(10,15), BRUTE) playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, 1, -1) - if(prob(D.getBruteLoss()) && !D.lying) + if(prob(D.getBruteLoss()) && (D.mobility_flags & MOBILITY_STAND)) D.visible_message("[D] stumbles and falls!", "The blow sends you to the ground!") - D.Knockdown(80) + D.Paralyze(80) log_combat(A, D, "[atk_verb] (Sleeping Carp)") return 1 @@ -181,7 +181,7 @@ add_fingerprint(user) if((user.has_trait(TRAIT_CLUMSY)) && prob(50)) to_chat(user, "You club yourself over the head with [src].") - user.Knockdown(60) + user.Paralyze(60) if(ishuman(user)) var/mob/living/carbon/human/H = user H.apply_damage(2*force, BRUTE, BODY_ZONE_HEAD) @@ -215,7 +215,7 @@ if(prob(10)) H.visible_message("[H] collapses!", \ "Your legs give out!") - H.Knockdown(80) + H.Paralyze(80) if(H.staminaloss && !H.IsSleeping()) var/total_health = (H.health - H.staminaloss) if(total_health <= HEALTH_THRESHOLD_CRIT && !H.stat) diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm index e57edf9fb2f..f993675dd9b 100644 --- a/code/datums/martial/wrestling.dm +++ b/code/datums/martial/wrestling.dm @@ -191,7 +191,7 @@ if (T && isturf(T)) if (!D.stat) D.emote("scream") - D.throw_at(T, 10, 4, A, TRUE, TRUE, callback = CALLBACK(D, /mob/living/carbon/human/.Knockdown, 20)) + D.throw_at(T, 10, 4, A, TRUE, TRUE, callback = CALLBACK(D, /mob/living/carbon/human/.Paralyze, 20)) log_combat(A, D, "has thrown with wrestling") return 0 @@ -287,7 +287,7 @@ playsound(A.loc, "swing_hit", 50, 1) if (!D.stat) D.emote("scream") - D.Knockdown(40) + D.Paralyze(40) switch(rand(1,3)) if (2) @@ -345,7 +345,7 @@ var/turf/T = get_edge_target_turf(A, get_dir(A, get_step_away(D, A))) if (T && isturf(T)) - D.Knockdown(20) + D.Paralyze(20) D.throw_at(T, 3, 2) log_combat(A, D, "roundhouse-kicked") @@ -384,7 +384,7 @@ if (falling == 1) A.visible_message("...and dives head-first into the ground, ouch!") A.adjustBruteLoss(rand(10,20)) - A.Knockdown(60) + A.Paralyze(60) to_chat(A, "[D] is too far away!") return 0 @@ -413,7 +413,7 @@ else D.adjustBruteLoss(rand(20,30)) - D.Knockdown(40) + D.Paralyze(40) A.pixel_y = 0 diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 0c5b3ecc883..44bac60165e 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -74,7 +74,9 @@ owner.add_stun_absorption("vanguard", INFINITY, 1, "'s yellow aura momentarily intensifies!", "Your ward absorbs the stun!", " radiating with a soft yellow light!") owner.visible_message("[owner] begins to faintly glow!", "You will absorb all stuns for the next twenty seconds.") owner.SetStun(0, FALSE) - owner.SetKnockdown(0) + owner.SetKnockdown(0, FALSE) + owner.SetParalyzed(0, FALSE) + owner.SetImmobilized(0) progbar = new(owner, duration, owner) progbar.bar.color = list("#FAE48C", "#FAE48C", "#FAE48C", rgb(0,0,0)) progbar.update(duration - world.time) @@ -96,7 +98,7 @@ if(owner.stun_absorption[i]["end_time"] > world.time && owner.stun_absorption[i]["priority"] > vanguard["priority"]) otheractiveabsorptions = TRUE if(!GLOB.ratvar_awakens && stuns_blocked && !otheractiveabsorptions) - owner.Knockdown(stuns_blocked) + owner.Paralyze(stuns_blocked) message_to_owner = "The weight of the Vanguard's protection crashes down upon you!" if(stuns_blocked >= 300) message_to_owner += "\nYou faint from the exertion!" @@ -224,9 +226,9 @@ return ..() /datum/status_effect/wish_granters_gift/on_remove() - owner.revive(full_heal = 1, admin_revive = 1) + owner.revive(full_heal = TRUE, admin_revive = TRUE) owner.visible_message("[owner] appears to wake from the dead, having healed all wounds!", "You have regenerated.") - owner.update_canmove() + owner.update_mobility() /obj/screen/alert/status_effect/wish_granters_gift name = "Wish Granter's Immortality" diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 286b92861b2..d60f3a5896a 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -12,12 +12,12 @@ . = ..() if(.) if(updating_canmove) - owner.update_canmove() + owner.update_mobility() if(needs_update_stat || issilicon(owner)) owner.update_stat() /datum/status_effect/incapacitating/on_remove() - owner.update_canmove() + owner.update_mobility() if(needs_update_stat || issilicon(owner)) //silicons need stat updates in addition to normal canmove updates owner.update_stat() @@ -29,10 +29,12 @@ /datum/status_effect/incapacitating/knockdown id = "knockdown" -/datum/status_effect/incapacitating/knockdown/tick() - if(owner.getStaminaLoss()) - owner.adjustStaminaLoss(-0.3) //reduce stamina loss by 0.3 per tick, 6 per 2 seconds +//IMMOBILIZED +/datum/status_effect/incapacitating/immobilized + id = "immobilized" +/datum/status_effect/incapacitating/paralyzed + id = "paralyzed" //UNCONSCIOUS /datum/status_effect/incapacitating/unconscious @@ -128,7 +130,7 @@ if(iscarbon(owner) && !is_servant_of_ratvar(owner) && !owner.anti_magic_check() && number_legs) if(force_damage || owner.m_intent != MOVE_INTENT_WALK) if(GLOB.ratvar_awakens) - owner.Knockdown(20) + owner.Paralyze(20) if(iscultist(owner)) owner.apply_damage(cultist_damage_on_toggle * 0.5, BURN, BODY_ZONE_L_LEG) owner.apply_damage(cultist_damage_on_toggle * 0.5, BURN, BODY_ZONE_R_LEG) @@ -458,7 +460,7 @@ var/old_health /datum/status_effect/kindle/tick() - owner.Knockdown(15) + owner.Paralyze(15) if(iscarbon(owner)) var/mob/living/carbon/C = owner C.silent = max(2, C.silent) diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm index dfe0a1d94e1..4dce078ee3c 100644 --- a/code/datums/status_effects/gas.dm +++ b/code/datums/status_effects/gas.dm @@ -18,11 +18,11 @@ to_chat(owner, "You become frozen in a cube!") cube = icon('icons/effects/freeze.dmi', "ice_cube") owner.add_overlay(cube) - owner.update_canmove() + owner.update_mobility() return ..() /datum/status_effect/freon/tick() - owner.update_canmove() + owner.update_mobility() if(can_melt && owner.bodytemperature >= BODYTEMP_NORMAL) qdel(src) @@ -32,14 +32,14 @@ if(!QDELETED(src)) to_chat(owner, "You break out of the ice cube!") owner.remove_status_effect(/datum/status_effect/freon) - owner.update_canmove() + owner.update_mobility() /datum/status_effect/freon/on_remove() if(!owner.stat) to_chat(owner, "The cube melts!") owner.cut_overlay(cube) owner.adjust_bodytemperature(100) - owner.update_canmove() + owner.update_mobility() qdel(redirect_component.resolve()) redirect_component = null diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 82888596b21..e692408606f 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -112,7 +112,7 @@ grab_state = 0 if(isliving(ex_pulled)) var/mob/living/L = ex_pulled - L.update_canmove()// mob gets up if it was lyng down in a chokehold + L.update_mobility()// mob gets up if it was lyng down in a chokehold /atom/movable/proc/Move_Pulled(atom/A) if(!pulling) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 868ad8e0e6d..f62021bcc37 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -85,8 +85,12 @@ open_machine() /obj/machinery/sleeper/MouseDrop_T(mob/target, mob/user) - if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser()) + if(user.stat || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser()) return + if(isliving(user)) + var/mob/living/L = user + if(!(L.mobility_flags & MOBILITY_STAND)) + return close_machine(target) /obj/machinery/sleeper/attackby(obj/item/I, mob/user, params) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index d5a753c973e..815feb09314 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -176,7 +176,7 @@ Class Procs: A.forceMove(T) if(isliving(A)) var/mob/living/L = A - L.update_canmove() + L.update_mobility() occupant = null /obj/machinery/proc/close_machine(atom/movable/target = null) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 95d1c9210cb..72bba416df1 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -529,7 +529,7 @@ M.vomit(10, distance = 5) if(ORION_TRAIL_FLUX) if(prob(75)) - M.Knockdown(60) + M.Paralyze(60) say("A sudden gust of powerful wind slams [M] into the floor!") M.take_bodypart_damage(25) playsound(loc, 'sound/weapons/genhit.ogg', 100, 1) diff --git a/code/game/machinery/computer/gulag_teleporter.dm b/code/game/machinery/computer/gulag_teleporter.dm index 68cbf03f03c..ca72f9bdd19 100644 --- a/code/game/machinery/computer/gulag_teleporter.dm +++ b/code/game/machinery/computer/gulag_teleporter.dm @@ -152,7 +152,7 @@ teleporter.handle_prisoner(id, temporary_record) playsound(src, 'sound/weapons/emitter.ogg', 50, 1) prisoner.forceMove(get_turf(beacon)) - prisoner.Knockdown(40) // small travel dizziness + prisoner.Paralyze(40) // small travel dizziness to_chat(prisoner, "The teleportation makes you a little dizzy.") new /obj/effect/particle_effect/sparks(get_turf(prisoner)) playsound(src, "sparks", 50, 1) diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 5c8d189a7f9..a4f7b289acc 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -37,11 +37,11 @@ dat += "[R.name] |" if(R.stat) dat += " Not Responding |" - else if (!R.canmove) + else if (!(R.mobility_flags & MOBILITY_MOVE)) dat += " Locked Down |" else dat += " Operating Normally |" - if (!R.canmove) + if (!(R.mobility_flags & MOBILITY_MOVE)) else if(R.cell) dat += " Battery Installed ([R.cell.charge]/[R.cell.maxcharge]) |" else @@ -62,7 +62,7 @@ dat += "(Hack) " else if(IsAdminGhost(user) && !R.emagged) dat += "(Hack) " - dat += "([R.canmove ? "Lockdown" : "Release"]) " + dat += "([(R.mobility_flags & MOBILITY_MOVE) ? "Lockdown" : "Release"]) " dat += "(Destroy)" dat += "
" @@ -116,10 +116,10 @@ if(src.allowed(usr)) var/mob/living/silicon/robot/R = locate(href_list["stopbot"]) in GLOB.silicon_mobs if(can_control(usr, R)) - var/choice = input("Are you certain you wish to [R.canmove ? "lock down" : "release"] [R.name]?") in list("Confirm", "Abort") + var/choice = input("Are you certain you wish to [!R.lockcharge ? "lock down" : "release"] [R.name]?") in list("Confirm", "Abort") if(choice == "Confirm" && can_control(usr, R) && !..()) - message_admins("[ADMIN_LOOKUPFLW(usr)] [R.canmove ? "locked down" : "released"] [key_name(R, R.client)][ADMIN_LOOKUPFLW(R)]!") - log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [key_name(R)]!") + message_admins("[ADMIN_LOOKUPFLW(usr)] [!R.lockcharge ? "locked down" : "released"] [key_name(R, R.client)][ADMIN_LOOKUPFLW(R)]!") + log_game("[key_name(usr)] [!R.lockcharge ? "locked down" : "released"] [key_name(R)]!") R.SetLockdown(!R.lockcharge) to_chat(R, "[!R.lockcharge ? "Your lockdown has been lifted!" : "You have been locked down!"]") if(R.connected_ai) diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 1cf959202eb..b5f8f4eef9b 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -375,10 +375,8 @@ sleep(speed) for(var/i in 1 to speed) M.setDir(pick(GLOB.cardinals)) - // update resting manually to avoid chat spam for(var/mob/living/carbon/NS in rangers) - NS.resting = !NS.resting - NS.update_canmove() + NS.set_resting(!NS.resting, TRUE) time-- /obj/machinery/jukebox/disco/proc/dance5(var/mob/living/M) @@ -461,5 +459,9 @@ . = ..() if(active) for(var/mob/M in rangers) - if(prob(5+(allowed(M)*4)) && M.canmove) + if(prob(5+(allowed(M)*4))) + if(isliving(M)) + var/mob/living/L = M + if(!(L.mobility_flags & MOBILITY_MOVE)) + continue dance(M) diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index 2f221b07878..27ffc12d2b2 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -144,6 +144,7 @@ toggle_open(user) /obj/machinery/dna_scannernew/MouseDrop_T(mob/target, mob/user) - if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser()) + var/mob/living/L = user + if(user.stat || (isliving(user) && (!(L.mobility_flags & MOBILITY_STAND) || !(L.mobility_flags & MOBILITY_UI))) || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser()) return close_machine(target) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 344ba209122..fd93c801a4f 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -759,7 +759,7 @@ if(!istype(H.head, /obj/item/clothing/head/helmet)) H.visible_message("[user] headbutts the airlock.", \ "You headbutt the airlock!") - H.Knockdown(100) + H.Paralyze(100) H.apply_damage(10, BRUTE, BODY_ZONE_HEAD) else visible_message("[user] headbutts the airlock. Good thing [user.p_theyre()] wearing a helmet.") @@ -1023,7 +1023,7 @@ if(!I.use_tool(src, user, 150, volume=50)) to_chat(user, "You slip and [charge] detonates!") charge.ex_act(EXPLODE_DEVASTATE) - user.Knockdown(60) + user.Paralyze(60) return user.visible_message("[user] removes [charge] from [src].", \ "You gently pry out [charge] from [src] and unhook its wires.") diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index d590fd79256..297a646ce8c 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -498,7 +498,7 @@ throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src))) SEND_SOUND(L, sound(pick('sound/hallucinations/turn_around1.ogg','sound/hallucinations/turn_around2.ogg'),0,1,50)) flash_color(L, flash_color="#960000", flash_time=20) - L.Knockdown(40) + L.Paralyze(40) L.throw_at(throwtarget, 5, 1,src) return 0 diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 0c9b2cc7b02..da06fd0a67b 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -320,10 +320,10 @@ else if(ishuman(L)) //For humans L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) L.emote("scream") - L.Knockdown(100) + L.Paralyze(100) else if(ismonkey(L)) //For monkeys L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) - L.Knockdown(100) + L.Paralyze(100) else //for simple_animals & borgs L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) var/turf/location = get_turf(src) diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 1390f3d7c39..4d24a550376 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -115,7 +115,7 @@ continue if(L.flash_act(affect_silicon = 1)) - L.Knockdown(strength) + L.Paralyze(strength) flashed = TRUE if(flashed) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 6b8cac544e6..22b6fe900bc 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -91,7 +91,7 @@ Buildable meters set name = "Flip Pipe" set src in view(1) - if ( usr.stat || usr.restrained() || !usr.canmove ) + if ( usr.incapacitated() ) return do_a_flip() diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index effdc174b6a..9f632cfef90 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -34,7 +34,8 @@ /obj/machinery/pipedispenser/Topic(href, href_list) if(..()) return 1 - if(!anchored|| !usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) + var/mob/living/L = usr + if(!anchored || (istype(L) && !(L.mobility_flags & MOBILITY_UI)) || usr.stat || usr.restrained() || !in_range(loc, usr)) usr << browse(null, "window=pipedispenser") return 1 usr.set_machine(src) @@ -94,7 +95,7 @@ //Allow you to drag-drop disposal pipes and transit tubes into it /obj/machinery/pipedispenser/disposal/MouseDrop_T(obj/structure/pipe, mob/usr) - if(!usr.canmove || usr.stat || usr.restrained()) + if(!usr.incapacitated()) return if (!istype(pipe, /obj/structure/disposalconstruct) && !istype(pipe, /obj/structure/c_transit_tube) && !istype(pipe, /obj/structure/c_transit_tube_pod)) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 0e3c272fea4..b54fda4e200 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -386,8 +386,8 @@ if(iscarbon(A)) var/mob/living/carbon/C = A - //If not emagged, only target non downed carbons - if(mode != TURRET_LETHAL && (C.stat || C.handcuffed || C.lying)) + //If not emagged, only target carbons that can use items + if(mode != TURRET_LETHAL && (C.stat || C.handcuffed || !(C.mobility_flags & MOBILITY_USE))) continue //If emagged, target all but dead carbons diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index a157f9c4859..66d54d2176b 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -178,9 +178,13 @@ new /obj/item/stack/sheet/metal (loc, 2) qdel(src) -/obj/machinery/suit_storage_unit/MouseDrop_T(atom/A, mob/user) - if(user.stat || user.lying || !Adjacent(user) || !Adjacent(A) || !isliving(A)) +/obj/machinery/suit_storage_unit/MouseDrop_T(atom/A, mob/living/user) + if(!istype(user) || user.stat || !Adjacent(user) || !Adjacent(A) || !isliving(A)) return + if(isliving(user)) + var/mob/living/L = user + if(!(L.mobility_flags & MOBILITY_STAND)) + return var/mob/living/target = A if(!state_open) to_chat(user, "The unit's doors are shut!") diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index 1ebe8cb463f..1b32b642cba 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -54,7 +54,7 @@ // Only humans can enter from the west side, while lying down. var/move_dir = get_dir(loc, AM.loc) var/mob/living/carbon/human/H = AM - if((transform_standing || H.lying) && move_dir == EAST)// || move_dir == WEST) + if((transform_standing || !(H.mobility_flags & MOBILITY_STAND)) && move_dir == EAST)// || move_dir == WEST) AM.forceMove(drop_location()) do_transform(AM) diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index 5dbccbb99cf..357be713a2c 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -227,6 +227,8 @@ M.adjustOxyLoss(-1) M.AdjustStun(-80) M.AdjustKnockdown(-80) + M.AdjustParalyzed(-80) + M.AdjustImmobilized(-80) M.AdjustUnconscious(-80) if(M.reagents.get_reagent_amount("epinephrine") < 5) M.reagents.add_reagent("epinephrine", 5) diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index c632f2757da..2ca7f1e478b 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -177,7 +177,7 @@ M.SetSleeping(0) M.stuttering += 20 M.adjustEarDamage(0, 30) - M.Knockdown(60) + M.Paralyze(60) if(prob(30)) M.Stun(200) M.Unconscious(80) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index c142269a81d..f24cde53f36 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -741,7 +741,7 @@ AI.cancel_camera() AI.controlled_mech = src AI.remote_control = src - AI.canmove = 1 //Much easier than adding AI checks! Be sure to set this back to 0 if you decide to allow an AI to leave a mech somehow. + AI.mobility_flags = ALL //Much easier than adding AI checks! Be sure to set this back to 0 if you decide to allow an AI to leave a mech somehow. AI.can_shunt = 0 //ONE AI ENTERS. NO AI LEAVES. to_chat(AI, AI.can_dominate_mechs ? "Takeover of [name] complete! You are now loaded onto the onboard computer. Do not attempt to leave the station sector!" :\ "You have been uploaded to a mech's onboard computer.") @@ -914,7 +914,7 @@ brainmob.forceMove(src) //should allow relaymove brainmob.reset_perspective(src) brainmob.remote_control = src - brainmob.update_canmove() + brainmob.update_mobility() brainmob.update_mouse_pointer() icon_state = initial(icon_state) update_icon() @@ -980,7 +980,7 @@ L.reset_perspective() mmi.mecha = null mmi.update_icon() - L.canmove = 0 + L.mobility_flags = NONE icon_state = initial(icon_state)+"-open" setDir(dir_in) diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 9c3df5395f3..2ff97e86c7e 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -66,7 +66,7 @@ M.buckled = src M.setDir(dir) buckled_mobs |= M - M.update_canmove() + M.update_mobility() M.throw_alert("buckled", /obj/screen/alert/restrained/buckled) post_buckle_mob(M) @@ -85,7 +85,7 @@ . = buckled_mob buckled_mob.buckled = null buckled_mob.anchored = initial(buckled_mob.anchored) - buckled_mob.update_canmove() + buckled_mob.update_mobility() buckled_mob.clear_alert("buckled") buckled_mobs -= buckled_mob SEND_SIGNAL(src, COMSIG_MOVABLE_UNBUCKLE, buckled_mob, force) diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 625b2d3c824..438a92dc8c6 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -113,7 +113,7 @@ /obj/effect/anomaly/grav/proc/gravShock(mob/living/A) if(boing && isliving(A) && !A.stat) - A.Knockdown(40) + A.Paralyze(40) var/atom/target = get_edge_target_turf(A, get_dir(src, get_step_away(A, src))) A.throw_at(target, 5, 1) boing = 0 diff --git a/code/game/objects/effects/effect_system/effects_other.dm b/code/game/objects/effects/effect_system/effects_other.dm index 18c1ff58902..cc9de7794de 100644 --- a/code/game/objects/effects/effect_system/effects_other.dm +++ b/code/game/objects/effects/effect_system/effects_other.dm @@ -112,7 +112,7 @@ for(var/mob/living/L in viewers(1, location)) if(prob(50 * amount)) to_chat(L, "The explosion knocks you down.") - L.Knockdown(rand(20,100)) + L.Paralyze(rand(20,100)) return else dyn_explosion(location, amount, flashing_factor) \ No newline at end of file diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 12a72685bb3..5205ec682c9 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -48,7 +48,7 @@ /obj/effect/mine/stun/mineEffect(mob/living/victim) if(isliving(victim)) - victim.Knockdown(stun_time) + victim.Paralyze(stun_time) /obj/effect/mine/kickmine name = "kick mine" diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm index 3e0848130d8..b2d81dce0a6 100644 --- a/code/game/objects/effects/step_triggers.dm +++ b/code/game/objects/effects/step_triggers.dm @@ -61,10 +61,10 @@ if(AM in T.affecting) return - if(ismob(AM)) - var/mob/M = AM + if(isliving(AM)) + var/mob/living/M = AM if(immobilize) - M.canmove = 0 + M.mobility_flags &= ~MOBILITY_MOVE affecting.Add(AM) while(AM && !stopthrow) @@ -98,10 +98,11 @@ affecting.Remove(AM) - if(ismob(AM)) - var/mob/M = AM + if(isliving(AM)) + var/mob/living/M = AM if(immobilize) - M.canmove = 1 + M.mobility_flags |= MOBILITY_MOVE + M.update_mobility() /* Stops things thrown by a thrower, doesn't do anything */ diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 7d7062026d2..3a505464d38 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -173,14 +173,17 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) set category = "Object" set src in oview(1) - if(!isturf(loc) || usr.stat || usr.restrained() || !usr.canmove) + if(!isturf(loc) || usr.stat || usr.restrained()) return - var/turf/T = src.loc + if(isliving(usr)) + var/mob/living/L = usr + if(!(L.mobility_flags & MOBILITY_PICKUP)) + return - src.loc = null - - src.loc = T + var/turf/T = loc + loc = null + loc = T /obj/item/examine(mob/user) //This might be spammy. Remove? ..() @@ -413,9 +416,14 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) set category = "Object" set name = "Pick up" - if(usr.incapacitated() || !Adjacent(usr) || usr.lying) + if(usr.incapacitated() || !Adjacent(usr)) return + if(isliving(usr)) + var/mob/living/L = usr + if(!(L.mobility_flags & MOBILITY_PICKUP)) + return + if(usr.get_active_held_item() == null) // Let me know if this has any problems -Yota usr.UnarmedAttack(src) @@ -502,7 +510,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) to_chat(M, "You drop what you're holding and clutch at your eyes!") M.adjust_blurriness(10) M.Unconscious(20) - M.Knockdown(40) + M.Paralyze(40) if (prob(eyes.eye_damage - 10 + 1)) M.become_blind(EYE_DAMAGE) to_chat(M, "You go blind!") diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm index f7c37715aab..d476827e512 100644 --- a/code/game/objects/items/chrono_eraser.dm +++ b/code/game/objects/items/chrono_eraser.dm @@ -108,8 +108,8 @@ if(F) if(field == F) var/turf/currentpos = get_turf(src) - var/mob/living/user = src.loc - if((currentpos == startpos) && (field in view(CHRONO_BEAM_RANGE, currentpos)) && !user.lying && (user.stat == CONSCIOUS)) + var/mob/living/user = loc + if((currentpos == startpos) && (field in view(CHRONO_BEAM_RANGE, currentpos)) && (user.mobility_flags & MOBILITY_STAND) && (user.stat == CONSCIOUS)) return 1 field_disconnect(F) return 0 @@ -150,8 +150,8 @@ gun = loc . = ..() - - + + /obj/effect/chrono_field diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 1214a60946d..8ac62d839d2 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -859,7 +859,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(prob(5))//small chance for the vape to break and deal damage if it's emagged playsound(get_turf(src), 'sound/effects/pop_expl.ogg', 50, 0) M.apply_damage(20, BURN, BODY_ZONE_HEAD) - M.Knockdown(300, 1, 0) + M.Paralyze(300, 1, 0) var/datum/effect_system/spark_spread/sp = new /datum/effect_system/spark_spread sp.set_up(5, 1, src) sp.start() diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index fd1bc9e0d5f..1e29c104107 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -638,7 +638,7 @@ C.blind_eyes(1) if(C.get_eye_protection() <= 0) // no eye protection? ARGH IT BURNS. C.confused = max(C.confused, 3) - C.Knockdown(60) + C.Paralyze(60) if(ishuman(C) && actually_paints) var/mob/living/carbon/human/H = C H.lip_style = "spray_face" diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 24cee2f21d3..641a51030d6 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -456,7 +456,7 @@ M.visible_message("[user] has touched [M] with [src]!", \ "[user] has touched [M] with [src]!") M.adjustStaminaLoss(50) - M.Knockdown(100) + M.Paralyze(100) M.updatehealth() //forces health update before next life tick playsound(src, 'sound/machines/defib_zap.ogg', 50, 1, -1) M.emote("gasp") @@ -512,7 +512,7 @@ H.set_heartattack(TRUE) H.apply_damage(50, BURN, BODY_ZONE_CHEST) log_combat(user, H, "overloaded the heart of", defib) - H.Knockdown(100) + H.Paralyze(100) H.Jitter(100) if(req_defib) defib.deductcharge(revivecost) diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm index d526f3026e9..67905a47b60 100644 --- a/code/game/objects/items/devices/camera_bug.dm +++ b/code/game/objects/items/devices/camera_bug.dm @@ -178,10 +178,11 @@ else names[M.name] = 1 dat += "[M.name]" - if(M.buckled && !M.lying) - dat += " (Sitting)" - if(M.lying) - dat += " (Laying down)" + if(!(M.mobility_flags & MOBILITY_STAND)) + if(M.buckled) + dat += " (Sitting)" + else + dat += " (Laying down)" dat += " \[Track\]
" if(length(dat) == 0) dat += "No motion detected." diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm index 17a05629102..7e0cf2a60f1 100644 --- a/code/game/objects/items/devices/instruments.dm +++ b/code/game/objects/items/devices/instruments.dm @@ -41,11 +41,8 @@ /obj/item/instrument/interact(mob/user) ui_interact(user) -/obj/item/instrument/ui_interact(mob/user) - if(!user) - return - - if(!isliving(user) || user.stat || user.restrained() || user.lying) +/obj/item/instrument/ui_interact(mob/living/user) + if(!isliving(user) || user.stat || user.restrained() || !(user.mobility_flags & MOBILITY_STAND)) return user.set_machine(src) diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 2b553318c28..c22f17c52cf 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -113,7 +113,7 @@ //chance to actually hit the eyes depends on internal component if(prob(effectchance * diode.rating)) S.flash_act(affect_silicon = 1) - S.Knockdown(rand(100,200)) + S.Paralyze(rand(100,200)) to_chat(S, "Your sensors were overloaded by a laser!") outmsg = "You overload [S] by shining [src] at [S.p_their()] sensors." else @@ -133,7 +133,7 @@ for(var/mob/living/carbon/human/H in view(1,targloc)) if(!iscatperson(H) || H.incapacitated() || H.eye_blind ) continue - if(!H.lying) + if(user.mobility_flags & MOBILITY_STAND) H.setDir(get_dir(H,targloc)) // kitty always looks at the light if(prob(effectchance)) H.visible_message("[H] makes a grab for the light!","LIGHT!") @@ -149,8 +149,7 @@ if(prob(50)) C.visible_message("[C] pounces on the light!","LIGHT!") C.Move(targloc) - C.resting = TRUE - C.update_canmove() + C.set_resting(TRUE, FALSE) else C.visible_message("[C] looks uninterested in your games.","You spot [user] shining [src] at you. How insulting!") diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index 2f8b111b4b5..975a53bb11a 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -116,7 +116,7 @@ s.set_up(3, 1, L) s.start() - L.Knockdown(100) + L.Paralyze(100) if(master) master.receive_signal() diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 5a68a8423ac..73fc34e0f42 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -350,7 +350,7 @@ SLIME SCANNER set name = "Switch Verbosity" set category = "Object" - if(usr.stat || !usr.canmove || usr.restrained()) + if(usr.incapacitated()) return mode = !mode diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 2c234a59ba2..12a0b7db289 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -44,7 +44,7 @@ effective or pretty fucking useless. for(var/mob/living/carbon/human/M in urange(10, user, 1)) if(prob(50)) - M.Knockdown(rand(200,400)) + M.Paralyze(rand(200,400)) to_chat(M, "You feel a tremendous, paralyzing wave flood your mind.") else diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index 8d0d8d020ed..bf2f2fe2570 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -240,7 +240,7 @@ /obj/item/book/granter/spell/knock/recoil(mob/living/user) ..() to_chat(user,"You're knocked down!") - user.Knockdown(40) + user.Paralyze(40) /obj/item/book/granter/spell/barnyard spell = /obj/effect/proc_holder/spell/targeted/barnyardcurse diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm index e8b5704e413..32054490180 100644 --- a/code/game/objects/items/grenades/flashbang.dm +++ b/code/game/objects/items/grenades/flashbang.dm @@ -26,10 +26,10 @@ //Flash if(M.flash_act(affect_silicon = 1)) - M.Knockdown(max(200/max(1,distance), 60)) + M.Paralyze(max(200/max(1,distance), 60)) //Bang if(!distance || loc == M || loc == M.loc) //Stop allahu akbarring rooms with this. - M.Knockdown(200) + M.Paralyze(200) M.soundbang_act(1, 200, 10, 15) else diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index b92186a467d..72d8467c734 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -270,7 +270,7 @@ if(iscarbon(L)) var/mob/living/carbon/C = L snap = 1 - if(!C.lying) + if(C.mobility_flags & MOBILITY_STAND) def_zone = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) if(!C.legcuffed && C.get_num_legs(FALSE) >= 2) //beartrap can't cuff your leg if there's already a beartrap or legcuffs, or you don't have two legs. C.legcuffed = src @@ -340,7 +340,7 @@ C.update_inv_legcuffed() SSblackbox.record_feedback("tally", "handcuffs", 1, type) to_chat(C, "\The [src] ensnares you!") - C.Knockdown(knockdown) + C.Paralyze(knockdown) /obj/item/restraints/legcuffs/bola/tactical//traitor variant name = "reinforced bola" diff --git a/code/game/objects/items/his_grace.dm b/code/game/objects/items/his_grace.dm index af6f96308c4..af9ee062c6a 100644 --- a/code/game/objects/items/his_grace.dm +++ b/code/game/objects/items/his_grace.dm @@ -91,7 +91,7 @@ master.emote("scream") master.remove_status_effect(STATUS_EFFECT_HISGRACE) item_flags &= ~NODROP - master.Knockdown(60) + master.Paralyze(60) master.adjustBruteLoss(master.maxHealth) playsound(master, 'sound/effects/splat.ogg', 100, 0) else diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 350e7b76c59..531fb7d8669 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -30,7 +30,9 @@ else playsound(src, 'sound/machines/buzz-sigh.ogg', 40, 1) -/obj/item/holybeacon/proc/beacon_armor(mob/M) +/obj/item/holybeacon/proc/beacon_armor(mob/living/M) + if(!istype(M)) + return var/list/holy_armor_list = typesof(/obj/item/storage/box/holy) var/list/display_names = list() for(var/V in holy_armor_list) @@ -38,7 +40,7 @@ display_names += list(initial(A.name) = A) var/choice = input(M,"What holy armor kit would you like to order?","Holy Armor Theme") as null|anything in display_names - if(QDELETED(src) || !choice || M.stat || !in_range(M, src) || M.restrained() || !M.canmove || SSreligion.holy_armor_type) + if(QDELETED(src) || !choice || M.stat || !in_range(M, src) || M.restrained() || !(M.mobility_flags & MOBILITY_USE) || SSreligion.holy_armor_type) return var/index = display_names.Find(choice) @@ -207,7 +209,7 @@ display_names[initial(rodtype.name)] = rodtype var/choice = input(M,"What theme would you like for your holy weapon?","Holy Weapon Theme") as null|anything in display_names - if(QDELETED(src) || !choice || M.stat || !in_range(M, src) || M.restrained() || !M.canmove || reskinned) + if(QDELETED(src) || !choice || M.stat || !in_range(M, src) || M.incapacitated() || reskinned) return var/A = display_names[choice] // This needs to be on a separate var as list member access is not allowed for new diff --git a/code/game/objects/items/hot_potato.dm b/code/game/objects/items/hot_potato.dm index 4a6c37277f5..4077105a5c7 100644 --- a/code/game/objects/items/hot_potato.dm +++ b/code/game/objects/items/hot_potato.dm @@ -74,6 +74,8 @@ L.SetStun(0) L.SetKnockdown(0) L.SetSleeping(0) + L.SetImmobilized(0) + L.SetParalyzed(0) L.SetUnconscious(0) L.reagents.add_reagent("muscle_stimulant", CLAMP(5 - L.reagents.get_reagent_amount("muscle_stimulant"), 0, 5)) //If you don't have legs or get bola'd, tough luck! colorize(L) diff --git a/code/game/objects/items/implants/implant_explosive.dm b/code/game/objects/items/implants/implant_explosive.dm index 9556addc630..2ec1e94a3fc 100644 --- a/code/game/objects/items/implants/implant_explosive.dm +++ b/code/game/objects/items/implants/implant_explosive.dm @@ -71,7 +71,7 @@ sleep(delay*0.25) if(imp_in && !imp_in.stat) imp_in.visible_message("[imp_in] doubles over in pain!") - imp_in.Knockdown(140) + imp_in.Paralyze(140) playsound(loc, 'sound/items/timer.ogg', 30, 0) sleep(delay*0.25) playsound(loc, 'sound/items/timer.ogg', 30, 0) diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm index 24ee6d09666..6835461b105 100644 --- a/code/game/objects/items/implants/implant_misc.dm +++ b/code/game/objects/items/implants/implant_misc.dm @@ -37,9 +37,11 @@ imp_in.SetStun(0) imp_in.SetKnockdown(0) imp_in.SetUnconscious(0) + imp_in.SetParalyzed(0) + imp_in.SetImmobilized(0) imp_in.adjustStaminaLoss(-75) - imp_in.lying = 0 - imp_in.update_canmove() + imp_in.set_resting(FALSE) + imp_in.update_mobility() imp_in.reagents.add_reagent("synaptizine", 10) imp_in.reagents.add_reagent("omnizine", 10) diff --git a/code/game/objects/items/implants/implantchair.dm b/code/game/objects/items/implants/implantchair.dm index 36c79bd454c..7b30e5d7b46 100644 --- a/code/game/objects/items/implants/implantchair.dm +++ b/code/game/objects/items/implants/implantchair.dm @@ -138,8 +138,12 @@ to_chat(user, "[src]'s door won't budge!") /obj/machinery/implantchair/MouseDrop_T(mob/target, mob/user) - if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !isliving(target) || !user.IsAdvancedToolUser()) + if(user.stat || !Adjacent(user) || !user.Adjacent(target) || !isliving(target) || !user.IsAdvancedToolUser()) return + if(isliving(user)) + var/mob/living/L = user + if(!(L.mobility_flags & MOBILITY_STAND)) + return close_machine(target) /obj/machinery/implantchair/close_machine(mob/living/user) diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 1565c2f0968..da8107f0d3f 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -154,7 +154,7 @@ add_fingerprint(user) if((user.has_trait(TRAIT_CLUMSY)) && prob(50)) to_chat(user, "You club yourself over the head.") - user.Knockdown(60 * force) + user.Paralyze(60 * force) if(ishuman(user)) var/mob/living/carbon/human/H = user H.apply_damage(2*force, BRUTE, BODY_ZONE_HEAD) @@ -180,7 +180,7 @@ if(check_martial_counter(H, user)) return playsound(get_turf(src), 'sound/effects/woodhit.ogg', 75, 1, -1) - target.Knockdown(60) + target.Paralyze(60) log_combat(user, target, "stunned", src) src.add_fingerprint(user) target.visible_message("[user] has knocked down [target] with [src]!", \ diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index dd36131d722..d6f3a3394a6 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -170,7 +170,7 @@ if(pressureSetting >= 3 && iscarbon(user)) var/mob/living/carbon/C = user C.visible_message("[C] is thrown down by the force of the cannon!", "[src] slams into your shoulder, knocking you down!") - C.Knockdown(60) + C.Paralyze(60) /obj/item/pneumatic_cannon/proc/fire_items(turf/target, mob/user) if(fire_mode == PCANNON_FIREALL) diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm index a80aa1be602..b6781eb3ad9 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -66,6 +66,8 @@ H.adjustFireLoss(-15) H.AdjustStun(-40) H.AdjustKnockdown(-40) + H.AdjustImmobilized(-40) + H.AdjustParalyzed(-40) H.AdjustUnconscious(-40) playsound(H, 'sound/magic/staff_healing.ogg', 25, FALSE) diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index d7f0b03837b..c2651e78650 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -22,7 +22,7 @@ return user.do_attack_animation(M) - M.Knockdown(100) + M.Paralyze(100) M.apply_effect(EFFECT_STUTTER, 5) M.visible_message("[user] has prodded [M] with [src]!", \ @@ -76,15 +76,14 @@ user.do_attack_animation(M, ATTACK_EFFECT_BOOP) playsound(loc, 'sound/weapons/tap.ogg', 50, 1, -1) else if(ishuman(M)) - if(M.lying) + if(!(user.mobility_flags & MOBILITY_STAND)) user.visible_message("[user] shakes [M] trying to get [M.p_them()] up!", \ "You shake [M] trying to get [M.p_them()] up!") else user.visible_message("[user] hugs [M] to make [M.p_them()] feel better!", \ "You hug [M] to make [M.p_them()] feel better!") if(M.resting) - M.resting = FALSE - M.update_canmove() + M.set_resting(FALSE, TRUE) else user.visible_message("[user] pets [M]!", \ "You pet [M]!") @@ -92,7 +91,7 @@ if(1) if(M.health >= 0) if(ishuman(M)) - if(M.lying) + if(!(M.mobility_flags & MOBILITY_STAND)) user.visible_message("[user] shakes [M] trying to get [M.p_them()] up!", \ "You shake [M] trying to get [M.p_them()] up!") else if(user.zone_selected == BODY_ZONE_HEAD) @@ -103,8 +102,7 @@ user.visible_message("[user] hugs [M] in a firm bear-hug! [M] looks uncomfortable...", \ "You hug [M] firmly to make [M.p_them()] feel better! [M] looks uncomfortable...") if(M.resting) - M.resting = FALSE - M.update_canmove() + M.set_resting(FALSE, TRUE) else user.visible_message("[user] bops [M] on the head!", \ "You bop [M] on the head!") @@ -116,7 +114,7 @@ M.electrocute_act(5, "[user]", safety = 1) user.visible_message("[user] electrocutes [M] with [user.p_their()] touch!", \ "You electrocute [M] with your touch!") - M.update_canmove() + M.update_mobility() else if(!iscyborg(M)) M.adjustFireLoss(10) @@ -330,7 +328,7 @@ C.stuttering += 10 C.Jitter(10) if(2) - C.Knockdown(40) + C.Paralyze(40) C.confused += 10 C.stuttering += 15 C.Jitter(25) diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 63ac8009a22..0e11522b6b3 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -317,8 +317,8 @@ O.robot_suit = src if(!locomotion) - O.lockcharge = 1 - O.update_canmove() + O.lockcharge = TRUE + O.update_mobility() to_chat(O, "Error: Servo motors unresponsive.") else @@ -357,7 +357,7 @@ O.robot_suit = src if(!locomotion) O.lockcharge = TRUE - O.update_canmove() + O.update_mobility() else if(istype(W, /obj/item/pen)) to_chat(user, "You need to use a multitool to name [src]!") diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index aa0c504bb4d..521ce2ed794 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -204,7 +204,7 @@ set name = "Activate Seed Extraction" set category = "Object" set desc = "Activate to convert your plants into plantable seeds." - if(usr.stat || !usr.canmove || usr.restrained()) + if(usr.incapacitated()) return for(var/obj/item/O in contents) seedify(O, 1) @@ -310,7 +310,7 @@ if(ishuman(M) || ismonkey(M)) if(prob(10)) - M.Knockdown(40) + M.Paralyze(40) update_icon() /obj/item/storage/bag/tray/update_icon() diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index 6bb7a87b29b..3e57b2d51b3 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -115,7 +115,7 @@ if(status && user.has_trait(TRAIT_CLUMSY) && prob(50)) user.visible_message("[user] accidentally hits [user.p_them()]self with [src]!", \ "You accidentally hit yourself with [src]!") - user.Knockdown(stunforce*3) + user.Paralyze(stunforce*3) deductcharge(hitcost) return @@ -157,7 +157,7 @@ if(!deductcharge(hitcost)) return 0 - L.Knockdown(stunforce) + L.Paralyze(stunforce) L.apply_effect(EFFECT_STUTTER, stunforce) SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK) if(user) diff --git a/code/game/objects/items/teleprod.dm b/code/game/objects/items/teleprod.dm index fd9972f4274..b218777cd2b 100644 --- a/code/game/objects/items/teleprod.dm +++ b/code/game/objects/items/teleprod.dm @@ -13,11 +13,11 @@ "You accidentally hit yourself with [src]!") if(do_teleport(user, get_turf(user), 50))//honk honk SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK) - user.Knockdown(stunforce*3) + user.Paralyze(stunforce*3) deductcharge(hitcost) else SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK) - user.Knockdown(stunforce*3) + user.Paralyze(stunforce*3) deductcharge(hitcost/4) return else diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index be3e6bd0e23..2f8dabffe50 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -677,8 +677,10 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE //ATTACK HAND NOT CALLING PARENT /obj/item/toy/cards/deck/attack_hand(mob/user) - if(user.lying) - return + if(isliving(user)) + var/mob/living/L = user + if(!(L.mobility_flags & MOBILITY_PICKUP)) + return var/choice = null if(cards.len == 0) to_chat(user, "There are no more cards to draw!") @@ -745,7 +747,7 @@ /obj/item/toy/cards/deck/MouseDrop(atom/over_object) . = ..() var/mob/living/M = usr - if(!istype(M) || usr.incapacitated() || usr.lying) + if(!istype(M) || !(M.mobility_flags & MOBILITY_PICKUP)) return if(Adjacent(usr)) if(over_object == M && loc != M) @@ -791,9 +793,11 @@ /obj/item/toy/cards/cardhand/Topic(href, href_list) if(..()) return - if(usr.stat || !ishuman(usr) || !usr.canmove) + if(usr.stat || !ishuman(usr)) return var/mob/living/carbon/human/cardUser = usr + if(!(cardUser.mobility_flags & MOBILITY_USE)) + return var/O = src if(href_list["pick"]) if (cardUser.is_holding(src)) @@ -932,8 +936,8 @@ else return ..() -/obj/item/toy/cards/singlecard/attack_self(mob/user) - if(usr.stat || !ishuman(usr) || !usr.canmove || usr.restrained()) +/obj/item/toy/cards/singlecard/attack_self(mob/living/carbon/human/user) + if(!ishuman(user) || !(user.mobility_flags & MOBILITY_USE)) return Flip() diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 68c4ffeee87..e3c855db539 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -32,7 +32,7 @@ if(structureclimber && structureclimber != user) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) - structureclimber.Knockdown(40) + structureclimber.Paralyze(40) structureclimber.visible_message("[structureclimber] has been knocked off [src].", "You're knocked off [src]!", "You see [structureclimber] get knocked off [src].") /obj/structure/ui_act(action, params) @@ -44,7 +44,8 @@ if(!climbable) return if(user == O && iscarbon(O)) - if(user.canmove) + var/mob/living/carbon/C = O + if(C.mobility_flags & MOBILITY_MOVE) climb_structure(user) return if(!istype(O, /obj/item) || user.get_active_held_item() != O) diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 8f82140233b..a3b8fd0551e 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -324,7 +324,7 @@ if(iscarbon(target)) var/mob/living/carbon/C = target if(C.health < C.maxHealth*0.5) - C.Knockdown(20) + C.Paralyze(20) smash(user) diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 8b6f518f3e9..a23ce32842d 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -337,8 +337,10 @@ LINEN BINS . = ..() if(.) return - if(user.lying) - return + if(isliving(user)) + var/mob/living/L = user + if(!(L.mobility_flags & MOBILITY_PICKUP)) + return if(amount >= 1) amount-- diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index c3cdd98d277..ce4edd85a68 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -280,7 +280,7 @@ /obj/structure/closet/MouseDrop_T(atom/movable/O, mob/living/user) if(!istype(O) || O.anchored || istype(O, /obj/screen)) return - if(!istype(user) || user.incapacitated() || user.lying) + if(!istype(user) || user.incapacitated() || !(user.mobility_flags & MOBILITY_STAND)) return if(!Adjacent(user) || !user.Adjacent(O)) return @@ -309,7 +309,7 @@ "You hear a loud metal bang.") var/mob/living/L = O if(!issilicon(L)) - L.Knockdown(40) + L.Paralyze(40) O.forceMove(T) close() else @@ -326,11 +326,11 @@ return container_resist(user) -/obj/structure/closet/attack_hand(mob/user) +/obj/structure/closet/attack_hand(mob/living/user) . = ..() if(.) return - if(user.lying && get_dist(src, user) > 0) + if(!(user.mobility_flags & MOBILITY_STAND) && get_dist(src, user) > 0) return if(!toggle(user)) @@ -352,7 +352,7 @@ set category = "Object" set name = "Toggle Open" - if(!usr.canmove || usr.stat || usr.restrained()) + if(!usr.incapacitated()) return if(iscarbon(usr) || issilicon(usr) || isdrone(usr)) diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm index 4726707996a..d4b64c86d63 100644 --- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm +++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm @@ -17,8 +17,8 @@ var/move_delay = FALSE var/egged = 0 -/obj/structure/closet/cardboard/relaymove(mob/user, direction) - if(opened || move_delay || user.stat || user.IsStun() || user.IsKnockdown() || user.IsUnconscious() || !isturf(loc) || !has_gravity(loc)) +/obj/structure/closet/cardboard/relaymove(mob/living/user, direction) + if(!istype(user) || opened || move_delay || user.incapacitated() || !isturf(loc) || !has_gravity(loc)) return move_delay = TRUE if(step(src, direction)) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index bb56b631364..e4573320785 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -132,7 +132,7 @@ src.visible_message(text("[M] falls free of [src]!")) unbuckle_mob(M,force=1) M.emote("scream") - M.AdjustKnockdown(20) + M.AdjustParalyzed(20) /obj/structure/kitchenspike/Destroy() if(has_buckled_mobs()) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 5ff3e91d6c9..ac82c101f75 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -343,8 +343,12 @@ GLOBAL_LIST_EMPTY(crematoriums) var/mob/M = O if(M.buckled) return - if(!ismob(user) || user.lying || user.incapacitated()) + if(!ismob(user) || user.incapacitated()) return + if(isliving(user)) + var/mob/living/L = user + if(!(L.mobility_flags & MOBILITY_STAND)) + return O.forceMove(src.loc) if (user != O) visible_message("[user] stuffs [O] into [src].") diff --git a/code/game/objects/structures/petrified_statue.dm b/code/game/objects/structures/petrified_statue.dm index 815dd9de6d1..1db20b8c95b 100644 --- a/code/game/objects/structures/petrified_statue.dm +++ b/code/game/objects/structures/petrified_statue.dm @@ -49,7 +49,7 @@ if(S.mind) if(petrified_mob) S.mind.transfer_to(petrified_mob) - petrified_mob.Knockdown(100) + petrified_mob.Paralyze(100) to_chat(petrified_mob, "You slowly come back to your senses. You are in control of yourself again!") qdel(S) diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index e3862ed9246..d4dbe82acda 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -87,7 +87,7 @@ return 1 if(M.buckled && istype(M.buckled, /mob/living/simple_animal/bot/mulebot)) // mulebot passenger gets a free pass. return 1 - if(!M.lying && !M.ventcrawler && M.mob_size != MOB_SIZE_TINY) //If your not laying down, or a ventcrawler or a small creature, no pass. + if((M.mobility_flags & MOBILITY_STAND) && !M.ventcrawler && M.mob_size != MOB_SIZE_TINY) //If your not laying down, or a ventcrawler or a small creature, no pass. return 0 return ..() diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 980e3a71df5..e3236403a49 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -107,9 +107,8 @@ . = . || (mover.pass_flags & PASSTABLE) /obj/structure/table/proc/tableplace(mob/living/user, mob/living/pushed_mob) - pushed_mob.forceMove(src.loc) - pushed_mob.resting = TRUE - pushed_mob.update_canmove() + pushed_mob.forceMove(loc) + pushed_mob.set_resting(TRUE, TRUE) pushed_mob.visible_message("[user] places [pushed_mob] onto [src].", \ "[user] places [pushed_mob] onto [src].") log_combat(user, pushed_mob, "placed") @@ -124,7 +123,7 @@ pushed_mob.pass_flags &= ~PASSTABLE if(pushed_mob.loc != loc) //Something prevented the tabling return - pushed_mob.Knockdown(40) + pushed_mob.Paralyze(40) pushed_mob.visible_message("[user] pushes [pushed_mob] onto [src].", \ "[user] pushes [pushed_mob] onto [src].") log_combat(user, pushed_mob, "pushed") @@ -236,7 +235,7 @@ debris -= AM if(istype(AM, /obj/item/shard)) AM.throw_impact(L) - L.Knockdown(100) + L.Paralyze(100) qdel(src) /obj/structure/table/glass/deconstruct(disassembled = TRUE, wrench_disassembly = 0) @@ -433,23 +432,20 @@ break /obj/structure/table/optable/tablepush(mob/living/user, mob/living/pushed_mob) - pushed_mob.forceMove(src.loc) - pushed_mob.resting = 1 - pushed_mob.update_canmove() + pushed_mob.forceMove(loc) + pushed_mob.set_resting(TRUE, TRUE) visible_message("[user] has laid [pushed_mob] on [src].") check_patient() /obj/structure/table/optable/proc/check_patient() - var/mob/M = locate(/mob/living/carbon/human, loc) + var/mob/living/carbon/human/M = locate(/mob/living/carbon/human, loc) if(M) if(M.resting) patient = M - return 1 + return TRUE else patient = null - return 0 - - + return FALSE /* * Racks @@ -509,7 +505,7 @@ . = ..() if(.) return - if(user.IsKnockdown() || user.resting || user.lying || user.get_num_legs() < 2) + if(!(user.mobility_flags & MOBILITY_STAND) || user.get_num_legs() < 2) return user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src, ATTACK_EFFECT_KICK) diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 99070fc8676..e6f4bf7c2c9 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -44,8 +44,10 @@ //pod insertion /obj/structure/transit_tube/station/MouseDrop_T(obj/structure/c_transit_tube_pod/R, mob/user) - if(!user.canmove || user.stat || user.restrained()) - return + if(isliving(user)) + var/mob/living/L = user + if(L.incapacitated()) + return if (!istype(R) || get_dist(user, src) > 1 || get_dist(src,R) > 1) return for(var/obj/structure/transit_tube_pod/pod in loc) @@ -74,7 +76,7 @@ pod.visible_message("[user] starts putting [GM] into the [pod]!") if(do_after(user, 15, target = src)) if(open_status == STATION_TUBE_OPEN && GM && user.grab_state >= GRAB_AGGRESSIVE && user.pulling == GM && !GM.buckled && !GM.has_buckled_mobs()) - GM.Knockdown(100) + GM.Paralyze(100) src.Bumped(GM) break else diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm index 34f8c05c4f4..414f7efeef0 100644 --- a/code/game/objects/structures/traps.dm +++ b/code/game/objects/structures/traps.dm @@ -81,7 +81,7 @@ /obj/structure/trap/stun/trap_effect(mob/living/L) L.electrocute_act(30, src, safety=1) // electrocute act does a message. - L.Knockdown(100) + L.Paralyze(100) /obj/structure/trap/fire name = "flame trap" @@ -90,7 +90,7 @@ /obj/structure/trap/fire/trap_effect(mob/living/L) to_chat(L, "Spontaneous combustion!") - L.Knockdown(20) + L.Paralyze(20) /obj/structure/trap/fire/flare() ..() @@ -104,7 +104,7 @@ /obj/structure/trap/chill/trap_effect(mob/living/L) to_chat(L, "You're frozen solid!") - L.Knockdown(20) + L.Paralyze(20) L.adjust_bodytemperature(-300) L.apply_status_effect(/datum/status_effect/freon) @@ -117,7 +117,7 @@ /obj/structure/trap/damage/trap_effect(mob/living/L) to_chat(L, "The ground quakes beneath your feet!") - L.Knockdown(100) + L.Paralyze(100) L.adjustBruteLoss(35) /obj/structure/trap/damage/flare() diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 4694184e195..a2696123c2c 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -521,7 +521,7 @@ if(B.cell.charge > 0 && B.status == 1) flick("baton_active", src) var/stunforce = B.stunforce - user.Knockdown(stunforce) + user.Paralyze(stunforce) user.stuttering = stunforce/20 B.deductcharge(B.hitcost) user.visible_message("[user] shocks [user.p_them()]self while attempting to wash the active [B.name]!", \ diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index a957866ebc1..bd568803844 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -343,9 +343,14 @@ set name = "Flip Windoor Assembly" set category = "Object" set src in oview(1) - if(usr.stat || !usr.canmove || usr.restrained()) + if(usr.stat || usr.restrained()) return + if(isliving(usr)) + var/mob/living/L = usr + if(!(L.mobility_flags & MOBILITY_USE)) + return + if(facing == "l") to_chat(usr, "The windoor will now slide to the right.") facing = "r" diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index d149079995e..cd6ab03a660 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -218,7 +218,7 @@ if(!(lube&GALOSHES_DONT_HELP)) //can't slip while buckled unless it's lube. return 0 else - if(C.lying || !(C.status_flags & CANKNOCKDOWN)) // can't slip unbuckled mob if they're lying or can't fall. + if(!(C.mobility_flags & MOBILITY_STAND) || !(C.status_flags & CANKNOCKDOWN)) // can't slip unbuckled mob if they're lying or can't fall. return 0 if(C.m_intent == MOVE_INTENT_WALK && (lube&NO_SLIP_WHEN_WALKING)) return 0 @@ -233,7 +233,7 @@ var/olddir = C.dir C.moving_diagonally = 0 //If this was part of diagonal move slipping will stop it. if(!(lube & SLIDE_ICE)) - C.Knockdown(knockdown_amount) + C.Paralyze(knockdown_amount) C.stop_pulling() else C.Stun(20) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index afe275f9b9f..673125593c7 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -426,7 +426,9 @@ return /turf/handle_fall(mob/faller, forced) - faller.lying = pick(90, 270) + if(isliving(faller)) + var/mob/living/L = faller + L.lying = pick(90, 270) if(!forced) return if(has_gravity(src)) diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm index eed6f9b3ae2..dbb446b46a6 100644 --- a/code/modules/VR/vr_sleeper.dm +++ b/code/modules/VR/vr_sleeper.dm @@ -72,9 +72,15 @@ SStgui.close_user_uis(occupant, src) ..() -/obj/machinery/vr_sleeper/MouseDrop_T(mob/target, mob/user) - if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser()) +/obj/machinery/vr_sleeper/MouseDrop_T(mob/target, mob/living/user) + if(!istype(user)) return + if(user.stat || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser()) + return + if(isliving(user)) + var/mob/living/L = user + if(!(L.mobility_flags & MOBILITY_STAND)) + return close_machine(target) /obj/machinery/vr_sleeper/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) diff --git a/code/modules/admin/verbs/bluespacearty.dm b/code/modules/admin/verbs/bluespacearty.dm index 97248b572b6..5b4b7db663e 100644 --- a/code/modules/admin/verbs/bluespacearty.dm +++ b/code/modules/admin/verbs/bluespacearty.dm @@ -21,6 +21,6 @@ target.gib(1, 1) else target.adjustBruteLoss(min(99,(target.health - 1))) - target.Knockdown(400) + target.Paralyze(400) target.stuttering = 20 diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 9ac618436e0..2d2fdbb8f93 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -112,6 +112,8 @@ M.SetUnconscious(0) M.SetStun(0) M.SetKnockdown(0) + M.SetImmobilized(0) + M.SetParalyzed(0) combat_cooldown = 0 START_PROCESSING(SSobj, src) @@ -503,7 +505,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} L.lastattacker = user.real_name L.lastattackerckey = user.ckey - L.Knockdown(140) + L.Paralyze(140) L.apply_effect(EFFECT_STUTTER, 7) SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK) diff --git a/code/modules/antagonists/abductor/machinery/experiment.dm b/code/modules/antagonists/abductor/machinery/experiment.dm index 10581e7bbb1..e6c69d27ed4 100644 --- a/code/modules/antagonists/abductor/machinery/experiment.dm +++ b/code/modules/antagonists/abductor/machinery/experiment.dm @@ -15,7 +15,8 @@ var/breakout_time = 450 /obj/machinery/abductor/experiment/MouseDrop_T(mob/target, mob/user) - if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user) || !ishuman(target)) + var/mob/living/L = user + if(user.stat || (isliving(user) && (!(L.mobility_flags & MOBILITY_STAND) || !(L.mobility_flags & MOBILITY_UI))) || !Adjacent(user) || !target.Adjacent(user) || !ishuman(target)) return if(isabductor(target)) return diff --git a/code/modules/antagonists/changeling/powers/adrenaline.dm b/code/modules/antagonists/changeling/powers/adrenaline.dm index 34d6e3605b1..451a8f62dd9 100644 --- a/code/modules/antagonists/changeling/powers/adrenaline.dm +++ b/code/modules/antagonists/changeling/powers/adrenaline.dm @@ -9,11 +9,13 @@ //Recover from stuns. /obj/effect/proc_holder/changeling/adrenaline/sting_action(mob/living/user) - to_chat(user, "Energy rushes through us.[user.lying ? " We arise." : ""]") + to_chat(user, "Energy rushes through us.[(!(user.mobility_flags & MOBILITY_STAND)) ? " We arise." : ""]") user.SetSleeping(0) user.SetUnconscious(0) user.SetStun(0) user.SetKnockdown(0) + user.SetImmobilized(0) + user.SetParalyzed(0) user.reagents.add_reagent("changelingadrenaline", 10) user.reagents.add_reagent("changelinghaste", 2) //For a really quick burst of speed user.adjustStaminaLoss(-75) diff --git a/code/modules/antagonists/changeling/powers/fakedeath.dm b/code/modules/antagonists/changeling/powers/fakedeath.dm index 753d858cef8..ee4dd3bcaad 100644 --- a/code/modules/antagonists/changeling/powers/fakedeath.dm +++ b/code/modules/antagonists/changeling/powers/fakedeath.dm @@ -15,7 +15,7 @@ user.tod = station_time_timestamp() user.fakedeath("changeling") //play dead user.update_stat() - user.update_canmove() + user.update_mobility() addtimer(CALLBACK(src, .proc/ready_to_regenerate, user), LING_FAKEDEATH_TIME, TIMER_UNIQUE) return TRUE diff --git a/code/modules/antagonists/changeling/powers/headcrab.dm b/code/modules/antagonists/changeling/powers/headcrab.dm index 70edf1e7885..67818b77da8 100644 --- a/code/modules/antagonists/changeling/powers/headcrab.dm +++ b/code/modules/antagonists/changeling/powers/headcrab.dm @@ -25,7 +25,7 @@ H.confused += 3 for(var/mob/living/silicon/S in range(2,user)) to_chat(S, "Your sensors are disabled by a shower of blood!") - S.Knockdown(60) + S.Paralyze(60) var/turf = get_turf(user) user.gib() . = TRUE diff --git a/code/modules/antagonists/changeling/powers/shriek.dm b/code/modules/antagonists/changeling/powers/shriek.dm index 667dc06daf1..51671ff007a 100644 --- a/code/modules/antagonists/changeling/powers/shriek.dm +++ b/code/modules/antagonists/changeling/powers/shriek.dm @@ -20,7 +20,7 @@ if(issilicon(M)) SEND_SOUND(M, sound('sound/weapons/flash.ogg')) - M.Knockdown(rand(100,200)) + M.Paralyze(rand(100,200)) for(var/obj/machinery/light/L in range(4, user)) L.on = 1 diff --git a/code/modules/antagonists/changeling/powers/strained_muscles.dm b/code/modules/antagonists/changeling/powers/strained_muscles.dm index 832f6073b60..1e10a011e71 100644 --- a/code/modules/antagonists/changeling/powers/strained_muscles.dm +++ b/code/modules/antagonists/changeling/powers/strained_muscles.dm @@ -20,7 +20,7 @@ to_chat(user, "Our muscles relax.") if(stacks >= 10) to_chat(user, "We collapse in exhaustion.") - user.Knockdown(60) + user.Paralyze(60) user.emote("gasp") INVOKE_ASYNC(src, .proc/muscle_loop, user) @@ -33,7 +33,7 @@ if(user.stat != CONSCIOUS || user.staminaloss >= 90) active = !active to_chat(user, "Our muscles relax without the energy to strengthen them.") - user.Knockdown(40) + user.Paralyze(40) user.remove_trait(TRAIT_GOTTAGOFAST, "changeling_muscles") break diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index 97d7f0c1287..b38e2aecbc1 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -80,7 +80,7 @@ if(iscultist(L)) to_chat(L, "\"Watch your step, wretch.\"") L.adjustBruteLoss(10) - L.Knockdown(80, FALSE) + L.Paralyze(80, FALSE) L.visible_message("[src] appears around [L] in a burst of light!", \ "[target_flashed ? "An unseen force":"The glowing sigil around you"] holds you in place!") L.Stun(40) @@ -147,7 +147,7 @@ if(iscarbon(L)) var/mob/living/carbon/M = L M.uncuff() - L.Knockdown(50) //Completely defenseless for five seconds - mainly to give them time to read over the information they've just been presented with + L.Paralyze(50) //Completely defenseless for five seconds - mainly to give them time to read over the information they've just been presented with if(iscarbon(L)) var/mob/living/carbon/C = L C.silent += 5 diff --git a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm index ad83d5f4d20..f079877505e 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/slab_abilities.dm @@ -194,7 +194,7 @@ else L.visible_message("[L]'s eyes blaze with brilliant light!", \ "Your vision suddenly screams with white-hot light!") - L.Knockdown(15) + L.Paralyze(15) L.apply_status_effect(STATUS_EFFECT_KINDLE) L.flash_act(1, 1) if(iscultist(L)) diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm index 3ad66847252..06529f690d7 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm @@ -57,9 +57,9 @@ else if(!..()) if(!L.anti_magic_check()) if(issilicon(L) || iscultist(L)) - L.Knockdown(100) + L.Paralyze(100) else - L.Knockdown(40) + L.Paralyze(40) GLOB.clockwork_vitality += L.adjustFireLoss(bonus_burn * 3) //normally a total of 40 damage, 70 with ratvar break_spear(T) else diff --git a/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm b/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm index f44f67e9cb6..554384b3d30 100644 --- a/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm +++ b/code/modules/antagonists/clockcult/clock_items/judicial_visor.dm @@ -176,7 +176,7 @@ var/datum/status_effect/belligerent/B = C.apply_status_effect(STATUS_EFFECT_BELLIGERENT) if(!QDELETED(B)) B.duration = world.time + 30 - C.Knockdown(5) //knocks down for half a second if affected + C.Paralyze(5) //knocks down for half a second if affected sleep(!GLOB.ratvar_approaches ? 16 : 10) name = "judicial blast" layer = ABOVE_ALL_MOB_LAYER @@ -196,7 +196,7 @@ L.visible_message("Strange energy flows into [L]'s [I.name]!", \ "Your [I.name] shields you from [src]!") continue - L.Knockdown(15) //knocks down briefly when exploding + L.Paralyze(15) //knocks down briefly when exploding if(!iscultist(L)) L.visible_message("[L] is struck by a judicial explosion!", \ "[!issilicon(L) ? "An unseen force slams you into the ground!" : "ERROR: Motor servos disabled by external source!"]") diff --git a/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm b/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm index 8dfadb60bc3..04159639110 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ocular_warden.dm @@ -112,7 +112,7 @@ continue if(is_servant_of_ratvar(L) || (L.has_trait(TRAIT_BLIND)) || L.anti_magic_check(TRUE, TRUE)) continue - if(L.stat || L.lying) + if(L.stat || !(L.mobility_flags & MOBILITY_STAND)) continue if (iscarbon(L)) var/mob/living/carbon/c = L diff --git a/code/modules/antagonists/clockcult/clock_structures/taunting_trail.dm b/code/modules/antagonists/clockcult/clock_structures/taunting_trail.dm index 10c68b606f2..5c323b2dda5 100644 --- a/code/modules/antagonists/clockcult/clock_structures/taunting_trail.dm +++ b/code/modules/antagonists/clockcult/clock_structures/taunting_trail.dm @@ -57,5 +57,5 @@ L.confused = min(L.confused + 15, 50) L.dizziness = min(L.dizziness + 15, 50) if(L.confused >= 25) - L.Knockdown(FLOOR(L.confused * 0.8, 1)) + L.Paralyze(FLOOR(L.confused * 0.8, 1)) take_damage(max_integrity) diff --git a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor.dm b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor.dm index 94f0ba71121..0190ed52c60 100644 --- a/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor.dm +++ b/code/modules/antagonists/clockcult/clock_structures/trap_triggers/pressure_sensor.dm @@ -18,7 +18,7 @@ /obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/Crossed(atom/movable/AM) if(isliving(AM) && !is_servant_of_ratvar(AM)) var/mob/living/L = AM - if(L.stat || L.m_intent == MOVE_INTENT_WALK || L.lying) + if(L.stat || L.m_intent == MOVE_INTENT_WALK || !(L.mobility_flags & MOBILITY_STAND)) return audible_message("*click*") playsound(src, 'sound/items/screwdriver2.ogg', 50, TRUE) diff --git a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm index 63122284474..4ae8f52fe51 100644 --- a/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm +++ b/code/modules/antagonists/clockcult/clock_structures/traps/brass_skewer.dm @@ -22,7 +22,7 @@ if(buckled_mobs && LAZYLEN(buckled_mobs)) var/mob/living/L = buckled_mobs[1] if(iscarbon(L)) - L.Knockdown(100) + L.Paralyze(100) L.visible_message("[L] is maimed as the skewer shatters while still in [L.p_their()] body!") L.adjustBruteLoss(15) unbuckle_mob(L) @@ -110,6 +110,6 @@ return skewee.visible_message("[skewee] comes free of [src] with a squelching pop!", \ "You come free of [src]!") - skewee.Knockdown(30) + skewee.Paralyze(30) playsound(skewee, 'sound/misc/desceration-03.ogg', 50, TRUE) unbuckle_mob(skewee) diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 7fe8b683bb7..52ae1d620fb 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -433,7 +433,7 @@ "A feeling of warmth washes over you, rays of holy light surround your body and protect you from the flash of light!") else to_chat(user, "In an brilliant flash of red, [L] falls to the ground!") - L.Knockdown(160) + L.Paralyze(160) L.flash_act(1,1) if(issilicon(target)) var/mob/living/silicon/S = L diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 449c667f57d..b246ce004ff 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -49,7 +49,7 @@ /obj/item/melee/cultblade/attack(mob/living/target, mob/living/carbon/human/user) if(!iscultist(user)) - user.Knockdown(100) + user.Paralyze(100) user.dropItemToGround(src, TRUE) user.visible_message("A powerful force shoves [user] away from [target]!", \ "\"You shouldn't play with sharp things. You'll poke someone's eye out.\"") @@ -143,7 +143,7 @@ user.emote("scream") user.apply_damage(30, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) user.dropItemToGround(src, TRUE) - user.Knockdown(50) + user.Paralyze(50) return force = initial(force) jaunt.Grant(user, src) @@ -395,7 +395,7 @@ to_chat(user, "An overwhelming sense of nausea overpowers you!") user.dropItemToGround(src, TRUE) user.Dizzy(30) - user.Knockdown(100) + user.Paralyze(100) else to_chat(user, "\"Trying to use things you don't own is bad, you know.\"") to_chat(user, "The armor squeezes at your body!") @@ -447,7 +447,7 @@ to_chat(user, "An overwhelming sense of nausea overpowers you!") user.dropItemToGround(src, TRUE) user.Dizzy(30) - user.Knockdown(100) + user.Paralyze(100) else to_chat(user, "\"Trying to use things you don't own is bad, you know.\"") to_chat(user, "The robes squeeze at your body!") @@ -468,7 +468,7 @@ to_chat(user, "\"You want to be blind, do you?\"") user.dropItemToGround(src, TRUE) user.Dizzy(30) - user.Knockdown(100) + user.Paralyze(100) user.blind_eyes(30) /obj/item/reagent_containers/glass/beaker/unholywater @@ -489,7 +489,7 @@ /obj/item/shuttle_curse/attack_self(mob/living/user) if(!iscultist(user)) user.dropItemToGround(src, TRUE) - user.Knockdown(100) + user.Paralyze(100) to_chat(user, "A powerful force shoves you away from [src]!") return if(curselimit > 1) @@ -686,9 +686,9 @@ else if(!..()) if(!L.anti_magic_check()) if(is_servant_of_ratvar(L)) - L.Knockdown(100) + L.Paralyze(100) else - L.Knockdown(50) + L.Paralyze(50) break_spear(T) else ..() @@ -820,7 +820,7 @@ INVOKE_ASYNC(src, .proc/pewpew, user, params) var/obj/structure/emergency_shield/invoker/N = new(user.loc) if(do_after(user, 90, target = user)) - user.Knockdown(40) + user.Paralyze(40) to_chat(user, "You have exhausted the power of this spell!") firing = FALSE if(N) @@ -885,7 +885,7 @@ else var/mob/living/L = target if(L.density) - L.Knockdown(20) + L.Paralyze(20) L.adjustBruteLoss(45) playsound(L, 'sound/hallucinations/wail.ogg', 50, 1) L.emote("scream") @@ -921,7 +921,7 @@ T.visible_message("The sheer force from [P] shatters the mirror shield!") new /obj/effect/temp_visual/cult/sparks(T) playsound(T, 'sound/effects/glassbr3.ogg', 100) - owner.Knockdown(25) + owner.Paralyze(25) qdel(src) return FALSE if(P.is_reflectable) @@ -978,9 +978,9 @@ else if(!..()) if(!L.anti_magic_check()) if(is_servant_of_ratvar(L)) - L.Knockdown(60) + L.Paralyze(60) else - L.Knockdown(30) + L.Paralyze(30) if(D?.thrower) for(var/mob/living/Next in orange(2, T)) if(!Next.density || iscultist(Next)) diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index aff0292b876..72e8b27be26 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -219,7 +219,7 @@ structure_check() searches for nearby cultist structures required for the invoca L.visible_message("[L]'s eyes glow a defiant yellow!", \ "\"Stop resisting. You will be mi-\"\n\ \"Give up and you will feel pain unlike anything you've ever felt!\"") - L.Knockdown(80) + L.Paralyze(80) else if(is_convertable) do_convert(L, invokers) else @@ -898,7 +898,7 @@ structure_check() searches for nearby cultist structures required for the invoca if(affecting.key) affecting.visible_message("[affecting] slowly relaxes, the glow around [affecting.p_them()] dimming.", \ "You are re-united with your physical form. [src] releases its hold over you.") - affecting.Knockdown(40) + affecting.Paralyze(40) break if(affecting.health <= 10) to_chat(G, "Your body can no longer sustain the connection!") @@ -960,7 +960,7 @@ structure_check() searches for nearby cultist structures required for the invoca playsound(T, 'sound/magic/enter_blood.ogg', 100, 1) visible_message("A colossal shockwave of energy bursts from the rune, disintegrating it in the process!") for(var/mob/living/L in range(src, 3)) - L.Knockdown(30) + L.Paralyze(30) empulse(T, 0.42*(intensity), 1) var/list/images = list() var/zmatch = T.z diff --git a/code/modules/antagonists/devil/devil_helpers.dm b/code/modules/antagonists/devil/devil_helpers.dm index 4d0a781570c..50e84213f4a 100644 --- a/code/modules/antagonists/devil/devil_helpers.dm +++ b/code/modules/antagonists/devil/devil_helpers.dm @@ -32,7 +32,7 @@ if(BANE_HARVEST) if(istype(weapon, /obj/item/reagent_containers/food/snacks/grown/)) visible_message("The spirits of the harvest aid in the exorcism.", "The harvest spirits are harming you.") - Knockdown(40) + Paralyze(40) qdel(weapon) return 2 return 1 \ No newline at end of file diff --git a/code/modules/antagonists/devil/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm index 70ccc46e5f9..3d94af05c03 100644 --- a/code/modules/antagonists/devil/true_devil/_true_devil.dm +++ b/code/modules/antagonists/devil/true_devil/_true_devil.dm @@ -172,7 +172,7 @@ log_combat(M, src, "attacked") updatehealth() if ("disarm") - if (!lying && !ascended) //No stealing the arch devil's pitchfork. + if (!(mobility_flags & MOBILITY_STAND) && !ascended) //No stealing the arch devil's pitchfork. if (prob(5)) Unconscious(40) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) diff --git a/code/modules/antagonists/revenant/revenant_blight.dm b/code/modules/antagonists/revenant/revenant_blight.dm index 7037ecae867..5b89da2e875 100644 --- a/code/modules/antagonists/revenant/revenant_blight.dm +++ b/code/modules/antagonists/revenant/revenant_blight.dm @@ -26,7 +26,7 @@ /datum/disease/revblight/stage_act() if(!finalstage) - if(affected_mob.lying && prob(stage*6)) + if(!(affected_mob.mobility_flags & MOBILITY_STAND) && prob(stage*6)) cure() return if(prob(stage*3)) diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm index 19515ab4f14..b42eb3c4e1f 100644 --- a/code/modules/antagonists/swarmer/swarmer.dm +++ b/code/modules/antagonists/swarmer/swarmer.dm @@ -585,7 +585,7 @@ playsound(loc,'sound/effects/snap.ogg',50, 1, -1) L.electrocute_act(0, src, 1, 1, 1) if(iscyborg(L)) - L.Knockdown(100) + L.Paralyze(100) qdel(src) ..() diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 7cfefd5413c..907bc7f9aee 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -261,7 +261,7 @@ GiveHint(target) else if(is_pointed(I)) to_chat(target, "You feel a stabbing pain in [parse_zone(user.zone_selected)]!") - target.Knockdown(40) + target.Paralyze(40) GiveHint(target) else if(istype(I, /obj/item/bikehorn)) to_chat(target, "HONK") @@ -380,7 +380,7 @@ /obj/item/warpwhistle/proc/end_effect(mob/living/carbon/user) user.invisibility = initial(user.invisibility) user.status_flags &= ~GODMODE - user.canmove = TRUE + user.update_mobility() /obj/item/warpwhistle/attack_self(mob/living/carbon/user) if(!istype(user) || on_cooldown) @@ -389,7 +389,7 @@ last_user = user var/turf/T = get_turf(user) playsound(T,'sound/magic/warpwhistle.ogg', 200, 1) - user.canmove = FALSE + user.mobility_flags &= ~MOBILITY_MOVE new /obj/effect/temp_visual/tornado(T) sleep(20) if(interrupted(user)) @@ -405,7 +405,7 @@ var/turf/potential_T = find_safe_turf() if(T.z != potential_T.z || abs(get_dist_euclidian(potential_T,T)) > 50 - breakout) user.forceMove(potential_T) - user.canmove = 0 + user.mobility_flags &= ~MOBILITY_MOVE T = potential_T break breakout += 1 diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index 40551ae2fc7..1178d4ba3d0 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -83,7 +83,7 @@ /obj/item/soulstone/proc/release_shades(mob/user) for(var/mob/living/simple_animal/shade/A in src) A.status_flags &= ~GODMODE - A.canmove = TRUE + A.mobility_flags = MOBILITY_FLAGS_DEFAULT A.forceMove(get_turf(user)) A.cancel_camera() icon_state = "soulstone" @@ -173,7 +173,7 @@ else T.forceMove(src) //put shade in stone T.status_flags |= GODMODE - T.canmove = FALSE + T.mobility_flags = NONE T.health = T.maxHealth icon_state = "soulstone2" name = "soulstone: Shade of [T.real_name]" @@ -240,7 +240,7 @@ T.dust_animation() var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade(src) S.status_flags |= GODMODE //So they won't die inside the stone somehow - S.canmove = FALSE//Can't move out of the soul stone + S.mobility_flags = NONE //Can't move out of the soul stone S.name = "Shade of [T.real_name]" S.real_name = "Shade of [T.real_name]" S.key = T.key diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index b653c3de7fd..f83d4a73670 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -125,7 +125,7 @@ to_chat(M, "[user] blinds you with the flash!") else to_chat(M, "You are blinded by [src]!") - M.Knockdown(rand(80,120)) + M.Paralyze(rand(80,120)) else if(user) visible_message("[user] fails to blind [M] with the flash!") to_chat(user, "You fail to blind [M] with the flash!") @@ -147,7 +147,7 @@ var/mob/living/silicon/robot/R = M log_combat(user, R, "flashed", src) update_icon(1) - R.Knockdown(rand(80,120)) + R.Paralyze(rand(80,120)) var/diff = 5 * CONFUSION_STACK_MAX_MULTIPLIER - M.confused R.confused += min(5, diff) R.flash_act(affect_silicon = 1) diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 58a3a5349a1..81f4e24142d 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -48,7 +48,7 @@ if("feet") if(!H.shoes) affecting = H.get_bodypart(pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) - H.Knockdown(60) + H.Paralyze(60) if(BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND) if(!H.gloves) affecting = H.get_bodypart(type) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 677beb7257d..192b74b7b6f 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -334,9 +334,7 @@ Pipelines + Other Objects -> Pipe network user.forceMove(loc) user.visible_message("You hear something squeezing through the ducts...","You climb out the ventilation system.") - user.canmove = FALSE - addtimer(VARSET_CALLBACK(user, canmove, TRUE), 1) - + //PLACEHOLDER COMMENT FOR ME TO READD THE 1 (?) DS DELAY THAT WAS IMPLEMENTED WITH A... TIMER? /obj/machinery/atmospherics/AltClick(mob/living/L) if(istype(L) && is_type_in_list(src, GLOB.ventcrawl_machinery)) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 3bcd4c20b2a..4d4fad8703e 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -239,7 +239,7 @@ message_cooldown = world.time + 50 to_chat(user, "[src]'s door won't budge!") -/obj/machinery/atmospherics/components/unary/cryo_cell/open_machine(drop = 0) +/obj/machinery/atmospherics/components/unary/cryo_cell/open_machine(drop = FALSE) if(!state_open && !panel_open) on = FALSE ..() @@ -247,7 +247,7 @@ M.forceMove(get_turf(src)) if(isliving(M)) var/mob/living/L = M - L.update_canmove() + L.update_mobility() occupant = null update_icon() @@ -280,10 +280,12 @@ to_chat(user, "[src] seems empty.") /obj/machinery/atmospherics/components/unary/cryo_cell/MouseDrop_T(mob/target, mob/user) - if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser()) + if(user.incapacitated() || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser()) return - if (target.IsKnockdown() || target.IsStun() || target.IsSleeping() || target.IsUnconscious()) - close_machine(target) + if(isliving(target)) + var/mob/living/L = target + if(L.incapacitated()) + close_machine(target) else user.visible_message("[user] starts shoving [target] inside [src].", "You start shoving [target] inside [src].") if (do_after(user, 25, target=target)) diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index 64d58cd40b5..14f6f372031 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -219,10 +219,7 @@ /mob/living/carbon/canSuicide() if(!..()) return - if(IsStun() || IsKnockdown()) //just while I finish up the new 'fun' suiciding verb. This is to prevent metagaming via suicide - to_chat(src, "You can't commit suicide while stunned! ((You can type Ghost instead however.))") - return - if(restrained()) - to_chat(src, "You can't commit suicide while restrained! ((You can type Ghost instead however.))") + if(!(mobility_flags & MOBILITY_USE)) //just while I finish up the new 'fun' suiciding verb. This is to prevent metagaming via suicide + to_chat(src, "You can't commit suicide whilst immobile! ((You can type Ghost instead however.))") return return TRUE diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index d0820304fef..2298b01f003 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -225,7 +225,7 @@ if(user.wear_suit == src) if(hard_landing) user.electrocute_act(35, src, safety = 1) - user.Knockdown(200) + user.Paralyze(200) if(!silent) to_chat(user, "\nroot@ChronosuitMK4# chronowalk4 --stop\n") if(camera) diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm index 2bd24e21a2f..5a15cd1089e 100644 --- a/code/modules/clothing/suits/reactive_armour.dm +++ b/code/modules/clothing/suits/reactive_armour.dm @@ -224,7 +224,7 @@ return owner.visible_message("The reactive teleport system flings [H] clear of [attack_text] and slams [H.p_them()] into a fabricated table!") owner.visible_message("[H] GOES ON THE TABLE!!!") - owner.Knockdown(40) + owner.Paralyze(40) var/list/turfs = new/list() for(var/turf/T in orange(tele_range, H)) if(T.density) diff --git a/code/modules/fields/peaceborg_dampener.dm b/code/modules/fields/peaceborg_dampener.dm index 79bd866fca2..47d7f096c96 100644 --- a/code/modules/fields/peaceborg_dampener.dm +++ b/code/modules/fields/peaceborg_dampener.dm @@ -42,7 +42,7 @@ if(R.has_buckled_mobs()) for(var/mob/living/L in R.buckled_mobs) L.visible_message("[L] is knocked off of [R] by the charge in [R]'s chassis induced by [name]!") //I know it's bad. - L.Knockdown(10) + L.Paralyze(10) R.unbuckle_mob(L) do_sparks(5, 0, L) ..() diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 58b71cfb3e5..9c22d57669b 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -216,7 +216,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( /obj/effect/hallucination/simple/xeno/throw_impact(A) update_icon("alienh_pounce") if(A == target && target.stat!=DEAD) - target.Knockdown(100) + target.Paralyze(100) target.visible_message("[target] flails around wildly.","[name] pounces on you!") /datum/hallucination/xeno_attack @@ -303,7 +303,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( shake_camera(target, 2, 1) if(bubblegum.Adjacent(target) && !charged) charged = TRUE - target.Knockdown(80) + target.Paralyze(80) target.adjustStaminaLoss(40) step_away(target, bubblegum) shake_camera(target, 4, 3) @@ -1099,7 +1099,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( if(istype(target, /obj/effect/dummy/phased_mob)) return to_chat(target, "You fall into the chasm!") - target.Knockdown(40) + target.Paralyze(40) addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, target, "It's surprisingly shallow."), 15) QDEL_IN(src, 30) @@ -1133,7 +1133,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( set waitfor = FALSE ..() target.set_screwyhud(SCREWYHUD_DEAD) - target.Knockdown(300) + target.Paralyze(300) target.silent += 10 to_chat(target, "[target.real_name] has died at [get_area_name(target)].") if(prob(50)) @@ -1151,7 +1151,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( "i[prob(50)?" fucking":""] hate [pick("blood cult", "clock cult", "revenants", "this round","this","myself","admins","you")]")]\"") sleep(rand(70,90)) target.set_screwyhud(SCREWYHUD_NONE) - target.SetKnockdown(0) + target.SetParalyzed(0) target.silent = FALSE qdel(src) @@ -1238,7 +1238,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( /datum/hallucination/shock/proc/shock_drop() target.jitteriness = max(target.jitteriness - 990, 10) //Still jittery, but vastly less - target.Knockdown(60) + target.Paralyze(60) /datum/hallucination/husks diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 878296f9bc7..b1c5f8b9707 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -94,7 +94,7 @@ var/head_attack_message = "" if(affecting == BODY_ZONE_HEAD && istype(target, /mob/living/carbon/)) head_attack_message = " on the head" - //Knockdown the target for the duration that we calculated and divide it by 5. + //Paralyze the target for the duration that we calculated and divide it by 5. if(armor_duration) target.apply_effect(min(armor_duration, 200) , EFFECT_KNOCKDOWN) // Never knockdown more than a flash! diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm index 04177783e62..911fda1aafc 100644 --- a/code/modules/food_and_drinks/food/snacks_pie.dm +++ b/code/modules/food_and_drinks/food/snacks_pie.dm @@ -49,7 +49,7 @@ else creamoverlay.icon_state = "creampie_human" if(stunning) - H.Knockdown(20) //splat! + H.Paralyze(20) //splat! H.adjust_blurriness(1) H.visible_message("[H] is creamed by [src]!", "You've been creamed by [src]!") playsound(H, "desceration", 50, TRUE) diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm index b4cec279c69..5b30a4cf5d8 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -149,6 +149,6 @@ God bless America. reagents.reaction(C, TOUCH) C.apply_damage(min(30, reagents.total_volume), BURN, BODY_ZONE_HEAD) reagents.remove_any((reagents.total_volume/2)) - C.Knockdown(60) + C.Paralyze(60) user.changeNext_move(CLICK_CD_MELEE) return ..() diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index 3f917273b44..9735c6873eb 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -126,9 +126,12 @@ set category = "Object" set name = "Eject Contents" set src in oview(1) - - if(usr.stat || !usr.canmove || usr.restrained()) + if(usr.stat || usr.restrained()) return + if(isliving(usr)) + var/mob/living/L = usr + if(!(L.mobility_flags & MOBILITY_UI)) + return empty() add_fingerprint(usr) diff --git a/code/modules/games/cas.dm b/code/modules/games/cas.dm index 9197e3d0445..df47998cb2b 100644 --- a/code/modules/games/cas.dm +++ b/code/modules/games/cas.dm @@ -62,8 +62,10 @@ . = ..() if(.) return - if(user.lying) - return + if(isliving(user)) + var/mob/living/L = user + if(!(L.mobility_flags & MOBILITY_PICKUP)) + return if(cards.len == 0) to_chat(user, "There are no more cards to draw!") return diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm index 5c143f7a250..29705b457fb 100644 --- a/code/modules/holodeck/items.dm +++ b/code/modules/holodeck/items.dm @@ -87,7 +87,7 @@ playsound(src, 'sound/items/dodgeball.ogg', 50, 1) M.apply_damage(10, STAMINA) if(prob(5)) - M.Knockdown(60) + M.Paralyze(60) visible_message("[M] is knocked right off [M.p_their()] feet!") // @@ -117,7 +117,7 @@ to_chat(user, "You need a better grip to do that!") return L.forceMove(loc) - L.Knockdown(100) + L.Paralyze(100) visible_message("[user] dunks [L] into \the [src]!") user.stop_pulling() else diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm index e3f8c254ac1..f3f2736e29d 100644 --- a/code/modules/hydroponics/grown/nettle.dm +++ b/code/modules/hydroponics/grown/nettle.dm @@ -98,7 +98,7 @@ /obj/item/reagent_containers/food/snacks/grown/nettle/death/pickup(mob/living/carbon/user) if(..()) if(prob(50)) - user.Knockdown(100) + user.Paralyze(100) to_chat(user, "You are stunned by the Deathnettle as you try picking it up!") /obj/item/reagent_containers/food/snacks/grown/nettle/death/attack(mob/living/carbon/M, mob/user) @@ -111,5 +111,5 @@ M.adjust_blurriness(force/7) if(prob(20)) M.Unconscious(force / 0.3) - M.Knockdown(force / 0.75) + M.Paralyze(force / 0.75) M.drop_all_held_items() diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 2159ebbfa85..0b7e4176eae 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -113,14 +113,16 @@ return ..() -/obj/structure/bookcase/attack_hand(mob/user) +/obj/structure/bookcase/attack_hand(mob/living/user) . = ..() if(.) return + if(!istype(user)) + return if(contents.len) - var/obj/item/book/choice = input("Which book would you like to remove from the shelf?") as null|obj in contents + var/obj/item/book/choice = input(user, "Which book would you like to remove from the shelf?") as null|obj in contents if(choice) - if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) + if(!(user.mobility_flags & MOBILITY_USE) || user.stat || user.restrained() || !in_range(loc, user)) return if(ishuman(user)) if(!user.get_active_held_item()) diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm index 158f0788890..1d769fa83cf 100644 --- a/code/modules/mining/equipment/wormhole_jaunter.dm +++ b/code/modules/mining/equipment/wormhole_jaunter.dm @@ -93,7 +93,7 @@ playsound(M,'sound/weapons/resonator_blast.ogg',50,1) if(iscarbon(M)) var/mob/living/carbon/L = M - L.Knockdown(60) + L.Paralyze(60) if(ishuman(L)) shake_camera(L, 20, 1) addtimer(CALLBACK(L, /mob/living/carbon.proc/vomit), 20) diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index af8860c02be..f2b81fd63b5 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -74,7 +74,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) var/mutable_appearance/balloon3 if(isliving(A)) var/mob/living/M = A - M.Knockdown(320) // Keep them from moving during the duration of the extraction + M.Paralyze(320) // Keep them from moving during the duration of the extraction M.buckled = 0 // Unbuckle them to prevent anchoring problems else A.anchored = TRUE diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 5e6d826b557..af86f5ac17b 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -415,7 +415,7 @@ armour_penetration = 100 damage_type = BRUTE hitsound = 'sound/effects/splat.ogg' - knockdown = 30 + paralyze = 30 var/chain /obj/item/projectile/hook/fire(setAngle) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 5b56e91f33f..70284f8defe 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -10,7 +10,6 @@ density = FALSE stat = DEAD - canmove = FALSE var/mob/living/new_character //for instant transfer once the round is set up diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 886b1c04110..d03846d6523 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -11,7 +11,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) layer = GHOST_LAYER stat = DEAD density = FALSE - canmove = 0 see_invisible = SEE_INVISIBLE_OBSERVER see_in_dark = 100 invisibility = INVISIBILITY_OBSERVER diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index f7aa8489491..8a2baa276d5 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -195,20 +195,18 @@ /mob/proc/put_in_l_hand(obj/item/I) return put_in_hand(I, get_empty_held_index_for_side("l")) - //Puts the item into the first available right hand if possible and calls all necessary triggers/updates. returns 1 on success. /mob/proc/put_in_r_hand(obj/item/I) return put_in_hand(I, get_empty_held_index_for_side("r")) - /mob/proc/put_in_hand_check(obj/item/I) - if(lying && !(I.item_flags & ABSTRACT)) - return FALSE - if(!istype(I)) + return FALSE //nonliving mobs don't have hands + +/mob/living/put_in_hand_check(obj/item/I) + if(!(mobility_flags & MOBILITY_PICKUP) || !istype(I)) return FALSE return TRUE - //Puts the item into our active hand if possible. returns TRUE on success. /mob/proc/put_in_active_hand(obj/item/I, forced = FALSE, ignore_animation = TRUE) return put_in_hand(I, active_hand_index, forced, ignore_animation) diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index e8a15d70aef..1ca584f4047 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -32,12 +32,11 @@ container = null return ..() -/mob/living/brain/update_canmove() +/mob/living/brain/update_mobility() if(in_contents_of(/obj/mecha)) - canmove = 1 + mobility_flags = MOBILITY_FLAGS_DEFAULT else - canmove = 0 - return canmove + mobility_flags = NONE /mob/living/brain/ex_act() //you cant blow up brainmobs because it makes transfer_to() freak out when borgs blow up. return diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index 6d59bc052a5..1282943e819 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -21,9 +21,11 @@ In all, this is a lot like the monkey code. /N switch(M.a_intent) if ("help") - resting = 0 + set_resting(FALSE) AdjustStun(-60) AdjustKnockdown(-60) + AdjustImmobilized(-60) + AdjustParalyzed(-60) AdjustUnconscious(-60) AdjustSleeping(-100) visible_message("[M.name] nuzzles [src] trying to wake [p_them()] up!") diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index 323bd408cf5..be7402d3b3e 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -205,7 +205,7 @@ Doesn't work on other aliens/AI.*/ if(..()) return var/p_cost = 50 - if(!iscarbon(ranged_ability_user) || ranged_ability_user.lying || ranged_ability_user.stat) + if(!iscarbon(ranged_ability_user) || ranged_ability_user.stat) remove_ranged_ability() return diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index fe682b5c99d..9127bf6c294 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -31,7 +31,7 @@ #define MAX_ALIEN_LEAP_DIST 7 /mob/living/carbon/alien/humanoid/hunter/proc/leap_at(atom/A) - if(!canmove || leaping) + if((mobility_flags & (MOBILITY_MOVE | MOBILITY_STAND)) != (MOBILITY_MOVE | MOBILITY_STAND) || leaping) return if(pounce_cooldown > world.time) @@ -70,21 +70,21 @@ blocked = TRUE if(!blocked) L.visible_message("[src] pounces on [L]!", "[src] pounces on you!") - L.Knockdown(100) + L.Paralyze(100) sleep(2)//Runtime prevention (infinite bump() calls on hulks) step_towards(src,L) else - Knockdown(40, 1, 1) + Paralyze(40, 1, 1) toggle_leap(0) else if(A.density && !A.CanPass(src)) visible_message("[src] smashes into [A]!", "[src] smashes into [A]!") - Knockdown(40, 1, 1) + Paralyze(40, 1, 1) if(leaping) - leaping = 0 + leaping = FALSE update_icons() - update_canmove() + update_mobility() /mob/living/carbon/alien/humanoid/float(on) diff --git a/code/modules/mob/living/carbon/alien/humanoid/death.dm b/code/modules/mob/living/carbon/alien/humanoid/death.dm index c6c675ead94..ad0d8bbb9d5 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/death.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/death.dm @@ -4,7 +4,6 @@ . = ..() - update_canmove() update_icons() status_flags |= CANPUSH diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm index b3839a6033f..4d2a7d68ad1 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm @@ -42,7 +42,7 @@ "[M] has attempted to punch [src]!", null, COMBAT_MESSAGE_RANGE) if ("disarm") - if (!lying) + if (!(mobility_flags & MOBILITY_STAND)) if (prob(5)) Unconscious(40) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm index e1a7752e9d8..3aabbd2e81d 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm @@ -12,12 +12,12 @@ else icon_state = "alien[caste]_dead" - else if((stat == UNCONSCIOUS && !asleep) || stat == SOFT_CRIT || IsKnockdown()) + else if((stat == UNCONSCIOUS && !asleep) || stat == SOFT_CRIT || IsParalyzed()) icon_state = "alien[caste]_unconscious" else if(leap_on_click) icon_state = "alien[caste]_pounce" - else if(lying || resting || asleep) + else if(!(mobility_flags & MOBILITY_STAND)) icon_state = "alien[caste]_sleep" else if(mob_size == MOB_SIZE_LARGE) icon_state = "alien[caste]" @@ -41,8 +41,8 @@ var/old_icon = icon icon = alt_icon alt_icon = old_icon - pixel_x = get_standard_pixel_x_offset(lying) - pixel_y = get_standard_pixel_y_offset(lying) + pixel_x = get_standard_pixel_x_offset(mobility_flags & MOBILITY_STAND) + pixel_y = get_standard_pixel_y_offset(mobility_flags & MOBILITY_STAND) update_inv_hands() update_inv_handcuffed() @@ -52,7 +52,7 @@ update_transform() /mob/living/carbon/alien/humanoid/update_transform() //The old method of updating lying/standing was update_icons(). Aliens still expect that. - if(lying > 0) + if(lying) lying = 90 //Anything else looks retarded ..() update_icons() diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index b10a9df6a8c..c2a26fa1129 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -22,12 +22,11 @@ if(stat == CONSCIOUS) stat = UNCONSCIOUS blind_eyes(1) - update_canmove() + update_mobility() else if(stat == UNCONSCIOUS) stat = CONSCIOUS - resting = 0 + set_resting(FALSE) adjust_blindness(-1) - update_canmove() update_damage_hud() update_health_hud() diff --git a/code/modules/mob/living/carbon/alien/larva/update_icons.dm b/code/modules/mob/living/carbon/alien/larva/update_icons.dm index 7897cbf9693..e1af00c174c 100644 --- a/code/modules/mob/living/carbon/alien/larva/update_icons.dm +++ b/code/modules/mob/living/carbon/alien/larva/update_icons.dm @@ -14,7 +14,7 @@ icon_state = "larva[state]_dead" else if(handcuffed || legcuffed) //This should be an overlay. Who made this an icon_state? icon_state = "larva[state]_cuff" - else if(stat == UNCONSCIOUS || lying || resting) + else if(!(mobility_flags & MOBILITY_STAND)) icon_state = "larva[state]_sleep" else if(IsStun()) icon_state = "larva[state]_stun" diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index 155f2037085..feeb66a9be7 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -135,7 +135,7 @@ else if(ishuman(owner)) //Humans, being more fragile, are more overwhelmed by the mental backlash. to_chat(owner, "You feel a splitting pain in your head, and are struck with a wave of nausea. You cannot hear the hivemind anymore!") owner.emote("scream") - owner.Knockdown(100) + owner.Paralyze(100) owner.jitteriness += 30 owner.confused += 30 diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index b4739f943ea..9023a2d8ced 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -88,7 +88,7 @@ var/mob/living/carbon/alien/larva/new_xeno = new(xeno_loc) new_xeno.key = ghost.key SEND_SOUND(new_xeno, sound('sound/voice/hiss5.ogg',0,0,0,100)) //To get the player's attention - new_xeno.canmove = 0 //so we don't move during the bursting animation + new_xeno.mobility_flags = NONE //so we don't move during the bursting animation new_xeno.notransform = 1 new_xeno.invisibility = INVISIBILITY_MAXIMUM @@ -98,7 +98,7 @@ return if(new_xeno) - new_xeno.canmove = 1 + new_xeno.mobility_flags = MOBILITY_FLAGS_DEFAULT new_xeno.notransform = 0 new_xeno.invisibility = 0 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 21bfb32e7d7..51163ee423e 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -86,7 +86,7 @@ mode() // Activate held item /mob/living/carbon/attackby(obj/item/I, mob/user, params) - if(lying && surgeries.len) + if(!(mobility_flags & MOBILITY_STAND) && surgeries.len) if(user != src && (user.a_intent == INTENT_HELP || user.a_intent == INTENT_DISARM)) for(var/datum/surgery/S in surgeries) if(S.next_step(user,user.a_intent)) @@ -104,7 +104,7 @@ hurt = FALSE if(hit_atom.density && isturf(hit_atom)) if(hurt) - Knockdown(20) + Paralyze(20) take_bodypart_damage(10) if(iscarbon(hit_atom) && hit_atom != src) var/mob/living/carbon/victim = hit_atom @@ -113,8 +113,8 @@ if(hurt) victim.take_bodypart_damage(10) take_bodypart_damage(10) - victim.Knockdown(20) - Knockdown(20) + victim.Paralyze(20) + Paralyze(20) visible_message("[src] crashes into [victim], knocking them both over!",\ "You violently crash into [victim]!") playsound(src,'sound/weapons/punch1.ogg',50,1) @@ -274,7 +274,7 @@ /mob/living/carbon/resist_fire() fire_stacks -= 5 - Knockdown(60, TRUE, TRUE) + Paralyze(60, TRUE, TRUE) spin(32,2) visible_message("[src] rolls on the floor, trying to put [p_them()]self out!", \ "You stop, drop, and roll!") @@ -451,7 +451,7 @@ visible_message("[src] dry heaves!", \ "You try to throw up, but there's nothing in your stomach!") if(stun) - Knockdown(200) + Paralyze(200) return 1 if(is_mouth_covered()) //make this add a blood/vomit overlay later it'll be hilarious @@ -464,7 +464,7 @@ visible_message("[src] throws up!", "You throw up!") if(stun) - Stun(80) + Paralyze(80) playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1) var/turf/T = get_turf(src) @@ -502,6 +502,13 @@ if(dna) dna.real_name = real_name +/mob/living/carbon/update_mobility() + . = ..() + if(!(mobility_flags & MOBILITY_STAND)) + add_movespeed_modifier(MOVESPEED_ID_CARBON_CRAWLING, TRUE, multiplicative_slowdown = CRAWLING_ADD_SLOWDOWN) + else + remove_movespeed_modifier(MOVESPEED_ID_CARBON_CRAWLING, TRUE) + //Updates the mob's health from bodyparts and mob damage variables /mob/living/carbon/updatehealth() if(status_flags & GODMODE) @@ -517,6 +524,7 @@ health = round(maxHealth - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute, DAMAGE_PRECISION) staminaloss = round(total_stamina, DAMAGE_PRECISION) update_stat() + update_mobility() if(((maxHealth - total_burn) < HEALTH_THRESHOLD_DEAD) && stat == DEAD ) become_husk("burn") med_hud_set_health() @@ -530,9 +538,9 @@ if(stam > DAMAGE_PRECISION) var/total_health = (health - stam) if(total_health <= crit_threshold && !stat) - if(!IsKnockdown()) + if(!IsParalyzed()) to_chat(src, "You're too exhausted to keep going...") - Knockdown(100) + Paralyze(100) update_health_hud() /mob/living/carbon/update_sight() @@ -752,7 +760,7 @@ else stat = CONSCIOUS adjust_blindness(-1) - update_canmove() + update_mobility() update_damage_hud() update_health_hud() med_hud_set_status() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index f18d6d363df..658982749d1 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -51,7 +51,7 @@ /mob/living/carbon/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked = FALSE) if(!skipcatch) //ugly, but easy if(in_throw_mode && !get_active_held_item()) //empty active hand and we're in throw mode - if(canmove && !restrained()) + if((mobility_flags & MOBILITY_MOVE) && !restrained()) if(istype(AM, /obj/item)) var/obj/item/I = AM if(isturf(I.loc)) @@ -118,7 +118,7 @@ if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) ContactContractDisease(D) - if(lying && surgeries.len) + if(!(mobility_flags & MOBILITY_STAND) && surgeries.len) if(user.a_intent == INTENT_HELP || user.a_intent == INTENT_DISARM) for(var/datum/surgery/S in surgeries) if(S.next_step(user, user.a_intent)) @@ -164,7 +164,7 @@ do_sparks(5, TRUE, src) var/power = M.powerlevel + rand(0,3) - Knockdown(power*20) + Paralyze(power*20) if(stuttering < power) stuttering = power if (prob(stunprob) && M.powerlevel >= 8) @@ -235,11 +235,11 @@ do_jitter_animation(jitteriness) stuttering += 2 if((!tesla_shock || (tesla_shock && siemens_coeff > 0.5)) && stun) - Stun(40) + Paralyze(40) spawn(20) jitteriness = max(jitteriness - 990, 10) //Still jittery, but vastly less if((!tesla_shock || (tesla_shock && siemens_coeff > 0.5)) && stun) - Knockdown(60) + Paralyze(60) if(override) return override else @@ -252,7 +252,7 @@ if(health >= 0 && !(has_trait(TRAIT_FAKEDEATH))) - if(lying) + if(!(mobility_flags & MOBILITY_STAND)) if(buckled) to_chat(M, "You need to unbuckle [src] first to do that!") return @@ -266,9 +266,9 @@ AdjustKnockdown(-60) AdjustUnconscious(-60) AdjustSleeping(-100) - if(resting) - resting = 0 - update_canmove() + AdjustParalyzed(-60) + AdjustImmobilized(-60) + set_resting(FALSE) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) @@ -333,7 +333,7 @@ var/effect_amount = intensity - ear_safety if(effect_amount > 0) if(stun_pwr) - Knockdown(stun_pwr*effect_amount) + Paralyze(stun_pwr*effect_amount) if(istype(ears) && (deafen_pwr || damage_pwr)) var/ear_damage = damage_pwr * effect_amount diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index d14ada53427..2b869c161ba 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -487,7 +487,7 @@ to_chat(usr, "Unable to locate a data core entry for this person.") /mob/living/carbon/human/proc/canUseHUD() - return !(src.stat || IsKnockdown() || IsStun() || src.restrained()) + return (mobility_flags & MOBILITY_USE) /mob/living/carbon/human/can_inject(mob/user, error_msg, target_zone, var/penetrate_thick = 0) . = 1 // Default to returning true. @@ -722,7 +722,7 @@ cut_overlay(MA) /mob/living/carbon/human/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) - if(incapacitated() || lying ) + if(!(mobility_flags & MOBILITY_UI)) to_chat(src, "You can't do that right now!") return FALSE if(!Adjacent(M) && (M.loc != src)) @@ -831,7 +831,7 @@ visible_message("[src] dry heaves!", \ "You try to throw up, but there's nothing in your stomach!") if(stun) - Knockdown(200) + Paralyze(200) return 1 ..() diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index aba8e985836..21cc6e9b908 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -46,7 +46,7 @@ if(mind) if(mind.martial_art && !incapacitated(FALSE, TRUE) && mind.martial_art.can_use(src) && mind.martial_art.deflection_chance) //Some martial arts users can deflect projectiles! if(prob(mind.martial_art.deflection_chance)) - if(!lying && dna && !dna.check_mutation(HULK)) //But only if they're not lying down, and hulks can't do it + if((mobility_flags & MOBILITY_USE) && dna && !dna.check_mutation(HULK)) //But only if they're otherwise able to use items, and hulks can't do it if(mind.martial_art.deflection_chance >= 100) //if they can NEVER be hit, lets clue sec in ;) visible_message("[src] deflects the projectile; [p_they()] can't be hit with ranged weapons!", "You deflect the projectile!") else @@ -219,7 +219,7 @@ "[M] disarmed [src]!") else if(!M.client || prob(5)) // only natural monkeys get to stun reliably, (they only do it occasionaly) playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) - Knockdown(100) + Paralyze(100) log_combat(M, src, "tackled") visible_message("[M] has tackled down [src]!", \ "[M] has tackled down [src]!") @@ -272,7 +272,7 @@ "[M] disarmed [src]!") else playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) - Knockdown(100) + Paralyze(100) log_combat(M, src, "tackled") visible_message("[M] has tackled down [src]!", \ "[M] has tackled down [src]!") @@ -481,10 +481,10 @@ switch(severity) if(1) L.receive_damage(0,10) - Stun(200) + Paralyze(200) if(2) L.receive_damage(0,5) - Stun(100) + Paralyze(100) /mob/living/carbon/human/acid_act(acidpwr, acid_volume, bodyzone_hit) var/list/damaged = list() diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 1addb3615c3..22c58b2e0d0 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -47,7 +47,7 @@ HM.on_move(src, NewLoc) if(shoes) - if(!lying && !buckled) + if(mobility_flags & MOBILITY_STAND) if(loc == NewLoc) if(!has_gravity(loc)) return diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 1405cddcc79..8862e4cb425 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1025,9 +1025,9 @@ GLOBAL_LIST_EMPTY(roundstart_races) return TRUE if(radiation > RAD_MOB_KNOCKDOWN && prob(RAD_MOB_KNOCKDOWN_PROB)) - if(!H.IsKnockdown()) + if(!H.IsParalyzed()) H.emote("collapse") - H.Knockdown(RAD_MOB_KNOCKDOWN_AMOUNT) + H.Paralyze(RAD_MOB_KNOCKDOWN_AMOUNT) to_chat(H, "You feel weak.") if(radiation > RAD_MOB_VOMIT && prob(RAD_MOB_VOMIT_PROB)) @@ -1181,7 +1181,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) else var/atk_verb = user.dna.species.attack_verb - if(target.lying) + if(!(target.mobility_flags & MOBILITY_STAND)) atk_verb = "kick" switch(atk_verb) @@ -1224,7 +1224,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) "[user] has knocked [target] down!", null, COMBAT_MESSAGE_RANGE) target.apply_effect(80, EFFECT_KNOCKDOWN, armor_block) target.forcesay(GLOB.hit_appends) - else if(target.lying) + else if(!(target.mobility_flags & MOBILITY_STAND)) target.forcesay(GLOB.hit_appends) /datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) diff --git a/code/modules/mob/living/carbon/human/species_types/angel.dm b/code/modules/mob/living/carbon/human/species_types/angel.dm index 51222949560..588751b70fb 100644 --- a/code/modules/mob/living/carbon/human/species_types/angel.dm +++ b/code/modules/mob/living/carbon/human/species_types/angel.dm @@ -52,7 +52,7 @@ return 0 /datum/species/angel/proc/CanFly(mob/living/carbon/human/H) - if(H.stat || H.IsStun() || H.IsKnockdown()) + if(H.stat || !(H.mobility_flags & MOBILITY_STAND)) return 0 if(H.wear_suit && ((H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception)))) //Jumpsuits have tail holes, so it makes sense they have wing holes too to_chat(H, "Your suit blocks your wings from extending!") @@ -80,13 +80,12 @@ if(A.CanFly(H)) if(H.movement_type & FLYING) to_chat(H, "You settle gently back onto the ground...") - A.ToggleFlight(H,0) - H.update_canmove() + A.ToggleFlight(H,FALSE) + H.update_mobility() else to_chat(H, "You beat your wings and begin to hover gently above the ground...") - H.resting = 0 - A.ToggleFlight(H,1) - H.update_canmove() + A.ToggleFlight(H,TRUE) + H.set_resting(FALSE, FALSE) /datum/species/angel/proc/flyslip(mob/living/carbon/human/H) var/obj/buckled_obj diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index b0633f86f82..ff2085bf941 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -52,7 +52,7 @@ if(/obj/item/projectile/energy/floramut) if(prob(15)) H.rad_act(rand(30,80)) - H.Knockdown(100) + H.Paralyze(100) H.visible_message("[H] writhes in pain as [H.p_their()] vacuoles boil.", "You writhe in pain as your vacuoles boil!", "You hear the crunching of leaves.") if(prob(80)) H.randmutb() diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm index 844545a748b..b8f2d1cb2d3 100644 --- a/code/modules/mob/living/carbon/human/status_procs.dm +++ b/code/modules/mob/living/carbon/human/status_procs.dm @@ -1,12 +1,20 @@ -/mob/living/carbon/human/Stun(amount, updating = 1, ignore_canstun = 0) +/mob/living/carbon/human/Stun(amount, updating = TRUE, ignore_canstun = FALSE) amount = dna.species.spec_stun(src,amount) return ..() -/mob/living/carbon/human/Knockdown(amount, updating = 1, ignore_canknockdown = 0) +/mob/living/carbon/human/Knockdown(amount, updating = TRUE, ignore_canstun = FALSE) amount = dna.species.spec_stun(src,amount) return ..() +/mob/living/carbon/human/Paralyze(amount, updating = TRUE, ignore_canstun = FALSE) + amount = dna.species.spec_stun(src, amount) + return ..() + +/mob/living/carbon/human/Immobilize(amount, updating = TRUE, ignore_canstun = FALSE) + amount = dna.species.spec_stun(src, amount) + return ..() + /mob/living/carbon/human/Unconscious(amount, updating = 1, ignore_canunconscious = 0) amount = dna.species.spec_stun(src,amount) if(has_trait(TRAIT_HEAVY_SLEEPER)) diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index 901fb48b20d..cb11cb5ec3a 100644 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ b/code/modules/mob/living/carbon/monkey/combat.dm @@ -50,13 +50,13 @@ // taken from /mob/living/carbon/human/interactive/ /mob/living/carbon/monkey/proc/IsDeadOrIncap(checkDead = TRUE) - if(!canmove) + if(!(mobility_flags & MOBILITY_FLAGS_INTERACTION)) return 1 if(health <= 0 && checkDead) return 1 if(IsUnconscious()) return 1 - if(IsStun() || IsKnockdown()) + if(IsStun() || IsParalyzed()) return 1 if(stat) return 1 @@ -143,7 +143,7 @@ pickupTimer = 0 else INVOKE_ASYNC(src, .proc/walk2derpless, pickupTarget.loc) - if(Adjacent(pickupTarget) || Adjacent(pickupTarget.loc)) // next to target + if(Adjacent(pickupTarget) || Adjacent(pickupTarget.loc)) // next to target drop_all_held_items() // who cares about these items, i want that one! if(isturf(pickupTarget.loc)) // on floor equip_item(pickupTarget) @@ -167,7 +167,7 @@ battle_screech() retaliate(L) return TRUE - else + else bodyDisposal = locate(/obj/machinery/disposal/) in around if(bodyDisposal) target = L diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 7836e402af6..0ec83dd2c7b 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -21,7 +21,7 @@ else if(resisting) resisting = FALSE else if((mode == MONKEY_IDLE && !pickupTarget && !prob(MONKEY_SHENANIGAN_PROB)) || !handle_combat()) - if(prob(25) && canmove && isturf(loc) && !pulledby) + if(prob(25) && (mobility_flags & MOBILITY_MOVE) && isturf(loc) && !pulledby) step(src, pick(GLOB.cardinals)) else if(prob(1)) emote(pick("scratch","jump","roll","tail")) @@ -31,9 +31,9 @@ /mob/living/carbon/monkey/handle_mutations_and_radiation() if(radiation) if(radiation > RAD_MOB_KNOCKDOWN && prob(RAD_MOB_KNOCKDOWN_PROB)) - if(!IsKnockdown()) + if(!IsParalyzed()) emote("collapse") - Knockdown(RAD_MOB_KNOCKDOWN_AMOUNT) + Paralyze(RAD_MOB_KNOCKDOWN_AMOUNT) to_chat(src, "You feel weak.") if(radiation > RAD_MOB_MUTATE) if(prob(1)) diff --git a/code/modules/mob/living/carbon/monkey/monkey_defense.dm b/code/modules/mob/living/carbon/monkey/monkey_defense.dm index df90dd56fd7..5906bcebca3 100644 --- a/code/modules/mob/living/carbon/monkey/monkey_defense.dm +++ b/code/modules/mob/living/carbon/monkey/monkey_defense.dm @@ -64,7 +64,7 @@ if(!IsUnconscious()) M.do_attack_animation(src, ATTACK_EFFECT_DISARM) if (prob(25)) - Knockdown(40) + Paralyze(40) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) log_combat(M, src, "pushed") visible_message("[M] has pushed down [src]!", \ @@ -106,7 +106,7 @@ var/obj/item/I = null playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) if(prob(95)) - Knockdown(20) + Paralyze(20) visible_message("[M] has tackled down [name]!", \ "[M] has tackled down [name]!", null, COMBAT_MESSAGE_RANGE) else diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index 2c746224320..812b50d11d9 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -6,8 +6,8 @@ var/changed = 0 if(lying != lying_prev && rotate_on_lying) changed++ - ntransform.TurnTo(lying_prev,lying) - if(lying == 0) //Lying to standing + ntransform.TurnTo(lying_prev , lying) + if(!lying) //Lying to standing final_pixel_y = get_standard_pixel_y_offset() else //if(lying != 0) if(lying_prev == 0) //Standing to lying @@ -23,8 +23,7 @@ if(changed) animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, dir = final_dir, easing = EASE_IN|EASE_OUT) - floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart it in next life(). - + floating = FALSE // If we were without gravity, the bouncing animation got stopped, so we make sure we restart it in next life(). /mob/living/carbon var/list/overlays_standing[TOTAL_LAYERS] diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index dfc81396e78..0a75d8c0f32 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -94,6 +94,10 @@ Stun(effect * hit_percent) if(EFFECT_KNOCKDOWN) Knockdown(effect * hit_percent) + if(EFFECT_PARALYZE) + Paralyze(effect * hit_percent) + if(EFFECT_IMMOBILIZE) + Immobilize(effect * hit_percent) if(EFFECT_UNCONSCIOUS) Unconscious(effect * hit_percent) if(EFFECT_IRRADIATE) @@ -110,10 +114,14 @@ if(EFFECT_JITTER) if((status_flags & CANSTUN) && !has_trait(TRAIT_STUNIMMUNE)) jitteriness = max(jitteriness,(effect * hit_percent)) + if(EFFECT_PARALYZE) + Paralyze(effect * hit_percent) + if(EFFECT_IMMOBILIZE) + Immobilize(effect * hit_percent) return 1 -/mob/living/proc/apply_effects(stun = 0, knockdown = 0, unconscious = 0, irradiate = 0, slur = 0, stutter = 0, eyeblur = 0, drowsy = 0, blocked = FALSE, stamina = 0, jitter = 0) +/mob/living/proc/apply_effects(stun = 0, knockdown = 0, unconscious = 0, irradiate = 0, slur = 0, stutter = 0, eyeblur = 0, drowsy = 0, blocked = FALSE, stamina = 0, jitter = 0, paralyze = 0, immobilize = 0) if(blocked >= 100) return 0 if(stun) @@ -122,6 +130,10 @@ apply_effect(knockdown, EFFECT_KNOCKDOWN, blocked) if(unconscious) apply_effect(unconscious, EFFECT_UNCONSCIOUS, blocked) + if(paralyze) + apply_effect(paralyze, EFFECT_PARALYZE, blocked) + if(immobilize) + apply_effect(immobilize, EFFECT_IMMOBILIZE, blocked) if(irradiate) apply_effect(irradiate, EFFECT_IRRADIATE, blocked) if(slur) diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index f6888a21ecb..ab04184564d 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -1,7 +1,7 @@ /mob/living/gib(no_brain, no_organs, no_bodyparts) var/prev_lying = lying if(stat != DEAD) - death(1) + death(TRUE) if(!prev_lying) gib_animation() @@ -71,7 +71,7 @@ update_action_buttons_icon() update_damage_hud() update_health_hud() - update_canmove() + update_mobility() med_hud_set_health() med_hud_set_status() if(!gibbed && !QDELETED(src)) diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 61ce1c2bc3a..bfaf677a79a 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -243,7 +243,7 @@ if(H.get_num_arms() == 0) if(H.get_num_legs() != 0) message_param = "tries to point at %t with a leg, falling down in the process!" - H.Knockdown(20) + H.Paralyze(20) else message_param = "bumps [user.p_their()] head on the ground trying to motion towards %t." H.adjustBrainLoss(5) @@ -347,7 +347,7 @@ . = ..() if(. && isliving(user)) var/mob/living/L = user - L.Knockdown(200) + L.Paralyze(200) /datum/emote/living/sway key = "sway" diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index d7b2e3b7856..3308f0fbbd4 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -217,7 +217,7 @@ return FALSE if(!(AM.can_be_pulled(src, state, force))) return FALSE - if(throwing || incapacitated()) + if(throwing || !(mobility_flags & MOBILITY_PULL)) return FALSE AM.add_fingerprint(src) @@ -307,8 +307,8 @@ to_chat(src, "You have given up life and succumbed to death.") death() -/mob/living/incapacitated(ignore_restraints, ignore_grab) - if(stat || IsUnconscious() || IsStun() || IsKnockdown() || (!ignore_restraints && restrained(ignore_grab))) +/mob/living/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, check_immobilized = FALSE) + if(stat || IsUnconscious() || IsStun() || IsParalyzed() || (check_immobilized && IsImmobilized()) || (!ignore_restraints && restrained(ignore_grab))) return TRUE /mob/living/proc/InCritical() @@ -361,7 +361,7 @@ else if(alert(src, "You sure you want to sleep for a while?", "Sleep", "Yes", "No") == "Yes") SetSleeping(400) //Short nap - update_canmove() + update_mobility() /mob/proc/get_contents() @@ -370,19 +370,26 @@ set category = "IC" if(!resting) - resting = TRUE - to_chat(src, "You are now resting.") - update_rest_hud_icon() - update_canmove() + set_resting(TRUE, FALSE) else if(do_after(src, 10, target = src)) - to_chat(src, "You get up.") - resting = FALSE - update_rest_hud_icon() - update_canmove() + set_resting(FALSE, FALSE) else to_chat(src, "You fail to get up.") +/mob/living/proc/set_resting(rest, silent = TRUE) + if(!silent) + if(rest) + to_chat(src, "You are now resting.") + else + to_chat(src, "You get up.") + resting = rest + update_resting() + +/mob/living/proc/update_resting() + update_rest_hud_icon() + update_mobility() + //Recursive function to find everything a mob is holding. Really shitty proc tbh. /mob/living/get_contents() var/list/ret = list() @@ -433,7 +440,7 @@ stat = UNCONSCIOUS //the mob starts unconscious, blind_eyes(1) updatehealth() //then we check if the mob should wake up. - update_canmove() + update_mobility() update_sight() clear_alert("not_enough_oxy") reload_fullscreen() @@ -455,6 +462,8 @@ set_disgust(0) SetStun(0, FALSE) SetKnockdown(0, FALSE) + SetImmobilized(0, FALSE) + SetParalyzed(0, FALSE) SetSleeping(0, FALSE) radiation = 0 nutrition = NUTRITION_LEVEL_FED + 50 @@ -470,7 +479,7 @@ ExtinguishMob() fire_stacks = 0 confused = 0 - update_canmove() + update_mobility() GET_COMPONENT(mood, /datum/component/mood) if (mood) QDEL_LIST_ASSOC_VAL(mood.mood_events) @@ -504,7 +513,7 @@ if(active_storage && !(CanReach(active_storage.parent,view_only = TRUE))) active_storage.close(src) - if(lying && !buckled && prob(getBruteLoss()*200/maxHealth)) + if(!(mobility_flags & MOBILITY_STAND) && !buckled && prob(getBruteLoss()*200/maxHealth)) makeTrail(newloc, T, old_direction) /mob/living/proc/makeTrail(turf/target_turf, turf/start, direction) @@ -606,7 +615,7 @@ var/obj/C = loc C.container_resist(src) - else if(canmove) + else if(mobility_flags & MOBILITY_MOVE) if(on_fire) resist_fire() //stop, drop, and roll else if(last_special <= world.time) @@ -953,7 +962,7 @@ "[C] trips over [src] and falls!", \ "[C] topples over [src]!", \ "[C] leaps out of [src]'s way!")]") - C.Knockdown(40) + C.Paralyze(40) /mob/living/ConveyorMove() if((movement_type & FLYING) && !stat) @@ -965,42 +974,63 @@ //Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it. //Robots, animals and brains have their own version so don't worry about them -/mob/living/proc/update_canmove() - var/ko = IsKnockdown() || IsUnconscious() || (stat && (stat != SOFT_CRIT || pulledby)) || (has_trait(TRAIT_DEATHCOMA)) - var/move_and_fall = stat == SOFT_CRIT && !pulledby +/mob/living/proc/update_mobility() + var/stat_softcrit = stat == SOFT_CRIT + var/stat_conscious = (stat == CONSCIOUS) || stat_softcrit + var/conscious = !IsUnconscious() && stat_conscious && !has_trait(TRAIT_DEATHCOMA) var/chokehold = pulledby && pulledby.grab_state >= GRAB_NECK - var/buckle_lying = !(buckled && !buckled.buckle_lying) var/has_legs = get_num_legs() var/has_arms = get_num_arms() + var/paralyzed = IsParalyzed() + var/stun = IsStun() + var/knockdown = IsKnockdown() var/ignore_legs = get_leg_ignore() - if(ko || resting || move_and_fall || IsStun() || chokehold) + var/canmove = !IsImmobilized() && !stun && conscious && !paralyzed && !buckled && (!stat_softcrit || !pulledby) && !chokehold && !IsFrozen() && (has_arms || ignore_legs || has_legs) + if(canmove) + mobility_flags |= MOBILITY_MOVE + else + mobility_flags &= ~MOBILITY_MOVE + var/canstand_involuntary = conscious && !stat_softcrit && !knockdown && !chokehold && !paralyzed && has_legs && !(buckled && buckled.buckle_lying) + var/canstand = canstand_involuntary && !resting + + if(canstand) + mobility_flags |= (MOBILITY_STAND | MOBILITY_UI | MOBILITY_PULL) + lying = 0 + else + mobility_flags &= ~(MOBILITY_STAND | MOBILITY_UI | MOBILITY_PULL) + if(!lying) + lying = pick(90, 270) + var/canitem = !paralyzed && !stun && conscious && !chokehold && has_arms + if(canitem) + mobility_flags |= (MOBILITY_USE | MOBILITY_PICKUP | MOBILITY_STORAGE) + else + mobility_flags &= ~(MOBILITY_USE | MOBILITY_PICKUP | MOBILITY_STORAGE) + if(!(mobility_flags & MOBILITY_USE)) drop_all_held_items() - unset_machine() + if(!(mobility_flags & MOBILITY_PULL)) if(pulling) stop_pulling() - else if(has_legs || ignore_legs) - lying = 0 - if(buckled) - lying = 90*buckle_lying - else if(!lying) - if(resting) - fall() - else if(ko || move_and_fall || (!has_legs && !ignore_legs) || chokehold) - fall(forced = 1) - canmove = !(ko || resting || IsStun() || IsFrozen() || chokehold || buckled || (!has_legs && !ignore_legs && !has_arms)) + if(!(mobility_flags & MOBILITY_UI)) + unset_machine() density = !lying + var/changed = lying == lying_prev if(lying) + if(!lying_prev) + fall(!canstand_involuntary) if(layer == initial(layer)) //to avoid special cases like hiding larvas. layer = LYING_MOB_LAYER //so mob lying always appear behind standing mobs else if(layer == LYING_MOB_LAYER) layer = initial(layer) update_transform() - if(!lying && lying_prev) + if(changed) if(client) client.move_delay = world.time + movement_delay() lying_prev = lying - return canmove + +/mob/living/proc/fall(forced) + if(!(mobility_flags & MOBILITY_USE)) + drop_all_held_items() /mob/living/proc/AddAbility(obj/effect/proc_holder/A) abilities.Add(A) @@ -1039,7 +1069,7 @@ if(.) if(client) reset_perspective() - update_canmove() //if the mob was asleep inside a container and then got forceMoved out we need to make them fall. + update_mobility() //if the mob was asleep inside a container and then got forceMoved out we need to make them fall. /mob/living/proc/update_z(new_z) // 1+ to register, null to unregister if (registered_z != new_z) @@ -1130,7 +1160,7 @@ . = ..() switch(var_name) if("knockdown") - SetKnockdown(var_value) + SetParalyzed(var_value) if("stun") SetStun(var_value) if("unconscious") diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 8312aa2b0b8..3a4da65d4fa 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -175,14 +175,14 @@ log_combat(user, src, "grabbed", addition="neck grab") visible_message("[user] has grabbed [src] by the neck!",\ "[user] has grabbed you by the neck!") - update_canmove() //we fall down + update_mobility() //we fall down if(!buckled && !density) Move(user.loc) if(GRAB_KILL) log_combat(user, src, "strangled", addition="kill grab") visible_message("[user] is strangling [src]!", \ "[user] is strangling you!") - update_canmove() //we fall down + update_mobility() //we fall down if(!buckled && !density) Move(user.loc) return 1 diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 3b0af538660..02a55dbfcc9 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -22,6 +22,13 @@ var/staminaloss = 0 //Stamina damage, or exhaustion. You recover it slowly naturally, and are knocked down if it gets too high. Holodeck and hallucinations deal this. var/crit_threshold = HEALTH_THRESHOLD_CRIT // when the mob goes from "normal" to crit + var/mobility_flags = MOBILITY_FLAGS_DEFAULT + + var/resting = FALSE + + var/lying = 0 //number of degrees. DO NOT USE THIS IN CHECKS. CHECK FOR MOBILITY FLAGS INSTEAD!! + var/lying_prev = 0 //last value of lying on update_mobility + var/confused = 0 //Makes the mob move in random directions. var/hallucination = 0 //Directly affects how long a mob will hallucinate for diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 7c156c96b87..988a9138e6a 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -18,7 +18,7 @@ icon_state = "ai" move_resist = MOVE_FORCE_VERY_STRONG density = TRUE - canmove = FALSE + mobility_flags = NONE status_flags = CANSTUN|CANPUSH a_intent = INTENT_HARM //so we always get pushed instead of trying to swap sight = SEE_TURFS | SEE_MOBS | SEE_OBJS @@ -360,8 +360,8 @@ to_chat(src, "You are now [is_anchored ? "" : "un"]anchored.") // the message in the [] will change depending whether or not the AI is anchored -/mob/living/silicon/ai/update_canmove() //If the AI dies, mobs won't go through it anymore - return 0 +/mob/living/silicon/ai/update_mobility() //If the AI dies, mobs won't go through it anymore + return /mob/living/silicon/ai/proc/ai_cancel_call() set category = "Malfunction" diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index 80665ccc6b6..046d915948d 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -12,7 +12,6 @@ cameraFollow = null anchored = FALSE //unbolt floorbolts - update_canmove() if(eyeobj) eyeobj.setLoc(get_turf(src)) set_eyeobj_visible(FALSE) diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm index 8ecacb608bc..d2fc9bfaa61 100644 --- a/code/modules/mob/living/silicon/death.dm +++ b/code/modules/mob/living/silicon/death.dm @@ -10,4 +10,4 @@ diag_hud_set_status() diag_hud_set_health() update_health_hud() - . = ..() \ No newline at end of file + return ..() diff --git a/code/modules/mob/living/silicon/pai/death.dm b/code/modules/mob/living/silicon/pai/death.dm index f558ff39073..22f8b59ec33 100644 --- a/code/modules/mob/living/silicon/pai/death.dm +++ b/code/modules/mob/living/silicon/pai/death.dm @@ -2,7 +2,7 @@ if(stat == DEAD) return stat = DEAD - canmove = 0 + mobility_flags = NONE update_sight() clear_fullscreens() diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 7fd861bfeb2..b08a9205491 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -73,7 +73,6 @@ var/overload_ventcrawl = 0 var/overload_bulletblock = 0 //Why is this a good idea? var/overload_maxhealth = 0 - canmove = FALSE var/silent = FALSE var/brightness_power = 5 @@ -97,7 +96,6 @@ START_PROCESSING(SSfastprocess, src) GLOB.pai_list += src make_laws() - canmove = 0 if(!istype(P)) //when manually spawning a pai, we create a card to put it into. var/newcardloc = P P = new /obj/item/paicard(newcardloc) diff --git a/code/modules/mob/living/silicon/pai/pai_defense.dm b/code/modules/mob/living/silicon/pai/pai_defense.dm index f20ccbc7309..50c7c0416f0 100644 --- a/code/modules/mob/living/silicon/pai/pai_defense.dm +++ b/code/modules/mob/living/silicon/pai/pai_defense.dm @@ -7,7 +7,7 @@ if(. & EMP_PROTECT_SELF) return take_holo_damage(50/severity) - Knockdown(400/severity) + Paralyze(400/severity) silent = max(30/severity, silent) if(holoform) fold_in(force = TRUE) @@ -21,10 +21,10 @@ qdel(src) if(2) fold_in(force = 1) - Knockdown(400) + Paralyze(400) if(3) fold_in(force = 1) - Knockdown(200) + Paralyze(200) /mob/living/silicon/pai/attack_hand(mob/living/carbon/human/user) switch(user.a_intent) @@ -85,7 +85,7 @@ take_holo_damage(amount & 0.25) /mob/living/silicon/pai/adjustBrainLoss(amount) - Knockdown(amount * 0.2) + Paralyze(amount * 0.2) /mob/living/silicon/pai/getBruteLoss() return emittermaxhealth - emitterhealth diff --git a/code/modules/mob/living/silicon/pai/pai_shell.dm b/code/modules/mob/living/silicon/pai/pai_shell.dm index 4344a439db4..3e378c6183e 100644 --- a/code/modules/mob/living/silicon/pai/pai_shell.dm +++ b/code/modules/mob/living/silicon/pai/pai_shell.dm @@ -18,7 +18,7 @@ emittersemicd = TRUE addtimer(CALLBACK(src, .proc/emittercool), emittercd) - canmove = TRUE + mobility_flags = MOBILITY_FLAGS_DEFAULT density = TRUE if(istype(card.loc, /obj/item/pda)) var/obj/item/pda/P = card.loc @@ -60,12 +60,11 @@ var/turf/T = drop_location() card.forceMove(T) forceMove(card) - canmove = FALSE + mobility_flags = NONE density = FALSE set_light(0) holoform = FALSE - if(resting) - lay_down() + set_resting(resting) /mob/living/silicon/pai/proc/choose_chassis() if(!isturf(loc) && loc != card) @@ -75,22 +74,17 @@ if(!choice) return FALSE chassis = choice - icon_state = "[chassis]" - if(resting) - icon_state = "[chassis]_rest" + update_resting() to_chat(src, "You switch your holochassis projection composite to [chassis]") -/mob/living/silicon/pai/lay_down() - ..() - update_resting_icon(resting) - -/mob/living/silicon/pai/proc/update_resting_icon(rest) - if(rest) +/mob/living/silicon/pai/update_resting() + . = ..() + if(resting) icon_state = "[chassis]_rest" else icon_state = "[chassis]" if(loc != card) - visible_message("[src] [rest? "lays down for a moment..." : "perks up from the ground"]") + visible_message("[src] [resting? "lays down for a moment..." : "perks up from the ground"]") /mob/living/silicon/pai/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE) return FALSE diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index 75e8fd317f6..188b53a5c96 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -21,7 +21,6 @@ locked = FALSE //unlock cover - update_canmove() if(!QDELETED(builtInCamera) && builtInCamera.status) builtInCamera.toggle_cam(src,0) update_headlamp(1) //So borg lights are disabled when killed. diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 3ff18c87476..02387eba2b0 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -92,11 +92,11 @@ else cut_overlay(fire_overlay) -/mob/living/silicon/robot/update_canmove() +/mob/living/silicon/robot/update_mobility() if(stat || buckled || lockcharge) - canmove = 0 + mobility_flags &= ~MOBILITY_MOVE else - canmove = 1 + mobility_flags = MOBILITY_FLAGS_DEFAULT update_transform() update_action_buttons_icon() - return canmove + diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 4ad73bfc9bd..85c9747b5f0 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -613,7 +613,7 @@ /mob/living/silicon/robot/update_icons() cut_overlays() icon_state = module.cyborg_base_icon - if(stat != DEAD && !(IsUnconscious() || IsStun() || IsKnockdown() || low_power_mode)) //Not dead, not stunned. + if(stat != DEAD && !(IsUnconscious() || IsStun() || IsParalyzed() || low_power_mode)) //Not dead, not stunned. if(!eye_lights) eye_lights = new() if(lamp_intensity > 2) @@ -649,10 +649,10 @@ if(src.connected_ai) connected_ai.connected_robots -= src src.connected_ai = null - lawupdate = 0 - lockcharge = 0 - canmove = 1 - scrambledcodes = 1 + lawupdate = FALSE + lockcharge = FALSE + mobility_flags |= MOBILITY_FLAGS_DEFAULT + scrambledcodes = TRUE //Disconnect it's camera so it's not so easily tracked. if(!QDELETED(builtInCamera)) QDEL_NULL(builtInCamera) @@ -682,7 +682,7 @@ else clear_alert("locked") lockcharge = state - update_canmove() + update_mobility() /mob/living/silicon/robot/proc/SetEmagged(new_state) emagged = new_state @@ -950,17 +950,17 @@ if(health <= -maxHealth) //die only once death() return - if(IsUnconscious() || IsStun() || IsKnockdown() || getOxyLoss() > maxHealth*0.5) + if(IsUnconscious() || IsStun() || IsKnockdown() || IsParalyzed() || getOxyLoss() > maxHealth*0.5) if(stat == CONSCIOUS) stat = UNCONSCIOUS blind_eyes(1) - update_canmove() + update_mobility() update_headlamp() else if(stat == UNCONSCIOUS) stat = CONSCIOUS adjust_blindness(-1) - update_canmove() + update_mobility() update_headlamp() diag_hud_set_status() diag_hud_set_health() diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 037b2819e99..3c798588e50 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -15,7 +15,7 @@ /mob/living/silicon/robot/attack_alien(mob/living/carbon/alien/humanoid/M) if (M.a_intent == INTENT_DISARM) - if(!(lying)) + if(mobility_flags & MOBILITY_STAND) M.do_attack_animation(src, ATTACK_EFFECT_DISARM) var/obj/item/I = get_active_held_item() if(I) diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index d898fadc5fc..7320e457f12 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -29,7 +29,7 @@ var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) if(prob(damage)) for(var/mob/living/N in buckled_mobs) - N.Knockdown(20) + N.Paralyze(20) unbuckle_mob(N) N.visible_message("[N] is knocked off of [src] by [M]!") switch(M.melee_damage_type) @@ -106,7 +106,7 @@ for(var/mob/living/M in buckled_mobs) if(prob(severity*50)) unbuckle_mob(M) - M.Knockdown(40) + M.Paralyze(40) M.visible_message("[M] is thrown off of [src]!") flash_act(affect_silicon = 1) @@ -118,8 +118,8 @@ for(var/mob/living/M in buckled_mobs) M.visible_message("[M] is knocked off of [src]!") unbuckle_mob(M) - M.Knockdown(40) - if(Proj.stun || Proj.knockdown) + M.Paralyze(40) + if(Proj.stun || Proj.knockdown || Proj.paralyze) for(var/mob/living/M in buckled_mobs) unbuckle_mob(M) M.visible_message("[M] is knocked off of [src] by the [Proj]!") diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index b065457f6de..136d7bb2726 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -110,7 +110,7 @@ if(stat) return FALSE on = TRUE - canmove = TRUE + update_mobility() set_light(initial(light_range)) update_icon() diag_hud_set_botstat() @@ -118,7 +118,7 @@ /mob/living/simple_animal/bot/proc/turn_off() on = FALSE - canmove = FALSE + update_mobility() set_light(0) bot_reset() //Resets an AI's call, should it exist. update_icon() @@ -155,11 +155,10 @@ path_hud.add_to_hud(src) path_hud.add_hud_to(src) -/mob/living/simple_animal/bot/update_canmove() +/mob/living/simple_animal/bot/update_mobility() . = ..() if(!on) - . = 0 - canmove = . + mobility_flags = NONE /mob/living/simple_animal/bot/Destroy() if(path_hud) diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index bc8dd0c3ab8..32f48b140b9 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -86,7 +86,7 @@ /mob/living/simple_animal/bot/cleanbot/process_scan(atom/A) if(iscarbon(A)) var/mob/living/carbon/C = A - if(C.stat != DEAD && C.lying) + if(C.stat != DEAD && !(C.mobility_flags & MOBILITY_STAND)) return C else if(is_type_in_typecache(A, target_types)) return A @@ -155,7 +155,7 @@ else shuffle = TRUE //Shuffle the list the next time we scan so we dont both go the same way. path = list() - + if(!path || path.len == 0) //No path, need a new one //Try to produce a path to the target, and ignore airlocks to which it has access. path = get_path_to(src, target.loc, /turf/proc/Distance_cardinal, 0, 30, id=access_card) diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index d6f57cf4d56..44a3e7ed140 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -223,7 +223,7 @@ Auto Patrol[]"}, var/list/targets = list() for(var/mob/living/carbon/C in view(7,src)) //Let's find us a target var/threatlevel = 0 - if((C.stat) || (C.lying)) + if(C.incapacitated()) continue threatlevel = C.assess_threat(judgement_criteria, lasercolor, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) //speak(C.real_name + text(": threat: []", threatlevel)) @@ -237,7 +237,7 @@ Auto Patrol[]"}, targets += C if(targets.len>0) var/mob/living/carbon/t = pick(targets) - if((t.stat!=2) && (t.lying != 1) && (!t.handcuffed)) //we don't shoot people who are dead, cuffed or lying down. + if((t.stat!=2) && (!(t.mobility_flags & MOBILITY_STAND)) && (!t.handcuffed)) //we don't shoot people who are dead, cuffed or lying down. shootAt(t) switch(mode) @@ -276,7 +276,7 @@ Auto Patrol[]"}, if(BOT_PREP_ARREST) // preparing to arrest target // see if he got away. If he's no no longer adjacent or inside a closet or about to get up, we hunt again. - if(!Adjacent(target) || !isturf(target.loc) || target.AmountKnockdown() < 40) + if(!Adjacent(target) || !isturf(target.loc) || target.AmountParalyzed() < 40) back_to_hunt() return @@ -303,7 +303,7 @@ Auto Patrol[]"}, back_to_idle() return - if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && target.AmountKnockdown() < 40)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. + if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && target.AmountParalyzed() < 40)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. back_to_hunt() return else @@ -527,7 +527,7 @@ Auto Patrol[]"}, return if(iscarbon(A)) var/mob/living/carbon/C = A - if(!C.IsStun() || arrest_type) + if(!C.IsStun() || !C.IsParalyzed() || arrest_type) stun_attack(A) else if(C.canBeHandcuffed() && !C.handcuffed) cuff(A) @@ -545,7 +545,7 @@ Auto Patrol[]"}, spawn(2) icon_state = "[lasercolor]ed209[on]" var/threat = 5 - C.Knockdown(100) + C.Paralyze(100) C.stuttering = 5 if(ishuman(C)) var/mob/living/carbon/human/H = C diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index bbbf38bdda0..782d4ddc950 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -150,7 +150,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, if (emagged <= 1) honk_attack(A) else - if(!C.IsStun() || arrest_type) + if(!C.IsParalyzed() || arrest_type) stun_attack(A) ..() else if (!spam_flag) //honking at the ground @@ -197,7 +197,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, C.stuttering = 20 C.adjustEarDamage(0, 5) //far less damage than the H.O.N.K. C.Jitter(50) - C.Knockdown(60) + C.Paralyze(60) var/mob/living/carbon/human/H = C if(client) //prevent spam from players.. spam_flag = TRUE @@ -216,7 +216,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, "[src] has honked you!") else C.stuttering = 20 - C.Knockdown(80) + C.Paralyze(80) addtimer(CALLBACK(src, .proc/spam_flag_false), cooldowntime) @@ -359,7 +359,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, "[C] trips over [src] and falls!", \ "[C] topples over [src]!", \ "[C] leaps out of [src]'s way!")]") - C.Knockdown(10) + C.Paralyze(10) playsound(loc, 'sound/misc/sadtrombone.ogg', 50, 1, -1) if(!client) speak("Honk!") diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index 7167d87bde5..fd446ca75b2 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -85,7 +85,7 @@ if(!on) icon_state = "medibot0" return - if(IsStun()) + if(IsStun() || IsParalyzed()) icon_state = "medibota" return if(mode == BOT_HEALING) @@ -105,7 +105,7 @@ skin = new_skin update_icon() -/mob/living/simple_animal/bot/medbot/update_canmove() +/mob/living/simple_animal/bot/medbot/update_mobility() . = ..() update_icon() @@ -277,7 +277,7 @@ if(mode == BOT_HEALING) return - if(IsStun()) + if(IsStun() || IsParalyzed()) oldpatient = patient patient = null mode = BOT_IDLE diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 5209d0b6f0b..7a511126e9b 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -327,8 +327,9 @@ // mousedrop a crate to load the bot // can load anything if hacked /mob/living/simple_animal/bot/mulebot/MouseDrop_T(atom/movable/AM, mob/user) + var/mob/living/L = user - if(user.incapacitated() || user.lying) + if(user.incapacitated() || (istype(L) && !(L.mobility_flags & MOBILITY_STAND))) return if(!istype(AM)) @@ -633,7 +634,7 @@ if(!paicard) log_combat(src, L, "knocked down") visible_message("[src] knocks over [L]!") - L.Knockdown(160) + L.Paralyze(160) return ..() // called from mob/living/carbon/human/Crossed() diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 3149b2fd6bf..0a952daa15f 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -212,7 +212,7 @@ Auto Patrol: []"}, return if(iscarbon(A)) var/mob/living/carbon/C = A - if(!C.IsStun() || arrest_type) + if(!C.IsParalyzed() || arrest_type) stun_attack(A) else if(C.canBeHandcuffed() && !C.handcuffed) cuff(A) @@ -253,11 +253,11 @@ Auto Patrol: []"}, var/threat = 5 if(ishuman(C)) C.stuttering = 5 - C.Knockdown(100) + C.Paralyze(100) var/mob/living/carbon/human/H = C threat = H.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) else - C.Knockdown(100) + C.Paralyze(100) C.stuttering = 5 threat = C.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) @@ -311,7 +311,7 @@ Auto Patrol: []"}, if(BOT_PREP_ARREST) // preparing to arrest target // see if he got away. If he's no no longer adjacent or inside a closet or about to get up, we hunt again. - if( !Adjacent(target) || !isturf(target.loc) || target.AmountKnockdown() < 40) + if( !Adjacent(target) || !isturf(target.loc) || target.AmountParalyzed() < 40) back_to_hunt() return @@ -338,7 +338,7 @@ Auto Patrol: []"}, back_to_idle() return - if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && target.AmountKnockdown() < 40)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. + if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && target.AmountParalyzed() < 40)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again. back_to_hunt() return else //Try arresting again if the target escapes. diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 774bed17ec7..2ebe0896f85 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -357,7 +357,7 @@ if(!LAZYLEN(parts)) if(undismembermerable_limbs) //they have limbs we can't remove, and no parts we can, attack! return ..() - C.Knockdown(60) + C.Paralyze(60) visible_message("[src] knocks [C] down!") to_chat(src, "\"Bring [C.p_them()] to me.\"") return FALSE diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 5e5b486435b..5cc9983517e 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -38,7 +38,7 @@ . = ..() verbs += /mob/living/proc/lay_down -/mob/living/simple_animal/pet/cat/update_canmove() +/mob/living/simple_animal/pet/cat/update_mobility() ..() if(client && stat != DEAD) if (resting) @@ -49,7 +49,6 @@ collar_type = "[initial(collar_type)]" regenerate_icons() - /mob/living/simple_animal/pet/cat/space name = "space cat" desc = "It's a cat... in space!" @@ -172,21 +171,18 @@ emote("me", 1, pick("stretches out for a belly rub.", "wags its tail.", "lies down.")) icon_state = "[icon_living]_rest" collar_type = "[initial(collar_type)]_rest" - resting = 1 - update_canmove() + set_resting(TRUE) else if (prob(1)) emote("me", 1, pick("sits down.", "crouches on its hind legs.", "looks alert.")) icon_state = "[icon_living]_sit" collar_type = "[initial(collar_type)]_sit" - resting = 1 - update_canmove() + set_resting(TRUE) else if (prob(1)) if (resting) emote("me", 1, pick("gets up and meows.", "walks around.", "stops resting.")) icon_state = "[icon_living]" collar_type = "[initial(collar_type)]" - resting = 0 - update_canmove() + set_resting(FALSE) else emote("me", 1, pick("grooms its fur.", "twitches its whiskers.", "shakes out its coat.")) diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index d7d673ff8b6..1ed6f7abb9f 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -25,7 +25,7 @@ ..() //CRAB movement if(!ckey && !stat) - if(isturf(src.loc) && !resting && !buckled) //This is so it only moves if it's not inside a closet, gentics machine, etc. + if(isturf(loc) && !resting && !buckled) //This is so it only moves if it's not inside a closet, gentics machine, etc. turns_since_move++ if(turns_since_move >= turns_per_move) var/east_vs_west = pick(4,8) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm index 48fe4b321c3..50da6151572 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm @@ -207,37 +207,6 @@ else icon_state = "[visualAppearence]_dead" -/mob/living/simple_animal/drone/cogscarab/Stun(amount, updating = 1, ignore_canstun = 0) +/mob/living/simple_animal/drone/cogscarab/update_mobility() . = ..() - if(.) - update_icons() - -/mob/living/simple_animal/drone/cogscarab/SetStun(amount, updating = 1, ignore_canstun = 0) - . = ..() - if(.) - update_icons() - -/mob/living/simple_animal/drone/cogscarab/AdjustStun(amount, updating = 1, ignore_canstun = 0) - . = ..() - if(.) - update_icons() - -/mob/living/simple_animal/drone/cogscarab/Knockdown(amount, updating = 1, ignore_canknockdown = 0) - . = ..() - if(.) - update_icons() - -/mob/living/simple_animal/drone/cogscarab/SetKnockdown(amount, updating = 1, ignore_canknockdown = 0) - . = ..() - if(.) - update_icons() - -/mob/living/simple_animal/drone/cogscarab/AdjustKnockdown(amount, updating = 1, ignore_canknockdown = 0) - . = ..() - if(.) - update_icons() - -/mob/living/simple_animal/drone/cogscarab/update_canmove() - . = ..() - if(.) - update_icons() + update_icons() diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 564fae48adf..a285a0b121f 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -160,7 +160,7 @@ M.visible_message("[M] tips over [src].", "You tip over [src].") to_chat(src, "You are tipped over by [M]!") - Knockdown(60,ignore_canknockdown = TRUE) + Paralyze(60,ignore_canknockdown = TRUE) icon_state = icon_dead spawn(rand(20,50)) if(!stat && M) diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index 4e7cb0ac70a..1c653b01c3c 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -40,6 +40,6 @@ . = ..() if(. && prob(12) && iscarbon(target)) var/mob/living/carbon/C = target - C.Knockdown(60) + C.Paralyze(60) C.visible_message("\The [src] knocks down \the [C]!", \ "\The [src] knocks you down!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm index 5d1db8d35e1..17eafd47858 100644 --- a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm +++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm @@ -71,7 +71,7 @@ var/atom/throw_target = get_edge_target_turf(L, dir) L.throw_at(throw_target, rand(1,2), 7, src) else - L.Knockdown(20) + L.Paralyze(20) visible_message("[src] knocks [L] down!") /mob/living/simple_animal/hostile/gorilla/CanAttack(atom/the_target) diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm index d1e8f1f49ed..d2894772f2b 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm @@ -31,7 +31,7 @@ /obj/item/projectile/leaper name = "leaper bubble" icon_state = "leaper" - knockdown = 50 + paralyze = 50 damage = 0 range = 7 hitsound = 'sound/effects/snap.ogg' @@ -93,7 +93,7 @@ var/mob/living/L = AM if(!istype(L, /mob/living/simple_animal/hostile/jungle/leaper)) playsound(src,'sound/effects/snap.ogg',50, 1, -1) - L.Knockdown(50) + L.Paralyze(50) if(iscarbon(L)) var/mob/living/carbon/C = L C.reagents.add_reagent("leaper_venom", 5) diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index ca5323a9783..bb6851eedbb 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -69,7 +69,7 @@ icon_state = initial(icon_state) if(prob(15) && iscarbon(target)) var/mob/living/carbon/C = target - C.Knockdown(40) + C.Paralyze(40) C.visible_message("\The [src] knocks down \the [C]!", \ "\The [src] knocks you down!") @@ -179,7 +179,7 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca . = ..() if(knockdown_people && . && prob(15) && iscarbon(target)) var/mob/living/carbon/C = target - C.Knockdown(40) + C.Paralyze(40) C.visible_message("\The [src] knocks down \the [C]!", \ "\The [src] knocks you down!") diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 3d10bfd1215..ccd1a226a0a 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -56,7 +56,7 @@ if(iscarbon(target)) var/mob/living/carbon/C = target if(prob(15)) - C.Knockdown(60) + C.Paralyze(60) C.visible_message("\The [src] knocks down \the [C]!", \ "\The [src] knocks you down!") diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm index 29bc2cbff0a..2f07a61e9ca 100644 --- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm +++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm @@ -94,7 +94,7 @@ if(prob(grasp_pull_chance)) setDir(get_dir(src,L) )//staaaare step(L,get_dir(L,src)) //reel them in - L.Knockdown(60) //you can't get away now~ + L.Paralyze(60) //you can't get away now~ if(grasping.len < max_grasps) grasping: diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 4fdf431fa06..3dd3aff6772 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -391,7 +391,7 @@ /mob/living/simple_animal/parrot/handle_automated_movement() - if(!isturf(src.loc) || !canmove || buckled) + if(!isturf(src.loc) || !(mobility_flags & MOBILITY_MOVE) || buckled) return //If it can't move, dont let it move. (The buckled check probably isn't necessary thanks to canmove) if(client && stat == CONSCIOUS && parrot_state != icon_living) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index be2ea6fe94a..acc8e6f54e4 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -151,7 +151,7 @@ /mob/living/simple_animal/proc/handle_automated_movement() set waitfor = FALSE if(!stop_automated_movement && wander) - if((isturf(src.loc) || allow_movement_on_non_turfs) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc. + if((isturf(loc) || allow_movement_on_non_turfs) && (mobility_flags & MOBILITY_MOVE)) //This is so it only moves if it's not inside a closet, gentics machine, etc. turns_since_move++ if(turns_since_move >= turns_per_move) if(!(stop_automated_movement_when_pulled && pulledby)) //Some animals don't move when pulled @@ -328,7 +328,7 @@ health = 0 icon_state = icon_dead density = FALSE - lying = 1 + set_resting(TRUE) ..() /mob/living/simple_animal/proc/CanAttack(atom/the_target) @@ -362,7 +362,8 @@ icon = initial(icon) icon_state = icon_living density = initial(density) - lying = 0 + mobility_flags = MOBILITY_FLAGS_DEFAULT + update_mobility() . = 1 movement_type = initial(movement_type) @@ -417,17 +418,19 @@ else ..() -/mob/living/simple_animal/update_canmove(value_otherwise = TRUE) - if(IsUnconscious() || IsStun() || IsKnockdown() || stat || resting) +/mob/living/simple_animal/update_mobility(value_otherwise = TRUE) + if(IsUnconscious() || IsParalyzed() || IsStun() || IsKnockdown() || IsParalyzed() || stat || resting) drop_all_held_items() - canmove = FALSE + mobility_flags = NONE else if(buckled) - canmove = FALSE + mobility_flags = MOBILITY_FLAGS_INTERACTION else - canmove = value_otherwise + if(value_otherwise) + mobility_flags = MOBILITY_FLAGS_DEFAULT + else + mobility_flags = NONE update_transform() update_action_buttons_icon() - return canmove /mob/living/simple_animal/update_transform() var/matrix/ntransform = matrix(transform) //aka transform.Copy() diff --git a/code/modules/mob/living/simple_animal/slime/death.dm b/code/modules/mob/living/simple_animal/slime/death.dm index 52c92102630..74d68719b2c 100644 --- a/code/modules/mob/living/simple_animal/slime/death.dm +++ b/code/modules/mob/living/simple_animal/slime/death.dm @@ -24,8 +24,6 @@ stat = DEAD cut_overlays() - update_canmove() - if(SSticker.mode) SSticker.mode.check_win() diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index 161362c1877..579fa7deab1 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -70,7 +70,7 @@ if(Target.Adjacent(src)) Target.attack_slime(src) return - if(!Target.lying && prob(80)) + if((Target.mobility_flags & MOBILITY_STAND) && prob(80)) if(Target.client && Target.health >= 20) if(!Atkcool) @@ -140,12 +140,12 @@ stat = UNCONSCIOUS powerlevel = 0 rabid = 0 - update_canmove() + update_mobility() regenerate_icons() else if(stat == UNCONSCIOUS && !stasis) to_chat(src, "You wake up from the stasis.") stat = CONSCIOUS - update_canmove() + update_mobility() regenerate_icons() updatehealth() @@ -278,9 +278,9 @@ /mob/living/simple_animal/slime/proc/handle_targets() if(Tempstun) if(!buckled) // not while they're eating! - canmove = 0 + mobility_flags &= ~MOBILITY_MOVE else - canmove = 1 + mobility_flags |= MOBILITY_MOVE if(attacked > 50) attacked = 50 @@ -298,7 +298,7 @@ Discipline-- if(!client) - if(!canmove) + if(!(mobility_flags & MOBILITY_MOVE)) return if(buckled) @@ -383,13 +383,13 @@ if (Leader) if(holding_still) holding_still = max(holding_still - 1, 0) - else if(canmove && isturf(loc)) + else if((mobility_flags & MOBILITY_MOVE) && isturf(loc)) step_to(src, Leader) else if(hungry) if (holding_still) holding_still = max(holding_still - hungry, 0) - else if(canmove && isturf(loc) && prob(50)) + else if((mobility_flags & MOBILITY_MOVE) && isturf(loc) && prob(50)) step(src, pick(GLOB.cardinals)) else @@ -397,7 +397,7 @@ holding_still = max(holding_still - 1, 0) else if (docile && pulledby) holding_still = 10 - else if(canmove && isturf(loc) && prob(33)) + else if((mobility_flags & MOBILITY_MOVE) && isturf(loc) && prob(33)) step(src, pick(GLOB.cardinals)) else if(!AIproc) INVOKE_ASYNC(src, .proc/AIprocess) diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index baea2ec84df..bba5e1aad2b 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -456,13 +456,13 @@ SStun = world.time + rand(20,60) spawn(0) - canmove = 0 + mobility_flags &= ~MOBILITY_MOVE if(user) step_away(src,user,15) sleep(3) if(user) step_away(src,user,15) - update_canmove() + update_mobility() /mob/living/simple_animal/slime/pet docile = 1 diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 5baa42ffa23..efb69897184 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -5,7 +5,7 @@ ////////////////////////////// STUN //////////////////////////////////// -/mob/living/IsStun() //If we're stunned +/mob/living/proc/IsStun() //If we're stunned return has_status_effect(STATUS_EFFECT_STUN) /mob/living/proc/AmountStun() //How many deciseconds remain in our stun @@ -15,6 +15,8 @@ return 0 /mob/living/proc/Stun(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STUN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) + return if(((status_flags & CANSTUN) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canstun) if(absorb_stun(amount, ignore_canstun)) return @@ -26,6 +28,8 @@ return S /mob/living/proc/SetStun(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STUN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) + return if(((status_flags & CANSTUN) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canstun) var/datum/status_effect/incapacitating/stun/S = IsStun() if(amount <= 0) @@ -41,6 +45,8 @@ return S /mob/living/proc/AdjustStun(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STUN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) + return if(((status_flags & CANSTUN) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canstun) if(absorb_stun(amount, ignore_canstun)) return @@ -53,7 +59,7 @@ ///////////////////////////////// KNOCKDOWN ///////////////////////////////////// -/mob/living/IsKnockdown() //If we're knocked down +/mob/living/proc/IsKnockdown() //If we're knocked down return has_status_effect(STATUS_EFFECT_KNOCKDOWN) /mob/living/proc/AmountKnockdown() //How many deciseconds remain in our knockdown @@ -62,9 +68,11 @@ return K.duration - world.time return 0 -/mob/living/proc/Knockdown(amount, updating = TRUE, ignore_canknockdown = FALSE) //Can't go below remaining duration - if(((status_flags & CANKNOCKDOWN) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canknockdown) - if(absorb_stun(amount, ignore_canknockdown)) +/mob/living/proc/Knockdown(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) + return + if(((status_flags & CANKNOCKDOWN) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canstun) + if(absorb_stun(amount, ignore_canstun)) return var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown() if(K) @@ -73,14 +81,16 @@ K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating) return K -/mob/living/proc/SetKnockdown(amount, updating = TRUE, ignore_canknockdown = FALSE) //Sets remaining duration - if(((status_flags & CANKNOCKDOWN) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canknockdown) +/mob/living/proc/SetKnockdown(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) + return + if(((status_flags & CANKNOCKDOWN) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canstun) var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown() if(amount <= 0) if(K) qdel(K) else - if(absorb_stun(amount, ignore_canknockdown)) + if(absorb_stun(amount, ignore_canstun)) return if(K) K.duration = world.time + amount @@ -88,9 +98,11 @@ K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating) return K -/mob/living/proc/AdjustKnockdown(amount, updating = TRUE, ignore_canknockdown = FALSE) //Adds to remaining duration - if(((status_flags & CANKNOCKDOWN) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canknockdown) - if(absorb_stun(amount, ignore_canknockdown)) +/mob/living/proc/AdjustKnockdown(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) + return + if(((status_flags & CANKNOCKDOWN) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canstun) + if(absorb_stun(amount, ignore_canstun)) return var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown() if(K) @@ -99,6 +111,230 @@ K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating) return K +///////////////////////////////// IMMOBILIZED //////////////////////////////////// +/mob/living/proc/IsImmobilized() //If we're immobilized + return has_status_effect(STATUS_EFFECT_IMMOBILIZED) + +/mob/living/proc/AmountImmobilized() //How many deciseconds remain in our Immobilized status effect + var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized() + if(I) + return I.duration - world.time + return 0 + +/mob/living/proc/Immobilize(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_IMMOBILIZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) + return + if(((status_flags & CANKNOCKDOWN) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canstun) + if(absorb_stun(amount, ignore_canstun)) + return + var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized() + if(I) + I.duration = max(world.time + amount, I.duration) + else if(amount > 0) + I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating) + return I + +/mob/living/proc/SetImmobilized(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_IMMOBILIZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) + return + if(((status_flags & CANKNOCKDOWN) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canstun) + var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized() + if(amount <= 0) + if(I) + qdel(I) + else + if(absorb_stun(amount, ignore_canstun)) + return + if(I) + I.duration = world.time + amount + else + I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating) + return I + +/mob/living/proc/AdjustImmobilized(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_IMMOBILIZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) + return + if(((status_flags & CANKNOCKDOWN) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canstun) + if(absorb_stun(amount, ignore_canstun)) + return + var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized() + if(I) + I.duration += amount + else if(amount > 0) + I = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating) + return I + +///////////////////////////////// PARALYZED ////////////////////////////////// +/mob/living/proc/IsParalyzed() //If we're immobilized + return has_status_effect(STATUS_EFFECT_PARALYZED) + +/mob/living/proc/AmountParalyzed() //How many deciseconds remain in our Paralyzed status effect + var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed() + if(P) + return P.duration - world.time + return 0 + +/mob/living/proc/Paralyze(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_PARALYZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) + return + if(((status_flags & CANKNOCKDOWN) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canstun) + if(absorb_stun(amount, ignore_canstun)) + return + var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed() + if(P) + P.duration = max(world.time + amount, P.duration) + else if(amount > 0) + P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount, updating) + return P + +/mob/living/proc/SetParalyzed(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_PARALYZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) + return + if(((status_flags & CANKNOCKDOWN) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canstun) + var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed() + if(amount <= 0) + if(P) + qdel(P) + else + if(absorb_stun(amount, ignore_canstun)) + return + if(P) + P.duration = world.time + amount + else + P = apply_status_effect(STATUS_EFFECT_IMMOBILIZED, amount, updating) + return P + +/mob/living/proc/AdjustParalyzed(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_PARALYZE, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) + return + if(((status_flags & CANKNOCKDOWN) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canstun) + if(absorb_stun(amount, ignore_canstun)) + return + var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed() + if(P) + P.duration += amount + else if(amount > 0) + P = apply_status_effect(STATUS_EFFECT_PARALYZED, amount, updating) + return P + +//Blanket +/mob/living/proc/AllImmobility(amount, updating) + Paralyze(amount, FALSE) + Knockdown(amount, FALSE) + Stun(amount, FALSE) + Immobilize(amount, FALSE) + if(updating) + update_mobility() + +/mob/living/proc/SetAllImmobility(amount, updating) + SetParalyzed(amount, FALSE) + SetKnockdown(amount, FALSE) + SetStun(amount, FALSE) + SetImmobilized(amount, FALSE) + if(updating) + update_mobility() + +/mob/living/proc/AdjustAllImmobility(amount, updating) + AdjustParalyzed(amount, FALSE) + AdjustKnockdown(amount, FALSE) + AdjustStun(amount, FALSE) + AdjustImmobilized(amount, FALSE) + if(updating) + update_mobility() + +//////////////////UNCONSCIOUS +/mob/living/proc/IsUnconscious() //If we're unconscious + return has_status_effect(STATUS_EFFECT_UNCONSCIOUS) + +/mob/living/proc/AmountUnconscious() //How many deciseconds remain in our unconsciousness + var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious() + if(U) + return U.duration - world.time + return 0 + +/mob/living/proc/Unconscious(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_UNCONSCIOUS, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) + return + if(((status_flags & CANUNCONSCIOUS) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canstun) + var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious() + if(U) + U.duration = max(world.time + amount, U.duration) + else if(amount > 0) + U = apply_status_effect(STATUS_EFFECT_UNCONSCIOUS, amount, updating) + return U + +/mob/living/proc/SetUnconscious(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_UNCONSCIOUS, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) + return + if(((status_flags & CANUNCONSCIOUS) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canstun) + var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious() + if(amount <= 0) + if(U) + qdel(U) + else if(U) + U.duration = world.time + amount + else + U = apply_status_effect(STATUS_EFFECT_UNCONSCIOUS, amount, updating) + return U + +/mob/living/proc/AdjustUnconscious(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_UNCONSCIOUS, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) + return + if(((status_flags & CANUNCONSCIOUS) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canstun) + var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious() + if(U) + U.duration += amount + else if(amount > 0) + U = apply_status_effect(STATUS_EFFECT_UNCONSCIOUS, amount, updating) + return U + +/////////////////////////////////// SLEEPING //////////////////////////////////// + +/mob/living/proc/IsSleeping() //If we're asleep + return has_status_effect(STATUS_EFFECT_SLEEPING) + +/mob/living/proc/AmountSleeping() //How many deciseconds remain in our sleep + var/datum/status_effect/incapacitating/sleeping/S = IsSleeping() + if(S) + return S.duration - world.time + return 0 + +/mob/living/proc/Sleeping(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_SLEEP, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) + return + if((!has_trait(TRAIT_SLEEPIMMUNE)) || ignore_canstun) + var/datum/status_effect/incapacitating/sleeping/S = IsSleeping() + if(S) + S.duration = max(world.time + amount, S.duration) + else if(amount > 0) + S = apply_status_effect(STATUS_EFFECT_SLEEPING, amount, updating) + return S + +/mob/living/proc/SetSleeping(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_SLEEP, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) + return + if((!has_trait(TRAIT_SLEEPIMMUNE)) || ignore_canstun) + var/datum/status_effect/incapacitating/sleeping/S = IsSleeping() + if(amount <= 0) + if(S) + qdel(S) + else if(S) + S.duration = world.time + amount + else + S = apply_status_effect(STATUS_EFFECT_SLEEPING, amount, updating) + return S + +/mob/living/proc/AdjustSleeping(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_SLEEP, amount, updating, ignore_canstun) & COMPONENT_NO_STUN) + return + if((!has_trait(TRAIT_SLEEPIMMUNE)) || ignore_canstun) + var/datum/status_effect/incapacitating/sleeping/S = IsSleeping() + if(S) + S.duration += amount + else if(amount > 0) + S = apply_status_effect(STATUS_EFFECT_SLEEPING, amount, updating) + return S + ///////////////////////////////// FROZEN ///////////////////////////////////// /mob/living/proc/IsFrozen() @@ -207,7 +443,7 @@ add_trait(TRAIT_DEATHCOMA, source) tod = station_time_timestamp() update_stat() - + /mob/living/proc/unignore_slowdown(list/sources) remove_trait(TRAIT_IGNORESLOWDOWN, sources) update_movespeed(FALSE) diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm index 383c8d8d615..2a9744494d7 100644 --- a/code/modules/mob/living/ventcrawling.dm +++ b/code/modules/mob/living/ventcrawling.dm @@ -11,7 +11,7 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, typecacheof(list( if(stat) to_chat(src, "You must be conscious to do this!") return - if(lying) + if(IsStun() || IsParalyzed()) to_chat(src, "You can't vent crawl while you're stunned!") return if(restrained()) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 627ed21da8b..e81db450547 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -184,7 +184,7 @@ /mob/proc/restrained(ignore_grab) return -/mob/proc/incapacitated(ignore_restraints, ignore_grab) +/mob/proc/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, check_immobilized = FALSE) return //This proc is called whenever someone clicks an inventory ui slot. @@ -602,8 +602,6 @@ // facing verbs /mob/proc/canface() - if(!canmove) - return FALSE if(world.time < client.last_turn) return FALSE if(stat == DEAD || stat == UNCONSCIOUS) @@ -616,8 +614,10 @@ return FALSE return TRUE -/mob/proc/fall(forced) - drop_all_held_items() +/mob/living/canface() + if(!(mobility_flags & MOBILITY_MOVE)) + return FALSE + return ..() /mob/verb/eastface() set hidden = TRUE @@ -886,7 +886,6 @@ /mob/proc/get_idcard(hand_first) return - /mob/vv_get_dropdown() . = ..() . += "---" @@ -914,3 +913,5 @@ var/datum/language_holder/H = get_language_holder() H.open_language_menu(usr) + + diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 1d3efc6e894..aba8ae6aa13 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -8,11 +8,17 @@ pressure_resistance = 8 mouse_drag_pointer = MOUSE_ACTIVE_POINTER throwforce = 10 + var/lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE var/datum/mind/mind + var/static/next_mob_id = 0 + + //MOVEMENT SPEED + var/list/movespeed_modification //Lazy list, see mob_movespeed.dm + var/cached_multiplicative_slowdown + //ACTIONS var/list/datum/action/actions = list() var/list/datum/action/chameleon_item_actions - var/static/next_mob_id = 0 var/stat = CONSCIOUS //Whether a mob is alive or dead. TODO: Move this to living - Nodrak @@ -34,15 +40,6 @@ var/eye_blurry = 0 //Carbon var/real_name = null var/spacewalk = FALSE - var/resting = 0 //Carbon - var/lying = 0 - var/lying_prev = 0 - var/canmove = 1 - - //MOVEMENT SPEED - var/list/movespeed_modification //Lazy list, see mob_movespeed.dm - var/cached_multiplicative_slowdown - ///////////////// var/name_archive //For admin things like possession @@ -66,11 +63,10 @@ var/list/held_items = list() //len = number of hands, eg: 2 nulls is 2 empty hands, 1 item and 1 null is 1 full hand and 1 empty hand. //held_items[active_hand_index] is the actively held item, but please use get_active_held_item() instead, because OOP - var/datum/component/storage/active_storage = null//Carbon - + //HUD things + var/datum/component/storage/active_storage var/datum/hud/hud_used = null - - var/research_scanner = 0 //For research scanner equipped mobs. Enable to show research data when examining. + var/research_scanner = FALSE var/in_throw_mode = 0 @@ -84,7 +80,6 @@ var/list/mob_spell_list = list() //construct spells and mime spells. Spells that do not transfer from one mob to another and can not be lost in mindswap. - var/status_flags = CANSTUN|CANKNOCKDOWN|CANUNCONSCIOUS|CANPUSH //bitflags defining which status effects can be inflicted (replaces canknockdown, canstun, etc) var/digitalcamo = 0 // Can they be tracked by the AI? diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 4a475164e89..d5ae54c2eab 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -1,14 +1,17 @@ /mob/CanPass(atom/movable/mover, turf/target) + return TRUE //There's almost no cases where non /living mobs should be used in game as actual mobs, other than ghosts. + +/mob/living/CanPass(atom/movable/mover, turf/target) if((mover.pass_flags & PASSMOB)) return TRUE if(istype(mover, /obj/item/projectile) || mover.throwing) - return (!density || lying) + return (!density || !(mobility_flags & MOBILITY_STAND)) if(buckled == mover) return TRUE if(ismob(mover)) if (mover in buckled_mobs) return TRUE - return (!mover.density || !density || lying) + return (!mover.density || !density || !(mobility_flags & MOBILITY_STAND)) //DO NOT USE THIS UNLESS YOU ABSOLUTELY HAVE TO. THIS IS BEING PHASED OUT FOR THE MOVESPEED MODIFICATION SYSTEM. //See mob_movespeed.dm @@ -75,7 +78,7 @@ if(mob.buckled) //if we're buckled to something, tell it we moved. return mob.buckled.relaymove(mob, direct) - if(!mob.canmove) + if(!(L.mobility_flags & MOBILITY_MOVE)) return FALSE if(isobj(mob.loc) || ismob(mob.loc)) //Inside an object, tell it we moved diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm index aae14e6885a..95daf470039 100644 --- a/code/modules/mob/status_procs.dm +++ b/code/modules/mob/status_procs.dm @@ -3,126 +3,7 @@ //The effects include: stun, knockdown, unconscious, sleeping, resting, jitteriness, dizziness, ear damage, // eye damage, eye_blind, eye_blurry, druggy, TRAIT_BLIND trait, and TRAIT_NEARSIGHT trait. -/////////////////////////////////// STUN //////////////////////////////////// -/mob/proc/IsStun() //non-living mobs shouldn't be stunned - return FALSE - -/////////////////////////////////// KNOCKDOWN //////////////////////////////////// - -/mob/proc/IsKnockdown() //non-living mobs shouldn't be knocked down - return FALSE - -/////////////////////////////////// UNCONSCIOUS //////////////////////////////////// - -/mob/proc/IsUnconscious() //non-living mobs shouldn't be unconscious - return FALSE - -/mob/living/IsUnconscious() //If we're unconscious - return has_status_effect(STATUS_EFFECT_UNCONSCIOUS) - -/mob/living/proc/AmountUnconscious() //How many deciseconds remain in our unconsciousness - var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious() - if(U) - return U.duration - world.time - return 0 - -/mob/living/proc/Unconscious(amount, updating = TRUE, ignore_canunconscious = FALSE) //Can't go below remaining duration - if(((status_flags & CANUNCONSCIOUS) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canunconscious) - var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious() - if(U) - U.duration = max(world.time + amount, U.duration) - else if(amount > 0) - U = apply_status_effect(STATUS_EFFECT_UNCONSCIOUS, amount, updating) - return U - -/mob/living/proc/SetUnconscious(amount, updating = TRUE, ignore_canunconscious = FALSE) //Sets remaining duration - if(((status_flags & CANUNCONSCIOUS) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canunconscious) - var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious() - if(amount <= 0) - if(U) - qdel(U) - else if(U) - U.duration = world.time + amount - else - U = apply_status_effect(STATUS_EFFECT_UNCONSCIOUS, amount, updating) - return U - -/mob/living/proc/AdjustUnconscious(amount, updating = TRUE, ignore_canunconscious = FALSE) //Adds to remaining duration - if(((status_flags & CANUNCONSCIOUS) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canunconscious) - var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious() - if(U) - U.duration += amount - else if(amount > 0) - U = apply_status_effect(STATUS_EFFECT_UNCONSCIOUS, amount, updating) - return U - -/////////////////////////////////// SLEEPING //////////////////////////////////// - -/mob/proc/IsSleeping() //non-living mobs shouldn't be sleeping either - return FALSE - -/mob/living/IsSleeping() //If we're asleep - return has_status_effect(STATUS_EFFECT_SLEEPING) - -/mob/living/proc/AmountSleeping() //How many deciseconds remain in our sleep - var/datum/status_effect/incapacitating/sleeping/S = IsSleeping() - if(S) - return S.duration - world.time - return 0 - -/mob/living/proc/Sleeping(amount, updating = TRUE, ignore_sleepimmune = FALSE) //Can't go below remaining duration - if((!has_trait(TRAIT_SLEEPIMMUNE)) || ignore_sleepimmune) - var/datum/status_effect/incapacitating/sleeping/S = IsSleeping() - if(S) - S.duration = max(world.time + amount, S.duration) - else if(amount > 0) - S = apply_status_effect(STATUS_EFFECT_SLEEPING, amount, updating) - return S - -/mob/living/proc/SetSleeping(amount, updating = TRUE, ignore_sleepimmune = FALSE) //Sets remaining duration - if((!has_trait(TRAIT_SLEEPIMMUNE)) || ignore_sleepimmune) - var/datum/status_effect/incapacitating/sleeping/S = IsSleeping() - if(amount <= 0) - if(S) - qdel(S) - else if(S) - S.duration = world.time + amount - else - S = apply_status_effect(STATUS_EFFECT_SLEEPING, amount, updating) - return S - -/mob/living/proc/AdjustSleeping(amount, updating = TRUE, ignore_sleepimmune = FALSE) //Adds to remaining duration - if((!has_trait(TRAIT_SLEEPIMMUNE)) || ignore_sleepimmune) - var/datum/status_effect/incapacitating/sleeping/S = IsSleeping() - if(S) - S.duration += amount - else if(amount > 0) - S = apply_status_effect(STATUS_EFFECT_SLEEPING, amount, updating) - return S - -/////////////////////////////////// RESTING //////////////////////////////////// - -/mob/proc/Resting(amount) - resting = max(max(resting,amount),0) - -/mob/living/Resting(amount) - ..() - update_canmove() - -/mob/proc/SetResting(amount) - resting = max(amount,0) - -/mob/living/SetResting(amount) - ..() - update_canmove() - -/mob/proc/AdjustResting(amount) - resting = max(resting + amount,0) - -/mob/living/AdjustResting(amount) - ..() - update_canmove() /////////////////////////////////// JITTERINESS //////////////////////////////////// diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index d35a99adad5..68c7ea02ae3 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -29,9 +29,8 @@ dropItemToGround(W) //Make mob invisible and spawn animation - notransform = 1 - canmove = 0 - Stun(22, ignore_canstun = TRUE) + notransform = TRUE + Paralyze(22, ignore_canstun = TRUE) icon = null cut_overlays() invisibility = INVISIBILITY_MAXIMUM @@ -183,9 +182,9 @@ //Make mob invisible and spawn animation - notransform = 1 - canmove = 0 - Stun(22, ignore_canstun = TRUE) + notransform = TRUE + Paralyze(22, ignore_canstun = TRUE) + icon = null cut_overlays() invisibility = INVISIBILITY_MAXIMUM @@ -313,11 +312,11 @@ /mob/living/carbon/AIize() if (notransform) return + notransform = TRUE + Paralyze(1, ignore_canstun = TRUE) for(var/obj/item/W in src) dropItemToGround(W) regenerate_icons() - notransform = 1 - canmove = 0 icon = null invisibility = INVISIBILITY_MAXIMUM return ..() @@ -354,14 +353,15 @@ /mob/living/carbon/human/proc/Robotize(delete_items = 0, transfer_after = TRUE) if (notransform) return + notransform = TRUE + Paralyze(1, ignore_canstun = TRUE) + for(var/obj/item/W in src) if(delete_items) qdel(W) else dropItemToGround(W) regenerate_icons() - notransform = 1 - canmove = 0 icon = null invisibility = INVISIBILITY_MAXIMUM for(var/t in bodyparts) @@ -399,11 +399,11 @@ /mob/living/carbon/human/proc/Alienize() if (notransform) return + notransform = TRUE + mobility_flags = NONE for(var/obj/item/W in src) dropItemToGround(W) regenerate_icons() - notransform = 1 - canmove = 0 icon = null invisibility = INVISIBILITY_MAXIMUM for(var/t in bodyparts) @@ -429,11 +429,11 @@ /mob/living/carbon/human/proc/slimeize(reproduce as num) if (notransform) return + notransform = TRUE + mobility_flags = NONE for(var/obj/item/W in src) dropItemToGround(W) regenerate_icons() - notransform = 1 - canmove = 0 icon = null invisibility = INVISIBILITY_MAXIMUM for(var/t in bodyparts) @@ -468,11 +468,11 @@ /mob/living/carbon/human/proc/corgize() if (notransform) return + notransform = TRUE + Paralyze(1, ignore_canstun = TRUE) for(var/obj/item/W in src) dropItemToGround(W) regenerate_icons() - notransform = 1 - canmove = 0 icon = null invisibility = INVISIBILITY_MAXIMUM for(var/t in bodyparts) //this really should not be necessary @@ -489,6 +489,8 @@ /mob/living/carbon/proc/gorillize() if(notransform) return + notransform = TRUE + Paralyze(1, ignore_canstun = TRUE) SSblackbox.record_feedback("amount", "gorillas_created", 1) @@ -498,8 +500,6 @@ dropItemToGround(W, TRUE) regenerate_icons() - notransform = TRUE - canmove = FALSE icon = null invisibility = INVISIBILITY_MAXIMUM var/mob/living/simple_animal/hostile/gorilla/new_gorilla = new (get_turf(src)) @@ -523,12 +523,13 @@ if(notransform) return + notransform = TRUE + Paralyze(1, ignore_canstun = TRUE) + for(var/obj/item/W in src) dropItemToGround(W) regenerate_icons() - notransform = 1 - canmove = 0 icon = null invisibility = INVISIBILITY_MAXIMUM diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm index adc75ec7c0a..d5c2499a3ce 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm @@ -7,10 +7,12 @@ H.SetUnconscious(0) H.SetStun(0) H.SetKnockdown(0) + H.SetImmobilized(0) + H.SetParalyzed(0) H.adjustStaminaLoss(-75) H.stuttering = 0 H.lying = 0 - H.update_canmove() + H.update_mobility() H.reagents.add_reagent("stimulants", 5) H.say(pick("A CORNERED FOX IS MORE DANGEROUS THAN A JACKAL!","HURT ME MOOORRREEE!","IMPRESSIVE!"), forced = "ninjaboost") a_boost-- diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index e0aeaa106d9..f6a2a4ba9db 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -60,8 +60,10 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/paper_bin/attack_hand(mob/user) - if(user.lying) - return + if(isliving(user)) + var/mob/living/L = user + if(!(L.mobility_flags & MOBILITY_PICKUP)) + return user.changeNext_move(CLICK_CD_MELEE) if(bin_pen) var/obj/item/pen/P = bin_pen diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index 73eadfbc45c..9d316dcf5c8 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -95,7 +95,7 @@ visible_message("\The [src] hits [H] in the eye!") H.adjust_blurriness(6) H.adjust_eye_damage(rand(6,8)) - H.Knockdown(40) + H.Paralyze(40) H.emote("scream") /obj/item/paper/examine(mob/user) diff --git a/code/modules/photography/photos/photo.dm b/code/modules/photography/photos/photo.dm index 99e61cf3f0f..48cc4f0b6b1 100644 --- a/code/modules/photography/photos/photo.dm +++ b/code/modules/photography/photos/photo.dm @@ -88,6 +88,6 @@ var/n_name = copytext(sanitize(input(usr, "What would you like to label the photo?", "Photo Labelling", null) as text), 1, MAX_NAME_LEN) //loc.loc check is for making possible renaming photos in clipboards - if((loc == usr || loc.loc && loc.loc == usr) && usr.stat == CONSCIOUS && usr.canmove && !usr.restrained()) + if((loc == usr || loc.loc && loc.loc == usr) && usr.stat == CONSCIOUS && !usr.incapacitated()) name = "photo[(n_name ? text("- '[n_name]'") : null)]" add_fingerprint(usr) diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 491be4a83dc..c98b5fa7de8 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -108,7 +108,7 @@ var/shock_damage = min(rand(30,40),rand(30,40)) if(iscarbon(user)) - user.Knockdown(300) + user.Paralyze(300) user.electrocute_act(shock_damage, src, 1) else if(issilicon(user)) diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 425fa3f5096..7ac4f6d738e 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -358,4 +358,4 @@ user.visible_message("[user] somehow manages to shoot [user.p_them()]self in the face!", "You somehow shoot yourself in the face! How the hell?!") user.emote("scream") user.drop_all_held_items() - user.Knockdown(80) + user.Paralyze(80) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index a23bf1f4edc..0e13991b987 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -87,6 +87,8 @@ //Effects var/stun = 0 var/knockdown = 0 + var/paralyze = 0 + var/immobilize = 0 var/unconscious = 0 var/irradiate = 0 var/stutter = 0 @@ -196,7 +198,7 @@ else L.log_message("has been shot by [firer] with [src]", LOG_ATTACK, color="orange") - return L.apply_effects(stun, knockdown, unconscious, irradiate, slur, stutter, eyeblur, drowsy, blocked, stamina, jitter) + return L.apply_effects(stun, knockdown, unconscious, irradiate, slur, stutter, eyeblur, drowsy, blocked, stamina, jitter, paralyze, immobilize) /obj/item/projectile/proc/vol_by_damage() if(src.damage) @@ -271,11 +273,10 @@ var/turf/T = get_turf(A) if(original in T) return original - var/list/mob/possible_mobs = typecache_filter_list(T, GLOB.typecache_mob) - A + var/list/mob/living/possible_mobs = typecache_filter_list(T, GLOB.typecache_mob) - A var/list/mob/mobs = list() - for(var/i in possible_mobs) - var/mob/M = i - if(M.lying) + for(var/mob/living/M in possible_mobs) + if(!(M.mobility_flags & MOBILITY_STAND)) continue mobs += M var/mob/M = safepick(mobs) diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index 457ec78e9bc..52f5260e5a3 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -18,7 +18,7 @@ /obj/item/projectile/bullet/shotgun_stunslug name = "stunslug" damage = 5 - knockdown = 100 + paralyze = 100 stutter = 5 jitter = 20 range = 7 @@ -30,7 +30,7 @@ icon = 'icons/obj/meteor.dmi' icon_state = "dust" damage = 20 - knockdown = 80 + paralyze = 80 hitsound = 'sound/effects/meteorimpact.ogg' /obj/item/projectile/bullet/shotgun_meteorslug/on_hit(atom/target, blocked = FALSE) @@ -47,7 +47,7 @@ /obj/item/projectile/bullet/shotgun_frag12 name ="frag12 slug" damage = 25 - knockdown = 50 + paralyze = 50 /obj/item/projectile/bullet/shotgun_frag12/on_hit(atom/target, blocked = FALSE) ..() diff --git a/code/modules/projectiles/projectile/bullets/sniper.dm b/code/modules/projectiles/projectile/bullets/sniper.dm index 78be94339c1..f2206a79701 100644 --- a/code/modules/projectiles/projectile/bullets/sniper.dm +++ b/code/modules/projectiles/projectile/bullets/sniper.dm @@ -4,7 +4,7 @@ name =".50 bullet" speed = 0.4 damage = 70 - knockdown = 100 + paralyze = 100 dismemberment = 50 armour_penetration = 50 var/breakthings = TRUE @@ -20,7 +20,7 @@ armour_penetration = 0 damage = 0 dismemberment = 0 - knockdown = 0 + paralyze = 0 breakthings = FALSE /obj/item/projectile/bullet/p50/soporific/on_hit(atom/target, blocked = FALSE) @@ -36,5 +36,5 @@ damage = 60 forcedodge = TRUE dismemberment = 0 //It goes through you cleanly. - knockdown = 0 + paralyze = 0 breakthings = FALSE diff --git a/code/modules/projectiles/projectile/bullets/special.dm b/code/modules/projectiles/projectile/bullets/special.dm index f6782fac010..3a92c98d794 100644 --- a/code/modules/projectiles/projectile/bullets/special.dm +++ b/code/modules/projectiles/projectile/bullets/special.dm @@ -3,7 +3,7 @@ /obj/item/projectile/bullet/honker name = "banana" damage = 0 - knockdown = 60 + paralyze = 60 forcedodge = TRUE nodamage = TRUE hitsound = 'sound/items/bikehorn.ogg' diff --git a/code/modules/projectiles/projectile/energy/ebow.dm b/code/modules/projectiles/projectile/energy/ebow.dm index 3e65bbfad23..640d4d11976 100644 --- a/code/modules/projectiles/projectile/energy/ebow.dm +++ b/code/modules/projectiles/projectile/energy/ebow.dm @@ -4,7 +4,7 @@ damage = 8 damage_type = TOX nodamage = 0 - knockdown = 100 + paralyze = 100 stutter = 5 /obj/item/projectile/energy/bolt/halloween diff --git a/code/modules/projectiles/projectile/energy/misc.dm b/code/modules/projectiles/projectile/energy/misc.dm index 86f4cc060c3..e903e5ca47d 100644 --- a/code/modules/projectiles/projectile/energy/misc.dm +++ b/code/modules/projectiles/projectile/energy/misc.dm @@ -11,5 +11,5 @@ icon_state = "toxin" damage = 5 damage_type = TOX - knockdown = 100 + paralyze = 100 range = 7 diff --git a/code/modules/projectiles/projectile/energy/net_snare.dm b/code/modules/projectiles/projectile/energy/net_snare.dm index f5d06073416..691b978ea9e 100644 --- a/code/modules/projectiles/projectile/energy/net_snare.dm +++ b/code/modules/projectiles/projectile/energy/net_snare.dm @@ -59,7 +59,7 @@ name = "energy snare" icon_state = "e_snare" nodamage = 1 - knockdown = 20 + paralyze = 20 hitsound = 'sound/weapons/taserhit.ogg' range = 4 @@ -79,7 +79,7 @@ name = "Energy Bola" icon_state = "e_snare" nodamage = 1 - knockdown = 0 + paralyze = 0 hitsound = 'sound/weapons/taserhit.ogg' range = 10 diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index db1ad403a76..bc75899aa71 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -3,7 +3,7 @@ icon_state = "spark" color = "#FFFF00" nodamage = 1 - knockdown = 100 + paralyze = 100 stutter = 5 jitter = 20 hitsound = 'sound/weapons/taserhit.ogg' diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 4060060ac4f..2e240801eb2 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -124,8 +124,8 @@ if(!istype(M) || M.stat == DEAD || M.notransform || (GODMODE & M.status_flags)) return - M.notransform = 1 - M.canmove = 0 + M.notransform = TRUE + M.mobility_flags = NONE M.icon = null M.cut_overlays() M.invisibility = INVISIBILITY_ABSTRACT diff --git a/code/modules/projectiles/projectile/special/curse.dm b/code/modules/projectiles/projectile/special/curse.dm index adce5dad575..362c34eb7f3 100644 --- a/code/modules/projectiles/projectile/special/curse.dm +++ b/code/modules/projectiles/projectile/special/curse.dm @@ -9,7 +9,7 @@ layer = LARGE_MOB_LAYER damage_type = BURN damage = 10 - knockdown = 20 + paralyze = 20 speed = 2 range = 16 forcedodge = TRUE diff --git a/code/modules/projectiles/projectile/special/hallucination.dm b/code/modules/projectiles/projectile/special/hallucination.dm index f65ebce51f7..0c57e9b20f5 100644 --- a/code/modules/projectiles/projectile/special/hallucination.dm +++ b/code/modules/projectiles/projectile/special/hallucination.dm @@ -166,7 +166,7 @@ hal_impact_effect_wall = null /obj/item/projectile/hallucination/taser/hal_apply_effect() - hal_target.Knockdown(100) + hal_target.Paralyze(100) hal_target.stuttering += 20 if(hal_target.dna && hal_target.dna.check_mutation(HULK)) hal_target.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") @@ -199,7 +199,7 @@ hal_impact_effect_wall = null /obj/item/projectile/hallucination/ebow/hal_apply_effect() - hal_target.Knockdown(100) + hal_target.Paralyze(100) hal_target.stuttering += 5 hal_target.adjustStaminaLoss(8) diff --git a/code/modules/projectiles/projectile/special/neurotoxin.dm b/code/modules/projectiles/projectile/special/neurotoxin.dm index 46027e7bdf3..fc7928c88d7 100644 --- a/code/modules/projectiles/projectile/special/neurotoxin.dm +++ b/code/modules/projectiles/projectile/special/neurotoxin.dm @@ -3,10 +3,10 @@ icon_state = "neurotoxin" damage = 5 damage_type = TOX - knockdown = 100 + paralyze = 100 /obj/item/projectile/bullet/neurotoxin/on_hit(atom/target, blocked = FALSE) if(isalien(target)) - knockdown = 0 + paralyze = 0 nodamage = TRUE return ..() diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 8d3d704f79a..3995f599899 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -308,7 +308,7 @@ addiction_tick++ if(C && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates. C.updatehealth() - C.update_canmove() + C.update_mobility() C.update_stamina() update_total() @@ -550,7 +550,7 @@ if(!D) WARNING("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") return FALSE - + update_total() var/cached_total = total_volume if(cached_total + amount > maximum_volume) @@ -594,9 +594,9 @@ if(data) R.data = data R.on_new(data) - + if(isliving(my_atom)) - R.on_mob_add(my_atom) //Must occur befor it could posibly run on_mob_delete + R.on_mob_add(my_atom) //Must occur befor it could posibly run on_mob_delete update_total() if(my_atom) my_atom.on_reagent_change(ADD_REAGENT) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index f9dbd1928bd..75e73ab5717 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -1332,7 +1332,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "A drink that is guaranteed to knock you silly." /datum/reagent/consumable/ethanol/neurotoxin/on_mob_life(mob/living/carbon/M) - M.Knockdown(60, 1, 0) + M.Paralyze(60, 1, 0) M.dizziness +=2 switch(current_cycle) if(15 to 45) diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 989c5a9b828..54490ae0520 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -19,7 +19,7 @@ /datum/reagent/drug/space_drugs/on_mob_life(mob/living/carbon/M) M.set_drugginess(15) if(isturf(M.loc) && !isspaceturf(M.loc)) - if(M.canmove) + if(M.mobility_flags & MOBILITY_MOVE) if(prob(10)) step(M, pick(GLOB.cardinals)) if(prob(7)) @@ -50,9 +50,11 @@ var/smoke_message = pick("You feel relaxed.", "You feel calmed.","You feel alert.","You feel rugged.") to_chat(M, "[smoke_message]") SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "smoked", /datum/mood_event/smoked, name) - M.AdjustStun(-20, 0) - M.AdjustKnockdown(-20, 0) - M.AdjustUnconscious(-20, 0) + M.AdjustStun(-20, FALSE) + M.AdjustKnockdown(-20, FALSE) + M.AdjustUnconscious(-20, FALSE) + M.AdjustParalyzed(-20, FALSE) + M.AdjustImmobilized(-20, FALSE) M.adjustStaminaLoss(-0.5*REM, 0) ..() . = 1 @@ -70,9 +72,11 @@ if(prob(5)) var/high_message = pick("You feel jittery.", "You feel like you gotta go fast.", "You feel like you need to step it up.") to_chat(M, "[high_message]") - M.AdjustStun(-20, 0) - M.AdjustKnockdown(-20, 0) - M.AdjustUnconscious(-20, 0) + M.AdjustStun(-20, FALSE) + M.AdjustKnockdown(-20, FALSE) + M.AdjustUnconscious(-20, FALSE) + M.AdjustImmobilized(-20, FALSE) + M.AdjustParalyzed(-20, FALSE) ..() . = 1 @@ -177,9 +181,11 @@ var/high_message = pick("You feel hyper.", "You feel like you need to go faster.", "You feel like you can run the world.") if(prob(5)) to_chat(M, "[high_message]") - M.AdjustStun(-40, 0) - M.AdjustKnockdown(-40, 0) - M.AdjustUnconscious(-40, 0) + M.AdjustStun(-40, FALSE) + M.AdjustKnockdown(-40, FALSE) + M.AdjustUnconscious(-40, FALSE) + M.AdjustParalyzed(-40, FALSE) + M.AdjustImmobilized(-40, FALSE) M.adjustStaminaLoss(-2, 0) M.Jitter(2) M.adjustBrainLoss(rand(1,4)) @@ -189,7 +195,7 @@ . = 1 /datum/reagent/drug/methamphetamine/overdose_process(mob/living/M) - if(M.canmove && !ismovableatom(M.loc)) + if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc)) for(var/i in 1 to 4) step(M, pick(GLOB.cardinals)) if(prob(20)) @@ -216,7 +222,7 @@ ..() /datum/reagent/drug/methamphetamine/addiction_act_stage3(mob/living/M) - if(M.canmove && !ismovableatom(M.loc)) + if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc)) for(var/i = 0, i < 4, i++) step(M, pick(GLOB.cardinals)) M.Jitter(15) @@ -226,7 +232,7 @@ ..() /datum/reagent/drug/methamphetamine/addiction_act_stage4(mob/living/carbon/human/M) - if(M.canmove && !ismovableatom(M.loc)) + if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc)) for(var/i = 0, i < 8, i++) step(M, pick(GLOB.cardinals)) M.Jitter(20) @@ -271,7 +277,7 @@ M.adjustStaminaLoss(-5, 0) M.adjustBrainLoss(4) M.hallucination += 5 - if(M.canmove && !ismovableatom(M.loc)) + if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc)) step(M, pick(GLOB.cardinals)) step(M, pick(GLOB.cardinals)) ..() @@ -279,7 +285,7 @@ /datum/reagent/drug/bath_salts/overdose_process(mob/living/M) M.hallucination += 5 - if(M.canmove && !ismovableatom(M.loc)) + if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc)) for(var/i in 1 to 8) step(M, pick(GLOB.cardinals)) if(prob(20)) @@ -290,7 +296,7 @@ /datum/reagent/drug/bath_salts/addiction_act_stage1(mob/living/M) M.hallucination += 10 - if(M.canmove && !ismovableatom(M.loc)) + if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc)) for(var/i = 0, i < 8, i++) step(M, pick(GLOB.cardinals)) M.Jitter(5) @@ -301,7 +307,7 @@ /datum/reagent/drug/bath_salts/addiction_act_stage2(mob/living/M) M.hallucination += 20 - if(M.canmove && !ismovableatom(M.loc)) + if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc)) for(var/i = 0, i < 8, i++) step(M, pick(GLOB.cardinals)) M.Jitter(10) @@ -313,7 +319,7 @@ /datum/reagent/drug/bath_salts/addiction_act_stage3(mob/living/M) M.hallucination += 30 - if(M.canmove && !ismovableatom(M.loc)) + if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc)) for(var/i = 0, i < 12, i++) step(M, pick(GLOB.cardinals)) M.Jitter(15) @@ -325,7 +331,7 @@ /datum/reagent/drug/bath_salts/addiction_act_stage4(mob/living/carbon/human/M) M.hallucination += 30 - if(M.canmove && !ismovableatom(M.loc)) + if((M.mobility_flags & MOBILITY_MOVE) && !ismovableatom(M.loc)) for(var/i = 0, i < 16, i++) step(M, pick(GLOB.cardinals)) M.Jitter(50) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 47529190b69..d60ba67e9e6 100755 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -319,7 +319,7 @@ victim.blind_eyes(2) victim.confused = max(M.confused, 3) victim.damageoverlaytemp = 60 - victim.Knockdown(60) + victim.Paralyze(60) return else if ( eyes_covered ) // Eye cover is better than mouth cover victim.blur_eyes(3) @@ -332,7 +332,7 @@ victim.blind_eyes(3) victim.confused = max(M.confused, 6) victim.damageoverlaytemp = 75 - victim.Knockdown(100) + victim.Paralyze(100) victim.update_damage_hud() /datum/reagent/consumable/condensedcapsaicin/on_mob_life(mob/living/carbon/M) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 6ffe15143f4..385e4395aa2 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -47,9 +47,11 @@ M.remove_all_traits() M.set_blurriness(0) M.set_blindness(0) - M.SetKnockdown(0, 0) - M.SetStun(0, 0) - M.SetUnconscious(0, 0) + M.SetKnockdown(0, FALSE) + M.SetStun(0, FALSE) + M.SetUnconscious(0, FALSE) + M.SetParalyzed(0, FALSE) + M.SetImmobilized(0, FALSE) M.silent = FALSE M.dizziness = 0 M.disgust = 0 @@ -82,9 +84,11 @@ /datum/reagent/medicine/synaptizine/on_mob_life(mob/living/carbon/M) M.drowsyness = max(M.drowsyness-5, 0) - M.AdjustStun(-20, 0) - M.AdjustKnockdown(-20, 0) - M.AdjustUnconscious(-20, 0) + M.AdjustStun(-20, FALSE) + M.AdjustKnockdown(-20, FALSE) + M.AdjustUnconscious(-20, FALSE) + M.AdjustImmobilized(-20, FALSE) + M.AdjustParalyzed(-20, FALSE) if(holder.has_reagent("mindbreaker")) holder.remove_reagent("mindbreaker", 5) M.hallucination = max(0, M.hallucination - 10) @@ -554,10 +558,8 @@ ..() /datum/reagent/medicine/ephedrine/on_mob_life(mob/living/carbon/M) - M.AdjustStun(-20, 0) - M.AdjustKnockdown(-20, 0) - M.AdjustUnconscious(-20, 0) - M.adjustStaminaLoss(-1*REM, 0) + M.AdjustAllImmobility(-20, FALSE) + M.adjustStaminaLoss(-1*REM, FALSE) ..() return TRUE @@ -763,9 +765,7 @@ M.adjustStaminaLoss(-0.5*REM, 0) . = 1 if(prob(20)) - M.AdjustStun(-20, 0) - M.AdjustKnockdown(-20, 0) - M.AdjustUnconscious(-20, 0) + M.AdjustAllImmobility(-20, FALSE) ..() /datum/reagent/medicine/epinephrine/overdose_process(mob/living/M) @@ -880,9 +880,7 @@ M.adjustToxLoss(-1*REM, 0) M.adjustBruteLoss(-1*REM, 0) M.adjustFireLoss(-1*REM, 0) - M.AdjustStun(-60, 0) - M.AdjustKnockdown(-60, 0) - M.AdjustUnconscious(-60, 0) + M.AdjustAllImmobility(-60, FALSE) M.adjustStaminaLoss(-5*REM, 0) ..() . = 1 @@ -1133,9 +1131,7 @@ overdose_threshold = 30 /datum/reagent/medicine/changelingadrenaline/on_mob_life(mob/living/carbon/M as mob) - M.AdjustUnconscious(-20, 0) - M.AdjustStun(-20, 0) - M.AdjustKnockdown(-20, 0) + M.AdjustAllImmobility(-20, FALSE) M.adjustStaminaLoss(-1, 0) ..() return TRUE @@ -1217,9 +1213,7 @@ /datum/reagent/medicine/modafinil/on_mob_life(mob/living/carbon/M) if(!overdosed) // We do not want any effects on OD overdose_threshold = overdose_threshold + rand(-10,10)/10 // for extra fun - M.AdjustStun(-5, 0) - M.AdjustKnockdown(-5, 0) - M.AdjustUnconscious(-5, 0) + M.AdjustAllImmobility(-5, FALSE) M.adjustStaminaLoss(-0.5*REM, 0) M.Jitter(1) metabolization_rate = 0.01 * REAGENTS_METABOLISM * rand(5,20) // randomizes metabolism between 0.02 and 0.08 per tick @@ -1250,7 +1244,7 @@ if(prob(20)) to_chat(M, "You have a sudden fit!") M.emote("moan") - M.Knockdown(20, 1, 0) // you should be in a bad spot at this point unless epipen has been used + M.Paralyze(20, 1, 0) // you should be in a bad spot at this point unless epipen has been used if(81) to_chat(M, "You feel too exhausted to continue!") // at this point you will eventually die unless you get charcoal M.adjustOxyLoss(0.1*REM, 0) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index e4690c7294c..b9151c3b672 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -270,9 +270,7 @@ /datum/reagent/fuel/unholywater/on_mob_life(mob/living/carbon/M) if(iscultist(M)) M.drowsyness = max(M.drowsyness-5, 0) - M.AdjustUnconscious(-20, 0) - M.AdjustStun(-40, 0) - M.AdjustKnockdown(-40, 0) + M.AdjustAllImmobility(-40, FALSE) M.adjustStaminaLoss(-10, 0) M.adjustToxLoss(-2, 0) M.adjustOxyLoss(-2, 0) @@ -434,7 +432,7 @@ return to_chat(H, "You crumple in agony as your flesh wildly morphs into new forms!") H.visible_message("[H] falls to the ground and screams as [H.p_their()] skin bubbles and froths!") //'froths' sounds painful when used with SKIN. - H.Knockdown(60) + H.Paralyze(60) addtimer(CALLBACK(src, .proc/mutate, H), 30) return @@ -740,7 +738,7 @@ taste_mult = 0 // apparently tasteless. /datum/reagent/mercury/on_mob_life(mob/living/carbon/M) - if(M.canmove && !isspaceturf(M.loc)) + if((M.mobility_flags & MOBILITY_MOVE) && !isspaceturf(M.loc)) step(M, pick(GLOB.cardinals)) if(prob(5)) M.emote(pick("twitch","drool","moan")) @@ -820,7 +818,7 @@ taste_description = "metal" /datum/reagent/lithium/on_mob_life(mob/living/carbon/M) - if(M.canmove && !isspaceturf(M.loc)) + if((M.mobility_flags & MOBILITY_MOVE) && !isspaceturf(M.loc)) step(M, pick(GLOB.cardinals)) if(prob(5)) M.emote(pick("twitch","drool","moan")) diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index 90cb732a1f5..a6cb066b780 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -238,9 +238,7 @@ /datum/reagent/teslium/energized_jelly/on_mob_life(mob/living/carbon/M) if(isjellyperson(M)) shock_timer = 0 //immune to shocks - M.AdjustStun(-40, 0) - M.AdjustKnockdown(-40, 0) - M.AdjustUnconscious(-40, 0) + M.AdjustAllImmobility(-40, FALSE) M.adjustStaminaLoss(-2, 0) if(isluminescent(M)) var/mob/living/carbon/human/H = M diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index fb54a1a4ab2..07cb7426f36 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -562,7 +562,7 @@ var/picked_option = rand(1,3) switch(picked_option) if(1) - C.Knockdown(60, 0) + C.Paralyze(60, 0) . = TRUE if(2) C.losebreath += 10 @@ -714,7 +714,7 @@ /datum/reagent/toxin/curare/on_mob_life(mob/living/carbon/M) if(current_cycle >= 11) - M.Knockdown(60, 0) + M.Paralyze(60, 0) M.adjustOxyLoss(1*REM, 0) . = 1 ..() @@ -886,7 +886,7 @@ holder.remove_reagent(id, actual_metaboliztion_rate * M.metabolism_efficiency) M.adjustToxLoss(actual_toxpwr*REM, 0) if(prob(10)) - M.Knockdown(20, 0) + M.Paralyze(20, 0) . = 1 ..() diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 9d18baa693c..2ca1f0e0eeb 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -73,7 +73,7 @@ for(var/mob/living/carbon/C in get_hearers_in_view(round(created_volume/48,1),get_turf(holder.my_atom))) if(iscultist(C)) to_chat(C, "The divine explosion sears you!") - C.Knockdown(40) + C.Paralyze(40) C.adjust_fire_stacks(5) C.IgniteMob() ..() @@ -249,7 +249,7 @@ for(var/mob/living/carbon/C in get_hearers_in_view(range, location)) if(C.flash_act()) if(get_dist(C, location) < 4) - C.Knockdown(60) + C.Paralyze(60) else C.Stun(100) holder.remove_reagent("flash_powder", created_volume*3) @@ -270,7 +270,7 @@ for(var/mob/living/carbon/C in get_hearers_in_view(range, location)) if(C.flash_act()) if(get_dist(C, location) < 4) - C.Knockdown(60) + C.Paralyze(60) else C.Stun(100) diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 47ddfd3dd48..1bb7128c3fa 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -92,9 +92,9 @@ break if(stream_mode) - if(ismob(T)) - var/mob/M = T - if(!M.lying || !range_left) + if(isliving(T)) + var/mob/living/M = T + if((M.mobility_flags & MOBILITY_STAND) || !range_left) D.reagents.reaction(M, VAPOR) puff_reagent_left -= 1 else if(!range_left) diff --git a/code/modules/research/nanites/nanite_programs/buffing.dm b/code/modules/research/nanites/nanite_programs/buffing.dm index 5f17845067e..70a3b6f5475 100644 --- a/code/modules/research/nanites/nanite_programs/buffing.dm +++ b/code/modules/research/nanites/nanite_programs/buffing.dm @@ -29,12 +29,10 @@ if(!..()) return to_chat(host_mob, "You feel a sudden surge of energy!") - host_mob.SetStun(0) - host_mob.SetKnockdown(0) - host_mob.SetUnconscious(0) + host_mob.SetAllImmobility(0) host_mob.adjustStaminaLoss(-75) - host_mob.lying = 0 - host_mob.update_canmove() + host_mob.set_resting(FALSE) + host_mob.update_mobility() host_mob.reagents.add_reagent("stimulants", 1.5) /datum/nanite_program/hardening diff --git a/code/modules/research/nanites/nanite_programs/rogue.dm b/code/modules/research/nanites/nanite_programs/rogue.dm index f64c7e87812..a77944f2f44 100644 --- a/code/modules/research/nanites/nanite_programs/rogue.dm +++ b/code/modules/research/nanites/nanite_programs/rogue.dm @@ -116,4 +116,4 @@ host_mob.drop_all_held_items() else if(prob(4)) to_chat(host_mob, "You can't feel your legs!") - host_mob.Knockdown(30) + host_mob.Paralyze(30) diff --git a/code/modules/research/nanites/nanite_programs/suppression.dm b/code/modules/research/nanites/nanite_programs/suppression.dm index 3d89baba68c..b77fe0a1a8e 100644 --- a/code/modules/research/nanites/nanite_programs/suppression.dm +++ b/code/modules/research/nanites/nanite_programs/suppression.dm @@ -55,7 +55,7 @@ if(!..()) return playsound(host_mob, "sparks", 75, 1, -1) - host_mob.Knockdown(80) + host_mob.Paralyze(80) /datum/nanite_program/pacifying name = "Pacification" diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 9af37c3a389..e1da65e9607 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -317,7 +317,7 @@ All ShuttleMove procs go here var/knockdown = movement_force["KNOCKDOWN"] if(knockdown) - Knockdown(knockdown) + Paralyze(knockdown) /mob/living/simple_animal/hostile/megafauna/onShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock) diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index 6d3e304ddad..a2717bfe71d 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -186,7 +186,7 @@ // No climbing on the bar please var/mob/living/M = AM var/throwtarget = get_edge_target_turf(src, boot_dir) - M.Knockdown(40) + M.Paralyze(40) M.throw_at(throwtarget, 5, 1,src) to_chat(M, "No climbing on the bar please.") else @@ -235,7 +235,7 @@ if(payees[AM] >= threshold) break payees[AM] += C.value - counted_money += C + counted_money += C for(var/obj/item/stack/spacecash/S in AM.GetAllContents()) if(payees[AM] >= threshold) break @@ -256,7 +256,7 @@ var/obj/item/stack/spacecash/S = AM.pulling payees[AM] += S.value * S.amount counted_money += S - + else if(payees[AM] < threshold && istype(AM.pulling, /obj/item/holochip)) var/obj/item/holochip/H = AM.pulling payees[AM] += H.credits diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index 89e5caca5e3..3bf25f76e9d 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -370,6 +370,10 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th target.AdjustStun(amount) if("knockdown") target.AdjustKnockdown(amount) + if("paralyze") + target.AdjustParalyzed(amount) + if("immobilize") + target.AdjustImmobilized(amount) if("unconscious") target.AdjustUnconscious(amount) else diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm index 301c5de22f6..9cd6013c450 100644 --- a/code/modules/spells/spell_types/devil.dm +++ b/code/modules/spells/spell_types/devil.dm @@ -198,7 +198,7 @@ if(H.anti_magic_check(FALSE, TRUE)) continue H.mind.add_antag_datum(/datum/antagonist/sintouched) - H.Knockdown(400) + H.Paralyze(400) /obj/effect/proc_holder/spell/targeted/summon_dancefloor diff --git a/code/modules/spells/spell_types/ethereal_jaunt.dm b/code/modules/spells/spell_types/ethereal_jaunt.dm index b5af095d5d3..7d2c7a8e0ec 100644 --- a/code/modules/spells/spell_types/ethereal_jaunt.dm +++ b/code/modules/spells/spell_types/ethereal_jaunt.dm @@ -40,7 +40,7 @@ return mobloc = get_turf(target.loc) jaunt_steam(mobloc) - target.canmove = 0 + target.mobility_flags &= ~MOBILITY_MOVE holder.reappearing = 1 playsound(get_turf(target), 'sound/magic/ethereal_exit.ogg', 50, 1, -1) sleep(25 - jaunt_in_time) @@ -55,7 +55,7 @@ if(T) if(target.Move(T)) break - target.canmove = 1 + target.mobility_flags |= MOBILITY_MOVE /obj/effect/proc_holder/spell/targeted/ethereal_jaunt/proc/jaunt_steam(mobloc) var/datum/effect_system/steam_spread/steam = new /datum/effect_system/steam_spread() diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm index 919d87b4c7b..e2fe90ee8a2 100644 --- a/code/modules/spells/spell_types/godhand.dm +++ b/code/modules/spells/spell_types/godhand.dm @@ -18,7 +18,7 @@ /obj/item/melee/touch_attack/attack(mob/target, mob/living/carbon/user) if(!iscarbon(user)) //Look ma, no hands return - if(user.lying || user.handcuffed) + if(!(user.mobility_flags & MOBILITY_USE)) to_chat(user, "You can't reach out!") return ..() @@ -45,7 +45,7 @@ item_state = "disintegrate" /obj/item/melee/touch_attack/disintegrate/afterattack(atom/target, mob/living/carbon/user, proximity) - if(!proximity || target == user || !ismob(target) || !iscarbon(user) || user.lying || user.handcuffed) //exploding after touching yourself would be bad + if(!proximity || target == user || !ismob(target) || !iscarbon(user) || !(user.mobility_flags & MOBILITY_USE)) //exploding after touching yourself would be bad return if(!user.can_speak_vocal()) to_chat(user, "You can't get the words out!") @@ -77,9 +77,9 @@ item_state = "fleshtostone" /obj/item/melee/touch_attack/fleshtostone/afterattack(atom/target, mob/living/carbon/user, proximity) - if(!proximity || target == user || !isliving(target) || !iscarbon(user) || user.lying || user.handcuffed) //getting hard after touching yourself would also be bad + if(!proximity || target == user || !isliving(target) || !iscarbon(user)) //getting hard after touching yourself would also be bad return - if(user.lying || user.handcuffed) + if(!(user.mobility_flags & MOBILITY_USE)) to_chat(user, "You can't reach out!") return if(!user.can_speak_vocal()) diff --git a/code/modules/spells/spell_types/inflict_handler.dm b/code/modules/spells/spell_types/inflict_handler.dm index da0af7a6013..e35bdf46694 100644 --- a/code/modules/spells/spell_types/inflict_handler.dm +++ b/code/modules/spells/spell_types/inflict_handler.dm @@ -41,7 +41,7 @@ target.adjustToxLoss(amt_dam_tox) target.adjustOxyLoss(amt_dam_oxy) //disabling - target.Knockdown(amt_knockdown) + target.Paralyze(amt_knockdown) target.Unconscious(amt_unconscious) target.Stun(amt_stun) diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm index 72952770567..58aef8556ae 100644 --- a/code/modules/spells/spell_types/lichdom.dm +++ b/code/modules/spells/spell_types/lichdom.dm @@ -135,7 +135,7 @@ lich.hardset_dna(null,null,lich.real_name,null, new /datum/species/skeleton) to_chat(lich, "Your bones clatter and shudder as you are pulled back into this world!") var/turf/body_turf = get_turf(old_body) - lich.Knockdown(200 + 200*resurrections) + lich.Paralyze(200 + 200*resurrections) resurrections++ if(old_body && old_body.loc) if(iscarbon(old_body)) diff --git a/code/modules/spells/spell_types/shadow_walk.dm b/code/modules/spells/spell_types/shadow_walk.dm index d81f1f57ec7..7242c52d4da 100644 --- a/code/modules/spells/spell_types/shadow_walk.dm +++ b/code/modules/spells/spell_types/shadow_walk.dm @@ -25,8 +25,7 @@ if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) playsound(get_turf(user), 'sound/magic/ethereal_enter.ogg', 50, 1, -1) visible_message("[user] melts into the shadows!") - user.SetStun(0, FALSE) - user.SetKnockdown(0, FALSE) + user.SetAllImmobility(0) user.setStaminaLoss(0, 0) var/obj/effect/dummy/phased_mob/shadow/S2 = new(get_turf(user.loc)) user.forceMove(S2) diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm index 731f040ffac..1d80b00effb 100644 --- a/code/modules/spells/spell_types/wizard.dm +++ b/code/modules/spells/spell_types/wizard.dm @@ -287,14 +287,14 @@ if(distfromcaster == 0) if(isliving(AM)) var/mob/living/M = AM - M.Knockdown(100) + M.Paralyze(100) M.adjustBruteLoss(5) to_chat(M, "You're slammed into the floor by [user]!") else new sparkle_path(get_turf(AM), get_dir(user, AM)) //created sparkles will disappear on their own if(isliving(AM)) var/mob/living/M = AM - M.Knockdown(stun_amt) + M.Paralyze(stun_amt) to_chat(M, "You're thrown back by [user]!") AM.safe_throw_at(throwtarget, ((CLAMP((maxthrow - (CLAMP(distfromcaster - 2, 0, distfromcaster))), 3, maxthrow))), 1,user, force = repulse_force)//So stuff gets tossed around at the same time. diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index bfbf57be977..8bc015a9e35 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -229,7 +229,7 @@ disabled = new_disabled owner.update_health_hud() //update the healthdoll owner.update_body() - owner.update_canmove() + owner.update_mobility() //Updates an organ's brute/burn states for use by update_damage_overlays() //Returns 1 if we need to update overlays. 0 otherwise. diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 73d0ab305ea..69a725d061b 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -123,7 +123,7 @@ C.update_health_hud() //update the healthdoll C.update_body() C.update_hair() - C.update_canmove() + C.update_mobility() if(!Tsec) // Tsec = null happens when a "dummy human" used for rendering icons on prefs screen gets its limbs replaced. qdel(src) @@ -298,7 +298,7 @@ C.update_body() C.update_hair() C.update_damage_overlays() - C.update_canmove() + C.update_mobility() /obj/item/bodypart/head/attach_limb(mob/living/carbon/C, special) diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm index 59440cc3ee1..ab59d83ca7e 100644 --- a/code/modules/surgery/helpers.dm +++ b/code/modules/surgery/helpers.dm @@ -10,7 +10,7 @@ C = M affecting = C.get_bodypart(check_zone(selected_zone)) - if(!M.lying && !isslime(M)) //if they're prone or a slime + if((M.mobility_flags & MOBILITY_STAND) && !isslime(M)) //if they're prone or a slime return var/datum/surgery/current_surgery diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 38967711fe2..ce0eea3622d 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -1,4 +1,3 @@ -#define STUN_SET_AMOUNT 40 /obj/item/organ/cyberimp name = "cybernetic implant" @@ -95,22 +94,50 @@ ui_action_click() ..() - /obj/item/organ/cyberimp/brain/anti_stun name = "CNS Rebooter implant" desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned." implant_color = "#FFFF00" slot = ORGAN_SLOT_BRAIN_ANTISTUN + var/datum/component/redirect/listener + var/datum/callback/CB + var/stun_cap_amount = 40 -/obj/item/organ/cyberimp/brain/anti_stun/on_life() - ..() +/obj/item/organ/cyberimp/brain/anti_stun/Initialize() + . = ..() + initialize_callback() + +/obj/item/organ/cyberimp/brain/anti_stun/proc/initialize_callback() + if(CB) + return + CB = CALLBACK(src, .proc/on_signal) + +/obj/item/organ/cyberimp/brain/anti_stun/Remove() + . = ..() + QDEL_NULL(listener) + +/obj/item/organ/cyberimp/brain/anti_stun/Insert() + . = ..() + if(listener) + qdel(listener) + listener = owner.AddComponent(/datum/component/redirect, list( + COMSIG_LIVING_STATUS_STUN = CB, + COMSIG_LIVING_STATUS_KNOCKDOWN = CB, + COMSIG_LIVING_STATUS_IMMOBILIZE = CB, + COMSIG_LIVING_STATUS_PARALYZE = CB + )) + +/obj/item/organ/cyberimp/brain/anti_stun/proc/on_signal() if(crit_fail) return - - if(owner.AmountStun() > STUN_SET_AMOUNT) - owner.SetStun(STUN_SET_AMOUNT) - if(owner.AmountKnockdown() > STUN_SET_AMOUNT) - owner.SetKnockdown(STUN_SET_AMOUNT) + if(owner.AmountStun() > stun_cap_amount) + owner.SetStun(stun_cap_amount) + if(owner.AmountKnockdown() > stun_cap_amount) + owner.SetKnockdown(stun_cap_amount) + if(owner.AmountImmobilized() > stun_cap_amount) + owner.SetImmobilized(stun_cap_amount) + if(owner.AmountParalyzed() > stun_cap_amount) + owner.SetParalyzed(stun_cap_amount) /obj/item/organ/cyberimp/brain/anti_stun/emp_act(severity) . = ..() @@ -122,7 +149,6 @@ /obj/item/organ/cyberimp/brain/anti_stun/proc/reboot() crit_fail = FALSE - //[[[[MOUTH]]]] /obj/item/organ/cyberimp/mouth zone = BODY_ZONE_PRECISE_MOUTH diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 48392f70a39..c0948315e62 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -265,7 +265,7 @@ cooldown = COOLDOWN_STUN for(var/V in listeners) var/mob/living/L = V - L.Knockdown(60 * power_multiplier) + L.Paralyze(60 * power_multiplier) //SLEEP else if((findtext(message, sleep_words))) @@ -484,11 +484,8 @@ cooldown = COOLDOWN_DAMAGE //because stun removal for(var/V in listeners) var/mob/living/L = V - if(L.resting) - L.lay_down() //aka get up - L.SetStun(0) - L.SetKnockdown(0) - L.SetUnconscious(0) //i said get up i don't care if you're being tased + L.set_resting(FALSE) + L.SetAllImmobility(0) //SIT else if((findtext(message, sit_words))) diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm index fc30d171fb9..baf85851f42 100644 --- a/code/modules/tgui/states.dm +++ b/code/modules/tgui/states.dm @@ -60,10 +60,15 @@ return UI_CLOSE else if(stat) // Disable UIs if unconcious. return UI_DISABLED - else if(incapacitated() || lying) // Update UIs if incapicitated but concious. + else if(incapacitated()) // Update UIs if incapicitated but concious. return UI_UPDATE return UI_INTERACTIVE +/mob/living/shared_ui_interaction(src_object) + . = ..() + if(!(mobility_flags & MOBILITY_UI) && . == UI_INTERACTIVE) + return UI_UPDATE + /mob/living/silicon/ai/shared_ui_interaction(src_object) if(lacks_power()) // Disable UIs if the AI is unpowered. return UI_DISABLED diff --git a/code/modules/tgui/states/not_incapacitated.dm b/code/modules/tgui/states/not_incapacitated.dm index 12fe266bc52..bec6d09bdba 100644 --- a/code/modules/tgui/states/not_incapacitated.dm +++ b/code/modules/tgui/states/not_incapacitated.dm @@ -24,6 +24,10 @@ GLOBAL_DATUM_INIT(not_incapacitated_turf_state, /datum/ui_state/not_incapacitate /datum/ui_state/not_incapacitated_state/can_use_topic(src_object, mob/user) if(user.stat) return UI_CLOSE - if(user.incapacitated() || user.lying || (turf_check && !isturf(user.loc))) + if(user.incapacitated() || (turf_check && !isturf(user.loc))) return UI_DISABLED + if(isliving(user)) + var/mob/living/L = user + if(!(L.mobility_flags & MOBILITY_STAND)) + return UI_DISABLED return UI_INTERACTIVE \ No newline at end of file diff --git a/code/modules/vehicles/cars/car.dm b/code/modules/vehicles/cars/car.dm index 8e0f6efc91e..8c96febdc31 100644 --- a/code/modules/vehicles/cars/car.dm +++ b/code/modules/vehicles/cars/car.dm @@ -13,7 +13,7 @@ var/datum/component/riding/D = LoadComponent(/datum/component/riding) D.vehicle_move_delay = movedelay D.slowvalue = 0 - + /obj/vehicle/sealed/car/generate_actions() . = ..() initialize_controller_action_type(/datum/action/vehicle/sealed/remove_key, VEHICLE_CONTROL_DRIVE) @@ -32,7 +32,7 @@ playsound(src, engine_sound, 100, TRUE) /obj/vehicle/sealed/car/MouseDrop_T(atom/dropping, mob/M) - if(!M.canmove || M.stat || M.restrained()) + if(M.stat || M.restrained()) return FALSE if((car_traits & CAN_KIDNAP) && isliving(dropping) && M != dropping) var/mob/living/L = dropping @@ -64,7 +64,7 @@ if(!(car_traits & CAN_KIDNAP)) return if(occupants[user]) - return + return to_chat(user, "You start opening [src]'s trunk.") if(do_after(user, 30)) if(return_amount_of_controllers_with_flag(VEHICLE_CONTROL_KIDNAPPED)) diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm index 1462da830c7..08acb0f7311 100644 --- a/code/modules/vehicles/cars/clowncar.dm +++ b/code/modules/vehicles/cars/clowncar.dm @@ -59,7 +59,7 @@ var/mob/living/L = M if(iscarbon(L)) var/mob/living/carbon/C = L - C.Knockdown(40) //I play to make sprites go horizontal + C.Paralyze(40) //I play to make sprites go horizontal L.visible_message("[src] rams into [L] and sucks him up!") //fuck off shezza this isn't ERP. mob_forced_enter(L) playsound(src, pick('sound/vehicles/clowncar_ram1.ogg', 'sound/vehicles/clowncar_ram2.ogg', 'sound/vehicles/clowncar_ram3.ogg'), 75) diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index 9af5b13a7d6..632383cc0b6 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -71,7 +71,7 @@ var/atom/throw_target = get_edge_target_turf(H, pick(GLOB.cardinals)) unbuckle_mob(H) H.throw_at(throw_target, 4, 3) - H.Knockdown(100) + H.Paralyze(100) H.adjustStaminaLoss(40) var/head_slot = H.get_item_by_slot(SLOT_HEAD) if(!head_slot || !(istype(head_slot,/obj/item/clothing/head/helmet) || istype(head_slot,/obj/item/clothing/head/hardhat))) @@ -197,7 +197,7 @@ var/atom/throw_target = get_edge_target_turf(H, pick(GLOB.cardinals)) unbuckle_mob(H) H.throw_at(throw_target, 4, 3) - H.Knockdown(30) + H.Paralyze(30) H.adjustStaminaLoss(10) var/head_slot = H.get_item_by_slot(SLOT_HEAD) if(!head_slot || !(istype(head_slot,/obj/item/clothing/head/helmet) || istype(head_slot,/obj/item/clothing/head/hardhat))) diff --git a/code/modules/vehicles/sealed.dm b/code/modules/vehicles/sealed.dm index fbb22578ccd..53865b9a229 100644 --- a/code/modules/vehicles/sealed.dm +++ b/code/modules/vehicles/sealed.dm @@ -57,7 +57,7 @@ if(randomstep) var/turf/target_turf = get_step(exit_location(M), pick(GLOB.cardinals)) M.throw_at(target_turf, 5, 10) - + if(!silent) M.visible_message("[M] drops out of \the [src]!") return TRUE @@ -99,7 +99,7 @@ mob_exit(i, null, randomstep) if(iscarbon(i)) var/mob/living/carbon/Carbon = i - Carbon.Knockdown(40) + Carbon.Paralyze(40) /obj/vehicle/sealed/proc/DumpSpecificMobs(flag, randomstep = TRUE) for(var/i in occupants) @@ -107,8 +107,8 @@ mob_exit(i, null, randomstep) if(iscarbon(i)) var/mob/living/carbon/C = i - C.Knockdown(40) - - + C.Paralyze(40) + + /obj/vehicle/sealed/AllowDrop() return FALSE diff --git a/code/modules/vehicles/speedbike.dm b/code/modules/vehicles/speedbike.dm index 6526e6d89a4..b6af3116b41 100644 --- a/code/modules/vehicles/speedbike.dm +++ b/code/modules/vehicles/speedbike.dm @@ -76,7 +76,7 @@ playsound(src, 'sound/effects/bang.ogg', 50, 1) if(ishuman(A)) var/mob/living/carbon/human/H = A - H.Knockdown(100) + H.Paralyze(100) H.adjustStaminaLoss(30) H.apply_damage(rand(20,35), BRUTE) if(!crash_all)