mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-21 07:32:02 +00:00
changes: Holomaps now use an area flag instead of a proc to determine which areas do not draw on the holomap. The supply shuttle once more has a roof. The supply shuttle's landing zone is now dynamically lit. Turfs only generate visibility updates on Initialize() after mapload - visualnet is not initialized by then anyways. Merged /datum/gas_mixture/(init) into /datum/gas_mixture/New(). Converted a ZAS proc into a macro. Made ZAS attempt to remove a turf from a zone instead of always rebuilding it in a certain case. Macroized two misc procs. Fixes #2947.
122 lines
4.9 KiB
Plaintext
122 lines
4.9 KiB
Plaintext
// Minimap generation system adapted from vorestation, adapted from /vg/.
|
|
// Seems to be much simpler/saner than /vg/'s implementation.
|
|
|
|
// Turfs that will be colored as HOLOMAP_ROCK
|
|
#define IS_ROCK(tile) (istype(tile, /turf/simulated/mineral) || istype(tile, /turf/simulated/floor/asteroid) || isopenturf(tile))
|
|
|
|
// Turfs that will be colored as HOLOMAP_OBSTACLE
|
|
#define IS_OBSTACLE(tile) ((!istype(tile, /turf/space) && istype(tile.loc, /area/mine/unexplored)) \
|
|
|| istype(tile, /turf/simulated/wall) \
|
|
|| istype(tile, /turf/unsimulated/mineral) \
|
|
|| (istype(tile, /turf/unsimulated/wall)) \
|
|
|| (locate(/obj/structure/grille) in tile))
|
|
|
|
// Turfs that will be colored as HOLOMAP_PATH
|
|
#define IS_PATH(tile) ((istype(tile, /turf/simulated/floor) && !istype(tile, /turf/simulated/floor/asteroid)) \
|
|
|| istype(tile, /turf/unsimulated/floor) \
|
|
|| (locate(/obj/structure/lattice/catwalk) in tile))
|
|
|
|
/var/datum/controller/subsystem/minimap/SSminimap
|
|
|
|
/datum/controller/subsystem/minimap
|
|
name = "Holomap"
|
|
flags = SS_NO_FIRE
|
|
init_order = SS_INIT_HOLOMAP
|
|
|
|
var/list/holo_minimaps = list()
|
|
var/list/extra_minimaps = list()
|
|
var/list/station_holomaps = list()
|
|
|
|
/datum/controller/subsystem/minimap/New()
|
|
NEW_SS_GLOBAL(SSminimap)
|
|
|
|
/datum/controller/subsystem/minimap/Initialize()
|
|
holo_minimaps.len = world.maxz
|
|
for (var/z in 1 to world.maxz)
|
|
holo_minimaps[z] = generateHoloMinimap(z)
|
|
|
|
log_debug("SSminimap: [holo_minimaps.len] maps.")
|
|
|
|
for (var/z in config.station_levels)
|
|
generateStationMinimap(z)
|
|
|
|
..()
|
|
|
|
|
|
// Generates the "base" holomap for one z-level, showing only the physical structure of walls and paths.
|
|
/datum/controller/subsystem/minimap/proc/generateHoloMinimap(zlevel = 1)
|
|
// Save these values now to avoid a bazillion array lookups
|
|
var/offset_x = HOLOMAP_PIXEL_OFFSET_X(zlevel)
|
|
var/offset_y = HOLOMAP_PIXEL_OFFSET_Y(zlevel)
|
|
|
|
// Sanity checks - Better to generate a helpful error message now than have DrawBox() runtime
|
|
var/icon/canvas = icon(HOLOMAP_ICON, "blank")
|
|
if(world.maxx + offset_x > canvas.Width())
|
|
crash_with("Minimap for z=[zlevel] : world.maxx ([world.maxx]) + holomap_offset_x ([offset_x]) must be <= [canvas.Width()]")
|
|
if(world.maxy + offset_y > canvas.Height())
|
|
crash_with("Minimap for z=[zlevel] : world.maxy ([world.maxy]) + holomap_offset_y ([offset_y]) must be <= [canvas.Height()]")
|
|
|
|
for(var/x = 1 to world.maxx)
|
|
for(var/y = 1 to world.maxy)
|
|
var/turf/tile = locate(x, y, zlevel)
|
|
var/area/A
|
|
if(tile)
|
|
A = tile.loc
|
|
if (A.flags & HIDE_FROM_HOLOMAP)
|
|
continue
|
|
if(IS_ROCK(tile))
|
|
continue
|
|
if(IS_OBSTACLE(tile))
|
|
canvas.DrawBox(HOLOMAP_OBSTACLE, x + offset_x, y + offset_y)
|
|
else if(IS_PATH(tile))
|
|
canvas.DrawBox(HOLOMAP_PATH, x + offset_x, y + offset_y)
|
|
|
|
CHECK_TICK
|
|
return canvas
|
|
|
|
/datum/controller/subsystem/minimap/proc/generateStationMinimap(zlevel)
|
|
// Save these values now to avoid a bazillion array lookups
|
|
var/offset_x = HOLOMAP_PIXEL_OFFSET_X(zlevel)
|
|
var/offset_y = HOLOMAP_PIXEL_OFFSET_Y(zlevel)
|
|
|
|
// Sanity checks - Better to generate a helpful error message now than have DrawBox() runtime
|
|
var/icon/canvas = icon(HOLOMAP_ICON, "blank")
|
|
if(world.maxx + offset_x > canvas.Width())
|
|
crash_with("Minimap for z=[zlevel] : world.maxx ([world.maxx]) + holomap_offset_x ([offset_x]) must be <= [canvas.Width()]")
|
|
if(world.maxy + offset_y > canvas.Height())
|
|
crash_with("Minimap for z=[zlevel] : world.maxy ([world.maxy]) + holomap_offset_y ([offset_y]) must be <= [canvas.Height()]")
|
|
|
|
for(var/x = 1 to world.maxx)
|
|
for(var/y = 1 to world.maxy)
|
|
var/turf/tile = locate(x, y, zlevel)
|
|
if(tile && tile.loc)
|
|
var/area/areaToPaint = tile.loc
|
|
if(areaToPaint.holomap_color)
|
|
canvas.DrawBox(areaToPaint.holomap_color, x + offset_x, y + offset_y)
|
|
|
|
// Save this nice area-colored canvas in case we want to layer it or something I guess
|
|
extra_minimaps["[HOLOMAP_EXTRA_STATIONMAPAREAS]_[zlevel]"] = canvas
|
|
|
|
var/icon/map_base = icon(holo_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(HOLOMAP_ICON, "stationmap")
|
|
big_map.Blend(map_base, ICON_OVERLAY)
|
|
big_map.Blend(canvas, ICON_OVERLAY)
|
|
extra_minimaps["[HOLOMAP_EXTRA_STATIONMAP]_[zlevel]"] = big_map
|
|
|
|
// Generate the "small" map (I presume for putting on wall map things?)
|
|
var/icon/small_map = icon(HOLOMAP_ICON, "blank")
|
|
small_map.Blend(map_base, ICON_OVERLAY)
|
|
small_map.Blend(canvas, ICON_OVERLAY)
|
|
small_map.Scale(WORLD_ICON_SIZE, WORLD_ICON_SIZE)
|
|
|
|
// And rotate it in every direction of course!
|
|
var/icon/actual_small_map = icon(small_map)
|
|
actual_small_map.Insert(new_icon = small_map, dir = SOUTH)
|
|
actual_small_map.Insert(new_icon = turn(small_map, 90), dir = WEST)
|
|
actual_small_map.Insert(new_icon = turn(small_map, 180), dir = NORTH)
|
|
actual_small_map.Insert(new_icon = turn(small_map, 270), dir = EAST)
|
|
extra_minimaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[zlevel]"] = actual_small_map
|