All AI datum behaviors are now added using a wrapper (#60667) (#7679)

Co-authored-by: AMonkeyThatCodes <20987591+AMonkeyThatCodes@users.noreply.github.com>
This commit is contained in:
SkyratBot
2021-08-21 23:14:52 +02:00
committed by GitHub
parent 95a75c4e46
commit 851a58ef7b
19 changed files with 121 additions and 118 deletions

View File

@@ -40,6 +40,8 @@
#define BB_MONKEY_PICKUPTARGET "BB_monkey_pickuptarget"
#define BB_MONKEY_PICKPOCKETING "BB_monkey_pickpocketing"
#define BB_MONKEY_CURRENT_ATTACK_TARGET "BB_monkey_current_attack_target"
#define BB_MONKEY_CURRENT_PRESS_TARGET "BB_monkey_current_press_target"
#define BB_MONKEY_CURRENT_GIVE_TARGET "BB_monkey_current_give_target"
#define BB_MONKEY_TARGET_DISPOSAL "BB_monkey_target_disposal"
#define BB_MONKEY_DISPOSING "BB_monkey_disposing"
#define BB_MONKEY_RECRUIT_COOLDOWN "BB_monkey_recruit_cooldown"

View File

@@ -201,7 +201,8 @@ multiple modular subtrees with behaviors
/datum/ai_controller/proc/PauseAi(time)
paused_until = world.time + time
/datum/ai_controller/proc/AddBehavior(behavior_type, ...)
///Call this to add a behavior to the stack.
/datum/ai_controller/proc/queue_behavior(behavior_type, ...)
var/datum/ai_behavior/behavior = GET_AI_BEHAVIOR(behavior_type)
if(!behavior)
CRASH("Behavior [behavior_type] not found.")
@@ -213,6 +214,8 @@ multiple modular subtrees with behaviors
arguments.Cut(1, 2)
if(length(arguments))
behavior_args[behavior_type] = arguments
else
behavior_args[behavior_type] = null
/datum/ai_controller/proc/ProcessBehavior(delta_time, datum/ai_behavior/behavior)
var/list/arguments = list(delta_time, src)

View File

@@ -17,17 +17,18 @@
required_distance = 3
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT
action_cooldown = 20
///Blackboard key for the max attempt of throws
var/throw_count_key
///Blackboard key for the target to hit
var/target_key
///Sound to use
var/attack_sound
///Max attemps to make
var/max_attempts = 3
/datum/ai_behavior/item_move_close_and_attack/perform(delta_time, datum/ai_controller/controller)
/datum/ai_behavior/item_move_close_and_attack/setup(datum/ai_controller/controller, target_key, throw_count_key)
. = ..()
controller.current_movement_target = controller.blackboard[target_key]
/datum/ai_behavior/item_move_close_and_attack/perform(delta_time, datum/ai_controller/controller, target_key, throw_count_key)
. = ..()
var/obj/item/item_pawn = controller.pawn
var/atom/throw_target = controller.blackboard[target_key]
@@ -37,24 +38,21 @@
playsound(item_pawn.loc, attack_sound, 100, TRUE)
controller.blackboard[throw_count_key]++
if(controller.blackboard[throw_count_key] >= max_attempts)
finish_action(controller, TRUE)
finish_action(controller, TRUE, target_key, throw_count_key)
/datum/ai_behavior/item_move_close_and_attack/finish_action(datum/ai_controller/controller, succeeded)
/datum/ai_behavior/item_move_close_and_attack/finish_action(datum/ai_controller/controller, succeeded, target_key, throw_count_key)
. = ..()
reset_blackboard(controller, succeeded)
reset_blackboard(controller, succeeded, target_key, throw_count_key)
/datum/ai_behavior/item_move_close_and_attack/proc/reset_blackboard(datum/ai_controller/controller, succeeded)
controller.blackboard[throw_count_key] = 0
/datum/ai_behavior/item_move_close_and_attack/proc/reset_blackboard(datum/ai_controller/controller, succeeded, target_key, throw_count_key)
controller.blackboard[target_key] = null
controller.blackboard[throw_count_key] = 0
/datum/ai_behavior/item_move_close_and_attack/haunted
throw_count_key = BB_HAUNTED_THROW_ATTEMPT_COUNT
target_key = BB_HAUNT_TARGET
attack_sound = 'sound/items/haunted/ghostitemattack.ogg'
max_attempts = 4
/datum/ai_behavior/item_move_close_and_attack/haunted/finish_action(datum/ai_controller/controller, succeeded)
/datum/ai_behavior/item_move_close_and_attack/haunted/finish_action(datum/ai_controller/controller, succeeded, target_key, throw_count_key)
var/atom/throw_target = controller.blackboard[target_key]
var/list/hauntee_list = controller.blackboard[BB_TO_HAUNT_LIST]
hauntee_list[throw_target]--

View File

@@ -1,7 +1,4 @@
/datum/ai_behavior/break_spine/bane
target_key = BB_BANE_BATMAN
/datum/ai_behavior/break_spine/bane/finish_action(datum/ai_controller/controller, succeeded)
var/list/bane_quotes = strings("bane.json", "bane")
var/mob/living/bane = controller.pawn

View File

@@ -9,6 +9,5 @@
batman = possibly_the_dark_knight
break
if(batman)
controller.current_movement_target = batman
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/break_spine/bane))
controller.queue_behavior(/datum/ai_behavior/break_spine/bane, BB_BANE_BATMAN)
return SUBTREE_RETURN_FINISH_PLANNING

