Daedalus Dock - Modules - TypesVar Details - Proc Details

movable

Vars

affected_dynamic_lightsLazylist to keep track on the sources of illumination.
affecting_dynamic_lumiHighest-intensity light affecting us, which determines our visibility.
airflow_destThe location the atom is trying to step towards during airflow.
airflow_old_densityIf the movable is dense by default, it won't step into tiles containing other dense objects
airflow_speedThe speed the object is travelling during airflow
airflow_timeTime (ticks) spent in airflow
blocks_emissiveEither FALSE, EMISSIVE_BLOCK_GENERIC, or EMISSIVE_BLOCK_UNIQUE
bound_overlayThe mimic (if any) that's directly copying us.
buckle_lyingBed-like behaviour, forces mob.lying = buckle_lying if not set to NO_BUCKLE_LYING.
buckle_prevents_pullWhether things buckled to this atom can be pulled while they're buckled
buckle_requires_restraintsRequire people to be handcuffed before being able to buckle. eg: pipes
buckled_mobsThe mobs currently buckled to this atom
can_be_unanchoredUsed for the calculate_adjacencies proc for icon smoothing.
can_buckleWhether the atom allows mobs to be buckled to it. Can be ignored in [/atom/movable/proc/buckle_mob()] if force = TRUE
client_mobs_in_contentscontains every client mob corresponding to every client eye in this container. lazily updated by SSparallax and is sparse: only the last container of a client eye has this list assuming no movement since SSparallax's last fire
contents_pressure_protectionThe degree of pressure protection that mobs in list/contents have from the external environment, between 0 and 1
contents_thermal_insulationThe degree of thermal insulation that mobs in list/contents have from the external environment, between 0 and 1
currently_z_movingis the mob currently ascending or descending through z levels?
do_aftersFor storing what do_after's someone has, key = string, value = amount of interactions of that type happening.
em_blockInternal holder for emissive blocker object, do not use directly use blocks_emissive
forcemove_should_maintain_grabTracks if forceMove() should break grabs or not.
generic_canpassIf false makes CanPass call CanPassThrough on this type instead of using default behaviour
germ_levelLook, we're defining this here so it doesn't need to be redefined 4 times, okay? Sorry.
grabbed_byA lazylist of grab objects gripping us
important_recursive_contentsan associative lazylist of relevant nested contents by "channel", the list is of the form: list(channel = list(important nested contents of that type)) each channel has a specific purpose and is meant to replace potentially expensive nested contents iteration. do NOT add channels to this for little reason as it can add considerable memory usage.
inertia_move_delayDelay in deciseconds between inertia based movement
inertia_movingAre we moving with inertia? Mostly used as an optimization
last_airflowTime (ticks) since last airflow movement
last_moveThe last direction we moved in.
last_pushoffThe last time we pushed off something This is a hack to get around dumb him him me scenarios
max_buckled_mobsThe maximum number of mob/livings allowed to be buckled to this atom at once
move_packetHolds information about any movement loops currently running/waiting to run on the movable. Lazy, will be null if nothing's going on
movement_typeIn case you have multiple types, you automatically use the most useful one. IE: Skating on ice, flippers on water, flying over chasm/space, etc. I reccomend you use the movetype_handler system and not modify this directly, especially for living mobs.
moving_by_airflowBump() magic
moving_diagonally0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move
moving_from_pullTracks if the mob is currently in the movechain during a pulling movement.
pass_flagsThings we can pass through while moving. If any of this matches the thing we're trying to pass's [pass_flags_self], then we can pass through.
set_dir_on_moveWhether this atom should have its dir automatically changed when it moves. Setting this to FALSE allows for things such as directional windows to retain dir on moving without snowflake code all of the place.
spatial_grid_keyString representing the spatial grid groups we want to be held in. acts as a key to the list of spatial grid contents types we exist in via SSspatial_grid.spatial_grid_categories. We do it like this to prevent people trying to mutate them and to save memory on holding the lists ourselves
throwforceHow much damage the object deals when impacting something else.
throwingA ref to the throwing datum belonging to us.
tk_throw_rangeMax range this atom can be thrown via telekinesis
zmm_flagsMovable-level Z-Mimic flags. This uses ZMM_* flags, not ZM_* flags.

Procs

