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