mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-15 12:11:45 +00:00
* [NO GBP] Fixes even more AI related CI runtimes (#80262) ## About The Pull Request Consider this a continuation of https://github.com/tgstation/tgstation/pull/80202  ~~It seems I missed a few.~~ Edit: Modified per request to handle this more broadly. If a pawn gets `qdel`'d, the ai controller should be set to off and get removed from the list of active controllers, and all their actions should be canceled. Also adds some qdeleted checks to `finish_action()`, which can still run after the pawn gets qdeleted as part of the `CancelActions()` chain. ## Why It's Good For The Game Less spurious CI failures. ## Changelog Nothing player facing really. * [NO GBP] Fixes even more AI related CI runtimes * Update _ai_controller.dm --------- Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
65 lines
2.8 KiB
Plaintext
65 lines
2.8 KiB
Plaintext
/**
|
|
* Generic Instrument Subtree, For your pawn playing instruments
|
|
*
|
|
* Requires at least a living mob that can hold items.
|
|
*
|
|
* relevant blackboards:
|
|
* * BB_SONG_INSTRUMENT - set by this subtree, is the song datum the pawn plays music from.
|
|
* * BB_SONG_LINES - not set by this subtree, is the song loaded into the song datum.
|
|
*/
|
|
/datum/ai_planning_subtree/generic_play_instrument/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
|
|
var/obj/item/instrument/song_player = controller.blackboard[BB_SONG_INSTRUMENT]
|
|
|
|
if(!song_player)
|
|
controller.queue_behavior(/datum/ai_behavior/find_and_set/in_hands, BB_SONG_INSTRUMENT, /obj/item/instrument)
|
|
return //we can't play a song since we do not have an instrument
|
|
|
|
var/list/parsed_song_lines = splittext(controller.blackboard[BB_SONG_LINES], "\n")
|
|
popleft(parsed_song_lines) //remove BPM as it is parsed out
|
|
if(!compare_list(song_player.song.lines, parsed_song_lines) || !song_player.song.repeat)
|
|
controller.queue_behavior(/datum/ai_behavior/setup_instrument, BB_SONG_INSTRUMENT, BB_SONG_LINES)
|
|
|
|
if(!song_player.song.playing) //we may stop playing if we weren't playing before, were setting up dk theme, or ran out of repeats (also causing setup behavior)
|
|
controller.queue_behavior(/datum/ai_behavior/play_instrument, BB_SONG_INSTRUMENT)
|
|
|
|
/**
|
|
* Generic Resist Subtree, resist if it makes sense to!
|
|
*
|
|
* Requires nothing beyond a living pawn, makes sense on a good amount of mobs since anything can get buckled.
|
|
*
|
|
* relevant blackboards:
|
|
* * None!
|
|
*/
|
|
/datum/ai_planning_subtree/generic_resist/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
|
|
var/mob/living/living_pawn = controller.pawn
|
|
|
|
if(SHOULD_RESIST(living_pawn) && SPT_PROB(RESIST_SUBTREE_PROB, seconds_per_tick))
|
|
controller.queue_behavior(/datum/ai_behavior/resist) //BRO IM ON FUCKING FIRE BRO
|
|
return SUBTREE_RETURN_FINISH_PLANNING //IM NOT DOING ANYTHING ELSE BUT EXTINGUISH MYSELF, GOOD GOD HAVE MERCY.
|
|
|
|
/**
|
|
* Generic Hunger Subtree,
|
|
*
|
|
* Requires at least a living mob that can hold items.
|
|
*
|
|
* relevant blackboards:
|
|
* * BB_NEXT_HUNGRY - set by this subtree, is when the controller is next hungry
|
|
*/
|
|
/datum/ai_planning_subtree/generic_hunger/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
|
|
var/next_eat = controller.blackboard[BB_NEXT_HUNGRY]
|
|
if(!next_eat)
|
|
//inits the blackboard timer
|
|
next_eat = world.time + rand(0, 30 SECONDS)
|
|
controller.set_blackboard_key(BB_NEXT_HUNGRY, next_eat)
|
|
|
|
if(world.time < next_eat)
|
|
return
|
|
|
|
if(!controller.blackboard[BB_FOOD_TARGET])
|
|
controller.queue_behavior(/datum/ai_behavior/find_and_set/edible, BB_FOOD_TARGET, /obj/item, 2)
|
|
return
|
|
|
|
controller.queue_behavior(/datum/ai_behavior/drop_item)
|
|
controller.queue_behavior(/datum/ai_behavior/consume, BB_FOOD_TARGET, BB_NEXT_HUNGRY)
|
|
return SUBTREE_RETURN_FINISH_PLANNING
|