View File

@@ -5,12 +5,10 @@
bb_key_to_set = BB_CURSE_TARGET
/datum/ai_behavior/item_move_close_and_attack/cursed
throw_count_key = BB_CURSED_THROW_ATTEMPT_COUNT
target_key = BB_CURSE_TARGET
attack_sound = 'sound/items/haunted/ghostitemattack.ogg'
max_attempts = 4
/datum/ai_behavior/item_move_close_and_attack/cursed/reset_blackboard(datum/ai_controller/controller, succeeded)
/datum/ai_behavior/item_move_close_and_attack/cursed/reset_blackboard(datum/ai_controller/controller, succeeded, target_key, throw_count_key)
var/atom/throw_target = controller.blackboard[target_key]
//dropping our target from the blackboard if they are no longer a valid target after the attack behavior
if(get_dist(throw_target, controller.pawn) > CURSED_VIEW_RANGE)

View File

@@ -4,11 +4,11 @@
//make sure we have a target
var/mob/living/carbon/curse_target = controller.blackboard[BB_CURSE_TARGET]
if(!curse_target)
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/find_and_set/cursed))
controller.queue_behavior(/datum/ai_behavior/find_and_set/cursed)
return
//make sure attack is valid
if(get_dist(curse_target, item_pawn) > CURSED_VIEW_RANGE)
controller.blackboard[BB_CURSE_TARGET] = null
return
controller.current_movement_target = curse_target
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/item_move_close_and_attack/cursed))
controller.queue_behavior(/datum/ai_behavior/item_move_close_and_attack/cursed)

View File

