Files
CHOMPStation2/code/modules/ai/ai_holder_follow.dm
Cadyn ecd8125771 Ai update (#8023)
Co-authored-by: silicons <2003111+silicons@users.noreply.github.com>
Co-authored-by: silicons <no@you.cat>
2024-03-31 13:38:23 +02:00

69 lines
2.2 KiB
Plaintext

// This handles following a specific atom/movable, without violently murdering it.
/datum/ai_holder
// Following.
var/atom/movable/leader = null // The movable atom that the mob wants to follow.
var/follow_distance = 2 // How far leader must be to start moving towards them.
var/follow_until_time = 0 // world.time when the mob will stop following leader. 0 means it won't time out.
/datum/ai_holder/proc/walk_to_leader()
ai_log("walk_to_leader() : Entering.",AI_LOG_TRACE)
if(!leader)
ai_log("walk_to_leader() : No leader.", AI_LOG_WARNING)
forget_path()
set_stance(STANCE_IDLE)
ai_log("walk_to_leader() : Exiting.", AI_LOG_TRACE)
return
// Did we time out?
if(follow_until_time && world.time > follow_until_time)
ai_log("walk_to_leader() : Follow timed out, losing leader.", AI_LOG_INFO)
lose_follow()
set_stance(STANCE_IDLE)
ai_log("walk_to_leader() : Exiting.", AI_LOG_TRACE)
return
var/get_to = follow_distance
var/distance = get_dist(holder, leader)
ai_log("walk_to_leader() : get_to is [get_to].", AI_LOG_TRACE)
// We're here!
if(distance <= get_to)
give_up_movement()
set_stance(STANCE_IDLE)
ai_log("walk_to_leader() : Within range, exiting.", AI_LOG_INFO)
return
ai_log("walk_to_leader() : Walking.", AI_LOG_TRACE)
walk_path(leader, get_to)
ai_log("walk_to_leader() : Exiting.",AI_LOG_DEBUG)
/datum/ai_holder/proc/set_follow(mob/living/L, follow_for = 0)
ai_log("set_follow() : Entered.", AI_LOG_DEBUG)
if(!L)
ai_log("set_follow() : Was told to follow a nonexistant mob.", AI_LOG_ERROR)
return FALSE
leader = L
follow_until_time = !follow_for ? 0 : world.time + follow_for
ai_log("set_follow() : Exited.", AI_LOG_DEBUG)
return TRUE
/datum/ai_holder/proc/lose_follow()
ai_log("lose_follow() : Entered.", AI_LOG_DEBUG)
ai_log("lose_follow() : Going to lose leader [leader].", AI_LOG_INFO)
leader = null
give_up_movement()
ai_log("lose_follow() : Exited.", AI_LOG_DEBUG)
/datum/ai_holder/proc/should_follow_leader()
if(!leader || target)
return FALSE
if(follow_until_time && world.time > follow_until_time)
lose_follow()
set_stance(STANCE_IDLE)
return FALSE
if(get_dist(holder, leader) > follow_distance)
return TRUE
return FALSE