From e484f72d7bd8c1177fc0855700b1ab50dcb186ee Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Fri, 6 Mar 2020 03:35:56 +0100
Subject: [PATCH] Ports movespeed modifiers code updates.
---
code/__DEFINES/movespeed_modification.dm | 18 +++--
code/datums/martial/cqc.dm | 4 +-
code/datums/martial/psychotic_brawl.dm | 4 +-
code/datums/martial/sleeping_carp.dm | 2 +-
code/game/area/areas.dm | 33 ---------
code/game/atoms.dm | 46 +++++++++++++
code/game/atoms_movable.dm | 11 ++-
code/game/objects/items.dm | 2 +
.../mob/living/carbon/carbon_movement.dm | 12 ----
code/modules/mob/living/carbon/human/human.dm | 16 +++++
.../mob/living/carbon/human/human_movement.dm | 4 +-
.../mob/living/carbon/human/inventory.dm | 6 ++
.../mob/living/carbon/human/species.dm | 69 +++++--------------
code/modules/mob/living/living.dm | 18 ++++-
code/modules/mob/living/living_defense.dm | 2 +-
code/modules/mob/mob.dm | 22 ++++++
code/modules/mob/mob_movement.dm | 8 ++-
17 files changed, 158 insertions(+), 119 deletions(-)
diff --git a/code/__DEFINES/movespeed_modification.dm b/code/__DEFINES/movespeed_modification.dm
index 5d35da5382..76c326cec0 100644
--- a/code/__DEFINES/movespeed_modification.dm
+++ b/code/__DEFINES/movespeed_modification.dm
@@ -17,6 +17,9 @@
//ids
#define MOVESPEED_ID_MOB_WALK_RUN_CONFIG_SPEED "MOB_WALK_RUN"
+#define MOVESPEED_ID_MOB_GRAB_STATE "MOB_GRAB_STATE"
+#define MOVESPEED_ID_MOB_EQUIPMENT "MOB_EQUIPMENT"
+#define MOVESPEED_ID_MOB_GRAVITY "MOB_GRAVITY"
#define MOVESPEED_ID_CONFIG_SPEEDMOD "MOB_CONFIG_MODIFIER"
#define MOVESPEED_ID_SLIME_REAGENTMOD "SLIME_REAGENT_MODIFIER"
@@ -28,6 +31,7 @@
#define MOVESPEED_ID_TARANTULA_WEB "TARANTULA_WEB"
#define MOVESPEED_ID_LIVING_TURF_SPEEDMOD "LIVING_TURF_SPEEDMOD"
+#define MOVESPEED_ID_LIVING_LIMBLESS "LIVING_LIMBLESS"
#define MOVESPEED_ID_CARBON_SOFTCRIT "CARBON_SOFTCRIT"
#define MOVESPEED_ID_CARBON_OLDSPEED "CARBON_DEPRECATED_SPEED"
@@ -59,15 +63,19 @@
#define MOVESPEED_ID_HUMAN_CARRYING "HUMAN_CARRY"
#define MOVESPEED_ID_SHRINK_RAY "SHRUNKEN_SPEED_MODIFIER"
-#define MOVESPEED_ID_TASED_STATUS "TASED"
-
#define MOVESPEED_ID_SLAUGHTER "SLAUGHTER"
#define MOVESPEED_ID_CYBER_THRUSTER "CYBER_IMPLANT_THRUSTER"
#define MOVESPEED_ID_JETPACK "JETPACK"
-#define MOVESPEED_ID_SHOVE "SHOVE"
-
#define MOVESPEED_ID_MKULTRA "MKULTRA"
-#define MOVESPEED_ID_ELECTROSTAFF "ELECTROSTAFF"
\ No newline at end of file
+#define MOVESPEED_ID_TASED_STATUS "TASED"
+#define MOVESPEED_ID_ELECTROSTAFF "ELECTROSTAFF"
+
+#define MOVESPEED_ID_SHOVE "SHOVE"
+#define MOVESPEED_ID_FAT "FAT"
+#define MOVESPEED_ID_COLD "COLD"
+#define MOVESPEED_ID_HUNGRY "HUNGRY"
+#define MOVESPEED_ID_DAMAGE_SLOWDOWN "DAMAGE"
+#define MOVESPEED_ID_DAMAGE_SLOWDOWN_FLYING "FLYING"
\ No newline at end of file
diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm
index 4ec16ac18c..b364657792 100644
--- a/code/datums/martial/cqc.dm
+++ b/code/datums/martial/cqc.dm
@@ -119,7 +119,7 @@
D.grabbedby(A, 1)
if(old_grab_state == GRAB_PASSIVE)
D.drop_all_held_items()
- A.grab_state = GRAB_AGGRESSIVE //Instant agressive grab if on grab intent
+ A.setGrabState(GRAB_AGGRESSIVE) //Instant agressive grab if on grab intent
log_combat(A, D, "grabbed", addition="aggressively")
D.visible_message("[A] violently grabs [D]!", \
"[A] violently grabs you!")
@@ -185,7 +185,7 @@
D.SetSleeping(400)
restraining = FALSE
if(A.grab_state < GRAB_NECK)
- A.grab_state = GRAB_NECK
+ A.setGrabState(GRAB_NECK)
else
restraining = FALSE
return FALSE
diff --git a/code/datums/martial/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm
index f0ad7aedfd..a70938d83e 100644
--- a/code/datums/martial/psychotic_brawl.dm
+++ b/code/datums/martial/psychotic_brawl.dm
@@ -34,10 +34,10 @@
log_combat(A, D, "grabbed", addition="aggressively")
D.visible_message("[A] violently grabs [D]!", \
"[A] violently grabs you!")
- A.grab_state = GRAB_AGGRESSIVE //Instant aggressive grab
+ A.setGrabState(GRAB_AGGRESSIVE) //Instant aggressive grab
else
log_combat(A, D, "grabbed", addition="passively")
- A.grab_state = GRAB_PASSIVE
+ A.setGrabState(GRAB_PASSIVE)
if(4)
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
atk_verb = "headbutts"
diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm
index 85f8a4a101..7894936aaa 100644
--- a/code/datums/martial/sleeping_carp.dm
+++ b/code/datums/martial/sleeping_carp.dm
@@ -115,7 +115,7 @@
D.grabbedby(A, 1)
if(old_grab_state == GRAB_PASSIVE)
D.drop_all_held_items()
- A.grab_state = GRAB_AGGRESSIVE //Instant agressive grab if on grab intent
+ A.setGrabState(GRAB_AGGRESSIVE) //Instant agressive grab if on grab intent
log_combat(A, D, "grabbed", addition="aggressively")
D.visible_message("[A] violently grabs [D]!", \
"[A] violently grabs you!")
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 99b8165306..00dc0d98d6 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -514,39 +514,6 @@ GLOBAL_LIST_EMPTY(teleportlocs)
/client/proc/ResetAmbiencePlayed()
played = FALSE
-/atom/proc/has_gravity(turf/T)
- if(!T || !isturf(T))
- T = get_turf(src)
-
- if(!T)
- return 0
-
- var/list/forced_gravity = list()
- SEND_SIGNAL(src, COMSIG_ATOM_HAS_GRAVITY, T, forced_gravity)
- if(!forced_gravity.len)
- SEND_SIGNAL(T, COMSIG_TURF_HAS_GRAVITY, src, forced_gravity)
- if(forced_gravity.len)
- var/max_grav
- for(var/i in forced_gravity)
- max_grav = max(max_grav, i)
- if(max_grav)
- return max_grav
-
- if(isspaceturf(T)) // Turf never has gravity
- return 0
-
- var/area/A = get_area(T)
- if(A.has_gravity) // Areas which always has gravity
- return A.has_gravity
- else
- // There's a gravity generator on our z level
- if(GLOB.gravity_generators["[T.z]"])
- var/max_grav = 0
- for(var/obj/machinery/gravity_generator/main/G in GLOB.gravity_generators["[T.z]"])
- max_grav = max(G.setting,max_grav)
- return max_grav
- return SSmapping.level_trait(T.z, ZTRAIT_GRAVITY)
-
/area/proc/setup(a_name)
name = a_name
power_equip = FALSE
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 6439fd1cfc..ba8ea48848 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -918,3 +918,49 @@ Proc for attack log creation, because really why not
if(!(material_flags & MATERIAL_NO_EFFECTS))
custom_material.on_applied(src, materials[custom_material] * multiplier * material_modifier, material_flags)
custom_materials[custom_material] += materials[x] * multiplier
+
+/**
+ * Returns true if this atom has gravity for the passed in turf
+ *
+ * Sends signals COMSIG_ATOM_HAS_GRAVITY and COMSIG_TURF_HAS_GRAVITY, both can force gravity with
+ * the forced gravity var
+ *
+ * Gravity situations:
+ * * No gravity if you're not in a turf
+ * * No gravity if this atom is in is a space turf
+ * * Gravity if the area it's in always has gravity
+ * * Gravity if there's a gravity generator on the z level
+ * * Gravity if the Z level has an SSMappingTrait for ZTRAIT_GRAVITY
+ * * otherwise no gravity
+ */
+/atom/proc/has_gravity(turf/T)
+ if(!T || !isturf(T))
+ T = get_turf(src)
+
+ if(!T)
+ return 0
+
+ var/list/forced_gravity = list()
+ SEND_SIGNAL(src, COMSIG_ATOM_HAS_GRAVITY, T, forced_gravity)
+ if(!forced_gravity.len)
+ SEND_SIGNAL(T, COMSIG_TURF_HAS_GRAVITY, src, forced_gravity)
+ if(forced_gravity.len)
+ var/max_grav
+ for(var/i in forced_gravity)
+ max_grav = max(max_grav, i)
+ return max_grav
+
+ if(isspaceturf(T)) // Turf never has gravity
+ return 0
+
+ var/area/A = get_area(T)
+ if(A.has_gravity) // Areas which always has gravity
+ return A.has_gravity
+ else
+ // There's a gravity generator on our z level
+ if(GLOB.gravity_generators["[T.z]"])
+ var/max_grav = 0
+ for(var/obj/machinery/gravity_generator/main/G in GLOB.gravity_generators["[T.z]"])
+ max_grav = max(G.setting,max_grav)
+ return max_grav
+ return SSmapping.level_trait(T.z, ZTRAIT_GRAVITY)
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 42ccc4bbba..9c8640e661 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -131,7 +131,7 @@
return FALSE
// Are we trying to pull something we are already pulling? Then enter grab cycle and end.
if(AM == pulling)
- grab_state = state
+ setGrabState(state)
if(istype(AM,/mob/living))
var/mob/living/AMob = AM
AMob.grabbedby(src)
@@ -142,7 +142,7 @@
AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once.
pulling = AM
AM.pulledby = src
- grab_state = state
+ setGrabState(state)
if(ismob(AM))
var/mob/M = AM
log_combat(src, M, "grabbed", addition="passive grab")
@@ -155,7 +155,7 @@
pulling.pulledby = null
var/mob/living/ex_pulled = pulling
pulling = null
- grab_state = 0
+ setGrabState(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
@@ -865,6 +865,11 @@
return FALSE
return TRUE
+/// Updates the grab state of the movable
+/// This exists to act as a hook for behaviour
+/atom/movable/proc/setGrabState(newstate)
+ grab_state = newstate
+
/obj/item/proc/do_pickup_animation(atom/target)
set waitfor = FALSE
if(!istype(loc, /turf))
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 8dfb36ce8a..8beebf966e 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -378,6 +378,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
qdel(src)
item_flags &= ~IN_INVENTORY
SEND_SIGNAL(src, COMSIG_ITEM_DROPPED,user)
+ user.update_equipment_speed_mods()
// called just as an item is picked up (loc is not yet changed)
/obj/item/proc/pickup(mob/user)
@@ -423,6 +424,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
if(item_action_slot_check(slot, user, A)) //some items only give their actions buttons when in a specific slot.
A.Grant(user)
item_flags |= IN_INVENTORY
+ user.update_equipment_speed_mods()
//sometimes we only want to grant the item's action if it's equipped in a specific slot.
/obj/item/proc/item_action_slot_check(slot, mob/user, datum/action/A)
diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm
index 7413e84196..731e6f6900 100644
--- a/code/modules/mob/living/carbon/carbon_movement.dm
+++ b/code/modules/mob/living/carbon/carbon_movement.dm
@@ -1,15 +1,3 @@
-/mob/living/carbon/movement_delay()
- . = ..()
- . += grab_state * 3 //can't go fast while grabbing something.
-
- if(!get_leg_ignore()) //ignore the fact we lack legs
- var/leg_amount = get_num_legs()
- . += 6 - 3*leg_amount //the fewer the legs, the slower the mob
- if(!leg_amount)
- . += 6 - 3*get_num_arms() //crawling is harder with fewer arms
- if(legcuffed)
- . += legcuffed.slowdown
-
/mob/living/carbon/slip(knockdown_amount, obj/O, lube)
if(movement_type & FLYING && !(lube & FLYING_DOESNT_HELP))
return FALSE
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 423277863f..bdf04d5636 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -948,6 +948,22 @@
if(is_type_in_typecache(active_item, GLOB.shove_disarming_types))
visible_message("[src.name] regains their grip on \the [active_item]!", "You regain your grip on \the [active_item]", null, COMBAT_MESSAGE_RANGE)
+/mob/living/carbon/human/updatehealth()
+ . = ..()
+
+ if(HAS_TRAIT(src, TRAIT_IGNORESLOWDOWN))
+ remove_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN)
+ remove_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN_FLYING)
+ return
+ var/stambufferinfluence = (bufferedstam*(100/stambuffer))*0.2 //CIT CHANGE - makes stamina buffer influence movedelay
+ var/health_deficiency = ((100 + stambufferinfluence) - health + (getStaminaLoss()*0.75))//CIT CHANGE - reduces the impact of staminaloss and makes stamina buffer influence it
+ if(health_deficiency >= 40)
+ add_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN, override = TRUE, multiplicative_slowdown = ((health_deficiency-39) / 75), blacklisted_movetypes = FLOATING|FLYING)
+ add_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN_FLYING, override = TRUE, multiplicative_slowdown = ((health_deficiency-39) / 25), movetypes = FLOATING)
+ else
+ remove_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN)
+ remove_movespeed_modifier(MOVESPEED_ID_DAMAGE_SLOWDOWN_FLYING)
+
/mob/living/carbon/human/do_after_coefficent()
. = ..()
. *= physiology.do_after_speed
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index f37673a5a3..608ad76128 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -9,8 +9,8 @@
/mob/living/carbon/human/movement_delay()
. = ..()
- if(dna && dna.species)
- . += dna.species.movement_delay(src)
+ if (m_intent == MOVE_INTENT_WALK && HAS_TRAIT(src, TRAIT_SPEEDY_STEP))
+ . -= 1.5
/mob/living/carbon/human/slip(knockdown_amount, obj/O, lube)
if(HAS_TRAIT(src, TRAIT_NOSLIPALL))
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index ec0eda846c..122a06b17b 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -145,6 +145,12 @@
return not_handled //For future deeper overrides
+/mob/living/carbon/human/equipped_speed_mods()
+ . = ..()
+ for(var/sloties in get_all_slots())
+ var/obj/item/thing = sloties
+ . += thing?.slowdown
+
/mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE)
var/index = get_held_index_of_item(I)
. = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should.
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index b1bc47ea4a..8c9494e634 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1286,12 +1286,14 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(H.overeatduration < 100)
to_chat(H, "You feel fit again!")
REMOVE_TRAIT(H, TRAIT_FAT, OBESITY)
+ H.remove_movespeed_modifier(MOVESPEED_ID_FAT)
H.update_inv_w_uniform()
H.update_inv_wear_suit()
else
if(H.overeatduration >= 100)
to_chat(H, "You suddenly feel blubbery!")
ADD_TRAIT(H, TRAIT_FAT, OBESITY)
+ H.add_movespeed_modifier(MOVESPEED_ID_FAT, multiplicative_slowdown = 1.5)
H.update_inv_w_uniform()
H.update_inv_wear_suit()
@@ -1342,6 +1344,15 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
to_chat(H, "You no longer feel vigorous.")
H.metabolism_efficiency = 1
+ //Hunger slowdown for if mood isn't enabled
+ if(CONFIG_GET(flag/disable_human_mood))
+ if(!HAS_TRAIT(H, TRAIT_NOHUNGER))
+ var/hungry = (500 - H.nutrition) / 5 //So overeat would be 100 and default level would be 80
+ if(hungry >= 70)
+ H.add_movespeed_modifier(MOVESPEED_ID_HUNGRY, override = TRUE, multiplicative_slowdown = (hungry / 50))
+ else
+ H.remove_movespeed_modifier(MOVESPEED_ID_HUNGRY)
+
switch(H.nutrition)
if(NUTRITION_LEVEL_FULL to INFINITY)
H.throw_alert("nutrition", /obj/screen/alert/fat)
@@ -1391,59 +1402,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
H.hair_style = "Bald"
H.update_hair()
-////////////////
-// MOVE SPEED //
-////////////////
-
-/datum/species/proc/movement_delay(mob/living/carbon/human/H)
- . = 0 //We start at 0.
- var/flight = 0 //Check for flight and flying items
- var/gravity = 0
- if(H.movement_type & FLYING)
- flight = 1
-
- gravity = H.has_gravity()
-
- if (H.m_intent == MOVE_INTENT_WALK && HAS_TRAIT(H, TRAIT_SPEEDY_STEP))
- . -= 1.5
-
- if(!HAS_TRAIT(H, TRAIT_IGNORESLOWDOWN) && gravity)
- if(H.wear_suit)
- . += H.wear_suit.slowdown
- if(H.shoes)
- . += H.shoes.slowdown
- if(H.back)
- . += H.back.slowdown
- for(var/obj/item/I in H.held_items)
- if(I.item_flags & SLOWS_WHILE_IN_HAND)
- . += I.slowdown
- var/stambufferinfluence = (H.bufferedstam*(100/H.stambuffer))*0.2 //CIT CHANGE - makes stamina buffer influence movedelay
- var/health_deficiency = ((100 + stambufferinfluence) - H.health + (H.getStaminaLoss()*0.75))//CIT CHANGE - reduces the impact of staminaloss on movement speed and makes stamina buffer influence movedelay
- if(health_deficiency >= 40)
- if(flight)
- . += ((health_deficiency-39) / 75) // CIT CHANGE - adds -39 to health deficiency penalty to make the transition to low health movement a little less jarring
- else
- . += ((health_deficiency-39) / 25) // CIT CHANGE - ditto
- if(CONFIG_GET(flag/disable_human_mood))
- var/hungry = (500 - H.nutrition) / 5 //So overeat would be 100 and default level would be 80
- if((hungry >= 70) && !flight) //Being hungry will still allow you to use a flightsuit/wings.
- . += hungry / 50
-
- //Moving in high gravity is very slow (Flying too)
- if(gravity > STANDARD_GRAVITY)
- var/grav_force = min(gravity - STANDARD_GRAVITY,3)
- . += 1 + grav_force
-
- if(HAS_TRAIT(H, TRAIT_FAT))
- . += (1.5 - flight)
- if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !HAS_TRAIT(H, TRAIT_RESISTCOLD))
- . += (BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR
- return .
-
-//////////////////
-// ATTACK PROCS //
-//////////////////
-
//////////////////
// ATTACK PROCS //
//////////////////
@@ -2058,6 +2016,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "cold")
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "hot", /datum/mood_event/hot)
+ H.remove_movespeed_modifier(MOVESPEED_ID_COLD)
+
var/burn_damage
var/firemodifier = H.fire_stacks / 50
if (H.on_fire)
@@ -2073,6 +2033,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
else if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !HAS_TRAIT(H, TRAIT_RESISTCOLD))
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "hot")
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "cold", /datum/mood_event/cold)
+ //Sorry for the nasty oneline but I don't want to assign a variable on something run pretty frequently
+ H.add_movespeed_modifier(MOVESPEED_ID_COLD, override = TRUE, multiplicative_slowdown = ((BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR))
switch(H.bodytemperature)
if(200 to BODYTEMP_COLD_DAMAGE_LIMIT)
H.apply_damage(COLD_DAMAGE_LEVEL_1*coldmod*H.physiology.cold_mod, BURN)
@@ -2082,6 +2044,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
H.apply_damage(COLD_DAMAGE_LEVEL_3*coldmod*H.physiology.cold_mod, BURN)
else
+ H.remove_movespeed_modifier(MOVESPEED_ID_COLD)
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "cold")
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "hot")
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index df6257e38b..38e330a900 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -722,6 +722,7 @@
return name
/mob/living/update_gravity(has_gravity,override = 0)
+ . = ..()
if(!SSticker.HasRoundStarted())
return
if(has_gravity)
@@ -1105,12 +1106,23 @@
if(layer == LYING_MOB_LAYER)
layer = initial(layer)
update_transform()
- if(!lying && lying_prev)
- if(client)
- client.move_delay = world.time + movement_delay()
lying_prev = lying
if(canmove && !intentionalresting && iscarbon(src) && client && client.prefs && client.prefs.autostand)//CIT CHANGE - adds autostanding as a preference
addtimer(CALLBACK(src, .proc/resist_a_rest, TRUE), 0) //CIT CHANGE - ditto
+
+ // Movespeed mods based on arms/legs quantity
+ if(!get_leg_ignore())
+ var/limbless_slowdown = 0
+ // These checks for <2 should be swapped out for something else if we ever end up with a species with more than 2
+ if(has_legs < 2)
+ limbless_slowdown += 6 - (has_legs * 3)
+ if(!has_legs && has_arms < 2)
+ limbless_slowdown += 6 - (has_arms * 3)
+ if(limbless_slowdown)
+ add_movespeed_modifier(MOVESPEED_ID_LIVING_LIMBLESS, update=TRUE, priority=100, override=TRUE, multiplicative_slowdown=limbless_slowdown, movetypes=GROUND)
+ else
+ remove_movespeed_modifier(MOVESPEED_ID_LIVING_LIMBLESS, update=TRUE)
+
return canmove
/mob/living/proc/AddAbility(obj/effect/proc_holder/A)
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 6a14cce4af..86166ede30 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -250,7 +250,7 @@
return 0
if(user.voremode && user.grab_state == GRAB_AGGRESSIVE)
return 0
- user.grab_state++
+ user.setGrabState(user.grab_state + 1)
switch(user.grab_state)
if(GRAB_AGGRESSIVE)
var/add_log = ""
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 1ca6299efb..c2a6758ac5 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -954,3 +954,25 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
/mob/setMovetype(newval)
. = ..()
update_movespeed(FALSE)
+
+/// Updates the grab state of the mob and updates movespeed
+/mob/setGrabState(newstate)
+ . = ..()
+ if(grab_state == GRAB_PASSIVE)
+ remove_movespeed_modifier(MOVESPEED_ID_MOB_GRAB_STATE, update=TRUE)
+ else
+ add_movespeed_modifier(MOVESPEED_ID_MOB_GRAB_STATE, update=TRUE, priority=100, override=TRUE, multiplicative_slowdown=grab_state*3, blacklisted_movetypes=FLOATING)
+
+/mob/proc/update_equipment_speed_mods()
+ var/speedies = equipped_speed_mods()
+ if(!speedies)
+ remove_movespeed_modifier(MOVESPEED_ID_MOB_EQUIPMENT, update=TRUE)
+ else
+ add_movespeed_modifier(MOVESPEED_ID_MOB_EQUIPMENT, update=TRUE, priority=100, override=TRUE, multiplicative_slowdown=speedies, blacklisted_movetypes=FLOATING)
+
+/// Gets the combined speed modification of all worn items
+/// Except base mob type doesnt really wear items
+/mob/proc/equipped_speed_mods()
+ for(var/obj/item/I in held_items)
+ if(I.item_flags & SLOWS_WHILE_IN_HAND)
+ . += I.slowdown
\ No newline at end of file
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index b11d1632c8..9a57531cb4 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -251,8 +251,12 @@
/mob/proc/slip(s_amount, w_amount, obj/O, lube)
return
-/mob/proc/update_gravity()
- return
+/mob/proc/update_gravity(has_gravity, override=FALSE)
+ var/speed_change = max(0, has_gravity - STANDARD_GRAVITY)
+ if(!speed_change)
+ remove_movespeed_modifier(MOVESPEED_ID_MOB_GRAVITY, update=TRUE)
+ else
+ add_movespeed_modifier(MOVESPEED_ID_MOB_GRAVITY, update=TRUE, priority=100, override=TRUE, multiplicative_slowdown=speed_change, blacklisted_movetypes=FLOATING)
//bodypart selection - Cyberboss
//8 toggles through head - eyes - mouth