Ports deer to basic mobs and adds some behaviors (#29270)

* ports deer to basic mobs and adds some behaviors

* update updatepaths script number

* whitespace

* Apply suggestions from code review

Co-authored-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
Signed-off-by: warriorstar-orion <orion@snowfrost.garden>

---------

Signed-off-by: warriorstar-orion <orion@snowfrost.garden>
Co-authored-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
This commit is contained in:
warriorstar-orion
2025-05-13 06:23:30 +00:00
committed by GitHub
co-authored by PollardTheDragon
parent 9cabc380b4
commit dfacf83e18
18 changed files with 443 additions and 31 deletions
@@ -0,0 +1,24 @@
/datum/ai_behavior/emote_on_target
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH
/datum/ai_behavior/emote_on_target/setup(datum/ai_controller/controller, target_key)
. = ..()
var/atom/hunt_target = controller.blackboard[target_key]
if(isnull(hunt_target))
return FALSE
set_movement_target(controller, hunt_target)
/datum/ai_behavior/emote_on_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key, list/emote_list)
var/atom/target = controller.blackboard[target_key]
if(!length(emote_list) || isnull(target))
return AI_BEHAVIOR_FAILED | AI_BEHAVIOR_DELAY
run_emote(controller.pawn, target, emote_list)
return AI_BEHAVIOR_SUCCEEDED | AI_BEHAVIOR_DELAY
/datum/ai_behavior/emote_on_target/finish_action(datum/ai_controller/controller, succeeded, target_key)
. = ..()
if(succeeded)
controller.clear_blackboard_key(target_key)
/datum/ai_behavior/emote_on_target/proc/run_emote(mob/living/living_pawn, atom/target, list/emote_list)
living_pawn.custom_emote(EMOTE_VISIBLE, "[pick(emote_list)] [target]")
@@ -0,0 +1,26 @@
/// Makes a mob simply stop and stare at a movable... yea...
/datum/ai_behavior/stop_and_stare
behavior_flags = AI_BEHAVIOR_MOVE_AND_PERFORM
/datum/ai_behavior/stop_and_stare/setup(datum/ai_controller/controller, target_key)
. = ..()
var/atom/movable/target = controller.blackboard[target_key]
return ismovable(target) && isturf(target.loc) && ismob(controller.pawn)
/datum/ai_behavior/stop_and_stare/get_cooldown(datum/ai_controller/cooldown_for)
return cooldown_for.blackboard[BB_STATIONARY_COOLDOWN]
/datum/ai_behavior/stop_and_stare/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
var/atom/movable/target = controller.blackboard[target_key]
if(!ismovable(target) || !isturf(target.loc)) // just to make sure that nothing funky happened between setup and perform
return AI_BEHAVIOR_DELAY
var/mob/pawn_mob = controller.pawn
var/turf/pawn_turf = get_turf(pawn_mob)
pawn_mob.face_atom(target)
set_movement_target(controller, pawn_turf, /datum/ai_movement/complete_stop)
if(controller.blackboard[BB_STATIONARY_MOVE_TO_TARGET])
addtimer(CALLBACK(src, PROC_REF(set_movement_target), controller, target, initial(controller.ai_movement)), (controller.blackboard[BB_STATIONARY_SECONDS] + 1 SECONDS))
return AI_BEHAVIOR_DELAY