CanPassThroughReturns true or false to allow src to move through the blocker, mover has final say
Crosseddefault byond proc that is deprecated for us in lieu of signals. do not call
MovedCalled after a successful Move(). By this point, we've already moved. Arguments:
Process_SpacemoveCalled whenever an object moves and by mobs when they attempt to move themselves through space And when an object or action applies a force on src, see newtonian_move
UncrossUncross() is a default BYOND proc that is called when something is going to exit this atom's turf. It is prefered over Uncrossed when you want to deny that movement, such as in the case of border objects, objects that allow you to walk through them in any direction except the one they block (think side windows).
Uncrosseddefault byond proc that is normally called on everything inside the previous turf a movable was in after moving to its current turf this is wasteful since the vast majority of objects do not use Uncrossed use connect_loc to register to COMSIG_ATOM_EXITED instead
abstract_movemeant for movement with zero side effects. only use for objects that are supposed to move "invisibly" (like camera mobs or ghosts) if you want something to move onto a tile with a beartrap or recycler or tripmine or mouse without that object knowing about it at all, use this most of the time you want forceMove()FALS
add_blocked_languageAdds a language to the blocked language list. Use this over remove_language in cases where you will give languages back later.
admin_teleportProc to hook user-enacted teleporting behavior and keep logging of the event.
airflow_hitCalled when src collides with A during airflow
become_active_storagecalled when this movable becomes the parent of a storage component that is currently being viewed by a player. uses important_recursive_contents
become_area_sensitiveWe get our awareness updated by the important recursive contents stuff, here we remove our membership allows this movable to know when it has "entered" another area no matter how many movable atoms its stuffed into, uses important_recursive_contents
become_hearing_sensitiveallows this movable to hear and adds itself to the important_recursive_contents list of itself and every movable loc its in
become_radio_sensitiveallows this movable to hear and adds itself to the important_recursive_contents list of itself and every movable loc its in
block_superconductivityCurrently unused.
buckle_mobSet a mob as buckled to src
can_speak_languageChecks if atom can speak the language.
can_step_intoTests if src can move from their current loc to an adjacent destination, without doing the move.
can_z_moveChecks if the destination turf is elegible for z movement from the start turf to a given direction and returns it if so. Args:
check_airflow_movableChecks to see if airflow can move this movable.
check_zclimbReturns an object we can climb onto
compose_message
copy_languagesCopies all languages into the supplied atom/language holder. Source should be overridden when you do not want the language overwritten by later atom updates or want to avoid blocked languages.
deadchat_playsAdds the deadchat_plays component to this atom with simple movement commands.
forceMoveWithGroupforceMove() wrapper to include things like buckled mobs.
free_from_all_grabsFrees src from all grabs.
get_all_grab_chain_membersGet every single member of a grab chain
get_language_holderGets or creates the relevant language holder. For mindless atoms, gets the local one. For atom with mind, gets the mind one.
get_move_groupReturns a list of movables that should also be affected when calling forceMoveWithGroup()
get_random_spoken_languageGets a random spoken language, useful for forced speech and such.
get_random_understood_languageGets a random understood language, useful for hallucinations and such.
get_selected_languageReturns selected language, if it can be spoken, or finds, sets and returns a new selected language if possible.
grant_all_languagesGrants every language.
grant_languageGrants the supplied language and sets omnitongue true.
has_buckled_mobsReturns TRUE if there are mobs buckled to this atom and FALSE otherwise
has_languageChecks if atom has the language. If spoken is true, only checks if atom can speak the language.
is_buckle_possibleSimple helper proc that runs a suite of checks to test whether it is possible or not to buckle the target mob to src.
is_user_buckle_possibleSimple helper proc that runs a suite of checks to test whether it is possible or not for user to buckle target mob to src.
keybind_face_directionA wrapper for setDir that should only be able to fail by living mobs.
lose_active_storagecalled when this movable's storage component is no longer viewed by any players, unsets important_recursive_contents
lose_area_sensitivityremoves the area sensitive channel from the important_recursive_contents list of this and all nested locs containing us if there are no more source of the trait left
lose_hearing_sensitivityremoves the hearing sensitivity channel from the important_recursive_contents list of this and all nested locs containing us if there are no more sources of the trait left since RECURSIVE_CONTENTS_HEARING_SENSITIVE is also a spatial grid content type, removes us from the spatial grid if the trait is removed
mouse_buckle_handlingDoes some typechecks and then calls user_buckle_mob
move_from_pullCalled when src is being moved to a target turf because another movable (puller) is moving around.
newtonian_moveOnly moves the object if it's under no gravity Accepts the direction to move, if the push should be instant, and an optional parameter to fine tune the start delay
onShuttleMoveCalled on atoms to move the atom to the new location
on_changed_z_levelCalled when a movable changes z-levels.
on_enter_storagecalled when this atom is added into a storage item, which is passed on as S. The loc variable is already set to the storage item.
on_exit_storagecalled when this atom is removed from a storage item, which is passed on as S. The loc variable is already set to the new destination before this is called.
point_atPoint at an atom
recheck_grabsChecks if the pulling and pulledby should be stopped because they're out of reach. If z_allowed is TRUE, the z level of the pulling will be ignored.This is to allow things to be dragged up and down stairs.
recursively_get_all_grabbersGets every grabber of this atom, and every grabber of those grabbers, repeat
relay_container_resist_actcalled when a mob resists while inside a container that is itself inside something.
remove_all_languagesRemoves every language and sets omnitongue false.
remove_blocked_languageRemoves a language from the blocked language list.
remove_languageRemoves a single language.
say_emphasisScans the input sentence for speech emphasis modifiers, notably |italics|, +bold+, and underline -mothblocks
set_anchoredSets the anchored var and returns if it was sucessfully changed or not.
set_currently_z_movingSets the currently_z_moving variable to a new value. Used to temporarily disable some Move() side effects.
set_light_range_power_colorHelper to change several lighting overlay settings.
show_messageShow a message to this mob (visual or audible) This is /atom/movable so mimics can get these and relay them to their parent.
shuttleRotateBase /atom/movable proc
throw_atIf this returns FALSE then callback will not be called.
transformation_animationthe dmi file path we attempt to return if the given object argument is associated with a stringifiable icon if successful, this looks like "icons/path/to/dmi_file.dmi" but they pass both isicon() and isfile() checks. theyre the easiest case since stringifying them gives us the path we want
translate_speechProcesses a spoken message's language based on if the hearer can understand it.
twitchAn animation for the object shaking wildly.
unbuckle_all_mobsCall /atom/movable/proc/unbuckle_mob for all buckled mobs
unbuckle_mobSet a mob as unbuckled from src
update_atom_languagesEmpties out the atom specific languages and updates them according to the current atoms language holder. As a side effect, it also creates missing language holders in the process.
update_dynamic_luminosityKeeps track of the sources of dynamic luminosity and updates our visibility with the highest.
user_buckle_mobHandles a mob buckling another mob to src and sends a visible_message
user_unbuckle_mobHandles a user unbuckling a mob from src and sends a visible_message
zFallPrecipitates a movable (plus whatever buckled to it) to lower z levels if possible and then calls zImpact()

