Files
Bubberstation/code/datums/proximity_monitor/fields/ai_target_tracking.dm
Waterpig 08d9f59838 [NO GBP] Slime AI fixes + prerequisites (newest mirror: makes slimes not idle) (#27470)
* Reworks targeting behavior to fall back onto proximity monitors. Refactors ai cooldowns a bit (#82640)

## About The Pull Request

Nother bit ripped out of #79498
[Implements a get_cooldown() proc to get around dumb manual overrides
and empower me to optimize the findtarget
logic](7047d294dd)

[Adds modify_cooldown, uses it to optimize find_potential_targets
further](4ebc8cedce)

No sense running the behavior if we're just waiting on its output, so
let's run it once a minute just in case, then push an update instantly
if we find something

[Optimizes connect_range and
promxity_monitors](bcf7d7c5b3)

We know what turfs exist before and after a move
We can use this information to prevent trying to update turfs we don't
care about.

This is important because post these changes mobs with fields will be
moving a lot more, so it's gotta be cheap

[Implements a special kind of field to handle ai
targeting](80b63b3445)

If we run targeting and don't like, find anything, we should setup a
field that listens for things coming near us and then handle those
things as we find them.

This incurs a slight startup cost but saves so much time on the churn of
constant costs

Note:
We should also work to figure out a way to avoid waking ais if none is
near them/they aren't doing anything interesting

We don't need to do that immediately this acts as somewhat of a stopgap
(and would be good regardless) but it is worth keeping in mind)

## IMPORTANT

I am unsure whether this is worth it anymore since #82539 was merged. As
I say it was done as a stopgap because ais didn't know how to idle.
If not I'll rip er out and we'll keep the other
refactoring/optimizations.

## Why It's Good For The Game

Cleaner basic ai code, maybe? faster basic ai code, for sure faster
proximity monitors (significantly)

* ai controllers use cell trackers to know when to idle (#82691)

## About The Pull Request
this makes ai controllers use cell trackers and signals to determine
when to idle

## Why It's Good For The Game
might be better than looping over all clients for every controller

## Changelog
🆑
code: The way mobs idle has been refactored, please report any issues
with non-reactive mobs
/🆑

* makes slimes not idle (#82742)

## About The Pull Request
slimes should still be able to do their everyday routine without needing
to be watched over

## Why It's Good For The Game
makes xenobiologist's lives easier

## Changelog
🆑
qol: slimes will stay active without needing any one to watch over
/🆑

---------

Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com>
2024-04-25 15:05:23 +00:00

114 lines
4.8 KiB
Plaintext

// Proximity monitor that checks to see if anything interesting enters our bounds
/datum/proximity_monitor/advanced/ai_target_tracking
edge_is_a_field = TRUE
/// The ai behavior who owns us
var/datum/ai_behavior/find_potential_targets/owning_behavior
/// The ai controller we're using
var/datum/ai_controller/controller
/// The target key we're trying to fill
var/target_key
/// The targeting strategy KEY we're using
var/targeting_strategy_key
/// The hiding location key we're using
var/hiding_location_key
/// The targeting strategy we're using
var/datum/targeting_strategy/filter
/// If we've built our field yet
/// Prevents wasted work on the first build (since the behavior did it)
var/first_build = TRUE
// Initially, run the check manually
// If that fails, set up a field and have it manage the behavior fully
/datum/proximity_monitor/advanced/ai_target_tracking/New(atom/_host, range, _ignore_if_not_on_turf = TRUE, datum/ai_behavior/find_potential_targets/owning_behavior, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key)
. = ..()
src.owning_behavior = owning_behavior
src.controller = controller
src.target_key = target_key
src.targeting_strategy_key = targeting_strategy_key
src.hiding_location_key = hiding_location_key
src.filter = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key])
RegisterSignal(controller, COMSIG_QDELETING, PROC_REF(controller_deleted))
RegisterSignal(controller, COMSIG_AI_CONTROLLER_PICKED_BEHAVIORS, PROC_REF(controller_think))
RegisterSignal(controller, COMSIG_AI_CONTROLLER_POSSESSED_PAWN, PROC_REF(pawn_changed))
RegisterSignal(controller, AI_CONTROLLER_BEHAVIOR_QUEUED(owning_behavior.type), PROC_REF(behavior_requeued))
RegisterSignal(controller, COMSIG_AI_BLACKBOARD_KEY_SET(targeting_strategy_key), PROC_REF(targeting_datum_changed))
RegisterSignal(controller, COMSIG_AI_BLACKBOARD_KEY_CLEARED(targeting_strategy_key), PROC_REF(targeting_datum_cleared))
recalculate_field(full_recalc = TRUE)
/datum/proximity_monitor/advanced/ai_target_tracking/Destroy()
. = ..()
if(!QDELETED(controller) && owning_behavior)
controller.modify_cooldown(owning_behavior, owning_behavior.get_cooldown(controller))
owning_behavior = null
controller = null
target_key = null
targeting_strategy_key = null
hiding_location_key = null
filter = null
/datum/proximity_monitor/advanced/ai_target_tracking/recalculate_field(full_recalc = FALSE)
. = ..()
first_build = FALSE
/datum/proximity_monitor/advanced/ai_target_tracking/setup_field_turf(turf/target)
. = ..()
if(first_build)
return
owning_behavior.new_turf_found(target, controller, filter)
/datum/proximity_monitor/advanced/ai_target_tracking/field_turf_crossed(atom/movable/movable, turf/location, turf/old_location)
. = ..()
if(!owning_behavior.atom_allowed(movable, filter, controller.pawn))
return
owning_behavior.new_atoms_found(list(movable), controller, target_key, filter, hiding_location_key)
/// React to controller planning
/datum/proximity_monitor/advanced/ai_target_tracking/proc/controller_deleted(datum/source)
SIGNAL_HANDLER
qdel(src)
/// React to the pawn goin byebye
/datum/proximity_monitor/advanced/ai_target_tracking/proc/pawn_changed(datum/source)
SIGNAL_HANDLER
qdel(src)
/// React to controller planning
/datum/proximity_monitor/advanced/ai_target_tracking/proc/controller_think(datum/ai_controller/source, list/datum/ai_behavior/old_behaviors, list/datum/ai_behavior/new_behaviors)
SIGNAL_HANDLER
// If our parent was forgotten, nuke ourselves
if(!new_behaviors[owning_behavior])
qdel(src)
/datum/proximity_monitor/advanced/ai_target_tracking/proc/behavior_requeued(datum/source, list/new_arguments)
SIGNAL_HANDLER
check_new_args(arglist(new_arguments))
/// Ensure our args and locals are up to date
/datum/proximity_monitor/advanced/ai_target_tracking/proc/check_new_args(target_key, targeting_strategy_key, hiding_location_key)
var/update_filter = FALSE
if(src.target_key != target_key)
src.target_key = target_key
if(src.targeting_strategy_key != targeting_strategy_key)
src.targeting_strategy_key = targeting_strategy_key
update_filter = TRUE
if(src.hiding_location_key != hiding_location_key)
src.hiding_location_key = hiding_location_key
if(update_filter)
targeting_datum_changed(null)
/datum/proximity_monitor/advanced/ai_target_tracking/proc/targeting_datum_changed(datum/source)
SIGNAL_HANDLER
filter = controller.blackboard[targeting_strategy_key]
// Filter changed, need to do a full reparse
// Fucking 9 * 9 out here I stg
for(var/turf/in_field as anything in field_turfs + edge_turfs)
owning_behavior.new_turf_found(in_field, controller, filter)
/datum/proximity_monitor/advanced/ai_target_tracking/proc/targeting_datum_cleared(datum/source)
SIGNAL_HANDLER
// Go fuckin home bros
qdel(src)