From bcc3972fbe6e675ff27bcec2b716248ba63f5e02 Mon Sep 17 00:00:00 2001 From: Uristqwerty Date: Mon, 14 May 2012 04:04:56 -0400 Subject: [PATCH] Minimap (work in progress): - Uses freelook visibility calculations - all visible turfs represented as a 2x2 square - - doors, windows, and structural objects that block movement show up in different colours from walls, floors, and space - - windows and windoors that only block the edge of a tile show as a 1x2 line - Areas that were visble but now aren't display in red. This will happen during regular activity, as doors open and close, as well as during abnormal circumstances, such as a camera being disabled/destroyed, or additional walls being constructed that block a camera's LOS. - changes in visibility in an area triggers a map update which takes place two minutes later, reducing amount of processing (since further update triggers are ignored until the pending update has taken place), and give antagonists time after disabling a camera to conduct their business, before the map reveals that anything is out of the ordinary. Sample screenshot: http://i.imgur.com/PS2vF.png Todo: - Remove test verb available to everyone, replace with AI-only (and perhaps avaiable to admins and ghosts?) verb. - Clicking a tile immediately enters freelook and jumps to that tile - Perhaps overlay blinking blue for areas with atmosphere alerts, brown for power? Independant of visibility, or centred on APC? - A verb to force-update the current 3x3 area, while in freelook? --- code/WorkInProgress/AI_Visibility.dm | 121 +++++++++++++++++++++++---- icons/minimap.dmi | Bin 0 -> 206 bytes interface/skin.dmf | 65 ++++++++++++++ 3 files changed, 169 insertions(+), 17 deletions(-) create mode 100644 icons/minimap.dmi diff --git a/code/WorkInProgress/AI_Visibility.dm b/code/WorkInProgress/AI_Visibility.dm index 7956703789..5f6ea0fd1b 100644 --- a/code/WorkInProgress/AI_Visibility.dm +++ b/code/WorkInProgress/AI_Visibility.dm @@ -33,9 +33,79 @@ var/list/turfs = list() var/list/seenby = list() var/visible = 0 - var/changed = 0 + var/changed = 1 var/updating = 0 + var/x + var/y + var/z + + var/minimap_updating = 0 + + var/icon/minimap_icon = new('minimap.dmi', "chunk_base") + var/obj/minimap_obj = new() + +/mob/verb/minimap_test() + winshow(src, "minimapwindow", 1) + client.screen |= cameranet.minimap + + +/datum/camerachunk/proc/update_minimap() + if(changed && !updating) + update() + + minimap_icon.Blend(rgb(255, 0, 0), ICON_MULTIPLY) + + var/list/turfs = visibleTurfs | dimTurfs + + for(var/turf/turf in turfs) + var/x = (turf.x & 0xf) * 2 + var/y = (turf.y & 0xf) * 2 + + if(turf.density) + minimap_icon.DrawBox(rgb(100, 100, 100), x + 1, y + 1, x + 2, y + 2) + continue + + else if(istype(turf, /turf/space)) + minimap_icon.DrawBox(rgb(0, 0, 0), x + 1, y + 1, x + 2, y + 2) + + else + minimap_icon.DrawBox(rgb(200, 200, 200), x + 1, y + 1, x + 2, y + 2) + + for(var/obj/structure/o in turf) + if(o.density) + if(istype(o, /obj/structure/window) && (o.dir == NORTH || o.dir == SOUTH || o.dir == EAST || o.dir == WEST)) + if(o.dir == NORTH) + minimap_icon.DrawBox(rgb(150, 150, 200), x + 1, y + 2, x + 2, y + 2) + else if(o.dir == SOUTH) + minimap_icon.DrawBox(rgb(150, 150, 200), x + 1, y + 1, x + 2, y + 1) + else if(o.dir == EAST) + minimap_icon.DrawBox(rgb(150, 150, 200), x + 3, y + 1, x + 2, y + 2) + else if(o.dir == WEST) + minimap_icon.DrawBox(rgb(150, 150, 200), x + 1, y + 1, x + 1, y + 2) + + else + minimap_icon.DrawBox(rgb(150, 150, 150), x + 1, y + 1, x + 2, y + 2) + break + + for(var/obj/machinery/door/o in turf) + if(istype(o, /obj/machinery/door/window)) + if(o.dir == NORTH) + minimap_icon.DrawBox(rgb(100, 150, 100), x + 1, y + 2, x + 2, y + 2) + else if(o.dir == SOUTH) + minimap_icon.DrawBox(rgb(100, 150, 100), x + 1, y + 1, x + 2, y + 1) + else if(o.dir == EAST) + minimap_icon.DrawBox(rgb(100, 150, 100), x + 2, y + 1, x + 2, y + 2) + else if(o.dir == WEST) + minimap_icon.DrawBox(rgb(100, 150, 100), x + 1, y + 1, x + 1, y + 2) + + else + minimap_icon.DrawBox(rgb(100, 150, 100), x + 1, y + 1, x + 2, y + 2) + break + + minimap_obj.screen_loc = "minimap:[src.x / 16],[src.y / 16]" + minimap_obj.icon = minimap_icon + /mob/aiEye var/list/visibleCameraChunks = list() var/mob/ai = null @@ -50,6 +120,7 @@ seenby += ai if(changed && !updating) update() + changed = 0 /datum/camerachunk/proc/remove(mob/aiEye/ai) ai.visibleCameraChunks -= src @@ -76,20 +147,28 @@ else changed = 1 + if(!minimap_updating) + minimap_updating = 1 + + spawn(1200) + if(changed && !updating) + update() + changed = 0 + + update_minimap() + minimap_updating = 0 + /datum/camerachunk/proc/update() + var/list/newDimTurfs = list() var/list/newVisibleTurfs = list() for(var/obj/machinery/camera/c in cameras) var/lum = c.luminosity c.luminosity = 7 - for(var/turf/t in view(7, c)) - if(t in turfs) - newDimTurfs += t - for(var/turf/t in view(6, c)) - if(t in turfs) - newVisibleTurfs += t + newDimTurfs |= turfs & view(7, c) + newVisibleTurfs |= turfs & view(6, c) c.luminosity = lum @@ -154,29 +233,26 @@ m.ai.client.images += 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 - for(var/turf/t in range(10, locate(x + 8, y + 8, z))) - if(t.x >= x && t.y >= y && t.x < x + 16 && t.y < y + 16) - turfs += t + 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 - for(var/turf/t in view(7, c)) - if(t in turfs) - dimTurfs += t - for(var/turf/t in view(6, c)) - if(t in turfs) - visibleTurfs += t + dimTurfs |= turfs & view(7, c) + visibleTurfs |= turfs & view(6, c) c.luminosity = lum @@ -197,6 +273,8 @@ dim += t.dim + cameranet.minimap += minimap_obj + var/datum/cameranet/cameranet = new() /datum/cameranet @@ -205,9 +283,18 @@ var/datum/cameranet/cameranet = new() var/network = "net1" var/ready = 0 + var/list/minimap = list() + /datum/cameranet/New() ..() + spawn(200) + for(var/x = 0, x <= world.maxx, x += 16) + for(var/y = 0, y <= world.maxy, y += 16) + sleep(1) + var/datum/camerachunk/c = getCameraChunk(x, y, 1) + c.update_minimap() + /datum/cameranet/proc/chunkGenerated(x, y, z) var/key = "[x],[y],[z]" return key in chunks diff --git a/icons/minimap.dmi b/icons/minimap.dmi new file mode 100644 index 0000000000000000000000000000000000000000..26aecb84b96f224ffd7a44d4a7e1a14e97584fe4 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;m;-!5T!HlRD%)E?Dz7ReqQoV& zIJqdZpd>RtkAb0LPH