Var Details

affected_dynamic_lights

Lazylist to keep track on the sources of illumination.

affecting_dynamic_lumi

Highest-intensity light affecting us, which determines our visibility.

airflow_dest

The location the atom is trying to step towards during airflow.

airflow_old_density

If the movable is dense by default, it won't step into tiles containing other dense objects

airflow_speed

The speed the object is travelling during airflow

airflow_time

Time (ticks) spent in airflow

blocks_emissive

Either FALSE, EMISSIVE_BLOCK_GENERIC, or EMISSIVE_BLOCK_UNIQUE

bound_overlay

The mimic (if any) that's directly copying us.

buckle_lying

Bed-like behaviour, forces mob.lying = buckle_lying if not set to NO_BUCKLE_LYING.

buckle_prevents_pull

Whether things buckled to this atom can be pulled while they're buckled

buckle_requires_restraints

Require people to be handcuffed before being able to buckle. eg: pipes

buckled_mobs

The mobs currently buckled to this atom

can_be_unanchored

Used for the calculate_adjacencies proc for icon smoothing.

can_buckle

Whether the atom allows mobs to be buckled to it. Can be ignored in [/atom/movable/proc/buckle_mob()] if force = TRUE

client_mobs_in_contents

contains every client mob corresponding to every client eye in this container. lazily updated by SSparallax and is sparse: only the last container of a client eye has this list assuming no movement since SSparallax's last fire

