diff --git a/code/WorkInProgress/AI_Visibility/ai.dm b/code/WorkInProgress/AI_Visibility/ai.dm index ae797da52d5..aba5304a9b7 100644 --- a/code/WorkInProgress/AI_Visibility/ai.dm +++ b/code/WorkInProgress/AI_Visibility/ai.dm @@ -25,14 +25,12 @@ set name = "freelook" current = null //cancel camera view first, it causes problems cameraFollow = null -// machine = null if(!eyeobj) //if it got deleted somehow (like an admin trying to fix things <.<') eyeobj = new() eyeobj.ai = src client.eye = eyeobj eyeobj.loc = loc cameranet.visibility(eyeobj) - cameraFollow = null /mob/aiEye/Move() . = ..() diff --git a/code/WorkInProgress/AI_Visibility/chunk.dm b/code/WorkInProgress/AI_Visibility/chunk.dm index 1ed5ef967e2..fdcc68bd07a 100644 --- a/code/WorkInProgress/AI_Visibility/chunk.dm +++ b/code/WorkInProgress/AI_Visibility/chunk.dm @@ -1,4 +1,6 @@ +#define MINIMAP_UPDATE_DELAY 1200 + /datum/camerachunk var/list/turfs = list() @@ -12,7 +14,6 @@ var/list/cameras = list() var/list/seenby = list() - var/visible = 0 var/changed = 1 var/updating = 0 var/minimap_updating = 0 @@ -25,25 +26,101 @@ var/icon/minimap_icon = new('minimap.dmi', "chunk_base") var/obj/minimap_obj/minimap_obj = new() -/datum/camerachunk/proc/add(mob/aiEye/ai) - ai.visibleCameraChunks += src - if(ai.ai.client) - ai.ai.client.images += obscured - ai.ai.client.images += dim - visible++ - seenby += ai + + +/datum/camerachunk/New(loc, x, y, z) + //Round X and Y down to a multiple of 16, if nessecary + src.x = x & ~0xF + src.y = y & ~0xF + src.z = z + + rebuild_chunk() + + + +// Completely re-calculate the whole chunk. + +/datum/camerachunk/proc/rebuild_chunk() + for(var/mob/aiEye/eye in seenby) + if(!eye.ai) + seenby -= eye + continue + + if(eye.ai.client) + eye.ai.client.images -= obscured + eye.ai.client.images -= dim + + var/start = locate(x, y, z) + var/end = locate(min(x + 15, world.maxx), min(y + 15, world.maxy), z) + + turfs = block(start, end) + dimTurfs = list() + visibleTurfs = list() + obscured = list() + dim = list() + cameras = list() + + for(var/obj/machinery/camera/c in range(16, locate(x + 8, y + 8, z))) + if(c.status) + cameras += c + + for(var/obj/machinery/camera/c in cameras) + var/lum = c.luminosity + c.luminosity = 7 + + dimTurfs |= turfs & view(7, c) + visibleTurfs |= turfs & view(6, c) + + c.luminosity = lum + + obscuredTurfs = turfs - dimTurfs + dimTurfs -= visibleTurfs + + for(var/turf/t in obscuredTurfs) + if(!t.obscured) + t.obscured = image('cameravis.dmi', t, "black", 15) + + obscured += t.obscured + + for(var/turf/t in dimTurfs) + if(!t.dim) + t.dim = image('cameravis.dmi', t, "dim", TURF_LAYER) + t.dim.mouse_opacity = 0 + + dim += t.dim + + cameranet.minimap |= minimap_obj + + for(var/mob/aiEye/eye in seenby) + if(eye.ai.client) + eye.ai.client.images |= obscured + eye.ai.client.images |= dim + + + +/datum/camerachunk/proc/add(mob/aiEye/eye) + eye.visibleCameraChunks |= src + + if(eye.ai.client) + eye.ai.client.images |= obscured + eye.ai.client.images |= dim + + seenby |= eye + if(changed && !updating) update() changed = 0 -/datum/camerachunk/proc/remove(mob/aiEye/ai) - ai.visibleCameraChunks -= src - if(ai.ai.client) - ai.ai.client.images -= obscured - ai.ai.client.images -= dim - seenby -= ai - if(visible > 0) - visible-- + + +/datum/camerachunk/proc/remove(mob/aiEye/eye) + eye.visibleCameraChunks -= src + + if(eye.ai.client) + eye.ai.client.images -= obscured + eye.ai.client.images -= dim + + seenby -= eye /datum/camerachunk/proc/visibilityChanged(turf/loc) if(!(loc in visibleTurfs)) @@ -52,12 +129,14 @@ hasChanged() /datum/camerachunk/proc/hasChanged() - if(visible) + if(length(seenby) > 0) if(!updating) updating = 1 + spawn(10)//Batch large changes, such as many doors opening or closing at once update() updating = 0 + else changed = 1 @@ -96,21 +175,20 @@ obscuredTurfs = turfs - dimTurfs dimTurfs -= visibleTurfs + var/list/images_added = list() + var/list/images_removed = list() + for(var/turf/t in dimRemoved) if(t.dim) dim -= t.dim - for(var/mob/aiEye/m in seenby) - if(m.ai.client) - m.ai.client.images -= t.dim + images_removed += t.dim if(!(t in visibleTurfs)) if(!t.obscured) t.obscured = image('cameravis.dmi', t, "black", 15) obscured += t.obscured - for(var/mob/aiEye/m in seenby) - if(m.ai.client) - m.ai.client.images += t.obscured + images_added += t.obscured for(var/turf/t in dimAdded) if(!(t in visibleTurfs)) @@ -119,22 +197,16 @@ t.mouse_opacity = 0 dim += t.dim - for(var/mob/aiEye/m in seenby) - if(m.ai.client) - m.ai.client.images += t.dim + images_added += t.dim if(t.obscured) obscured -= t.obscured - for(var/mob/aiEye/m in seenby) - if(m.ai.client) - m.ai.client.images -= t.obscured + images_removed += t.obscured for(var/turf/t in visAdded) if(t.obscured) obscured -= t.obscured - for(var/mob/aiEye/m in seenby) - if(m.ai.client) - m.ai.client.images -= t.obscured + images_removed += t.obscured for(var/turf/t in visRemoved) if(t in obscuredTurfs) @@ -142,49 +214,9 @@ t.obscured = image('cameravis.dmi', t, "black", 15) obscured += t.obscured - for(var/mob/aiEye/m in seenby) - if(m.ai.client) - m.ai.client.images += t.obscured + images_added += t.obscured - -/datum/camerachunk/New(loc, x, y, z) - x &= ~0xf - y &= ~0xf - - src.x = x - src.y = y - src.z = z - - for(var/obj/machinery/camera/c in range(16, locate(x + 8, y + 8, z))) - if(c.status) - cameras += c - - turfs = block(locate(x, y, z), locate(min(world.maxx, x + 15), min(world.maxy, y + 15), z)) - - for(var/obj/machinery/camera/c in cameras) - var/lum = c.luminosity - c.luminosity = 7 - - dimTurfs |= turfs & view(7, c) - visibleTurfs |= turfs & view(6, c) - - c.luminosity = lum - - obscuredTurfs = turfs - dimTurfs - dimTurfs -= visibleTurfs - - for(var/turf/t in obscuredTurfs) - if(!t.obscured) - t.obscured = image('cameravis.dmi', t, "black", 15) - - obscured += t.obscured - - for(var/turf/t in dimTurfs) - if(!(t in visibleTurfs)) - if(!t.dim) - t.dim = image('cameravis.dmi', t, "dim", TURF_LAYER) - t.dim.mouse_opacity = 0 - - dim += t.dim - - cameranet.minimap += minimap_obj + for(var/mob/aiEye/eye in seenby) + if(eye.ai.client) + eye.ai.client.images -= images_removed + eye.ai.client.images |= images_added diff --git a/code/WorkInProgress/AI_Visibility/util.dm b/code/WorkInProgress/AI_Visibility/util.dm index 9b5a257839f..4e06f7fa386 100644 --- a/code/WorkInProgress/AI_Visibility/util.dm +++ b/code/WorkInProgress/AI_Visibility/util.dm @@ -1,7 +1,5 @@ -#define MINIMAP_UPDATE_DELAY 1200 - /turf var/image/obscured var/image/dim