Files
Aurora.3/code/controllers/subsystems/initialization/holomap.dm
DreamySkrell a24345a43b Scenario - Environmental Testing Facility (#19611)
changes:
- rscadd: "Adds Environmental Testing Facility odyssey scenario. Big
map."
  - rscadd: "Removes green tint from the minimap program/reader."
  - rscadd: "Adds/reorganizes some generic outfits."
  - rscadd: "Adds some generic odyssey actor roles."
- rscadd: "Adds actor accesses system to odyssey scenarios, and a
self-service access terminal."
- rscadd: "Adds some warnings to odyssey actor teleporter, in case ID
access or headset are missing."
  - rscadd: "Adds some more random spawners."
  - rscadd: "Adds better sprites door helpers."
  - rscadd: "Adds access door helper."
  - rscadd: "Adds info box to odyssey actor panel about roles."



![image](https://github.com/user-attachments/assets/fc2c0316-e95b-49f8-ac8b-55d03ef47b18)

![image](https://github.com/user-attachments/assets/36a680e8-47bf-4a12-b0a4-7c83cad9e74e)

![image](https://github.com/user-attachments/assets/fca04220-5457-4fa0-9045-cbf9f3f7e013)

![image](https://github.com/user-attachments/assets/6c0c4af2-ae63-4824-bcbe-59519156d288)

![image](https://github.com/user-attachments/assets/a5022487-b2db-4b37-ad16-a9e287ea1695)

![image](https://github.com/user-attachments/assets/96eee079-5aa4-4606-8c7e-ca8f5c3444d4)

---------

Signed-off-by: DreamySkrell <107256943+DreamySkrell@users.noreply.github.com>
Co-authored-by: DreamySkrell <>
Co-authored-by: AuroraBuildBot <action@github.com>
Co-authored-by: Fluffy <65877598+FluffyGhoster@users.noreply.github.com>
2025-03-25 20:40:32 +00:00

147 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/simulated/floor/exoplanet/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/simulated/floor/exoplanet/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/simulated/floor/exoplanet/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])
// 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)