From fb6b7f122568482b55b83e37bb9ce26b5ae47173 Mon Sep 17 00:00:00 2001 From: MrPerson Date: Sun, 20 Jul 2014 03:21:02 -0700 Subject: [PATCH 1/2] AI Tracking bugfixes Fixes #4201 by adding a cancel button to the track mob list. Fixes a runtime that pops up if you double click the "Track Mob" or "Show Camera List" buttons on the AI hud. Problem is that double clicking runs a proc that builds the datum of lists of trackable mobs twice, and then both procs sleep because of input(). When the first track completes it nulls the tracking datum, which causes problems for the second (or more) tracks which expect the tracking datum to not be null. Solution: Keep the datum around and simply rebuild the lists as-needed instead of creating and deleting the tracking datum datum pointlessly. --- code/_onclick/hud/screen_objects.dm | 4 +-- code/game/machinery/camera/tracking.dm | 39 +++++++++++++----------- code/modules/mob/living/silicon/ai/ai.dm | 2 +- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 55b7b2dcf76..cf22da2e3b6 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -297,13 +297,13 @@ if("Show Camera List") if(isAI(usr)) var/mob/living/silicon/ai/AI = usr - var/camera = input(AI) in AI.get_camera_list() + var/camera = input(AI, "Choose which camera you want to view", "Cameras") as null|anything in AI.get_camera_list() AI.ai_camera_list(camera) if("Track With Camera") if(isAI(usr)) var/mob/living/silicon/ai/AI = usr - var/target_name = input(AI) in AI.trackable_mobs() + var/target_name = input(AI, "Choose who you want to track", "Tracking") as null|anything in AI.trackable_mobs() AI.ai_camera_track(target_name) if("Toggle Camera Light") diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index 3b99e47fd8e..a645c6c2feb 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -1,5 +1,7 @@ /mob/living/silicon/ai/proc/get_camera_list() + track.cameras.Cut() + if(src.stat == 2) return @@ -10,32 +12,29 @@ camera_sort(L) var/list/T = list() - T["Cancel"] = "Cancel" + for (var/obj/machinery/camera/C in L) var/list/tempnetwork = C.network&src.network if (tempnetwork.len) T[text("[][]", C.c_tag, (C.can_use() ? null : " (Deactivated)"))] = C - track = new() track.cameras = T return T -/mob/living/silicon/ai/proc/ai_camera_list(var/camera in get_camera_list()) +/mob/living/silicon/ai/proc/ai_camera_list(var/camera) if(src.stat == 2) src << "You can't list the cameras because you are dead!" return - if (!camera || camera == "Cancel") + if (!camera) return 0 var/obj/machinery/camera/C = track.cameras[camera] - track = null src.eyeobj.setLoc(C) return -// Used to allow the AI is write in mob names/camera name from the CMD line. /datum/trackable var/list/names = list() var/list/namecounts = list() @@ -45,10 +44,14 @@ /mob/living/silicon/ai/proc/trackable_mobs() + track.names.Cut() + track.namecounts.Cut() + track.humans.Cut() + track.others.Cut() + if(usr.stat == 2) return list() - var/datum/trackable/TB = new() for(var/mob/living/M in mob_list) // Easy checks first. // Don't detect mobs on Centcom. Since the wizard den is on Centcom, we only need this. @@ -82,22 +85,22 @@ continue var/name = M.name - if (name in TB.names) - TB.namecounts[name]++ - name = text("[] ([])", name, TB.namecounts[name]) + if (name in track.names) + track.namecounts[name]++ + name = text("[] ([])", name, track.namecounts[name]) else - TB.names.Add(name) - TB.namecounts[name] = 1 + track.names.Add(name) + track.namecounts[name] = 1 if(human) - TB.humans[name] = M + track.humans[name] = M else - TB.others[name] = M + track.others[name] = M + + var/list/targets = sortList(track.humans) + sortList(track.others) - var/list/targets = sortList(TB.humans) + sortList(TB.others) - src.track = TB return targets -/mob/living/silicon/ai/proc/ai_camera_track(var/target_name in trackable_mobs()) +/mob/living/silicon/ai/proc/ai_camera_track(var/target_name) if(src.stat == 2) src << "You can't track with camera because you are dead!" return @@ -105,7 +108,7 @@ src.cameraFollow = null var/mob/target = (isnull(track.humans[target_name]) ? track.others[target_name] : track.humans[target_name]) - src.track = null + ai_actual_track(target) /mob/living/silicon/ai/proc/ai_actual_track(mob/living/target as mob) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 77fcdf35b63..bb3aa9ff042 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -47,7 +47,7 @@ var/list/ai_list = list() var/mob/living/silicon/ai/parent = null var/camera_light_on = 0 //Defines if the AI toggled the light on the camera it's looking through. - var/datum/trackable/track = null + var/datum/trackable/track = new() var/last_paper_seen = null var/can_shunt = 1 From e521a67a129ccee16d921b504dbfed1e742e511c Mon Sep 17 00:00:00 2001 From: MrPerson Date: Tue, 22 Jul 2014 08:00:57 -0700 Subject: [PATCH 2/2] Giacom's suggestions, plus removing more pointless checks. You can now type track foo as an AI and it'll track foo or expand into a full listing if ambiguity exists. It's not track-with-camera, just track. --- code/game/machinery/camera/tracking.dm | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index a645c6c2feb..48b43ff3314 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -23,10 +23,6 @@ /mob/living/silicon/ai/proc/ai_camera_list(var/camera) - if(src.stat == 2) - src << "You can't list the cameras because you are dead!" - return - if (!camera) return 0 @@ -100,12 +96,12 @@ return targets -/mob/living/silicon/ai/proc/ai_camera_track(var/target_name) - if(src.stat == 2) - src << "You can't track with camera because you are dead!" - return +/mob/living/silicon/ai/verb/ai_camera_track(var/target_name as null|anything in trackable_mobs()) + set name = "track" + set hidden = 1 //Don't display it on the verb lists. This verb exists purely so you can type "track Oldman Robustin" and follow his ass + if(!target_name) - src.cameraFollow = null + return var/mob/target = (isnull(track.humans[target_name]) ? track.others[target_name] : track.humans[target_name])