mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-16 01:23:41 +01:00
050494fe31
* ensure some ai behavior procs call parent * fix slippage
132 lines
4.6 KiB
Plaintext
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
|