Files
Bubberstation/code/modules/mob/mob_defines.dm
T
LemonInTheDark 5aab9dd88a Saves roughly 20% off living/Life(), makes gravity event based (#74084)
## About The Pull Request

Right now, each time life processes we need to run has_gravity, and
check its output against a bunch of thresholds.
We could save off that second bit by caching the previous value, but
we'd still be only updating this every 2 seconds.

This potentially delayed updating leads to really janky feeling behavior
around transition points too (like when moving on/off the sand on tram
station)

So instead of doing this updating off life(), let's make it event based.
We'll decompose has_gravity, and take all the values it relies on, and
check for them changing ourselves.
That way we get instant response, and can save all the wasted
has_gravity calls.

This constant checking on movement adds a few signal registrations, a
connect_loc, and some logic on living/Moved

The Moved logic increases Moved's self by 50%, roughly 1 second a round
at worst.
Don't have concrete numbers for the connect_loc

(new self / old self)

![image](https://user-images.githubusercontent.com/58055496/226091990-8cbeef82-6a37-488c-a0b6-cf570156c2dc.png)

In constrast, handle_gravity is currently on average maybe 15 seconds.


![image](https://user-images.githubusercontent.com/58055496/226092056-5fc7fc59-46e2-4e01-a6ee-6867de30c1f0.png)

I could JUST save maybe 13 seconds and not spend the 1 by storing the
previous gravity value, but I think this is worth the ux changes. It
does add some extra resistance to change, but s much nice.

Moved some functions around too, and removed now redundant
update_gravity calls

## Why It's Good For The Game

Snappier gravity, faster Life()

## Changelog
🆑
qol: Human gravity will react to changes instantly, instead of waiting
for the next process tick. Hopefully this feels better and not worse
/🆑
2023-03-25 22:44:27 -06:00

232 lines
8.8 KiB
Plaintext

/**
* The mob, usually meant to be a creature of some type
*
* Has a client attached that is a living person (most of the time), although I have to admit
* sometimes it's hard to tell they're sentient
*
* Has a lot of the creature game world logic, such as health etc
*/
/mob
density = TRUE
layer = MOB_LAYER
plane = GAME_PLANE_FOV_HIDDEN
animate_movement = SLIDE_STEPS
hud_possible = list(ANTAG_HUD)
pressure_resistance = 8
mouse_drag_pointer = MOUSE_ACTIVE_POINTER
throwforce = 10
blocks_emissive = EMISSIVE_BLOCK_GENERIC
pass_flags_self = PASSMOB
// we never want to hide a turf because it's not lit
// We can rely on the lighting plane to handle that for us
see_in_dark = 1e6
/// The current client inhabiting this mob. Managed by login/logout
/// This exists so we can do cleanup in logout for occasions where a client was transfere rather then destroyed
/// We need to do this because the mob on logout never actually has a reference to client
/// We also need to clear this var/do other cleanup in client/Destroy, since that happens before logout
/// HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
var/client/canon_client
var/shift_to_open_context_menu = TRUE
/// Percentage of how much rgb to max the lighting plane at
/// This lets us brighten it without washing out color
/// Scale from 0-100, reset off update_sight()
var/lighting_cutoff = LIGHTING_CUTOFF_VISIBLE
// Individual color max for red, we can use this to color darkness without tinting the light
var/lighting_cutoff_red = 0
// Individual color max for green, we can use this to color darkness without tinting the light
var/lighting_cutoff_green = 0
// Individual color max for blue, we can use this to color darkness without tinting the light
var/lighting_cutoff_blue = 0
/// A list of red, green and blue cutoffs
/// This is what actually gets applied to the mob, it's modified by things like glasses
var/list/lighting_color_cutoffs = null
var/datum/mind/mind
var/static/next_mob_id = 0
/// List of movement speed modifiers applying to this mob
var/list/movespeed_modification //Lazy list, see mob_movespeed.dm
/// List of movement speed modifiers ignored by this mob. List -> List (id) -> List (sources)
var/list/movespeed_mod_immunities //Lazy list, see mob_movespeed.dm
/// The calculated mob speed slowdown based on the modifiers list
var/cached_multiplicative_slowdown
/// List of action speed modifiers applying to this mob
var/list/actionspeed_modification //Lazy list, see mob_movespeed.dm
/// List of action speed modifiers ignored by this mob. List -> List (id) -> List (sources)
var/list/actionspeed_mod_immunities //Lazy list, see mob_movespeed.dm
/// The calculated mob action speed slowdown based on the modifiers list
var/cached_multiplicative_actions_slowdown
/// List of action hud items the user has
var/list/datum/action/actions
/// A list of chameleon actions we have specifically
/// This can be unified with the actions list
var/list/datum/action/item_action/chameleon/chameleon_item_actions
///Cursor icon used when holding shift over things
var/examine_cursor_icon = 'icons/effects/mouse_pointers/examine_pointer.dmi'
/// Whether a mob is alive or dead. TODO: Move this to living - Nodrak (2019, still here)
var/stat = CONSCIOUS
/* A bunch of this stuff really needs to go under their own defines instead of being globally attached to mob.
A variable should only be globally attached to turfs/objects/whatever, when it is in fact needed as such.
The current method unnecessarily clusters up the variable list, especially for humans (although rearranging won't really clean it up a lot but the difference will be noticable for other mobs).
I'll make some notes on where certain variable defines should probably go.
Changing this around would probably require a good look-over the pre-existing code.
*/
/// The zone this mob is currently targeting
var/zone_selected = BODY_ZONE_CHEST
var/computer_id = null
var/list/logging = list()
/// The machine the mob is interacting with (this is very bad old code btw)
var/obj/machinery/machine = null
/// Tick time the mob can next move
var/next_move = null
/**
* Magic var that stops you moving and interacting with anything
*
* Set when you're being turned into something else and also used in a bunch of places
* it probably shouldn't really be
*/
var/notransform = null //Carbon
/// What is the mobs real name (name is overridden for disguises etc)
var/real_name = null
/**
* back up of the real name during admin possession
*
* If an admin possesses an object it's real name is set to the admin name and this
* stores whatever the real name was previously. When possession ends, the real name
* is reset to this value
*/
var/name_archive //For admin things like possession
/// Default body temperature
var/bodytemperature = BODYTEMP_NORMAL //310.15K / 98.6F
/// Our body temperatue as of the last process, prevents pointless work when handling alerts
var/old_bodytemperature = 0
/// Hunger level of the mob
var/nutrition = NUTRITION_LEVEL_START_MIN // randomised in Initialize
/// Satiation level of the mob
var/satiety = 0//Carbon
/// How many ticks this mob has been over reating
var/overeatduration = 0 // How long this guy is overeating //Carbon
/// The movement intent of the mob (run/wal)
var/m_intent = MOVE_INTENT_RUN//Living
/// The last known IP of the client who was in this mob
var/lastKnownIP = null
/// movable atom we are buckled to
var/atom/movable/buckled = null//Living
//Hands
///What hand is the active hand
var/active_hand_index = 1
/**
* list of items held in hands
*
* len = number of hands, eg: 2 nulls is 2 empty hands, 1 item and 1 null is 1 full hand
* and 1 empty hand.
*
* NB: contains nulls!
*
* `held_items[active_hand_index]` is the actively held item, but please use
* [get_active_held_item()][/mob/proc/get_active_held_item] instead, because OOP
*/
var/list/held_items = list()
//HUD things
/// Storage component (for mob inventory)
var/datum/storage/active_storage
/// Active hud
var/datum/hud/hud_used = null
/// Is the mob throw intent on
var/throw_mode = THROW_MODE_DISABLED
/// What job does this mob have
var/job = null//Living
/// A list of factions that this mob is currently in, for hostile mob targetting, amongst other things
var/list/faction = list(FACTION_NEUTRAL)
/// Can this mob enter shuttles
var/move_on_shuttle = 1
///A weakref to the last mob/living/carbon to push/drag/grab this mob (exclusively used by slimes friend recognition)
var/datum/weakref/LAssailant = null
/// bitflags defining which status effects can be inflicted (replaces canknockdown, canstun, etc)
var/status_flags = CANSTUN|CANKNOCKDOWN|CANUNCONSCIOUS|CANPUSH
/// Can they interact with station electronics
var/has_unlimited_silicon_privilege = FALSE
///Used by admins to possess objects. All mobs should have this var
var/obj/control_object
///Calls relay_move() to whatever this is set to when the mob tries to move
var/atom/movable/remote_control
///the current turf being examined in the stat panel
var/turf/listed_turf = null
///The list of people observing this mob.
var/list/observers = null
///List of progress bars this mob is currently seeing for actions
var/list/progressbars = null //for stacking do_after bars
///For storing what do_after's someone has, key = string, value = amount of interactions of that type happening.
var/list/do_afters
///Allows a datum to intercept all click calls this mob is the source of
var/datum/click_intercept
///THe z level this mob is currently registered in
var/registered_z = null
var/memory_throttle_time = 0
/// Contains [/atom/movable/screen/alert] only.
///
/// On [/mob] so clientless mobs will throw alerts properly.
var/list/alerts = list()
var/list/screens = list()
var/list/client_colours = list()
var/hud_type = /datum/hud
var/datum/focus //What receives our keyboard inputs. src by default
/// Used for tracking last uses of emotes for cooldown purposes
var/list/emotes_used
///Whether the mob is updating glide size when movespeed updates or not
var/updating_glide_size = TRUE
///Override for sound_environments. If this is set the user will always hear a specific type of reverb (Instead of the area defined reverb)
var/sound_environment_override = SOUND_ENVIRONMENT_NONE
/// A mock client, provided by tests and friends
var/datum/client_interface/mock_client
var/interaction_range = 0 //how far a mob has to be to interact with something without caring about obsctruction, defaulted to 0 tiles
///the icon currently used for the typing indicator's bubble
var/active_typing_indicator
///the icon currently used for the thinking indicator's bubble
var/active_thinking_indicator
/// User is thinking in character. Used to revert to thinking state after stop_typing
var/thinking_IC = FALSE