@@ -104,7 +104,7 @@
current_movement_target = thrown_thing
blackboard[BB_FETCH_TARGET] = thrown_thing
blackboard[BB_FETCH_DELIVER_TO] = throwing_datum.thrower
LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/fetch))
queue_behavior(/datum/ai_behavior/fetch)
/// Someone's interacting with us by hand, see if they're being nice or mean
/datum/ai_controller/dog/proc/on_attack_hand(datum/source, mob/living/user)
@@ -253,7 +253,7 @@
if(COMMAND_DIE)
blackboard[BB_DOG_ORDER_MODE] = DOG_COMMAND_NONE
CancelActions()
LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/play_dead))
queue_behavior(/datum/ai_behavior/play_dead)
/// Someone we like is pointing at something, see if it's something we might want to interact with (like if they might want us to fetch something for them)
/datum/ai_controller/dog/proc/check_point(mob/pointing_friend, atom/movable/pointed_movable)
@@ -284,12 +284,12 @@
blackboard[BB_FETCH_TARGET] = pointed_movable
blackboard[BB_FETCH_DELIVER_TO] = pointing_friend
if(living_pawn.buckled)
LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/resist))//in case they are in bed or something
LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/fetch))
queue_behavior(/datum/ai_behavior/resist)//in case they are in bed or something
queue_behavior(/datum/ai_behavior/fetch)
if(DOG_COMMAND_ATTACK)
pawn.visible_message(span_notice("[pawn] follows [pointing_friend]'s gesture towards [pointed_movable] and growls intensely!"))
current_movement_target = pointed_movable
blackboard[BB_DOG_HARASS_TARGET] = WEAKREF(pointed_movable)
if(living_pawn.buckled)
LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/resist))//in case they are in bed or something
LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/harass))
queue_behavior(/datum/ai_behavior/resist)//in case they are in bed or something
queue_behavior(/datum/ai_behavior/harass)

View File

@@ -20,9 +20,9 @@
if(in_range(living_pawn, interact_target) && (isturf(interact_target.loc)))
controller.current_movement_target = interact_target
if(IS_EDIBLE(interact_target))
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/eat_snack))
controller.queue_behavior(/datum/ai_behavior/eat_snack)
else if(isitem(interact_target))
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/simple_equip))
controller.queue_behavior(/datum/ai_behavior/simple_equip)
else
controller.blackboard[BB_FETCH_TARGET] = null
controller.blackboard[BB_FETCH_DELIVER_TO] = null
@@ -36,5 +36,5 @@
controller.blackboard[BB_FETCH_DELIVER_TO] = null
return
controller.current_movement_target = return_target
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/deliver_item))
controller.queue_behavior(/datum/ai_behavior/deliver_item)
return

View File

@@ -27,11 +27,13 @@
/datum/ai_behavior/break_spine
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT
action_cooldown = 0.7 SECONDS
var/target_key
var/give_up_distance = 10
/datum/ai_behavior/break_spine/setup(datum/ai_controller/controller, target_key)
. = ..()
controller.current_movement_target = controller.blackboard[target_key]
/datum/ai_behavior/break_spine/perform(delta_time, datum/ai_controller/controller)
/datum/ai_behavior/break_spine/perform(delta_time, datum/ai_controller/controller, target_key)
var/mob/living/batman = controller.blackboard[target_key]
var/mob/living/big_guy = controller.pawn //he was molded by the darkness
@@ -57,7 +59,7 @@
finish_action(controller, TRUE)
/datum/ai_behavior/break_spine/finish_action(datum/ai_controller/controller, succeeded)
/datum/ai_behavior/break_spine/finish_action(datum/ai_controller/controller, succeeded, target_key)
if(succeeded)
controller.blackboard[target_key] = null
return ..()
@@ -66,6 +68,7 @@
/datum/ai_behavior/use_in_hand
behavior_flags = AI_BEHAVIOR_MOVE_AND_PERFORM
/datum/ai_behavior/use_in_hand/perform(delta_time, datum/ai_controller/controller)
. = ..()
var/mob/living/pawn = controller.pawn
@@ -81,11 +84,15 @@
required_distance = 1
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT
/datum/ai_behavior/use_on_object/perform(delta_time, datum/ai_controller/controller)
/datum/ai_behavior/use_on_object/setup(datum/ai_controller/controller, target_key)
. = ..()
controller.current_movement_target = controller.blackboard[target_key]
/datum/ai_behavior/use_on_object/perform(delta_time, datum/ai_controller/controller, target_key)
. = ..()
var/mob/living/pawn = controller.pawn
var/obj/item/held_item = pawn.get_item_by_slot(pawn.get_active_hand())
var/atom/target = controller.current_movement_target
var/atom/target = controller.blackboard[BB_MONKEY_CURRENT_PRESS_TARGET]
if(!target || !pawn.CanReach(target))
finish_action(controller, FALSE)
@@ -103,11 +110,17 @@
required_distance = 1
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT
/datum/ai_behavior/give/perform(delta_time, datum/ai_controller/controller)
/datum/ai_behavior/give/setup(datum/ai_controller/controller, target_key)
. = ..()
controller.current_movement_target = controller.blackboard[target_key]
/datum/ai_behavior/give/perform(delta_time, datum/ai_controller/controller, target_key)
. = ..()
var/mob/living/pawn = controller.pawn
var/obj/item/held_item = pawn.get_item_by_slot(pawn.get_active_hand())
var/atom/target = controller.current_movement_target
var/atom/target = controller.blackboard[target_key]
if(!target || !pawn.CanReach(target) || !isliving(target))
finish_action(controller, FALSE)

