Files
Aurora.3/code/controllers/subsystems/initialization/holomap.dm
Fluffy b8902e2e16 Runtime map now loads in ~11 seconds instead of ~40, sped up various other things (#19957)
Runtime map now has a bunch of new areas / items with often-tested
stuffs, and some hard-to-put-at-runtime stuffs.
Runtime map jobs now are positioned to make it faster to reach the
aforementioned often-tested stuffs.
Runtime map doesn't generate an overmap anymore by default, which speeds
up the process.
Runtime map now loads in ~11 seconds instead of ~40 seconds as it was
before.
Updated the maploader to be faster in parsing maps.
Bapi is not engaged anymore if we're only measuring the map size, which
speeds up the process.
In fastboot we do not generate the codexes anymore, which speeds up the
process.
In fastboot and if exoplanets and away sites are not enabled, we do not
parse the map templates anymore, which speeds up the process.
Updated the icon smoothing to be faster.
Optimized cargo area code.
Other optimizations.
2024-10-06 21:31:01 +00:00

148 lines
5.3 KiB
Plaintext

// Minimap generation system adapted from vorestation, adapted from /vg/.
// Seems to be much simpler/saner than /vg/'s implementation.
SUBSYSTEM_DEF(holomap)
name = "Holomap"
flags = SS_NO_FIRE
init_order = SS_INIT_HOLOMAP
/// List of images of minimaps, for every z-level, initialized at round start.
/// This is the "base" minimap, shows only the physical structure of walls and paths, and respects `HIDE_FROM_HOLOMAP`.
/// Key of list is the `z` of the z-level, value is the `/icon/`.
/// Every image is 255x255px.
var/list/minimaps = list()
/// Same as `minimaps`, but images are base64 encoded.
var/list/minimaps_base64 = list()
/// Same as `minimaps_base64`, but the map is colored with `holomap_color` of the `/area/`
var/list/minimaps_area_colored_base64 = list()
/// Same as `minimaps_base64`, but does not discriminate between walls and paths.
var/list/minimaps_scan_base64 = list()
/// List of all `/obj/effect/landmark/minimap_poi`.
var/list/obj/effect/landmark/minimap_poi/pois = list()
/*#############################################
Typecaches used for map icon generation
#############################################*/
var/static/list/mineral_wall_tcache = typecacheof(list(
/turf/simulated/mineral,
/turf/unsimulated/mineral,
))
var/static/list/mineral_floor_tcache = typecacheof(list(
/turf/unsimulated/floor/asteroid,
/turf/simulated/mineral,
/turf/simulated/floor/exoplanet,
))
var/static/list/hull_tcache = typecacheof(list(
/turf/simulated/wall,
/turf/simulated/floor,
/turf/unsimulated/wall,
/turf/unsimulated/floor,
))
var/static/list/rock_tcache = typecacheof(list(
/turf/simulated/mineral,
/turf/unsimulated/floor/asteroid,
/turf/simulated/open
))
var/static/list/obstacle_tcache = typecacheof(list(
/turf/simulated/wall,
/turf/unsimulated/mineral,
/turf/unsimulated/wall
))
var/static/list/path_tcache = typecacheof(list(
/turf/simulated/floor,
/turf/unsimulated/floor
)) - typecacheof(/turf/unsimulated/floor/asteroid)
/datum/controller/subsystem/holomap/Initialize()
generate_all_minimaps()
LOG_DEBUG("SSholomap: [minimaps.len] maps.")
return SS_INIT_SUCCESS
/datum/controller/subsystem/holomap/proc/generate_all_minimaps()
minimaps.len = world.maxz
minimaps_base64.len = world.maxz
minimaps_area_colored_base64.len = world.maxz
minimaps_scan_base64.len = world.maxz
for (var/z in 1 to world.maxz)
generate_minimap(z)
generate_minimap_area_colored(z)
generate_minimap_scan(z)
CHECK_TICK
/datum/controller/subsystem/holomap/proc/generate_minimap(zlevel = 1)
// Sanity checks - Better to generate a helpful error message now than have DrawBox() runtime
var/icon/canvas = icon('icons/255x255.dmi', "blank")
if(world.maxx > canvas.Width())
CRASH("Minimap for z=[zlevel] : world.maxx ([world.maxx]) must be <= [canvas.Width()]")
if(world.maxy > canvas.Height())
CRASH("Minimap for z=[zlevel] : world.maxy ([world.maxy]) must be <= [canvas.Height()]")
for(var/turf/T as anything in Z_TURFS(zlevel))
var/area/A = T.loc
var/Ttype = T.type
if (A.area_flags & AREA_FLAG_HIDE_FROM_HOLOMAP)
continue
if (rock_tcache[Ttype])
continue
if (obstacle_tcache[Ttype] || (length(T.contents) && locate(/obj/structure/grille, T)))
canvas.DrawBox(HOLOMAP_OBSTACLE + "DD", T.x, T.y)
else if(path_tcache[Ttype] || (length(T.contents) && locate(/obj/structure/lattice/catwalk, T)))
canvas.DrawBox(HOLOMAP_PATH + "DD", T.x, T.y)
minimaps[zlevel] = canvas
minimaps_base64[zlevel] = icon2base64(canvas)
/datum/controller/subsystem/holomap/proc/generate_minimap_area_colored(zlevel)
// Sanity checks - Better to generate a helpful error message now than have DrawBox() runtime
var/icon/canvas = icon('icons/255x255.dmi', "blank")
if(world.maxx > canvas.Width())
crash_with("Minimap for z=[zlevel] : world.maxx ([world.maxx]) must be <= [canvas.Width()]")
if(world.maxy > canvas.Height())
crash_with("Minimap for z=[zlevel] : world.maxy ([world.maxy]) must be <= [canvas.Height()]")
for (var/turf/T as anything in Z_TURFS(zlevel))
var/area/A = T.loc
if (A.area_flags & AREA_FLAG_HIDE_FROM_HOLOMAP)
continue
if (A.holomap_color)
canvas.DrawBox(A.holomap_color + "99", T.x, T.y)
var/icon/map_base = icon(minimaps[zlevel])
map_base.Blend(HOLOMAP_HOLOFIER, ICON_MULTIPLY)
// Generate the full sized map by blending the base and areas onto the backdrop
var/icon/big_map = icon('icons/255x255.dmi', "blank")
big_map.Blend(map_base, ICON_OVERLAY)
big_map.Blend(canvas, ICON_OVERLAY)
minimaps_area_colored_base64[zlevel] = icon2base64(big_map)
/datum/controller/subsystem/holomap/proc/generate_minimap_scan(zlevel = 1)
// Sanity checks - Better to generate a helpful error message now than have DrawBox() runtime
var/icon/canvas = icon('icons/255x255.dmi', "blank")
if(world.maxx > canvas.Width())
CRASH("Minimap for z=[zlevel] : world.maxx ([world.maxx]) must be <= [canvas.Width()]")
if(world.maxy > canvas.Height())
CRASH("Minimap for z=[zlevel] : world.maxy ([world.maxy]) must be <= [canvas.Height()]")
for(var/turf/T as anything in Z_TURFS(zlevel))
var/Ttype = T.type
if (mineral_wall_tcache[Ttype])
canvas.DrawBox(HOLOMAP_MINERAL_WALL, T.x, T.y)
else if (mineral_floor_tcache[Ttype])
canvas.DrawBox(HOLOMAP_MINERAL_FLOOR, T.x, T.y)
else if(hull_tcache[Ttype])
canvas.DrawBox(HOLOMAP_OBSTACLE, T.x, T.y)
minimaps_scan_base64[zlevel] = icon2base64(canvas)