contents_pressure_protection

The degree of pressure protection that mobs in list/contents have from the external environment, between 0 and 1

contents_thermal_insulation

The degree of thermal insulation that mobs in list/contents have from the external environment, between 0 and 1

currently_z_moving

is the mob currently ascending or descending through z levels?

do_afters

For storing what do_after's someone has, key = string, value = amount of interactions of that type happening.

em_block

Internal holder for emissive blocker object, do not use directly use blocks_emissive

forcemove_should_maintain_grab

Tracks if forceMove() should break grabs or not.

generic_canpass

If false makes CanPass call CanPassThrough on this type instead of using default behaviour

germ_level

Look, we're defining this here so it doesn't need to be redefined 4 times, okay? Sorry.

grabbed_by

A lazylist of grab objects gripping us

important_recursive_contents

an associative lazylist of relevant nested contents by "channel", the list is of the form: list(channel = list(important nested contents of that type)) each channel has a specific purpose and is meant to replace potentially expensive nested contents iteration. do NOT add channels to this for little reason as it can add considerable memory usage.

inertia_move_delay

Delay in deciseconds between inertia based movement

inertia_moving

Are we moving with inertia? Mostly used as an optimization

last_airflow

Time (ticks) since last airflow movement

last_move

The last direction we moved in.

last_pushoff

The last time we pushed off something This is a hack to get around dumb him him me scenarios

max_buckled_mobs

The maximum number of mob/livings allowed to be buckled to this atom at once

move_packet

Holds information about any movement loops currently running/waiting to run on the movable. Lazy, will be null if nothing's going on

movement_type

In case you have multiple types, you automatically use the most useful one. IE: Skating on ice, flippers on water, flying over chasm/space, etc. I reccomend you use the movetype_handler system and not modify this directly, especially for living mobs.

moving_by_airflow

Bump() magic

moving_diagonally

0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move

moving_from_pull

Tracks if the mob is currently in the movechain during a pulling movement.

pass_flags

Things we can pass through while moving. If any of this matches the thing we're trying to pass's [pass_flags_self], then we can pass through.

set_dir_on_move

Whether this atom should have its dir automatically changed when it moves. Setting this to FALSE allows for things such as directional windows to retain dir on moving without snowflake code all of the place.

spatial_grid_key

String representing the spatial grid groups we want to be held in. acts as a key to the list of spatial grid contents types we exist in via SSspatial_grid.spatial_grid_categories. We do it like this to prevent people trying to mutate them and to save memory on holding the lists ourselves

throwforce

How much damage the object deals when impacting something else.

throwing

A ref to the throwing datum belonging to us.

tk_throw_range

Max range this atom can be thrown via telekinesis

zmm_flags

Movable-level Z-Mimic flags. This uses ZMM_* flags, not ZM_* flags.

Proc Details

CanPassThrough

Returns true or false to allow src to move through the blocker, mover has final say

Crossed

default byond proc that is deprecated for us in lieu of signals. do not call

Moved

Called after a successful Move(). By this point, we've already moved. Arguments:

Process_Spacemove

Called whenever an object moves and by mobs when they attempt to move themselves through space And when an object or action applies a force on src, see newtonian_move

Return FALSE to have src start/keep drifting in a no-grav area and TRUE to stop/not start drifting

Mobs should return 1 if they should be able to move of their own volition, see /client/proc/Move

Arguments:

Uncross

Uncross() is a default BYOND proc that is called when something is going to exit this atom's turf. It is prefered over Uncrossed when you want to deny that movement, such as in the case of border objects, objects that allow you to walk through them in any direction except the one they block (think side windows).

While being seemingly harmless, most everything doesn't actually want to use this, meaning that we are wasting proc calls for every single atom on a turf, every single time something exits it, when basically nothing cares.

This overhead caused real problems on Sybil round #159709, where lag attributed to Uncross was so bad that the entire master controller collapsed and people made Among Us lobbies in OOC.

If you want to replicate the old Uncross() behavior, the most apt replacement is [/datum/element/connect_loc] while hooking onto [COMSIG_ATOM_EXIT].

Uncrossed

default byond proc that is normally called on everything inside the previous turf a movable was in after moving to its current turf this is wasteful since the vast majority of objects do not use Uncrossed use connect_loc to register to COMSIG_ATOM_EXITED instead

