diff --git a/code/datums/ai/movement/_ai_movement.dm b/code/datums/ai/movement/_ai_movement.dm index aacbb7f39a2..fa83d64e798 100644 --- a/code/datums/ai/movement/_ai_movement.dm +++ b/code/datums/ai/movement/_ai_movement.dm @@ -21,3 +21,42 @@ controller.pathing_attempts++ if(controller.pathing_attempts >= max_pathing_attempts) controller.CancelActions() + +///Should the movement be allowed to happen? As of writing this, MOVELOOP_SKIP_STEP is defined as (1<<0) so be careful on using (return TRUE) or (can_move = TRUE; return can_move) +/datum/ai_movement/proc/allowed_to_move(datum/move_loop/source) + var/atom/movable/pawn = source.moving + var/datum/ai_controller/controller = source.extra_info + source.delay = controller.movement_delay + + var/can_move = TRUE + if(controller.ai_traits & STOP_MOVING_WHEN_PULLED && pawn.pulledby) //Need to store more state. Annoying. + can_move = FALSE + + if(!isturf(pawn.loc)) //No moving if not on a turf + can_move = FALSE + + // Check if this controller can actually run, so we don't chase people with corpses + if(!controller.able_to_run()) + controller.CancelActions() + qdel(source) //stop moving + return MOVELOOP_SKIP_STEP + + //Why doesn't this return TRUE or can_move? + //MOVELOOP_SKIP_STEP is defined as (1<<0) and TRUE are defined as the same "1", returning TRUE would be the equivalent of skipping the move + if(can_move) + return + increment_pathing_failures(controller) + return MOVELOOP_SKIP_STEP + +///Anything to do before moving; any checks if the pawn should be able to move should be placed in allowed_to_move() and called by this proc +/datum/ai_movement/proc/pre_move(datum/move_loop/source) + SIGNAL_HANDLER + return allowed_to_move(source) + +//Anything to do post movement +/datum/ai_movement/proc/post_move(datum/move_loop/source, succeeded) + SIGNAL_HANDLER + if(succeeded) + return + var/datum/ai_controller/controller = source.extra_info + increment_pathing_failures(controller) diff --git a/code/datums/ai/movement/ai_movement_basic_avoidance.dm b/code/datums/ai/movement/ai_movement_basic_avoidance.dm index 78dae03b270..5e5a41707c5 100644 --- a/code/datums/ai/movement/ai_movement_basic_avoidance.dm +++ b/code/datums/ai/movement/ai_movement_basic_avoidance.dm @@ -11,40 +11,10 @@ RegisterSignal(loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, .proc/pre_move) RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, .proc/post_move) -/datum/ai_movement/basic_avoidance/proc/pre_move(datum/move_loop/has_target/dist_bound/source) - SIGNAL_HANDLER - var/atom/movable/pawn = source.moving - var/datum/ai_controller/controller = source.extra_info - source.delay = controller.movement_delay - source.distance = controller.blackboard[BB_CURRENT_MIN_MOVE_DISTANCE] - - var/can_move = TRUE - if(controller.ai_traits & STOP_MOVING_WHEN_PULLED && pawn.pulledby) - can_move = FALSE - - // Check if this controller can actually run, so we don't chase people with corpses - if(!controller.able_to_run()) - controller.CancelActions() - qdel(source) //stop moving - return MOVELOOP_SKIP_STEP - - if(!isturf(pawn.loc)) //No moving if not on a turf - can_move = FALSE - - var/turf/target_turf = get_step_to(pawn, source.target) +/datum/ai_movement/basic_avoidance/allowed_to_move(datum/move_loop/has_target/dist_bound/source) + . = ..() + var/turf/target_turf = get_step_towards(source.moving, source.target) if(is_type_in_typecache(target_turf, GLOB.dangerous_turfs)) - can_move = FALSE - - if(can_move) - return - increment_pathing_failures(controller) - return MOVELOOP_SKIP_STEP - -/datum/ai_movement/basic_avoidance/proc/post_move(datum/move_loop/source, succeeded) - SIGNAL_HANDLER - if(succeeded) - return - var/datum/ai_controller/controller = source.extra_info - increment_pathing_failures(controller) - + . = FALSE + return . diff --git a/code/datums/ai/movement/ai_movement_dumb.dm b/code/datums/ai/movement/ai_movement_dumb.dm index 53cbf9dc456..6c99dfd6f1a 100644 --- a/code/datums/ai/movement/ai_movement_dumb.dm +++ b/code/datums/ai/movement/ai_movement_dumb.dm @@ -11,38 +11,10 @@ RegisterSignal(loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, .proc/pre_move) RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, .proc/post_move) -/datum/ai_movement/dumb/proc/pre_move(datum/move_loop/has_target/source) - SIGNAL_HANDLER - var/atom/movable/pawn = source.moving - var/datum/ai_controller/controller = source.extra_info - source.delay = controller.movement_delay - - var/can_move = TRUE - if(controller.ai_traits & STOP_MOVING_WHEN_PULLED && pawn.pulledby) //Need to store more state. Annoying. - can_move = FALSE - - if(!isturf(pawn.loc)) //No moving if not on a turf - can_move = FALSE - - // Check if this controller can actually run, so we don't chase people with corpses - if(!controller.able_to_run()) - controller.CancelActions() - qdel(source) //stop moving - return MOVELOOP_SKIP_STEP - - var/turf/target_turf = get_step_towards(pawn, source.target) +/datum/ai_movement/dumb/allowed_to_move(datum/move_loop/has_target/source) + . = ..() + var/turf/target_turf = get_step_towards(source.moving, source.target) if(is_type_in_typecache(target_turf, GLOB.dangerous_turfs)) - can_move = FALSE - - if(can_move) - return - increment_pathing_failures(controller) - return MOVELOOP_SKIP_STEP - -/datum/ai_movement/dumb/proc/post_move(datum/move_loop/source, succeeded) - SIGNAL_HANDLER - if(succeeded) - return - var/datum/ai_controller/controller = source.extra_info - increment_pathing_failures(controller) + . = FALSE + return . diff --git a/code/datums/ai/movement/ai_movement_jps.dm b/code/datums/ai/movement/ai_movement_jps.dm index e0a1402f98b..8db33ebb8d5 100644 --- a/code/datums/ai/movement/ai_movement_jps.dm +++ b/code/datums/ai/movement/ai_movement_jps.dm @@ -23,37 +23,6 @@ RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, .proc/post_move) RegisterSignal(loop, COMSIG_MOVELOOP_JPS_REPATH, .proc/repath_incoming) -/datum/ai_movement/jps/proc/pre_move(datum/move_loop/source) - SIGNAL_HANDLER - var/atom/movable/pawn = source.moving - var/datum/ai_controller/controller = source.extra_info - source.delay = controller.movement_delay - - var/can_move = TRUE - if(controller.ai_traits & STOP_MOVING_WHEN_PULLED && pawn.pulledby) //Need to store more state. Annoying. - can_move = FALSE - - if(!isturf(pawn.loc)) //No moving if not on a turf - can_move = FALSE - - // Check if this controller can actually run, so we don't chase people with corpses - if(!controller.able_to_run()) - controller.CancelActions() - qdel(source) //stop moving - return MOVELOOP_SKIP_STEP - - if(can_move) - return - increment_pathing_failures(controller) - return MOVELOOP_SKIP_STEP - -/datum/ai_movement/jps/proc/post_move(datum/move_loop/source, succeeded) - SIGNAL_HANDLER - if(succeeded) - return - var/datum/ai_controller/controller = source.extra_info - increment_pathing_failures(controller) - /datum/ai_movement/jps/proc/repath_incoming(datum/move_loop/has_target/jps/source) SIGNAL_HANDLER var/datum/ai_controller/controller = source.extra_info