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_PICKUPTARGET "BB_monkey_pickuptarget"
#define BB_MONKEY_PICKPOCKETING "BB_monkey_pickpocketing" #define BB_MONKEY_PICKPOCKETING "BB_monkey_pickpocketing"
#define BB_MONKEY_CURRENT_ATTACK_TARGET "BB_monkey_current_attack_target" #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_TARGET_DISPOSAL "BB_monkey_target_disposal"
#define BB_MONKEY_DISPOSING "BB_monkey_disposing" #define BB_MONKEY_DISPOSING "BB_monkey_disposing"
#define BB_MONKEY_RECRUIT_COOLDOWN "BB_monkey_recruit_cooldown" #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) /datum/ai_controller/proc/PauseAi(time)
paused_until = world.time + 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) var/datum/ai_behavior/behavior = GET_AI_BEHAVIOR(behavior_type)
if(!behavior) if(!behavior)
CRASH("Behavior [behavior_type] not found.") CRASH("Behavior [behavior_type] not found.")
@@ -213,6 +214,8 @@ multiple modular subtrees with behaviors
arguments.Cut(1, 2) arguments.Cut(1, 2)
if(length(arguments)) if(length(arguments))
behavior_args[behavior_type] = arguments behavior_args[behavior_type] = arguments
else
behavior_args[behavior_type] = null
/datum/ai_controller/proc/ProcessBehavior(delta_time, datum/ai_behavior/behavior) /datum/ai_controller/proc/ProcessBehavior(delta_time, datum/ai_behavior/behavior)
var/list/arguments = list(delta_time, src) var/list/arguments = list(delta_time, src)

View File

@@ -17,17 +17,18 @@
required_distance = 3 required_distance = 3
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT
action_cooldown = 20 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 ///Sound to use
var/attack_sound var/attack_sound
///Max attemps to make ///Max attemps to make
var/max_attempts = 3 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/obj/item/item_pawn = controller.pawn
var/atom/throw_target = controller.blackboard[target_key] var/atom/throw_target = controller.blackboard[target_key]
@@ -37,24 +38,21 @@
playsound(item_pawn.loc, attack_sound, 100, TRUE) playsound(item_pawn.loc, attack_sound, 100, TRUE)
controller.blackboard[throw_count_key]++ controller.blackboard[throw_count_key]++
if(controller.blackboard[throw_count_key] >= max_attempts) 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, 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
controller.blackboard[target_key] = null controller.blackboard[target_key] = null
controller.blackboard[throw_count_key] = 0
/datum/ai_behavior/item_move_close_and_attack/haunted /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' attack_sound = 'sound/items/haunted/ghostitemattack.ogg'
max_attempts = 4 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/atom/throw_target = controller.blackboard[target_key]
var/list/hauntee_list = controller.blackboard[BB_TO_HAUNT_LIST] var/list/hauntee_list = controller.blackboard[BB_TO_HAUNT_LIST]
hauntee_list[throw_target]-- 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) /datum/ai_behavior/break_spine/bane/finish_action(datum/ai_controller/controller, succeeded)
var/list/bane_quotes = strings("bane.json", "bane") var/list/bane_quotes = strings("bane.json", "bane")
var/mob/living/bane = controller.pawn var/mob/living/bane = controller.pawn

View File

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

View File

@@ -5,12 +5,10 @@
bb_key_to_set = BB_CURSE_TARGET bb_key_to_set = BB_CURSE_TARGET
/datum/ai_behavior/item_move_close_and_attack/cursed /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' attack_sound = 'sound/items/haunted/ghostitemattack.ogg'
max_attempts = 4 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] 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 //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) if(get_dist(throw_target, controller.pawn) > CURSED_VIEW_RANGE)

View File

@@ -4,11 +4,11 @@
//make sure we have a target //make sure we have a target
var/mob/living/carbon/curse_target = controller.blackboard[BB_CURSE_TARGET] var/mob/living/carbon/curse_target = controller.blackboard[BB_CURSE_TARGET]
if(!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 return
//make sure attack is valid //make sure attack is valid
if(get_dist(curse_target, item_pawn) > CURSED_VIEW_RANGE) if(get_dist(curse_target, item_pawn) > CURSED_VIEW_RANGE)
controller.blackboard[BB_CURSE_TARGET] = null controller.blackboard[BB_CURSE_TARGET] = null
return return
controller.current_movement_target = curse_target 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 current_movement_target = thrown_thing
blackboard[BB_FETCH_TARGET] = thrown_thing blackboard[BB_FETCH_TARGET] = thrown_thing
blackboard[BB_FETCH_DELIVER_TO] = throwing_datum.thrower 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 /// 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) /datum/ai_controller/dog/proc/on_attack_hand(datum/source, mob/living/user)
@@ -253,7 +253,7 @@
if(COMMAND_DIE) if(COMMAND_DIE)
blackboard[BB_DOG_ORDER_MODE] = DOG_COMMAND_NONE blackboard[BB_DOG_ORDER_MODE] = DOG_COMMAND_NONE
CancelActions() 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) /// 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) /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_TARGET] = pointed_movable
blackboard[BB_FETCH_DELIVER_TO] = pointing_friend blackboard[BB_FETCH_DELIVER_TO] = pointing_friend
if(living_pawn.buckled) if(living_pawn.buckled)
LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/resist))//in case they are in bed or something queue_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/fetch)
if(DOG_COMMAND_ATTACK) if(DOG_COMMAND_ATTACK)
pawn.visible_message(span_notice("[pawn] follows [pointing_friend]'s gesture towards [pointed_movable] and growls intensely!")) pawn.visible_message(span_notice("[pawn] follows [pointing_friend]'s gesture towards [pointed_movable] and growls intensely!"))
current_movement_target = pointed_movable current_movement_target = pointed_movable
blackboard[BB_DOG_HARASS_TARGET] = WEAKREF(pointed_movable) blackboard[BB_DOG_HARASS_TARGET] = WEAKREF(pointed_movable)
if(living_pawn.buckled) if(living_pawn.buckled)
LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/resist))//in case they are in bed or something queue_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/harass)

