diff --git a/aurorastation.dme b/aurorastation.dme
index 376c3a5c66b..3a03932728f 100644
--- a/aurorastation.dme
+++ b/aurorastation.dme
@@ -111,11 +111,11 @@
#include "code\_onclick\hud\_defines.dm"
#include "code\_onclick\hud\action.dm"
#include "code\_onclick\hud\ai.dm"
+#include "code\_onclick\hud\nymph_hud.dm"
#include "code\_onclick\hud\gun_mode.dm"
#include "code\_onclick\hud\hud.dm"
#include "code\_onclick\hud\human.dm"
#include "code\_onclick\hud\movable_screen_objects.dm"
-#include "code\_onclick\hud\nymph_hud.dm"
#include "code\_onclick\hud\other_mobs.dm"
#include "code\_onclick\hud\parallax.dm"
#include "code\_onclick\hud\radial.dm"
@@ -296,7 +296,6 @@
#include "code\datums\helper_datums\topic_input.dm"
#include "code\datums\looping_sounds\_looping_sound.dm"
#include "code\datums\looping_sounds\machinery_sounds.dm"
-#include "code\datums\move_intent\move_intent.dm"
#include "code\datums\observation\_debug.dm"
#include "code\datums\observation\destroyed.dm"
#include "code\datums\observation\moved.dm"
diff --git a/code/__defines/chemistry.dm b/code/__defines/chemistry.dm
index 871ab4f581a..ced9d925590 100644
--- a/code/__defines/chemistry.dm
+++ b/code/__defines/chemistry.dm
@@ -63,9 +63,8 @@
#define CE_PACIFIED "pacified"
#define CE_PAINKILLER "painkiller"
#define CE_PULSE "xcardic" // increases or decreases heartrate
-#define CE_UNDEXTROUS "undextrous" // arms no work right
-#define CE_HALLUCINATE "hallucinogen" // Makes hallucinations stronger or weaker
-#define CE_ENERGETIC "energetic" // Speeds up stamina recovery
+#define CE_UNDEXTROUS "undextrous" // arms no work right
+#define CE_HALLUCINATE "hallucinogen" //Makes hallucinations stronger or weaker
// Apply healing effects
#define CE_ANTIBIOTIC "antibiotic" // Thetamycin
diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm
index 6dbdaa471b0..e0bc53d9219 100644
--- a/code/__defines/mobs.dm
+++ b/code/__defines/mobs.dm
@@ -236,10 +236,6 @@
#define CREW_HYDRATION_VERYTHIRSTY 0.1
#define CREW_HYDRATION_DEHYDRATED 0
-//Movement.
-#define MOVING_DELIBERATELY(X) (X.move_intent.flags & MOVE_INTENT_DELIBERATE)
-#define MOVING_QUICKLY(X) (X.move_intent.flags & MOVE_INTENT_QUICK)
-
#define TINT_NONE 0
#define TINT_MODERATE 1
#define TINT_HEAVY 2
@@ -356,9 +352,4 @@
#define AURA_TYPE_BULLET "Bullet"
#define AURA_TYPE_WEAPON "Weapon"
#define AURA_TYPE_THROWN "Thrown"
-#define AURA_TYPE_LIFE "Life"
-
-// Quick and deliberate movements are not necessarily mutually exclusive
-#define MOVE_INTENT_DELIBERATE 1
-#define MOVE_INTENT_EXERTIVE 2
-#define MOVE_INTENT_QUICK 4
\ No newline at end of file
+#define AURA_TYPE_LIFE "Life"
\ No newline at end of file
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index ae7bbaecb44..29cfb7452ab 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -138,10 +138,13 @@ var/list/global_huds
var/show_intent_icons = 0
var/hotkey_ui_hidden = 0 //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons)
+ var/obj/screen/lingchemdisplay
+ var/obj/screen/blobpwrdisplay
+ var/obj/screen/blobhealthdisplay
var/obj/screen/r_hand_hud_object
var/obj/screen/l_hand_hud_object
var/obj/screen/action_intent
- var/obj/screen/movement/move_intent
+ var/obj/screen/movement_intent/move_intent
var/list/adding
var/list/other
@@ -161,6 +164,9 @@ datum/hud/New(mob/owner)
hurt_intent = null
disarm_intent = null
help_intent = null
+ lingchemdisplay = null
+ blobpwrdisplay = null
+ blobhealthdisplay = null
r_hand_hud_object = null
l_hand_hud_object = null
action_intent = null
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index f845f447c9a..00cc6c52cae 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -125,11 +125,9 @@
//end intent small hud objects
if(hud_data.has_m_intent)
- using = new /obj/screen/movement()
- using.name = "movement method"
+ using = new /obj/screen/movement_intent()
using.icon = ui_style
- using.icon_state = mymob.move_intent.hud_icon_state
- using.screen_loc = ui_movi
+ using.icon_state = (mymob.m_intent == "run" ? "running" : "walking")
using.color = ui_color
using.alpha = ui_alpha
src.adding += using
diff --git a/code/_onclick/hud/nymph_hud.dm b/code/_onclick/hud/nymph_hud.dm
index 1a3858c58ac..57b6db3a798 100644
--- a/code/_onclick/hud/nymph_hud.dm
+++ b/code/_onclick/hud/nymph_hud.dm
@@ -8,12 +8,12 @@
var/obj/screen/using
- using = new /obj/screen/movement()
- adding += using
+ using = new /obj/screen/movement_intent()
+ using.set_dir(SOUTHWEST)
+ using.icon = 'icons/mob/screen/alien.dmi'
+ using.icon_state = (mymob.m_intent == "run" ? "running" : "walking")
+ src.adding += using
move_intent = using
- using.name = "movement method" //holy shit dionae what the fuck
- using.icon_state = mymob.move_intent.hud_icon_state
-
mymob.healths = new /obj/screen()
mymob.healths.icon = 'icons/hud/diona_health.dmi'
diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm
index 09191503e76..a6518debceb 100644
--- a/code/_onclick/hud/other_mobs.dm
+++ b/code/_onclick/hud/other_mobs.dm
@@ -22,6 +22,24 @@
/mob/living/silicon/ai/instantiate_hud(var/datum/hud/HUD)
HUD.ai_hud()
+/datum/hud/proc/blob_hud(ui_style = 'icons/mob/screen/midnight.dmi')
+
+ blobpwrdisplay = new /obj/screen()
+ blobpwrdisplay.name = "blob power"
+ blobpwrdisplay.icon_state = "block"
+ blobpwrdisplay.screen_loc = ui_health
+ blobpwrdisplay.layer = SCREEN_LAYER
+
+ blobhealthdisplay = new /obj/screen()
+ blobhealthdisplay.name = "blob health"
+ blobhealthdisplay.icon_state = "block"
+ blobhealthdisplay.screen_loc = ui_internal
+ blobhealthdisplay.layer = SCREEN_LAYER
+
+ mymob.client.screen = null
+
+ mymob.client.screen += list(blobpwrdisplay, blobhealthdisplay)
+
/mob/living/carbon/slime/instantiate_hud(var/datum/hud/HUD)
HUD.slime_hud()
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 1d1a9dd9992..81be748b997 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -397,26 +397,53 @@
usr.update_inv_r_hand(0)
return 1
-/obj/screen/movement
+/obj/screen/movement_intent
+ name = "mov_intent"
screen_loc = ui_movi
layer = SCREEN_LAYER
-/obj/screen/movement/proc/update_stamina_bar(var/mob/living/user)
- if(!user.client)
+//This updates the run/walk button on the hud
+/obj/screen/movement_intent/proc/update_move_icon(var/mob/living/user)
+ if (!user.client)
return
-
- if(user.get_stamina() == user.get_maximum_stamina())
- if(user.stamina_bar)
+
+ if (user.max_stamina == -1 || user.stamina == user.max_stamina)
+ if (user.stamina_bar)
QDEL_NULL(user.stamina_bar)
else
- if(!user.stamina_bar)
- user.stamina_bar = new(user, user.get_maximum_stamina(), src)
- user.stamina_bar.update(user.get_stamina())
+ if (!user.stamina_bar)
+ user.stamina_bar = new(user, user.max_stamina, src)
+ user.stamina_bar.update(user.stamina)
-/obj/screen/movement/Click(var/location, var/control, var/params)
- if(istype(usr))
- usr.set_next_usable_move_intent()
+ if (user.m_intent == "run")
+ icon_state = "running"
+ else
+ icon_state = "walking"
+
+/obj/screen/movement_intent/Click(location, control, params)
+ if(!usr)
+ return 1
+ var/list/modifiers = params2list(params)
+
+ if(iscarbon(usr))
+ var/mob/living/carbon/C = usr
+ if (modifiers["alt"])
+ C.set_walk_speed()
+ return
+
+ if(C.legcuffed)
+ to_chat(C, "You are legcuffed! You cannot run until you get [C.legcuffed] removed!")
+ C.m_intent = "walk" //Just incase
+ C.hud_used.move_intent.icon_state = "walking"
+ return 1
+ switch(usr.m_intent)
+ if("run")
+ usr.m_intent = "walk"
+ if("walk")
+ usr.m_intent = "run"
+
+ update_move_icon(usr)
// Hand slots are special to handle the handcuffs overlay
/obj/screen/inventory/hand
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 34310ef0f42..76c3a68d5a2 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -145,16 +145,11 @@ var/list/gamemode_cache = list()
var/no_click_cooldown = 0
//Used for modifying movement speed for mobs.
- //Universal modifiers
+ //Unversal modifiers
+ var/walk_speed = 0
var/walk_delay_multiplier = 1
var/run_delay_multiplier = 1
var/vehicle_delay_multiplier = 1
-
- var/run_delay = 4
- var/walk_delay = 4
- var/creep_delay = 6
- var/minimum_stamina_recovery = 1
- var/maximum_stamina_recovery = 3
//Mob specific modifiers. NOTE: These will affect different mob types in different ways
var/human_delay = 0
@@ -987,16 +982,8 @@ var/list/gamemode_cache = list()
if("limbs_can_break")
config.limbs_can_break = value
- if("run_delay")
- config.run_delay = value
- if("walk_delay")
- config.walk_delay = value
- if("creep_delay")
- config.creep_delay = value
- if("minimum_stamina_recovery")
- config.minimum_stamina_recovery = value
- if("maximum_stamina_recovery")
- config.maximum_stamina_recovery = value
+ if("walk_speed")
+ config.walk_speed = value
// These should never go to 0 or below. So, we clamp them.
if("walk_delay_multiplier")
diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm
index 0747d76733f..2161f83e116 100644
--- a/code/datums/brain_damage/mild.dm
+++ b/code/datums/brain_damage/mild.dm
@@ -153,6 +153,8 @@
/datum/brain_trauma/mild/muscle_weakness/on_life()
var/fall_chance = 5
+ if(owner.m_intent == "run")
+ fall_chance += 15
if(prob(fall_chance) && !owner.lying && !owner.buckled)
to_chat(owner, "Your leg gives out!")
owner.Weaken(5)
diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm
index 4a0cb8300fb..64d8c1416aa 100644
--- a/code/datums/brain_damage/severe.dm
+++ b/code/datums/brain_damage/severe.dm
@@ -80,6 +80,8 @@
if(owner.stat == UNCONSCIOUS || owner.sleeping > 0)
return
var/sleep_chance = 5
+ if(owner.m_intent == "run")
+ sleep_chance += 15
if(owner.drowsyness)
sleep_chance += owner.drowsyness + 5
if(owner.drowsyness >= 66)
diff --git a/code/datums/move_intent/move_intent.dm b/code/datums/move_intent/move_intent.dm
deleted file mode 100644
index 15f97d91bd1..00000000000
--- a/code/datums/move_intent/move_intent.dm
+++ /dev/null
@@ -1,45 +0,0 @@
-/decl/move_intent
- var/name
- var/flags = 0
- var/move_delay = 1
- var/hud_icon_state
-
-/decl/move_intent/proc/can_be_used_by(var/mob/user)
- if(flags & MOVE_INTENT_QUICK)
- return user.can_sprint()
- return TRUE
-
-/decl/move_intent/creep
- name = "Creep"
- flags = MOVE_INTENT_DELIBERATE
- hud_icon_state = "creeping"
-
-/decl/move_intent/creep/Initialize()
- . = ..()
- move_delay = config.creep_delay
-
-/decl/move_intent/walk
- name = "Walk"
- flags = MOVE_INTENT_DELIBERATE
- hud_icon_state = "walking"
-
-/decl/move_intent/walk/Initialize()
- . = ..()
- move_delay = config.walk_delay
-
-/decl/move_intent/run
- name = "Run"
- flags = MOVE_INTENT_EXERTIVE | MOVE_INTENT_QUICK
- hud_icon_state = "running"
-
-/decl/move_intent/run/Initialize()
- . = ..()
- move_delay = config.run_delay
-
-/decl/move_intent/walk/animal
- name = "Fast Walk"
-
-/decl/move_intent/walk/animal/Initialize()
- . = ..()
- move_delay = 0
-
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 559977ee0cc..f0b82ca43f1 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -324,7 +324,7 @@ var/list/mob/living/forced_ambiance_list = new
L.lastarea = get_area(L.loc)
var/area/newarea = get_area(L.loc)
var/area/oldarea = L.lastarea
- if((oldarea.has_gravity() == 0) && (newarea.has_gravity() == 1) && (MOVING_QUICKLY(L))) // Being ready when you change areas gives you a chance to avoid falling all together.
+ if((oldarea.has_gravity() == 0) && (newarea.has_gravity() == 1) && (L.m_intent == "run")) // Being ready when you change areas gives you a chance to avoid falling all together.
thunk(L)
L.update_floating( L.Check_Dense_Object() )
@@ -379,7 +379,7 @@ var/list/mob/living/forced_ambiance_list = new
if(H.Check_Shoegrip(FALSE))
return
- if(MOVING_QUICKLY(H))
+ if(H.m_intent == "run")
H.AdjustStunned(2)
H.AdjustWeakened(2)
else
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 95798994b41..bfdbd502d1b 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -102,7 +102,7 @@
perp.update_inv_shoes(1)
amount--
- if(amount > 2 && prob(perp.slip_chance(MOVING_QUICKLY(perp) ? 20 : 5)))
+ if(amount > 2 && prob(perp.slip_chance(perp.m_intent == "run" ? 20 : 5)))
perp.slip(src, 4)
/obj/effect/decal/cleanable/blood/proc/dry()
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index c20522d27fe..b849e3b5284 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -339,8 +339,8 @@
/obj/item/toy/snappop/Crossed(H as mob|obj)
if((ishuman(H))) //i guess carp and shit shouldn't set them off
var/mob/living/carbon/M = H
- if(MOVING_QUICKLY(M))
- to_chat(M, "You step on the snap pop!")
+ if(M.m_intent == "run")
+ to_chat(M, SPAN_WARNING("You step on the snap pop!"))
do_pop()
/obj/item/toy/snappop/proc/do_pop()
diff --git a/code/game/objects/items/weapons/material/caltrops.dm b/code/game/objects/items/weapons/material/caltrops.dm
index a4e5c076eaf..64d02e1b3ad 100644
--- a/code/game/objects/items/weapons/material/caltrops.dm
+++ b/code/game/objects/items/weapons/material/caltrops.dm
@@ -35,7 +35,7 @@
if(H.shoes || H.wear_suit?.body_parts_covered & FEET)
damage_coef -= 0.1
- if(MOVING_QUICKLY(H))
+ if (H.m_intent == "run")
damage_coef += 0.4
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index 1feb4f810ce..8df97c9a342 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -79,7 +79,7 @@
if(istype(A,/mob/living))
var/mob/living/M = A
if(src.wet_type && src.wet_amount)
- if(M.buckled || (src.wet_type == 1 && MOVING_DELIBERATELY(M)))
+ if(M.buckled || (src.wet_type == 1 && M.m_intent == "walk"))
return
//Water
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index afbcd3108c4..faae94076e3 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -253,7 +253,7 @@ var/const/enterloopsanity = 100
if(H.shoes)
var/obj/item/clothing/shoes/S = H.shoes
if(istype(S))
- S.handle_movement(src, MOVING_QUICKLY(H) ? TRUE : FALSE)
+ S.handle_movement(src, H.m_intent == "run" ? TRUE : FALSE)
if(S.track_footprint)
if(S.blood_DNA)
footprint_DNA = S.blood_DNA
diff --git a/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm b/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm
index c21d055542c..a9e618f6ed4 100644
--- a/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm
+++ b/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm
@@ -25,12 +25,6 @@
maxHealth = 33.3
health = 33.3
pass_flags = PASSTABLE
- stamina = 35
- stamina_recovery = 0.5
- move_intents = list(
- /decl/move_intent/walk,
- /decl/move_intent/run
- )
// Decorative head flower.
var/flower_color
@@ -82,8 +76,11 @@
/mob/living/carbon/alien/diona/movement_delay()
. = ..()
- if(MOVING_QUICKLY(src))
- species.handle_sprint_cost(src, . + config.walk_delay)
+ switch(m_intent)
+ if("walk")
+ . += 3
+ if("run")
+ species.handle_sprint_cost(src,.+config.walk_speed)
/mob/living/carbon/alien/diona/ex_act(severity)
if(life_tick < 4)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 61b61e49663..00c1af7f503 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -35,26 +35,20 @@
. = ..()
if(.)
- if(src.stat != DEAD)
- if((move_intent.flags & MOVE_INTENT_EXERTIVE) && src.bodytemperature <= (species ? species.heat_level_1 - 5 : 360))
- bodytemperature += 2
+ if(src.stat != 2)
+ if(src.nutrition)
+ adjustNutritionLoss(nutrition_loss*0.1)
+ if(src.hydration)
+ adjustHydrationLoss(hydration_loss*0.1)
- var/nut_removed = nutrition_loss
- var/hyd_removed = hydration_loss
- if(move_intent.flags & MOVE_INTENT_EXERTIVE)
- nut_removed *= 2
- hyd_removed *= 2
+ if((FAT in src.mutations) && src.m_intent == "run" && src.bodytemperature <= 360)
+ src.bodytemperature += 2
- if(nutrition)
- adjustNutritionLoss(nut_removed*0.1)
- if(hydration)
- adjustHydrationLoss(hyd_removed*0.1)
+ // Moving around increases germ_level faster
+ if(germ_level < GERM_LEVEL_MOVE_CAP && prob(8))
+ germ_level++
- // Moving around increases germ_level faster
- if(germ_level < GERM_LEVEL_MOVE_CAP && prob(8))
- germ_level++
-
- src.help_up_offer = FALSE
+ src.help_up_offer = 0
/mob/living/carbon/relaymove(var/mob/living/user, direction)
if((user in contents) && istype(user))
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index de4d89619ed..b888f9e88da 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -179,7 +179,7 @@
..()
if(statpanel("Status"))
stat("Intent:", "[a_intent]")
- stat("Move Mode:", "[move_intent.name]")
+ stat("Move Mode:", "[m_intent]")
if(emergency_shuttle)
var/eta_status = emergency_shuttle.get_status_panel_eta()
if(eta_status)
@@ -1484,20 +1484,13 @@
burn_mod = species.burn_mod
brute_mod = species.brute_mod
- default_walk_intent = null
- default_run_intent = null
- move_intent = null
- move_intents = species.move_intents.Copy()
- set_move_intent(decls_repository.get_decl(move_intents[1]))
- if(!istype(move_intent))
- set_next_usable_move_intent()
-
max_stamina = species.stamina
stamina = max_stamina
sprint_speed_factor = species.sprint_speed_factor
sprint_cost_factor = species.sprint_cost_factor
stamina_recovery = species.stamina_recovery
+ exhaust_threshold = species.exhaust_threshold
max_nutrition = BASE_MAX_NUTRITION * species.max_nutrition_factor
max_hydration = BASE_MAX_HYDRATION * species.max_hydration_factor
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 88b2f52d73f..f9e296587e0 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -375,7 +375,8 @@
M.do_attack_animation(src)
if(usesStamina)
- M.adjust_stamina(-disarm_cost) //attempting to knock something out of someone's hands, or pushing them over, is exhausting!
+ M.stamina = M.stamina - disarm_cost //attempting to knock something out of someone's hands, or pushing them over, is exhausting!
+ M.stamina = Clamp(M.stamina, 0, M.max_stamina)
else
M.nutrition = M.nutrition - disarm_cost
M.nutrition = Clamp(M.nutrition, 0, M.max_nutrition)
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 0f69363cfb8..84ac6ff7bda 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -1,42 +1,36 @@
-/mob/living/carbon/human
- move_intents = list(/decl/move_intent/walk)
-
/mob/living/carbon/human/movement_delay()
- var/tally = ..()
- tally += species.slowdown
+ var/tally = 0
+ if(species.slowdown)
+ tally = species.slowdown
- var/area/A = get_area(src)
- if(A && !(A.has_gravity()))
- tally -= 1
+ if (istype(loc, /turf/space)) return -1 // It's hard to be slowed down in space by... anything
- if(isopenturf(loc)) //open space checks
+ if (isopenturf(loc)) //open space checks
if(!(locate(/obj/structure/lattice, loc) || locate(/obj/structure/stairs, loc) || locate(/obj/structure/ladder, loc)))
return -1
if(embedded_flag)
handle_embedded_objects() //Moving with objects stuck in you can cause bad times.
+ var/health_deficiency = (100 - health)
+ if(health_deficiency >= 40) tally += (health_deficiency / 25)
+
if(can_feel_pain())
- if(get_shock() >= 10)
- tally += (get_shock() / 10) //pain shouldn't slow you down if you can't even feel it
+ if(get_shock() >= 10) tally += (get_shock() / 10) //pain shouldn't slow you down if you can't even feel it
for(var/obj/item/I in list(wear_suit, w_uniform, back, gloves, head))
tally += I.slowdown
- var/health_deficiency = (maxHealth - health)
- if(health_deficiency >= 40)
- tally += (health_deficiency / 25)
-
if(species)
tally += species.get_species_tally(src)
- if(nutrition < (max_nutrition * 0.2))
+ if (nutrition < (max_nutrition * 0.2))
tally++
if (nutrition < (max_nutrition * 0.1))
tally++
- if(hydration < (max_hydration * 0.2))
+ if (hydration < (max_hydration * 0.2))
tally++
if (hydration < (max_hydration * 0.1))
tally++
@@ -64,41 +58,40 @@
tally += 1.5
if (can_feel_pain())
- if(shock_stage >= 10 || get_stamina() <= 0)
+ if(shock_stage >= 10)
tally += 3
if(is_asystole())
tally += 10 //heart attacks are kinda distracting
- if(aiming && aiming.aiming_at)
- tally += 5 // Iron sights make you slower, it's a well-known fact.
+ if(aiming && aiming.aiming_at) tally += 5 // Iron sights make you slower, it's a well-known fact.
- if(drowsyness)
- tally += 6
+ if (drowsyness) tally += 6
- if(!(species.flags & IS_MECHANICAL)) // Machines don't move slower when cold.
+ if (!(species.flags & IS_MECHANICAL)) // Machines don't move slower when cold.
if(FAT in src.mutations)
tally += 1.5
if (bodytemperature < 283.222)
tally += (283.222 - bodytemperature) / 10 * 1.75
tally += max(2 * stance_damage, 0) //damaged/missing feet or legs is slow
-
if(mRun in mutations)
tally = 0
tally += move_delay_mod
if(tally > 0 && (CE_SPEEDBOOST in chem_effects))
- tally = max(0, tally - 3)
+ tally = max(0, tally-3)
var/turf/T = get_turf(src)
if(T)
tally += T.movement_cost
- tally = round(tally, 1)
+ tally += config.human_delay
- return tally + config.human_delay
+ tally = round(tally,1)
+
+ return tally
/mob/living/carbon/human/Allow_Spacemove(var/check_drift = 0)
@@ -162,7 +155,7 @@
return
last_x = x
last_y = y
- if (MOVING_QUICKLY(src))
+ if (m_intent == "run")
playsound(src, footsound, 70, 1, required_asfx_toggles = ASFX_FOOTSTEPS)
else
footstep++
@@ -176,6 +169,3 @@
/mob/living/carbon/human/mob_negates_gravity()
return (shoes && shoes.negates_gravity())
-
-/mob/living/carbon/human/can_sprint()
- return (stamina > 0)
diff --git a/code/modules/mob/living/carbon/human/intoxication.dm b/code/modules/mob/living/carbon/human/intoxication.dm
index 9d66ba027bf..0a4e2ac09e9 100644
--- a/code/modules/mob/living/carbon/human/intoxication.dm
+++ b/code/modules/mob/living/carbon/human/intoxication.dm
@@ -90,14 +90,14 @@
var/mob/living/carbon/human/H = target
if(istype(H))
H.move_delay_mod += -0.75
- H.sprint_cost_factor += -0.2
+ H.sprint_cost_factor += -0.1
/datum/modifier/buzzed/deactivate()
..()
var/mob/living/carbon/human/H = target
if(istype(H))
H.move_delay_mod -= -0.75
- H.sprint_cost_factor -= -0.2
+ H.sprint_cost_factor -= -0.1
/datum/modifier/buzzed/custom_validity()
var/mob/living/carbon/human/H = target
@@ -116,14 +116,14 @@
var/mob/living/carbon/human/H = target
if(istype(H))
H.move_delay_mod += 2
- H.sprint_cost_factor += 0.4
+ H.sprint_cost_factor += 0.2
/datum/modifier/drunk/deactivate()
..()
var/mob/living/carbon/human/H = target
if(istype(H))
H.move_delay_mod -= 2
- H.sprint_cost_factor -= -0.4
+ H.sprint_cost_factor -= -0.2
/datum/modifier/drunk/custom_validity()
var/mob/living/carbon/human/H = target
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index ab6133d7b6a..5801632680c 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -74,6 +74,7 @@
handle_medical_side_effects()
+ //Handles regenerating stamina if we have sufficient air and no oxyloss
handle_stamina()
if (is_diona())
@@ -84,7 +85,7 @@
handle_stasis_bag()
if(!handle_some_updates())
- return //We go ahead and process them 5 times for HUD images and other stuff though.
+ return //We go ahead and process them 5 times for HUD images and other stuff though.
//Update our name based on whether our face is obscured/disfigured
name = get_visible_name()
@@ -96,30 +97,6 @@
..()
species.handle_npc(src)
-/mob/living/carbon/human/get_stamina()
- return stamina
-
-/mob/living/carbon/human/get_maximum_stamina()
- return max_stamina
-
-/mob/living/carbon/human/adjust_stamina(var/amt)
- var/last_stamina = stamina
- if(stat == DEAD)
- stamina = 0
- else
- stamina = Clamp(stamina + amt, 0, max_stamina)
- if(stamina <= 0)
- to_chat(src, SPAN_WARNING("You are exhausted!"))
- if(MOVING_QUICKLY(src))
- set_moving_slowly()
- if(last_stamina != stamina && hud_used)
- hud_used.move_intent.update_stamina_bar(src)
-
-/mob/living/carbon/human/proc/handle_stamina()
- if((world.time - last_quick_move_time) > 5 SECONDS)
- var/mod = (lying + (nutrition / initial(nutrition))) / 2
- adjust_stamina(max(config.minimum_stamina_recovery, config.maximum_stamina_recovery * mod) * (1+chem_effects[CE_ENERGETIC]))
-
/mob/living/carbon/human/proc/handle_some_updates()
if(life_tick > 5 && timeofdeath && (timeofdeath < 5 || world.time - timeofdeath > 6000)) //We are long dead, or we're junk mobs spawned like the clowns on the clown shuttle
return 0
@@ -1332,6 +1309,38 @@
if(XRAY in mutations)
sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
+/mob/living/carbon/human/proc/handle_stamina()
+ if (species.stamina == -1) //If species stamina is -1, it has special mechanics which will be handled elsewhere
+ return //so quit this function
+
+ if (!exhaust_threshold) // Also quit if there's no exhaust threshold specified, because division by 0 is amazing.
+ return
+
+ if (failed_last_breath || (getOxyLoss() + get_shock()) > exhaust_threshold)//Can't catch our breath if we're suffocating
+ flash_pain()
+ return
+
+ if (nutrition <= 0)
+ if (prob(1.5))
+ to_chat(src, span("warning", "You feel hungry and exhausted, eat something to regain your energy!"))
+ return
+
+ if (hydration <= 0)
+ if (prob(1.5))
+ to_chat(src, span("warning", "You feel thirsty and exhausted, drink something to regain your energy!"))
+ return
+
+ if (stamina != max_stamina)
+ //Any suffocation damage slows stamina regen.
+ //This includes oxyloss from low blood levels
+ var/regen = stamina_recovery * (1 - min(((getOxyLoss()) / exhaust_threshold) + ((get_shock()) / exhaust_threshold), 1))
+ if (regen > 0)
+ stamina = min(max_stamina, stamina+regen)
+ adjustNutritionLoss(stamina_recovery*0.09)
+ adjustHydrationLoss(stamina_recovery*0.32)
+ if (client)
+ hud_used.move_intent.update_move_icon(src)
+
/mob/living/carbon/human/proc/update_oxy_overlay()
var/new_oxy
if(getOxyLoss())
diff --git a/code/modules/mob/living/carbon/human/species/outsider/shadow.dm b/code/modules/mob/living/carbon/human/species/outsider/shadow.dm
index 437ec58e99c..9515a76fc2c 100644
--- a/code/modules/mob/living/carbon/human/species/outsider/shadow.dm
+++ b/code/modules/mob/living/carbon/human/species/outsider/shadow.dm
@@ -79,6 +79,7 @@
stamina = 500 //Tireless automatons
stamina_recovery = 1
sprint_speed_factor = 0.3
+ exhaust_threshold = 0 //No oxyloss, so zero threshold
inherent_verbs = list(
/mob/living/carbon/human/proc/shatter_light,
diff --git a/code/modules/mob/living/carbon/human/species/outsider/undead.dm b/code/modules/mob/living/carbon/human/species/outsider/undead.dm
index 3d45c188491..af33101bdba 100644
--- a/code/modules/mob/living/carbon/human/species/outsider/undead.dm
+++ b/code/modules/mob/living/carbon/human/species/outsider/undead.dm
@@ -85,6 +85,7 @@
stamina = 500 //Tireless automatons
stamina_recovery = 1
sprint_speed_factor = 0.3
+ exhaust_threshold = 0 //No oxyloss, so zero threshold
max_nutrition_factor = -1
@@ -132,6 +133,7 @@
stamina = 500 //Tireless automatons
stamina_recovery = 1
sprint_speed_factor = 0.3
+ exhaust_threshold = 0 //No oxyloss, so zero threshold
max_nutrition_factor = -1
@@ -208,6 +210,7 @@
stamina = 500 //Tireless automatons
stamina_recovery = 1
sprint_speed_factor = 0.3
+ exhaust_threshold = 0 //No oxyloss, so zero threshold
inherent_verbs = list(/mob/living/carbon/human/proc/darkness_eyes)
diff --git a/code/modules/mob/living/carbon/human/species/outsider/vox.dm b/code/modules/mob/living/carbon/human/species/outsider/vox.dm
index cfca626dcff..d285c135c93 100644
--- a/code/modules/mob/living/carbon/human/species/outsider/vox.dm
+++ b/code/modules/mob/living/carbon/human/species/outsider/vox.dm
@@ -98,7 +98,7 @@
stamina = 120 // Vox are even faster than unathi and can go longer, but recover slowly
sprint_speed_factor = 3
stamina_recovery = 1
- sprint_cost_factor = 1.4
+ sprint_cost_factor = 0.7
cold_level_1 = 80
cold_level_2 = 50
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index d2f4517f5c8..006790b4a79 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -165,8 +165,6 @@
var/appearance_flags = 0 // Appearance/display related features.
var/spawn_flags = 0 // Flags that specify who can spawn as this species
var/slowdown = 0 // Passive movement speed malus (or boost, if negative)
- // Move intents. Earlier in list == default for that type of movement.
- var/list/move_intents = list(/decl/move_intent/walk, /decl/move_intent/run, /decl/move_intent/creep)
var/primitive_form // Lesser form, if any (ie. monkey for humans)
var/greater_form // Greater form, if any, ie. human for monkeys.
var/holder_type
@@ -178,6 +176,7 @@
var/stamina_recovery = 3 // Flat amount of stamina species recovers per proc
var/sprint_speed_factor = 0.7 // The percentage of bonus speed you get when sprinting. 0.4 = 40%
var/sprint_cost_factor = 0.9 // Multiplier on stamina cost for sprinting
+ var/exhaust_threshold = 50 // When stamina runs out, the mob takes oxyloss up til this value. Then collapses and drops to walk
var/gluttonous = 0 // Can eat some mobs. Values can be GLUT_TINY, GLUT_SMALLER, GLUT_ANYTHING, GLUT_ITEM_TINY, GLUT_ITEM_NORMAL, GLUT_ITEM_ANYTHING, GLUT_PROJECTILE_VOMIT
var/stomach_capacity = 5 // How much stuff they can stick in their stomach
@@ -509,6 +508,53 @@
return 1
+/datum/species/proc/handle_sprint_cost(var/mob/living/carbon/human/H, var/cost)
+ if (!H.exhaust_threshold)
+ return 1 // Handled.
+
+ cost *= H.sprint_cost_factor
+ if (H.stamina == -1)
+ log_debug("Error: Species with special sprint mechanics has not overridden cost function.")
+ return 0
+
+ var/remainder = 0
+ if (H.stamina > cost)
+ H.stamina -= cost
+ H.hud_used.move_intent.update_move_icon(H)
+ return 1
+ else if (H.stamina > 0)
+ remainder = cost - H.stamina
+ H.stamina = 0
+ else
+ remainder = cost
+
+ if(H.disabilities & ASTHMA)
+ H.adjustOxyLoss(remainder*0.15)
+
+ if(H.disabilities & COUGHING)
+ H.adjustHalLoss(remainder*0.1)
+
+ if (breathing_organ && has_organ[breathing_organ])
+ var/obj/item/organ/O = H.internal_organs_by_name[breathing_organ]
+ if(O.is_bruised())
+ H.adjustOxyLoss(remainder*0.15)
+ H.adjustHalLoss(remainder*0.25)
+
+ H.adjustHalLoss(remainder*0.25)
+ H.updatehealth()
+ if((H.get_shock() >= 10) && prob(H.get_shock() *2))
+ H.flash_pain()
+
+ if ((H.get_shock() + H.getOxyLoss()) >= (exhaust_threshold * 0.8))
+ H.m_intent = "walk"
+ H.hud_used.move_intent.update_move_icon(H)
+ to_chat(H, span("danger", "You're too exhausted to run anymore!"))
+ H.flash_pain()
+ return 0
+
+ H.hud_used.move_intent.update_move_icon(H)
+ return 1
+
/datum/species/proc/get_light_color(mob/living/carbon/human/H)
return
@@ -564,9 +610,3 @@
/datum/species/proc/handle_despawn()
return
-
-/datum/species/proc/has_special_sprint()
- return FALSE
-
-/datum/species/proc/handle_sprint_cost(var/mob/living/carbon/human/H, var/cost)
- return
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/station/diona/diona.dm b/code/modules/mob/living/carbon/human/species/station/diona/diona.dm
index 1a105d9ae13..11eec442ecb 100644
--- a/code/modules/mob/living/carbon/human/species/station/diona/diona.dm
+++ b/code/modules/mob/living/carbon/human/species/station/diona/diona.dm
@@ -111,9 +111,9 @@
reagent_tag = IS_DIONA
- stamina = 1 // Diona sprinting uses energy instead of stamina
- sprint_speed_factor = 0.6 //Speed gained is minor
- sprint_cost_factor = 1.6
+ stamina = -1 // Diona sprinting uses energy instead of stamina
+ sprint_speed_factor = 0.5 //Speed gained is minor
+ sprint_cost_factor = 0.8
climb_coeff = 1.3
vision_organ = BP_HEAD
@@ -122,33 +122,34 @@
allowed_citizenships = list(CITIZENSHIP_BIESEL, CITIZENSHIP_JARGON, CITIZENSHIP_SOL, CITIZENSHIP_COALITION, CITIZENSHIP_DOMINIA, CITIZENSHIP_IZWESKI, CITIZENSHIP_NONE)
allowed_religions = list(RELIGION_QEBLAK, RELIGION_WEISHII, RELIGION_MOROZ, RELIGION_THAKH, RELIGION_SKAKH, RELIGION_NONE, RELIGION_OTHER)
-/datum/species/diona/has_special_sprint()
- return TRUE
-
/datum/species/diona/handle_sprint_cost(var/mob/living/carbon/H, var/cost)
var/datum/dionastats/DS = H.get_dionastats()
if (!DS)
- return //Something is very wrong
+ return 0 //Something is very wrong
var/remainder = cost * H.sprint_cost_factor
if (H.total_radiation && !DS.regening_organ)
if (H.total_radiation > (cost*0.5))//Radiation counts as double energy
H.apply_radiation(cost*(-0.5))
+ return 1
else
remainder = cost - (H.total_radiation*2)
H.total_radiation = 0
if (DS.stored_energy > remainder)
DS.stored_energy -= remainder
+ return 1
else
remainder -= DS.stored_energy
DS.stored_energy = 0
H.adjustHalLoss(remainder*5, 1)
H.updatehealth()
- H.set_moving_slowly()
+ H.m_intent = "walk"
+ H.hud_used.move_intent.update_move_icon(H)
to_chat(H, span("danger", "We have expended our energy reserves, and cannot continue to move at such a pace. We must find light!"))
+ return 0
/datum/species/diona/can_understand(var/mob/other)
var/mob/living/carbon/alien/diona/D = other
diff --git a/code/modules/mob/living/carbon/human/species/station/golem.dm b/code/modules/mob/living/carbon/human/species/station/golem.dm
index 0742f6cb1b2..75930a9f64f 100644
--- a/code/modules/mob/living/carbon/human/species/station/golem.dm
+++ b/code/modules/mob/living/carbon/human/species/station/golem.dm
@@ -85,6 +85,7 @@ var/global/list/golem_types = list("Coal Golem",
stamina = 500 //Tireless automatons
stamina_recovery = 1
sprint_speed_factor = 0.3
+ exhaust_threshold = 0 //No oxyloss, so zero threshold
remains_type = /obj/effect/decal/cleanable/ash
diff --git a/code/modules/mob/living/carbon/human/species/station/human/human.dm b/code/modules/mob/living/carbon/human/species/station/human/human.dm
index 998b2ed9c34..f209c99cbf4 100644
--- a/code/modules/mob/living/carbon/human/species/station/human/human.dm
+++ b/code/modules/mob/living/carbon/human/species/station/human/human.dm
@@ -31,7 +31,7 @@
stamina = 130 // Humans can sprint for longer than any other species
stamina_recovery = 5
sprint_speed_factor = 0.9
- sprint_cost_factor = 1.25
+ sprint_cost_factor = 0.5
grab_mod = 1.25 //humans are wily fuckers - geeves
climb_coeff = 1
diff --git a/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm b/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm
index fec152c6679..726a45a1d2a 100644
--- a/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm
+++ b/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm
@@ -107,8 +107,8 @@
heat_discomfort_strings = list(
"Your CPU temperature probes warn you that you are approaching critical heat levels!"
)
- stamina = 1 // Machines use power and generate heat, stamina is not a thing
- sprint_speed_factor = 0.8 //Slightly slower than a human.
+ stamina = -1 // Machines use power and generate heat, stamina is not a thing
+ sprint_speed_factor = 1 // About as capable of speed as a human
max_hydration_factor = -1
@@ -124,6 +124,21 @@ datum/species/machine/handle_post_spawn(var/mob/living/carbon/human/H)
. = ..()
check_tag(H, H.client)
+/datum/species/machine/handle_sprint_cost(var/mob/living/carbon/human/H, var/cost)
+ if (H.stat == CONSCIOUS)
+ H.bodytemperature += cost * sprint_temperature_factor
+ H.adjustNutritionLoss(cost * sprint_charge_factor)
+ if(H.nutrition <= 0 && H.max_nutrition > 0)
+ H.Weaken(15)
+ H.m_intent = "walk"
+ H.hud_used.move_intent.update_move_icon(H)
+ to_chat(H, span("danger", "ERROR: Power reserves depleted, emergency shutdown engaged. Backup power will come online in approximately 30 seconds, initiate charging as primary directive."))
+ playsound(H.loc, 'sound/machines/buzz-two.ogg', 100, 0)
+ else
+ return 1
+
+ return 0
+
/datum/species/machine/handle_death(var/mob/living/carbon/human/H)
..()
H.f_style = ""
@@ -282,22 +297,6 @@ datum/species/machine/handle_post_spawn(var/mob/living/carbon/human/H)
. = ..()
check_tag(H, H.client)
-/datum/species/machine/has_special_sprint()
- return TRUE
-
-/datum/species/machine/handle_sprint_cost(var/mob/living/carbon/human/H, var/cost)
- if (H.stat == CONSCIOUS)
- H.bodytemperature += cost * sprint_temperature_factor
- H.adjustNutritionLoss(cost * sprint_charge_factor)
- if(H.nutrition <= 0 && H.max_nutrition > 0)
- H.Weaken(15)
- H.set_moving_slowly()
- to_chat(H, span("danger", "ERROR: Power reserves depleted, emergency shutdown engaged. Backup power will come online in approximately 30 seconds, initiate charging as primary directive."))
- playsound(get_turf(H), 'sound/machines/buzz-two.ogg', 100, 0)
- else
- return
- return
-
/datum/species/machine/handle_death_check(var/mob/living/carbon/human/H)
if(H.get_total_health() <= config.health_threshold_dead)
return TRUE
diff --git a/code/modules/mob/living/carbon/human/species/station/tajara/tajara.dm b/code/modules/mob/living/carbon/human/species/station/tajara/tajara.dm
index 1383178c03b..236a7c57554 100644
--- a/code/modules/mob/living/carbon/human/species/station/tajara/tajara.dm
+++ b/code/modules/mob/living/carbon/human/species/station/tajara/tajara.dm
@@ -32,7 +32,7 @@
stamina = 90 // Tajara evolved to maintain a steady pace in the snow, sprinting wastes energy
stamina_recovery = 4
sprint_speed_factor = 0.65
- sprint_cost_factor = 1.5
+ sprint_cost_factor = 0.75
blurb = "The Tajaran race is a species of feline-like bipeds hailing from the planet of Adhomai in the S'rendarr \
system. They have been brought up into the space age by the Humans and Skrell, who alledgedly influenced their \
diff --git a/code/modules/mob/living/carbon/human/species/station/unathi/unathi.dm b/code/modules/mob/living/carbon/human/species/station/unathi/unathi.dm
index de54d35bd60..304f3377c13 100644
--- a/code/modules/mob/living/carbon/human/species/station/unathi/unathi.dm
+++ b/code/modules/mob/living/carbon/human/species/station/unathi/unathi.dm
@@ -36,8 +36,9 @@
stamina = 120 // Unathi have the shortest but fastest sprint of all
stamina_recovery = 5
- sprint_cost_factor = 7
+ sprint_cost_factor = 1.45
sprint_speed_factor = 3.2
+ exhaust_threshold = 65
rarity_value = 3
breakcuffs = list(MALE)
diff --git a/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca.dm b/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca.dm
index c4a6b432150..5e3af7d03e2 100644
--- a/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca.dm
+++ b/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca.dm
@@ -89,7 +89,7 @@
stamina = 100 // Long period of sprinting, but relatively low speed gain
sprint_speed_factor = 0.7
- sprint_cost_factor = 0.6
+ sprint_cost_factor = 0.30
stamina_recovery = 2 //slow recovery
has_organ = list(
diff --git a/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca_subspecies.dm b/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca_subspecies.dm
index 0955f39a7c1..e1a809ee9c1 100644
--- a/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca_subspecies.dm
+++ b/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca_subspecies.dm
@@ -31,7 +31,7 @@
stamina = 115
sprint_speed_factor = 1.0
- sprint_cost_factor = 0.8
+ sprint_cost_factor = 0.40
stamina_recovery = 3
@@ -70,7 +70,7 @@
stamina = 175
sprint_speed_factor = 1
- sprint_cost_factor = 1.6
+ sprint_cost_factor = 0.80
stamina_recovery = 3
spawn_flags = IS_RESTRICTED
@@ -126,7 +126,7 @@
stamina = 200
stamina_recovery = 5
sprint_speed_factor = 0.9
- sprint_cost_factor = 1.0
+ sprint_cost_factor = 0.5
heat_level_1 = 1000 //Default 360
heat_level_2 = 4000 //Default 400
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index a676e8aae6a..d6b4fd9db91 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -1112,8 +1112,11 @@ There are several things that need to be remembered:
standing = image('icons/mob/mob.dmi', "legcuff1")
overlays_raw[LEGCUFF_LAYER] = standing
- if(!MOVING_DELIBERATELY(src))
- set_moving_slowly()
+ if(m_intent != "walk")
+ m_intent = "walk"
+ if(hud_used && hud_used.move_intent)
+ hud_used.move_intent.icon_state = "walking"
+
else
overlays_raw[LEGCUFF_LAYER] = null
diff --git a/code/modules/mob/living/carbon/resist.dm b/code/modules/mob/living/carbon/resist.dm
index 652b9cf0341..decc282ae87 100644
--- a/code/modules/mob/living/carbon/resist.dm
+++ b/code/modules/mob/living/carbon/resist.dm
@@ -202,7 +202,7 @@
if((isunathi(src)) || (HULK in mutations))
say(pick("RAAAAAAAARGH!", "HNNNNNNNNNGGGGGGH!", "GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", "AAAAAAARRRGH!" ))
- stamina = max(0, (stamina - 100)) //takes a bunch of stamina
+ stamina -= 100 //takes a bunch of stamina
qdel(handcuffed)
handcuffed = null
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index cfc552cd9eb..e6efd4810ec 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -140,12 +140,7 @@ default behaviour is:
now_pushing = FALSE
spawn(0)
. = ..()
- if (!istype(AM, /atom/movable) || AM.anchored)
- if(confused && prob(50) && !MOVING_DELIBERATELY(src))
- Weaken(2)
- playsound(loc, "punch", 25, 1, -1)
- visible_message(SPAN_WARNING("\The [src] [pick("ran", "slammed")] into \the [AM]!"))
- src.apply_damage(5, BRUTE)
+ if (!istype(AM, /atom/movable))
return
if (!now_pushing)
now_pushing = TRUE
@@ -949,4 +944,4 @@ default behaviour is:
if(auras)
for(var/a in auras)
remove_aura(a)
- return ..()
+ return ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index c2b97d91887..80309f1bc12 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -49,12 +49,13 @@
//These values are duplicated from the species datum so we can handle things on a per-mob basis, allows for chemicals to affect them
var/stamina = 0
- var/max_stamina = 100 //Maximum stamina.
+ var/max_stamina = 100//Maximum stamina. We start taking oxyloss when this runs out while sprinting
var/sprint_speed_factor = 0.4
var/sprint_cost_factor = 1
var/stamina_recovery = 1
var/min_walk_delay = 0//When move intent is walk, movedelay is clamped to this value as a lower bound
- var/datum/progressbar/stamina_bar
+ var/exhaust_threshold = 50
+ var/datum/progressbar/stamina_bar // Progress bar shown when stamina is not at full, and the mob supports stamina. Deleted on Logout or when stamina is full.
var/move_delay_mod = 0//Added to move delay, used for calculating movement speeds. Provides a centralised value for modifiers to alter
diff --git a/code/modules/mob/living/living_powers.dm b/code/modules/mob/living/living_powers.dm
index b9cda4ce341..35021b6d1dc 100644
--- a/code/modules/mob/living/living_powers.dm
+++ b/code/modules/mob/living/living_powers.dm
@@ -20,7 +20,7 @@
//First a quick block of code to calculate our normal/best movedelay
- var/delay = config.walk_delay + movement_delay()
+ var/delay = config.walk_speed + movement_delay()
var/speed = 1 / (delay/10)
var/newspeed
var/list/options = list("No limit",speed*0.95,speed*0.9,speed*0.85,speed*0.8,speed*0.7,speed*0.6,speed*0.5, "Custom")
diff --git a/code/modules/mob/living/logout.dm b/code/modules/mob/living/logout.dm
index facc6f0976e..b0d5f2f172d 100644
--- a/code/modules/mob/living/logout.dm
+++ b/code/modules/mob/living/logout.dm
@@ -1,7 +1,7 @@
/mob/living/Logout()
- ..()
- if(stamina_bar)
+ if (stamina_bar)
QDEL_NULL(stamina_bar)
+ ..()
if (mind)
//Per BYOND docs key remains set if the player DCs, becomes null if switching bodies.
if(!key) //key and mind have become seperated.
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 0af846407ab..132503c27c4 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -112,7 +112,7 @@
light_wedge = 45
/mob/living/silicon/pai/movement_delay()
- return 4
+ return 0.8
/mob/living/silicon/pai/attack_hand(mob/living/carbon/human/M)
..()
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index b1c0602f4e9..6ad435bca6f 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -114,8 +114,6 @@
var/list/butchering_products //if anything else is created when butchering this creature, like bones and leather
- move_intent = /decl/move_intent/walk/animal
-
/mob/living/simple_animal/proc/update_nutrition_stats()
nutrition_step = mob_size * 0.03 * metabolic_factor
@@ -483,9 +481,9 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj)
/mob/living/simple_animal/movement_delay()
- var/tally = ..()
+ var/tally = 0 //Incase I need to add stuff other than "speed" later
- tally += speed
+ tally = speed
if(purge)//Purged creatures will move more slowly. The more time before their purge stops, the slower they'll move.
if(tally <= 0)
tally = 1
@@ -494,7 +492,7 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj)
if (!nutrition)
tally += 4
- return tally + config.animal_delay
+ return tally+config.animal_delay
/mob/living/simple_animal/cat/proc/handle_movement_target()
//if our target is neither inside a turf or inside a human(???), stop
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 0850fd77b72..d571f8b477a 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -74,14 +74,10 @@
dead_mob_list += src
else
living_mob_list += src
+
if (!ckey && mob_thinks)
MOB_START_THINKING(src)
- if(!move_intent)
- move_intent = move_intents[1]
- if(ispath(move_intent))
- move_intent = decls_repository.get_decl(move_intent)
-
/mob/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2)
if(!client) return
@@ -211,7 +207,7 @@
return 0
/mob/proc/movement_delay()
- . = move_intent.move_delay
+ return 0
/mob/proc/Life()
return
@@ -219,7 +215,6 @@
#define UNBUCKLED 0
#define PARTIALLY_BUCKLED 1
#define FULLY_BUCKLED 2
-
/mob/proc/buckled()
// Preliminary work for a future buckle rewrite,
// where one might be fully restrained (like an elecrical chair), or merely secured (shuttle chair, keeping you safe but not otherwise restrained from acting)
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 5aa5c5839b8..b3135576dbb 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -6,7 +6,7 @@
sight = DEFAULT_SIGHT
var/datum/mind/mind
- var/stat = CONSCIOUS //Whether a mob is alive or dead. TODO: Move this to living - Nodrak
+ var/stat = 0 //Whether a mob is alive or dead. TODO: Move this to living - Nodrak
var/can_buckle = TRUE
var/obj/screen/flash = null
@@ -132,6 +132,7 @@
var/intent = null//Living
var/shakecamera = 0
var/a_intent = I_HELP//Living
+ var/m_intent = "walk"//Living
var/lastKnownIP = null
var/obj/buckled = null//Living
var/obj/item/l_hand = null//Living
@@ -141,13 +142,6 @@
var/obj/item/storage/s_active = null//Carbon
var/obj/item/clothing/mask/wear_mask = null//Carbon
- var/decl/move_intent/move_intent = /decl/move_intent/walk
- var/list/move_intents = list(/decl/move_intent/walk)
-
- var/decl/move_intent/default_walk_intent
- var/decl/move_intent/default_run_intent
- var/last_quick_move_time = 0
-
var/seer = 0 //for cult//Carbon, probably Human
var/datum/hud/hud_used = null
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index ca6bec730b3..6d73cefa615 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -229,6 +229,9 @@
if(!mob.canmove)
return
+ //if(istype(mob.loc, /turf/space) || (mob.flags & NOGRAV))
+ // if(!mob.Process_Spacemove(0)) return 0
+
if(!mob.lastarea)
mob.lastarea = get_area(mob.loc)
@@ -242,6 +245,7 @@
else
mob.inertia_dir = 0 //If not then we can reset inertia and move
+
if(mob.restrained()) //Why being pulled while cuffed prevents you from moving
for(var/mob/M in range(mob, 1))
if(M.pulling == mob)
@@ -281,27 +285,28 @@
//drunk wheelchair driving
if(mob.confused && prob(25))
direct = pick(cardinal)
- move_delay += max((mob.movement_delay() + config.walk_delay) * config.walk_delay_multiplier, min_move_delay)
+ move_delay += max((mob.movement_delay() + config.walk_speed) * config.walk_delay_multiplier, min_move_delay)
return mob.buckled.relaymove(mob,direct)
- var/tally = mob.movement_delay()
- var/mob_is_human = ishuman(mob) //Calculate this once to reuse it later.
+ var/tally = mob.movement_delay() + config.walk_speed
- if(mob_is_human)
+ // Apply human specific modifiers.
+ var/mob_is_human = ishuman(mob) // Only check this once and just reuse the value.
+ if (mob_is_human)
var/mob/living/carbon/human/H = mob
- if(MOVING_QUICKLY(H))
- if(H.species.has_special_sprint())
- H.species.handle_sprint_cost(H, tally)
- else
- H.adjust_stamina(-(H.get_stamina_used_per_step()))
+ //If we're sprinting and able to continue sprinting, then apply the sprint bonus ontop of this
+ if (H.m_intent == "run" && H.species.handle_sprint_cost(H, tally)) //This will return false if we collapse from exhaustion
tally = (tally / (1 + H.sprint_speed_factor)) * config.run_delay_multiplier
- H.last_quick_move_time = world.time
else
- tally = max(tally * config.walk_delay_multiplier, H.min_walk_delay)
+ tally = max(tally * config.walk_delay_multiplier, H.min_walk_delay) //clamp walking speed if its limited
+ else
+ tally *= config.walk_delay_multiplier
+
move_delay += tally
var/tickcomp = 0 //moved this out here so we can use it for vehicles
if(config.Tickcomp)
+ // move_delay -= 1.3 //~added to the tickcomp calculation below
tickcomp = ((1/(world.tick_lag))*1.3) - 1.3
move_delay = move_delay + tickcomp
@@ -342,10 +347,10 @@
if(mob != M)
M.animate_movement = 3
for(var/mob/M in L)
- spawn(0)
+ spawn( 0 )
step(M, direct)
return
- spawn(1)
+ spawn( 1 )
M.other_mobs = null
M.animate_movement = 2
return
@@ -355,12 +360,12 @@
else
. = mob.SelfMove(n, direct)
- for(var/obj/item/grab/G in list(mob:l_hand, mob:r_hand))
+ for (var/obj/item/grab/G in list(mob:l_hand, mob:r_hand))
if (G.state == GRAB_NECK)
mob.set_dir(reverse_dir[direct])
G.adjust_position()
- for(var/obj/item/grab/G in mob.grabbed_by)
+ for (var/obj/item/grab/G in mob.grabbed_by)
G.adjust_position()
moving = 0
@@ -369,12 +374,6 @@
var/atom/O = mob.loc
return O.relaymove(mob, direct)
-/mob/proc/get_stamina_used_per_step()
- return 1
-
-/mob/living/carbon/human/get_stamina_used_per_step()
- return sprint_cost_factor
-
/mob/proc/SelfMove(turf/n, direct)
return Move(n, direct)
@@ -551,96 +550,3 @@
/mob/proc/mob_negates_gravity()
return 0
-
-/mob/proc/set_next_usable_move_intent()
- var/checking_intent = (istype(move_intent) ? move_intent.type : move_intents[1])
- for(var/i = 1 to length(move_intents)) // One full iteration of the move set.
- checking_intent = next_in_list(checking_intent, move_intents)
- if(set_move_intent(decls_repository.get_decl(checking_intent)))
- return
-
-/mob/proc/set_move_intent(var/decl/move_intent/next_intent)
- if(next_intent && move_intent != next_intent && next_intent.can_be_used_by(src))
- move_intent = next_intent
- if(hud_used)
- hud_used.move_intent.icon_state = move_intent.hud_icon_state
- return TRUE
- return FALSE
-
-/mob/proc/get_movement_datum_by_flag(var/move_flag = MOVE_INTENT_DELIBERATE)
- for(var/m_intent in move_intents)
- var/decl/move_intent/check_move_intent = decls_repository.get_decl(m_intent)
- if(check_move_intent.flags & move_flag)
- return check_move_intent
-
-/mob/proc/get_movement_datum_by_missing_flag(var/move_flag = MOVE_INTENT_DELIBERATE)
- for(var/m_intent in move_intents)
- var/decl/move_intent/check_move_intent = decls_repository.get_decl(m_intent)
- if(!(check_move_intent.flags & move_flag))
- return check_move_intent
-
-/mob/proc/get_movement_datums_by_flag(var/move_flag = MOVE_INTENT_DELIBERATE)
- . = list()
- for(var/m_intent in move_intents)
- var/decl/move_intent/check_move_intent = decls_repository.get_decl(m_intent)
- if(check_move_intent.flags & move_flag)
- . += check_move_intent
-
-/mob/proc/get_movement_datums_by_missing_flag(var/move_flag = MOVE_INTENT_DELIBERATE)
- . = list()
- for(var/m_intent in move_intents)
- var/decl/move_intent/check_move_intent = decls_repository.get_decl(m_intent)
- if(!(check_move_intent.flags & move_flag))
- . += check_move_intent
-
-/mob/verb/SetDefaultWalk()
- set name = "Set Default Walk"
- set desc = "Select your default walking style."
- set category = "IC"
- var/choice = input(usr, "Select a default walk.", "Set Default Walk") as null|anything in get_movement_datums_by_missing_flag(MOVE_INTENT_QUICK)
- if(choice && (choice in get_movement_datums_by_missing_flag(MOVE_INTENT_QUICK)))
- default_walk_intent = choice
- to_chat(src, "You will now default to [default_walk_intent] when moving deliberately.")
-
-/mob/verb/SetDefaultRun()
- set name = "Set Default Run"
- set desc = "Select your default running style."
- set category = "IC"
- var/choice = input(usr, "Select a default run.", "Set Default Run") as null|anything in get_movement_datums_by_flag(MOVE_INTENT_QUICK)
- if(choice && (choice in get_movement_datums_by_flag(MOVE_INTENT_QUICK)))
- default_run_intent = choice
- to_chat(src, "You will now default to [default_run_intent] when moving quickly.")
-
-/client/verb/setmovingslowly()
- set hidden = 1
- if(mob)
- mob.set_moving_slowly()
-
-/mob/proc/set_moving_slowly()
- if(!default_walk_intent)
- default_walk_intent = get_movement_datum_by_missing_flag(MOVE_INTENT_QUICK)
- if(default_walk_intent && move_intent != default_walk_intent)
- set_move_intent(default_walk_intent)
-
-/client/verb/setmovingquickly()
- set hidden = 1
- if(mob)
- mob.set_moving_quickly()
-
-/mob/proc/set_moving_quickly()
- if(!default_run_intent)
- default_run_intent = get_movement_datum_by_flag(MOVE_INTENT_QUICK)
- if(default_run_intent && move_intent != default_run_intent)
- set_move_intent(default_run_intent)
-
-/mob/proc/can_sprint()
- return FALSE
-
-/mob/proc/adjust_stamina(var/amt)
- return
-
-/mob/proc/get_stamina()
- return 100
-
-/mob/proc/get_maximum_stamina()
- return 100
diff --git a/code/modules/tables/interactions.dm b/code/modules/tables/interactions.dm
index 38a58642ffb..e586587924a 100644
--- a/code/modules/tables/interactions.dm
+++ b/code/modules/tables/interactions.dm
@@ -61,7 +61,7 @@
..()
if(ishuman(am))
var/mob/living/carbon/human/H = am
- if(H.a_intent != I_HELP || MOVING_QUICKLY(H))
+ if(H.a_intent != I_HELP || H.m_intent == "run")
throw_things(H)
else if(H.is_diona() || H.species.get_bodytype() == "Heavy Machine")
throw_things(H)
@@ -117,7 +117,7 @@
)
if(ishuman(user))
var/mob/living/carbon/human/H = user
- if(H.a_intent != I_HELP || MOVING_QUICKLY(H))
+ if(H.a_intent != I_HELP || H.m_intent == "run")
throw_things(H)
else if(H.is_diona() || H.species.get_bodytype() == "Heavy Machine")
throw_things(H)
diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm
index 0fa638a1ed5..3a750cfd6ec 100644
--- a/code/modules/vehicles/cargo_train.dm
+++ b/code/modules/vehicles/cargo_train.dm
@@ -358,7 +358,7 @@
else
move_delay = max(0, (-car_limit * active_engines) + train_length - active_engines) //limits base overweight so you cant overspeed trains
move_delay *= (1 / max(1, active_engines)) * 2 //overweight penalty (scaled by the number of engines)
- move_delay += config.walk_delay //base reference speed
+ move_delay += config.walk_speed //base reference speed
move_delay *= config.vehicle_delay_multiplier //makes cargo trains 10% slower than running when not overweight
/obj/vehicle/train/cargo/trolley/update_car(var/train_length, var/active_engines)
diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm
index d401161dde7..fb36598d1b8 100644
--- a/code/modules/vehicles/vehicle.dm
+++ b/code/modules/vehicles/vehicle.dm
@@ -356,7 +356,7 @@
// Yes, it's not the full calculation. But it's relatively close, and will make it seamless.
/obj/vehicle/post_buckle_mob(var/mob/M)
if (M.client)
- M.client.move_delay = M.movement_delay() + config.walk_delay
+ M.client.move_delay = M.movement_delay() + config.walk_speed
//-------------------------------------------------------
// Stat update procs
diff --git a/config/example/game_options.txt b/config/example/game_options.txt
index 7ef67b463c4..ad019656502 100644
--- a/config/example/game_options.txt
+++ b/config/example/game_options.txt
@@ -46,13 +46,7 @@ REVIVAL_BRAIN_LIFE -1
## This will globally modify the movement speed of all mobs.
## Note that it can do so unproportionally, meaning you'll lose the relationships between the different species. As such, modifying the delay multipliers below should be preferred.
-RUN_DELAY 4
-WALK_DELAY 4
-CREEP_DELAY 6
-
-## The following two values will determine the stamina recovery speed of a mob.
-MINIMUM_STAMINA_RECOVERY 1
-MAXIMUM_STAMINA_RECOVERY 3
+WALK_SPEED 4
## The following two will globally affect all movement speed, while retaining the proportional relationships between the different mob's movement speeds.
## Ideally, you want to modify these. Any value between 0 and 1 will increase speed by decreasing the movement delay, anything above 1 will slow everyone down by increasing the delay.
@@ -62,11 +56,11 @@ VEHICLE_DELAY_MULTIPLIER 1
## The variables below affect the movement of specific mob types.
HUMAN_DELAY 0
-ROBOT_DELAY 0
-MONKEY_DELAY 0
-ALIEN_DELAY 0
-METROID_DELAY 0
-ANIMAL_DELAY 0
+ROBOT_DELAY 1
+MONKEY_DELAY 1
+ALIEN_DELAY 1
+METROID_DELAY 1
+ANIMAL_DELAY 1
### Miscellaneous ###
diff --git a/icons/mob/screen/midnight.dmi b/icons/mob/screen/midnight.dmi
index 4fbee45372f..2493361c8c3 100644
Binary files a/icons/mob/screen/midnight.dmi and b/icons/mob/screen/midnight.dmi differ
diff --git a/icons/mob/screen/old-noborder.dmi b/icons/mob/screen/old-noborder.dmi
index 61887ae8ef7..d6d7775e485 100644
Binary files a/icons/mob/screen/old-noborder.dmi and b/icons/mob/screen/old-noborder.dmi differ
diff --git a/icons/mob/screen/old.dmi b/icons/mob/screen/old.dmi
index 4bb38831d48..8cd2cc252cc 100644
Binary files a/icons/mob/screen/old.dmi and b/icons/mob/screen/old.dmi differ
diff --git a/icons/mob/screen/orange.dmi b/icons/mob/screen/orange.dmi
index f1cdf5a75f6..8135b9141ec 100644
Binary files a/icons/mob/screen/orange.dmi and b/icons/mob/screen/orange.dmi differ
diff --git a/icons/mob/screen/white.dmi b/icons/mob/screen/white.dmi
index 292fc33b5cb..e6438cb60e4 100644
Binary files a/icons/mob/screen/white.dmi and b/icons/mob/screen/white.dmi differ
diff --git a/interface/dark.dmf b/interface/dark.dmf
index bdfb16806d1..ff55e2ee6b5 100644
--- a/interface/dark.dmf
+++ b/interface/dark.dmf
@@ -627,12 +627,6 @@ macro "hotkeymode"
elem
name = "."
command = "move-down"
- elem
- name = "SHIFT"
- command = "setmovingquickly"
- elem
- name = "SHIFT+UP"
- command = "setmovingslowly"
macro "borgmacro"
elem
diff --git a/interface/skin.dmf b/interface/skin.dmf
index fc2280a1bdb..7796e8d0617 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -627,12 +627,6 @@ macro "hotkeymode"
elem
name = "."
command = "move-down"
- elem
- name = "SHIFT"
- command = "setmovingquickly"
- elem
- name = "SHIFT+UP"
- command = "setmovingslowly"
macro "borgmacro"
elem