diff --git a/.gitignore b/.gitignore
index e80270c70c..172b470be4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -202,6 +202,3 @@ tools/MapAtmosFixer/MapAtmosFixer/bin/*
#Jukebox audio files
/config/jukebox_music/**/*
-_maps/map_files/nanostation/nanostation.dmm
-_maps/nanostation.dm
-_maps/nanotstation.json
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_puzzle.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_puzzle.dmm
new file mode 100644
index 0000000000..911ee904fe
--- /dev/null
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_puzzle.dmm
@@ -0,0 +1,47 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/lavaland/surface/outdoors)
+"b" = (
+/obj/effect/sliding_puzzle/lavaland,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"c" = (
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+
+(1,1,1) = {"
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+c
+c
+c
+a
+"}
+(3,1,1) = {"
+a
+c
+b
+c
+a
+"}
+(4,1,1) = {"
+a
+c
+c
+c
+a
+"}
+(5,1,1) = {"
+a
+a
+a
+a
+a
+"}
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index e00b845e55..6b0804c3ee 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -7198,7 +7198,7 @@
dir = 10
},
/turf/open/floor/plasteel/dark,
-/area/bridge)
+/area/ai_monitored/turret_protected/aisat_interior)
"atN" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 5
@@ -7278,7 +7278,7 @@
req_access_txt = "10;13"
},
/turf/open/floor/plating,
-/area/bridge)
+/area/ai_monitored/turret_protected/aisat_interior)
"aua" = (
/obj/structure/closet/secure_closet/freezer/money,
/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka,
@@ -8052,7 +8052,7 @@
/turf/open/floor/plasteel/vault{
dir = 5
},
-/area/bridge)
+/area/ai_monitored/turret_protected/aisat_interior)
"avR" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -8136,7 +8136,7 @@
req_access_txt = "10;13"
},
/turf/open/floor/plating,
-/area/bridge)
+/area/ai_monitored/turret_protected/aisat_interior)
"awd" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -8967,7 +8967,7 @@
},
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel/dark,
-/area/bridge)
+/area/ai_monitored/turret_protected/aisat_interior)
"ayf" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -16023,22 +16023,13 @@
},
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
-"aQA" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/hallway/primary/central)
"aQB" = (
-/obj/structure/disposalpipe/junction/flip{
- dir = 8
- },
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 8
},
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aQC" = (
@@ -24471,18 +24462,11 @@
},
/area/medical/medbay/central)
"bmB" = (
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-21";
- pixel_y = 3
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 5
},
-/obj/structure/sign/poster/official/random{
- pixel_y = -32
- },
-/turf/open/floor/plasteel/yellow/corner{
- dir = 1
+/turf/open/floor/plasteel/blue/corner{
+ dir = 8
},
/area/hallway/primary/central)
"bmC" = (
@@ -26314,39 +26298,27 @@
"brl" = (
/obj/item/reagent_containers/glass/beaker/large,
/obj/item/reagent_containers/glass/beaker/large,
-/obj/structure/table/glass,
/obj/item/reagent_containers/glass/beaker/large,
/obj/item/reagent_containers/glass/beaker/large,
/obj/item/reagent_containers/dropper,
/obj/item/reagent_containers/dropper,
+/obj/structure/table,
/turf/open/floor/plasteel/whiteyellow/side{
dir = 1
},
/area/medical/chemistry)
"brm" = (
/obj/machinery/chem_master,
-/obj/machinery/button/door{
- id = "chemistry_shutters";
- name = "Shutters Control";
- pixel_x = 26;
- pixel_y = 4;
- req_access_txt = "5; 33"
+/obj/machinery/requests_console{
+ department = "Chemistry";
+ departmentType = 2;
+ pixel_x = 32;
+ receive_ore_updates = 1
},
/turf/open/floor/plasteel/whiteyellow/side{
dir = 5
},
/area/medical/chemistry)
-"bro" = (
-/obj/structure/plasticflaps/opaque,
-/obj/effect/turf_decal/delivery,
-/turf/open/floor/plasteel,
-/area/maintenance/department/engine)
-"brp" = (
-/obj/item/storage/toolbox/mechanical,
-/turf/open/floor/plasteel/whitepurple/side{
- dir = 1
- },
-/area/science/lab)
"brq" = (
/obj/structure/sink/kitchen{
desc = "A sink used for washing one's hands and face. It looks rusty and home-made";
@@ -26354,6 +26326,7 @@
pixel_y = 28
},
/obj/item/stack/cable_coil/orange,
+/obj/item/storage/toolbox/mechanical,
/turf/open/floor/plasteel/whitepurple/side{
dir = 1
},
@@ -26917,7 +26890,7 @@
/area/medical/chemistry)
"bsL" = (
/obj/item/storage/box/beakers,
-/obj/structure/table/glass,
+/obj/structure/table,
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"bsM" = (
@@ -27453,7 +27426,6 @@
/turf/open/floor/plasteel/whiteblue/corner,
/area/medical/medbay/central)
"buj" = (
-/obj/machinery/chem_heater,
/obj/machinery/light{
dir = 8
},
@@ -27464,21 +27436,22 @@
c_tag = "Chemistry";
dir = 4
},
+/obj/structure/disposalpipe/trunk{
+ dir = 4
+ },
+/obj/machinery/disposal/bin,
/turf/open/floor/plasteel/whiteyellow/corner{
dir = 1
},
/area/medical/chemistry)
"buk" = (
/obj/structure/disposalpipe/segment{
- dir = 6
+ dir = 10
},
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"bul" = (
-/obj/structure/disposalpipe/trunk{
- dir = 8
- },
-/obj/machinery/disposal/bin,
+/obj/machinery/chem_heater,
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"bum" = (
@@ -27486,8 +27459,12 @@
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"bun" = (
-/turf/open/floor/plasteel/whiteyellow/corner{
- dir = 4
+/obj/machinery/firealarm{
+ dir = 4;
+ pixel_x = 28
+ },
+/turf/open/floor/plasteel/whiteyellow/side{
+ dir = 5
},
/area/medical/chemistry)
"bup" = (
@@ -27894,11 +27871,13 @@
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"bvu" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
},
-/turf/closed/wall,
-/area/maintenance/department/engine)
+/turf/open/floor/plasteel/blue/corner{
+ dir = 8
+ },
+/area/hallway/primary/aft)
"bvw" = (
/obj/machinery/computer/rdconsole/core{
dir = 4
@@ -28464,18 +28443,12 @@
/obj/item/hand_labeler,
/obj/item/clothing/glasses/science,
/obj/item/clothing/glasses/science,
-/obj/machinery/light_switch{
- pixel_x = 25
- },
/turf/open/floor/plasteel/whiteyellow/side{
dir = 6
},
/area/medical/chemistry)
"bxa" = (
/obj/structure/table/glass,
-/obj/structure/extinguisher_cabinet{
- pixel_x = -24
- },
/obj/item/book/manual/research_and_development,
/obj/item/disk/tech_disk,
/obj/item/disk/design_disk,
@@ -29174,14 +29147,6 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
-"byy" = (
-/obj/structure/chair/office/light{
- dir = 4
- },
-/turf/open/floor/plasteel/whiteyellow/side{
- dir = 4
- },
-/area/medical/chemistry)
"byz" = (
/obj/structure/window/reinforced{
dir = 8;
@@ -29215,28 +29180,34 @@
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"byD" = (
-/obj/structure/disposalpipe/segment{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
},
/obj/structure/cable{
icon_state = "2-4"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/machinery/door/airlock/research{
+ name = "R&D Lab";
+ req_access_txt = "0";
+ req_one_access_txt = "7;29;30"
+ },
+/obj/effect/turf_decal/delivery,
+/obj/structure/disposalpipe/segment{
dir = 6
},
-/turf/open/floor/plasteel/dark,
+/turf/open/floor/plasteel,
/area/science/lab)
"byE" = (
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/structure/cable{
- icon_state = "4-8"
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/plasteel/whitepurple/side,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plasteel/dark,
/area/science/lab)
"byF" = (
/obj/structure/chair/office/light{
@@ -29905,21 +29876,14 @@
},
/obj/item/stack/cable_coil/random,
/obj/item/book/manual/wiki/chemistry,
-/turf/open/floor/plasteel/whiteyellow/side,
-/area/medical/chemistry)
-"bAh" = (
-/obj/structure/table/glass,
+/obj/item/grenade/chem_grenade,
+/obj/item/grenade/chem_grenade,
/obj/item/stack/sheet/mineral/plasma{
amount = 2;
layer = 2.9
},
-/obj/item/grenade/chem_grenade,
-/obj/item/grenade/chem_grenade,
-/obj/item/grenade/chem_grenade,
/obj/item/screwdriver,
-/turf/open/floor/plasteel/whiteyellow/side{
- dir = 6
- },
+/turf/open/floor/plasteel/whiteyellow/side,
/area/medical/chemistry)
"bAi" = (
/obj/machinery/smoke_machine,
@@ -29935,24 +29899,16 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/structure/sign/poster/random{
- pixel_y = 32
- },
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"bAm" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Research Lab Maintenance";
- req_access_txt = "0";
- req_one_access_txt = "7;29"
- },
/obj/structure/disposalpipe/segment,
/obj/structure/cable{
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/department/engine)
+/turf/closed/wall/r_wall,
+/area/hallway/primary/aft)
"bAo" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/shutters/preopen{
@@ -30263,15 +30219,20 @@
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 8
},
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
/turf/open/floor/plasteel/whiteblue/side{
dir = 8
},
/area/medical/medbay/central)
"bBf" = (
-/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 8
},
+/obj/structure/disposalpipe/junction/flip{
+ dir = 1
+ },
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"bBg" = (
@@ -31333,8 +31294,10 @@
/obj/machinery/light/small{
dir = 4
},
-/turf/open/floor/plating,
-/area/maintenance/department/engine)
+/turf/open/floor/plasteel/purple/side{
+ icon_state = "purplecorner"
+ },
+/area/hallway/primary/aft)
"bDB" = (
/obj/machinery/airalarm/unlocked{
dir = 4;
@@ -31946,8 +31909,10 @@
},
/obj/item/stock_parts/matter_bin,
/obj/item/stock_parts/matter_bin,
-/turf/open/floor/plating,
-/area/maintenance/department/engine)
+/turf/open/floor/plasteel/purple/side{
+ icon_state = "purplecorner"
+ },
+/area/hallway/primary/aft)
"bER" = (
/obj/machinery/computer/mecha{
dir = 4
@@ -33900,6 +33865,7 @@
/obj/structure/sign/departments/engineering{
pixel_y = -32
},
+/obj/machinery/door/firedoor,
/turf/open/floor/plasteel/green/side,
/area/hallway/primary/aft)
"bJE" = (
@@ -46330,13 +46296,6 @@
/obj/item/flashlight/lantern,
/turf/open/floor/plasteel/dark,
/area/chapel/main/monastery)
-"cwP" = (
-/obj/machinery/firealarm{
- dir = 4;
- pixel_x = 28
- },
-/turf/closed/wall,
-/area/medical/chemistry)
"cwR" = (
/obj/structure/window/reinforced{
dir = 8;
@@ -47248,6 +47207,16 @@
},
/turf/open/floor/plasteel,
/area/science/explab)
+"cKV" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/machinery/airalarm{
+ dir = 4;
+ pixel_x = -23
+ },
+/turf/open/floor/plasteel/blue/corner{
+ dir = 8
+ },
+/area/hallway/primary/aft)
"cOp" = (
/obj/item/clothing/mask/gas,
/obj/item/clothing/mask/gas,
@@ -47386,8 +47355,8 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/plating,
-/area/maintenance/department/engine)
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"dgz" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -47415,8 +47384,14 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/plating,
-/area/maintenance/department/engine)
+/obj/structure/chair{
+ dir = 8;
+ name = "Defense"
+ },
+/turf/open/floor/plasteel/purple/side{
+ icon_state = "purplecorner"
+ },
+/area/hallway/primary/aft)
"dir" = (
/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 5
@@ -47607,6 +47582,22 @@
icon_state = "platingdmg1"
},
/area/maintenance/department/engine)
+"dHZ" = (
+/obj/structure/chair/office/light{
+ dir = 1
+ },
+/obj/effect/landmark/start/chemist,
+/obj/machinery/button/door{
+ id = "chemistry_shutters";
+ name = "Shutters Control";
+ pixel_x = 26;
+ pixel_y = 4;
+ req_access_txt = "5; 33"
+ },
+/turf/open/floor/plasteel/whiteyellow/side{
+ dir = 1
+ },
+/area/medical/chemistry)
"dJm" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -47739,14 +47730,8 @@
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"eeF" = (
-/obj/structure/chair{
- dir = 8
- },
-/obj/structure/sign/poster/official/random{
- pixel_y = -32
- },
-/turf/open/floor/plasteel/yellow/corner{
- dir = 4
+/turf/open/floor/plasteel/purple/side{
+ icon_state = "purplecorner"
},
/area/hallway/primary/central)
"eeQ" = (
@@ -47859,7 +47844,7 @@
dir = 1
},
/turf/open/floor/plasteel/neutral,
-/area/maintenance/department/security/brig)
+/area/hallway/secondary/exit/departure_lounge)
"eCw" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -47966,6 +47951,11 @@
icon_state = "platingdmg3"
},
/area/maintenance/department/security/brig)
+"eRp" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"eSL" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/item/beacon,
@@ -48026,8 +48016,8 @@
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 1
},
-/turf/open/floor/plating,
-/area/maintenance/department/engine)
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"fdS" = (
/obj/machinery/door/window/southleft{
base_state = "left";
@@ -48423,8 +48413,8 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 4
},
-/turf/open/floor/plating,
-/area/maintenance/department/engine)
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"gkX" = (
/obj/machinery/door/airlock/maintenance{
name = "Storage";
@@ -48557,6 +48547,15 @@
/obj/item/flashlight/lamp/green,
/turf/open/floor/carpet,
/area/lawoffice)
+"gDR" = (
+/obj/machinery/camera{
+ c_tag = "Central Primary Hallway Escape";
+ dir = 4
+ },
+/turf/open/floor/plasteel/blue/corner{
+ dir = 8
+ },
+/area/hallway/primary/aft)
"gDZ" = (
/obj/effect/turf_decal/box/corners{
dir = 1
@@ -48601,12 +48600,6 @@
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
"gGA" = (
-/obj/machinery/requests_console{
- department = "Chemistry";
- departmentType = 2;
- pixel_x = 32;
- receive_ore_updates = 1
- },
/obj/structure/table/glass,
/obj/machinery/reagentgrinder,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -48919,6 +48912,14 @@
},
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
+"hIZ" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 1
+ },
+/turf/open/floor/plasteel/blue/corner{
+ dir = 8
+ },
+/area/hallway/primary/aft)
"hOx" = (
/obj/structure/cable{
icon_state = "2-4"
@@ -49108,6 +49109,12 @@
/obj/machinery/processor/slime,
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
+"imE" = (
+/turf/open/floor/plasteel/purple/side{
+ icon_state = "purple";
+ dir = 4
+ },
+/area/hallway/primary/aft)
"ioj" = (
/obj/effect/turf_decal/stripes/line{
dir = 10
@@ -49151,6 +49158,12 @@
dir = 8
},
/area/science/xenobiology)
+"iwe" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/turf/open/floor/plasteel/blue/corner{
+ dir = 8
+ },
+/area/hallway/primary/aft)
"iyg" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -49537,12 +49550,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
},
-/obj/structure/sign/poster/random{
- pixel_y = 32
- },
-/obj/item/twohanded/required/kirbyplants{
- icon_state = "plant-17"
- },
/obj/structure/sign/poster/official/random{
pixel_x = -32
},
@@ -49624,10 +49631,6 @@
},
/turf/open/floor/plating,
/area/maintenance/department/science)
-"jSA" = (
-/obj/structure/sign/departments/science,
-/turf/closed/wall,
-/area/maintenance/department/engine)
"jTh" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -49693,6 +49696,10 @@
icon_state = "platingdmg3"
},
/area/maintenance/department/engine)
+"jZG" = (
+/obj/effect/spawner/structure/window,
+/turf/open/floor/plating,
+/area/medical/chemistry)
"kfh" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 9
@@ -50059,6 +50066,14 @@
},
/turf/open/floor/plating/airless,
/area/engine/engineering)
+"kYM" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 27
+ },
+/turf/open/floor/plasteel/purple/side{
+ icon_state = "purplecorner"
+ },
+/area/hallway/primary/aft)
"lcU" = (
/obj/effect/turf_decal/stripes/line{
dir = 5
@@ -50127,6 +50142,11 @@
/obj/machinery/door/firedoor,
/turf/open/floor/plasteel/dark,
/area/library/lounge)
+"ltE" = (
+/turf/open/floor/plasteel/purple/side{
+ icon_state = "purplecorner"
+ },
+/area/hallway/primary/aft)
"lzJ" = (
/obj/structure/closet/crate/bin,
/turf/open/floor/carpet,
@@ -50221,6 +50241,12 @@
/obj/item/wrench,
/turf/open/floor/plating,
/area/maintenance/department/science)
+"lJI" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/structure/disposalpipe/segment,
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"lKL" = (
/obj/machinery/door/airlock/abandoned{
name = "Starboard Emergency Storage";
@@ -50347,12 +50373,6 @@
dir = 1
},
/area/engine/engineering)
-"mcf" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/chemistry)
"mci" = (
/obj/machinery/portable_atmospherics/canister/toxins,
/obj/structure/disposalpipe/segment{
@@ -50382,6 +50402,19 @@
},
/turf/open/floor/plating,
/area/engine/engineering)
+"mhn" = (
+/obj/machinery/door/firedoor,
+/obj/structure/sign/poster/random{
+ pixel_x = 32
+ },
+/turf/open/floor/plasteel/purple/side{
+ icon_state = "purplecorner"
+ },
+/area/hallway/primary/aft)
+"mjn" = (
+/obj/machinery/jukebox,
+/turf/open/floor/plasteel/dark,
+/area/crew_quarters/bar)
"mlr" = (
/obj/structure/lattice,
/obj/structure/disposalpipe/junction{
@@ -50423,6 +50456,18 @@
dir = 1
},
/area/science/xenobiology)
+"mqp" = (
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = -28
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/plasteel/blue/corner{
+ dir = 8
+ },
+/area/hallway/primary/aft)
"msX" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
@@ -50696,9 +50741,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/dark,
/area/chapel/office)
-"nnf" = (
-/turf/open/floor/plasteel/whiteyellow/side,
-/area/medical/chemistry)
"nnh" = (
/obj/structure/chair{
dir = 8
@@ -50981,6 +51023,11 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/wood,
/area/lawoffice)
+"nTr" = (
+/turf/open/floor/plasteel/blue/corner{
+ dir = 8
+ },
+/area/hallway/primary/aft)
"nVU" = (
/obj/item/twohanded/spear,
/turf/open/floor/plating,
@@ -51518,8 +51565,8 @@
"phJ" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/department/engine)
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"pjH" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -51589,6 +51636,13 @@
},
/turf/open/space/basic,
/area/space/nearstation)
+"pxD" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/effect/spawner/structure/window,
+/turf/open/floor/plating,
+/area/medical/chemistry)
"pBD" = (
/obj/structure/cable{
icon_state = "0-8"
@@ -51691,12 +51745,6 @@
},
/turf/closed/wall/r_wall,
/area/medical/virology)
-"pSc" = (
-/obj/machinery/chem_heater,
-/turf/open/floor/plasteel/whiteyellow/side{
- dir = 5
- },
-/area/medical/chemistry)
"pVD" = (
/obj/machinery/light/small{
dir = 1
@@ -51767,6 +51815,9 @@
/obj/item/twohanded/required/kirbyplants{
icon_state = "plant-03"
},
+/obj/structure/extinguisher_cabinet{
+ pixel_x = -24
+ },
/turf/open/floor/plasteel/dark,
/area/science/lab)
"pYC" = (
@@ -52027,6 +52078,15 @@
/obj/effect/turf_decal/stripes/corner,
/turf/open/floor/plating/airless,
/area/engine/engineering)
+"qTV" = (
+/obj/item/radio/intercom{
+ name = "Station Intercom (General)";
+ pixel_x = -27
+ },
+/turf/open/floor/plasteel/blue/corner{
+ dir = 8
+ },
+/area/hallway/primary/aft)
"qUw" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/neutral,
@@ -52683,6 +52743,16 @@
},
/turf/open/space,
/area/engine/engineering)
+"sYQ" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"sZh" = (
/obj/structure/closet/crate,
/turf/open/floor/plating,
@@ -52843,6 +52913,14 @@
icon_state = "panelscorched"
},
/area/maintenance/department/security/brig)
+"tqO" = (
+/obj/structure/sign/poster/official/random{
+ pixel_x = -32
+ },
+/turf/open/floor/plasteel/blue/corner{
+ dir = 8
+ },
+/area/hallway/primary/aft)
"tqX" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
@@ -52919,6 +52997,10 @@
},
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
+"tzH" = (
+/obj/effect/spawner/structure/window,
+/turf/open/floor/plating,
+/area/science/lab)
"tAK" = (
/obj/structure/table,
/obj/structure/window/reinforced{
@@ -52951,6 +53033,11 @@
},
/turf/open/floor/plating/airless,
/area/engine/engineering)
+"tJr" = (
+/obj/structure/plasticflaps/opaque,
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel,
+/area/science/lab)
"tPm" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -52970,8 +53057,8 @@
/area/maintenance/department/science)
"tTl" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/department/engine)
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"tXn" = (
/obj/structure/sink{
dir = 4;
@@ -53200,6 +53287,28 @@
/obj/machinery/field/generator,
/turf/open/floor/plating,
/area/maintenance/department/engine)
+"uxP" = (
+/obj/structure/disposalpipe/segment{
+ dir = 9
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
+/obj/structure/chair{
+ dir = 8;
+ name = "Defense"
+ },
+/obj/machinery/camera{
+ c_tag = "Atmospherics Starboard";
+ dir = 8
+ },
+/turf/open/floor/plasteel/purple/side{
+ icon_state = "purplecorner"
+ },
+/area/hallway/primary/aft)
"uzn" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/obj/structure/cable{
@@ -53440,6 +53549,20 @@
},
/turf/open/floor/plating,
/area/maintenance/department/cargo)
+"vsG" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/door/airlock/maintenance{
+ name = "Research Lab Maintenance";
+ req_access_txt = "0";
+ req_one_access_txt = "7;29"
+ },
+/turf/open/floor/plating,
+/area/maintenance/department/engine)
"vsJ" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel/neutral/corner{
@@ -53495,6 +53618,14 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness/recreation)
+"vzA" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/plasteel/blue/corner{
+ dir = 8
+ },
+/area/hallway/primary/aft)
"vzP" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
@@ -53550,6 +53681,15 @@
},
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
+"vKq" = (
+/obj/machinery/door/firedoor,
+/obj/structure/sign/poster/official/random{
+ pixel_x = -32
+ },
+/turf/open/floor/plasteel/blue/corner{
+ dir = 8
+ },
+/area/hallway/primary/aft)
"vMx" = (
/obj/structure/disposalpipe/segment{
dir = 6
@@ -54121,12 +54261,10 @@
/turf/open/floor/plasteel/dark,
/area/library)
"xje" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/plating,
-/area/maintenance/department/engine)
+/obj/machinery/door/firedoor,
+/turf/open/floor/plasteel,
+/area/hallway/primary/aft)
"xjK" = (
/obj/item/radio/intercom{
name = "Station Intercom (General)";
@@ -54276,11 +54414,13 @@
/obj/structure/sign/poster/official/random{
pixel_x = -32
},
-/obj/structure/chair{
- dir = 4
+/obj/machinery/light{
+ dir = 8
},
-/turf/open/floor/plating,
-/area/maintenance/department/engine)
+/turf/open/floor/plasteel/blue/corner{
+ dir = 8
+ },
+/area/hallway/primary/aft)
"xFl" = (
/obj/machinery/power/apc/highcap/five_k{
dir = 1;
@@ -78201,7 +78341,7 @@ aAL
aMR
aAL
aAL
-aQA
+aHE
aAL
aAL
aTO
@@ -85423,7 +85563,7 @@ bmz
bnG
boN
bpW
-brk
+dHZ
bsK
buk
bvs
@@ -85942,8 +86082,8 @@ bsM
bum
bvt
bwV
-byy
-bAh
+byz
+ooh
bpY
bCA
bDy
@@ -86174,7 +86314,7 @@ aSS
aUg
aVf
aWi
-bah
+mjn
aYe
aZb
bag
@@ -86197,10 +86337,10 @@ bpV
brm
bsN
bun
-mcf
-nnf
-byz
-ooh
+gGA
+bwW
+byA
+bAi
bpY
bCB
bDz
@@ -86452,14 +86592,14 @@ bmA
bjd
bpY
bpY
-cwP
-pSc
-gGA
-bwW
-byA
-bAi
bpY
-pwj
+bpY
+pxD
+jZG
+bpY
+bpY
+bpY
+vsG
bva
bva
bva
@@ -86707,19 +86847,19 @@ bls
aBI
aBI
bmB
-bva
-bsn
-bva
-bva
+vKq
+nTr
+gDR
+vzA
bvu
-bva
-bva
-bva
-bva
-pwj
-hVx
+hIZ
+tqO
+mqp
+cKV
+iwe
+qTV
xDj
-bva
+blt
jCv
bOK
bEN
@@ -86976,7 +87116,7 @@ tTl
dgg
phJ
phJ
-xje
+lJI
bAk
bIt
bJB
@@ -87221,19 +87361,19 @@ blu
aDZ
aDZ
eeF
-bBX
-bBX
-bBX
-bro
-bBX
-bBX
-bBX
-bBX
-bva
+mhn
+ltE
+ltE
+ltE
+ltE
+ltE
+imE
+kYM
+bmC
fdQ
-npE
-npE
-bFZ
+bmD
+bmD
+eRp
bAl
bIu
bJC
@@ -87479,20 +87619,20 @@ blt
cqh
bKM
cCl
-pYw
-gFo
-cSK
-duF
-bxa
+cCl
+cCl
+tJr
+tzH
+tzH
byD
bAm
dhz
-bCD
+uxP
bDA
bEQ
-jSA
-bHg
-bIv
+bGa
+bHp
+sYQ
bJD
bBo
bBo
@@ -87736,11 +87876,11 @@ bmC
cqi
boP
bqb
-brp
-byF
-cCt
-byF
-cCt
+pYw
+gFo
+cSK
+duF
+bxa
byE
bBp
bBp
@@ -87994,9 +88134,9 @@ cqi
boQ
cCl
brq
+byF
cCt
-cCt
-cCt
+byF
bxc
nIU
bAo
diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm
index 255464d406..d43addf25a 100644
--- a/code/__DEFINES/admin.dm
+++ b/code/__DEFINES/admin.dm
@@ -70,6 +70,7 @@
#define ADMIN_PUNISHMENT_FIREBALL "Fireball"
#define ADMIN_PUNISHMENT_ROD "Immovable Rod"
#define ADMIN_PUNISHMENT_SUPPLYPOD "Supply Pod"
+#define ADMIN_PUNISHMENT_MAZING "Puzzle"
#define AHELP_ACTIVE 1
#define AHELP_CLOSED 2
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index f1b62745ed..b2335129d7 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -23,6 +23,8 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
//define THIS_PROC_TYPE_WEIRD_STR "[THIS_PROC_TYPE_WEIRD]" //Included for completeness
//define THIS_PROC_TYPE_WEIRD_STR_WITH_ARGS "[THIS_PROC_TYPE_WEIRD]([args.Join(",")])" //Ditto
+#define NOT_IMPLEMENTED "NOT_IMPLEMENTED"
+
#define MIDNIGHT_ROLLOVER 864000 //number of deciseconds in a day
#define JANUARY 1
@@ -452,8 +454,13 @@ GLOBAL_LIST_INIT(pda_styles, list(MONO, VT, ORBITRON, SHARE))
#define PDAIMG(what) {""}
//Filters
-#define AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-2, size=4, border=4, color="#04080FAA")
-
+#define AMBIENT_OCCLUSION list("type"="drop_shadow","x"=0,"y"=-2,"size"=4,"border"=4,"color"="#04080FAA")
+#define EYE_BLUR list("type"="blur", "size"=3)
+#define GRAVITY_MOTION_BLUR list("type"="motion_blur","x"=0,"y"=0)
#define STANDARD_GRAVITY 1 //Anything above this is high gravity, anything below no grav
-#define GRAVITY_DAMAGE_TRESHOLD 3 //Starting with this value gravity will start to damage mobs
\ No newline at end of file
+#define GRAVITY_DAMAGE_TRESHOLD 3 //Starting with this value gravity will start to damage mobs
+
+#define CAMERA_NO_GHOSTS 0
+#define CAMERA_SEE_GHOSTS_BASIC 1
+#define CAMERA_SEE_GHOSTS_ORBIT 2
diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm
index 9a8a249159..aed2e9c749 100644
--- a/code/__HELPERS/icons.dm
+++ b/code/__HELPERS/icons.dm
@@ -931,15 +931,6 @@ world
flat_icon.AddAlphaMask(alpha_mask)//Finally, let's mix in a distortion effect.
return flat_icon
-//For photo camera.
-/proc/build_composite_icon(atom/A)
- var/icon/composite = icon(A.icon, A.icon_state, A.dir, 1)
- for(var/O in A.overlays)
- var/image/I = O
- composite.Blend(icon(I.icon, I.icon_state, I.dir, 1), ICON_OVERLAY)
- return composite
-
-
//What the mob looks like as animated static
//By vg's ComicIronic
/proc/getStaticIcon(icon/A, safety = TRUE)
diff --git a/code/__HELPERS/priority_announce.dm b/code/__HELPERS/priority_announce.dm
index bbaf7b275d..8819eb4d04 100644
--- a/code/__HELPERS/priority_announce.dm
+++ b/code/__HELPERS/priority_announce.dm
@@ -19,7 +19,7 @@
announcement += "
[sender_override]
"
if (title && length(title) > 0)
announcement += "
[html_encode(title)]
"
-
+
if(!sender_override)
if(title == "")
GLOB.news_network.SubmitArticle(text, "Central Command Update", "Station Announcements", null)
@@ -46,7 +46,7 @@
var/datum/comm_message/M = new
M.title = title
M.content = text
-
+
SScommunications.send_message(M)
/proc/minor_announce(message, title = "Attention:", alert)
diff --git a/code/__HELPERS/qdel.dm b/code/__HELPERS/qdel.dm
new file mode 100644
index 0000000000..9bd0d4c95f
--- /dev/null
+++ b/code/__HELPERS/qdel.dm
@@ -0,0 +1,10 @@
+#define QDEL_IN(item, time) addtimer(CALLBACK(GLOBAL_PROC, .proc/qdel, item), time, TIMER_STOPPABLE)
+#define QDEL_IN_CLIENT_TIME(item, time) addtimer(CALLBACK(GLOBAL_PROC, .proc/qdel, item), time, TIMER_STOPPABLE | TIMER_CLIENT_TIME)
+#define QDEL_NULL(item) qdel(item); item = null
+#define QDEL_LIST(L) if(L) { for(var/I in L) qdel(I); L.Cut(); }
+#define QDEL_LIST_IN(L, time) addtimer(CALLBACK(GLOBAL_PROC, .proc/______qdel_list_wrapper, L), time, TIMER_STOPPABLE)
+#define QDEL_LIST_ASSOC(L) if(L) { for(var/I in L) { qdel(L[I]); qdel(I); } L.Cut(); }
+#define QDEL_LIST_ASSOC_VAL(L) if(L) { for(var/I in L) qdel(L[I]); L.Cut(); }
+
+/proc/______qdel_list_wrapper(list/L) //the underscores are to encourage people not to use this directly.
+ QDEL_LIST(L)
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 273e1cf1b7..f7aac6123e 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1293,19 +1293,6 @@ GLOBAL_REAL_VAR(list/stack_trace_storage)
#define RANDOM_COLOUR (rgb(rand(0,255),rand(0,255),rand(0,255)))
-#define QDEL_IN(item, time) addtimer(CALLBACK(GLOBAL_PROC, .proc/qdel, item), time, TIMER_STOPPABLE)
-#define QDEL_IN_CLIENT_TIME(item, time) addtimer(CALLBACK(GLOBAL_PROC, .proc/qdel, item), time, TIMER_STOPPABLE | TIMER_CLIENT_TIME)
-#define QDEL_NULL(item) qdel(item); item = null
-#define QDEL_LIST(L) if(L) { for(var/I in L) qdel(I); L.Cut(); }
-#define QDEL_LIST_IN(L, time) addtimer(CALLBACK(GLOBAL_PROC, .proc/______qdel_list_wrapper, L), time, TIMER_STOPPABLE)
-#define QDEL_LIST_ASSOC(L) if(L) { for(var/I in L) { qdel(L[I]); qdel(I); } L.Cut(); }
-#define QDEL_LIST_ASSOC_VAL(L) if(L) { for(var/I in L) qdel(L[I]); L.Cut(); }
-
-/proc/______qdel_list_wrapper(list/L) //the underscores are to encourage people not to use this directly.
- QDEL_LIST(L)
-
-
-
/proc/random_nukecode()
var/val = rand(0, 99999)
var/str = "[val]"
diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm
index 2951ddf165..8963b2d4b8 100644
--- a/code/_globalvars/logging.dm
+++ b/code/_globalvars/logging.dm
@@ -44,3 +44,13 @@ GLOBAL_LIST_EMPTY(adminlog)
GLOBAL_PROTECT(adminlog)
GLOBAL_LIST_EMPTY(active_turfs_startlist)
+
+/////Picture logging
+GLOBAL_VAR(picture_log_directory)
+GLOBAL_PROTECT(picture_log_directory)
+
+GLOBAL_VAR_INIT(picture_logging_id, 1)
+GLOBAL_PROTECT(picture_logging_id)
+GLOBAL_VAR(picture_logging_prefix)
+GLOBAL_PROTECT(picture_logging_prefix)
+/////
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index f98de83c23..b79e303d26 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -72,6 +72,9 @@
if(check_click_intercept(params,A))
return
+ if(notransform)
+ return
+
var/list/modifiers = params2list(params)
if(modifiers["shift"] && modifiers["middle"])
ShiftMiddleClickOn(A)
diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm
index 2bb514d008..5e2879a5d3 100644
--- a/code/_onclick/hud/ai.dm
+++ b/code/_onclick/hud/ai.dm
@@ -135,10 +135,10 @@
return
if(isAI(usr))
var/mob/living/silicon/ai/AI = usr
- AI.aicamera.toggle_camera_mode()
+ AI.aicamera.toggle_camera_mode(usr)
else if(iscyborg(usr))
var/mob/living/silicon/robot/R = usr
- R.aicamera.toggle_camera_mode()
+ R.aicamera.toggle_camera_mode(usr)
/obj/screen/ai/image_view
name = "View Images"
@@ -149,10 +149,10 @@
return
if(isAI(usr))
var/mob/living/silicon/ai/AI = usr
- AI.aicamera.viewpictures()
+ AI.aicamera.viewpictures(usr)
else if(iscyborg(usr))
var/mob/living/silicon/robot/R = usr
- R.aicamera.viewpictures()
+ R.aicamera.viewpictures(usr)
/obj/screen/ai/sensors
name = "Sensor Augmentation"
diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm
index edc15bb984..4e0fd0b976 100644
--- a/code/_onclick/hud/fullscreen.dm
+++ b/code/_onclick/hud/fullscreen.dm
@@ -123,11 +123,6 @@
/obj/screen/fullscreen/impaired
icon_state = "impairedoverlay"
-/obj/screen/fullscreen/blurry
- icon = 'icons/mob/screen_gen.dmi'
- screen_loc = "WEST,SOUTH to EAST,NORTH"
- icon_state = "blurry"
-
/obj/screen/fullscreen/flash
icon = 'icons/mob/screen_gen.dmi'
screen_loc = "WEST,SOUTH to EAST,NORTH"
diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm
index d4559ed66d..b72dd948d7 100644
--- a/code/_onclick/hud/plane_master.dm
+++ b/code/_onclick/hud/plane_master.dm
@@ -29,9 +29,11 @@
blend_mode = BLEND_OVERLAY
/obj/screen/plane_master/game_world/backdrop(mob/mymob)
- filters = list()
if(istype(mymob) && mymob.client && mymob.client.prefs && mymob.client.prefs.ambientocclusion)
- filters += AMBIENT_OCCLUSION
+ add_filter("ambient_occlusion", 0, AMBIENT_OCCLUSION)
+ else
+ remove_filter("ambient_occlusion")
+ update_filters()
/obj/screen/plane_master/lighting
name = "lighting plane master"
diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm
index 1d41e9a765..f05a42e72c 100644
--- a/code/controllers/configuration/entries/general.dm
+++ b/code/controllers/configuration/entries/general.dm
@@ -410,3 +410,7 @@
/datum/config_entry/string/default_view
config_entry_value = "15x15"
+
+/datum/config_entry/flag/log_pictures
+
+/datum/config_entry/flag/picture_logging_camera
diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm
index 67e31b6931..d93f1f2407 100644
--- a/code/controllers/subsystem/npcpool.dm
+++ b/code/controllers/subsystem/npcpool.dm
@@ -23,7 +23,7 @@ SUBSYSTEM_DEF(npcpool)
var/mob/living/simple_animal/SA = currentrun[currentrun.len]
--currentrun.len
- if(!SA.ckey)
+ if(!SA.ckey && !SA.notransform)
if(SA.stat != DEAD)
SA.handle_automated_movement()
if(SA.stat != DEAD)
diff --git a/code/controllers/subsystem/pathfinder.dm b/code/controllers/subsystem/pathfinder.dm
index 871eba49ad..fee93d14b2 100644
--- a/code/controllers/subsystem/pathfinder.dm
+++ b/code/controllers/subsystem/pathfinder.dm
@@ -9,7 +9,7 @@ SUBSYSTEM_DEF(pathfinder)
/datum/controller/subsystem/pathfinder/Initialize()
space_type_cache = typecacheof(/turf/open/space)
mobs = new(10)
- circuits = new(3)
+ circuits = new(3)
return ..()
/datum/flowcache
diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm
index 14db2f1607..b844a1fc1a 100644
--- a/code/controllers/subsystem/persistence.dm
+++ b/code/controllers/subsystem/persistence.dm
@@ -15,6 +15,9 @@ SUBSYSTEM_DEF(persistence)
var/list/spawned_objects = list()
var/list/antag_rep = list()
var/list/antag_rep_change = list()
+ var/list/picture_logging_information = list()
+ var/list/obj/structure/sign/picture_frame/photo_frames
+ var/list/obj/item/storage/photo_album/photo_albums
/datum/controller/subsystem/persistence/Initialize()
LoadSatchels()
@@ -22,6 +25,7 @@ SUBSYSTEM_DEF(persistence)
LoadChiselMessages()
LoadTrophies()
LoadRecentModes()
+ LoadPhotoPersistence()
if(CONFIG_GET(flag/use_antag_rep))
LoadAntagReputation()
..()
@@ -194,15 +198,74 @@ SUBSYSTEM_DEF(persistence)
T.placer_key = chosen_trophy["placer_key"]
T.update_icon()
-
/datum/controller/subsystem/persistence/proc/CollectData()
CollectChiselMessages()
CollectSecretSatchels()
CollectTrophies()
CollectRoundtype()
+ SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION.
if(CONFIG_GET(flag/use_antag_rep))
CollectAntagReputation()
+/datum/controller/subsystem/persistence/proc/LoadPhotoPersistence()
+ var/album_path = file("data/photo_albums.json")
+ var/frame_path = file("data/photo_frames.json")
+ if(fexists(album_path))
+ var/list/json = json_decode(file2text(album_path))
+ if(json.len)
+ for(var/i in photo_albums)
+ var/obj/item/storage/photo_album/A = i
+ if(!A.persistence_id)
+ continue
+ if(json[A.persistence_id])
+ A.populate_from_id_list(json[A.persistence_id])
+
+ if(fexists(frame_path))
+ var/list/json = json_decode(file2text(frame_path))
+ if(json.len)
+ for(var/i in photo_frames)
+ var/obj/structure/sign/picture_frame/PF = i
+ if(!PF.persistence_id)
+ continue
+ if(json[PF.persistence_id])
+ PF.load_from_id(json[PF.persistence_id])
+
+/datum/controller/subsystem/persistence/proc/SavePhotoPersistence()
+ var/album_path = file("data/photo_albums.json")
+ var/frame_path = file("data/photo_frames.json")
+
+ var/list/frame_json = list()
+ var/list/album_json = list()
+
+ if(fexists(album_path))
+ album_json = json_decode(file2text(album_path))
+ fdel(album_path)
+
+ for(var/i in photo_albums)
+ var/obj/item/storage/photo_album/A = i
+ if(!istype(A) || !A.persistence_id)
+ continue
+ var/list/L = A.get_picture_id_list()
+ album_json[A.persistence_id] = L
+
+ album_json = json_encode(album_json)
+
+ WRITE_FILE(album_path, album_json)
+
+ if(fexists(frame_path))
+ frame_json = json_decode(file2text(frame_path))
+ fdel(frame_path)
+
+ for(var/i in photo_frames)
+ var/obj/structure/sign/picture_frame/F = i
+ if(!istype(F) || !F.persistence_id)
+ continue
+ frame_json[F.persistence_id] = F.get_photo_id()
+
+ frame_json = json_encode(frame_json)
+
+ WRITE_FILE(frame_path, frame_json)
+
/datum/controller/subsystem/persistence/proc/CollectSecretSatchels()
satchel_blacklist = typecacheof(list(/obj/item/stack/tile/plasteel, /obj/item/crowbar))
var/list/satchels_to_add = list()
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index c88a86c092..60bb24c8c2 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -214,13 +214,16 @@
if(!C)
C = H.client
var/image = get_id_photo(H, C, show_directions)
- var/obj/item/photo/photo_front = new()
- var/obj/item/photo/photo_side = new()
- for(var/D in show_directions)
- if(D == SOUTH)
- photo_front.photocreate(null, icon(image, dir = D))
- if(D == WEST || D == EAST)
- photo_side.photocreate(null, icon(image, dir = D))
+ var/datum/picture/pf = new
+ var/datum/picture/ps = new
+ pf.picture_name = "[H]"
+ ps.picture_name = "[H]"
+ pf.picture_desc = "This is [H]."
+ ps.picture_desc = "This is [H]."
+ pf.picture_image = icon(image, dir = SOUTH)
+ ps.picture_image = icon(image, dir = WEST)
+ var/obj/item/photo/photo_front = new(null, pf)
+ var/obj/item/photo/photo_side = new(null, ps)
//These records should ~really~ be merged or something
//General Record
diff --git a/code/datums/datum.dm b/code/datums/datum.dm
index 9e14704123..aba03c784c 100644
--- a/code/datums/datum.dm
+++ b/code/datums/datum.dm
@@ -83,3 +83,67 @@
/datum/proc/to_chat_check_changed_vars(target = world)
to_chat(target, txt_changed_vars())
#endif
+
+//Return a LIST for serialize_datum to encode! Not the actual json!
+/datum/proc/serialize_list(list/options)
+ return NOT_IMPLEMENTED
+
+//Accepts a LIST from deserialize_datum. Should return src or another datum.
+/datum/proc/deserialize_list(json, list/options)
+ return NOT_IMPLEMENTED
+
+//Serializes into JSON. Does not encode type.
+/datum/proc/serialize_json(list/options)
+ . = serialize_list(options)
+ if((. == NOT_IMPLEMENTED) || !islist(.))
+ . = null
+ else
+ . = json_encode(.)
+
+//Deserializes from JSON. Does not parse type.
+/datum/proc/deserialize_json(list/input, list/options)
+ var/list/jsonlist = json_decode(input)
+ . = deserialize_list(jsonlist)
+ if(!istype(., /datum))
+ . = null
+
+/proc/json_serialize_datum(datum/D, list/options)
+ if(!istype(D))
+ return
+ var/list/jsonlist = D.serialize_list(options)
+ if(islist(jsonlist))
+ jsonlist["DATUM_TYPE"] = D.type
+ return json_encode(jsonlist)
+
+/proc/json_deserialize_datum(list/jsonlist, list/options, target_type, strict_target_type = FALSE)
+ if(!islist(jsonlist))
+ if(!istext(jsonlist))
+ CRASH("Invalid JSON")
+ return
+ jsonlist = json_decode(jsonlist)
+ if(!islist(jsonlist))
+ CRASH("Invalid JSON")
+ return
+ if(!jsonlist["DATUM_TYPE"])
+ return
+ if(!ispath(jsonlist["DATUM_TYPE"]))
+ if(!istext(jsonlist["DATUM_TYPE"]))
+ return
+ jsonlist["DATUM_TYPE"] = text2path(jsonlist["DATUM_TYPE"])
+ if(!ispath(jsonlist["DATUM_TYPE"]))
+ return
+ if(target_type)
+ if(!ispath(target_type))
+ return
+ if(strict_target_type)
+ if(target_type != jsonlist["DATUM_TYPE"])
+ return
+ else if(!ispath(jsonlist["DATUM_TYPE"], target_type))
+ return
+ var/typeofdatum = jsonlist["DATUM_TYPE"] //BYOND won't directly read if this is just put in the line below, and will instead runtime because it thinks you're trying to make a new list?
+ var/datum/D = new typeofdatum
+ var/datum/returned = D.deserialize_list(jsonlist, options)
+ if(!istype(returned, /datum))
+ qdel(D)
+ else
+ return returned
\ No newline at end of file
diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm
index 68b021bc7d..20c3570bc1 100644
--- a/code/datums/martial/boxing.dm
+++ b/code/datums/martial/boxing.dm
@@ -34,8 +34,8 @@
D.apply_damage(damage, STAMINA, affecting, armor_block)
add_logs(A, D, "punched (boxing) ")
- if(D.getStaminaLoss() > 50)
- var/knockout_prob = D.getStaminaLoss() + rand(-15,15)
+ if(D.getStaminaLoss() > 100)
+ var/knockout_prob = (D.getStaminaLoss() + rand(-15,15))*0.75
if((D.stat != DEAD) && prob(knockout_prob))
D.visible_message("[A] has knocked [D] out with a haymaker!", \
"[A] has knocked [D] out with a haymaker!")
diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm
index af299aaee9..4006c13a2c 100644
--- a/code/datums/ruins/lavaland.dm
+++ b/code/datums/ruins/lavaland.dm
@@ -215,3 +215,10 @@
suffix = "lavaland_surface_random_ripley.dmm"
allow_duplicates = FALSE
cost = 5
+
+/datum/map_template/ruin/lavaland/puzzle
+ name = "Ancient Puzzle"
+ id = "puzzle"
+ description = "Mystery to be solved."
+ suffix = "lavaland_surface_puzzle.dmm"
+ cost = 5
\ No newline at end of file
diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm
index 3517f92060..b53b334132 100644
--- a/code/datums/shuttles.dm
+++ b/code/datums/shuttles.dm
@@ -126,7 +126,6 @@
var/datum/supply_pack/P = SSshuttle.supply_packs[/datum/supply_pack/engineering/shuttle_engine]
P.special_enabled = TRUE
-
/datum/map_template/shuttle/emergency/asteroid
suffix = "asteroid"
name = "Asteroid Station Emergency Shuttle"
@@ -229,7 +228,7 @@
suffix = "scrapheap"
name = "Standby Evacuation Vessel \"Scrapheap Challenge\""
credit_cost = -1000
- description = "Due to a lack of functional emergency shuttles, we bought this second hand from a scrapyard and pressed it into service. Please do not lean to heavily on the exterior windows, they are fragile."
+ description = "Due to a lack of functional emergency shuttles, we bought this second hand from a scrapyard and pressed it into service. Please do not lean to heavily on the exterior windows, they are fragile. VIRUS ALERT: This entry seems to be booby-trapped with a redirector trap. Buy this at your own risk."
admin_notes = "An abomination with no functional medbay, sections missing, and some very fragile windows. Surprisingly airtight."
/datum/map_template/shuttle/emergency/narnar
diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm
index 7bbcbe6171..2f2ee53e3e 100644
--- a/code/datums/traits/negative.dm
+++ b/code/datums/traits/negative.dm
@@ -12,7 +12,7 @@
var/mob/living/carbon/human/H = quirk_holder
if(NOBLOOD in H.dna.species.species_traits) //can't lose blood if your species doesn't have any
return
- else
+ else
quirk_holder.blood_volume -= 0.275
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 32e982e8e6..68089905b6 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -608,4 +608,10 @@
/atom/movable/proc/get_filter(name)
if(filter_data && filter_data[name])
- return filters[filter_data.Find(name)]
\ No newline at end of file
+ return filters[filter_data.Find(name)]
+
+/atom/movable/proc/remove_filter(name)
+ if(filter_data[name])
+ filter_data -= name
+ update_filters()
+ return TRUE
\ No newline at end of file
diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm
index d42c546990..6603bb3604 100644
--- a/code/game/gamemodes/objective_items.dm
+++ b/code/game/gamemodes/objective_items.dm
@@ -148,12 +148,12 @@
/datum/objective_item/steal/blueprints/check_special_completion(obj/item/I)
if(istype(I, /obj/item/areaeditor/blueprints))
- return 1
+ return TRUE
if(istype(I, /obj/item/photo))
var/obj/item/photo/P = I
- if(P.blueprints) //if the blueprints are in frame
- return 1
- return 0
+ if(P.picture.has_blueprints) //if the blueprints are in frame
+ return TRUE
+ return FALSE
/datum/objective_item/steal/slime
name = "an unused sample of slime extract."
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index 0ee394d889..2f1c0020b9 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -108,10 +108,10 @@
if(active1 in GLOB.data_core.general)
if(istype(active1.fields["photo_front"], /obj/item/photo))
var/obj/item/photo/P1 = active1.fields["photo_front"]
- user << browse_rsc(P1.img, "photo_front")
+ user << browse_rsc(P1.picture.picture_image, "photo_front")
if(istype(active1.fields["photo_side"], /obj/item/photo))
var/obj/item/photo/P2 = active1.fields["photo_side"]
- user << browse_rsc(P2.img, "photo_side")
+ user << browse_rsc(P2.picture.picture_image, "photo_side")
dat += "| Name: | [active1.fields["name"]] | "
dat += " | "
dat += " |
"
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 8a2a06bf1f..666966ee2e 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -182,10 +182,10 @@
if(istype(active1, /datum/data/record) && GLOB.data_core.general.Find(active1))
if(istype(active1.fields["photo_front"], /obj/item/photo))
var/obj/item/photo/P1 = active1.fields["photo_front"]
- user << browse_rsc(P1.img, "photo_front")
+ user << browse_rsc(P1.picture.picture_image, "photo_front")
if(istype(active1.fields["photo_side"], /obj/item/photo))
var/obj/item/photo/P2 = active1.fields["photo_side"]
- user << browse_rsc(P2.img, "photo_side")
+ user << browse_rsc(P2.picture.picture_image, "photo_side")
dat += {"
| Name: | [active1.fields["name"]] |
| ID: | [active1.fields["id"]] |
@@ -446,7 +446,7 @@ What a mess.*/
sleep(30)
if((istype(active1, /datum/data/record) && GLOB.data_core.general.Find(active1)))//make sure the record still exists.
var/obj/item/photo/photo = active1.fields["photo_front"]
- new /obj/item/poster/wanted(src.loc, photo.img, wanted_name, info)
+ new /obj/item/poster/wanted(loc, photo.picture.picture_image, wanted_name, info)
printing = 0
//RECORD DELETE
@@ -611,7 +611,7 @@ What a mess.*/
if(photo)
qdel(active1.fields["photo_front"])
//Lets center it to a 32x32.
- var/icon/I = photo.img
+ var/icon/I = photo.picture.picture_image
var/w = I.Width()
var/h = I.Height()
var/dw = w - 32
@@ -622,7 +622,7 @@ What a mess.*/
if(active1.fields["photo_front"])
if(istype(active1.fields["photo_front"], /obj/item/photo))
var/obj/item/photo/P = active1.fields["photo_front"]
- print_photo(P.img, active1.fields["name"])
+ print_photo(P.picture.picture_image, active1.fields["name"])
if("show_photo_side")
if(active1.fields["photo_side"])
if(istype(active1.fields["photo_side"], /obj/item/photo))
@@ -633,7 +633,7 @@ What a mess.*/
if(photo)
qdel(active1.fields["photo_side"])
//Lets center it to a 32x32.
- var/icon/I = photo.img
+ var/icon/I = photo.picture.picture_image
var/w = I.Width()
var/h = I.Height()
var/dw = w - 32
@@ -644,7 +644,7 @@ What a mess.*/
if(active1.fields["photo_side"])
if(istype(active1.fields["photo_side"], /obj/item/photo))
var/obj/item/photo/P = active1.fields["photo_side"]
- print_photo(P.img, active1.fields["name"])
+ print_photo(P.picture.picture_image, active1.fields["name"])
if("mi_crim_add")
if(istype(active1, /datum/data/record))
var/t1 = stripped_input(usr, "Please input minor crime names:", "Secure. records", "", null)
@@ -759,10 +759,9 @@ What a mess.*/
var/obj/item/photo/P = null
if(issilicon(user))
var/mob/living/silicon/tempAI = user
- var/datum/picture/selection = tempAI.GetPhoto()
+ var/datum/picture/selection = tempAI.GetPhoto(user)
if(selection)
- P = new()
- P.photocreate(selection.fields["icon"], selection.fields["img"], selection.fields["desc"])
+ P = new(null, selection)
else if(istype(user.get_active_held_item(), /obj/item/photo))
P = user.get_active_held_item()
return P
@@ -778,7 +777,7 @@ What a mess.*/
small_img.Scale(8, 8)
ic.Blend(small_img,ICON_OVERLAY, 13, 13)
P.icon = ic
- P.img = temp
+ P.picture.picture_image = temp
P.desc = "The photo on file for [name]."
P.pixel_x = rand(-10, 10)
P.pixel_y = rand(-10, 10)
diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm
index 9d522f8f1c..940734c0c2 100644
--- a/code/game/machinery/doppler_array.dm
+++ b/code/game/machinery/doppler_array.dm
@@ -129,4 +129,4 @@ GLOBAL_LIST_EMPTY(doppler_arrays)
linked_techweb = SSresearch.science_tech
/proc/techweb_scale_bomb(lightradius)
- return (lightradius ** 0.5) * 3000
+ return lightradius ** 1.36
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index aa847a4624..bb4868d054 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -126,9 +126,9 @@ GLOBAL_LIST_EMPTY(allCasters)
newMsg.is_admin_message = adminMessage
newMsg.locked = !allow_comments
if(photo)
- newMsg.img = photo.img
+ newMsg.img = photo.picture.picture_image
newMsg.caption = photo.scribble
- newMsg.photo_file = save_photo(photo.img)
+ newMsg.photo_file = save_photo(photo.picture.picture_image)
for(var/datum/newscaster/feed_channel/FC in network_channels)
if(FC.channel_name == channel_name)
FC.messages += newMsg
@@ -145,8 +145,8 @@ GLOBAL_LIST_EMPTY(allCasters)
wanted_issue.scannedUser = scanned_user
wanted_issue.isAdminMsg = adminMsg
if(photo)
- wanted_issue.img = photo.img
- wanted_issue.photo_file = save_photo(photo.img)
+ wanted_issue.img = photo.picture.picture_image
+ wanted_issue.photo_file = save_photo(photo.picture.picture_image)
if(newMessage)
for(var/obj/machinery/newscaster/N in GLOB.allCasters)
N.newsAlert()
@@ -794,10 +794,7 @@ GLOBAL_LIST_EMPTY(allCasters)
if(photo && !user.transferItemToLoc(photo, src))
photo = null
if(issilicon(user))
- var/list/nametemp = list()
- var/find
- var/datum/picture/selection
- var/obj/item/camera/siliconcam/targetcam = null
+ var/obj/item/camera/siliconcam/targetcam
if(isAI(user))
var/mob/living/silicon/ai/R = user
targetcam = R.aicamera
@@ -809,19 +806,12 @@ GLOBAL_LIST_EMPTY(allCasters)
targetcam = R.aicamera
else
to_chat(user, "You cannot interface with silicon photo uploading!")
- if(targetcam.aipictures.len == 0)
+ if(!targetcam.stored.len)
to_chat(usr, "No images saved")
return
- for(var/datum/picture/t in targetcam.aipictures)
- nametemp += t.fields["name"]
- find = input("Select image (numbered in order taken)") in nametemp
- var/obj/item/photo/P = new/obj/item/photo()
- for(var/datum/picture/q in targetcam.aipictures)
- if(q.fields["name"] == find)
- selection = q
- break
- P.photocreate(selection.fields["icon"], selection.fields["img"], selection.fields["desc"])
- P.sillynewscastervar = 1
+ var/datum/picture/selection = targetcam.selectpicture(user)
+ var/obj/item/photo/P = new(null, selection)
+ P.sillynewscastervar = TRUE
photo = P
qdel(P)
diff --git a/code/game/machinery/telecomms/computers/message.dm b/code/game/machinery/telecomms/computers/message.dm
index 74881cb064..5996bcea6b 100644
--- a/code/game/machinery/telecomms/computers/message.dm
+++ b/code/game/machinery/telecomms/computers/message.dm
@@ -141,7 +141,7 @@
break
// Del - Sender - Recepient - Message
// X - Al Green - Your Mom - WHAT UP!?
- dat += "| X | [pda.sender] | [pda.recipient] | [pda.message][pda.photo ? " (Photo)":""] | "
+ dat += "| X | [pda.sender] | [pda.recipient] | [pda.message][pda.picture ? " (Photo)":""] | "
dat += " "
//Hacking screen.
if(2)
diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm
index 45661add0d..3b2dbed96f 100644
--- a/code/game/machinery/telecomms/machines/message_server.dm
+++ b/code/game/machinery/telecomms/machines/message_server.dm
@@ -124,7 +124,7 @@
var/sender = "Unspecified"
var/recipient = "Unspecified"
var/message = "Blank" // transferred message
- var/icon/photo // attached photo
+ var/datum/picture/picture // attached photo
/datum/data_pda_msg/New(param_rec, param_sender, param_message, param_photo)
if(param_rec)
@@ -134,17 +134,17 @@
if(param_message)
message = param_message
if(param_photo)
- photo = param_photo
+ picture = param_photo
/datum/data_pda_msg/Topic(href,href_list)
..()
if(href_list["photo"])
var/mob/M = usr
- M << browse_rsc(photo, "pda_photo.png")
+ M << browse_rsc(picture.picture_image, "pda_photo.png")
M << browse("PDA Photo" \
+ "" \
+ " " \
- + "", "window=pdaphoto;size=192x192")
+ + " |