abstract_move

meant for movement with zero side effects. only use for objects that are supposed to move "invisibly" (like camera mobs or ghosts) if you want something to move onto a tile with a beartrap or recycler or tripmine or mouse without that object knowing about it at all, use this most of the time you want forceMove()FALS

add_blocked_language

Adds a language to the blocked language list. Use this over remove_language in cases where you will give languages back later.

admin_teleport

Proc to hook user-enacted teleporting behavior and keep logging of the event.

airflow_hit

Called when src collides with A during airflow

become_active_storage

called when this movable becomes the parent of a storage component that is currently being viewed by a player. uses important_recursive_contents

become_area_sensitive

We get our awareness updated by the important recursive contents stuff, here we remove our membership allows this movable to know when it has "entered" another area no matter how many movable atoms its stuffed into, uses important_recursive_contents

become_hearing_sensitive

allows this movable to hear and adds itself to the important_recursive_contents list of itself and every movable loc its in

become_radio_sensitive

allows this movable to hear and adds itself to the important_recursive_contents list of itself and every movable loc its in

block_superconductivity

Currently unused.

buckle_mob

Set a mob as buckled to src

If you want to have a mob buckling another mob to something, or you want a chat message sent, use user_buckle_mob instead. Arguments: M - The mob to be buckled to src force - Set to TRUE to ignore src's can_buckle and M's can_buckle_to check_loc - Set to FALSE to allow buckling from adjacent turfs, or TRUE if buckling is only allowed with src and M on the same turf. buckle_mob_flags- Used for riding cyborgs and humans if we need to reserve an arm or two on either the rider or the ridden mob. ignore_self - If set to TRUE, this will not do a check to see if the user can move into the turf of the mob and will just automatically mount them.

can_speak_language

Checks if atom can speak the language.

can_step_into

Tests if src can move from their current loc to an adjacent destination, without doing the move.

can_z_move

Checks if the destination turf is elegible for z movement from the start turf to a given direction and returns it if so. Args:

check_airflow_movable

Checks to see if airflow can move this movable.

check_zclimb

Returns an object we can climb onto

compose_message

copy_languages

Copies all languages into the supplied atom/language holder. Source should be overridden when you do not want the language overwritten by later atom updates or want to avoid blocked languages.

deadchat_plays

Adds the deadchat_plays component to this atom with simple movement commands.

Returns the component added. Arguments:

forceMoveWithGroup

forceMove() wrapper to include things like buckled mobs.

free_from_all_grabs

Frees src from all grabs.

get_all_grab_chain_members

Get every single member of a grab chain

get_language_holder

Gets or creates the relevant language holder. For mindless atoms, gets the local one. For atom with mind, gets the mind one.

get_move_group

Returns a list of movables that should also be affected when calling forceMoveWithGroup()

get_random_spoken_language

Gets a random spoken language, useful for forced speech and such.

get_random_understood_language

Gets a random understood language, useful for hallucinations and such.

get_selected_language

Returns selected language, if it can be spoken, or finds, sets and returns a new selected language if possible.

grant_all_languages

Grants every language.

grant_language

Grants the supplied language and sets omnitongue true.

has_buckled_mobs

Returns TRUE if there are mobs buckled to this atom and FALSE otherwise

has_language

Checks if atom has the language. If spoken is true, only checks if atom can speak the language.

is_buckle_possible

Simple helper proc that runs a suite of checks to test whether it is possible or not to buckle the target mob to src.

Returns FALSE if any conditions that should prevent buckling are satisfied. Returns TRUE otherwise. Called from /atom/movable/proc/buckle_mob and /atom/movable/proc/is_user_buckle_possible. Arguments:

is_user_buckle_possible

Simple helper proc that runs a suite of checks to test whether it is possible or not for user to buckle target mob to src.

Returns FALSE if any conditions that should prevent buckling are satisfied. Returns TRUE otherwise. Called from /atom/movable/proc/user_buckle_mob. Arguments:

keybind_face_direction

A wrapper for setDir that should only be able to fail by living mobs.

Called from [/atom/movable/proc/keyLoop], this exists to be overwritten by living mobs with a check to see if we're actually alive enough to change directions

lose_active_storage