View File

@@ -3,7 +3,7 @@
if(ismob(item_pawn.loc)) //We're being held, maybe escape?
if(DT_PROB(HAUNTED_ITEM_ESCAPE_GRASP_CHANCE, delta_time))
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/item_escape_grasp))
controller.queue_behavior(/datum/ai_behavior/item_escape_grasp)
return SUBTREE_RETURN_FINISH_PLANNING
if(!DT_PROB(HAUNTED_ITEM_ATTACK_HAUNT_CHANCE, delta_time))
@@ -17,6 +17,5 @@
var/mob/living/potential_target = i
if(get_dist(potential_target, item_pawn) <= 7)
controller.blackboard[BB_HAUNT_TARGET] = potential_target
controller.current_movement_target = potential_target
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/item_move_close_and_attack/haunted))
controller.queue_behavior(/datum/ai_behavior/item_move_close_and_attack/haunted, BB_HAUNT_TARGET, BB_HAUNTED_THROW_ATTEMPT_COUNT)
return SUBTREE_RETURN_FINISH_PLANNING

View File

@@ -187,8 +187,8 @@
current_movement_target = commander
var/mob/living/living_pawn = pawn
if(living_pawn.buckled)
LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/resist))//in case they are in bed or something
LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/follow))
queue_behavior(/datum/ai_behavior/resist)//in case they are in bed or something
queue_behavior(/datum/ai_behavior/follow)
// attack: harass whoever the commander points to
if(COMMAND_ATTACK)
pawn.visible_message(span_danger("[pawn] [blackboard[BB_HOSTILE_ATTACK_WORD]] at [commander]'s command, and [pawn.p_they()] growl[pawn.p_s()] intensely.")) // imagine getting intimidated by a corgi
@@ -218,5 +218,5 @@
current_movement_target = pointed_movable
blackboard[BB_ATTACK_TARGET] = WEAKREF(pointed_movable)
if(living_pawn.buckled)
LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/resist))//in case they are in bed or something
LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/attack))
queue_behavior(/datum/ai_behavior/resist)//in case they are in bed or something
queue_behavior(/datum/ai_behavior/attack)

View File

