Raptor Rework - Ranching and Companionship (#93564)

This commit is contained in:
SmArtKar
2025-11-01 14:13:29 +03:00
committed by GitHub
parent 30151ccc20
commit 1c6c506936
58 changed files with 2608 additions and 1621 deletions
@@ -4,21 +4,32 @@
/datum/ai_behavior/find_mom/perform(seconds_per_tick, datum/ai_controller/controller, mom_key, ignore_mom_key, found_mom)
var/mob/living_pawn = controller.pawn
var/list/mom_types = controller.blackboard[mom_key]
var/list/all_moms = list()
var/list/mom_types = controller.blackboard[mom_key]
var/list/ignore_types = controller.blackboard[ignore_mom_key]
if(!length(mom_types))
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
for(var/mob/mother in oview(look_range, living_pawn))
if(!is_type_in_list(mother, mom_types))
continue
if(is_type_in_list(mother, ignore_types)) //so the not permanent baby and the permanent baby subtype dont followed each other
continue
all_moms += mother
if (is_possible_mom(mother, mom_types, ignore_types))
all_moms += mother
if(length(all_moms))
controller.set_blackboard_key(found_mom, pick(all_moms))
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
/datum/ai_behavior/find_mom/proc/is_possible_mom(mob/mother, list/mom_types, list/ignore_types)
if(!is_type_in_list(mother, mom_types))
return FALSE
if(is_type_in_list(mother, ignore_types)) // so the not permanent baby and the permanent baby subtype dont followed each other
return FALSE
return TRUE
/datum/ai_behavior/find_mom/raptor/is_possible_mom(mob/mother, list/mom_types, list/ignore_types)
. = ..()
if (!. || !istype(mother, /mob/living/basic/raptor))
return FALSE
var/mob/living/basic/raptor/raptor = mother
return raptor.growth_stage == RAPTOR_ADULT
@@ -7,7 +7,7 @@
var/mob/baby = controller.pawn
if(QDELETED(target))
controller.queue_behavior(/datum/ai_behavior/find_mom, BB_FIND_MOM_TYPES, BB_IGNORE_MOM_TYPES, BB_FOUND_MOM)
find_mom(controller)
return
if(get_dist(target, baby) > minimum_distance)
@@ -23,3 +23,9 @@
controller.queue_behavior(/datum/ai_behavior/perform_emote, "dances around their parent!")
return SUBTREE_RETURN_FINISH_PLANNING
/datum/ai_planning_subtree/look_for_adult/proc/find_mom(datum/ai_controller/controller)
controller.queue_behavior(/datum/ai_behavior/find_mom, BB_FIND_MOM_TYPES, BB_IGNORE_MOM_TYPES, BB_FOUND_MOM)
/datum/ai_planning_subtree/look_for_adult/raptor/find_mom(datum/ai_controller/controller)
controller.queue_behavior(/datum/ai_behavior/find_mom/raptor, BB_FIND_MOM_TYPES, BB_FOUND_MOM)
@@ -1,10 +1,12 @@
/datum/ai_planning_subtree/simple_find_target
/// Variable to store target in
var/target_key = BB_BASIC_MOB_CURRENT_TARGET
/// Targeting strategy key to use
var/strategy_key = BB_TARGETING_STRATEGY
/datum/ai_planning_subtree/simple_find_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
. = ..()
controller.queue_behavior(/datum/ai_behavior/find_potential_targets, target_key, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION)
controller.queue_behavior(/datum/ai_behavior/find_potential_targets, target_key, strategy_key, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION)
// Prevents finding a target if a human is nearby
/datum/ai_planning_subtree/simple_find_target/not_while_observed
@@ -21,4 +23,7 @@
/datum/ai_planning_subtree/simple_find_target/increased_range
/datum/ai_planning_subtree/simple_find_target/increased_range/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
controller.queue_behavior(/datum/ai_behavior/find_potential_targets/bigger_range, target_key, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION)
controller.queue_behavior(/datum/ai_behavior/find_potential_targets/bigger_range, target_key, strategy_key, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION)
/datum/ai_planning_subtree/simple_find_target/hunt
strategy_key = BB_HUNT_TARGETING_STRATEGY
@@ -154,3 +154,6 @@
if(!istype(target) || target.has_status_effect(/datum/status_effect/gutted))
return FALSE
return ..()
/datum/targeting_strategy/basic/exact_match
check_factions_exactly = TRUE
@@ -16,7 +16,7 @@
if(!(target.resistance_flags & INDESTRUCTIBLE))
return TRUE
if(target in living_mob.ai_controller.blackboard[BB_FRIENDS_LIST])
if(isliving(target) && (target in living_mob.ai_controller.blackboard[BB_FRIENDS_LIST]))
return FALSE
return ..()