View File

@@ -20,9 +20,9 @@
if(in_range(living_pawn, interact_target) && (isturf(interact_target.loc))) if(in_range(living_pawn, interact_target) && (isturf(interact_target.loc)))
controller.current_movement_target = interact_target controller.current_movement_target = interact_target
if(IS_EDIBLE(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)) 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 else
controller.blackboard[BB_FETCH_TARGET] = null controller.blackboard[BB_FETCH_TARGET] = null
controller.blackboard[BB_FETCH_DELIVER_TO] = null controller.blackboard[BB_FETCH_DELIVER_TO] = null
@@ -36,5 +36,5 @@
controller.blackboard[BB_FETCH_DELIVER_TO] = null controller.blackboard[BB_FETCH_DELIVER_TO] = null
return return
controller.current_movement_target = return_target 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 return

View File

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

View File

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

View File

@@ -187,8 +187,8 @@
current_movement_target = commander current_movement_target = commander
var/mob/living/living_pawn = pawn var/mob/living/living_pawn = pawn
if(living_pawn.buckled) if(living_pawn.buckled)
LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/resist))//in case they are in bed or something queue_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/follow)
// attack: harass whoever the commander points to // attack: harass whoever the commander points to
if(COMMAND_ATTACK) 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 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 current_movement_target = pointed_movable
blackboard[BB_ATTACK_TARGET] = WEAKREF(pointed_movable) blackboard[BB_ATTACK_TARGET] = WEAKREF(pointed_movable)
if(living_pawn.buckled) if(living_pawn.buckled)
LAZYADD(current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/resist))//in case they are in bed or something queue_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/attack)

View File

@@ -228,19 +228,19 @@
/datum/ai_behavior/disposal_mob /datum/ai_behavior/disposal_mob
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM //performs to increase frustration 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_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!!!! if(controller.blackboard[BB_MONKEY_DISPOSING]) //We are disposing, don't do ANYTHING!!!!
return 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 var/mob/living/living_pawn = controller.pawn
controller.current_movement_target = target controller.current_movement_target = target
@@ -250,24 +250,24 @@
target.grabbedby(living_pawn) target.grabbedby(living_pawn)
return //Do the rest next turn 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 controller.current_movement_target = disposal
if(living_pawn.Adjacent(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! else //This means we might be getting pissed!
return 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/living_pawn = controller.pawn
var/mob/living/target = controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] var/mob/living/target = controller.blackboard[attack_target_key]
var/obj/machinery/disposal/disposal = controller.blackboard[BB_MONKEY_TARGET_DISPOSAL] var/obj/machinery/disposal/disposal = controller.blackboard[disposal_target_key]
controller.blackboard[BB_MONKEY_DISPOSING] = TRUE controller.blackboard[BB_MONKEY_DISPOSING] = TRUE
if(target && disposal?.stuff_mob_in(target, living_pawn)) if(target && disposal?.stuff_mob_in(target, living_pawn))
disposal.flush() 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) /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 blackboard[BB_MONKEY_PICKUPTARGET] = weapon
current_movement_target = weapon current_movement_target = weapon
if(pickpocket) 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 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 return TRUE
/// Returns either the best weapon from the given choices or null if held weapons are better /// 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 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) /datum/ai_controller/monkey/proc/IsEdible(obj/item/thing)
if(IS_EDIBLE(thing)) if(IS_EDIBLE(thing))
return TRUE return TRUE

View File

