diff --git a/_maps/shuttles/infiltrator_basic.dmm b/_maps/shuttles/infiltrator_basic.dmm index 61f8ea231df..468a10b865b 100644 --- a/_maps/shuttles/infiltrator_basic.dmm +++ b/_maps/shuttles/infiltrator_basic.dmm @@ -19,9 +19,9 @@ /area/shuttle/syndicate/hallway) "ae" = ( /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/machinery/door/poddoor/shutters{ - id = "syndieshutters"; - name = "Blast Shutters" +/obj/machinery/door/poddoor/shutters/syndicate{ + name = "Blast Shutters"; + id = "syndieshutters" }, /turf/open/floor/plating, /area/shuttle/syndicate/bridge) @@ -191,10 +191,6 @@ }, /area/shuttle/syndicate/airlock) "aY" = ( -/obj/machinery/door/poddoor{ - id = "smindicate"; - name = "Outer Blast Door" - }, /obj/docking_port/mobile/infiltrator, /obj/structure/fans/tiny, /obj/machinery/button/door/directional/north{ @@ -205,6 +201,11 @@ /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 }, +/obj/machinery/door/poddoor/shutters/syndicate/indestructible{ + id = "smindicate"; + name = "Outer Blast Door"; + dir = 4 + }, /turf/open/floor/plating, /area/shuttle/syndicate/airlock) "aZ" = ( @@ -601,9 +602,7 @@ /obj/item/storage/box/zipties, /obj/machinery/computer/security/telescreen/entertainment/directional/west, /obj/structure/table/reinforced/plastitaniumglass, -/turf/open/floor/iron/dark/smooth_corner{ - dir = 2 - }, +/turf/open/floor/iron/dark/smooth_corner, /area/shuttle/syndicate/airlock) "iE" = ( /obj/structure/closet/syndicate/nuclear, diff --git a/_maps/templates/lazy_templates/nukie_base.dmm b/_maps/templates/lazy_templates/nukie_base.dmm index 707e8a251f3..c3c6268f400 100644 --- a/_maps/templates/lazy_templates/nukie_base.dmm +++ b/_maps/templates/lazy_templates/nukie_base.dmm @@ -7,14 +7,6 @@ "ae" = ( /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/expansion_bombthreat) -"ah" = ( -/obj/effect/turf_decal/stripes/end{ - dir = 4 - }, -/obj/machinery/mech_bay_recharge_port, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) "al" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 8 @@ -22,15 +14,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/wood/tile, /area/centcom/syndicate_mothership/control) -"as" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark, -/obj/structure/sign/poster/contraband/cybersun_six_hundred/directional/east, -/obj/item/kirbyplants/random, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) -"au" = ( -/turf/open/floor/circuit/red, -/area/centcom/syndicate_mothership/control) "ay" = ( /obj/structure/table/reinforced, /obj/item/papercutter, @@ -54,6 +37,13 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) +"aS" = ( +/obj/effect/turf_decal/siding/red/corner, +/obj/item/folder/red, +/obj/item/pen/red, +/obj/structure/table/reinforced/plastitaniumglass, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "aX" = ( /obj/machinery/shower/directional/south, /turf/open/floor/iron/freezer, @@ -77,10 +67,6 @@ /obj/structure/mirror/directional/east, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) -"bp" = ( -/obj/machinery/light/cold/directional/north, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) "bB" = ( /obj/structure/railing{ dir = 4 @@ -123,6 +109,10 @@ }, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_bombthreat) +"bS" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/control) "bT" = ( /obj/structure/flora/rock/pile/style_random, /turf/open/misc/asteroid/snow/airless, @@ -162,6 +152,15 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/centcom/syndicate_mothership/control) +"cC" = ( +/obj/machinery/vending/cola, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/turf/open/floor/iron/white/textured_large{ + color = "#b51026" + }, +/area/centcom/syndicate_mothership/control) "cF" = ( /obj/effect/baseturf_helper/asteroid/snow, /turf/closed/indestructible/syndicate, @@ -219,6 +218,20 @@ /obj/structure/flora/grass/both/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"cW" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/machinery/light/red/dim/directional/north, +/turf/open/floor/iron/smooth_half, +/area/centcom/syndicate_mothership/control) +"cY" = ( +/obj/machinery/light/cold/directional/east, +/obj/machinery/vending/snack/teal, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/catwalk_floor/iron_dark, +/area/centcom/syndicate_mothership/control) "cZ" = ( /obj/structure/mop_bucket/janitorialcart{ dir = 4 @@ -233,15 +246,6 @@ /obj/machinery/shower/directional/south, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) -"dn" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 1 - }, -/obj/machinery/camera/autoname/directional/west{ - network = list("nukie") - }, -/turf/open/floor/iron/dark/textured_large, -/area/centcom/syndicate_mothership/control) "dq" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/iron/smooth_half, @@ -252,22 +256,16 @@ }, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) -"du" = ( -/obj/structure/chair/stool/directional/north, -/obj/effect/landmark/start/nukeop_base, -/obj/structure/sign/poster/contraband/donk_co/directional/south, -/turf/open/floor/wood/tile, -/area/centcom/syndicate_mothership/control) -"dw" = ( -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/turf/open/floor/carpet, -/area/centcom/syndicate_mothership/control) "dx" = ( /obj/machinery/shower/directional/east, /obj/effect/turf_decal/stripes/box, /turf/open/floor/mineral/titanium/tiled, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"dB" = ( +/obj/machinery/recharger, +/obj/structure/table/reinforced/plastitaniumglass, +/turf/open/floor/carpet, +/area/centcom/syndicate_mothership/control) "dF" = ( /obj/machinery/light/cold/directional/west, /obj/structure/table/glass/plasmaglass, @@ -467,6 +465,12 @@ /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) +"eM" = ( +/obj/effect/turf_decal/siding/red, +/obj/machinery/recharger, +/obj/structure/table/reinforced/plastitaniumglass, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "fa" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -478,15 +482,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) -"fb" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 4 - }, -/obj/machinery/camera/autoname/directional/north{ - network = list("nukie") - }, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) "fk" = ( /turf/open/floor/circuit/red/off, /area/centcom/syndicate_mothership/expansion_bioterrorism) @@ -497,6 +492,15 @@ /obj/machinery/portable_atmospherics/canister/plasma, /turf/open/floor/plating, /area/centcom/syndicate_mothership/expansion_bombthreat) +"fr" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 10 + }, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/folder/white, +/obj/item/pen/red, +/turf/open/floor/iron/smooth_half, +/area/centcom/syndicate_mothership/control) "fu" = ( /obj/machinery/shower/directional/south, /obj/machinery/light/floor, @@ -546,6 +550,14 @@ /obj/machinery/hydroponics/constructable, /turf/open/floor/mineral/titanium/tiled, /area/centcom/syndicate_mothership/expansion_bioterrorism) +"fP" = ( +/obj/effect/turf_decal/siding/red, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/obj/machinery/light/red/dim/directional/north, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "fR" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/heat_exchanging/junction, @@ -554,6 +566,11 @@ "fT" = ( /turf/open/floor/engine/bz, /area/centcom/syndicate_mothership/expansion_bioterrorism) +"fU" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/tile/red/half, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "fV" = ( /obj/structure/frame/computer{ dir = 1 @@ -579,36 +596,24 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer2, /turf/closed/indestructible/syndicate, /area/centcom/syndicate_mothership/expansion_bombthreat) -"go" = ( -/obj/machinery/light/cold/directional/east, -/obj/machinery/vending/snack/teal, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/catwalk_floor/titanium, -/area/centcom/syndicate_mothership/control) "gs" = ( /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) +"gu" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/catwalk_floor/iron_dark, +/area/centcom/syndicate_mothership/control) "gw" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) -"gB" = ( -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 8 - }, -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 4 - }, -/obj/machinery/door/airlock/public/glass{ - name = "War Room" - }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, -/turf/open/floor/iron/textured_large, -/area/centcom/syndicate_mothership/control) "gD" = ( /obj/structure/flora/tree/dead/style_random, /obj/structure/flora/grass/both/style_random, @@ -789,21 +794,13 @@ dir = 4 }, /area/centcom/syndicate_mothership/expansion_fridgerummage) -"ij" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 8 +"ih" = ( +/obj/machinery/camera/autoname/directional/west{ + network = list("nukie") }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/catwalk_floor/titanium, -/area/centcom/syndicate_mothership/control) -"il" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ +/obj/effect/turf_decal/tile/red/half{ dir = 1 }, -/obj/effect/turf_decal/siding/red/corner, /turf/open/floor/iron/dark/textured_large, /area/centcom/syndicate_mothership/control) "is" = ( @@ -812,6 +809,13 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) +"iz" = ( +/obj/effect/turf_decal/siding/red/corner{ + dir = 1 + }, +/obj/structure/table/reinforced/plastitaniumglass, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "iA" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 1 @@ -842,9 +846,11 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) -"iV" = ( -/obj/structure/chair/stool/directional/north, -/turf/open/floor/iron/dark/textured_large, +"iU" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 6 + }, +/turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/control) "iX" = ( /obj/machinery/vending/dinnerware, @@ -856,6 +862,16 @@ /obj/machinery/light/cold/directional/west, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) +"jd" = ( +/obj/structure/chair/stool/directional/south, +/obj/structure/sign/map/left{ + desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; + icon_state = "map-left-MS"; + pixel_y = 32 + }, +/obj/effect/landmark/start/nukeop_base, +/turf/open/floor/wood/tile, +/area/centcom/syndicate_mothership/control) "je" = ( /obj/effect/turf_decal/siding/wideplating{ dir = 8 @@ -917,6 +933,15 @@ /obj/structure/noticeboard/directional/north, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bioterrorism) +"kf" = ( +/obj/effect/turf_decal/siding/red/corner{ + dir = 8 + }, +/obj/item/folder/red, +/obj/item/pen/red, +/obj/structure/table/reinforced/plastitaniumglass, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "kg" = ( /turf/open/misc/ice/icemoon, /area/centcom/syndicate_mothership/control) @@ -1022,12 +1047,6 @@ }, /turf/open/lava/plasma/ice_moon, /area/centcom/syndicate_mothership/control) -"lc" = ( -/obj/effect/turf_decal/siding/red/corner{ - dir = 4 - }, -/turf/open/floor/iron/dark/textured_large, -/area/centcom/syndicate_mothership/control) "ld" = ( /turf/open/floor/iron/smooth_edge{ dir = 8 @@ -1047,13 +1066,6 @@ /obj/structure/flora/grass/both/style_random, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) -"lo" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark, -/obj/machinery/camera/autoname/directional/south{ - network = list("nukie") - }, -/turf/open/floor/iron/dark/textured_large, -/area/centcom/syndicate_mothership/control) "lt" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, /turf/open/floor/mineral/plastitanium, @@ -1125,18 +1137,6 @@ /obj/machinery/chem_dispenser/mutagensaltpeter, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bioterrorism) -"my" = ( -/obj/effect/landmark/start/nukeop_base/leader, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) -"mz" = ( -/obj/machinery/vending/cola, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 4 - }, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) "mA" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -1152,6 +1152,10 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bombthreat) +"mC" = ( +/obj/effect/turf_decal/tile/red/half, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "mJ" = ( /obj/structure/sign/poster/contraband/free_key, /turf/closed/indestructible/syndicate, @@ -1176,19 +1180,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) -"ng" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 1 - }, -/obj/structure/fans/tiny, -/obj/machinery/door/poddoor/shutters/syndicate{ - id = "FBBZ1"; - name = "Security Shutters"; - dir = 1 - }, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) "nk" = ( /obj/structure/flora/tree/dead/style_random, /obj/structure/flora/grass/both/style_random, @@ -1217,14 +1208,14 @@ /obj/structure/flora/tree/pine/style_random, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) -"nD" = ( -/obj/effect/turf_decal/stripes/full, -/turf/open/floor/mineral/titanium/yellow, -/area/centcom/syndicate_mothership/control) "nF" = ( /obj/effect/turf_decal/syndicateemblem/top/middle, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/control) +"nG" = ( +/obj/machinery/vending/cigarette/syndicate, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "nH" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/structure/closet/syndicate/personal, @@ -1234,6 +1225,10 @@ dir = 8 }, /area/centcom/syndicate_mothership/control) +"nI" = ( +/obj/machinery/minimap_table, +/turf/open/floor/circuit/red/no_power, +/area/centcom/syndicate_mothership/control) "nL" = ( /obj/structure/chair/office/light{ dir = 1 @@ -1255,6 +1250,12 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) +"nV" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/landmark/start/nukeop_base, +/obj/structure/sign/poster/contraband/donk_co/directional/south, +/turf/open/floor/wood/tile, +/area/centcom/syndicate_mothership/control) "oc" = ( /obj/structure/fence{ dir = 4 @@ -1270,13 +1271,6 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bombthreat) -"oh" = ( -/obj/structure/table/reinforced, -/obj/item/syndicatedetonator{ - desc = "This gaudy button can be used to instantly detonate syndicate bombs that have been activated on the station. It is also fun to press." - }, -/turf/open/floor/carpet, -/area/centcom/syndicate_mothership/control) "oi" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 10 @@ -1288,16 +1282,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, /turf/open/floor/catwalk_floor/iron_dark, /area/centcom/syndicate_mothership/control) -"or" = ( -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 1 +"om" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 4 }, -/obj/effect/turf_decal/siding/wideplating/dark, -/obj/machinery/door/airlock/hatch{ - name = "Gangway" - }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, -/turf/open/floor/iron, +/obj/structure/sign/poster/contraband/smoke/directional/north, +/turf/open/floor/iron/dark/textured_large, /area/centcom/syndicate_mothership/control) "os" = ( /obj/effect/turf_decal/stripes/box, @@ -1314,10 +1304,19 @@ }, /turf/open/floor/engine/vacuum, /area/centcom/syndicate_mothership/expansion_bombthreat) -"oD" = ( +"oA" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 10 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/control) +"oH" = ( /obj/effect/turf_decal/siding/red{ dir = 1 }, +/obj/item/folder/red, +/obj/item/pen/red, +/obj/structure/table/reinforced/plastitaniumglass, /turf/open/floor/iron/dark/textured_large, /area/centcom/syndicate_mothership/control) "oK" = ( @@ -1356,6 +1355,14 @@ }, /turf/open/floor/engine, /area/centcom/syndicate_mothership/expansion_bioterrorism) +"oU" = ( +/obj/effect/turf_decal/siding/red{ + dir = 1 + }, +/obj/machinery/recharger, +/obj/structure/table/reinforced/plastitaniumglass, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "oW" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 9 @@ -1402,11 +1409,11 @@ /obj/structure/flora/rock/icy/style_random, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) -"pr" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ +"pp" = ( +/obj/effect/turf_decal/siding/red, +/obj/effect/turf_decal/tile/red/half{ dir = 1 }, -/obj/effect/turf_decal/siding/red, /turf/open/floor/iron/dark/textured_large, /area/centcom/syndicate_mothership/control) "ps" = ( @@ -1438,13 +1445,6 @@ /obj/machinery/vending/tool, /turf/open/floor/mineral/titanium/yellow, /area/centcom/syndicate_mothership/control) -"pS" = ( -/obj/structure/chair/greyscale{ - dir = 4 - }, -/obj/effect/landmark/start/nukeop_base/overwatch, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership) "pU" = ( /obj/structure/chair/office/light{ dir = 8 @@ -1515,10 +1515,6 @@ }, /turf/open/floor/plastic, /area/centcom/syndicate_mothership/expansion_fridgerummage) -"qv" = ( -/obj/item/kirbyplants/random, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) "qw" = ( /turf/open/floor/plating, /area/centcom/syndicate_mothership/control) @@ -1583,6 +1579,19 @@ }, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) +"qR" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating, +/obj/machinery/door/poddoor/shutters/syndicate/indestructible{ + name = "Base Lift"; + dir = 1; + id_tag = "nukiespawnlift"; + id = "nukiespawnlift" + }, +/turf/open/floor/iron/dark/textured_half, +/area/centcom/syndicate_mothership/control) "qU" = ( /obj/structure/flora/rock/icy/style_random{ pixel_x = -7 @@ -1592,16 +1601,6 @@ "qX" = ( /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) -"rb" = ( -/obj/effect/turf_decal/siding/red, -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/obj/item/stack/spacecash/c10{ - pixel_x = -19; - pixel_y = 10 - }, -/turf/open/floor/iron/dark/textured_large, -/area/centcom/syndicate_mothership/control) "rf" = ( /turf/open/floor/iron/stairs/old, /area/centcom/syndicate_mothership/control) @@ -1623,25 +1622,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, /turf/open/floor/iron/smooth, /area/centcom/syndicate_mothership/control) -"ru" = ( -/obj/effect/turf_decal/siding/wideplating{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wideplating, -/obj/machinery/door/poddoor/shutters/syndicate/indestructible{ - name = "Base Lift"; - dir = 1; - id_tag = "nukiespawnlift"; - id = "nukiespawnlift" - }, -/turf/open/floor/iron/dark/textured_half, -/area/centcom/syndicate_mothership/control) -"rw" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 6 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/centcom/syndicate_mothership/control) "rA" = ( /obj/effect/turf_decal/siding/purple{ dir = 1 @@ -1681,6 +1661,14 @@ /obj/structure/fence/door/opened, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"rO" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 8 + }, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/folder/red, +/turf/open/floor/iron/smooth_half, +/area/centcom/syndicate_mothership/control) "rS" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 5 @@ -1838,20 +1826,6 @@ }, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_bombthreat) -"tu" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/siding/red/corner{ - dir = 1 - }, -/turf/open/floor/iron/dark/textured_large, -/area/centcom/syndicate_mothership/control) -"tv" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/siding/red/corner, -/obj/item/folder/red, -/obj/item/pen/red, -/turf/open/floor/iron/dark/textured_large, -/area/centcom/syndicate_mothership/control) "tz" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -1922,6 +1896,13 @@ /obj/structure/statue/uranium/nuke, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"ux" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/catwalk_floor/iron_dark, +/area/centcom/syndicate_mothership/control) "uK" = ( /obj/effect/turf_decal/siding/wideplating{ dir = 1 @@ -1954,6 +1935,14 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) +"uY" = ( +/obj/effect/turf_decal/siding/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red/half, +/obj/machinery/light/red/dim/directional/south, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "ve" = ( /obj/effect/turf_decal/syndicateemblem/top/middle{ dir = 1 @@ -1974,26 +1963,17 @@ /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /turf/open/floor/plating, /area/centcom/syndicate_mothership/expansion_bombthreat) -"vv" = ( -/obj/structure/table/reinforced, -/obj/item/paper/fluff/stations/centcom/disk_memo{ - pixel_x = -6; - pixel_y = -7 +"vn" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 }, -/obj/item/taperecorder{ - pixel_y = 15 - }, -/obj/item/stack/spacecash/c50, -/turf/open/floor/carpet, +/turf/open/floor/iron/dark/textured_large, /area/centcom/syndicate_mothership/control) -"vx" = ( -/obj/machinery/door/airlock/external/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 +"vB" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 1 }, -/obj/structure/fans/tiny, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, -/turf/open/floor/plating, +/turf/open/floor/iron/dark/textured_large, /area/centcom/syndicate_mothership/control) "vI" = ( /obj/structure/railing, @@ -2038,16 +2018,6 @@ /obj/structure/filingcabinet/medical, /turf/open/floor/carpet, /area/centcom/syndicate_mothership/control) -"wc" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) -"we" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 5 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/centcom/syndicate_mothership/control) "wg" = ( /obj/structure/fence/corner{ dir = 6 @@ -2077,6 +2047,16 @@ }, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) +"ww" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/catwalk_floor/iron_dark, +/area/centcom/syndicate_mothership/control) "wC" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -2084,6 +2064,15 @@ /obj/structure/sign/poster/contraband/rebels_unite/directional/south, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) +"wD" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/obj/machinery/camera/autoname/directional/north{ + network = list("nukie") + }, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "wG" = ( /turf/open/floor/iron/smooth_half{ dir = 1 @@ -2112,10 +2101,6 @@ dir = 8 }, /area/centcom/syndicate_mothership/control) -"wS" = ( -/obj/effect/landmark/nukeop_elevator/exterior, -/turf/closed/indestructible/syndicate, -/area/centcom/syndicate_mothership/control) "wW" = ( /obj/structure/flora/rock/pile/style_random, /obj/effect/light_emitter{ @@ -2124,6 +2109,10 @@ }, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) +"wX" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark/corner, +/turf/open/floor/iron/smooth_half, +/area/centcom/syndicate_mothership/control) "wY" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ desc = "Has a valve and pump attached to it. Slightly more menacing than Nanotrasen's standard."; @@ -2150,11 +2139,18 @@ /obj/effect/turf_decal/siding/thinplating_new/dark/corner, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bioterrorism) -"xj" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/turf/open/floor/mineral/titanium, +"xt" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/structure/fans/tiny, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/door/poddoor/shutters/syndicate{ + dir = 1 + }, +/turf/open/floor/iron, /area/centcom/syndicate_mothership/control) "xu" = ( /turf/closed/indestructible/syndicate, @@ -2177,6 +2173,12 @@ "ya" = ( /turf/open/floor/carpet, /area/centcom/syndicate_mothership/control) +"yb" = ( +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "ye" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 10 @@ -2260,6 +2262,10 @@ /obj/structure/chair/office, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"zl" = ( +/obj/machinery/light/small/red/directional/west, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "zo" = ( /obj/item/stack/sheet/mineral/sandbags, /turf/open/floor/catwalk_floor/iron_dark, @@ -2290,11 +2296,14 @@ }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) -"zH" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark, -/obj/item/kirbyplants/random, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) +"zI" = ( +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/obj/structure/flora/tree/dead/style_random, +/turf/closed/indestructible/rock/snow, +/area/centcom/syndicate_mothership) "zL" = ( /obj/structure/rack, /obj/item/restraints/handcuffs/cable/pink, @@ -2395,6 +2404,10 @@ }, /turf/open/floor/plating, /area/centcom/syndicate_mothership/expansion_bombthreat) +"AE" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/turf/open/floor/iron/smooth_half, +/area/centcom/syndicate_mothership/control) "AL" = ( /obj/machinery/light/cold/directional/south, /turf/open/floor/iron/smooth_half{ @@ -2404,29 +2417,6 @@ "AM" = ( /turf/closed/indestructible/iron, /area/centcom/syndicate_mothership/control) -"AN" = ( -/obj/structure/table/reinforced/plastitaniumglass, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 1 - }, -/obj/structure/fans/tiny, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/machinery/door/poddoor/shutters/syndicate{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) -"AO" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/siding/red/corner{ - dir = 4 - }, -/obj/item/stack/spacecash/c1{ - pixel_y = 12 - }, -/turf/open/floor/iron/dark/textured_large, -/area/centcom/syndicate_mothership/control) "AR" = ( /obj/effect/baseturf_helper/asteroid/snow, /turf/closed/indestructible/syndicate, @@ -2436,16 +2426,6 @@ /obj/structure/flora/grass/both/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) -"AV" = ( -/obj/structure/chair/stool/directional/south, -/obj/structure/sign/map/left{ - desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; - icon_state = "map-left-MS"; - pixel_y = 32 - }, -/obj/effect/landmark/start/nukeop_base, -/turf/open/floor/wood/tile, -/area/centcom/syndicate_mothership/control) "AW" = ( /obj/machinery/chem_master, /turf/open/floor/mineral/titanium/tiled/yellow, @@ -2577,6 +2557,17 @@ }, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) +"Cn" = ( +/obj/structure/chair/sofa/bench{ + dir = 4 + }, +/obj/machinery/light/cold/directional/west, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/catwalk_floor/iron_dark, +/area/centcom/syndicate_mothership/control) "Ct" = ( /obj/machinery/door/airlock/hatch{ name = "Closet" @@ -2631,6 +2622,15 @@ }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) +"CW" = ( +/obj/effect/turf_decal/siding/red{ + dir = 4 + }, +/obj/item/paper_bin, +/obj/item/pen, +/obj/structure/table/reinforced/plastitaniumglass, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "CX" = ( /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership) @@ -2648,6 +2648,16 @@ /obj/structure/sign/poster/contraband/gorlex_recruitment/directional/west, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) +"Dt" = ( +/obj/effect/turf_decal/siding/red/corner{ + dir = 4 + }, +/obj/item/stack/spacecash/c1{ + pixel_y = 12 + }, +/obj/structure/table/reinforced/plastitaniumglass, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "Du" = ( /obj/docking_port/stationary{ area_type = /area/centcom/syndicate_mothership; @@ -2685,6 +2695,10 @@ }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) +"DQ" = ( +/obj/effect/landmark/nukeop_elevator/exterior, +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/control) "DV" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -2729,13 +2743,6 @@ "DZ" = ( /turf/closed/indestructible/syndicate, /area/centcom/syndicate_mothership/control) -"Ed" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 4 - }, -/obj/structure/sign/poster/contraband/smoke/directional/north, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) "Ef" = ( /obj/structure/fence, /turf/open/misc/asteroid/snow/airless, @@ -2799,23 +2806,16 @@ /obj/effect/turf_decal/siding/purple, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) -"Fm" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/siding/red/corner{ - dir = 8 +"Fl" = ( +/obj/structure/chair/stool/directional/west, +/obj/effect/landmark/start/nukeop_base, +/turf/open/floor/wood/tile, +/area/centcom/syndicate_mothership/control) +"Fo" = ( +/obj/machinery/light/small/red/directional/north{ + allow_break_on_init = 0 }, -/obj/item/folder/red, -/obj/item/pen/red, -/turf/open/floor/iron/dark/textured_large, -/area/centcom/syndicate_mothership/control) -"Fp" = ( -/obj/machinery/vending/cigarette/syndicate, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) -"Fq" = ( -/obj/structure/table/reinforced, -/obj/item/flashlight/lamp, -/turf/open/floor/carpet, +/turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) "FB" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -2826,6 +2826,25 @@ }, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_bombthreat) +"FC" = ( +/obj/item/paper/fluff/stations/centcom/disk_memo{ + pixel_x = -6; + pixel_y = -7 + }, +/obj/item/taperecorder{ + pixel_y = 15 + }, +/obj/item/stack/spacecash/c50, +/obj/structure/table/reinforced/plastitaniumglass, +/turf/open/floor/carpet, +/area/centcom/syndicate_mothership/control) +"FE" = ( +/obj/item/syndicatedetonator{ + desc = "This gaudy button can be used to instantly detonate syndicate bombs that have been activated on the station. It is also fun to press." + }, +/obj/structure/table/reinforced/plastitaniumglass, +/turf/open/floor/carpet, +/area/centcom/syndicate_mothership/control) "FG" = ( /obj/effect/turf_decal/stripes/corner, /obj/effect/turf_decal/stripes/corner{ @@ -2847,6 +2866,12 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /turf/closed/indestructible/syndicate, /area/centcom/syndicate_mothership/expansion_bioterrorism) +"FQ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "FR" = ( /obj/machinery/light/floor, /turf/open/floor/iron/dark/textured_half{ @@ -2991,17 +3016,6 @@ dir = 8 }, /area/centcom/syndicate_mothership/control) -"GI" = ( -/obj/structure/chair/sofa/bench{ - dir = 4 - }, -/obj/machinery/light/cold/directional/west, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/catwalk_floor/titanium, -/area/centcom/syndicate_mothership/control) "GL" = ( /obj/structure/lattice/catwalk, /obj/effect/turf_decal/stripes/line{ @@ -3057,10 +3071,6 @@ }, /turf/open/misc/ice/icemoon, /area/centcom/syndicate_mothership/control) -"Hs" = ( -/obj/machinery/shuttle_manipulator, -/turf/open/floor/circuit/red, -/area/centcom/syndicate_mothership/control) "Ht" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -3114,12 +3124,26 @@ /obj/item/stack/sheet/mineral/plasma, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bioterrorism) +"HE" = ( +/obj/effect/landmark/start/nukeop_base/leader, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "HJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) +"HN" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/turf/open/floor/iron/white/textured_large{ + color = "#b51026" + }, +/area/centcom/syndicate_mothership/control) "HW" = ( /obj/effect/light_emitter{ set_cap = 1; @@ -3140,6 +3164,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, /turf/open/floor/catwalk_floor/iron_dark, /area/centcom/syndicate_mothership/control) +"Ic" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/door/airlock/hatch{ + name = "Security Checkpoint" + }, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "Id" = ( /obj/structure/closet/crate/freezer{ name = "meat freezer" @@ -3204,6 +3239,11 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"IA" = ( +/obj/item/flashlight/lamp, +/obj/structure/table/reinforced/plastitaniumglass, +/turf/open/floor/carpet, +/area/centcom/syndicate_mothership/control) "IC" = ( /obj/structure/chair/stool/bar/directional/west, /obj/effect/turf_decal/siding/thinplating/dark{ @@ -3212,41 +3252,12 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) -"IL" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/siding/red, -/obj/item/toy/nuke{ - pixel_x = -5; - pixel_y = 1 - }, -/turf/open/floor/iron/dark/textured_large, -/area/centcom/syndicate_mothership/control) -"IM" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating_new/dark, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) "IQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) -"IV" = ( -/obj/structure/chair/stool/directional/south, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 1 - }, -/turf/open/floor/iron/dark/textured_large, -/area/centcom/syndicate_mothership/control) -"Ja" = ( -/obj/machinery/light/small/red/directional/north{ - allow_break_on_init = 0 - }, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/control) "Jc" = ( /obj/structure/table/wood, /obj/machinery/chem_dispenser/drinks/beer{ @@ -3282,6 +3293,10 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bioterrorism) +"Jr" = ( +/obj/effect/turf_decal/stripes/full, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "Js" = ( /obj/structure/table/wood, /obj/item/rag, @@ -3298,6 +3313,19 @@ }, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_bombthreat) +"JE" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 9 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/control) +"JG" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red/full, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "JJ" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 5 @@ -3341,6 +3369,13 @@ /obj/effect/turf_decal/syndicateemblem/top/left, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/control) +"JY" = ( +/obj/effect/turf_decal/siding/red/corner, +/obj/effect/turf_decal/tile/red/half{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "Ka" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -3361,6 +3396,12 @@ /obj/structure/flora/grass/both/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"KB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/iron/smooth_large, +/area/centcom/syndicate_mothership/control) "KD" = ( /obj/effect/turf_decal/trimline/red, /obj/effect/turf_decal/trimline/red, @@ -3410,6 +3451,14 @@ }, /turf/open/lava/plasma/ice_moon, /area/centcom/syndicate_mothership/control) +"KT" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/machinery/mech_bay_recharge_port, +/obj/machinery/light/red/dim/directional/south, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "KU" = ( /obj/effect/light_emitter{ set_cap = 1; @@ -3426,18 +3475,24 @@ }, /turf/open/floor/iron/smooth_half, /area/centcom/syndicate_mothership/control) +"KX" = ( +/obj/effect/turf_decal/siding/red{ + dir = 8 + }, +/obj/structure/table/reinforced/plastitaniumglass, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "Ld" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/structure/closet/syndicate/personal, /obj/effect/turf_decal/tile/red/full, /turf/open/floor/iron/dark/textured_half, /area/centcom/syndicate_mothership/control) -"Lk" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/siding/red{ - dir = 8 +"Le" = ( +/obj/structure/chair/comfy/black{ + dir = 4 }, -/obj/item/storage/fancy/donut_box, +/obj/effect/turf_decal/tile/red/full, /turf/open/floor/iron/dark/textured_large, /area/centcom/syndicate_mothership/control) "Lu" = ( @@ -3473,15 +3528,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, /turf/open/floor/stone, /area/centcom/syndicate_mothership/control) -"LB" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/siding/red{ - dir = 1 - }, -/obj/item/folder/red, -/obj/item/pen/red, -/turf/open/floor/iron/dark/textured_large, -/area/centcom/syndicate_mothership/control) "LH" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/binary/pump/on, @@ -3530,13 +3576,6 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/centcom/syndicate_mothership/control) -"Me" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/catwalk_floor/titanium, -/area/centcom/syndicate_mothership/control) "Mh" = ( /obj/structure/sign/poster/contraband/lamarr/directional/south, /turf/open/floor/iron/smooth_half{ @@ -3608,6 +3647,12 @@ /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/catwalk_floor/iron, /area/centcom/syndicate_mothership/control) +"MF" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "MH" = ( /obj/machinery/hydroponics/constructable, /obj/machinery/light/cold/directional/west, @@ -3632,14 +3677,6 @@ dir = 8 }, /area/centcom/syndicate_mothership/control) -"MU" = ( -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 8 - }, -/obj/structure/chair/stool/directional/east, -/obj/effect/landmark/start/nukeop_base, -/turf/open/floor/wood/tile, -/area/centcom/syndicate_mothership/control) "Nb" = ( /obj/structure/chair/sofa/right/brown{ dir = 4 @@ -3653,6 +3690,13 @@ name = "Tac-Com" }, /area/centcom/syndicate_mothership/control) +"Ne" = ( +/obj/effect/turf_decal/siding/red/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/half, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "Ni" = ( /obj/machinery/light/small/directional/north, /obj/machinery/computer/slot_machine/syndicate, @@ -3734,6 +3778,13 @@ /obj/item/melee/powerfist, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bombthreat) +"Og" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "Oi" = ( /obj/structure/cable, /turf/closed/indestructible/syndicate, @@ -3858,6 +3909,24 @@ "Ph" = ( /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bioterrorism) +"Pp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/turf/open/floor/iron/smooth_large, +/area/centcom/syndicate_mothership/control) +"Ps" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor/shutters/syndicate{ + id = "FBBZ1"; + name = "Security Shutters"; + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "Pu" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -4057,6 +4126,13 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron, /area/centcom/syndicate_mothership/control) +"Re" = ( +/obj/effect/turf_decal/siding/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red/half, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "Rn" = ( /obj/item/circuitboard/computer/syndicate_shuttle{ pixel_x = 2; @@ -4132,6 +4208,14 @@ /obj/effect/baseturf_helper/asteroid/snow, /turf/closed/indestructible/syndicate, /area/centcom/syndicate_mothership/expansion_bioterrorism) +"RV" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/structure/chair/stool/directional/east, +/obj/effect/landmark/start/nukeop_base, +/turf/open/floor/wood/tile, +/area/centcom/syndicate_mothership/control) "Sc" = ( /obj/structure/railing, /turf/open/floor/iron/stairs/old{ @@ -4139,18 +4223,6 @@ initial_gas_mix = "TEMP=2.7" }, /area/centcom/syndicate_mothership) -"Se" = ( -/obj/machinery/door/airlock/external/ruin, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, -/turf/open/floor/plating, -/area/centcom/syndicate_mothership/control) "Sg" = ( /obj/machinery/camera/autoname/directional/east{ network = list("nukie") @@ -4210,6 +4282,11 @@ /obj/item/mop, /turf/open/floor/catwalk_floor/iron_smooth, /area/centcom/syndicate_mothership/control) +"Sz" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/structure/sign/poster/contraband/cybersun_six_hundred/directional/east, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "SD" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -4217,6 +4294,12 @@ /obj/machinery/portable_atmospherics/pump, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bombthreat) +"SH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/closed/indestructible/opsglass, +/area/centcom/syndicate_mothership/control) "SJ" = ( /obj/machinery/atmospherics/components/trinary/filter{ dir = 8 @@ -4242,6 +4325,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, /turf/closed/indestructible/opsglass, /area/centcom/syndicate_mothership/control) +"SN" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 6 + }, +/turf/open/floor/iron/smooth_half, +/area/centcom/syndicate_mothership/control) "SR" = ( /obj/structure/railing, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, @@ -4352,12 +4441,6 @@ }, /turf/open/floor/wood/tile, /area/centcom/syndicate_mothership/control) -"TH" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 10 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/centcom/syndicate_mothership/control) "TK" = ( /obj/structure/barricade/sandbags, /obj/effect/light_emitter{ @@ -4405,6 +4488,12 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/control) +"Uc" = ( +/obj/effect/turf_decal/tile/red/anticorner{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "Um" = ( /obj/machinery/button/door/directional/south{ id = "syn_ordmix_vent"; @@ -4457,10 +4546,28 @@ }, /turf/open/floor/plating/icemoon, /area/centcom/syndicate_mothership/control) +"UC" = ( +/obj/structure/chair/greyscale{ + dir = 4 + }, +/obj/effect/landmark/start/nukeop_base/overwatch, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership) "UE" = ( /obj/machinery/light/cold/directional/east, /turf/open/floor/plating, /area/centcom/syndicate_mothership/control) +"UH" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/machinery/door/airlock/hatch{ + name = "Gangway" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "Va" = ( /obj/effect/turf_decal/syndicateemblem/middle/left{ dir = 8 @@ -4481,6 +4588,13 @@ /obj/structure/flora/rock/pile/style_random, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) +"Vq" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 8 + }, +/obj/structure/sign/poster/contraband/syndicate_pistol/directional/north, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "Vr" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 5 @@ -4545,12 +4659,15 @@ /obj/item/stack/sheet/mineral/silver/fifty, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) -"Wc" = ( -/obj/machinery/vending/coffee, +"Wb" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 4 }, -/turf/open/floor/mineral/titanium, +/turf/open/floor/catwalk_floor/iron_dark, /area/centcom/syndicate_mothership/control) "Wo" = ( /obj/effect/light_emitter{ @@ -4562,16 +4679,6 @@ "Wp" = ( /turf/open/floor/iron/smooth, /area/centcom/syndicate_mothership/control) -"Wr" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/catwalk_floor/titanium, -/area/centcom/syndicate_mothership/control) "Ws" = ( /obj/structure/flora/tree/pine/style_random, /obj/effect/light_emitter{ @@ -4580,9 +4687,16 @@ }, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) -"Wu" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron/dark/textured_large, +"Wt" = ( +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/machinery/door/airlock/hatch{ + name = "Security Checkpoint" + }, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "Wz" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -4609,25 +4723,18 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/centcom/syndicate_mothership/control) -"WG" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 8 +"WD" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 5 }, -/obj/structure/sign/poster/contraband/syndicate_pistol/directional/north, -/turf/open/floor/mineral/titanium, +/turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/control) "WI" = ( /obj/structure/sign/poster/contraband/revolver/directional/south, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) -"WR" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/siding/red{ - dir = 4 - }, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/iron/dark/textured_large, +"WQ" = ( +/turf/open/floor/circuit/red/no_power, /area/centcom/syndicate_mothership/control) "WS" = ( /obj/structure/sign/poster/contraband/energy_swords/directional/north, @@ -4652,22 +4759,9 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_dark, /area/centcom/syndicate_mothership/control) -"Xj" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/siding/red{ - dir = 1 - }, -/obj/machinery/recharger, -/turf/open/floor/iron/dark/textured_large, -/area/centcom/syndicate_mothership/control) "Xk" = ( /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership) -"Xu" = ( -/obj/structure/chair/stool/directional/west, -/obj/effect/landmark/start/nukeop_base, -/turf/open/floor/wood/tile, -/area/centcom/syndicate_mothership/control) "Xv" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -4748,12 +4842,6 @@ dir = 1 }, /area/centcom/syndicate_mothership/control) -"XZ" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 9 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/centcom/syndicate_mothership/control) "Yd" = ( /obj/machinery/camera/autoname/directional/south{ network = list("nukie") @@ -4795,6 +4883,15 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_smooth, /area/centcom/syndicate_mothership/control) +"YM" = ( +/obj/effect/turf_decal/siding/red, +/obj/item/toy/nuke{ + pixel_x = -5; + pixel_y = 1 + }, +/obj/structure/table/reinforced/plastitaniumglass, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "YO" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 8 @@ -6512,7 +6609,7 @@ HW wW Kq sv -pS +UC fV Kq CX @@ -6939,7 +7036,7 @@ Pc ZZ DZ gE -my +HE uX Jc ek @@ -7552,7 +7649,7 @@ bF DZ al Gd -MU +RV YO DZ tL @@ -7652,7 +7749,7 @@ VK BD sO DZ -AV +jd mK er TS @@ -7757,7 +7854,7 @@ DZ OS TG jT -du +nV DZ Dy Wp @@ -7857,7 +7954,7 @@ VK GE DZ Ni -Xu +Fl mL BH DZ @@ -9382,16 +9479,16 @@ bW qw nw MP -ng +Ps DZ VK VK VK VK DZ -Ed -GI -IM +om +Cn +Og wG wG Te @@ -9484,16 +9581,16 @@ bW qw qw qw -ng +Ps hb TC FR TC TC hb -ZZ -Me -wc +qN +ux +ov wG AL DZ @@ -9586,20 +9683,20 @@ bW qw qw qw -ng +Ps qJ TC TC FR TC qJ -ZZ -Me -wc +qN +ux +ov wG wG DZ -Ja +Fo Ov DZ DZ @@ -9695,14 +9792,14 @@ Xv KE VK DZ -WG -ij -zH +Vq +ww +OF wG wG -ru -XZ -TH +qR +JE +oA Ov DZ Ox @@ -9797,14 +9894,14 @@ so uX zL DZ -fb -Wr -zH +wD +gu +OF wG wG -ru -we -rw +qR +WD +iU Ov DZ Ox @@ -9892,20 +9989,20 @@ bW qw qw qw -AN +xt uX uX uX uX uX RA -ZZ -Me -wc +qN +ux +ov wG lE DZ -Ja +Fo Ov DZ DZ @@ -9994,19 +10091,19 @@ bW qw qw qw -AN +xt LS Mn uX ZH LN DZ -Fp -go -as +nG +cY +Sz wG wG -wS +DQ DZ DZ DZ @@ -10106,12 +10203,11 @@ DZ DZ qp DZ -gB -gB -DZ -mz -Wc +NY +NY DZ +cC +HN DZ DZ DZ @@ -10119,6 +10215,7 @@ DZ DZ VK VK +VK Ov DZ XC @@ -10208,20 +10305,20 @@ DZ pK pg VK -ZZ -ZZ -dn +wX +SN +ih qN qN -qN -Wu -ov -or +zl +fU +UH zE sl Ov Ov Ov +Ov DZ Ox Ox @@ -10310,14 +10407,14 @@ DZ CM FN VK -ZZ -ZZ -IV -tv -WR -AO -iV -ov +AE +vB +vn +Le +Le +Le +mC +DZ DZ DZ DZ @@ -10412,14 +10509,13 @@ DZ DZ eg tL -bp -ZZ -IV -IL -Hs -Xj -iV -ov +cW +yb +qN +aS +CW +Dt +mC Cg DZ Ox @@ -10428,6 +10524,7 @@ Ox Ox Ox Ox +Ox sq Ox sU @@ -10511,20 +10608,20 @@ Ld ol zo VK -ZZ -ZZ -Me -ZZ -ZZ -IV -rb -au -LB -iV -ov -ah +qN +qN +ux +AE +yb +qN +YM +nI +oU +mC +KT DZ Ox +Ox sq sq Ox @@ -10613,18 +10710,17 @@ Tc Ib Ib en -xj -xj -Me -ZZ -ZZ -IV -Fm -Lk -tu -iV -ov -nD +Pp +Pp +KB +AE +yb +qN +eM +WQ +oH +mC +Jr DZ Ox Ox @@ -10633,6 +10729,7 @@ Ox Ox Ox Ox +Ox sU sU sU @@ -10715,21 +10812,21 @@ Ld XL RQ VK -ZZ -ZZ -Me -ZZ -ZZ -il -dV -dV -dV -lc -lo +MF +MF +Wb +AE +yb +qN +kf +KX +iz +mC ec DZ DZ Ox +Ox sU sU sU @@ -10817,21 +10914,21 @@ DZ DZ DZ DZ -DZ VK -Se -VK -ZZ -pr -oh -vv -Fq -oD -ov +Wt +SH +cW +Uc +FQ +JG +JG +JG +mC Nd gf DZ Ox +Ox sU sU sU @@ -10919,21 +11016,21 @@ DZ tJ HW HW -Zt VK qw VK -qv -pr -ya -PF -ya -oD -OF +rO +fr +JY +dV +dV +dV +Ne DZ DZ DZ Ox +Ox sU sU sU @@ -11021,21 +11118,21 @@ QM HW HW lj -HW VK qw VK DZ -VK -wb -wq -dw -VK -DZ +bS +fP +FE +FC +IA +uY DZ Ox Ox Ox +Ox sU sU sU @@ -11123,20 +11220,20 @@ HW HW HW HW -tJ VK Hv VK -Ho -VK -VK -VK -VK -VK -Zt -KU +uT +bS +pp +ya +PF +ya +Re +DZ Ye uT +Ox Ye sU sU @@ -11225,20 +11322,20 @@ nz Zt HW HW -HW VK qw VK -HW -QM -HW -Zt -HW -HW -lj -KU +uT +DZ +VK +wb +wq +dB +VK +DZ Ye uT +Ox Ye sU sU @@ -11327,18 +11424,18 @@ HW HW HW QM -Zt VK qw VK +uT Zt +VK +VK +VK +VK +VK HW -HW -HW -tJ -HW -HW -KU +zI KU Ye Ye @@ -11429,10 +11526,10 @@ uT uT uT uT -HW VK -vx +Ic VK +uT HW tJ HW @@ -11532,11 +11629,11 @@ uT uT uT uT -uT Du uT uT uT +uT HW QM HW diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index bed1a6b24ac..1b71b003872 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -169,6 +169,19 @@ #define HUD_XENOBIO_CONSOLE "xenobio_console" +#define HUD_TAC_MINIMAP "tac_minimap" +#define HUD_TAC_MINIMAP_DIMMER "tac_minimap_dimmer" +#define HUD_TAC_MINIMAP_Z_INDICATOR "tac_minimap_z_indicator" +#define HUD_TAC_MINIMAP_Z_INDICATOR_UP "tac_minimap_z_up" +#define HUD_TAC_MINIMAP_Z_INDICATOR_DOWN "tac_minimap_z_down" +#define HUD_TAC_MINIMAP_TOOL_RED "tac_minimap_tool_red" +#define HUD_TAC_MINIMAP_TOOL_YELLOW "tac_minimap_tool_yellow" +#define HUD_TAC_MINIMAP_TOOL_PURPLE "tac_minimap_tool_purple" +#define HUD_TAC_MINIMAP_TOOL_BLUE "tac_minimap_tool_blue" +#define HUD_TAC_MINIMAP_TOOL_ERASE "tac_minimap_tool_erase" +#define HUD_TAC_MINIMAP_TOOL_LABEL "tac_minimap_tool_label" +#define HUD_TAC_MINIMAP_TOOL_CLEAR "tac_minimap_tool_clear" + /* These defines specificy screen locations. For more information, see the byond documentation on the screen_loc var. diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 6bc5b96e0e0..4d7a26858a2 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -313,6 +313,10 @@ #define CURSE_LAYER 6 #define ECHO_LAYER 7 #define PARRY_LAYER 8 +#define MINIMAP_IMAGE_LAYER 9 +#define MINIMAP_BLIPS_LAYER 10 +#define MINIMAP_LOCATOR_LAYER 11 +#define MINIMAP_LABELS_LAYER 12 #define FOV_EFFECT_LAYER 100 diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index 7feed196c75..449a0f7f5f4 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -144,6 +144,7 @@ #define LOG_CATEGORY_GAME_ACCESS "game-access" #define LOG_CATEGORY_GAME_BLOOD_WORM "game-blood-worm" #define LOG_CATEGORY_GAME_EMOTE "game-emote" +#define LOG_CATEGORY_GAME_MINIMAP_DRAWING "game-minimap-drawing" #define LOG_CATEGORY_GAME_INTERNET_REQUEST "game-internet-request" #define LOG_CATEGORY_GAME_OOC "game-ooc" #define LOG_CATEGORY_GAME_PRAYER "game-prayer" diff --git a/code/__DEFINES/minimap.dm b/code/__DEFINES/minimap.dm new file mode 100644 index 00000000000..05629ef5d0b --- /dev/null +++ b/code/__DEFINES/minimap.dm @@ -0,0 +1,62 @@ +///Converts the overworld x and y to minimap x and y values +#define MINIMAP_PIXEL_FROM_WORLD(val) (val*2-3) + +//actual size of a users screen in pixels +#define SCREEN_PIXEL_SIZE 480 + +//Drawing tool colors +#define TACMAP_DRAWING_RED "#ff0000" +#define TACMAP_DRAWING_YELLOW "#FFFF00" +#define TACMAP_DRAWING_PURPLE "#A020F0" +#define TACMAP_DRAWING_BLUE "#0000FF" + + +//Turf colours +#define TACMAP_BLACK "#111111d0" +#define TACMAP_SOLID "#ebe5e5ee" +#define TACMAP_DOOR "#451e5eee" +#define TACMAP_WINDOW "#525252d0" +#define TACMAP_FENCE "#8c2294ee" +#define TACMAP_LAVA "#db4206d0" +#define TACMAP_DIRT "#9c906dd0" +#define TACMAP_SHALE "#706955d0" +#define TACMAP_SNOW "#c4e3e9d0" +#define TACMAP_MARS_DIRT "#aa5f44d0" +#define TACMAP_ICE "#93cae0d0" +#define TACMAP_WATER "#94b0d59c" //lower opacity as its really bright + +//Area colours +//Departments +#define TACMAP_AREA_COMMAND COLOR_COMMAND_BLUE +#define TACMAP_AREA_CARGO COLOR_CARGO_BROWN +#define TACMAP_AREA_ENGINEERING COLOR_ENGINEERING_ORANGE +#define TACMAP_AREA_MEDICAL COLOR_MEDICAL_BLUE +#define TACMAP_AREA_SCIENCE COLOR_SCIENCE_PINK +#define TACMAP_AREA_SECURITY COLOR_SECURITY_RED +#define TACMAP_AREA_SERVICE COLOR_SERVICE_LIME +//General +#define TACMAP_AREA_MAINTENANCE COLOR_WEBSAFE_DARK_GRAY + +/// How much we multiply the drawn image by, and as a result the pixel coordinates +#define MINIMAP_PIXEL_MULTIPLIER 2 +/// Converts an icon pixel coordinate (from ICON_X/ICON_Y modifiers) to a world tile coordinate. +#define MINIMAP_ICON_TO_WORLD(icon_coord, minimap_min) ((minimap_min) + floor(((icon_coord) - 1) / MINIMAP_PIXEL_MULTIPLIER)) +/// Converts a world tile coordinate to a pixel_w/pixel_z offset for placing a blip on the minimap display. +#define MINIMAP_WORLD_TO_PIXEL(world_coord, minimap_min, half_size) (((world_coord) - (minimap_min)) * MINIMAP_PIXEL_MULTIPLIER + 1 - (half_size)) +#define COMSIG_MINIMAP_ADD(blip_tag) "minimap_add_" + blip_tag +#define COMSIG_MINIMAP_REMOVE(blip_tag) "minimap_remove_" + blip_tag +// sends a index of how much to change by +#define COMSIG_MINIMAP_CHANGE_Z_LEVEL "minimap_z_change" +#define COMSIG_MINIMAP_ACTION_TRIGGER "minimap_action_trigger" + #define COMSIG_MINIMAP_ACTION_TRIGGER_CANCEL (1<<0) + + +#define MINIMAP_BOMB_BLIP "nuke" +#define MINIMAP_NUKEDISK_BLIP "nuke_disk" +#define MINIMAP_NUKEOP_BLIP "nukeop" +#define MINIMAP_NUKEOP_BORG_BLIP "nukeop_borg" +#define MINIMAP_SYNDICATE_MECH_BLIP "syndicate_mech" +#define MINIMAP_SYNDIE_TURRET_BLIP "syndie_turret" +#define MINIMAP_LADDER_BLIP "ladder" +#define MINIMAP_STAIR_BLIP "stair" +#define MINIMAP_ANNOTATION_TAG_NUCLEAR "nuclear_ops" diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 317b17c2d7e..59b12502d1c 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -501,6 +501,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_CLIFF_WALKER "cliff_walker" /// This means the user is currently holding/wearing a "tactical camouflage" item (like a potted plant). #define TRAIT_TACTICALLY_CAMOUFLAGED "tactically_camouflaged" +/// This means the user is allowed to draw on minimap holotables. +#define TRAIT_MINIMAP_TABLE_DRAW "minimap_table_draw" /// Gets double arcade prizes #define TRAIT_GAMERGOD "gamer-god" #define TRAIT_GIANT "giant" diff --git a/code/__HELPERS/logging/game.dm b/code/__HELPERS/logging/game.dm index 0affd00228b..52c1a2254f3 100644 --- a/code/__HELPERS/logging/game.dm +++ b/code/__HELPERS/logging/game.dm @@ -32,3 +32,7 @@ /proc/log_ghost_poll(text, list/data) logger.Log(LOG_CATEGORY_GAME_GHOST_POLLS, text, data) + +/// Logging for drawing on minimap +/proc/log_minimap_drawing(text, list/data) + logger.Log(LOG_CATEGORY_GAME_MINIMAP_DRAWING, text, data) diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index ccb1945a924..fcd5753f613 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -320,6 +320,15 @@ GLOBAL_LIST_INIT(modulo_angle_to_dir, list(NORTH,NORTHEAST,EAST,SOUTHEAST,SOUTH, if(var_source.vars.Find(A)) . += A +/// Converts a screen loc param to a x,y coordinate pixel on the screen. +/proc/params2screenpixel(scr_loc) + var/list/x_and_y = splittext(scr_loc, ",") + var/list/x_dirty = splittext(x_and_y[1], ":") + var/list/y_dirty = splittext(x_and_y[2], ":") + var/x = (text2num(x_dirty[1]) - 1) * ICON_SIZE_X + text2num(x_dirty[2]) + var/y = (text2num(y_dirty[1]) - 1) * ICON_SIZE_Y + text2num(y_dirty[2]) + return list(x, y) + //word of warning: using a matrix like this as a color value will simplify it back to a string after being set /proc/color_hex2color_matrix(string) var/length = length(string) diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 24127005b6e..61a0255dfaa 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -651,6 +651,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_XRAY_VISION" = TRAIT_XRAY_VISION, "TRAIT_NOGRAV_ALWAYS_DRIFT" = TRAIT_NOGRAV_ALWAYS_DRIFT, "TRAIT_SPEECH_BOOSTER" = TRAIT_SPEECH_BOOSTER, + "TRAIT_MINIMAP_TABLE_DRAW" = TRAIT_MINIMAP_TABLE_DRAW, "TRAIT_MINING_PARRYING" = TRAIT_MINING_PARRYING, "TRAIT_MINING_AOE_IMMUNE" = TRAIT_MINING_AOE_IMMUNE, "TRAIT_IGNORE_FIRE_PROTECTION" = TRAIT_IGNORE_FIRE_PROTECTION, diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index ee1aa3633d1..d25020206da 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -354,6 +354,13 @@ /mob/proc/RangedAttack(atom/A, modifiers) if(SEND_SIGNAL(src, COMSIG_MOB_ATTACK_RANGED, A, modifiers) & COMPONENT_CANCEL_ATTACK_CHAIN) return TRUE + A.RangedAttackOn(src, modifiers) + +/** + * Atom's version of RangedAttack, for when you want to do something when a mob clicks on this with more sanity than just Click() + */ +/atom/proc/RangedAttackOn(mob/attacker, list/modifiers) + return null /** * Ranged secondary attack diff --git a/code/_onclick/hud/screen_objects/screen_objects.dm b/code/_onclick/hud/screen_objects/screen_objects.dm index 11accd552f5..00341f67188 100644 --- a/code/_onclick/hud/screen_objects/screen_objects.dm +++ b/code/_onclick/hud/screen_objects/screen_objects.dm @@ -94,7 +94,7 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen) // I hate this place RegisterSignal(hud, COMSIG_QDELETING, PROC_REF(on_hud_delete)) /// Returns the mob this is being displayed to, if any -/atom/movable/screen/proc/get_mob() +/atom/movable/screen/proc/get_mob() as /mob return hud?.mymob /atom/movable/screen/proc/on_hud_delete(datum/source) diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 114988a0f86..71516fdd24f 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -101,6 +101,9 @@ /// log game events /datum/config_entry/flag/log_game +/// log minimap drawing events +/datum/config_entry/flag/log_minimap_drawing + /// log mech data /datum/config_entry/flag/log_mecha diff --git a/code/datums/proximity_monitor/proximity_monitor.dm b/code/datums/proximity_monitor/proximity_monitor.dm index ec77ce2145a..f5e63733765 100644 --- a/code/datums/proximity_monitor/proximity_monitor.dm +++ b/code/datums/proximity_monitor/proximity_monitor.dm @@ -74,9 +74,10 @@ //Update the ignore_if_not_on_turf AddComponent(/datum/component/connect_range, host, loc_connections, current_range, ignore_if_not_on_turf) -/datum/proximity_monitor/proc/on_uncrossed() +/datum/proximity_monitor/proc/on_uncrossed(atom/source, atom/movable/gone, direction) //Used by the advanced subtype for effect fields. SIGNAL_HANDLER - return //Used by the advanced subtype for effect fields. + if(source != host) + hasprox_receiver?.OnProximityExit(gone) /datum/proximity_monitor/proc/on_entered(atom/source, atom/movable/arrived, turf/old_loc) SIGNAL_HANDLER diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 87104b8cd47..fd0f586b98d 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -12,6 +12,7 @@ plane = AREA_PLANE mouse_opacity = MOUSE_OPACITY_TRANSPARENT invisibility = INVISIBILITY_LIGHTING + tacmap_color = null /// List of all turfs currently inside this area as nested lists indexed by zlevel. /// Acts as a filtered version of area.contents For faster lookup @@ -137,6 +138,9 @@ /// Are shuttles allowed to dock in this area var/allow_shuttle_docking = FALSE + /// If TRUE, then this area will be skipped entirely by minimap rendering. + var/skip_minimap_rendering = FALSE + /** * A list of teleport locations * diff --git a/code/game/area/areas/away_content.dm b/code/game/area/areas/away_content.dm index 39d7ebce1db..7194a8494e4 100644 --- a/code/game/area/areas/away_content.dm +++ b/code/game/area/areas/away_content.dm @@ -11,6 +11,7 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30" default_gravity = STANDARD_GRAVITY ambience_index = AMBIENCE_AWAY sound_environment = SOUND_ENVIRONMENT_ROOM + skip_minimap_rendering = TRUE /area/awaymission/museum name = "Nanotrasen Museum" diff --git a/code/game/area/areas/mining.dm b/code/game/area/areas/mining.dm index af047a00698..51f05402973 100644 --- a/code/game/area/areas/mining.dm +++ b/code/game/area/areas/mining.dm @@ -196,6 +196,7 @@ sound_environment = SOUND_AREA_ICEMOON ambient_buzz = 'sound/ambience/lavaland/magma.ogg' allow_shuttle_docking = TRUE + skip_minimap_rendering = TRUE /area/icemoon/surface name = "Icemoon" diff --git a/code/game/area/areas/misc.dm b/code/game/area/areas/misc.dm index ac66943d5d1..a922a1e147a 100644 --- a/code/game/area/areas/misc.dm +++ b/code/game/area/areas/misc.dm @@ -17,6 +17,7 @@ sound_environment = SOUND_AREA_SPACE ambient_buzz = null //Space is deafeningly quiet allow_shuttle_docking = TRUE + skip_minimap_rendering = TRUE /area/space/nearstation icon_state = "space_near" diff --git a/code/game/area/areas/ruins/_ruins.dm b/code/game/area/areas/ruins/_ruins.dm index 92fff19386d..f0adbe7eb6b 100644 --- a/code/game/area/areas/ruins/_ruins.dm +++ b/code/game/area/areas/ruins/_ruins.dm @@ -9,6 +9,7 @@ ambience_index = AMBIENCE_RUINS flags_1 = CAN_BE_DIRTY_1 sound_environment = SOUND_ENVIRONMENT_STONEROOM + skip_minimap_rendering = TRUE /area/ruin/unpowered always_unpowered = TRUE diff --git a/code/game/area/areas/station/cargo.dm b/code/game/area/areas/station/cargo.dm index 8e892efda95..430122cc769 100644 --- a/code/game/area/areas/station/cargo.dm +++ b/code/game/area/areas/station/cargo.dm @@ -3,6 +3,7 @@ icon_state = "quart" airlock_wires = /datum/wires/airlock/cargo sound_environment = SOUND_AREA_STANDARD_STATION + tacmap_color = COLOR_CARGO_BROWN /area/station/cargo/sorting name = "\improper Delivery Office" diff --git a/code/game/area/areas/station/command.dm b/code/game/area/areas/station/command.dm index 30f126dc42c..6cc80002aab 100644 --- a/code/game/area/areas/station/command.dm +++ b/code/game/area/areas/station/command.dm @@ -6,6 +6,7 @@ ) airlock_wires = /datum/wires/airlock/command sound_environment = SOUND_AREA_STANDARD_STATION + tacmap_color = TACMAP_AREA_COMMAND /area/station/command/bridge name = "\improper Bridge" diff --git a/code/game/area/areas/station/common.dm b/code/game/area/areas/station/common.dm index 1b6eba4dc25..641c43dfd41 100644 --- a/code/game/area/areas/station/common.dm +++ b/code/game/area/areas/station/common.dm @@ -87,6 +87,7 @@ mood_message = "I love being in the bar!" mood_trait = TRAIT_EXTROVERT sound_environment = SOUND_AREA_SMALL_SOFTFLOOR + tacmap_color = TACMAP_AREA_SERVICE /area/station/commons/fitness name = "\improper Fitness Room" diff --git a/code/game/area/areas/station/engineering.dm b/code/game/area/areas/station/engineering.dm index 3f046445385..04e27d738c4 100644 --- a/code/game/area/areas/station/engineering.dm +++ b/code/game/area/areas/station/engineering.dm @@ -3,6 +3,7 @@ ambience_index = AMBIENCE_ENGI airlock_wires = /datum/wires/airlock/engineering sound_environment = SOUND_AREA_LARGE_ENCLOSED + tacmap_color = TACMAP_AREA_ENGINEERING /area/station/engineering/circuit_workshop name = "\improper Circuit Workshop" @@ -150,6 +151,7 @@ icon_state = "construction" ambience_index = AMBIENCE_ENGI sound_environment = SOUND_AREA_STANDARD_STATION + tacmap_color = TACMAP_AREA_ENGINEERING /area/station/construction/mining/aux_base name = "Auxiliary Base Construction" diff --git a/code/game/area/areas/station/hallway.dm b/code/game/area/areas/station/hallway.dm index 12a5ba6816b..3c82c9b1bee 100644 --- a/code/game/area/areas/station/hallway.dm +++ b/code/game/area/areas/station/hallway.dm @@ -92,6 +92,7 @@ /area/station/hallway/secondary/service name = "\improper Service Hallway" icon_state = "hall_service" + tacmap_color = TACMAP_AREA_SERVICE /area/station/hallway/secondary/spacebridge name = "\improper Space Bridge" diff --git a/code/game/area/areas/station/maintenance.dm b/code/game/area/areas/station/maintenance.dm index a6fa76cd80e..84ce4032eb6 100644 --- a/code/game/area/areas/station/maintenance.dm +++ b/code/game/area/areas/station/maintenance.dm @@ -7,6 +7,7 @@ forced_ambience = TRUE ambient_buzz = 'sound/ambience/maintenance/source_corridor2.ogg' ambient_buzz_vol = 20 + tacmap_color = TACMAP_AREA_MAINTENANCE /* * Departmental Maintenance @@ -248,6 +249,7 @@ /area/station/maintenance/disposal/incinerator name = "\improper Incinerator" icon_state = "incinerator" + tacmap_color = TACMAP_AREA_ENGINEERING /area/station/maintenance/space_hut name = "\improper Space Hut" diff --git a/code/game/area/areas/station/medical.dm b/code/game/area/areas/station/medical.dm index 03bdc8eb5bf..a02e014a0c0 100644 --- a/code/game/area/areas/station/medical.dm +++ b/code/game/area/areas/station/medical.dm @@ -4,6 +4,7 @@ ambience_index = AMBIENCE_MEDICAL airlock_wires = /datum/wires/airlock/medbay sound_environment = SOUND_AREA_STANDARD_STATION + tacmap_color = TACMAP_AREA_MEDICAL /area/station/medical/abandoned name = "\improper Abandoned Medbay" @@ -12,6 +13,7 @@ 'sound/ambience/misc/signal.ogg', ) sound_environment = SOUND_AREA_SMALL_ENCLOSED + tacmap_color = TACMAP_AREA_MAINTENANCE /area/station/medical/medbay/central name = "Medbay Central" diff --git a/code/game/area/areas/station/science.dm b/code/game/area/areas/station/science.dm index b64e7efe75a..9954a500673 100644 --- a/code/game/area/areas/station/science.dm +++ b/code/game/area/areas/station/science.dm @@ -3,6 +3,7 @@ icon_state = "science" airlock_wires = /datum/wires/airlock/science sound_environment = SOUND_AREA_STANDARD_STATION + tacmap_color = TACMAP_AREA_SCIENCE /area/station/science/lobby name = "\improper Science Lobby" @@ -131,6 +132,7 @@ name = "\improper Ordnance Bomb Site" icon_state = "ord_boom" area_flags = BLOBS_ALLOWED | CULT_PERMITTED | NO_GRAVITY + skip_minimap_rendering = TRUE /area/station/science/ordnance/bomb/planet area_flags = /area/station/science/ordnance/bomb::area_flags & ~NO_GRAVITY diff --git a/code/game/area/areas/station/security.dm b/code/game/area/areas/station/security.dm index 3166f7733d9..22d3bb0de85 100644 --- a/code/game/area/areas/station/security.dm +++ b/code/game/area/areas/station/security.dm @@ -6,6 +6,7 @@ ambience_index = AMBIENCE_DANGER airlock_wires = /datum/wires/airlock/security sound_environment = SOUND_AREA_STANDARD_STATION + tacmap_color = TACMAP_AREA_SECURITY /area/station/security/office name = "\improper Security Office" diff --git a/code/game/area/areas/station/service.dm b/code/game/area/areas/station/service.dm index 35540656326..71e9421e3a5 100644 --- a/code/game/area/areas/station/service.dm +++ b/code/game/area/areas/station/service.dm @@ -1,5 +1,6 @@ /area/station/service airlock_wires = /datum/wires/airlock/service + tacmap_color = TACMAP_AREA_SERVICE /* * Bar/Kitchen Areas @@ -199,27 +200,34 @@ name = "\improper Abandoned Garden" icon_state = "abandoned_garden" sound_environment = SOUND_AREA_SMALL_ENCLOSED + tacmap_color = TACMAP_AREA_MAINTENANCE /area/station/service/kitchen/abandoned name = "\improper Abandoned Kitchen" icon_state = "abandoned_kitchen" + tacmap_color = TACMAP_AREA_MAINTENANCE /area/station/service/electronic_marketing_den name = "\improper Electronic Marketing Den" icon_state = "abandoned_marketing_den" + tacmap_color = TACMAP_AREA_MAINTENANCE /area/station/service/abandoned_gambling_den name = "\improper Abandoned Gambling Den" icon_state = "abandoned_gambling_den" + tacmap_color = TACMAP_AREA_MAINTENANCE /area/station/service/abandoned_gambling_den/gaming name = "\improper Abandoned Gaming Den" icon_state = "abandoned_gaming_den" + tacmap_color = TACMAP_AREA_MAINTENANCE /area/station/service/theater/abandoned name = "\improper Abandoned Theater" icon_state = "abandoned_theatre" + tacmap_color = TACMAP_AREA_MAINTENANCE /area/station/service/library/abandoned name = "\improper Abandoned Library" icon_state = "abandoned_library" + tacmap_color = TACMAP_AREA_MAINTENANCE diff --git a/code/game/area/areas/station/solars.dm b/code/game/area/areas/station/solars.dm index 569a7f0a169..d7765c6ee9b 100644 --- a/code/game/area/areas/station/solars.dm +++ b/code/game/area/areas/station/solars.dm @@ -77,6 +77,7 @@ /area/station/maintenance/solars name = "Solar Maintenance" icon_state = "yellow" + tacmap_color = TACMAP_AREA_ENGINEERING /area/station/maintenance/solars/port name = "Port Solar Maintenance" diff --git a/code/game/area/areas/station/telecomm.dm b/code/game/area/areas/station/telecomm.dm index adb4670b44b..46c644acfeb 100644 --- a/code/game/area/areas/station/telecomm.dm +++ b/code/game/area/areas/station/telecomm.dm @@ -15,6 +15,7 @@ 'sound/ambience/misc/ambimystery.ogg', ) airlock_wires = /datum/wires/airlock/engineering + tacmap_color = TACMAP_AREA_ENGINEERING /area/station/tcommsat/maints name = "\improper Telecomms Maintenance Room" diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index ad246f5ff82..d59f478a2db 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -147,6 +147,9 @@ /// Generally for niche objects, atoms blacklisted can spawn if enabled by spawner. var/spawn_blacklisted = FALSE + /// What color this shows up as on the tactical map + var/tacmap_color = TACMAP_SOLID + /** * Top level of the destroy chain for most atoms * @@ -438,6 +441,10 @@ /atom/proc/HasProximity(atom/movable/proximity_check_mob as mob|obj) return +/// has a previously nearby atom moved away +/atom/proc/OnProximityExit(atom/movable/proximity_check_mob as mob|obj) + return + /// Sets the wire datum of an atom /atom/proc/set_wires(datum/wires/new_wires) wires = new_wires diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 57dffa377e5..6bbab50fa79 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -28,6 +28,8 @@ idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.1 active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.2 + tacmap_color = TACMAP_DOOR + /// The animation we're currently playing, if any var/animation var/visible = TRUE diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 801ed06603c..f682219a06b 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -782,6 +782,19 @@ DEFINE_BITFIELD(turret_flags, list( . = ..() AddElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) AddElement(/datum/element/nav_computer_icon, 'icons/effects/nav_computer_indicators.dmi', "turret", FALSE) + add_minimap_blip(src, MINIMAP_SYNDIE_TURRET_BLIP, "sentry_passive") + +/obj/machinery/porta_turret/syndicate/proc/update_turret_minimap_icon(new_icon_state) + var/atom/movable/screen/minimap_element/blip/blip = get_minimap_blip(MINIMAP_SYNDIE_TURRET_BLIP, src) + if(isnull(blip)) + return + blip.icon_state = new_icon_state + +/obj/machinery/porta_turret/syndicate/shootAt(atom/movable/target) + . = ..() + if(raised && (obj_flags & EMAGGED || last_fired == world.time)) + update_turret_minimap_icon("sentry_firing") + addtimer(CALLBACK(src, PROC_REF(update_turret_minimap_icon), "sentry_passive"), shot_delay + 1 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) /obj/machinery/porta_turret/syndicate/setup() return diff --git a/code/game/objects/items/implants/implant_tacmap.dm b/code/game/objects/items/implants/implant_tacmap.dm new file mode 100644 index 00000000000..33ebbe88c08 --- /dev/null +++ b/code/game/objects/items/implants/implant_tacmap.dm @@ -0,0 +1,120 @@ +/obj/item/implant/tacmap + name = "tactical map implant" + desc = "provides you with a map" + actions_types = list(/datum/action/minimap) + var/wearer_icon_state = null + /// Optional z-trait that resolves to the first z-level and locks the minimap there. + var/minimap_fixed_z_trait + /// Whether this implant allows drawing/labeling on the personal minimap HUD. + var/can_draw_on_personal_minimap = FALSE + var/static/list/minimap_refresh_signals = list( + COMSIG_MOB_STATCHANGE, + COMSIG_LIVING_REVIVE, + COMSIG_MOB_GHOSTIZED, + ) + +/obj/item/implant/tacmap/implant(mob/living/target, mob/user, silent, force) + . = ..() + if(.) + configure_minimap_action() + RegisterSignals(target, minimap_refresh_signals, PROC_REF(refresh_minimap_icon)) + addtimer(CALLBACK(src, PROC_REF(update_minimap_icon), target), 0.1 SECONDS) // Mobs are spawned inside nullspace sometimes so this avoids that hijinks. + +/obj/item/implant/tacmap/removed(mob/living/source, silent, special) + UnregisterSignal(source, minimap_refresh_signals) + remove_minimap(source) + return ..() + +///Remove all action of type minimap from the wearer, and make him disappear from the minimap +/obj/item/implant/tacmap/proc/remove_minimap(mob/user) + remove_minimap_blip(MINIMAP_NUKEOP_BLIP, user) + +/obj/item/implant/tacmap/proc/refresh_minimap_icon() + SIGNAL_HANDLER + if(imp_in) + update_minimap_icon(imp_in) + +/obj/item/implant/tacmap/proc/resolve_fixed_minimap_z_level() + if(!isnull(minimap_fixed_z_trait)) + var/list/trait_levels = SSmapping.levels_by_trait(minimap_fixed_z_trait) + if(length(trait_levels)) + return trait_levels[1] + return null + +/obj/item/implant/tacmap/proc/configure_minimap_action() + var/datum/action/minimap/minimap_action = locate(/datum/action/minimap) in actions + if(isnull(minimap_action)) + return + minimap_action.fixed_z_level = resolve_fixed_minimap_z_level() + minimap_action.can_draw = can_draw_on_personal_minimap + +/obj/item/implant/tacmap/proc/get_minimap_icon_state(mob/living/wearer) + return wearer_icon_state + +///Updates the wearer's minimap icon +/obj/item/implant/tacmap/proc/update_minimap_icon(mob/wearer) + SIGNAL_HANDLER + remove_minimap_blip(MINIMAP_NUKEOP_BLIP, wearer) + add_minimap_blip(wearer, MINIMAP_NUKEOP_BLIP, get_minimap_icon_state(wearer)) + +/obj/item/implant/tacmap/nuclear // Nukie subtype, map shows you nuke disk, operatives, cayenne and the nuke + actions_types = list(/datum/action/minimap/nuclear) + wearer_icon_state = "syndicate" + +/obj/item/implant/tacmap/nuclear/implant(mob/living/target, mob/user, silent, force) + . = ..() + if(.) + RegisterSignal(target, COMSIG_MINIMAP_ACTION_TRIGGER, PROC_REF(deny_nukie_base_open)) + +/obj/item/implant/tacmap/nuclear/get_minimap_icon_state(mob/living/wearer) + if(wearer.stat != DEAD && istype(wearer, /mob/living/basic/carp/pet/cayenne)) + return "cayenne" + . = ..() + +/obj/item/implant/tacmap/nuclear/removed(mob/living/source, silent, special) + UnregisterSignal(source, COMSIG_MINIMAP_ACTION_TRIGGER) + return ..() + +/obj/item/implant/tacmap/nuclear/proc/deny_nukie_base_open(mob/living/user) + var/turf/user_turf = get_turf(user) + if(user_turf.onSyndieBase()) + user.balloon_alert(user, "can't use implant in the base, go to the holotable!") + return COMSIG_MINIMAP_ACTION_TRIGGER_CANCEL + +/obj/item/implant/tacmap/nuclear/cayenne // subtype used for cayenne and syndie sentience potions in general + wearer_icon_state = "cayenne" + +/obj/item/implant/tacmap/nuclear/leader // Leader subtype lets him draw on the map + actions_types = list(/datum/action/minimap/nuclear) + can_draw_on_personal_minimap = TRUE + wearer_icon_state = "syndicate_leader" + +/obj/item/implant/tacmap/nuclear/leader/implant(mob/living/target, mob/user, silent, force) + . = ..() + if(.) + ADD_TRAIT(target, TRAIT_MINIMAP_TABLE_DRAW, REF(src)) + +/obj/item/implant/tacmap/nuclear/leader/removed(mob/living/source, silent, special) + REMOVE_TRAIT(source, TRAIT_MINIMAP_TABLE_DRAW, REF(src)) + return ..() + +// Subtype that just lets them open it off-base. +/obj/item/implant/tacmap/nuclear/offbase + minimap_fixed_z_trait = ZTRAIT_STATION + can_draw_on_personal_minimap = TRUE + +/obj/item/implant/tacmap/nuclear/offbase/deny_nukie_base_open(mob/living/user) + return + +/obj/item/implanter/tacmap + name = "implanter (minimap)" + imp_type = /obj/item/implant/tacmap + +/obj/item/implanter/tacmap/nuclear + name = "implanter (operative minimap)" + imp_type = /obj/item/implant/tacmap/nuclear + +/obj/item/implantcase/tacmap + name = "implant case - 'Tactical Map'" + desc = "A glass case containing an implant with a virtual map." + imp_type = /obj/item/implant/tacmap diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index aff0ccc4e80..cd4baf7f1c9 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -764,6 +764,8 @@ new /obj/item/book/manual/nuclear(src) // Very important // The most important part of the kit, the implant that gives them the syndicate faction. new /obj/item/implanter/induction_implant(src) + // Tactical map implant so they can see the minimap with the rest of the team. + new /obj/item/implanter/tacmap/nuclear(src) // All in all, 6+3+3+2+5+2+4 = ~25 TC of 'miscellaneous' items. // This is a lot of value for 10 TC, but you have to keep in mind that you NEED someone to get this stuff station-side. // Pretty much all of it is a bad deal for reinforcements or yourself as they already have similar or good-enough alternatives. diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm index 95c725868ca..f2f9d138df8 100644 --- a/code/game/objects/structures/fence.dm +++ b/code/game/objects/structures/fence.dm @@ -18,6 +18,7 @@ icon = 'icons/obj/fence.dmi' icon_state = "straight" + tacmap_color = TACMAP_FENCE var/cuttable = TRUE var/hole_size= NO_HOLE diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index 5d15c1af89f..88423eb182c 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -165,6 +165,7 @@ down.up = null down.update_appearance(UPDATE_ICON_STATE) + down.update_minimap_blip() down = null update_appearance(UPDATE_ICON_STATE) clear_base_transparency() @@ -188,6 +189,7 @@ up.down = null up.clear_base_transparency() up.update_appearance(UPDATE_ICON_STATE) + up.update_minimap_blip() up = null update_appearance(UPDATE_ICON_STATE) @@ -196,6 +198,11 @@ unlink_down() unlink_up() +/obj/structure/ladder/proc/update_minimap_blip() + remove_minimap_blip(MINIMAP_LADDER_BLIP, src) + if(up || down) + add_minimap_blip(src, MINIMAP_LADDER_BLIP, "ladder") + /obj/structure/ladder/LateInitialize() // By default, discover ladders above and below us vertically var/turf/base = get_turf(src) @@ -213,6 +220,7 @@ // Linking updates our icon, so if we failed both links we need a manual update if(isnull(down) && isnull(up)) update_appearance(UPDATE_ICON_STATE) + update_minimap_blip() /obj/structure/ladder/update_icon_state() icon_state = "[base_icon_state][!!up][!!down]" diff --git a/code/game/objects/structures/stairs.dm b/code/game/objects/structures/stairs.dm index 8d7e1fc84e1..0f037fec4d5 100644 --- a/code/game/objects/structures/stairs.dm +++ b/code/game/objects/structures/stairs.dm @@ -4,6 +4,8 @@ /// Range within which stair indicators will appear for approaching mobs #define STAIR_INDICATOR_RANGE 3 +/// Minimum tile spacing between stair minimap blips +#define STAIR_BLIP_MIN_DISTANCE 2 // dir determines the direction of travel to go upwards // stairs require /turf/open/openspace as the tile above them to work, unless your stairs have 'force_open_above' set to TRUE @@ -27,6 +29,8 @@ VAR_FINAL/turf/directly_above /// If TRUE, we have left/middle/right sprites. var/has_merged_sprites = TRUE + /// Current atoms used as this stair's minimap blip targets. + var/list/minimap_blip_targets /// Lazyassoc list of weakef to mob viewing stair indicators to their images VAR_PRIVATE/list/mob_to_image @@ -63,6 +67,7 @@ force_open_above() build_signal_listener() update_surrounding() + update_minimap_blip() var/static/list/exit_connections = list( COMSIG_ATOM_EXIT = PROC_REF(on_exit_stairs), @@ -78,6 +83,7 @@ /obj/structure/stairs/Destroy() + clear_minimap_blips() if(directly_above) UnregisterSignal(directly_above, COMSIG_TURF_MULTIZ_NEW) directly_above = null @@ -104,6 +110,47 @@ for(var/obj/structure/stairs/stair in get_step(src, turn(dir, -90))) stair.update_appearance() + update_minimap_blip() + +/obj/structure/stairs/proc/update_minimap_blip() + var/bottom_state = isTerminator() ? "stairs_up" : "stairs_down" + var/top_state = (bottom_state == "stairs_up") ? "stairs_down" : "stairs_up" + var/turf/current_turf = get_turf(src) + + clear_minimap_blips() + if(isnull(current_turf)) + return + + add_minimap_blip_if_valid(current_turf, bottom_state) + add_minimap_blip_if_valid(get_step_multiz(current_turf, UP), top_state) + +/obj/structure/stairs/proc/clear_minimap_blips() + if(!islist(minimap_blip_targets)) + return + for(var/atom/target as anything in minimap_blip_targets) + remove_minimap_blip(MINIMAP_STAIR_BLIP, target) + LAZYCLEARLIST(minimap_blip_targets) + +/obj/structure/stairs/proc/add_minimap_blip_if_valid(atom/target, state) + if(isnull(target)) + return + if(!should_place_minimap_blip(target)) + return + + var/atom/movable/screen/minimap_element/blip/blip = get_minimap_blip(MINIMAP_STAIR_BLIP, target) + if(!isnull(blip)) + blip.icon_state = state + else + add_minimap_blip(target, MINIMAP_STAIR_BLIP, state) + LAZYADD(minimap_blip_targets, target) + +/obj/structure/stairs/proc/should_place_minimap_blip(atom/target) + var/turf/target_turf = get_turf(target) + if(isnull(target_turf)) + return FALSE + if(length(get_minimap_blips_in_area(MINIMAP_STAIR_BLIP, target_turf, STAIR_BLIP_MIN_DISTANCE))) + return FALSE + return TRUE /obj/structure/stairs/update_icon_state() . = ..() @@ -420,3 +467,4 @@ #undef STAIR_TERMINATOR_YES #undef STAIR_INDICATOR_RANGE +#undef STAIR_BLIP_MIN_DISTANCE diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index cd54bd380f2..6ca6b22836c 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -18,6 +18,7 @@ flags_ricochet = RICOCHET_HARD receive_ricochet_chance_mod = 0.5 custom_materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT) + tacmap_color = TACMAP_WINDOW var/state = WINDOW_OUT_OF_FRAME var/reinf = FALSE var/heat_resistance = 800 diff --git a/code/game/turfs/closed/_closed.dm b/code/game/turfs/closed/_closed.dm index c29772afc5b..09bd513be8e 100644 --- a/code/game/turfs/closed/_closed.dm +++ b/code/game/turfs/closed/_closed.dm @@ -9,6 +9,7 @@ init_air = FALSE rad_insulation = RAD_MEDIUM_INSULATION pass_flags_self = PASSCLOSEDTURF + tacmap_color = TACMAP_BLACK /turf/closed/AfterChange() . = ..() diff --git a/code/game/turfs/open/asteroid.dm b/code/game/turfs/open/asteroid.dm index c441871caa8..b8128820f8e 100644 --- a/code/game/turfs/open/asteroid.dm +++ b/code/game/turfs/open/asteroid.dm @@ -182,6 +182,7 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) initial_gas_mix = LAVALAND_DEFAULT_ATMOS planetary_atmos = TRUE baseturfs = /turf/open/lava/smooth/lava_land_surface + skip_minimap_rendering = TRUE /// Used for the lavaland icemoon ruin. /turf/open/misc/asteroid/basalt/lava_land_surface/no_ruins @@ -393,6 +394,7 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) baseturfs = /turf/open/openspace/icemoon initial_gas_mix = ICEMOON_DEFAULT_ATMOS slowdown = 0 + skip_minimap_rendering = TRUE /// Exact subtype as parent, just used in ruins to prevent other ruins/chasms from spawning on top of it. /turf/open/misc/asteroid/snow/icemoon/do_not_chasm diff --git a/code/game/turfs/open/floor/iron_floor.dm b/code/game/turfs/open/floor/iron_floor.dm index 6f0489acea5..7f7a5fa28c9 100644 --- a/code/game/turfs/open/floor/iron_floor.dm +++ b/code/game/turfs/open/floor/iron_floor.dm @@ -414,6 +414,7 @@ icon_state = "solarpanel" base_icon_state = "solarpanel" floor_tile = /obj/item/stack/tile/iron/solarpanel + skip_minimap_rendering = TRUE /turf/open/floor/iron/solarpanel/airless initial_gas_mix = AIRLESS_ATMOS diff --git a/code/game/turfs/open/floor/misc_floor.dm b/code/game/turfs/open/floor/misc_floor.dm index 61f2c76bc79..ae5ae6c3e9d 100644 --- a/code/game/turfs/open/floor/misc_floor.dm +++ b/code/game/turfs/open/floor/misc_floor.dm @@ -75,6 +75,9 @@ icon_state = "bcircuitoff" always_off = TRUE +/turf/open/floor/circuit/no_light + always_off = TRUE + /turf/open/floor/circuit/airless initial_gas_mix = AIRLESS_ATMOS @@ -120,6 +123,9 @@ icon_state = "rcircuitoff" always_off = TRUE +/turf/open/floor/circuit/red/no_power + always_off = TRUE + /turf/open/floor/circuit/red/anim icon_state = "rcircuitanim" floor_tile = /obj/item/stack/tile/circuit/red/anim diff --git a/code/game/turfs/open/ice.dm b/code/game/turfs/open/ice.dm index a966e8e4d7e..1a227d2a034 100644 --- a/code/game/turfs/open/ice.dm +++ b/code/game/turfs/open/ice.dm @@ -82,6 +82,7 @@ baseturfs = /turf/open/openspace/icemoon initial_gas_mix = ICEMOON_DEFAULT_ATMOS slowdown = 0 + skip_minimap_rendering = TRUE /turf/open/misc/ice/icemoon/no_planet_atmos planetary_atmos = FALSE diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index dcc735819f3..e4c447008da 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -71,6 +71,7 @@ GLOBAL_LIST_EMPTY(starlight) vis_flags = VIS_INHERIT_ID //when this be added to vis_contents of something it be associated with something on clicking, important for visualisation of turf in openspace and interraction with openspace that show you turf. force_no_gravity = TRUE + skip_minimap_rendering = TRUE /turf/open/space/basic icon_state = MAP_SWITCH("space", "space_basic_map") diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index b6a0b8c3867..4a98f911a04 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -113,6 +113,9 @@ GLOBAL_LIST_EMPTY(station_turfs) ///The typepath we use for lazy fishing on turfs, to save on world init time. var/fish_source + /// If TRUE, then this turf will be skipped entirely by minimap rendering. + var/skip_minimap_rendering = FALSE + /turf/vv_edit_var(var_name, new_value) var/static/list/banned_edits = list(NAMEOF_STATIC(src, x), NAMEOF_STATIC(src, y), NAMEOF_STATIC(src, z)) diff --git a/code/modules/antagonists/clown_ops/outfits.dm b/code/modules/antagonists/clown_ops/outfits.dm index 18016da7c4a..b66b2212445 100644 --- a/code/modules/antagonists/clown_ops/outfits.dm +++ b/code/modules/antagonists/clown_ops/outfits.dm @@ -18,7 +18,7 @@ /obj/item/mod/skin_applier/honkerative = 1, ) box = /obj/item/storage/box/survival/syndie - implants = list(/obj/item/implant/sad_trombone) + implants = list(/obj/item/implant/sad_trombone, /obj/item/implant/tacmap/nuclear) uplink_type = /obj/item/uplink/clownop @@ -33,3 +33,4 @@ command_radio = TRUE id_trim = /datum/id_trim/chameleon/operative/clown_leader + implants = list(/obj/item/implant/sad_trombone, /obj/item/implant/tacmap/nuclear/leader) diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm b/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm index 7e9aa464142..06a95d809d0 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm @@ -25,6 +25,7 @@ AddComponent(/datum/component/stationloving, !fake) AddComponent(/datum/component/keep_me_secure, CALLBACK(src, PROC_REF(secured_process)), CALLBACK(src, PROC_REF(unsecured_process)), 10) SSpoints_of_interest.make_point_of_interest(src) + add_minimap_blip(src, MINIMAP_NUKEDISK_BLIP, "green_disk_off", 'icons/ui_icons/minimap/map_blips_large.dmi', TRUE) else // Ensure fake disks still have examine text, but dont actually do anything AddComponent(/datum/component/keep_me_secure) diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm index 807f0e6e690..a00956e7c80 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm @@ -53,6 +53,8 @@ GLOBAL_VAR(station_nuke_source) var/proper_bomb = TRUE //Please /// A reference to the countdown that goes up over the nuke var/obj/effect/countdown/nuclearbomb/countdown + /// is this nuke on the MINIMAP_BOMB_BLIP tag minimap? + var/is_on_minimap = TRUE /obj/machinery/nuclearbomb/Initialize(mapload) . = ..() @@ -62,6 +64,7 @@ GLOBAL_VAR(station_nuke_source) update_appearance() SSpoints_of_interest.make_point_of_interest(src) previous_level = SSsecurity_level.get_current_level_as_text() + update_minimap_blip() /obj/machinery/nuclearbomb/Destroy() safety = FALSE @@ -523,6 +526,7 @@ GLOBAL_VAR(station_nuke_source) arm_nuke(usr) else disarm_nuke(usr) + update_minimap_blip() /// Arms the nuke, making it active and triggering all pinpointers to start counting down (+delta alert) /obj/machinery/nuclearbomb/proc/arm_nuke(mob/armer) @@ -565,6 +569,12 @@ GLOBAL_VAR(station_nuke_source) SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NUKE_DEVICE_DISARMED, src) update_appearance() +/obj/machinery/nuclearbomb/proc/update_minimap_blip() + if(!is_on_minimap) + return + var/blip_icon = 'icons/ui_icons/minimap/map_blips_large.dmi' + add_minimap_blip(src, MINIMAP_BOMB_BLIP, "nuke_[timing ? "on" : "off"]", blip_icon, TRUE) + /// If the nuke is active, gets how much time is left until it detonates, in seconds. /// If the nuke is not active, gets how much time the nuke is set for, in seconds. /obj/machinery/nuclearbomb/proc/get_time_left() diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm index 66798ae798c..7bef615c806 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm @@ -3,6 +3,7 @@ name = "\improper Nanotrasen-brand nuclear fission explosive" desc = "One of the more successful achievements of the Nanotrasen Corporate Warfare Division, their nuclear fission explosives are renowned for being cheap to produce and devastatingly effective. Signs explain that though this particular device has been decommissioned, every Nanotrasen station is equipped with an equivalent one, just in case. All Captains carefully guard the disk needed to detonate them - at least, the sign says they do. There seems to be a tap on the back." proper_bomb = FALSE + is_on_minimap = FALSE /// The keg located within the beer nuke. var/obj/structure/reagent_dispensers/beerkeg/keg /// Reagent that is produced once the nuke detonates. diff --git a/code/modules/antagonists/nukeop/outfits.dm b/code/modules/antagonists/nukeop/outfits.dm index 74402a2cd06..ce7cadba7a5 100644 --- a/code/modules/antagonists/nukeop/outfits.dm +++ b/code/modules/antagonists/nukeop/outfits.dm @@ -13,6 +13,11 @@ skillchips = list(/obj/item/skillchip/disk_verifier) box = /obj/item/storage/box/survival/syndie + implants = list( + /obj/item/implant/weapons_auth, + /obj/item/implant/explosive, + /obj/item/implant/tacmap/nuclear, + ) /// Amount of TC to automatically store in this outfit's uplink. var/tc = 25 /// Enables big voice on this outfit's headset, used for nukie leaders. @@ -33,6 +38,12 @@ name = "Syndicate Leader - Basic" command_radio = TRUE + implants = list( + /obj/item/implant/weapons_auth, + /obj/item/implant/explosive, + /obj/item/implant/tacmap/nuclear/leader, + ) + id_trim = /datum/id_trim/chameleon/operative/nuke_leader /datum/outfit/syndicate/leader/plasmaman @@ -84,6 +95,11 @@ /datum/outfit/syndicate/full/loneop name = "Syndicate Operative - Full Kit (Loneop)" uplink_type = /obj/item/uplink/loneop + implants = list( + /obj/item/implant/weapons_auth, + /obj/item/implant/explosive, + /obj/item/implant/tacmap/nuclear/leader, + ) /datum/outfit/syndicate/full/plasmaman name = "Syndicate Operative - Full Kit (Plasmaman)" @@ -213,3 +229,8 @@ command_radio = TRUE tc = 0 uplink_type = null + implants = list( + /obj/item/implant/weapons_auth, + /obj/item/implant/explosive, + /obj/item/implant/tacmap/nuclear/offbase, + ) diff --git a/code/modules/logging/categories/log_category_game.dm b/code/modules/logging/categories/log_category_game.dm index fced988c1fc..a5be914e6d2 100644 --- a/code/modules/logging/categories/log_category_game.dm +++ b/code/modules/logging/categories/log_category_game.dm @@ -66,3 +66,7 @@ category = LOG_CATEGORY_GAME_BLOOD_WORM config_flag = /datum/config_entry/flag/log_blood_worm master_category = /datum/log_category/game + +/datum/log_category/minimap_drawing + category = LOG_CATEGORY_GAME_MINIMAP_DRAWING + master_category = /datum/log_category/game diff --git a/code/modules/minimap/_minimap.dm b/code/modules/minimap/_minimap.dm new file mode 100644 index 00000000000..e864b080f56 --- /dev/null +++ b/code/modules/minimap/_minimap.dm @@ -0,0 +1,45 @@ +GLOBAL_ALIST_EMPTY(minimap_blip_tags) +GLOBAL_ALIST_EMPTY(minimap_annotations) +GLOBAL_LIST_EMPTY(minimap_annotation_viewers) + +/// Create a minimap blip on the z-level in question, object is optional, and will tie the blip to the object in question, and will clean up itself if the object in question is deleted +/proc/add_minimap_blip(atom/object, tag, icon_state, icon = 'icons/ui_icons/minimap/map_blips.dmi', large = FALSE, layer = 12) + if(!istype(object) || !tag || !icon_state) + CRASH("Invalid params passed in to add_minimap_blip") + var/atom/movable/screen/minimap_element/blip/new_blip = new(null, null, object, icon_state, icon, large, tag) + new_blip.layer = layer + LAZYADD(GLOB.minimap_blip_tags[tag], new_blip) + SEND_GLOBAL_SIGNAL(COMSIG_MINIMAP_ADD(tag), new_blip) + +/proc/get_minimap_blip(tag, atom/object) + if(!tag || !istype(object)) + return + for(var/atom/movable/screen/minimap_element/blip/blip as anything in GLOB.minimap_blip_tags[tag]) + if(blip.track_target == object) + return blip + +/proc/remove_minimap_blip(tag, atom/object) + var/atom/movable/screen/minimap_element/blip/blip = get_minimap_blip(tag, object) + if(isnull(blip)) + return + SEND_GLOBAL_SIGNAL(COMSIG_MINIMAP_REMOVE(tag), blip) + LAZYREMOVE(GLOB.minimap_blip_tags[tag], blip) + qdel(blip) + +/// Returns minimap blips matching a tag that are within `distance` tiles of `target_turf` on the same z-level. +/proc/get_minimap_blips_in_area(tag, turf/target_turf, distance) + if(!tag || isnull(target_turf) || !isnum(distance) || !islist(GLOB.minimap_blip_tags[tag])) + return list() + + var/list/nearby_blips = list() + for(var/atom/movable/screen/minimap_element/blip/blip as anything in GLOB.minimap_blip_tags[tag]) + var/turf/blip_turf = get_turf(blip.track_target) + if(isnull(blip_turf)) + continue + if(blip_turf.z != target_turf.z) + continue + if(get_dist(blip_turf, target_turf) > distance) + continue + nearby_blips += blip + + return nearby_blips diff --git a/code/modules/minimap/hud/minimal_z_level.dm b/code/modules/minimap/hud/minimal_z_level.dm new file mode 100644 index 00000000000..af6071b49dc --- /dev/null +++ b/code/modules/minimap/hud/minimal_z_level.dm @@ -0,0 +1,68 @@ +/atom/movable/screen/minimap_z_indicator + icon = 'icons/hud/screen_ai.dmi' + icon_state = "zindicator" + screen_loc = "BOTTOM+4,RIGHT" + +/atom/movable/screen/minimap_z_indicator/Initialize(mapload, datum/hud/hud_owner) + . = ..() + if(!isnull(hud_owner.mymob)) + RegisterSignal(hud_owner.mymob, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(on_z_level_change)) + RegisterSignal(hud_owner.mymob, COMSIG_MINIMAP_CHANGE_Z_LEVEL, PROC_REF(on_minimap_change_request)) + var/current_turf = get_turf(hud_owner.mymob) + on_z_level_change(null, current_turf, FALSE) + +///sets the currently indicated relative floor +/atom/movable/screen/minimap_z_indicator/proc/on_z_level_change(turf/old_turf, turf/new_turf, same_z_layer) + SIGNAL_HANDLER + var/used_z = get_displayed_z_level(new_turf) + set_floor_text(used_z) + +/atom/movable/screen/minimap_z_indicator/proc/on_minimap_change_request(mob/hud_owner, new_z_change) + SIGNAL_HANDLER + var/atom/movable/screen/minimap_display/current_display = hud?.screen_objects[HUD_TAC_MINIMAP] + if(isnull(current_display)) + var/current_turf = get_turf(hud_owner) + on_z_level_change(null, current_turf, FALSE) + return + var/current_z = current_display.get_viewed_z_level() + if(isnull(current_z)) + return + var/requested_z = current_display.get_clamped_connected_z(current_z + new_z_change, current_z) + set_floor_text(requested_z) + +/atom/movable/screen/minimap_z_indicator/proc/get_displayed_z_level(turf/current_turf) + var/atom/movable/screen/minimap_display/current_display = hud?.screen_objects[HUD_TAC_MINIMAP] + if(!isnull(current_display?.fixed_z_level)) + return current_display.minimap?.z + return current_turf?.z + +/atom/movable/screen/minimap_z_indicator/proc/set_floor_text(used_z) + if(isnull(used_z)) + return + var/bottom_z = used_z + while(SSmapping.multiz_levels?[bottom_z]?[Z_LEVEL_DOWN]) // just keep going down + bottom_z-- + var/text = "Floor
[(used_z - bottom_z) + 1]" + maptext = MAPTEXT_TINY_UNICODE("
[text]
") + +/atom/movable/screen/minimap_z_up + name = "go up" + icon = 'icons/hud/screen_ai.dmi' + icon_state = "up" + mouse_over_pointer = MOUSE_HAND_POINTER + screen_loc = "BOTTOM+4,RIGHT-1" + +/atom/movable/screen/minimap_z_up/Click(location, control, params) + flick("uppressed", src) + SEND_SIGNAL(hud.mymob, COMSIG_MINIMAP_CHANGE_Z_LEVEL, 1) // +1 z level + +/atom/movable/screen/minimap_z_down + name = "go down" + icon = 'icons/hud/screen_ai.dmi' + icon_state = "down" + mouse_over_pointer = MOUSE_HAND_POINTER + screen_loc = "BOTTOM+4,RIGHT-1" + +/atom/movable/screen/minimap_z_down/Click(location, control, params) + flick("downpressed", src) + SEND_SIGNAL(hud.mymob, COMSIG_MINIMAP_CHANGE_Z_LEVEL, -1) // -1 z level diff --git a/code/modules/minimap/hud/minimap_dimmer.dm b/code/modules/minimap/hud/minimap_dimmer.dm new file mode 100644 index 00000000000..bdd759d86cc --- /dev/null +++ b/code/modules/minimap/hud/minimap_dimmer.dm @@ -0,0 +1,7 @@ +/// Fullscreen dimmer used while the tactical minimap is open. +/// Rendered below HUD planes so minimap and normal HUD icons remain undimmed. +/atom/movable/screen/fullscreen/dimmer/minimap + alpha = 180 + plane = FULLSCREEN_PLANE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + clear_with_screen = TRUE diff --git a/code/modules/minimap/hud/minimap_display.dm b/code/modules/minimap/hud/minimap_display.dm new file mode 100644 index 00000000000..611bb51f30f --- /dev/null +++ b/code/modules/minimap/hud/minimap_display.dm @@ -0,0 +1,585 @@ +#define MINIMAP_LABEL_REMOVE_PIXEL_RANGE 5 + +/// Screen object that renders a [/datum/minimap] base map icon on the HUD. +/atom/movable/screen/minimap_display + name = "Minimap" + icon_state = "" + layer = MINIMAP_IMAGE_LAYER + screen_loc = "1,1" + var/list/origin_px + var/atom/movable/screen/minimap_element/drawing/drawing + /// Optional group tag. Displays with the same tag share drawings and labels. + var/annotation_share_tag + /// Unified list of currently visible minimap elements (drawings, labels, blips, screentip). + var/list/atom/movable/screen/minimap_element/visible_minimap_elements = list() + /// A reference to the minimap used for this display. + var/datum/minimap/minimap + /// Screentext in vis_contents used for the maptext. + var/atom/movable/screen/minimap_element/label/screentip + /// Named blips indexed by name (added via add_blip()). Tagged blips are rebuilt from globals on z-level change. + var/list/atom/movable/screen/minimap_element/blip/blips = list() + /// The list of minimap blip tags we're going to read from the globalist and listen for additions to + var/list/valid_minimap_blip_tags = list() + /// fixed z-level to stay on + var/fixed_z_level + /// Y-axis offset for drawing to account for mouse cursor icon positioning. + var/draw_offset_y = -3 + /// Whether this minimap instance allows drawing and labels. + var/can_draw = TRUE + /// list of signals we want to keep tied on the hud owner mob + var/list/hud_signals = list( + COMSIG_MOVABLE_Z_CHANGED = PROC_REF(on_z_level_change), + COMSIG_MINIMAP_CHANGE_Z_LEVEL = PROC_REF(z_change_request) + ) + /// Maps HUD key → button type path. Used to create/remove toolbar buttons via [/datum/hud]. + var/static/list/toolbar_button_types = list( + HUD_TAC_MINIMAP_TOOL_RED = /atom/movable/screen/minimap_toolbar_button/draw/red, + HUD_TAC_MINIMAP_TOOL_YELLOW = /atom/movable/screen/minimap_toolbar_button/draw/yellow, + HUD_TAC_MINIMAP_TOOL_PURPLE = /atom/movable/screen/minimap_toolbar_button/draw/purple, + HUD_TAC_MINIMAP_TOOL_BLUE = /atom/movable/screen/minimap_toolbar_button/draw/blue, + HUD_TAC_MINIMAP_TOOL_ERASE = /atom/movable/screen/minimap_toolbar_button/erase, + HUD_TAC_MINIMAP_TOOL_LABEL = /atom/movable/screen/minimap_toolbar_button/label, + HUD_TAC_MINIMAP_TOOL_CLEAR = /atom/movable/screen/minimap_toolbar_button/clear, + ) + /// Currently active toolbar button (the active tool). + var/atom/movable/screen/minimap_toolbar_button/active_button = null + /// string for the locator blip's tag + var/locator_blip_tag = "locator" + +/atom/movable/screen/minimap_display/Initialize(mapload, datum/hud/hud_owner, datum/minimap/minimap, list/minimap_blip_tags, initial_fixed_z_level, annotation_share_tag, can_draw = TRUE) + src.can_draw = can_draw + . = ..() + if(isnull(minimap)) + CRASH("[type] created without a minimap reference!") + src.annotation_share_tag = isnull(annotation_share_tag) ? "[type]" : annotation_share_tag + LAZYOR(GLOB.minimap_annotation_viewers[src.annotation_share_tag], src) + if(!isnull(initial_fixed_z_level)) + fixed_z_level = initial_fixed_z_level + INVOKE_ASYNC(src, PROC_REF(apply_fixed_z_minimap), initial_fixed_z_level) + if(length(minimap_blip_tags)) + valid_minimap_blip_tags = minimap_blip_tags.Copy() + set_minimap(minimap) + screentip = new + show_minimap_element(screentip) + if(length(valid_minimap_blip_tags)) + for(var/blip_tag in valid_minimap_blip_tags) + RegisterSignal(SSdcs, COMSIG_MINIMAP_ADD(blip_tag), PROC_REF(on_tagged_blip_add)) + RegisterSignal(SSdcs, COMSIG_MINIMAP_REMOVE(blip_tag), PROC_REF(on_tagged_blip_remove)) + on_z_level_change(hud_owner.mymob) + show_tagged_blips() + +/atom/movable/screen/minimap_display/proc/apply_fixed_z_minimap(target_z) + if(QDELETED(src) || isnull(target_z) || fixed_z_level != target_z) + return + var/datum/minimap/fixed_minimap = get_minimap_for_z(target_z) + if(QDELETED(src) || isnull(fixed_minimap) || fixed_z_level != target_z) + return + set_minimap(fixed_minimap) + +/atom/movable/screen/minimap_display/Destroy() + set_cursor_icon(null) + if(active_button) + active_button.on_deactivate() + active_button = null + var/mob/owner = get_mob() + if(hud) + for(var/key in toolbar_button_types) + hud.remove_screen_object(key, update = FALSE) + if(owner) + for(var/signal in hud_signals) + UnregisterSignal(owner, signal, hud_signals[signal]) + if(owner?.client) + UnregisterSignal(owner.client, COMSIG_CLIENT_MOUSEUP) + if(length(GLOB.minimap_annotation_viewers[annotation_share_tag])) + GLOB.minimap_annotation_viewers[annotation_share_tag] -= src + minimap = null + drawing = null + visible_minimap_elements.Cut() + annotation_share_tag = null + QDEL_NULL(screentip) + if(length(valid_minimap_blip_tags)) + for(var/blip_tag in valid_minimap_blip_tags) + UnregisterSignal(SSdcs, COMSIG_MINIMAP_ADD(blip_tag)) + UnregisterSignal(SSdcs, COMSIG_MINIMAP_REMOVE(blip_tag)) + remove_all_blips() + + return ..() + +/atom/movable/screen/minimap_display/set_new_hud(datum/hud/hud_owner) + var/mob/old_owner = get_mob() + if(hud) + for(var/key in toolbar_button_types) + hud.remove_screen_object(key, update = FALSE) + if(old_owner) + for(var/signal in hud_signals) + UnregisterSignal(old_owner, signal, hud_signals[signal]) + if(old_owner?.client) + UnregisterSignal(old_owner.client, COMSIG_CLIENT_MOUSEUP) + . = ..() + var/mob/new_owner = get_mob() + if(new_owner) + for(var/signal in hud_signals) + RegisterSignal(new_owner, signal, hud_signals[signal]) + if(new_owner?.client) + RegisterSignal(new_owner.client, COMSIG_CLIENT_MOUSEUP, PROC_REF(on_client_mouseup)) + if(can_draw) + for(var/hud_key, hud_type in toolbar_button_types) + var/atom/movable/screen/minimap_toolbar_button/button = new hud_type(null, hud_owner, src) + button.tool_key = hud_key + hud_owner.add_screen_object(button, hud_key, HUD_GROUP_STATIC, update_screen = FALSE) + reposition_toolbar_buttons() + hud_owner.show_hud(hud_owner.hud_version) + +/atom/movable/screen/minimap_display/Click(location, control, params) + if(..() || usr != get_mob()) + return + var/list/modifiers = params2list(params) + var/icon_x = text2num(LAZYACCESS(modifiers, ICON_X)) + var/icon_y = text2num(LAZYACCESS(modifiers, ICON_Y)) + var/right_click = LAZYACCESS(modifiers, RIGHT_CLICK) + + if(active_button && active_button.on_click(icon_x, icon_y, right_click)) + return + +/atom/movable/screen/minimap_display/proc/remove_nearest_label(icon_x, icon_y, mob/user) + var/list/labels_for_z = get_or_create_annotation_list(/atom/movable/screen/minimap_element/label, minimap.z) + if(!length(labels_for_z)) + return + var/atom/movable/screen/minimap_element/label/nearest + var/nearest_dist_sq + for(var/atom/movable/screen/minimap_element/label/label as anything in labels_for_z) + var/dx = label.pixel_w - icon_x + var/dy = label.pixel_z - icon_y + var/dist_sq = (dx * dx) + (dy * dy) + if(dist_sq > (MINIMAP_LABEL_REMOVE_PIXEL_RANGE * MINIMAP_LABEL_REMOVE_PIXEL_RANGE)) + continue + if(isnull(nearest_dist_sq) || dist_sq < nearest_dist_sq) + nearest_dist_sq = dist_sq + nearest = label + if(isnull(nearest)) + return + labels_for_z -= nearest + hide_minimap_element(nearest) + qdel(nearest) + sync_visible_objects(minimap?.z) + log_minimap_drawing("[key_name(user)] removed a minimap label") + +/atom/movable/screen/minimap_display/MouseEntered(location, control, params) + MouseMove(location, control, params) + +/atom/movable/screen/minimap_display/MouseDrag(over_object, src_location, over_location, src_control, over_control, params) + if(usr != get_mob()) + return + if(!active_button) + return + var/list/modifiers = params2list(params) + var/list/mouse_px = params2screenpixel(LAZYACCESS(modifiers, SCREEN_LOC)) + if(length(mouse_px) != 2) + return + var/x = mouse_px[1] - origin_px[1] + 1 + var/y = mouse_px[2] - origin_px[2] + 1 + active_button.on_mouse_drag(x, y) + +/atom/movable/screen/minimap_display/proc/on_client_mouseup(client/source) + SIGNAL_HANDLER + if(active_button) + active_button.on_mouse_up() + +/atom/movable/screen/minimap_display/MouseMove(location, control, params) + if(usr != get_mob()) + return + var/list/modifiers = params2list(params) + var/icon_x = text2num(LAZYACCESS(modifiers, ICON_X)) + var/icon_y = text2num(LAZYACCESS(modifiers, ICON_Y)) + + var/x = clamp(MINIMAP_ICON_TO_WORLD(icon_x, minimap.min_x), 1, world.maxx) + var/y = clamp(MINIMAP_ICON_TO_WORLD(icon_y, minimap.min_y), 1, world.maxy) + var/hover_text = get_hover_text(x, y) + screentip.maptext = MAPTEXT_TINY_UNICODE("[hover_text]") + screentip.pixel_w = icon_x + screentip.pixel_z = icon_y + +/atom/movable/screen/minimap_display/proc/get_hover_text(x, y) + var/closest_blip_name + var/closest_blip_distance + for(var/atom/movable/screen/minimap_element/blip/blip in visible_minimap_elements) + if(isnull(blip.track_target) || blip.track_target.z != minimap.z) + continue + if(!length(blip.name)) + continue + var/hover_range = blip.large ? 2 : 1 + var/x_distance = abs(blip.track_target.x - x) + var/y_distance = abs(blip.track_target.y - y) + if(x_distance > hover_range || y_distance > hover_range) + continue + var/distance = x_distance + y_distance + if(isnull(closest_blip_distance) || distance < closest_blip_distance) + closest_blip_distance = distance + closest_blip_name = blip.name + + if(!isnull(closest_blip_name)) + return closest_blip_name + + var/area_name = minimap.map_position_to_name["[x]:[y]"] + if(isnull(area_name)) + var/turf/hovered_loc = locate(x, y, minimap.z) + area_name = "[hovered_loc?.loc?.name]" + minimap.map_position_to_name["[x]:[y]"] = area_name + return area_name + +/atom/movable/screen/minimap_display/MouseExited(location, control, params) + if(usr != get_mob()) + return + screentip.maptext = "" + if(active_button) + active_button.on_mouse_up() + +/atom/movable/screen/minimap_display/proc/on_z_level_change(mob/source) + SIGNAL_HANDLER + var/turf/mob_loc = get_turf(source) + if(!mob_loc || mob_loc.z != minimap.z) + if(isnull(fixed_z_level)) + INVOKE_ASYNC(src, PROC_REF(resolve_and_change_z_level), mob_loc.z) + return + remove_blip(locator_blip_tag) + return + add_blip(locator_blip_tag, "locator", mob_loc.x, mob_loc.y, layer = 15) + + +/atom/movable/screen/minimap_display/proc/resolve_and_change_z_level(new_z) + if(isnull(new_z)) + return + var/datum/minimap/new_minimap = get_minimap_for_z(new_z) + if(QDELETED(src) || isnull(new_minimap)) + return + change_z_level(new_z, new_minimap) + +/atom/movable/screen/minimap_display/proc/change_z_level(new_z, datum/minimap/new_minimap) + if(isnull(new_minimap)) + return + if(!isnull(fixed_z_level)) + fixed_z_level = new_z + set_minimap(new_minimap) + +/atom/movable/screen/minimap_display/proc/set_fixed_z_level(new_fixed_z, apply_immediately = FALSE) + fixed_z_level = new_fixed_z + if(apply_immediately) + INVOKE_ASYNC(src, PROC_REF(resolve_and_change_z_level), new_fixed_z) + +/atom/movable/screen/minimap_display/proc/show_tagged_blips() + if(!length(valid_minimap_blip_tags)) + return + for(var/blip_flag in valid_minimap_blip_tags) + var/blip_list = GLOB.minimap_blip_tags[blip_flag] + if(!blip_list) + continue + for(var/atom/movable/screen/minimap_element/blip/blip as anything in blip_list) + on_tagged_blip_add(null, blip) + +/atom/movable/screen/minimap_display/proc/on_tagged_blip_add(datum/source, atom/movable/screen/minimap_element/blip/blip) + SIGNAL_HANDLER + if(isnull(blip) || QDELETED(blip) || isnull(minimap)) + return + if(!(blip.blip_tag in valid_minimap_blip_tags)) + return + if(isnull(blip.track_target)) + return + var/turf/blip_turf = get_turf(blip.track_target) + if(blip_turf?.z != minimap.z) + return + blip.start_tracking_target() + show_minimap_element(blip) + +/atom/movable/screen/minimap_display/proc/on_tagged_blip_remove(datum/source, atom/movable/screen/minimap_element/blip/blip) + SIGNAL_HANDLER + if(isnull(blip)) + return + hide_minimap_element(blip) + +/atom/movable/screen/minimap_display/proc/set_minimap(datum/minimap/minimap) + if(isnull(minimap)) + return + icon = minimap.base_map + var/map_w = minimap.base_map.Width() + var/map_h = minimap.base_map.Height() + var/screen_size = get_screen_pixel_size() + var/map_offset_y = 32 + screen_loc = "1:[screen_size / 2 - map_w / 2],1:[screen_size / 2 - map_h / 2 - map_offset_y]" + origin_px = params2screenpixel(screen_loc) + src.minimap = minimap + refresh_visible_annotations() + screentip?.maptext = "" + clear_tagged_blips() + show_tagged_blips() + reposition_toolbar_buttons() + +/// adds a local blip that's not added to the global list +/atom/movable/screen/minimap_display/proc/add_blip(name, icon_state, x, y, large = FALSE, layer = 12) + if(blips[name]) + return + var/atom/movable/screen/minimap_element/blip/new_blip = new(null, null, get_mob(), icon_state, large) + new_blip.layer = layer + new_blip.start_tracking_target() + blips[name] = new_blip + show_minimap_element(new_blip) + +/atom/movable/screen/minimap_display/proc/update_blip(name, x, y) + var/atom/movable/screen/minimap_element/blip/blip = blips[name] + if(!blip) + return + var/half_size = blip.large ? 5 : 3 + blip.pixel_w = MINIMAP_WORLD_TO_PIXEL(x, minimap.min_x, half_size) + blip.pixel_z = MINIMAP_WORLD_TO_PIXEL(y, minimap.min_y, half_size) + +/atom/movable/screen/minimap_display/proc/remove_blip(name) + var/atom/movable/screen/minimap_element/blip/blip = blips[name] + if(!blip) + return + blips -= name + hide_minimap_element(blip) + qdel(blip) + +/atom/movable/screen/minimap_display/proc/remove_all_blips() + for(var/blip_name in blips) + var/atom/movable/screen/minimap_element/blip/blip = blips[blip_name] + hide_minimap_element(blip) + qdel(blip) + blips.Cut() + hide_visible_elements_by_type(/atom/movable/screen/minimap_element/blip) + +/atom/movable/screen/minimap_display/proc/z_change_request(mob/hud_owner, new_z_change) + SIGNAL_HANDLER + var/current_z = get_viewed_z_level() + var/new_z = get_clamped_connected_z(current_z + new_z_change, current_z) + INVOKE_ASYNC(src, PROC_REF(resolve_and_change_z_level), new_z) + +/atom/movable/screen/minimap_display/proc/get_viewed_z_level() + if(!isnull(fixed_z_level)) + return fixed_z_level + return minimap?.z + +/atom/movable/screen/minimap_display/proc/get_clamped_connected_z(requested_z, source_z) + if(isnull(source_z)) + return requested_z + var/list/connected_levels = SSmapping.get_connected_levels(source_z) + if(!length(connected_levels)) + return requested_z + if(requested_z in connected_levels) + return requested_z + var/closest_z = connected_levels[1] + var/closest_distance = abs(closest_z - requested_z) + for(var/connected_z in connected_levels) + var/current_distance = abs(connected_z - requested_z) + if(current_distance < closest_distance) + closest_z = connected_z + closest_distance = current_distance + return closest_z + +/// Activates a toolbar button as the active tool. +/atom/movable/screen/minimap_display/proc/activate_button(atom/movable/screen/minimap_toolbar_button/button) + if(!button) + return + + // Deselect if clicking the same button + if(active_button == button) + deactivate_button() + return + + deactivate_button() + + active_button = button + button.on_activate() + update_toolbar_button_states() + +/// Deactivates the current tool button. +/atom/movable/screen/minimap_display/proc/deactivate_button() + if(active_button) + active_button.on_deactivate() + active_button = null + update_toolbar_button_states() + +/// Sets the mouse cursor icon for the HUD client. Pass null to reset to default. +/atom/movable/screen/minimap_display/proc/set_cursor_icon(icon/cursor_icon) + var/mob/owner = get_mob() + if(owner?.client) + owner.client.mouse_pointer_icon = cursor_icon + +/// Calculates the actual screen pixel size based on the client's view +/atom/movable/screen/minimap_display/proc/get_screen_pixel_size() + var/mob/owner = get_mob() + if(!owner?.client) + return SCREEN_PIXEL_SIZE // fallback to constant if no client + var/list/view_pixels = view_to_pixels(owner.client.view_size.getView()) + // Return the maximum dimension (typically square, but handle non-square views) + return max(view_pixels[1], view_pixels[2]) + +/atom/movable/screen/minimap_display/proc/update_toolbar_button_states() + if(!hud) + return + for(var/hud_key in toolbar_button_types) + var/atom/movable/screen/minimap_toolbar_button/button = hud.screen_objects[hud_key] + if(button) + button.update_active_state() + +/atom/movable/screen/minimap_display/proc/reposition_toolbar_buttons() + if(!hud || !minimap) + return + // origin_px[1] is the minimap's left edge; place toolbar one icon-width to its left. + var/btn_x = origin_px[1] - ICON_SIZE_X - 4 + if(btn_x < 0) + btn_x = origin_px[1] + minimap.base_map.Width() + 4 // fall back to right side + // Toolbar is vertically centered relative to the minimap's current position. + var/screen_size = get_screen_pixel_size() + var/toolbar_h = length(toolbar_button_types) * ICON_SIZE_Y + var/map_center_y = origin_px[2] + minimap.base_map.Height() / 2 + var/btn_top_y = clamp(map_center_y + toolbar_h / 2, toolbar_h, screen_size) + for(var/key in toolbar_button_types) + var/atom/movable/screen/minimap_toolbar_button/button = hud.screen_objects[key] + if(button) + button.screen_loc = "1:[btn_x],1:[btn_top_y - ICON_SIZE_Y - button.button_slot * ICON_SIZE_Y]" + +/atom/movable/screen/minimap_display/proc/clear_canvas(mob/user) + if(!can_draw) + return + drawing.clear_canvas(minimap?.base_map) + log_minimap_drawing("[key_name(user)] cleared the minimap canvas on z-level [minimap?.z]") + to_chat(user, span_warning("Cleared all minimap drawings.")) + +/atom/movable/screen/minimap_display/proc/clear_all_annotations(mob/user, annotation_type = /atom/movable/screen/minimap_element/label, annotation_type_name = "label") + var/alist/annotation_store = GLOB.minimap_annotations[annotation_share_tag] + var/alist/items_by_z = annotation_store?[annotation_type] + if(isnull(items_by_z)) + return + var/current_z = get_viewed_z_level() + var/list/items = items_by_z[current_z] + if(!length(items)) + return + QDEL_LIST(items) + items_by_z[current_z] = list() + refresh_visible_annotations() + sync_visible_objects(current_z) + var/user_name = user ? key_name(user) : "System" + to_chat(user, span_warning("Cleared all [annotation_type_name] annotations on z-level [current_z].")) + log_minimap_drawing("[user_name] has cleared all [annotation_type_name] annotations on z-level [current_z]") + +/atom/movable/screen/minimap_display/proc/async_place_label(mob/user, icon_x, icon_y) + var/x = clamp(MINIMAP_ICON_TO_WORLD(icon_x, minimap.min_x), 1, world.maxx) + var/y = clamp(MINIMAP_ICON_TO_WORLD(icon_y, minimap.min_y), 1, world.maxy) + var/area_name = minimap.map_position_to_name["[x]:[y]"] + if(isnull(area_name)) + var/turf/hovered_loc = locate(x, y, minimap.z) + area_name = "[hovered_loc?.loc?.name]" + minimap.map_position_to_name["[x]:[y]"] = area_name + var/label_text = tgui_input_text(user, "What would you like the label at [area_name] to say?", "Add Label", max_length = 25) + if(!label_text || QDELETED(src)) + return + var/list/filter_result = is_ic_filtered(label_text) + if(filter_result) + to_chat(user, span_warning("That label contained a word prohibited in IC chat! Consider reviewing the server rules.\n\"[label_text]\"")) + SSblackbox.record_feedback("tally", "ic_blocked_words", 1, LOWER_TEXT(config.ic_filter_regex.match)) + REPORT_CHAT_FILTER_TO_USER(src, filter_result) + log_filter("IC", label_text, filter_result) + return + var/atom/movable/screen/minimap_element/label/new_label = new + new_label.icon = 'icons/ui_icons/minimap/map_blips.dmi' + new_label.icon_state = "label" + new_label.maptext_x = 5 + new_label.maptext_y = 5 + new_label.maptext_width = 64 + new_label.maptext = MAPTEXT_TINY_UNICODE("[label_text]") + var/icon/label_icon = icon(new_label.icon, new_label.icon_state) + var/half_width = round(label_icon.Width() / 2) + var/half_height = round(label_icon.Height() / 2) + new_label.pixel_w = MINIMAP_WORLD_TO_PIXEL(x, minimap.min_x, half_width) + new_label.pixel_z = MINIMAP_WORLD_TO_PIXEL(y, minimap.min_y, half_height) + var/list/labels_for_z = get_or_create_annotation_list(/atom/movable/screen/minimap_element/label, minimap.z) + labels_for_z += new_label + sync_visible_objects(minimap?.z) + log_minimap_drawing("[key_name(user)] placed label '[label_text]' at [area_name]") + +/atom/movable/screen/minimap_display/proc/get_or_create_annotation_list(annotation_type, z_level) + var/alist/annotation_store = GLOB.minimap_annotations[annotation_share_tag] + if(isnull(annotation_store)) + annotation_store = alist() + GLOB.minimap_annotations[annotation_share_tag] = annotation_store + var/alist/by_z = annotation_store[annotation_type] + if(isnull(by_z)) + by_z = alist() + annotation_store[annotation_type] = by_z + var/list/items = by_z[z_level] + if(isnull(items)) + items = list() + by_z[z_level] = items + return items + +/atom/movable/screen/minimap_display/proc/refresh_visible_annotations() + if(isnull(minimap)) + return + var/list/drawings = get_or_create_annotation_list(/atom/movable/screen/minimap_element/drawing, minimap.z) + var/atom/movable/screen/minimap_element/drawing/target_drawing = length(drawings) ? drawings[1] : null + if(isnull(target_drawing)) + target_drawing = new + target_drawing.clear_canvas(minimap.base_map) + drawings += target_drawing + if(drawing != target_drawing) + if(!isnull(drawing)) + hide_minimap_element(drawing) + drawing = target_drawing + show_minimap_element(drawing) + + hide_visible_elements_by_type(/atom/movable/screen/minimap_element/label) + var/list/labels_for_z = get_or_create_annotation_list(/atom/movable/screen/minimap_element/label, minimap.z) + if(length(labels_for_z)) + show_minimap_elements(labels_for_z) + show_minimap_element(screentip) + +/atom/movable/screen/minimap_display/proc/sync_visible_objects(z_level) + if(isnull(z_level)) + return + var/list/displays_for_tag = GLOB.minimap_annotation_viewers[annotation_share_tag] + if(!length(displays_for_tag)) + return + for(var/atom/movable/screen/minimap_display/display as anything in displays_for_tag) + if(QDELETED(display) || display.minimap?.z != z_level) + continue + display.refresh_visible_annotations() + +/atom/movable/screen/minimap_display/proc/show_minimap_element(atom/movable/screen/minimap_element/element) + if(isnull(element)) + return + if(!(element in visible_minimap_elements)) + visible_minimap_elements += element + vis_contents |= element + +/atom/movable/screen/minimap_display/proc/hide_minimap_element(atom/movable/screen/minimap_element/element) + if(isnull(element)) + return + visible_minimap_elements -= element + vis_contents -= element + +/atom/movable/screen/minimap_display/proc/show_minimap_elements(list/elements) + for(var/atom/movable/screen/minimap_element/element as anything in elements) + show_minimap_element(element) + +/atom/movable/screen/minimap_display/proc/hide_minimap_elements(list/elements) + for(var/atom/movable/screen/minimap_element/element as anything in elements) + hide_minimap_element(element) + +/atom/movable/screen/minimap_display/proc/hide_visible_elements_by_type(element_type) + if(isnull(element_type)) + return + for(var/atom/movable/screen/minimap_element/element as anything in visible_minimap_elements.Copy()) + if(istype(element, element_type)) + hide_minimap_element(element) + +/atom/movable/screen/minimap_display/proc/clear_tagged_blips() + for(var/atom/movable/screen/minimap_element/blip/blip as anything in visible_minimap_elements.Copy()) + if(!length(blip.blip_tag)) + continue + hide_minimap_element(blip) + +/atom/movable/screen/minimap_display/nuclear + annotation_share_tag = MINIMAP_ANNOTATION_TAG_NUCLEAR + valid_minimap_blip_tags = list(MINIMAP_BOMB_BLIP, MINIMAP_NUKEDISK_BLIP, MINIMAP_NUKEOP_BLIP, MINIMAP_NUKEOP_BORG_BLIP, MINIMAP_SYNDICATE_MECH_BLIP, MINIMAP_SYNDIE_TURRET_BLIP, MINIMAP_LADDER_BLIP, MINIMAP_STAIR_BLIP) + +#undef MINIMAP_LABEL_REMOVE_PIXEL_RANGE diff --git a/code/modules/minimap/hud/minimap_drawing.dm b/code/modules/minimap/hud/minimap_drawing.dm new file mode 100644 index 00000000000..11c81089c85 --- /dev/null +++ b/code/modules/minimap/hud/minimap_drawing.dm @@ -0,0 +1,59 @@ + +/atom/movable/screen/minimap_element/drawing + icon = 'icons/ui_icons/minimap/minimap.dmi' + +/atom/movable/screen/minimap_element/drawing/proc/clear_canvas(icon/base_map) + var/icon/new_icon = icon('icons/ui_icons/minimap/minimap.dmi') + if(base_map) + new_icon.Scale(base_map.Width(), base_map.Height()) + icon = new_icon + +/atom/movable/screen/minimap_element/drawing/proc/draw_box(box_color, start_x, start_y, end_x, end_y, erase_pixel_range = 0, erase_padding_multiplier = 0) + var/icon/new_icon = icon(src.icon) + if(!isnull(box_color) || !erase_padding_multiplier) + new_icon.DrawBox(box_color, start_x, start_y, end_x, end_y) + else + var/padding = erase_pixel_range * erase_padding_multiplier + new_icon.DrawBox(box_color, start_x - padding, start_y - padding, end_x + padding, end_y + padding) + icon = new_icon + +// Unapologetically yoinked from /proc/get_line() +/atom/movable/screen/minimap_element/drawing/proc/draw_line(line_color, x0, y0, x1, y1, erase_pixel_range = 0, erase_padding_multiplier = 0) + var/icon/canvas = icon(src.icon) + var/current_x = x0 + var/current_y = y0 + + var/x_distance = x1 - current_x + var/y_distance = y1 - current_y + + var/abs_x_distance = abs(x_distance) + var/abs_y_distance = abs(y_distance) + + var/x_distance_sign = sign(x_distance) + var/y_distance_sign = sign(y_distance) + + var/cx = abs_x_distance >> 1 + var/cy = abs_y_distance >> 1 + + // draw the start pixel + var/padding = isnull(line_color) && erase_padding_multiplier ? erase_pixel_range * erase_padding_multiplier : 0 + canvas.DrawBox(line_color, current_x - padding, current_y - padding, current_x + 1 + padding, current_y + 1 + padding) + + if(abs_x_distance >= abs_y_distance) + for(var/i in 0 to (abs_x_distance - 1)) + cy += abs_y_distance + if(cy >= abs_x_distance) + cy -= abs_x_distance + current_y += y_distance_sign + current_x += x_distance_sign + canvas.DrawBox(line_color, current_x - padding, current_y - padding, current_x + 1 + padding, current_y + 1 + padding) + else + for(var/i in 0 to (abs_y_distance - 1)) + cx += abs_x_distance + if(cx >= abs_y_distance) + cx -= abs_y_distance + current_x += x_distance_sign + current_y += y_distance_sign + canvas.DrawBox(line_color, current_x - padding, current_y - padding, current_x + 1 + padding, current_y + 1 + padding) + + src.icon = canvas diff --git a/code/modules/minimap/hud/minimap_element.dm b/code/modules/minimap/hud/minimap_element.dm new file mode 100644 index 00000000000..f146f61bf34 --- /dev/null +++ b/code/modules/minimap/hud/minimap_element.dm @@ -0,0 +1,12 @@ +/atom/movable/screen/minimap_element + name = "unknown" + layer = MINIMAP_LABELS_LAYER + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + vis_flags = VIS_INHERIT_PLANE + /// the tag this blip is associated via in it's stored globalist + var/blip_tag = "" + +/atom/movable/screen/minimap_element/Destroy() + if(blip_tag) + LAZYREMOVE(GLOB.minimap_blip_tags[blip_tag], src) + return ..() diff --git a/code/modules/minimap/hud/minimap_label.dm b/code/modules/minimap/hud/minimap_label.dm new file mode 100644 index 00000000000..e7515ab0c88 --- /dev/null +++ b/code/modules/minimap/hud/minimap_label.dm @@ -0,0 +1,6 @@ + +/atom/movable/screen/minimap_element/label + name = "label" + maptext = "" + maptext_width = 96 + maptext_height = 96 diff --git a/code/modules/minimap/hud/minimap_toolbar.dm b/code/modules/minimap/hud/minimap_toolbar.dm new file mode 100644 index 00000000000..c32ecb3979c --- /dev/null +++ b/code/modules/minimap/hud/minimap_toolbar.dm @@ -0,0 +1,198 @@ +#define MINIMAP_TOOLBAR_ERASE_RANGE 5 + +/atom/movable/screen/minimap_toolbar_button + icon = 'icons/ui_icons/minimap/minimap_buttons.dmi' + icon_state = "draw" + mouse_over_pointer = MOUSE_HAND_POINTER + /// The minimap display this button controls. + var/atom/movable/screen/minimap_display/display + /// Vertical slot index (0 = topmost). Used by reposition_toolbar_buttons to calculate screen_loc. + var/button_slot = 0 + /// Mouse cursor icon set when this button's tool is active. null = default cursor. + var/icon/mouse_icon = null + /// Draw color this button represents. null = erase mode. + var/draw_color = null + /// HUD key for this tool button. Used to track selection state. + var/tool_key = null + /// Coordinates of the last drag position during drawing. + var/last_drag_x + var/last_drag_y + +/atom/movable/screen/minimap_toolbar_button/Initialize(mapload, datum/hud/hud_owner, atom/movable/screen/minimap_display/minimap_display) + . = ..() + display = minimap_display + +/atom/movable/screen/minimap_toolbar_button/Destroy() + display = null + return ..() + +/atom/movable/screen/minimap_toolbar_button/MouseEntered(location, control, params) + add_filter("mouseover", 1, outline_filter(1, COLOR_LIME)) + if(desc) + openToolTip(usr, tip_src = display || src, params = params, title = name, content = desc) + +/atom/movable/screen/minimap_toolbar_button/MouseExited(location, control, params) + remove_filter("mouseover") + if(desc) + closeToolTip(usr) + +/// Returns TRUE if this button should be shown as active. +/atom/movable/screen/minimap_toolbar_button/proc/is_active() + return display && display.active_button == src + +/// Updates the button's visual state to show if it's active. +/atom/movable/screen/minimap_toolbar_button/proc/update_active_state() + if(is_active()) + add_filter("active", 1, outline_filter(2, COLOR_YELLOW)) + else + remove_filter("active") + +/// Called when this button is activated as the active tool. +/atom/movable/screen/minimap_toolbar_button/proc/on_activate() + display?.set_cursor_icon(mouse_icon) + +/// Called when this button is deactivated. +/atom/movable/screen/minimap_toolbar_button/proc/on_deactivate() + display?.set_cursor_icon(null) + last_drag_x = null + last_drag_y = null + +/// Called during mouse drag on the map. Override to implement tool behavior. +/atom/movable/screen/minimap_toolbar_button/proc/on_mouse_drag(x, y) + return FALSE + +/// Called on mouse up. Override to clean up tool state. +/atom/movable/screen/minimap_toolbar_button/proc/on_mouse_up() + last_drag_x = null + last_drag_y = null + +/// Called on click. Override to implement click behavior like label placement. +/atom/movable/screen/minimap_toolbar_button/proc/on_click(icon_x, icon_y, right_click) + return FALSE + +/atom/movable/screen/minimap_toolbar_button/draw + desc = "Left-drag on the map to draw." + +/atom/movable/screen/minimap_toolbar_button/draw/on_mouse_drag(x, y) + if(isnull(display) || isnull(display.drawing)) + return FALSE + var/icon_width = display.minimap?.base_map?.Width() + var/icon_height = display.minimap?.base_map?.Height() + if(isnull(icon_width) || isnull(icon_height)) + return FALSE + if(!ISINRANGE(x, 1, icon_width) || !ISINRANGE(y, 1, icon_height)) + last_drag_x = null + last_drag_y = null + return FALSE + + if(last_drag_x && last_drag_y) + display.drawing.draw_line(draw_color, last_drag_x, last_drag_y + display.draw_offset_y, x, y + display.draw_offset_y, 0, 1) + last_drag_x = x + last_drag_y = y + else + display.drawing.draw_box(draw_color, x, y + display.draw_offset_y, x + 1, y + 1 + display.draw_offset_y, 0, 1) + last_drag_x = x + last_drag_y = y + return TRUE + +/atom/movable/screen/minimap_toolbar_button/draw/Click(location, control, params) + if(usr == get_mob()) + display?.activate_button(src) + +/atom/movable/screen/minimap_toolbar_button/draw/red + button_slot = 0 + color = TACMAP_DRAWING_RED + draw_color = TACMAP_DRAWING_RED + mouse_icon = 'icons/ui_icons/minimap/minimap_mouse/draw_red.dmi' + +/atom/movable/screen/minimap_toolbar_button/draw/yellow + button_slot = 1 + color = TACMAP_DRAWING_YELLOW + draw_color = TACMAP_DRAWING_YELLOW + mouse_icon = 'icons/ui_icons/minimap/minimap_mouse/draw_yellow.dmi' + +/atom/movable/screen/minimap_toolbar_button/draw/purple + button_slot = 2 + color = TACMAP_DRAWING_PURPLE + draw_color = TACMAP_DRAWING_PURPLE + mouse_icon = 'icons/ui_icons/minimap/minimap_mouse/draw_purple.dmi' + +/atom/movable/screen/minimap_toolbar_button/draw/blue + button_slot = 3 + color = TACMAP_DRAWING_BLUE + draw_color = TACMAP_DRAWING_BLUE + mouse_icon = 'icons/ui_icons/minimap/minimap_mouse/draw_blue.dmi' + +/// Erase tool — left-drag on the map to erase a line. +/atom/movable/screen/minimap_toolbar_button/erase + icon_state = "erase" + button_slot = 4 + desc = "Left-drag on the map to erase." + mouse_icon = 'icons/ui_icons/minimap/minimap_mouse/draw_erase.dmi' + +/atom/movable/screen/minimap_toolbar_button/erase/on_mouse_drag(x, y) + if(isnull(display) || isnull(display.drawing)) + return FALSE + var/icon_width = display.minimap?.base_map?.Width() + var/icon_height = display.minimap?.base_map?.Height() + if(isnull(icon_width) || isnull(icon_height)) + return FALSE + if(!ISINRANGE(x, 1, icon_width) || !ISINRANGE(y, 1, icon_height)) + last_drag_x = null + last_drag_y = null + return FALSE + + if(last_drag_x && last_drag_y) + display.drawing.draw_line(null, last_drag_x, last_drag_y + display.draw_offset_y, x, y + display.draw_offset_y, MINIMAP_TOOLBAR_ERASE_RANGE, 1) + last_drag_x = x + last_drag_y = y + else + display.drawing.draw_box(null, x, y + display.draw_offset_y, x + 1, y + 1 + display.draw_offset_y, MINIMAP_TOOLBAR_ERASE_RANGE, 1) + last_drag_x = x + last_drag_y = y + return TRUE + +/atom/movable/screen/minimap_toolbar_button/erase/Click(location, control, params) + if(usr == get_mob()) + display?.activate_button(src) + +/// Clear tool — removes all drawings and labels. +/atom/movable/screen/minimap_toolbar_button/clear + icon_state = "clear" + button_slot = 5 + desc = "Clear all drawings." + +/atom/movable/screen/minimap_toolbar_button/clear/is_active() + return FALSE + +/atom/movable/screen/minimap_toolbar_button/clear/Click(location, control, params) + if(usr == get_mob()) + display?.clear_canvas(usr) + +/// Label tool — click the map to place labels, right-click a label to remove it, right-click this button to clear all labels. +/atom/movable/screen/minimap_toolbar_button/label + icon_state = "label" + button_slot = 6 + desc = "Toggle label mode. Click the map to place a label. Right-click a nearby label on the map to remove it. Right-click this button to clear all labels." + mouse_icon = 'icons/ui_icons/minimap/minimap_mouse/label.dmi' + +/atom/movable/screen/minimap_toolbar_button/label/on_click(icon_x, icon_y, right_click) + if(isnull(display)) + return FALSE + if(right_click) + display.remove_nearest_label(icon_x, icon_y, usr) + return TRUE + // Place label asynchronously + INVOKE_ASYNC(display, /atom/movable/screen/minimap_display/proc/async_place_label, usr, icon_x, icon_y) + return TRUE + +/atom/movable/screen/minimap_toolbar_button/label/Click(location, control, params) + if(usr != get_mob()) + return + var/list/modifiers = params2list(params) + if(LAZYACCESS(modifiers, RIGHT_CLICK)) + display.clear_all_annotations(usr, /atom/movable/screen/minimap_element/label) + else + display?.activate_button(src) + +#undef MINIMAP_TOOLBAR_ERASE_RANGE diff --git a/code/modules/minimap/hud/minimap_tracking_blip.dm b/code/modules/minimap/hud/minimap_tracking_blip.dm new file mode 100644 index 00000000000..d7c2d19433c --- /dev/null +++ b/code/modules/minimap/hud/minimap_tracking_blip.dm @@ -0,0 +1,90 @@ +/atom/movable/screen/minimap_element/blip + icon = 'icons/ui_icons/minimap/map_blips.dmi' + /// Is this a large blip? causes different pixel offsets to be applied + var/large = FALSE + /// Minimap datum for the current z-level this blip is on + var/datum/minimap/minimap + /// If we are tracking our target or not, to ensure we do not re-register multiple times + var/tracking = FALSE + /// what target we're essentially owned by, and will cause this blip to cleanup if it gets deleted + var/atom/track_target + /// Weak reference to connect_containers so container movement updates this blip. + var/datum/weakref/connect_ref + +/atom/movable/screen/minimap_element/blip/Initialize(mapload, datum/hud/hud_owner, atom/track_target, icon_state, icon, large = FALSE, blip_tag) + . = ..() + src.icon_state = icon_state + src.large = large + if(icon) + src.icon = icon + if(track_target) + register_target(track_target) + if(blip_tag) + src.blip_tag = blip_tag + +/atom/movable/screen/minimap_element/blip/Destroy() + clear_tracking_signals() + return ..() + +/atom/movable/screen/minimap_element/blip/proc/register_target(atom/target) + if(!isnull(track_target)) + CRASH("[type] attempted to register [target] while already tracking [track_target].") + if(isnull(target)) + CRASH("[type] attempted to register a null track target.") + RegisterSignal(target, COMSIG_QDELETING, TYPE_PROC_REF(/datum, selfdelete), override = TRUE) + track_target = target + name = target.name + +/atom/movable/screen/minimap_element/blip/proc/clear_tracking_signals() + tracking = FALSE + if(track_target) + UnregisterSignal(track_target, list(COMSIG_QDELETING, COMSIG_MOVABLE_Z_CHANGED, COMSIG_MOVABLE_MOVED)) + track_target.maptext = null + track_target = null + QDEL_NULL(connect_ref) + +/atom/movable/screen/minimap_element/blip/proc/start_tracking_target() + if(tracking) + return + if(isnull(track_target)) + CRASH("[type] cannot start tracking without a registered target.") + RegisterSignal(track_target, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(on_target_z_changed)) + RegisterSignal(track_target, COMSIG_MOVABLE_MOVED, PROC_REF(on_tracked_or_container_moved)) + if(ismovable(track_target)) + var/static/list/container_connections = list( + COMSIG_MOVABLE_MOVED = PROC_REF(on_tracked_or_container_moved), + COMSIG_MOVABLE_Z_CHANGED = PROC_REF(on_target_z_changed), + ) + connect_ref = WEAKREF(AddComponent(/datum/component/connect_containers, track_target, container_connections)) + tracking = TRUE + INVOKE_ASYNC(src, PROC_REF(update_minimap)) + +/atom/movable/screen/minimap_element/blip/proc/update_minimap() + var/turf/target_turf = get_turf(track_target) + minimap = get_minimap_for_z(target_turf.z) + update_blip() + +/atom/movable/screen/minimap_element/blip/proc/on_target_z_changed(atom/movable/source, turf/old_turf, turf/new_turf, same_z_layer) + SIGNAL_HANDLER + if(isnull(track_target)) + return + var/turf/target_turf = get_turf(track_target) + if(isnull(minimap) || minimap.z != target_turf?.z) + INVOKE_ASYNC(src, PROC_REF(update_minimap)) + else + update_blip() + +/atom/movable/screen/minimap_element/blip/proc/on_tracked_or_container_moved(atom/movable/source, atom/old_loc) + SIGNAL_HANDLER + update_blip() + +/atom/movable/screen/minimap_element/blip/proc/update_blip() + SIGNAL_HANDLER + if(isnull(track_target) || isnull(minimap)) + return + name = track_target.name + var/turf/target_turf = get_turf(track_target) + var/half_size = large ? 5 : 3 + pixel_w = MINIMAP_WORLD_TO_PIXEL(target_turf.x, minimap.min_x, half_size) + pixel_z = MINIMAP_WORLD_TO_PIXEL(target_turf.y, minimap.min_y, half_size) + diff --git a/code/modules/minimap/minimap.dm b/code/modules/minimap/minimap.dm new file mode 100644 index 00000000000..a893ae13d38 --- /dev/null +++ b/code/modules/minimap/minimap.dm @@ -0,0 +1,84 @@ +/// Assoc list of z-levels to `/datum/minimap` instances. +GLOBAL_ALIST_EMPTY(minimaps) + +/// Represents a minimap for a single Z-level. +/datum/minimap + /// The Z-level this minimap was made for. + VAR_FINAL/z + /// The icon of the base map itself. + var/icon/base_map + /// Mapping of x/y coords to area names. + var/alist/map_position_to_name = alist() + /// Minimum world X coordinate included in the cropped map icon. + var/min_x = 1 + /// Minimum world Y coordinate included in the cropped map icon. + var/min_y = 1 + +/datum/minimap/proc/load_z(z) + . = FALSE + if(!isnum(z) || z > length(SSmapping.z_list)) + CRASH("Tried to create minimap for invalid Z-level ([z])") + + base_map = icon('icons/ui_icons/minimap/minimap.dmi') + src.z = z + + var/min_x = world.maxx + var/min_y = world.maxy + var/max_x = 1 + var/max_y = 1 + + map_position_to_name.Cut() + for(var/turf/location as anything in Z_TURFS(z)) + if(location.skip_minimap_rendering || isshuttleturf(location)) + continue + var/area/arealoc = location.loc + if(arealoc.skip_minimap_rendering) + continue + var/x = location.x + var/y = location.y + min_x = min(min_x, x) + min_y = min(min_y, y) + max_x = max(max_x, x) + max_y = max(max_y, y) + if(location.density) + base_map.DrawBox(location.tacmap_color, x, y) + continue + var/atom/movable/alttarget = (locate(/obj/machinery/door) in location) || (locate(/obj/structure/window) in location) || (locate(/obj/structure/fence) in location) + if(alttarget) + base_map.DrawBox(alttarget.tacmap_color, x, y) + continue + if(arealoc.tacmap_color) + base_map.DrawBox(BlendRGB(location.tacmap_color, arealoc.tacmap_color, 0.5), x, y) + continue + if(istype(location, /turf/open/floor/engine/hull)) + var/turf/turf_below = GET_TURF_BELOW(location) + var/area/below_area = turf_below?.loc + // we'll draw the below area's color but transparent + if(below_area?.tacmap_color) + var/list/below_color = rgb2num(below_area.tacmap_color) + base_map.DrawBox(rgb(below_color[1], below_color[2], below_color[3], 64), x, y) + continue + base_map.DrawBox(location.tacmap_color, x, y) + + src.min_x = min_x + src.min_y = min_y + + base_map.Crop(min_x, min_y, max_x, max_y) + base_map.Scale(base_map.Width() * MINIMAP_PIXEL_MULTIPLIER, base_map.Height() * MINIMAP_PIXEL_MULTIPLIER) + + return TRUE + +/// Gets the `/datum/minimap` for a Z-level - generating it if it hasn't been yet. +/proc/get_minimap_for_z(z) as /datum/minimap + var/static/generating_minimap = FALSE + UNTIL(!generating_minimap) + + if(GLOB.minimaps[z]) + return GLOB.minimaps[z] + + generating_minimap = TRUE + var/datum/minimap/minimap = new + if(minimap.load_z(z)) + GLOB.minimaps[z] = minimap + . = minimap + generating_minimap = FALSE diff --git a/code/modules/minimap/minimap_action.dm b/code/modules/minimap/minimap_action.dm new file mode 100644 index 00000000000..9c25d7bc553 --- /dev/null +++ b/code/modules/minimap/minimap_action.dm @@ -0,0 +1,141 @@ + +/datum/action/minimap + name = "Toggle Minimap" + button_icon = 'icons/hud/implants.dmi' + button_icon_state = "minimap" + /// Mob currently bound to z-change signal handling for auto-hide behavior. + var/mob/tracked_owner + /// Optional fixed z-level that anchors this action's minimap stack and permission checks. + var/fixed_z_level + /// Optional minimap blip tags to render on the rewrite minimap display. + var/list/minimap_blip_tags = list() + /// Optional annotation sharing tag for minimap drawings/labels. + var/annotation_share_tag + /// Whether this action's minimap display should allow drawing tools. + var/can_draw = FALSE + /// list of hud elements we add and remove and check for when this action is triggered + var/list/huds = list( + HUD_TAC_MINIMAP_DIMMER = /atom/movable/screen/fullscreen/dimmer/minimap, + HUD_TAC_MINIMAP = /atom/movable/screen/minimap_display, + HUD_TAC_MINIMAP_Z_INDICATOR = /atom/movable/screen/minimap_z_indicator, + HUD_TAC_MINIMAP_Z_INDICATOR_UP = /atom/movable/screen/minimap_z_up, + HUD_TAC_MINIMAP_Z_INDICATOR_DOWN = /atom/movable/screen/minimap_z_down + ) + +/datum/action/minimap/Trigger(mob/clicker, trigger_flags) + . = ..() + var/datum/hud/hud = clicker.hud_used + // Toggle off if already visible. + if(has_minimap_huds(hud)) + remove_huds(hud) + to_chat(clicker, span_notice("Minimap hidden.")) + return + + if(SEND_SIGNAL(clicker, COMSIG_MINIMAP_ACTION_TRIGGER) & COMSIG_MINIMAP_ACTION_TRIGGER_CANCEL) + return + + var/anchor_z = get_anchor_z_level(clicker?.z) + if(is_forbidden_minimap_z(anchor_z)) + to_chat(clicker, span_warning("The minimap cannot be used on this z-level.")) + clicker.balloon_alert(clicker, "invalid z-level!") + return + var/display_z = get_opening_display_z_level(anchor_z, clicker?.z) + + var/datum/minimap/minimap = get_minimap_for_z(display_z) + if(isnull(minimap)) + clicker.balloon_alert(clicker, "no minimap generated") + return + add_huds(hud, minimap, isnull(fixed_z_level) ? null : display_z) + to_chat(clicker, span_notice("Minimap shown.")) + +/datum/action/minimap/Grant(mob/grant_to) + . = ..() + set_tracked_owner(grant_to) + +/datum/action/minimap/Remove(mob/remove_from) + set_tracked_owner(null) + return ..() + +/datum/action/minimap/proc/has_minimap_huds(datum/hud/hud) + for(var/element in huds) + if(hud.screen_objects[element]) + return TRUE + return FALSE + +/datum/action/minimap/proc/get_open_minimap_display(datum/hud/hud) + if(isnull(hud) || !has_minimap_huds(hud)) + return null + return hud.screen_objects[HUD_TAC_MINIMAP] + +/datum/action/minimap/proc/add_huds(datum/hud/hud, datum/minimap/minimap, initial_display_z_level) + for(var/element in huds) + var/hud_element_type = huds[element] + var/instanced = new hud_element_type(null, hud, minimap, minimap_blip_tags, initial_display_z_level, annotation_share_tag, can_draw) + hud.add_screen_object(instanced, element, HUD_GROUP_STATIC, update_screen = TRUE) + +/datum/action/minimap/proc/set_tracked_owner(mob/new_owner) + if(tracked_owner == new_owner) + return + if(!isnull(tracked_owner)) + UnregisterSignal(tracked_owner, COMSIG_MOVABLE_Z_CHANGED) + tracked_owner = new_owner + if(!isnull(tracked_owner)) + RegisterSignal(tracked_owner, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(on_owner_z_changed)) + +/datum/action/minimap/proc/get_anchor_z_level(current_z_level) + return isnull(fixed_z_level) ? current_z_level : fixed_z_level + + +/datum/action/minimap/proc/get_opening_display_z_level(anchor_z_level, current_z_level) + var/list/connected_levels = SSmapping.get_connected_levels(anchor_z_level) + if(length(connected_levels) && connected_levels.Find(current_z_level)) + return current_z_level + return (length(connected_levels) ? connected_levels[1] : anchor_z_level) + +/datum/action/minimap/proc/is_forbidden_minimap_z(z_level) + if(isnull(z_level)) + return FALSE + return is_centcom_level(z_level) || is_reserved_level(z_level) + +/datum/action/minimap/proc/on_owner_z_changed(atom/movable/source, turf/old_turf, turf/new_turf, same_z_layer) + SIGNAL_HANDLER + INVOKE_ASYNC(src, PROC_REF(handle_owner_z_changed), source, new_turf?.z) + +/datum/action/minimap/proc/handle_owner_z_changed(mob/owner_mob, new_z_level) + var/datum/hud/owner_hud = owner_mob?.hud_used + if(isnull(get_open_minimap_display(owner_hud))) + return + + var/anchor_z = get_anchor_z_level(new_z_level) + if(is_forbidden_minimap_z(anchor_z)) + remove_huds(owner_hud) + to_chat(owner_mob, span_warning("The minimap closes on this z-level.")) + return + if(isnull(fixed_z_level)) + return + + var/display_z = get_opening_display_z_level(anchor_z, new_z_level) + var/atom/movable/screen/minimap_display/display = get_open_minimap_display(owner_hud) + if(isnull(display) || display.get_viewed_z_level() == display_z) + return + var/datum/minimap/minimap = get_minimap_for_z(display_z) + if(QDELETED(src) || isnull(minimap)) + return + display = get_open_minimap_display(owner_hud) + if(isnull(display) || display.get_viewed_z_level() == display_z) + return + display.change_z_level(display_z, minimap) + +/datum/action/minimap/nuclear + annotation_share_tag = MINIMAP_ANNOTATION_TAG_NUCLEAR + huds = list( + HUD_TAC_MINIMAP_DIMMER = /atom/movable/screen/fullscreen/dimmer/minimap, + HUD_TAC_MINIMAP = /atom/movable/screen/minimap_display/nuclear, + HUD_TAC_MINIMAP_Z_INDICATOR = /atom/movable/screen/minimap_z_indicator, + HUD_TAC_MINIMAP_Z_INDICATOR_UP = /atom/movable/screen/minimap_z_up, + HUD_TAC_MINIMAP_Z_INDICATOR_DOWN = /atom/movable/screen/minimap_z_down + ) + +/datum/action/minimap/proc/remove_huds(datum/hud/hud) + for(var/element in huds) + hud.remove_screen_object(element) diff --git a/code/modules/minimap/minimap_table.dm b/code/modules/minimap/minimap_table.dm new file mode 100644 index 00000000000..3af72ea76c4 --- /dev/null +++ b/code/modules/minimap/minimap_table.dm @@ -0,0 +1,225 @@ + +/obj/machinery/minimap_table + name = "reconnaissance platform" + desc = "This holographic projector displays a constant stream of tactical information, enabling cinematic planning and strategizing. \ + Currently, it appears to be monitoring a nearby station and tracking key targets for a clandestine operation." + icon = 'icons/obj/machines/minimap_table.dmi' + icon_state = "off" + processing_flags = START_PROCESSING_MANUALLY + light_range = 4 + light_power = 2 + light_color = LIGHT_COLOR_INTENSE_RED + light_system = OVERLAY_LIGHT + density = TRUE + bound_width = 64 + SET_BASE_PIXEL(0, 2) + /// Hologram icon sheet used for startup/idle/closing projection effects. + var/hologram_icon_file = 'icons/obj/machines/minimap_table_hologram.dmi' + /// Z-trait used to resolve the minimap level this table displays. + var/target_z_trait = ZTRAIT_STATION + /// Cached minimap datum currently displayed by this table. + var/datum/minimap/minimap + /// Users currently viewing the table-projected minimap HUD. + var/list/mob/viewers = list() + /// Whether the table is currently active and projecting. + var/active = FALSE + /// Whether startup animation/state is currently in progress. + var/startup = FALSE + /// Pixel X offset for projected hologram overlays. + var/animation_x = -15 + /// Pixel Y offset for projected hologram overlays. + var/animation_y = 18 + /// Startup/closing animation duration. + var/animation_duration = 5.1 SECONDS + /// Max distance at which users can interact with the table. + var/interactivity_range = 3 + /// Proximity monitor used to close viewers leaving interaction range. + var/datum/proximity_monitor/proximity + /// Light helper used for pulsing hologram illumination. + var/datum/light_middleman/middleman + /// Lowest alpha value used by the pulsing light animation. + var/flicker_min_alpha = 150 + /// HUD elements used by the holotable minimap view. + var/list/table_huds = list( + HUD_TAC_MINIMAP_DIMMER = /atom/movable/screen/fullscreen/dimmer/minimap, + HUD_TAC_MINIMAP = /atom/movable/screen/minimap_display/nuclear, + HUD_TAC_MINIMAP_Z_INDICATOR = /atom/movable/screen/minimap_z_indicator, + HUD_TAC_MINIMAP_Z_INDICATOR_UP = /atom/movable/screen/minimap_z_up, + HUD_TAC_MINIMAP_Z_INDICATOR_DOWN = /atom/movable/screen/minimap_z_down, + ) + +/obj/machinery/minimap_table/Initialize(mapload) + . = ..() + proximity = new(src, interactivity_range) + + if(IS_OVERLAY_LIGHT_SYSTEM(light_system)) + middleman = new(src, "holotable") + RegisterSignal(middleman, COMSIG_LIGHT_MIDDLEMAN_UPDATED, PROC_REF(light_pulsate)) + middleman.being_overriding_light() + +/obj/machinery/minimap_table/Destroy(force) + for(var/mob/viewer as anything in viewers) + remove_table_huds(viewer.hud_used) + viewers = null + QDEL_NULL(proximity) + QDEL_NULL(middleman) + minimap = null + return ..() + +/obj/machinery/minimap_table/post_machine_initialize() + . = ..() + INVOKE_ASYNC(src, PROC_REF(set_minimap)) + +/obj/machinery/minimap_table/RangedAttackOn(mob/attacker, list/modifiers) + if(get_dist(src, attacker) > interactivity_range) + return + interact(attacker) + +/obj/machinery/minimap_table/interact(mob/user) + . = ..() + if(!is_operational || isnull(minimap) || isnull(user.hud_used)) + return FALSE + if(!isnull(user.hud_used.screen_objects[HUD_TAC_MINIMAP])) + hide_minimap(user) + return TRUE + if(active) + show_minimap(user) + return TRUE + + addtimer(CALLBACK(src, PROC_REF(activate), user), animation_duration, TIMER_UNIQUE | TIMER_CLIENT_TIME) + + startup = TRUE + play_animation("startup") + return TRUE + +/obj/machinery/minimap_table/proc/play_animation(icon_state = "startup", duration = animation_duration) + var/image/img = image(hologram_icon_file, src, icon_state, ABOVE_MOB_LAYER, dir, animation_x, animation_y) + var/image/emissive_img = image(hologram_icon_file, src, icon_state, ABOVE_MOB_LAYER, dir, animation_x, animation_y) + emissive_img.plane = EMISSIVE_PLANE + emissive_img.color = _EMISSIVE_COLOR_NO_BLOOM(1) + + flick_overlay_global(img, GLOB.clients, duration) + flick_overlay_global(emissive_img, GLOB.clients, duration) + +/obj/machinery/minimap_table/proc/activate(mob/activator) + if(active || !is_operational) + return + startup = FALSE + active = TRUE + if(activator && get_dist(src, activator) <= interactivity_range) + show_minimap(activator) + update_appearance(UPDATE_OVERLAYS) + light_pulsate() + +/obj/machinery/minimap_table/proc/deactivate() + if(!active) + return + active = FALSE + update_appearance(UPDATE_OVERLAYS) + var/obj/effect/abstract/main_light = middleman.primary_intercept + animate(main_light, time = 1 SECONDS) + play_animation("closing") + +/obj/machinery/minimap_table/proc/light_pulsate() + SIGNAL_HANDLER + var/obj/effect/abstract/main_light = middleman.primary_intercept + var/matrix/center = matrix() + // center it since we're a 2x2 machine + center.Translate(16, 0) + main_light.transform = center + if(!active) + return + + + var/matrix/bigTransform = matrix() + var/matrix/smallTransform = matrix() + smallTransform.Add(center) + bigTransform.Add(center) + + bigTransform.Scale(1.25) + smallTransform.Scale(0.75) + + animate(main_light, alpha = flicker_min_alpha, time = 2 SECONDS, loop = -1, easing = SINE_EASING) + animate(alpha = 255, time = 2 SECONDS) + animate(transform = bigTransform, time = 3 SECONDS, loop = -1, flags = ANIMATION_PARALLEL, easing = SINE_EASING) + animate(transform = smallTransform, time = 3 SECONDS) + +/obj/machinery/minimap_table/proc/deactive_without_viewers() + if(!length(viewers)) + deactivate() + +/obj/machinery/minimap_table/proc/show_minimap(mob/user) + add_table_huds(user.hud_used) + viewers |= user + +/obj/machinery/minimap_table/proc/hide_minimap(mob/user) + remove_table_huds(user.hud_used) + viewers -= user + if(!length(viewers)) + addtimer(CALLBACK(src, PROC_REF(deactive_without_viewers)), 10 SECONDS, TIMER_OVERRIDE | TIMER_UNIQUE) + +/obj/machinery/minimap_table/proc/add_table_huds(datum/hud/hud) + var/target_z = resolve_target_z() + var/allow_draw = can_user_draw(hud?.mymob) + for(var/element in table_huds) + var/hud_element_type = table_huds[element] + var/instanced = new hud_element_type(null, hud, minimap, null, target_z, MINIMAP_ANNOTATION_TAG_NUCLEAR, allow_draw) + hud.add_screen_object(instanced, element, HUD_GROUP_STATIC, update_screen = TRUE) + +/obj/machinery/minimap_table/proc/can_user_draw(mob/user) + return HAS_TRAIT(user, TRAIT_MINIMAP_TABLE_DRAW) + +/obj/machinery/minimap_table/proc/remove_table_huds(datum/hud/hud) + for(var/element in table_huds) + hud.remove_screen_object(element) + +/obj/machinery/minimap_table/proc/resolve_target_z() + if(isnull(target_z_trait)) + return null + var/list/trait_levels = SSmapping.levels_by_trait(target_z_trait) + if(length(trait_levels)) + var/top_level + for(var/level in trait_levels) + if(isnull(top_level) || level > top_level) + top_level = level + return top_level + return null + +/obj/machinery/minimap_table/proc/set_minimap() + var/target_z = resolve_target_z() + minimap = get_minimap_for_z(target_z) + +/obj/machinery/minimap_table/on_set_is_operational() + update_appearance() + set_light_on(is_operational) + + if(!is_operational) + deactivate() + +/obj/machinery/minimap_table/update_overlays() + . = ..() + if(!is_operational) + return + . += mutable_appearance(icon, "idle") + . += emissive_appearance(icon, "idle", src) + if(active) + var/holo_state = "idle" + var/mutable_appearance/idle = mutable_appearance(hologram_icon_file, holo_state, ABOVE_MOB_LAYER) + idle.pixel_x = animation_x + idle.pixel_y = animation_y + . += idle + + var/mutable_appearance/emissive = emissive_appearance(hologram_icon_file, holo_state, src, ABOVE_MOB_LAYER, effect_type = EMISSIVE_NO_BLOOM) + emissive.pixel_x = animation_x + emissive.pixel_y = animation_y + . += emissive + +/obj/machinery/minimap_table/OnProximityExit(atom/movable/gone) + if(!active || !ismob(gone)) + return + var/mob/mob_gone = gone + var/list/adjacent = orange(interactivity_range, src) + if(mob_gone in adjacent) + return + if(mob_gone in viewers) + hide_minimap(gone) diff --git a/code/modules/mob/living/basic/bots/medbot/medbot.dm b/code/modules/mob/living/basic/bots/medbot/medbot.dm index 3e6a22b0c6d..7e2bd3d8574 100644 --- a/code/modules/mob/living/basic/bots/medbot/medbot.dm +++ b/code/modules/mob/living/basic/bots/medbot/medbot.dm @@ -468,6 +468,9 @@ /mob/living/basic/bot/medbot/nukie/Initialize(mapload, new_skin) . = ..() + var/datum/action/minimap/nuclear/tacmap_action = new + tacmap_action.Grant(src) + add_minimap_blip(src, MINIMAP_NUKEOP_BLIP, "mediborg") RegisterSignal(SSdcs, COMSIG_GLOB_NUKE_DEVICE_DISARMED, PROC_REF(nuke_disarm)) RegisterSignal(SSdcs, COMSIG_GLOB_NUKE_DEVICE_ARMED, PROC_REF(nuke_arm)) RegisterSignal(SSdcs, COMSIG_GLOB_NUKE_DEVICE_DETONATING, PROC_REF(nuke_detonate)) diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp.dm b/code/modules/mob/living/basic/space_fauna/carp/carp.dm index d114b6d42a1..f04fa3aea99 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp.dm @@ -252,6 +252,8 @@ var/datum/callback/got_disk = CALLBACK(src, PROC_REF(got_disk)) var/datum/callback/display_disk = CALLBACK(src, PROC_REF(display_disk)) AddComponent(/datum/component/nuclear_bomb_operator, got_disk, display_disk) + var/obj/item/implant/implanter = SSwardrobe.provide_type(/obj/item/implant/tacmap/nuclear/cayenne, src) + implanter.implant(src, null, TRUE) /mob/living/basic/carp/pet/cayenne/apply_colour() if (prob(RARE_CAYENNE_CHANCE)) diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm index af9b1e6d49f..1c755a02078 100644 --- a/code/modules/mob/living/silicon/robot/robot_model.dm +++ b/code/modules/mob/living/silicon/robot/robot_model.dm @@ -920,6 +920,9 @@ ..() var/mob/living/silicon/robot/cyborg = loc cyborg.remove_faction(FACTION_SILICON) //ai turrets + add_minimap_blip(cyborg, MINIMAP_NUKEOP_BORG_BLIP, "combatborg") + var/datum/action/minimap/nuclear/tacmap_action = new + tacmap_action.Grant(cyborg) /obj/item/robot_model/syndicate/remove_module(obj/item/removed_module) ..() @@ -952,6 +955,13 @@ model_traits = list(TRAIT_PUSHIMMUNE) hat_offset = list("north" = list(0, 3), "south" = list(0, 3), "east" = list(-1, 3), "west" = list(1, 3)) +/obj/item/robot_model/syndicate_medical/rebuild_modules() + ..() + var/mob/living/silicon/robot/cyborg = loc + add_minimap_blip(cyborg, MINIMAP_NUKEOP_BORG_BLIP, "mediborg") + var/datum/action/minimap/nuclear/tacmap_action = new + tacmap_action.Grant(cyborg) + /obj/item/robot_model/saboteur name = "Syndicate Saboteur" basic_modules = list( @@ -982,6 +992,13 @@ canDispose = TRUE var/datum/weakref/thermal_vision_ref +/obj/item/robot_model/saboteur/rebuild_modules() + ..() + var/mob/living/silicon/robot/cyborg = loc + add_minimap_blip(cyborg, MINIMAP_NUKEOP_BORG_BLIP, "engiborg") + var/datum/action/minimap/nuclear/tacmap_action = new + tacmap_action.Grant(cyborg) + /datum/action/cooldown/borg_thermal name = "Toggle Thermal Night Vision" button_icon = 'icons/mob/actions/actions_mecha.dmi' diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 594094deefd..79a47f4d244 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -822,6 +822,8 @@ GLOBAL_LIST_INIT(slime_extract_auto_activate_reactions, init_slime_auto_activate var/obj/item/implant/radio/syndicate/imp = new(src) imp.implant(smart_mob, user) smart_mob.AddComponent(/datum/component/simple_access, list(ACCESS_SYNDICATE, ACCESS_MAINT_TUNNELS)) + var/obj/item/implant/implanter = SSwardrobe.provide_type(/obj/item/implant/tacmap/nuclear/cayenne, src) + implanter.implant(src, null, TRUE) /obj/item/slimepotion/sentience/nuclear/dangerous_horse name = "dangerous pony potion" diff --git a/code/modules/uplink/uplink_items/nukeops.dm b/code/modules/uplink/uplink_items/nukeops.dm index 265c43dce65..e008dbca98d 100644 --- a/code/modules/uplink/uplink_items/nukeops.dm +++ b/code/modules/uplink/uplink_items/nukeops.dm @@ -654,7 +654,7 @@ operative team's body-cams. They can also pilot the shuttle remotely and view the station's camera net. \ If you're a meathead who's just here to kill people and don't care about strategising or intel, you'll still have someone to bear witness to your murder-spree!" item = /obj/item/antag_spawner/nuke_ops/overwatch - cost = 12 + cost = 10 purchasable_from = UPLINK_FIREBASE_OPS // ~~ Disposable Sentry Gun ~~ diff --git a/code/modules/vehicles/mecha/combat/gygax.dm b/code/modules/vehicles/mecha/combat/gygax.dm index 974ec17818a..951035fdaa9 100644 --- a/code/modules/vehicles/mecha/combat/gygax.dm +++ b/code/modules/vehicles/mecha/combat/gygax.dm @@ -73,6 +73,10 @@ fire = 100 acid = 100 +/obj/vehicle/sealed/mecha/gygax/dark/Initialize(mapload) + . = ..() + add_minimap_blip(src, MINIMAP_SYNDICATE_MECH_BLIP, "syndiemech") + /obj/vehicle/sealed/mecha/gygax/dark/loaded/Initialize(mapload) . = ..() max_ammo() diff --git a/code/modules/vehicles/mecha/combat/honker.dm b/code/modules/vehicles/mecha/combat/honker.dm index f5ad579cda1..9c63dc71898 100644 --- a/code/modules/vehicles/mecha/combat/honker.dm +++ b/code/modules/vehicles/mecha/combat/honker.dm @@ -60,6 +60,10 @@ MECHA_ARMOR = 2, ) +/obj/vehicle/sealed/mecha/honker/dark/Initialize(mapload, built_manually) + . = ..() + add_minimap_blip(src, MINIMAP_SYNDICATE_MECH_BLIP, "syndiemech") + /obj/vehicle/sealed/mecha/honker/dark/loaded equip_by_category = list( MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/honker, diff --git a/code/modules/vehicles/mecha/combat/marauder.dm b/code/modules/vehicles/mecha/combat/marauder.dm index e0e214242aa..e316de70bf7 100644 --- a/code/modules/vehicles/mecha/combat/marauder.dm +++ b/code/modules/vehicles/mecha/combat/marauder.dm @@ -161,6 +161,10 @@ fire = 100 acid = 100 +/obj/vehicle/sealed/mecha/marauder/mauler/Initialize(mapload) + . = ..() + add_minimap_blip(src, MINIMAP_SYNDICATE_MECH_BLIP, "syndiemech") + /obj/vehicle/sealed/mecha/marauder/mauler/loaded equip_by_category = list( MECHA_L_ARM = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg, diff --git a/config/logging.txt b/config/logging.txt index cd9b38b6203..c116110bd46 100644 --- a/config/logging.txt +++ b/config/logging.txt @@ -50,6 +50,9 @@ LOG_MECHA ## log OOC channel LOG_OOC +## log minimap drawing +LOG_MINIMAP_DRAWING + ## log pda messages LOG_PDA diff --git a/icons/hud/actions.dmi b/icons/hud/actions.dmi index 6d51cc55534..e8385331596 100644 Binary files a/icons/hud/actions.dmi and b/icons/hud/actions.dmi differ diff --git a/icons/hud/implants.dmi b/icons/hud/implants.dmi index b85ab4573ff..64ba66dc406 100644 Binary files a/icons/hud/implants.dmi and b/icons/hud/implants.dmi differ diff --git a/icons/obj/machines/minimap_table.dmi b/icons/obj/machines/minimap_table.dmi new file mode 100644 index 00000000000..bb68f2da612 Binary files /dev/null and b/icons/obj/machines/minimap_table.dmi differ diff --git a/icons/obj/machines/minimap_table_hologram.dmi b/icons/obj/machines/minimap_table_hologram.dmi new file mode 100644 index 00000000000..3e0fe4d2e70 Binary files /dev/null and b/icons/obj/machines/minimap_table_hologram.dmi differ diff --git a/icons/ui_icons/minimap/draw_tools.dmi b/icons/ui_icons/minimap/draw_tools.dmi new file mode 100644 index 00000000000..ba72a74475e Binary files /dev/null and b/icons/ui_icons/minimap/draw_tools.dmi differ diff --git a/icons/ui_icons/minimap/map_blips.dmi b/icons/ui_icons/minimap/map_blips.dmi new file mode 100644 index 00000000000..ce7c1e579c9 Binary files /dev/null and b/icons/ui_icons/minimap/map_blips.dmi differ diff --git a/icons/ui_icons/minimap/map_blips_large.dmi b/icons/ui_icons/minimap/map_blips_large.dmi new file mode 100644 index 00000000000..420551877ae Binary files /dev/null and b/icons/ui_icons/minimap/map_blips_large.dmi differ diff --git a/icons/ui_icons/minimap/minimap.dmi b/icons/ui_icons/minimap/minimap.dmi new file mode 100644 index 00000000000..7eeb5680b90 Binary files /dev/null and b/icons/ui_icons/minimap/minimap.dmi differ diff --git a/icons/ui_icons/minimap/minimap_buttons.dmi b/icons/ui_icons/minimap/minimap_buttons.dmi new file mode 100644 index 00000000000..5f865581561 Binary files /dev/null and b/icons/ui_icons/minimap/minimap_buttons.dmi differ diff --git a/icons/ui_icons/minimap/minimap_mouse/draw_blue.dmi b/icons/ui_icons/minimap/minimap_mouse/draw_blue.dmi new file mode 100644 index 00000000000..bae80afea3c Binary files /dev/null and b/icons/ui_icons/minimap/minimap_mouse/draw_blue.dmi differ diff --git a/icons/ui_icons/minimap/minimap_mouse/draw_erase.dmi b/icons/ui_icons/minimap/minimap_mouse/draw_erase.dmi new file mode 100644 index 00000000000..1290b9e5559 Binary files /dev/null and b/icons/ui_icons/minimap/minimap_mouse/draw_erase.dmi differ diff --git a/icons/ui_icons/minimap/minimap_mouse/draw_purple.dmi b/icons/ui_icons/minimap/minimap_mouse/draw_purple.dmi new file mode 100644 index 00000000000..690bd390167 Binary files /dev/null and b/icons/ui_icons/minimap/minimap_mouse/draw_purple.dmi differ diff --git a/icons/ui_icons/minimap/minimap_mouse/draw_red.dmi b/icons/ui_icons/minimap/minimap_mouse/draw_red.dmi new file mode 100644 index 00000000000..83d06fcd1ac Binary files /dev/null and b/icons/ui_icons/minimap/minimap_mouse/draw_red.dmi differ diff --git a/icons/ui_icons/minimap/minimap_mouse/draw_yellow.dmi b/icons/ui_icons/minimap/minimap_mouse/draw_yellow.dmi new file mode 100644 index 00000000000..5489f87ce42 Binary files /dev/null and b/icons/ui_icons/minimap/minimap_mouse/draw_yellow.dmi differ diff --git a/icons/ui_icons/minimap/minimap_mouse/label.dmi b/icons/ui_icons/minimap/minimap_mouse/label.dmi new file mode 100644 index 00000000000..ad619da8e83 Binary files /dev/null and b/icons/ui_icons/minimap/minimap_mouse/label.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 66d0a665136..7dd74e24b78 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -163,6 +163,7 @@ #include "code\__DEFINES\melee.dm" #include "code\__DEFINES\memory_defines.dm" #include "code\__DEFINES\mergers.dm" +#include "code\__DEFINES\minimap.dm" #include "code\__DEFINES\mining.dm" #include "code\__DEFINES\mob_spawn.dm" #include "code\__DEFINES\mobfactions.dm" @@ -2829,6 +2830,7 @@ #include "code\game\objects\items\implants\implant_spell.dm" #include "code\game\objects\items\implants\implant_stealth.dm" #include "code\game\objects\items\implants\implant_storage.dm" +#include "code\game\objects\items\implants\implant_tacmap.dm" #include "code\game\objects\items\implants\implantcase.dm" #include "code\game\objects\items\implants\implantchair.dm" #include "code\game\objects\items\implants\implanter.dm" @@ -5080,6 +5082,18 @@ #include "code\modules\meteors\meteor_spawning.dm" #include "code\modules\meteors\meteor_types.dm" #include "code\modules\meteors\meteor_waves.dm" +#include "code\modules\minimap\_minimap.dm" +#include "code\modules\minimap\minimap.dm" +#include "code\modules\minimap\minimap_action.dm" +#include "code\modules\minimap\minimap_table.dm" +#include "code\modules\minimap\hud\minimal_z_level.dm" +#include "code\modules\minimap\hud\minimap_dimmer.dm" +#include "code\modules\minimap\hud\minimap_display.dm" +#include "code\modules\minimap\hud\minimap_drawing.dm" +#include "code\modules\minimap\hud\minimap_element.dm" +#include "code\modules\minimap\hud\minimap_label.dm" +#include "code\modules\minimap\hud\minimap_toolbar.dm" +#include "code\modules\minimap\hud\minimap_tracking_blip.dm" #include "code\modules\mining\aux_base.dm" #include "code\modules\mining\fulton.dm" #include "code\modules\mining\machine_processing.dm"