Files
warriorstar-orion 050494fe31 ensure some ai behavior procs call parent (#30703)
* ensure some ai behavior procs call parent

* fix slippage
2025-11-19 19:28:45 +00:00

132 lines
4.6 KiB
Plaintext

/datum/ai_controller/basic_controller/hivebot
blackboard = list(
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
)
ai_movement = /datum/ai_movement/basic_avoidance
idle_behavior = /datum/idle_behavior/idle_random_walk
planning_subtrees = list(
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/basic_melee_attack_subtree,
/datum/ai_planning_subtree/attack_obstacle_in_path,
/datum/ai_planning_subtree/hive_communicate,
)
/datum/ai_controller/basic_controller/hivebot/ranged
planning_subtrees = list(
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/basic_ranged_attack_subtree/hivebot,
/datum/ai_planning_subtree/attack_obstacle_in_path,
/datum/ai_planning_subtree/hive_communicate,
)
/datum/ai_controller/basic_controller/hivebot/ranged/rapid
planning_subtrees = list(
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/basic_ranged_attack_subtree/hivebot_rapid,
/datum/ai_planning_subtree/attack_obstacle_in_path,
/datum/ai_planning_subtree/hive_communicate,
)
/datum/ai_planning_subtree/basic_ranged_attack_subtree/hivebot_rapid
ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/hivebot_rapid
/datum/ai_planning_subtree/basic_ranged_attack_subtree/hivebot
ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/hivebot
/datum/ai_planning_subtree/hive_communicate
/// chance to go and relay message
var/relay_chance = 10
/datum/ai_planning_subtree/hive_communicate/select_behaviors(datum/ai_controller/controller, seconds_per_tick)
if(!SPT_PROB(relay_chance, seconds_per_tick))
return
for(var/mob/living/listener in hearers(11, controller.pawn))
if(listener.client && listener.stat != DEAD)
if(controller.blackboard_key_exists(BB_HIVE_PARTNER))
controller.queue_behavior(/datum/ai_behavior/relay_message, BB_HIVE_PARTNER)
return SUBTREE_RETURN_FINISH_PLANNING
controller.queue_behavior(/datum/ai_behavior/find_and_set/hive_partner, BB_HIVE_PARTNER, /mob/living/basic/hivebot)
/datum/ai_behavior/find_and_set/hive_partner
/datum/ai_behavior/find_and_set/hive_partner/search_tactic(datum/ai_controller/controller, locate_path, search_range)
var/mob/living/living_pawn = controller.pawn
var/list/hive_partners = list()
for(var/mob/living/target in oview(10, living_pawn))
if(!istype(target, locate_path))
continue
if(target.stat == DEAD)
continue
hive_partners += target
if(length(hive_partners))
return pick(hive_partners)
/// behavior that allow us to go communicate with other hivebots
/datum/ai_behavior/relay_message
/// length of the message we will relay
var/length_of_message = 4
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT| AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
/datum/ai_behavior/relay_message/setup(datum/ai_controller/controller, target_key)
. = ..()
var/mob/living/target = controller.blackboard[target_key]
// It stopped existing
if(QDELETED(target))
return FALSE
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
if(QDELETED(target))
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
var/message_relayed = ""
for(var/i in 1 to length_of_message)
message_relayed += prob(50) ? "1" : "0"
living_pawn.say(message_relayed)
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
/datum/ai_behavior/relay_message/finish_action(datum/ai_controller/controller, succeeded, target_key)
. = ..()
controller.clear_blackboard_key(target_key)
/datum/ai_behavior/basic_ranged_attack/hivebot
action_cooldown = 3 SECONDS
avoid_friendly_fire = TRUE
/datum/ai_behavior/basic_ranged_attack/hivebot_rapid
action_cooldown = 1 SECONDS
avoid_friendly_fire = TRUE
/datum/ai_controller/basic_controller/beacon
blackboard = list(
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
)
ai_movement = /datum/ai_movement/basic_avoidance
idle_behavior = null
planning_subtrees = list(
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/warpbots,
/datum/ai_planning_subtree/hive_communicate,
)
/datum/ai_planning_subtree/warpbots
/// chance to summon hivebots
var/warp_chance = 2
/datum/ai_planning_subtree/warpbots/select_behaviors(datum/ai_controller/controller, seconds_per_tick)
if(!SPT_PROB(warp_chance, seconds_per_tick))
return
if(controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET))
var/mob/living/basic/hivebot/tele/beacon = controller.pawn
beacon.warpbots()
return SUBTREE_RETURN_FINISH_PLANNING