ensure some ai behavior procs call parent (#30703)

* ensure some ai behavior procs call parent

* fix slippage
This commit is contained in:
warriorstar-orion
2025-11-19 14:28:45 -05:00
committed by GitHub
parent 846c5de47e
commit 050494fe31
36 changed files with 52 additions and 0 deletions
+2
View File
@@ -32,6 +32,7 @@
/// `finish_action` proc is given TRUE or FALSE depending on whether or not the
/// return value of `perform` is marked as successful or unsuccessful.
/datum/ai_behavior/proc/perform(seconds_per_tick, datum/ai_controller/controller, ...)
SHOULD_CALL_PARENT(TRUE)
controller.behavior_cooldowns[src] = world.time + action_cooldown
/// Called when the action is finished. This needs the same args as `perform`
@@ -42,6 +43,7 @@
/// [/datum/ai_behavior/proc/perform] returns [AI_BEHAVIOR_SUCCEEDED] or
/// [AI_BEHAVIOR_FAILED].
/datum/ai_behavior/proc/finish_action(datum/ai_controller/controller, succeeded, ...)
SHOULD_CALL_PARENT(TRUE)
LAZYREMOVE(controller.current_behaviors, src)
controller.behavior_args -= type
// If this was a movement task, reset our movement target if necessary
@@ -16,6 +16,7 @@
set_movement_target(controller, target)
/datum/ai_behavior/basic_melee_attack/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key)
. = ..()
if(isliving(controller.pawn))
var/mob/living/pawn = controller.pawn
if(world.time < pawn.next_move)
@@ -70,6 +71,7 @@
set_movement_target(controller, target)
/datum/ai_behavior/basic_ranged_attack/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key)
. = ..()
var/mob/living/basic/basic_mob = controller.pawn
//targeting strategy will kill the action if not real anymore
var/atom/target = controller.blackboard[target_key]
@@ -2,6 +2,7 @@
/datum/ai_behavior/befriend_target
/datum/ai_behavior/befriend_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key, befriend_message)
. = ..()
var/mob/living/living_pawn = controller.pawn
var/mob/living/living_target = controller.blackboard[target_key]
if(QDELETED(living_target))
@@ -9,6 +9,7 @@
set_movement_target(controller, hunt_target)
/datum/ai_behavior/emote_on_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key, list/emote_list)
. = ..()
var/atom/target = controller.blackboard[target_key]
if(!length(emote_list) || isnull(target))
return AI_BEHAVIOR_FAILED | AI_BEHAVIOR_DELAY
@@ -14,6 +14,7 @@
set_movement_target(controller, target)
/datum/ai_behavior/interact_with_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
. = ..()
var/atom/target = controller.blackboard[target_key]
if(QDELETED(target) || !pre_interact(controller, target))
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
@@ -18,6 +18,7 @@
return ..()
/datum/ai_behavior/run_away_from_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key, hiding_location_key)
. = ..()
if(controller.blackboard[BB_BASIC_MOB_STOP_FLEEING])
return AI_BEHAVIOR_DELAY
var/atom/target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key]
@@ -11,6 +11,7 @@
return cooldown_for.blackboard[BB_STATIONARY_COOLDOWN]
/datum/ai_behavior/stop_and_stare/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
. = ..()
var/atom/movable/target = controller.blackboard[target_key]
if(!ismovable(target) || !isturf(target.loc)) // just to make sure that nothing funky happened between setup and perform
return AI_BEHAVIOR_DELAY
@@ -12,6 +12,7 @@
set_movement_target(controller, target)
/datum/ai_behavior/swirl_around_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
. = ..()
var/atom/target = controller.blackboard[target_key]
var/mob/living/living_pawn = controller.pawn
@@ -5,6 +5,7 @@
/datum/ai_behavior/targeted_mob_ability
/datum/ai_behavior/targeted_mob_ability/perform(seconds_per_tick, datum/ai_controller/controller, ability_key, target_key)
. = ..()
var/datum/action/cooldown/ability = controller.blackboard[ability_key]
var/mob/living/target = controller.blackboard[target_key]
if(QDELETED(ability) || QDELETED(target))
@@ -26,6 +26,7 @@ GLOBAL_LIST_INIT(target_interested_atoms, typecacheof(list(
return ..()
/datum/ai_behavior/find_potential_targets/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key)
. = ..()
var/mob/living/living_mob = controller.pawn
var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key])
@@ -2,6 +2,7 @@
/datum/ai_behavior/tipped_reaction
/datum/ai_behavior/tipped_reaction/perform(seconds_per_tick, datum/ai_controller/controller, tipper_key, reacting_key)
. = ..()
var/mob/living/carbon/tipper = controller.blackboard[tipper_key]
// visible part of the visible message
@@ -19,6 +19,7 @@
set_movement_target(controller, target, new_movement_type)
/datum/ai_behavior/travel_towards/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
. = ..()
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
/datum/ai_behavior/travel_towards/finish_action(datum/ai_controller/controller, succeeded, target_key)
@@ -53,4 +54,5 @@
set_movement_target(controller, target_atom)
/datum/ai_behavior/travel_towards_atom/perform(seconds_per_tick, datum/ai_controller/controller, atom/target_atom)
. = ..()
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
@@ -27,6 +27,7 @@
var/can_attack_dense_objects = TRUE
/datum/ai_behavior/attack_obstructions/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
. = ..()
var/mob/living/basic/basic_mob = controller.pawn
var/atom/target = controller.blackboard[target_key]
@@ -14,6 +14,7 @@
action_cooldown = 1 SECONDS
/datum/ai_behavior/capricious_retaliate/perform(seconds_per_tick, datum/ai_controller/controller, targeting_strategy_key, ignore_faction)
. = ..()
var/atom/pawn = controller.pawn
if(controller.blackboard_key_exists(BB_BASIC_MOB_RETALIATE_LIST))
var/deaggro_chance = controller.blackboard[BB_RANDOM_DEAGGRO_CHANCE] || 10
@@ -30,6 +30,7 @@
var/look_range = 7
/datum/ai_behavior/find_mom/perform(seconds_per_tick, datum/ai_controller/controller, mom_key, ignore_mom_key, found_mom)
. = ..()
var/mob/living_pawn = controller.pawn
var/list/mom_types = controller.blackboard[mom_key]
var/list/all_moms = list()
@@ -61,6 +61,7 @@
return FALSE
/datum/ai_behavior/step_away/perform(seconds_per_tick, datum/ai_controller/controller)
. = ..()
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
/datum/ai_behavior/step_away/finish_action(datum/ai_controller/controller, succeeded)
@@ -81,6 +82,7 @@
set_movement_target(controller, current_target)
/datum/ai_behavior/pursue_to_range/perform(seconds_per_tick, datum/ai_controller/controller, target_key, range)
. = ..()
var/atom/current_target = controller.blackboard[target_key]
if(!QDELETED(current_target) && get_dist(controller.pawn, current_target) > range)
return AI_BEHAVIOR_INSTANT
@@ -112,4 +114,5 @@
set_movement_target(controller, target = chosen_turf)
/datum/ai_behavior/cover_minimum_distance/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
. = ..()
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
@@ -40,6 +40,7 @@
var/max_nearby_pop = 3
/datum/ai_behavior/find_partner/perform(seconds_per_tick, datum/ai_controller/controller, target_key, partner_types_key, child_types_key)
. = ..()
var/maximum_pop = controller.blackboard[BB_MAX_CHILDREN] || max_nearby_pop
var/mob/pawn_mob = controller.pawn
var/list/similar_species_types = controller.blackboard[partner_types_key] + controller.blackboard[child_types_key]
@@ -84,6 +85,7 @@
set_movement_target(controller, target)
/datum/ai_behavior/make_babies/perform(seconds_per_tick, datum/ai_controller/controller, target_key, child_types_key)
. = ..()
var/mob/target = controller.blackboard[target_key]
if(QDELETED(target) || target.stat != CONSCIOUS)
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
@@ -1,6 +1,7 @@
/datum/ai_behavior/find_mineral_wall
/datum/ai_behavior/find_mineral_wall/perform(seconds_per_tick, datum/ai_controller/controller, found_wall_key)
. = ..()
var/mob/living_pawn = controller.pawn
for(var/turf/simulated/mineral/potential_wall in oview(9, living_pawn))
@@ -45,6 +46,7 @@
action_cooldown = 15 SECONDS
/datum/ai_behavior/interact_with_target/mine_wall/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
. = ..()
var/mob/living/basic/living_pawn = controller.pawn
var/turf/simulated/mineral/target = controller.blackboard[target_key]
if(!controller.ai_interact(target = target))
@@ -2,6 +2,7 @@
search_turf_types = TRUE
/datum/ai_behavior/find_hunt_target/prowl/perform(seconds_per_tick, datum/ai_controller/controller, hunting_target_key, types_to_hunt, hunt_range)
. = ..()
var/mob/living/living_mob = controller.pawn
var/list/interesting_objects = search_turf_types ? RANGE_TURFS(hunt_range, living_mob) : oview(hunt_range, living_mob)
shuffle_inplace(interesting_objects)
@@ -28,6 +28,7 @@
return !QDELETED(target)
/datum/ai_behavior/ranged_skirmish/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key, max_range, min_range)
. = ..()
var/atom/target = controller.blackboard[target_key]
if(QDELETED(target))
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
@@ -34,6 +34,7 @@
var/vision_range = 9
/datum/ai_behavior/target_from_retaliate_list/perform(seconds_per_tick, datum/ai_controller/controller, shitlist_key, target_key, targeting_strategy_key, hiding_location_key, check_faction)
. = ..()
var/mob/living/living_mob = controller.pawn
var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key])
if(!targeting_strategy)
@@ -25,6 +25,7 @@
/datum/ai_behavior/use_mob_ability
/datum/ai_behavior/use_mob_ability/perform(seconds_per_tick, datum/ai_controller/controller, ability_key)
. = ..()
var/datum/action/using_action = controller.blackboard[ability_key]
if(QDELETED(using_action))
return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED
@@ -20,6 +20,7 @@
action_cooldown = 45 SECONDS
/datum/ai_behavior/find_ventcrawl_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key, range)
. = ..()
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(range, controller.pawn))
if(!v.welded)
@@ -156,6 +156,7 @@
set_movement_target(controller, target)
/datum/ai_behavior/interact_with_vent/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
. = ..()
var/atom/target = controller.blackboard[target_key]
if(QDELETED(target))
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
@@ -4,6 +4,7 @@
var/search_turf_types = FALSE
/datum/ai_behavior/find_hunt_target/perform(seconds_per_tick, datum/ai_controller/controller, hunting_target_key, types_to_hunt, hunt_range)
. = ..()
var/mob/living/living_mob = controller.pawn
var/list/interesting_objects = search_turf_types ? RANGE_TURFS(hunt_range, living_mob) : oview(hunt_range, living_mob)
for(var/atom/possible_dinner as anything in typecache_filter_list(interesting_objects, types_to_hunt))
@@ -14,6 +14,7 @@
set_movement_target(controller, hunt_target)
/datum/ai_behavior/hunt_target/perform(seconds_per_tick, datum/ai_controller/controller, hunting_target_key, hunting_cooldown_key)
. = ..()
var/mob/living/hunter = controller.pawn
var/atom/hunted = controller.blackboard[hunting_target_key]
+1
View File
@@ -7,6 +7,7 @@
action_cooldown = 2 SECONDS
/datum/ai_behavior/find_and_set/perform(seconds_per_tick, datum/ai_controller/controller, set_key, locate_path, search_range)
. = ..()
if(controller.blackboard_key_exists(set_key))
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
if(QDELETED(controller.pawn))
@@ -1,6 +1,7 @@
/datum/ai_behavior/perform_emote
/datum/ai_behavior/perform_emote/perform(seconds_per_tick, datum/ai_controller/controller, emote, speech_sound)
. = ..()
var/mob/living/living_pawn = controller.pawn
if(!istype(living_pawn))
return AI_BEHAVIOR_INSTANT
@@ -10,6 +10,7 @@
set_movement_target(controller, target)
/datum/ai_behavior/pet_follow_friend/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
. = ..()
var/atom/target = controller.blackboard[target_key]
if(QDELETED(target))
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
@@ -138,6 +138,7 @@
return FALSE
/datum/ai_behavior/return_home/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
. = ..()
var/mob/living/living_pawn = controller.pawn
var/static/list/possible_emotes = list("rests its legs...", "yawns and naps...", "curls up and rests...")
living_pawn.custom_emote(EMOTE_VISIBLE, pick(possible_emotes))
@@ -149,4 +150,5 @@
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT
/datum/ai_behavior/return_home/incursion_portal/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
. = ..()
return AI_BEHAVIOR_SUCCEEDED
@@ -27,6 +27,7 @@
set_movement_target(controller, target)
/datum/ai_behavior/enter_exit_hive/perform(seconds_per_tick, datum/ai_controller/controller, target_key, attack_key)
. = ..()
var/obj/structure/beebox/current_home = controller.blackboard[target_key]
var/atom/attack_target = controller.blackboard[attack_key]
@@ -47,6 +48,7 @@
set_movement_target(controller, target)
/datum/ai_behavior/inhabit_hive/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
. = ..()
var/obj/structure/beebox/potential_home = controller.blackboard[target_key]
var/mob/living/bee_pawn = controller.pawn
@@ -79,6 +79,7 @@
var/scan_range = 3
/datum/ai_behavior/find_unwebbed_turf/perform(seconds_per_tick, datum/ai_controller/controller)
. = ..()
var/mob/living/spider = controller.pawn
var/atom/current_target = controller.blackboard[target_key]
if(current_target && !(locate(/obj/structure/spider/stickyweb) in current_target))
@@ -145,6 +146,7 @@
return ..()
/datum/ai_behavior/spin_web/perform(seconds_per_tick, datum/ai_controller/controller, action_key, target_key)
. = ..()
var/datum/action/innate/web_giant_spider/web_action = controller.blackboard[action_key]
if(web_action?.Trigger())
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
@@ -169,6 +171,7 @@
var/scan_range = 3
/datum/ai_behavior/find_unwrapped_target/perform(seconds_per_tick, datum/ai_controller/controller)
. = ..()
var/mob/living/spider = controller.pawn
var/atom/current_target = controller.blackboard[target_key]
if(current_target)
@@ -225,6 +228,7 @@
return ..()
/datum/ai_behavior/wrap_target/perform(seconds_per_tick, datum/ai_controller/controller, action_key, target_key)
. = ..()
var/datum/action/innate/wrap_giant_spider/wrap_action = controller.blackboard[action_key]
if(wrap_action?.Trigger())
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
@@ -257,6 +261,7 @@
return ..()
/datum/ai_behavior/lay_eggs/perform(seconds_per_tick, datum/ai_controller/controller, action_key)
. = ..()
var/datum/action/innate/lay_eggs_giant_spider/egg_action = controller.blackboard[action_key]
if(egg_action?.Trigger())
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
@@ -293,6 +298,7 @@
set_movement_target(controller, target)
/datum/ai_behavior/cling_spider_follow/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
. = ..()
var/atom/target = controller.blackboard[target_key]
if(QDELETED(target))
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
@@ -80,6 +80,7 @@
set_movement_target(controller, target)
/datum/ai_behavior/relay_message/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
. = ..()
var/mob/living/target = controller.blackboard[target_key]
var/mob/living/living_pawn = controller.pawn
@@ -67,6 +67,7 @@
var/scan_range = 3
/datum/ai_behavior/goliath_find_diggable_turf/perform(seconds_per_tick, datum/ai_controller/controller)
. = ..()
var/turf/target_turf = controller.blackboard[target_key]
if(is_valid_turf(target_turf))
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
@@ -110,6 +111,7 @@
set_movement_target(controller, target_turf)
/datum/ai_behavior/goliath_dig/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
. = ..()
var/turf/target_turf = controller.blackboard[target_key]
var/mob/living/basic/basic_mob = controller.pawn
if(!basic_mob.can_reach(target_turf))
@@ -67,6 +67,7 @@
action_cooldown = 2 MINUTES
/datum/ai_behavior/send_sos_message/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
. = ..()
var/mob/living/carbon/target = controller.blackboard[target_key]
var/mob/living/living_pawn = controller.pawn
if(QDELETED(target) || is_station_level(target.z))
@@ -157,6 +158,7 @@
set_movement_target(controller, target)
/datum/ai_behavior/minebot_mine_turf/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
. = ..()
var/mob/living/basic/living_pawn = controller.pawn
var/turf/target = controller.blackboard[target_key]
@@ -126,6 +126,7 @@
required_distance = 0
/datum/ai_behavior/summon_brood/perform(seconds_per_tick, datum/ai_controller/controller)
. = ..()
var/mob/living/basic/mining/hivelord/summoner = controller.pawn
var/mob/living/basic/mining/hivelordbrood/A = new summoner.brood_type(summoner.loc)
A.admin_spawned = summoner.admin_spawned