@@ -228,19 +228,19 @@
/datum/ai_behavior/disposal_mob
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM //performs to increase frustration
/datum/ai_behavior/disposal_mob/finish_action(datum/ai_controller/controller, succeeded)
/datum/ai_behavior/disposal_mob/finish_action(datum/ai_controller/controller, succeeded, attack_target_key, disposal_target_key)
. = ..()
controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = null //Reset attack target
controller.blackboard[attack_target_key] = null //Reset attack target
controller.blackboard[BB_MONKEY_DISPOSING] = FALSE //No longer disposing
controller.blackboard[BB_MONKEY_TARGET_DISPOSAL] = null //No target disposal
controller.blackboard[disposal_target_key] = null //No target disposal
/datum/ai_behavior/disposal_mob/perform(delta_time, datum/ai_controller/controller)
/datum/ai_behavior/disposal_mob/perform(delta_time, datum/ai_controller/controller, attack_target_key, disposal_target_key)
. = ..()
if(controller.blackboard[BB_MONKEY_DISPOSING]) //We are disposing, don't do ANYTHING!!!!
return
var/mob/living/target = controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET]
var/mob/living/target = controller.blackboard[attack_target_key]
var/mob/living/living_pawn = controller.pawn
controller.current_movement_target = target
@@ -250,24 +250,24 @@
target.grabbedby(living_pawn)
return //Do the rest next turn
var/obj/machinery/disposal/disposal = controller.blackboard[BB_MONKEY_TARGET_DISPOSAL]
var/obj/machinery/disposal/disposal = controller.blackboard[disposal_target_key]
controller.current_movement_target = disposal
if(living_pawn.Adjacent(disposal))
INVOKE_ASYNC(src, .proc/try_disposal_mob, controller) //put him in!
INVOKE_ASYNC(src, .proc/try_disposal_mob, controller, attack_target_key, disposal_target_key) //put him in!
else //This means we might be getting pissed!
return
/datum/ai_behavior/disposal_mob/proc/try_disposal_mob(datum/ai_controller/controller)
/datum/ai_behavior/disposal_mob/proc/try_disposal_mob(datum/ai_controller/controller, attack_target_key, disposal_target_key)
var/mob/living/living_pawn = controller.pawn
var/mob/living/target = controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET]
var/obj/machinery/disposal/disposal = controller.blackboard[BB_MONKEY_TARGET_DISPOSAL]
var/mob/living/target = controller.blackboard[attack_target_key]
var/obj/machinery/disposal/disposal = controller.blackboard[disposal_target_key]
controller.blackboard[BB_MONKEY_DISPOSING] = TRUE
if(target && disposal?.stuff_mob_in(target, living_pawn))
disposal.flush()
finish_action(controller, TRUE)
finish_action(controller, TRUE, attack_target_key, disposal_target_key)
/datum/ai_behavior/recruit_monkeys/perform(delta_time, datum/ai_controller/controller)

View File

@@ -113,9 +113,9 @@ have ways of interacting with a specific mob and control it.
blackboard[BB_MONKEY_PICKUPTARGET] = weapon
current_movement_target = weapon
if(pickpocket)
LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/monkey_equip/pickpocket))
queue_behavior(current_behaviors, /datum/ai_behavior/monkey_equip/pickpocket)
else
LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/monkey_equip/ground))
queue_behavior(current_behaviors, /datum/ai_behavior/monkey_equip/ground)
return TRUE
/// Returns either the best weapon from the given choices or null if held weapons are better
@@ -150,33 +150,6 @@ have ways of interacting with a specific mob and control it.
return top_force_item
/datum/ai_controller/monkey/proc/TryFindFood()
. = FALSE
var/mob/living/living_pawn = pawn
// Held items
var/list/food_candidates = list()
for(var/obj/item as anything in living_pawn.held_items)
if(!item || !IsEdible(item))
continue
food_candidates += item
for(var/obj/item/candidate in oview(2, living_pawn))
if(!IsEdible(candidate))
continue
food_candidates += candidate
if(length(food_candidates))
var/obj/item/best_held = GetBestWeapon(null, living_pawn.held_items)
for(var/obj/item/held as anything in living_pawn.held_items)
if(!held || held == best_held)
continue
living_pawn.dropItemToGround(held)
AddBehavior(/datum/ai_behavior/consume, pick(food_candidates))
return TRUE
/datum/ai_controller/monkey/proc/IsEdible(obj/item/thing)
if(IS_EDIBLE(thing))
return TRUE

View File

