code/modules/movespeed/_movespeed_modifier.dm
Movespeed modification datums.
Move speed is now calculated by using modifier datums which are added to mobs. Some of them (nonvariable ones) are globally cached, the variable ones are instanced and changed based on need. This gives us the ability to have multiple sources of movespeed, reliabily keep them applied and remove them when they should be THey can have unique sources and a bunch of extra fancy flags that control behaviour Previously trying to update move speed was a shot in the dark that usually meant mobs got stuck going faster or slower Movespeed modification list is a simple key = datum system. Key will be the datum's ID if it is overridden to not be null, or type if it is not. DO NOT override datum IDs unless you are going to have multiple types that must overwrite each other. It's more efficient to use types, ID functionality is only kept for cases where dynamic creation of modifiers need to be done. When update movespeed is called, the list of items is iterated, according to flags priority and a bunch of conditions this spits out a final calculated value which is used as a modifer to last_move + modifier for calculating when a mob can next move Key procs Used for variable slowdowns like hunger/health loss/etc, works somewhat like the old list-based modification adds. Returns the modifier datum if successful How this SHOULD work is: 1. Ensures type_id_datum one way or another refers to a /variable datum. This makes sure it can't be cached. This includes if it's already in the modification list. 2. Instantiate a new datum if type_id_datum isn't already instantiated + in the list, using the type. Obviously, wouldn't work for ID only. 3. Add the datum if necessary using the regular add proc 4. If any of the rest of the args are not null (see: multiplicative slowdown), modify the datum 5. Update if necessary |