From ac0fac9b28064067ca57b6e43783d07b587cc3f3 Mon Sep 17 00:00:00 2001 From: Amy Date: Wed, 11 May 2022 19:14:40 +0100 Subject: [PATCH] Better wandering (#283) * way better wandering behaviour, plus fix janky old wander code * tmpturf->T --- .../mob/living/critter/ai/flock/flockdrone.dm | 2 +- .../mob/living/critter/ai/flock/flocktasks.dm | 35 +++++++++++++++++++ code/mob/living/critter/ai/shared.dm | 3 -- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/code/mob/living/critter/ai/flock/flockdrone.dm b/code/mob/living/critter/ai/flock/flockdrone.dm index c32c2ef178..e28b0b3d99 100644 --- a/code/mob/living/critter/ai/flock/flockdrone.dm +++ b/code/mob/living/critter/ai/flock/flockdrone.dm @@ -26,7 +26,7 @@ transition_tasks += holder.get_instance(/datum/aiTask/sequence/goalbased/flockdrone_capture, list(holder, src)) transition_tasks += holder.get_instance(/datum/aiTask/sequence/goalbased/deconstruct, list(holder, src)) transition_tasks += holder.get_instance(/datum/aiTask/sequence/goalbased/stare, list(holder, src)) - transition_tasks += holder.get_instance(/datum/aiTask/timed/wander, list(holder, src)) + transition_tasks += holder.get_instance(/datum/aiTask/timed/wander/flock, list(holder, src)) /datum/aiTask/prioritizer/flock/drone/on_reset() ..() diff --git a/code/mob/living/critter/ai/flock/flocktasks.dm b/code/mob/living/critter/ai/flock/flocktasks.dm index 5ce116e3f0..68bb6971dd 100644 --- a/code/mob/living/critter/ai/flock/flocktasks.dm +++ b/code/mob/living/critter/ai/flock/flocktasks.dm @@ -1210,3 +1210,38 @@ butcher on_reset() ..() holder.target = src.target + +/////////////////////////////////////////////////////////////////////////////////////////////////// +/// Wander override for better wandering +/datum/aiTask/timed/wander/flock + minimum_task_ticks = 5 + maximum_task_ticks = 7 //you go a lot further with this wandering, so shorten the task time + var/turf/startpos + var/turf/targetpos + var/path + +/datum/aiTask/timed/wander/flock/on_tick() + if(!startpos) + startpos = get_turf(holder.owner) + if(targetpos && GET_DIST(holder.owner,targetpos) > 0) //if we have a target and we're not already there + if(!path || !length(path)) + path = get_path_to(holder.owner, targetpos, 5, 1) //short search, we don't want this to be expensive + if(length(path)) + holder.move_to_with_path(targetpos, path, 0) + return + + //pick a random tile that is not space, and not closer to startpos than we are now + var/list/turfs = list() + path = null + targetpos = null + for(var/turf/T in range(holder.owner,2)) + if(!istype(T,/turf/space) && !is_blocked_turf(T) && GET_DIST(holder.owner,startpos) <= GET_DIST(T,startpos)) + turfs += T + if(!length(turfs)) + //oh shit we must be in space, better wander in the direction of the station + turfs += pick_landmark(LANDMARK_LATEJOIN) + if(length(turfs)) + targetpos = pick(turfs) + else + //well I guess the station is gone and everyone is dead. Back to default wander behaviour + ..() diff --git a/code/mob/living/critter/ai/shared.dm b/code/mob/living/critter/ai/shared.dm index a682415cd3..86395d5b21 100644 --- a/code/mob/living/critter/ai/shared.dm +++ b/code/mob/living/critter/ai/shared.dm @@ -91,9 +91,6 @@ // thanks byond forums for letting me know that the byond native implentation FUCKING SUCKS holder.owner.move_dir = pick(alldirs) holder.owner.process_move() - -/datum/aiTask/timed/wander/on_tick() - . = ..() holder.stop_move() holder.owner.move_dir = null // clear out direction so it doesn't get latched when client is attached