@@ -2,7 +2,7 @@
var/mob/living/living_pawn = controller.pawn
if(SHOULD_RESIST(living_pawn) && DT_PROB(MONKEY_RESIST_PROB, delta_time))
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/resist)) //BRO IM ON FUCKING FIRE BRO
controller.queue_behavior(/datum/ai_behavior/resist) //BRO IM ON FUCKING FIRE BRO
return SUBTREE_RETURN_FINISH_PLANNING //IM NOT DOING ANYTHING ELSE BUT EXTUINGISH MYSELF, GOOD GOD HAVE MERCY.
var/list/enemies = controller.blackboard[BB_MONKEY_ENEMIES]
@@ -25,7 +25,7 @@
if(!selected_enemy.stat) //He's up, get him!
if(living_pawn.health < MONKEY_FLEE_HEALTH) //Time to skeddadle
controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = selected_enemy
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/monkey_flee))
controller.queue_behavior(/datum/ai_behavior/monkey_flee)
return //I'm running fuck you guys
if(controller.TryFindWeapon()) //Getting a weapon is higher priority if im not fleeing.
@@ -34,9 +34,9 @@
controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = selected_enemy
controller.current_movement_target = selected_enemy
if(controller.blackboard[BB_MONKEY_RECRUIT_COOLDOWN] < world.time)
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/recruit_monkeys))
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/battle_screech/monkey))
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/monkey_attack_mob))
controller.queue_behavior(/datum/ai_behavior/recruit_monkeys)
controller.queue_behavior(/datum/ai_behavior/battle_screech/monkey)
controller.queue_behavior(/datum/ai_behavior/monkey_attack_mob)
return SUBTREE_RETURN_FINISH_PLANNING //Focus on this
else //He's down, can we disposal him?
@@ -44,16 +44,35 @@
if(bodyDisposal)
controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = selected_enemy
controller.blackboard[BB_MONKEY_TARGET_DISPOSAL] = bodyDisposal
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/disposal_mob))
controller.queue_behavior(/datum/ai_behavior/disposal_mob, BB_MONKEY_CURRENT_ATTACK_TARGET, BB_MONKEY_TARGET_DISPOSAL)
return SUBTREE_RETURN_FINISH_PLANNING
if(prob(5))
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/use_in_hand))
controller.queue_behavior(/datum/ai_behavior/use_in_hand)
if(selected_enemy || !DT_PROB(MONKEY_SHENANIGAN_PROB, delta_time))
return
if(world.time >= controller.blackboard[BB_MONKEY_NEXT_HUNGRY] && controller.TryFindFood())
if(world.time >= controller.blackboard[BB_MONKEY_NEXT_HUNGRY])
var/list/food_candidates = list()
for(var/obj/item as anything in living_pawn.held_items)
if(!item || !controller.IsEdible(item))
continue
food_candidates += item
for(var/obj/item/candidate in oview(2, living_pawn))
if(!controller.IsEdible(candidate))
continue
food_candidates += candidate
if(length(food_candidates))
var/obj/item/best_held = controller.GetBestWeapon(null, living_pawn.held_items)
for(var/obj/item/held as anything in living_pawn.held_items)
if(!held || held == best_held)
continue
living_pawn.dropItemToGround(held)
controller.queue_behavior(/datum/ai_behavior/consume, pick(food_candidates))
return
if(prob(50))
@@ -66,8 +85,8 @@
possible_targets += thing
var/atom/target = pick(possible_targets)
if(target)
controller.current_movement_target = target
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/use_on_object))
controller.blackboard[BB_MONKEY_CURRENT_PRESS_TARGET] = target
controller.queue_behavior(/datum/ai_behavior/use_on_object, BB_MONKEY_CURRENT_PRESS_TARGET)
return
if(prob(5) && (locate(/obj/item) in living_pawn.held_items))
@@ -76,9 +95,8 @@
possible_receivers += candidate
if(length(possible_receivers))
var/mob/living/target = pick(possible_receivers)
controller.current_movement_target = target
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/give))
controller.blackboard[BB_MONKEY_CURRENT_GIVE_TARGET] = pick(possible_receivers)
controller.queue_behavior(/datum/ai_behavior/give, BB_MONKEY_CURRENT_GIVE_TARGET)
return
controller.TryFindWeapon()

View File