@@ -2,7 +2,7 @@
var/mob/living/living_pawn = controller.pawn var/mob/living/living_pawn = controller.pawn
if(SHOULD_RESIST(living_pawn) && DT_PROB(MONKEY_RESIST_PROB, delta_time)) 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. 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] var/list/enemies = controller.blackboard[BB_MONKEY_ENEMIES]
@@ -25,7 +25,7 @@
if(!selected_enemy.stat) //He's up, get him! if(!selected_enemy.stat) //He's up, get him!
if(living_pawn.health < MONKEY_FLEE_HEALTH) //Time to skeddadle if(living_pawn.health < MONKEY_FLEE_HEALTH) //Time to skeddadle
controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = selected_enemy 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 return //I'm running fuck you guys
if(controller.TryFindWeapon()) //Getting a weapon is higher priority if im not fleeing. 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.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = selected_enemy
controller.current_movement_target = selected_enemy controller.current_movement_target = selected_enemy
if(controller.blackboard[BB_MONKEY_RECRUIT_COOLDOWN] < world.time) if(controller.blackboard[BB_MONKEY_RECRUIT_COOLDOWN] < world.time)
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/recruit_monkeys)) controller.queue_behavior(/datum/ai_behavior/recruit_monkeys)
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/battle_screech/monkey)) controller.queue_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/monkey_attack_mob)
return SUBTREE_RETURN_FINISH_PLANNING //Focus on this return SUBTREE_RETURN_FINISH_PLANNING //Focus on this
else //He's down, can we disposal him? else //He's down, can we disposal him?
@@ -44,17 +44,36 @@
if(bodyDisposal) if(bodyDisposal)
controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = selected_enemy controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = selected_enemy
controller.blackboard[BB_MONKEY_TARGET_DISPOSAL] = bodyDisposal 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 return SUBTREE_RETURN_FINISH_PLANNING
if(prob(5)) 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)) if(selected_enemy || !DT_PROB(MONKEY_SHENANIGAN_PROB, delta_time))
return return
if(world.time >= controller.blackboard[BB_MONKEY_NEXT_HUNGRY] && controller.TryFindFood()) if(world.time >= controller.blackboard[BB_MONKEY_NEXT_HUNGRY])
return 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)) if(prob(50))
var/list/possible_targets = list() var/list/possible_targets = list()
@@ -66,8 +85,8 @@
possible_targets += thing possible_targets += thing
var/atom/target = pick(possible_targets) var/atom/target = pick(possible_targets)
if(target) if(target)
controller.current_movement_target = target controller.blackboard[BB_MONKEY_CURRENT_PRESS_TARGET] = target
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/use_on_object)) controller.queue_behavior(/datum/ai_behavior/use_on_object, BB_MONKEY_CURRENT_PRESS_TARGET)
return return
if(prob(5) && (locate(/obj/item) in living_pawn.held_items)) if(prob(5) && (locate(/obj/item) in living_pawn.held_items))
@@ -76,9 +95,8 @@
possible_receivers += candidate possible_receivers += candidate
if(length(possible_receivers)) if(length(possible_receivers))
var/mob/living/target = pick(possible_receivers) controller.blackboard[BB_MONKEY_CURRENT_GIVE_TARGET] = pick(possible_receivers)
controller.current_movement_target = target controller.queue_behavior(/datum/ai_behavior/give, BB_MONKEY_CURRENT_GIVE_TARGET)
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/give))
return return
controller.TryFindWeapon() controller.TryFindWeapon()

View File

@@ -5,6 +5,11 @@
///Time to telegraph and tilt over ///Time to telegraph and tilt over
var/time_to_tilt = 0.8 SECONDS 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) /datum/ai_behavior/vendor_crush/perform(delta_time, datum/ai_controller/controller)
. = ..() . = ..()
if(controller.blackboard[BB_VENDING_BUSY_TILTING]) if(controller.blackboard[BB_VENDING_BUSY_TILTING])

View File

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

View File

@@ -113,11 +113,12 @@
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT
required_distance = 1 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. qdel(controller.pawn) //save the world, my final message, goodbye.
finish_action(controller, TRUE) 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) /datum/ai_planning_subtree/robot_customer/SelectBehaviors(datum/ai_controller/controller, delta_time)
if(controller.blackboard[BB_CUSTOMER_LEAVING]) if(controller.blackboard[BB_CUSTOMER_LEAVING])
var/datum/venue/attending_venue = controller.blackboard[BB_CUSTOMER_ATTENDING_VENUE] controller.queue_behavior(/datum/ai_behavior/leave_venue, BB_CUSTOMER_ATTENDING_VENUE)
controller.current_movement_target = attending_venue.restaurant_portal
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/leave_venue))
return SUBTREE_RETURN_FINISH_PLANNING return SUBTREE_RETURN_FINISH_PLANNING
if(controller.blackboard[BB_CUSTOMER_CURRENT_TARGET]) 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 return SUBTREE_RETURN_FINISH_PLANNING
var/obj/my_seat = controller.blackboard[BB_CUSTOMER_MY_SEAT] var/obj/my_seat = controller.blackboard[BB_CUSTOMER_MY_SEAT]
if(!my_seat) //We havn't got a seat yet! find one! 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 return SUBTREE_RETURN_FINISH_PLANNING
controller.current_movement_target = my_seat 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! 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 return SUBTREE_RETURN_FINISH_PLANNING
else else
LAZYADD(controller.current_behaviors, GET_AI_BEHAVIOR(/datum/ai_behavior/wait_for_food)) controller.queue_behavior(/datum/ai_behavior/wait_for_food)