From 9fa1f4bfbbe72bebe91cff22a65de72ab801a9b5 Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Wed, 15 Apr 2020 00:47:21 -0700
Subject: [PATCH] ok
---
.../configuration/entries/general.dm | 2 +
code/controllers/subsystems/minimaps.dm | 26 +++
code/game/area/areas.dm | 3 +
code/modules/mapping/minimaps.dm | 156 ++++++++++++++++++
config/config.txt | 4 +
html/blank.png | Bin 0 -> 579 bytes
vorestation.dme | 3 +
7 files changed, 194 insertions(+)
create mode 100644 code/controllers/configuration/entries/general.dm
create mode 100644 code/controllers/subsystems/minimaps.dm
create mode 100644 code/modules/mapping/minimaps.dm
create mode 100644 html/blank.png
diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm
new file mode 100644
index 00000000000..e08c96c775c
--- /dev/null
+++ b/code/controllers/configuration/entries/general.dm
@@ -0,0 +1,2 @@
+/datum/config_entry/flag/minimaps_enabled
+ config_entry_value = TRUE
diff --git a/code/controllers/subsystems/minimaps.dm b/code/controllers/subsystems/minimaps.dm
new file mode 100644
index 00000000000..c4a8c4708d3
--- /dev/null
+++ b/code/controllers/subsystems/minimaps.dm
@@ -0,0 +1,26 @@
+SUBSYSTEM_DEF(minimaps)
+ name = "Minimaps"
+ flags = SS_NO_FIRE
+ var/list/station_minimaps
+ var/datum/minimap_group/station_minimap
+
+/datum/controller/subsystem/minimaps/Initialize()
+ if(!CONFIG_GET(flag/minimaps_enabled))
+ to_chat(world, "Minimaps disabled! Skipping init.")
+ return ..()
+ build_minimaps()
+ return ..()
+
+/datum/controller/subsystem/minimaps/proc/build_minimaps()
+ station_minimaps = list()
+/*
+ for(var/z in SSmapping.levels_by_trait(ZTRAIT_STATION))
+*/
+ for(var/z in using_maps.station_levels)
+ /*
+ var/datum/space_level/SL = SSmapping.get_level(z)
+ var/name = (SL.name == initial(SL.name))? "[z] - Station" : "[z] - [SL.name]"
+ */
+ var/name = "[z] - Station"
+ station_minimaps += new /datum/minimap(z, name = name)
+ station_minimap = new(station_minimaps, "Station")
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index ce761f35aac..cac1c10b565 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -42,6 +42,9 @@
var/global/global_uid = 0
var/uid
+ /// Color on minimaps, if it's null (which is default) it makes one at random.
+ var/minimap_color
+
/area/New()
icon_state = ""
uid = ++global_uid
diff --git a/code/modules/mapping/minimaps.dm b/code/modules/mapping/minimaps.dm
new file mode 100644
index 00000000000..dcef74d0018
--- /dev/null
+++ b/code/modules/mapping/minimaps.dm
@@ -0,0 +1,156 @@
+/datum/minimap
+ var/name
+ var/icon/map_icon
+ var/icon/meta_icon
+ var/icon/overlay_icon
+ var/list/color_area_names = list()
+ var/minx
+ var/maxx
+ var/miny
+ var/maxy
+ var/z_level
+ var/id = 0
+ var/static/next_id = 0
+
+/datum/minimap/New(z, x1 = 1, y1 = 1, x2 = world.maxx, y2 = world.maxy, name)
+ src.name = name
+ id = ++next_id
+ z_level = z
+
+ var/crop_x1 = x2
+ var/crop_x2 = x1
+ var/crop_y1 = y2
+ var/crop_y2 = y1
+
+ // do the generating
+ map_icon = new('html/blank.png')
+ meta_icon = new('html/blank.png')
+ map_icon.Scale(x2-x1+1, y2-y1+1) // arrays start at 1
+ meta_icon.Scale(x2-x1+1, y2-y1+1)
+ var/list/area_to_color = list()
+ for(var/turf/T in block(locate(x1,y1,z),locate(x2,y2,z)))
+ var/area/A = T.loc
+ var/img_x = T.x - x1 + 1 // arrays start at 1
+ var/img_y = T.y - y1 + 1
+ if(!istype(A, /area/space) || T.density))
+ crop_x1 = min(crop_x1, T.x)
+ crop_x2 = max(crop_x2, T.x)
+ crop_y1 = min(crop_y1, T.y)
+ crop_y2 = max(crop_y2, T.y)
+ var/meta_color = area_to_color[A]
+ if(!meta_color)
+ meta_color = rgb(rand(0,255),rand(0,255),rand(0,255)) // technically conflicts could happen but it's like very unlikely and it's not that big of a deal if one happens
+ area_to_color[A] = meta_color
+ color_area_names[meta_color] = A.name
+ meta_icon.DrawBox(meta_color, img_x, img_y)
+ if(istype(T, /turf/closed/wall))
+ map_icon.DrawBox("#000000", img_x, img_y)
+ else if(!istype(A, /area/space))
+ var/color = A.minimap_color || "#FF00FF"
+ if(locate(/obj/machinery/power/solar) in T)
+ color = "#02026a"
+ if((locate(/obj/effect/spawner/structure/window) in T) || (locate(/obj/structure/grille) in T))
+ color = BlendRGB(color, "#000000", 0.5)
+ map_icon.DrawBox(color, img_x, img_y)
+ map_icon.Crop(crop_x1, crop_y1, crop_x2, crop_y2)
+ meta_icon.Crop(crop_x1, crop_y1, crop_x2, crop_y2)
+ minx = crop_x1
+ maxx = crop_x2
+ miny = crop_y1
+ maxy = crop_y2
+ overlay_icon = new(map_icon)
+ overlay_icon.Scale(16, 16)
+
+/datum/minimap/proc/send(mob/user)
+ register_asset("minimap-[id].png", map_icon)
+ register_asset("minimap-[id]-meta.png", meta_icon)
+ send_asset_list(user, list("minimap-[id].png" = map_icon, "minimap-[id]-meta.png" = meta_icon), verify=FALSE)
+
+/datum/minimap_group
+ var/list/minimaps
+ var/static/next_id = 0
+ var/id
+ var/name
+
+/datum/minimap_group/New(list/maps, name)
+ id = ++next_id
+ src.name = name
+ minimaps = maps || list()
+
+/datum/minimap_group/proc/show(mob/user)
+ if(!length(minimaps))
+ to_chat(user, "ERROR: Attempted to access an empty datum/minimap_group. This should probably not happen.")
+ return
+ var/list/datas = list()
+ var/list/info = list()
+ var/datum/minimap/first_map = minimaps[1]
+ for(var/i in 1 to length(minimaps))
+ var/datum/minimap/M = minimaps[i]
+ M.send(user)
+ info += "