Merge pull request #14835 from neersighted/minimaps

Rework minimaps
This commit is contained in:
duncathan salt
2016-01-24 23:32:37 -06:00
11 changed files with 80 additions and 164 deletions
+1
View File
@@ -15,6 +15,7 @@ Names of z-level do not matter, but order does greatly, for instances such as ch
#include "map_files\generic\z7.dmm"
#define MAP_PATH "map_files/DiscStation"
#define MAP_FILE "DiscStation.dmm"
#define MAP_NAME "DiscStation"
+1
View File
@@ -14,6 +14,7 @@ Names of z-level do not matter, but order does greatly, for instances such as ch
#include "map_files\generic\z6.dmm"
#include "map_files\generic\z7.dmm"
#define MAP_PATH "map_files/AsteroidStation"
#define MAP_FILE "AsteroidStation.dmm"
#define MAP_NAME "AsteroidStation"
+1
View File
@@ -16,6 +16,7 @@ A small map intended for lowpop(40 players and less).
#include "map_files\generic\z6.dmm"
#include "map_files\generic\z7.dmm"
#define MAP_PATH "map_files/BirdStation"
#define MAP_FILE "BirdStation.dmm"
#define MAP_NAME "BirdboatStation"
+1
View File
@@ -23,6 +23,7 @@ z7 = empty space
#include "map_files\generic\z6.dmm"
#include "map_files\generic\z7.dmm"
#define MAP_PATH "map_files/DreamStation"
#define MAP_FILE "dreamstation04.dmm"
#define MAP_NAME "DreamStation"
+1
View File
@@ -23,6 +23,7 @@ z7 = empty space
#include "map_files\generic\z6.dmm"
#include "map_files\generic\z7.dmm"
#define MAP_PATH "map_files/MetaStation"
#define MAP_FILE "MetaStation.v41I.dmm"
#define MAP_NAME "MetaStation"
+1
View File
@@ -56,6 +56,7 @@ Changes to the uplinks were made to discourage murderboning, the rest is the sam
#include "map_files\generic\z6.dmm"
#include "map_files\generic\z7.dmm"
#define MAP_PATH "map_files/MiniStation"
#define MAP_FILE "MiniStation.dmm"
#define MAP_NAME "MiniStation"
+1
View File
@@ -23,6 +23,7 @@ z7 = empty space
#include "map_files\generic\z6.dmm"
#include "map_files\generic\z7.dmm"
#define MAP_PATH "map_files/TgStation"
#define MAP_FILE "tgstation.2.1.3.dmm"
#define MAP_NAME "Box Station"
+1 -1
View File
@@ -65,7 +65,7 @@ var/global/datum/controller/master/Master = new()
/datum/controller/master/proc/Setup(zlevel)
// Per-Z-level subsystems.
if (zlevel && zlevel > 0 && zlevel <= world.maxz)
if(zlevel && zlevel > 0 && zlevel <= world.maxz)
for(var/datum/subsystem/SS in subsystems)
SS.Initialize(world.timeofday, zlevel)
sleep(-1)
+71 -162
View File
@@ -1,19 +1,13 @@
// Activate this to debug tile mismatches in the minimap.
// This will store the full information on each tile and compare it the next time you run the minimap.
// It can be used to find out what's changed since the last iteration.
// Only activate this when you need it - this should never be active on a live server!
// #define MINIMAP_DEBUG
var/datum/subsystem/minimap/SSminimap
/datum/subsystem/minimap
name = "Minimap"
priority = -2
var/const/MAX_ICON_DIMENSION = 1024
var/const/ICON_SIZE = 4
var/const/MINIMAP_SIZE = 2048
var/const/TILE_SIZE = 8
var/max_initalized_zlevel = 0
var/list/z_levels = list(ZLEVEL_STATION)
/datum/subsystem/minimap/New()
NEW_SS_GLOBAL(SSminimap)
@@ -21,163 +15,78 @@ var/datum/subsystem/minimap/SSminimap
/datum/subsystem/minimap/Initialize(timeofday, zlevel)
if(zlevel)
return ..()
for(var/z = 1 to ZLEVEL_SPACEMAX)
var/hash = md5(file2text("_maps/[MAP_PATH]/[MAP_FILE]"))
if(hash == trim(file2text(hash_path())))
return ..()
for(var/z in z_levels)
generate(z)
register_asset("minimap_[z].png", file("[getMinimapFile(z)].png"))
max_initalized_zlevel = ZLEVEL_SPACEMAX
register_asset("minimap_[z].png", fcopy_rsc(map_path(z)))
text2file(hash, hash_path())
..()
/datum/subsystem/minimap/proc/generate(z, x1 = 1, y1 = 1, x2 = world.maxx, y2 = world.maxy)
var/result_path = "[src.getMinimapFile(z)].png"
var/hash_path = "[src.getMinimapFile(z)].md5"
var/list/tiles = block(locate(x1, y1, z), locate(x2, y2, z))
var/hash = ""
var/temp
var/obj/obj
/datum/subsystem/minimap/proc/hash_path()
return "data/minimaps/[MAP_NAME].md5"
#ifdef MINIMAP_DEBUG
var/tiledata_path = "data/minimaps/debug_tiledata_[z].sav"
var/savefile/F = new/savefile(tiledata_path)
#endif
/datum/subsystem/minimap/proc/map_path(z)
return "data/minimaps/[MAP_NAME]_[z].png"
// Note for future developer: If you have tiles on the map with random or dynamic icons this hash check will fail
// every time. You'll have to modify this code to generate a unique hash for your object.
// Don't forget to modify the minimap generation code to use a default icon (or skip generation altogether).
for (var/turf/tile in tiles)
if (istype(tile.loc, /area/asteroid) || istype(tile.loc, /area/mine/unexplored) || istype(tile, /turf/simulated/mineral) || (istype(tile.loc, /area/space) && istype(tile, /turf/simulated/floor/plating/asteroid)))
temp = "/area/asteroid"
else if (istype(tile.loc, /area/mine) && istype(tile, /turf/simulated/floor/plating/asteroid))
temp = "/area/mine/explored"
else if (tile.loc.type == /area/start || (tile.type == /turf/space && !(locate(/obj/structure/lattice) in tile)) || istype(tile, /turf/space/transit))
temp = "/turf/space"
if (locate(/obj/structure/lattice/catwalk) in tile)
else
else if (tile.type == /turf/space)
if (locate(/obj/structure/lattice/catwalk) in tile)
temp = "/obj/structure/lattice/catwalk"
else
temp = "/obj/structure/lattice"
else if (tile.type == /turf/simulated/floor/plating/abductor)
temp = "/turf/simulated/floor/plating/abductor"
else if (tile.type == /turf/simulated/floor/plating && (locate(/obj/structure/window/shuttle) in tile))
temp = "/obj/structure/window/shuttle"
else
temp = "[tile.icon][tile.icon_state][tile.dir]"
obj = locate(/obj/structure/transit_tube) in tile
if (obj) temp = "[temp]/obj/structure/transit_tube[obj.icon_state][obj.dir]"
#ifdef MINIMAP_DEBUG
if (F["/[tile.y]/[tile.x]"] && F["/[tile.y]/[tile.x]"] != temp)
CRASH("Mismatch: [tile.type] at [tile.x],[tile.y],[tile.z] ([tile.icon], [tile.icon_state], [tile.dir])")
else
F["/[tile.y]/[tile.x]"] << temp
#endif
hash = md5("[hash][temp]")
if (fexists(result_path))
if (!fexists(hash_path) || trim(file2text(hash_path)) != hash)
fdel(result_path)
fdel(hash_path)
if (!fexists(result_path))
ASSERT(x1 > 0)
ASSERT(y1 > 0)
ASSERT(x2 <= world.maxx)
ASSERT(y2 <= world.maxy)
var/icon/map_icon = new/icon('html/mapbase1024.png')
// map_icon is fine and contains only 1 direction at this point.
ASSERT(map_icon.Width() == MAX_ICON_DIMENSION && map_icon.Height() == MAX_ICON_DIMENSION)
var/i = 0
var/icon/turf_icon
var/icon/obj_icon
var/old_icon
var/old_icon_state
var/old_dir
var/new_icon
var/new_icon_state
var/new_dir
for (var/turf/tile in tiles)
if (tile.loc.type != /area/start && (tile.type != /turf/space || (locate(/obj/structure/lattice) in tile) || (locate(/obj/structure/transit_tube) in tile)) && !istype(tile, /turf/space/transit))
if (istype(tile.loc, /area/asteroid) || istype(tile.loc, /area/mine/unexplored) || istype(tile, /turf/simulated/mineral) || (istype(tile.loc, /area/space) && istype(tile, /turf/simulated/floor/plating/asteroid)))
new_icon = 'icons/turf/mining.dmi'
new_icon_state = "rock"
new_dir = 2
else if (istype(tile.loc, /area/mine) && istype(tile, /turf/simulated/floor/plating/asteroid))
new_icon = 'icons/turf/floors.dmi'
new_icon_state = "asteroid"
new_dir = 2
else if (tile.type == /turf/simulated/floor/plating/abductor)
new_icon = 'icons/turf/floors.dmi'
new_icon_state = "alienpod1"
new_dir = 2
else if (tile.type == /turf/space)
obj = locate(/obj/structure/lattice) in tile
if (!obj) obj = locate(/obj/structure/transit_tube) in tile
ASSERT(obj != null)
if (obj)
new_icon = obj.icon
new_dir = obj.dir
new_icon_state = obj.icon_state
else if (tile.type == /turf/simulated/floor/plating && (locate(/obj/structure/window/shuttle) in tile))
new_icon = 'icons/obj/structures.dmi'
new_dir = 2
new_icon_state = "swindow"
else
new_icon = tile.icon
new_icon_state = tile.icon_state
new_dir = tile.dir
if (new_icon != old_icon || new_icon_state != old_icon_state || new_dir != old_dir)
old_icon = new_icon
old_icon_state = new_icon_state
old_dir = new_dir
turf_icon = new/icon(new_icon, new_icon_state, new_dir, 1, 0)
turf_icon.Scale(ICON_SIZE, ICON_SIZE)
if (tile.type != /turf/space || (locate(/obj/structure/lattice) in tile))
obj = locate(/obj/structure/transit_tube) in tile
if (obj)
obj_icon = new/icon(obj.icon, obj.icon_state, obj.dir, 1, 0)
obj_icon.Scale(ICON_SIZE, ICON_SIZE)
turf_icon.Blend(obj_icon, ICON_OVERLAY)
map_icon.Blend(turf_icon, ICON_OVERLAY, ((tile.x - 1) * ICON_SIZE), ((tile.y - 1) * ICON_SIZE))
if ((++i) % 512 == 0) sleep(1) // deliberate delay to avoid lag spikes
else
sleep(-1) // avoid sleeping if possible: prioritize pending procs
// BYOND BUG: map_icon now contains 4 directions? Create a new icon with only a single state.
var/icon/result_icon = new/icon()
result_icon.Insert(map_icon, "", SOUTH, 1, 0)
fcopy(result_icon, result_path)
text2file(hash, hash_path)
/datum/subsystem/minimap/proc/getMinimapFile(zlevel)
return "data/minimaps/[MAP_NAME]_[zlevel]"
/datum/subsystem/minimap/proc/sendMinimaps(client/client)
for(var/z = 1 to max_initalized_zlevel)
/datum/subsystem/minimap/proc/send(client/client)
for(var/z in z_levels)
send_asset(client, "minimap_[z].png")
#ifdef MINIMAP_DEBUG
#undef MINIMAP_DEBUG
#endif
/datum/subsystem/minimap/proc/generate(z = 1, x1 = 1, y1 = 1, x2 = world.maxx, y2 = world.maxy)
// Load the background.
var/icon/minimap = new /icon('icons/minimap.dmi')
// Scale it up to our target size.
minimap.Scale(MINIMAP_SIZE, MINIMAP_SIZE)
// Loop over turfs and generate icons.
for(var/T in block(locate(x1, y1, z), locate(x2, y2, z)))
var/turf/tile = T
var/icon/tile_icon
var/obj/obj
// Don't use icons for space, just add objects in space if they exist.
if(istype(tile, /turf/space))
obj = locate(/obj/structure/lattice/catwalk) in tile
if(obj)
tile_icon = new /icon('icons/obj/smooth_structures/catwalk.dmi', "catwalk", SOUTH)
obj = locate(/obj/structure/lattice) in tile
if(obj)
tile_icon = new /icon('icons/obj/smooth_structures/lattice.dmi', "lattice", SOUTH)
obj = locate(/obj/structure/grille) in tile
if(obj)
tile_icon = new /icon('icons/obj/structures.dmi', "grille", SOUTH)
obj = locate(/obj/structure/transit_tube) in tile
if(obj)
tile_icon = new /icon('icons/obj/atmospherics/pipes/transit_tube.dmi', obj.icon_state, obj.dir)
else
tile_icon = new /icon(tile.icon, tile.icon_state, tile.dir)
var/list/obj_icons = list()
obj = locate(/obj/structure) in tile
if(obj)
obj_icons += getFlatIcon(obj)
obj = locate(/obj/machinery) in tile
if(obj)
obj_icons += new /icon(obj.icon, obj.icon_state, obj.dir, 1, 0)
obj = locate(/obj/structure/window) in tile
if(obj)
obj_icons += new /icon('icons/obj/smooth_structures/window.dmi', "window", SOUTH)
for(var/I in obj_icons)
var/icon/obj_icon = I
tile_icon.Blend(obj_icon, ICON_OVERLAY)
if(tile_icon)
// Scale the icon.
tile_icon.Scale(TILE_SIZE, TILE_SIZE)
// Add the tile to the minimap.
minimap.Blend(tile_icon, ICON_OVERLAY, ((tile.x - 1) * TILE_SIZE), ((tile.y - 1) * TILE_SIZE))
// Create a new icon and insert the generated minimap, so that BYOND doesn't generate different directions.
var/icon/final = new /icon()
final.Insert(minimap, "", SOUTH, 1, 0)
fcopy(final, map_path(z))
+1 -1
View File
@@ -256,4 +256,4 @@ var/global/datum/crewmonitor/crewmonitor = new
/datum/crewmonitor/proc/sendResources(var/client/client)
send_asset(client, "crewmonitor.js")
send_asset(client, "crewmonitor.css")
SSminimap.sendMinimaps(client)
SSminimap.send(client)
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 196 B