@@ -5,6 +5,11 @@
///Time to telegraph and tilt over
var/time_to_tilt = 0.8 SECONDS
/datum/ai_behavior/vendor_crush/setup(datum/ai_controller/controller, target_key)
. = ..()
controller.current_movement_target = controller.blackboard[target_key]
/datum/ai_behavior/vendor_crush/perform(delta_time, datum/ai_controller/controller)
. = ..()
if(controller.blackboard[BB_VENDING_BUSY_TILTING])

View File

@@ -34,7 +34,7 @@
if(vendor_pawn.tilted) //We're tilted, try to untilt
if(blackboard[BB_VENDING_UNTILT_COOLDOWN] > world.time)
return
LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/vendor_rise_up))
queue_behavior(/datum/ai_behavior/vendor_rise_up)
return
else //Not tilted, try to find target to tilt onto.
if(blackboard[BB_VENDING_TILT_COOLDOWN] > world.time)
@@ -42,8 +42,7 @@
for(var/mob/living/living_target in oview(vision_range, pawn))
if(living_target.stat || living_target.incorporeal_move) //They're already fucked up or incorporeal
continue
current_movement_target = living_target
blackboard[BB_VENDING_CURRENT_TARGET] = living_target
LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/vendor_crush))
queue_behavior(/datum/ai_behavior/vendor_crush, BB_VENDING_CURRENT_TARGET)
return
blackboard[BB_VENDING_TILT_COOLDOWN] = world.time + search_for_enemy_cooldown

View File

@@ -113,11 +113,12 @@
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT
required_distance = 1
/datum/ai_behavior/leave_venue/perform(delta_time, datum/ai_controller/controller)
/datum/ai_behavior/leave_venue/setup(datum/ai_controller/controller, venue_key)
. = ..()
var/datum/venue/attending_venue = controller.blackboard[venue_key]
controller.current_movement_target = attending_venue.restaurant_portal
/datum/ai_behavior/leave_venue/perform(delta_time, datum/ai_controller/controller, venue_key)
. = ..()
qdel(controller.pawn) //save the world, my final message, goodbye.
finish_action(controller, TRUE)
/datum/ai_behavior/break_spine/robot_customer
target_key = BB_CUSTOMER_CURRENT_TARGET

View File

@@ -1,25 +1,23 @@
/datum/ai_planning_subtree/robot_customer/SelectBehaviors(datum/ai_controller/controller, delta_time)
if(controller.blackboard[BB_CUSTOMER_LEAVING])
var/datum/venue/attending_venue = controller.blackboard[BB_CUSTOMER_ATTENDING_VENUE]
controller.current_movement_target = attending_venue.restaurant_portal
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/leave_venue))
controller.queue_behavior(/datum/ai_behavior/leave_venue, BB_CUSTOMER_ATTENDING_VENUE)
return SUBTREE_RETURN_FINISH_PLANNING
if(controller.blackboard[BB_CUSTOMER_CURRENT_TARGET])
controller.current_movement_target = controller.blackboard[BB_CUSTOMER_CURRENT_TARGET]
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/break_spine/robot_customer))
controller.queue_behavior(/datum/ai_behavior/break_spine, BB_CUSTOMER_CURRENT_TARGET)
return SUBTREE_RETURN_FINISH_PLANNING
var/obj/my_seat = controller.blackboard[BB_CUSTOMER_MY_SEAT]
if(!my_seat) //We havn't got a seat yet! find one!
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/find_seat))
controller.queue_behavior(/datum/ai_behavior/find_seat)
return SUBTREE_RETURN_FINISH_PLANNING
controller.current_movement_target = my_seat
if(!controller.blackboard[BB_CUSTOMER_CURRENT_ORDER]) //We havn't ordered yet even ordered yet. go on! go over there and go do it!
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/order_food))
controller.queue_behavior(/datum/ai_behavior/order_food)
return SUBTREE_RETURN_FINISH_PLANNING
else
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/wait_for_food))
controller.queue_behavior(/datum/ai_behavior/wait_for_food)