mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-20 03:25:49 +01:00
Basic gutlunch and goldgrub (#30032)
* Goldgrubs * Gutlunches, breeding code, goldgrub fixes * Lints * Extra define * Config screwup * Linters again * Oops * Gets rid of extra kangaroo * Formatting and grammar Co-authored-by: warriorstar-orion <orion@snowfrost.garden> Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com> --------- Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com> Co-authored-by: warriorstar-orion <orion@snowfrost.garden>
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
/datum/ai_planning_subtree/look_for_adult
|
||||
/// how far we must be from the mom
|
||||
var/minimum_distance = 1
|
||||
|
||||
/datum/ai_planning_subtree/look_for_adult/select_behaviors(datum/ai_controller/controller, seconds_per_tick)
|
||||
. = ..()
|
||||
var/mob/target = controller.blackboard[BB_FOUND_MOM]
|
||||
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)
|
||||
return
|
||||
|
||||
if(get_dist(target, baby) > minimum_distance)
|
||||
controller.queue_behavior(/datum/ai_behavior/travel_towards/stop_on_arrival, BB_FOUND_MOM)
|
||||
return SUBTREE_RETURN_FINISH_PLANNING
|
||||
|
||||
if(!SPT_PROB(15, seconds_per_tick))
|
||||
return
|
||||
|
||||
if(target.stat == DEAD)
|
||||
controller.queue_behavior(/datum/ai_behavior/perform_emote, "cries for their parent!")
|
||||
else
|
||||
controller.queue_behavior(/datum/ai_behavior/perform_emote, "dances around their parent!")
|
||||
|
||||
return SUBTREE_RETURN_FINISH_PLANNING
|
||||
|
||||
/datum/ai_behavior/find_mom
|
||||
/// range to look for the mom
|
||||
var/look_range = 7
|
||||
|
||||
/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/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 don't follow each other
|
||||
continue
|
||||
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
|
||||
@@ -0,0 +1,97 @@
|
||||
/**
|
||||
* Reproduce with a similar mob.
|
||||
*/
|
||||
/datum/ai_planning_subtree/make_babies
|
||||
operational_datums = list(/datum/component/breed)
|
||||
/// chance to make babies
|
||||
var/chance = 5
|
||||
/// make babies behavior we will use
|
||||
var/datum/ai_behavior/reproduce_behavior = /datum/ai_behavior/make_babies
|
||||
|
||||
/datum/ai_planning_subtree/make_babies/select_behaviors(datum/ai_controller/controller, seconds_per_tick)
|
||||
. = ..()
|
||||
|
||||
if(!SPT_PROB(chance, seconds_per_tick) || controller.blackboard[BB_PARTNER_SEARCH_TIMEOUT] >= world.time)
|
||||
return
|
||||
|
||||
if(controller.blackboard_key_exists(BB_BABIES_TARGET))
|
||||
controller.queue_behavior(reproduce_behavior, BB_BABIES_TARGET, BB_BABIES_CHILD_TYPES)
|
||||
return SUBTREE_RETURN_FINISH_PLANNING
|
||||
|
||||
if(controller.pawn.gender == FEMALE || !controller.blackboard[BB_BREED_READY])
|
||||
return
|
||||
|
||||
if(!controller.blackboard[BB_BABIES_PARTNER_TYPES] || !controller.blackboard[BB_BABIES_CHILD_TYPES])
|
||||
return
|
||||
|
||||
// Find target
|
||||
controller.queue_behavior(/datum/ai_behavior/find_partner, BB_BABIES_TARGET, BB_BABIES_PARTNER_TYPES, BB_BABIES_CHILD_TYPES)
|
||||
|
||||
#define FIND_PARTNER_COOLDOWN 1 MINUTES
|
||||
|
||||
/**
|
||||
* Find a compatible, living partner, if we're also alone.
|
||||
*/
|
||||
/datum/ai_behavior/find_partner
|
||||
action_cooldown = 5 SECONDS
|
||||
/// Range to look.
|
||||
var/range = 7
|
||||
/// Maximum number of nearby pop
|
||||
var/max_nearby_pop = 3
|
||||
|
||||
/datum/ai_behavior/find_partner/perform(seconds_per_tick, datum/ai_controller/controller, target_key, partner_types_key, child_types_key)
|
||||
var/maximum_pop = controller.blackboard[BB_MAX_CHILDREN] || max_nearby_pop
|
||||
var/mob/pawn_mob = controller.pawn
|
||||
var/list/similar_species_types = controller.blackboard[partner_types_key] + controller.blackboard[child_types_key]
|
||||
var/mob/living/living_pawn = controller.pawn
|
||||
var/list/possible_partners = list()
|
||||
|
||||
var/nearby_pop = 0
|
||||
for(var/mob/living/other in oview(range, pawn_mob))
|
||||
if(!pawn_mob.faction_check_mob(other))
|
||||
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
|
||||
|
||||
if(!is_type_in_list(other, similar_species_types))
|
||||
continue
|
||||
|
||||
if(++nearby_pop >= maximum_pop)
|
||||
controller.set_blackboard_key(BB_PARTNER_SEARCH_TIMEOUT, world.time + FIND_PARTNER_COOLDOWN)
|
||||
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
|
||||
|
||||
if(other.stat != CONSCIOUS) // Check if it's conscious FIRST.
|
||||
continue
|
||||
|
||||
if(other.gender != living_pawn.gender)
|
||||
possible_partners += other
|
||||
|
||||
if(!length(possible_partners))
|
||||
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
|
||||
|
||||
controller.set_blackboard_key(target_key, pick(possible_partners))
|
||||
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
|
||||
|
||||
/**
|
||||
* Reproduce.
|
||||
*/
|
||||
/datum/ai_behavior/make_babies
|
||||
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH
|
||||
|
||||
/datum/ai_behavior/make_babies/setup(datum/ai_controller/controller, target_key, child_types_key)
|
||||
. = ..()
|
||||
var/atom/target = controller.blackboard[target_key]
|
||||
if(!target)
|
||||
return FALSE
|
||||
set_movement_target(controller, target)
|
||||
|
||||
/datum/ai_behavior/make_babies/perform(seconds_per_tick, datum/ai_controller/controller, target_key, child_types_key)
|
||||
var/mob/target = controller.blackboard[target_key]
|
||||
if(QDELETED(target) || target.stat != CONSCIOUS)
|
||||
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
|
||||
controller.ai_interact(target = target, intent = INTENT_HELP)
|
||||
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
|
||||
|
||||
/datum/ai_behavior/make_babies/finish_action(datum/ai_controller/controller, succeeded, target_key)
|
||||
. = ..()
|
||||
controller.clear_blackboard_key(target_key)
|
||||
|
||||
#undef FIND_PARTNER_COOLDOWN
|
||||
@@ -29,3 +29,27 @@
|
||||
if(!test_turf.is_blocked_turf(source_atom = source))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
/datum/ai_planning_subtree/mine_walls
|
||||
var/find_wall_behavior = /datum/ai_behavior/find_mineral_wall
|
||||
|
||||
/datum/ai_planning_subtree/mine_walls/select_behaviors(datum/ai_controller/controller, seconds_per_tick)
|
||||
if(controller.blackboard_key_exists(BB_TARGET_MINERAL_WALL))
|
||||
controller.queue_behavior(/datum/ai_behavior/interact_with_target/mine_wall, BB_TARGET_MINERAL_WALL)
|
||||
return SUBTREE_RETURN_FINISH_PLANNING
|
||||
controller.queue_behavior(find_wall_behavior, BB_TARGET_MINERAL_WALL)
|
||||
|
||||
/datum/ai_behavior/interact_with_target/mine_wall
|
||||
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
|
||||
action_cooldown = 15 SECONDS
|
||||
|
||||
/datum/ai_behavior/interact_with_target/mine_wall/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
|
||||
var/mob/living/basic/living_pawn = controller.pawn
|
||||
var/turf/simulated/mineral/target = controller.blackboard[target_key]
|
||||
if(!controller.ai_interact(target = target))
|
||||
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED
|
||||
if(istype(target) && istype(target.ore, /datum/ore/gibtonite))
|
||||
living_pawn.manual_emote("sighs...") // accept whats about to happen to us
|
||||
|
||||
return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED
|
||||
|
||||
Reference in New Issue
Block a user