-
-
Notifications
You must be signed in to change notification settings - Fork 554
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
1ab4d75
commit 081b6b0
Showing
11 changed files
with
71 additions
and
164 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,183 +1,83 @@ | ||
// 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 = 4080 | ||
var/const/TILE_SIZE = 16 | ||
|
||
var/max_initalized_zlevel = 0 | ||
var/list/z_levels = list(1) | ||
|
||
/datum/subsystem/minimap/New() | ||
NEW_SS_GLOBAL(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 | ||
|
||
#ifdef MINIMAP_DEBUG | ||
var/tiledata_path = "data/minimaps/debug_tiledata_[z].sav" | ||
var/savefile/F = new/savefile(tiledata_path) | ||
#endif | ||
|
||
// 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 | ||
/datum/subsystem/minimap/proc/hash_path() | ||
return "data/minimaps/[MAP_NAME].md5" | ||
|
||
if (obj) temp = "[temp]/obj/structure/transit_tube[obj.icon_state][obj.dir]" | ||
/datum/subsystem/minimap/proc/map_path(z) | ||
return "data/minimaps/[MAP_NAME]_[z].png" | ||
|
||
#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/turf/tile in block(locate(x1, y1, z), locate(x2, y2, z))) | ||
var/obj/obj | ||
var/icon/ikon = new /icon('icons/minimap.dmi') | ||
|
||
// Don't use icons for space, just add objects in space if they exist. | ||
if(istype(tile, /turf/space)) | ||
obj = locate(/obj/structure/lattice) in tile | ||
if(obj) | ||
ikon = new /icon('icons/obj/smooth_structures/lattice.dmi', "lattice", 2) | ||
obj = locate(/obj/structure/grille) in tile | ||
if(obj) | ||
ikon = new /icon('icons/obj/structures.dmi', "grille", 2) | ||
obj = locate(/obj/structure/transit_tube) in tile | ||
if(obj) | ||
ikon = new /icon('icons/obj/atmospherics/pipes/transit_tube.dmi', obj.icon_state, obj.dir) | ||
else | ||
ikon = new(tile.icon, tile.icon_state, tile.dir) | ||
|
||
var/icon/object | ||
obj = locate(/obj/structure/window/reinforced) in tile | ||
if(obj) | ||
object = new /icon('icons/obj/smooth_structures/reinforced_window.dmi', "r_window", 2) | ||
obj = locate(/obj/machinery/door/airlock) in tile | ||
if(obj) | ||
object = new /icon(obj.icon, obj.icon_state, obj.dir, 1, 0) | ||
|
||
if(object) | ||
ikon.Blend(object, ICON_OVERLAY) | ||
|
||
// Scale the icon. | ||
ikon.Scale(TILE_SIZE, TILE_SIZE) | ||
// Add the tile to the minimap. | ||
minimap.Blend(ikon, 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(minimap, map_path(z)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file not shown.