called when this movable's storage component is no longer viewed by any players, unsets important_recursive_contents

lose_area_sensitivity

removes the area sensitive channel from the important_recursive_contents list of this and all nested locs containing us if there are no more source of the trait left

lose_hearing_sensitivity

removes the hearing sensitivity channel from the important_recursive_contents list of this and all nested locs containing us if there are no more sources of the trait left since RECURSIVE_CONTENTS_HEARING_SENSITIVE is also a spatial grid content type, removes us from the spatial grid if the trait is removed

mouse_buckle_handling

Does some typechecks and then calls user_buckle_mob

Arguments: M - The mob being buckled to src user - The mob buckling M to src

move_from_pull

Called when src is being moved to a target turf because another movable (puller) is moving around.

newtonian_move

Only moves the object if it's under no gravity Accepts the direction to move, if the push should be instant, and an optional parameter to fine tune the start delay

onShuttleMove

Called on atoms to move the atom to the new location

on_changed_z_level

Called when a movable changes z-levels.

Arguments:

on_enter_storage

called when this atom is added into a storage item, which is passed on as S. The loc variable is already set to the storage item.

on_exit_storage

called when this atom is removed from a storage item, which is passed on as S. The loc variable is already set to the new destination before this is called.

point_at

Point at an atom

Intended to enable and standardise the pointing animation for all atoms

Not intended as a replacement for the mob verb

recheck_grabs

Checks if the pulling and pulledby should be stopped because they're out of reach. If z_allowed is TRUE, the z level of the pulling will be ignored.This is to allow things to be dragged up and down stairs.

recursively_get_all_grabbers

Gets every grabber of this atom, and every grabber of those grabbers, repeat

relay_container_resist_act

called when a mob resists while inside a container that is itself inside something.

remove_all_languages

Removes every language and sets omnitongue false.

remove_blocked_language

Removes a language from the blocked language list.

remove_language

Removes a single language.

say_emphasis

Scans the input sentence for speech emphasis modifiers, notably |italics|, +bold+, and underline -mothblocks

set_anchored

Sets the anchored var and returns if it was sucessfully changed or not.

set_currently_z_moving

Sets the currently_z_moving variable to a new value. Used to temporarily disable some Move() side effects.

set_light_range_power_color

Helper to change several lighting overlay settings.

show_message

Show a message to this mob (visual or audible) This is /atom/movable so mimics can get these and relay them to their parent.

shuttleRotate

Base /atom/movable proc

throw_at

If this returns FALSE then callback will not be called.

transformation_animation

the dmi file path we attempt to return if the given object argument is associated with a stringifiable icon if successful, this looks like "icons/path/to/dmi_file.dmi" but they pass both isicon() and isfile() checks. theyre the easiest case since stringifying them gives us the path we want

translate_speech

Processes a spoken message's language based on if the hearer can understand it.

twitch

An animation for the object shaking wildly.

unbuckle_all_mobs

Call /atom/movable/proc/unbuckle_mob for all buckled mobs

unbuckle_mob

Set a mob as unbuckled from src

The mob must actually be buckled to src or else bad things will happen. Arguments: buckled_mob - The mob to be unbuckled force - TRUE if we should ignore buckled_mob.can_buckle_to

update_atom_languages

Empties out the atom specific languages and updates them according to the current atoms language holder. As a side effect, it also creates missing language holders in the process.

update_dynamic_luminosity

Keeps track of the sources of dynamic luminosity and updates our visibility with the highest.

user_buckle_mob

Handles a mob buckling another mob to src and sends a visible_message

Basically exists to do some checks on the user and then call buckle_mob where the real buckling happens. First, checks if the buckle is valid and cancels if it isn't. Second, checks if src is on a different turf from the target; if it is, does a do_after and another check for sanity Finally, calls /atom/movable/proc/buckle_mob to buckle the target to src then gives chat feedback Arguments:

user_unbuckle_mob

Handles a user unbuckling a mob from src and sends a visible_message

Basically just calls unbuckle_mob, sets fingerprint, and sends a visible_message about the user unbuckling the mob Arguments: buckled_mob - The mob/living to unbuckle user - The mob unbuckling buckled_mob

zFall

Precipitates a movable (plus whatever buckled to it) to lower z levels if possible and then calls zImpact()