diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 00000000000..a014d30878e
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,23 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+**Issue Description**:
+
+**What did you expect to happen**:
+
+**What happened instead**:
+
+**Why is this bad/What are the consequences**:
+
+**Steps to reproduce the problem**:
+
+**When did the problem start happening**:
+
+**Extra information**:
+
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 00000000000..2f58d4e9ebb
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,10 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+Please place all features requests here: https://nanotrasen.se/forum/60-suggestions/
diff --git a/README.md b/README.md
index 2f4e16270c3..93bb70efc80 100644
--- a/README.md
+++ b/README.md
@@ -103,7 +103,8 @@ The SQL backend for the library and stats tracking requires a MySQL server.
Your server details go in /config/dbconfig.txt,
and the SQL schema is in /SQL/paradise_schema.sql or /SQL/paradise_schema_prefix.sql,
depending on if you want table prefixes.
-More detailed setup instructions are located on /tg/station's wiki: http://www.tgstation13.org/wiki/Downloading_the_source_code#Setting_up_the_database
+More detailed setup instructions are located on our wiki:
+https://nanotrasen.se/wiki/index.php/Setting_up_the_Database
---
diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql
index ed4fb787b8d..1e4692b7e3b 100644
--- a/SQL/paradise_schema.sql
+++ b/SQL/paradise_schema.sql
@@ -269,6 +269,7 @@ CREATE TABLE `player` (
`fuid` bigint(20) NULL DEFAULT NULL,
`fupdate` smallint(4) NULL DEFAULT '0',
`afk_watch` tinyint(1) NOT NULL DEFAULT '0',
+ `parallax` tinyint(1) DEFAULT '8',
PRIMARY KEY (`id`),
UNIQUE KEY `ckey` (`ckey`)
) ENGINE=InnoDB AUTO_INCREMENT=32446 DEFAULT CHARSET=latin1;
diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql
index b0f7bbc5c82..aa5d5895e56 100644
--- a/SQL/paradise_schema_prefixed.sql
+++ b/SQL/paradise_schema_prefixed.sql
@@ -268,6 +268,7 @@ CREATE TABLE `SS13_player` (
`fuid` bigint(20) NULL DEFAULT NULL,
`fupdate` smallint(4) NULL DEFAULT '0',
`afk_watch` tinyint(1) NOT NULL DEFAULT '0',
+ `parallax` tinyint(1) DEFAULT '8',
PRIMARY KEY (`id`),
UNIQUE KEY `ckey` (`ckey`)
) ENGINE=InnoDB AUTO_INCREMENT=32446 DEFAULT CHARSET=latin1;
diff --git a/SQL/updates/8-9.sql b/SQL/updates/8-9.sql
new file mode 100644
index 00000000000..d7f0fd19ab3
--- /dev/null
+++ b/SQL/updates/8-9.sql
@@ -0,0 +1,4 @@
+#Updating the SQL from version 8 to version 9. -affectedarc07
+#Adding new column to contain the parallax value.
+ALTER TABLE `player`
+ ADD `parallax` tinyint(1) DEFAULT '8' AFTER `fupdate`;
diff --git a/_maps/map_files/Delta/delta.dmm b/_maps/map_files/Delta/delta.dmm
index 447889d17a1..aeaebe6d843 100644
--- a/_maps/map_files/Delta/delta.dmm
+++ b/_maps/map_files/Delta/delta.dmm
@@ -27867,11 +27867,6 @@
/obj/effect/decal/warning_stripes/northwest,
/turf/simulated/floor/plasteel,
/area/atmos)
-"bat" = (
-/obj/machinery/pipedispenser,
-/obj/effect/decal/warning_stripes/east,
-/turf/simulated/floor/plasteel,
-/area/atmos)
"bau" = (
/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
dir = 8;
@@ -28742,11 +28737,6 @@
/obj/effect/decal/warning_stripes/west,
/turf/simulated/floor/plasteel,
/area/atmos)
-"bbU" = (
-/obj/machinery/pipedispenser/disposal,
-/obj/effect/decal/warning_stripes/east,
-/turf/simulated/floor/plasteel,
-/area/atmos)
"bbV" = (
/obj/structure/cable{
d1 = 1;
@@ -31407,6 +31397,7 @@
id_tag = "s_docking_airlock";
req_access_txt = "48"
},
+/obj/structure/fans/tiny,
/turf/simulated/shuttle/floor,
/area/shuttle/mining)
"bgZ" = (
@@ -31431,6 +31422,7 @@
name = "mining shuttle bay";
width = 7
},
+/obj/structure/fans/tiny,
/turf/simulated/shuttle/floor,
/area/shuttle/mining)
"bha" = (
@@ -34038,6 +34030,7 @@
name = "Mining Dock Airlock";
req_access_txt = "48"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel,
/area/quartermaster/miningdock)
"blH" = (
@@ -38843,6 +38836,7 @@
name = "Labor Shuttle Airlock";
req_access_txt = "2"
},
+/obj/structure/fans/tiny,
/turf/simulated/shuttle/floor{
icon_state = "floor4"
},
@@ -38864,6 +38858,7 @@
name = "Labor Camp Airlock";
req_access_txt = "2"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel,
/area/security/prisonershuttle)
"btT" = (
@@ -41958,6 +41953,7 @@
name = "fore bay 1";
width = 9
},
+/obj/structure/fans/tiny,
/turf/simulated/shuttle/floor,
/area/shuttle/siberia)
"bzg" = (
@@ -142582,9 +142578,9 @@ aUd
aVM
aXq
aYI
-bat
-bbU
-bat
+bhp
+bhp
+bhp
beO
aXn
bhk
diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
index 8bf89da81b2..6dd1a34d1cc 100644
--- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
@@ -11722,6 +11722,7 @@
name = "Labor Camp Shuttle Airlock";
req_access_txt = "2"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -14760,6 +14761,7 @@
id_tag = "s_docking_airlock";
name = "Labor Shuttle Airlock"
},
+/obj/structure/fans/tiny,
/turf/simulated/shuttle/floor{
icon_state = "floor4"
},
@@ -14769,6 +14771,7 @@
id_tag = "laborcamp_home";
name = "Labor Camp Shuttle Airlock"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -15638,6 +15641,7 @@
pixel_y = -25;
req_access_txt = "2"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -17546,6 +17550,7 @@
name = "mining shuttle bay";
width = 7
},
+/obj/structure/fans/tiny,
/turf/simulated/shuttle/plating,
/area/shuttle/mining)
"aEJ" = (
@@ -17554,6 +17559,7 @@
req_access = null;
req_access_txt = "0"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plating,
/area/quartermaster/miningdock{
name = "\improper Mining Office"
@@ -17568,6 +17574,7 @@
name = "Mining Dock";
req_access_txt = "48"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel,
/area/quartermaster/miningdock{
name = "\improper Mining Office"
@@ -17814,6 +17821,7 @@
id_tag = "s_docking_airlock";
name = "Labor Shuttle Airlock"
},
+/obj/structure/fans/tiny,
/turf/simulated/shuttle/floor,
/area/shuttle/siberia)
"aFe" = (
@@ -17821,6 +17829,7 @@
id_tag = "laborcamp_home";
name = "Labor Camp Shuttle Airlock"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -61905,7 +61914,6 @@
name = "Station Intercom (General)";
pixel_y = 28
},
-/obj/machinery/pipedispenser/disposal,
/obj/effect/decal/warning_stripes/southeast,
/turf/simulated/floor/plasteel,
/area/atmos)
@@ -62855,7 +62863,6 @@
/turf/simulated/floor/plating,
/area/maintenance/starboard)
"cdq" = (
-/obj/machinery/pipedispenser,
/obj/effect/decal/warning_stripes/southwest,
/turf/simulated/floor/plasteel,
/area/atmos)
diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm
new file mode 100644
index 00000000000..8fdc459c863
--- /dev/null
+++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm
@@ -0,0 +1,770 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aa" = (
+/turf/template_noop,
+/area/template_noop)
+"ab" = (
+/turf/simulated/wall/mineral/titanium,
+/area/shuttle/freegolem)
+"ac" = (
+/obj/structure/fans/tiny,
+/obj/machinery/door/airlock/shuttle,
+/turf/simulated/shuttle/plating,
+/area/shuttle/freegolem)
+"ad" = (
+/obj/structure/closet/crate/golemgear,
+/turf/simulated/shuttle/plating,
+/area/shuttle/freegolem)
+"ae" = (
+/obj/item/storage/toolbox/mechanical,
+/obj/item/reagent_containers/spray/cleaner,
+/turf/simulated/shuttle/plating,
+/area/shuttle/freegolem)
+"af" = (
+/turf/simulated/shuttle/plating,
+/area/shuttle/freegolem)
+"ag" = (
+/obj/structure/reagent_dispensers/watertank/high,
+/turf/simulated/shuttle/plating,
+/area/shuttle/freegolem)
+"ah" = (
+/obj/structure/shuttle/engine/heater{
+ icon_state = "heater";
+ dir = 4
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/simulated/shuttle/plating,
+/area/shuttle/freegolem)
+"ai" = (
+/obj/structure/shuttle/engine/propulsion{
+ dir = 4;
+ icon_state = "burst_l"
+ },
+/turf/simulated/shuttle/plating,
+/area/shuttle/freegolem)
+"aj" = (
+/obj/machinery/light/small,
+/turf/simulated/shuttle/plating,
+/area/shuttle/freegolem)
+"ak" = (
+/obj/structure/reagent_dispensers/watertank,
+/turf/simulated/shuttle/plating,
+/area/shuttle/freegolem)
+"al" = (
+/obj/structure/table/wood,
+/obj/item/disk/design_disk/golem_shell,
+/obj/item/areaeditor/golem,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"am" = (
+/obj/machinery/vending/hydronutrients,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"an" = (
+/obj/machinery/vending/hydroseeds,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"ao" = (
+/obj/machinery/light{
+ dir = 1;
+ on = 1
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"ap" = (
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"aq" = (
+/turf/simulated/shuttle/wall{
+ icon_state = "swallc2";
+ dir = 2
+ },
+/area/shuttle/freegolem)
+"ar" = (
+/obj/effect/mob_spawn/human/golem/adamantine,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"as" = (
+/obj/machinery/vending/coffee/free,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"at" = (
+/obj/machinery/mineral/equipment_vendor/golem,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"au" = (
+/obj/machinery/door/airlock/shuttle,
+/obj/structure/fans/tiny,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"av" = (
+/turf/simulated/shuttle/wall{
+ icon_state = "swall12";
+ dir = 2
+ },
+/area/shuttle/freegolem)
+"aw" = (
+/obj/machinery/door/airlock/shuttle,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"ax" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"ay" = (
+/obj/machinery/mineral/ore_redemption/golem,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"az" = (
+/turf/simulated/shuttle/wall{
+ icon_state = "swallc1";
+ dir = 2
+ },
+/area/shuttle/freegolem)
+"aA" = (
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/powered/golem_ship)
+"aB" = (
+/obj/structure/window/full/shuttle{
+ icon_state = "16"
+ },
+/obj/structure/grille,
+/turf/simulated/shuttle/plating,
+/area/shuttle/freegolem)
+"aC" = (
+/obj/structure/statue/gold/rd{
+ name = "statue of the Liberator"
+ },
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"aD" = (
+/obj/structure/computerframe,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"aE" = (
+/turf/simulated/shuttle/wall{
+ icon_state = "swall3";
+ dir = 2
+ },
+/area/shuttle/freegolem)
+"aF" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_y = 30
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"aG" = (
+/obj/machinery/door/airlock/shuttle,
+/obj/structure/fans/tiny,
+/obj/docking_port/stationary{
+ area_type = /area/ruin/powered/golem_ship;
+ dir = 8;
+ dwidth = 8;
+ height = 20;
+ id = "freegolem_lavaland";
+ name = "Lavaland Surface";
+ turf_type = /turf/simulated/floor/plating/asteroid/basalt/lava_land_surface;
+ width = 16
+ },
+/obj/docking_port/mobile{
+ dir = 8;
+ dwidth = 8;
+ height = 20;
+ id = "freegolem";
+ name = "Free Golem Ship";
+ width = 16
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"aH" = (
+/obj/structure/window/full/shuttle{
+ icon_state = "15"
+ },
+/obj/structure/grille,
+/turf/simulated/shuttle/plating,
+/area/shuttle/freegolem)
+"aI" = (
+/obj/structure/window/reinforced{
+ dir = 4;
+ pixel_x = 0
+ },
+/obj/structure/table/wood,
+/obj/item/bedsheet/rd/royal_cape{
+ layer = 3;
+ pixel_x = 5;
+ pixel_y = 9
+ },
+/obj/item/book/manual/research_and_development{
+ name = "Sacred Text of the Liberator";
+ pixel_x = -4;
+ pixel_y = 3
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"aJ" = (
+/obj/machinery/light,
+/obj/structure/chair/comfy/purp{
+ icon_state = "comfychair";
+ dir = 1
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"aK" = (
+/turf/simulated/shuttle/wall{
+ tag = "icon-swall13";
+ icon_state = "swall13";
+ dir = 2
+ },
+/area/shuttle/freegolem)
+"aL" = (
+/obj/structure/fans/tiny,
+/obj/machinery/door/airlock/shuttle,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"aM" = (
+/turf/simulated/shuttle/wall{
+ tag = "icon-swall11";
+ icon_state = "swall11";
+ dir = 2
+ },
+/area/shuttle/freegolem)
+"aN" = (
+/obj/item/resonator/upgraded,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"aO" = (
+/obj/machinery/autolathe,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"aP" = (
+/obj/machinery/computer/shuttle/golem_ship/recall,
+/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/powered/golem_ship)
+"aQ" = (
+/obj/structure/table/wood,
+/obj/machinery/reagentgrinder,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"aR" = (
+/turf/simulated/shuttle/wall{
+ icon_state = "swallc4"
+ },
+/area/shuttle/freegolem)
+"aS" = (
+/turf/simulated/shuttle/wall{
+ icon_state = "swall4";
+ dir = 2
+ },
+/area/shuttle/freegolem)
+"aT" = (
+/obj/machinery/light,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"aU" = (
+/obj/structure/table/wood,
+/obj/item/resonator,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"aV" = (
+/obj/machinery/vending/snack/free,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"aW" = (
+/obj/structure/table/wood,
+/obj/item/storage/firstaid/brute,
+/obj/item/storage/firstaid/brute,
+/obj/item/storage/firstaid/brute,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"aX" = (
+/obj/structure/table/wood,
+/obj/item/storage/firstaid/fire,
+/obj/item/storage/firstaid/fire,
+/obj/item/storage/firstaid/fire,
+/obj/machinery/light,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"aY" = (
+/obj/structure/table/wood,
+/obj/item/storage/firstaid/adv,
+/obj/item/storage/firstaid/adv,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"ba" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/simulated/shuttle/plating,
+/area/shuttle/freegolem)
+"bb" = (
+/obj/structure/reagent_dispensers/fueltank,
+/turf/simulated/shuttle/plating,
+/area/shuttle/freegolem)
+"bc" = (
+/obj/structure/ore_box,
+/turf/simulated/shuttle/plating,
+/area/shuttle/freegolem)
+"be" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_y = -30
+ },
+/obj/machinery/light,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/freegolem)
+"bf" = (
+/turf/simulated/shuttle/wall{
+ icon_state = "swallc3";
+ dir = 2
+ },
+/area/shuttle/freegolem)
+"bh" = (
+/turf/simulated/shuttle/wall{
+ tag = "icon-swall14";
+ icon_state = "swall14";
+ dir = 2
+ },
+/area/shuttle/freegolem)
+
+(1,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aq
+aB
+aH
+bf
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(2,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+av
+aC
+aI
+av
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(3,1,1) = {"
+aa
+aa
+aa
+aq
+aE
+au
+aR
+aD
+aJ
+ab
+au
+aE
+bf
+aa
+aa
+aa
+"}
+(4,1,1) = {"
+aa
+aa
+aa
+av
+am
+ap
+ax
+ap
+ap
+ax
+ap
+as
+av
+aa
+aa
+aa
+"}
+(5,1,1) = {"
+aa
+aa
+aa
+av
+an
+ap
+ap
+ap
+ap
+ap
+ap
+aV
+av
+aa
+aa
+aa
+"}
+(6,1,1) = {"
+aq
+aE
+aE
+aK
+ao
+ap
+ap
+ap
+ap
+ap
+ap
+aT
+bh
+aE
+aE
+bf
+"}
+(7,1,1) = {"
+av
+ad
+af
+aw
+ap
+ap
+ap
+ap
+ap
+ap
+ap
+ap
+aw
+af
+bc
+av
+"}
+(8,1,1) = {"
+av
+ad
+af
+aw
+ap
+ap
+ap
+ap
+ap
+ap
+ap
+ap
+aw
+af
+bc
+av
+"}
+(9,1,1) = {"
+av
+ad
+aj
+av
+ao
+ap
+ap
+ap
+ap
+ap
+ap
+aT
+av
+ba
+bc
+av
+"}
+(10,1,1) = {"
+av
+ad
+af
+av
+ap
+ap
+ar
+aU
+aU
+ar
+ap
+ap
+av
+af
+bc
+av
+"}
+(11,1,1) = {"
+av
+ad
+af
+av
+ap
+ap
+ar
+aU
+aU
+ar
+ap
+ap
+av
+af
+bc
+av
+"}
+(12,1,1) = {"
+av
+ad
+aj
+av
+ao
+ap
+ap
+ap
+ap
+ap
+ap
+aT
+av
+ba
+bc
+av
+"}
+(13,1,1) = {"
+av
+ad
+af
+aw
+ap
+ap
+ap
+ap
+ap
+ap
+ap
+ap
+aw
+af
+bc
+av
+"}
+(14,1,1) = {"
+av
+ad
+af
+aw
+ap
+ap
+ap
+ap
+ap
+ap
+ap
+ap
+aw
+af
+bc
+av
+"}
+(15,1,1) = {"
+av
+ae
+af
+av
+ap
+ap
+ap
+ap
+ap
+ap
+ap
+aW
+av
+af
+ae
+av
+"}
+(16,1,1) = {"
+ac
+af
+aj
+av
+ao
+ap
+ap
+ap
+ap
+ap
+ap
+aX
+av
+ba
+af
+ac
+"}
+(17,1,1) = {"
+ac
+af
+af
+av
+ap
+ap
+ap
+ap
+ap
+aN
+ap
+aY
+av
+af
+af
+ac
+"}
+(18,1,1) = {"
+av
+ag
+ak
+av
+at
+ap
+ay
+ap
+ap
+aO
+aQ
+al
+av
+bb
+bb
+av
+"}
+(19,1,1) = {"
+av
+ah
+ah
+av
+ah
+ah
+aS
+aF
+be
+aS
+ah
+ah
+av
+ah
+ah
+av
+"}
+(20,1,1) = {"
+az
+ai
+ai
+aM
+ai
+ai
+aM
+aG
+aL
+aM
+ai
+ai
+aM
+ai
+ai
+aR
+"}
+(21,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aA
+aA
+aA
+aP
+aa
+aa
+aa
+aa
+aa
+aa
+"}
diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
index 421f2e62b53..279afa9713d 100644
--- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
+++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm
@@ -1611,15 +1611,6 @@
pixel_x = 1;
pixel_y = -1
},
-/obj/item/radio/headset/syndicate/alt{
- pixel_x = -3;
- pixel_y = 3
- },
-/obj/item/radio/headset/syndicate/alt,
-/obj/item/radio/headset/syndicate/alt{
- pixel_x = 3;
- pixel_y = -3
- },
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plasteel/dark,
/area/ruin/unpowered/syndicate_lava_base/cargo)
@@ -3538,6 +3529,10 @@
/obj/machinery/alarm/syndicate{
pixel_y = 24
},
+/obj/item/radio/headset/syndicate/alt{
+ pixel_x = -3;
+ pixel_y = 3
+ },
/turf/simulated/floor/plasteel/grimy,
/area/ruin/unpowered/syndicate_lava_base/dormitories)
"hN" = (
@@ -3563,6 +3558,10 @@
/obj/machinery/alarm/syndicate{
pixel_y = 24
},
+/obj/item/radio/headset/syndicate/alt{
+ pixel_x = -3;
+ pixel_y = 3
+ },
/turf/simulated/floor/plasteel/grimy,
/area/ruin/unpowered/syndicate_lava_base/dormitories)
"hR" = (
@@ -4480,6 +4479,10 @@
/obj/structure/table/wood,
/obj/item/ammo_box/magazine/m10mm,
/obj/item/ammo_box/magazine/sniper_rounds,
+/obj/item/radio/headset/syndicate/alt{
+ pixel_x = -3;
+ pixel_y = 3
+ },
/turf/simulated/floor/plasteel/grimy,
/area/ruin/unpowered/syndicate_lava_base/dormitories)
"jB" = (
@@ -6068,6 +6071,13 @@
/obj/structure/sign/fire,
/turf/simulated/wall/mineral/plastitanium/coated,
/area/ruin/unpowered/syndicate_lava_base/engineering)
+"ng" = (
+/obj/structure/table,
+/obj/machinery/photocopier/faxmachine/longrange/syndie{
+ department = "Syndicate Bioweapon Research Outpost"
+ },
+/turf/simulated/floor/plasteel/dark,
+/area/ruin/unpowered/syndicate_lava_base/telecomms)
"nh" = (
/obj/machinery/telecomms/relay/preset/ruskie{
use_power = 0
@@ -7337,7 +7347,7 @@ ab
ab
ab
mp
-mP
+ng
nk
nI
oi
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index bd37f2193e5..fea93c6a89e 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -2225,6 +2225,7 @@
icon_state = "1-2";
pixel_y = 0
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plating,
/area/security/prisonershuttle)
"aeG" = (
@@ -7421,8 +7422,11 @@
/turf/simulated/shuttle/floor4/vox,
/area/shuttle/vox)
"amZ" = (
+/obj/item/stack/spacecash/c200,
+/obj/item/stack/spacecash/c50,
+/obj/machinery/light/spot,
/obj/structure/chair/comfy/shuttle{
- dir = 8
+ dir = 1
},
/turf/simulated/shuttle/floor4/vox,
/area/shuttle/vox)
@@ -10422,12 +10426,10 @@
/area/shuttle/trade/sol)
"arW" = (
/obj/structure/chair/comfy/shuttle{
- dir = 1
+ dir = 4
},
-/turf/simulated/shuttle/floor{
- icon_state = "floor4"
- },
-/area/shuttle/siberia)
+/turf/simulated/shuttle/floor,
+/area/shuttle/trade/sol)
"arX" = (
/obj/structure/cable{
icon_state = "0-2";
@@ -10446,14 +10448,15 @@
/turf/simulated/shuttle/floor,
/area/shuttle/trade/sol)
"arZ" = (
-/obj/item/stack/spacecash/c200,
-/obj/item/stack/spacecash/c50,
-/obj/machinery/light/spot,
-/obj/structure/chair/comfy/shuttle{
- dir = 1
+/obj/machinery/atm{
+ pixel_x = 0;
+ pixel_y = 32
},
-/turf/simulated/shuttle/floor4/vox,
-/area/shuttle/vox)
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/simulated/shuttle/floor,
+/area/shuttle/trade/sol)
"asa" = (
/obj/effect/spawner/window/reinforced,
/obj/machinery/door/poddoor/shutters{
@@ -11638,9 +11641,11 @@
/area/shuttle/siberia)
"atL" = (
/obj/structure/chair/comfy/shuttle{
- dir = 4
+ dir = 1
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
},
-/turf/simulated/shuttle/floor,
/area/shuttle/siberia)
"atM" = (
/obj/effect/spawner/window/reinforced,
@@ -12154,6 +12159,7 @@
name = "Labor Camp Airlock";
req_access_txt = "2"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plating,
/area/security/prisonershuttle)
"auz" = (
@@ -12162,6 +12168,7 @@
name = "Labor Shuttle Airlock";
req_access_txt = "2"
},
+/obj/structure/fans/tiny,
/turf/simulated/shuttle/floor{
icon_state = "floor4"
},
@@ -12785,19 +12792,17 @@
/turf/simulated/floor/plasteel,
/area/security/permabrig)
"avp" = (
-/obj/machinery/flasher{
- id = "gulagshuttleflasher";
- pixel_x = 25
- },
-/obj/machinery/light{
- dir = 4;
- icon_state = "tube1"
+/obj/item/radio/intercom{
+ broadcasting = 0;
+ listening = 1;
+ name = "station intercom (General)";
+ pixel_y = 25
},
/obj/structure/chair/comfy/shuttle{
- dir = 8
+ dir = 4
},
/turf/simulated/shuttle/floor,
-/area/shuttle/siberia)
+/area/shuttle/pod_3)
"avq" = (
/turf/simulated/floor/plating,
/area/maintenance/fsmaint)
@@ -12840,19 +12845,18 @@
/turf/simulated/shuttle/floor,
/area/shuttle/pod_3)
"avu" = (
-/obj/machinery/light/spot{
- tag = "icon-tube1 (WEST)";
- icon_state = "tube1";
- dir = 8
+/obj/machinery/status_display{
+ density = 0;
+ layer = 4;
+ pixel_x = 0;
+ pixel_y = 32
},
-/obj/structure/window/reinforced,
+/obj/machinery/light,
/obj/structure/chair/comfy/shuttle{
dir = 4
},
-/turf/simulated/shuttle/floor{
- icon_state = "floor4"
- },
-/area/shuttle/syndicate_sit)
+/turf/simulated/shuttle/floor,
+/area/shuttle/pod_3)
"avv" = (
/obj/machinery/door/airlock/external{
name = "Labor Shuttle Airlock";
@@ -13172,7 +13176,16 @@
},
/turf/simulated/floor/plasteel,
/area/security/lobby)
-"avU" = (
+"avV" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 10
+ },
+/turf/simulated/floor/plasteel,
+/area/security/lobby)
+"avW" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock{
name = "Internal Affairs Office";
@@ -13192,34 +13205,6 @@
dir = 2
},
/area/lawoffice)
-"avV" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 10
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 10
- },
-/turf/simulated/floor/plasteel,
-/area/security/lobby)
-"avW" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor{
- density = 0;
- icon_state = "open";
- id_tag = "Secure Gate";
- name = "Security Blast Door";
- opacity = 0
- },
-/obj/machinery/door/airlock/security/glass{
- id_tag = "BrigEast";
- name = "Brig East Entrance";
- req_access_txt = "63"
- },
-/turf/simulated/floor/plasteel{
- dir = 1;
- icon_state = "darkredcorners"
- },
-/area/security/prison/cell_block/A)
"avX" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/structure/cable{
@@ -13287,11 +13272,12 @@
name = "Brig East Entrance";
req_access_txt = "63"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+/obj/effect/mapping_helpers/airlock/unres{
+ icon_state = "airlock_unres_helper";
dir = 4
},
/turf/simulated/floor/plasteel{
- dir = 8;
+ dir = 1;
icon_state = "darkredcorners"
},
/area/security/prison/cell_block/A)
@@ -13714,13 +13700,31 @@
},
/area/security/permabrig)
"awP" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 8
+/obj/machinery/door/firedoor,
+/obj/machinery/door/poddoor{
+ density = 0;
+ icon_state = "open";
+ id_tag = "Secure Gate";
+ name = "Security Blast Door";
+ opacity = 0
},
-/turf/simulated/shuttle/floor{
- icon_state = "floor4"
+/obj/machinery/door/airlock/security/glass{
+ id_tag = "BrigEast";
+ name = "Brig East Entrance";
+ req_access_txt = "63"
},
-/area/shuttle/syndicate_sit)
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/airlock/unres{
+ icon_state = "airlock_unres_helper";
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "darkredcorners"
+ },
+/area/security/prison/cell_block/A)
"awQ" = (
/obj/structure/cable{
d1 = 2;
@@ -13954,31 +13958,30 @@
/turf/simulated/shuttle/plating,
/area/shuttle/syndicate_sit)
"axm" = (
+/obj/machinery/flasher{
+ id = "gulagshuttleflasher";
+ pixel_x = 25
+ },
+/obj/machinery/light{
+ dir = 4;
+ icon_state = "tube1"
+ },
/obj/structure/chair/comfy/shuttle{
- dir = 4
+ dir = 8
},
-/turf/simulated/shuttle/floor{
- icon_state = "floor4"
- },
-/area/shuttle/syndicate_sit)
+/turf/simulated/shuttle/floor,
+/area/shuttle/siberia)
"axn" = (
/obj/structure/lattice,
/obj/item/stack/cable_coil,
/turf/space,
/area/space/nearstation)
"axo" = (
-/obj/machinery/light/spot{
- tag = "icon-tube1 (WEST)";
- icon_state = "tube1";
- dir = 8
- },
/obj/structure/chair/comfy/shuttle{
dir = 4
},
-/turf/simulated/shuttle/floor{
- icon_state = "floor4"
- },
-/area/shuttle/syndicate_elite)
+/turf/simulated/shuttle/floor,
+/area/shuttle/siberia)
"axp" = (
/obj/structure/bookcase,
/obj/item/book/manual/sop_engineering,
@@ -14330,14 +14333,6 @@
icon_state = "darkredcorners"
},
/area/security/prison/cell_block/A)
-"axN" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 8
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor4"
- },
-/area/shuttle/syndicate_elite)
"axO" = (
/obj/structure/cable{
d1 = 1;
@@ -14534,6 +14529,7 @@
name = "fore bay 1";
width = 9
},
+/obj/structure/fans/tiny,
/turf/simulated/shuttle/floor,
/area/shuttle/siberia)
"ayi" = (
@@ -15207,11 +15203,6 @@
icon_state = "tube1";
dir = 8
},
-/turf/simulated/shuttle/floor{
- icon_state = "floor4"
- },
-/area/shuttle/syndicate_sit)
-"azf" = (
/obj/structure/chair/comfy/shuttle{
dir = 4
},
@@ -15219,17 +15210,33 @@
icon_state = "floor4"
},
/area/shuttle/syndicate_elite)
+"azf" = (
+/obj/machinery/light/spot{
+ tag = "icon-tube1 (WEST)";
+ icon_state = "tube1";
+ dir = 8
+ },
+/obj/structure/window/reinforced,
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/syndicate_sit)
"azg" = (
/turf/simulated/shuttle/floor{
icon_state = "floor4"
},
/area/shuttle/syndicate_elite)
"azh" = (
-/obj/structure/chair/comfy/shuttle,
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
/turf/simulated/shuttle/floor{
icon_state = "floor4"
},
-/area/shuttle/syndicate_sit)
+/area/shuttle/syndicate_elite)
"azi" = (
/obj/machinery/door/window/brigdoor{
dir = 2;
@@ -15809,16 +15816,13 @@
/turf/simulated/floor/plating,
/area/maintenance/abandonedbar)
"aAh" = (
-/obj/structure/shuttle/engine/propulsion/burst{
- dir = 8
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
},
-/turf/simulated/floor/plating,
-/turf/simulated/shuttle/wall{
- tag = "icon-swall_f6";
- icon_state = "swall_f6";
- dir = 2
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
},
-/area/shuttle/pod_3)
+/area/shuttle/syndicate_elite)
"aAi" = (
/obj/machinery/computer/camera_advanced/shuttle_docker/ert,
/turf/simulated/shuttle/floor{
@@ -16421,30 +16425,13 @@
/turf/simulated/floor/plating,
/area/maintenance/abandonedbar)
"aBk" = (
-/obj/item/radio/intercom{
- broadcasting = 0;
- listening = 1;
- name = "station intercom (General)";
- pixel_y = 25
- },
/obj/structure/chair/comfy/shuttle{
dir = 4
},
-/turf/simulated/shuttle/floor,
-/area/shuttle/pod_3)
-"aBl" = (
-/obj/machinery/status_display{
- density = 0;
- layer = 4;
- pixel_x = 0;
- pixel_y = 32
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
},
-/obj/machinery/light,
-/obj/structure/chair/comfy/shuttle{
- dir = 4
- },
-/turf/simulated/shuttle/floor,
-/area/shuttle/pod_3)
+/area/shuttle/syndicate_sit)
"aBm" = (
/obj/item/stack/rods,
/turf/space,
@@ -16570,14 +16557,16 @@
/turf/simulated/floor/plating,
/area/security/prisonershuttle)
"aBC" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
+/obj/structure/shuttle/engine/propulsion/burst{
+ dir = 8
},
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plasteel{
- icon_state = "floorgrime"
+/turf/simulated/floor/plating,
+/turf/simulated/shuttle/wall{
+ tag = "icon-swall_f6";
+ icon_state = "swall_f6";
+ dir = 2
},
-/area/maintenance/fsmaint)
+/area/shuttle/pod_3)
"aBD" = (
/obj/machinery/portable_atmospherics/canister/oxygen,
/turf/simulated/shuttle/floor{
@@ -17323,22 +17312,21 @@
/turf/simulated/floor/plating,
/area/maintenance/abandonedbar)
"aCX" = (
-/obj/structure/shuttle/engine/propulsion/burst{
- dir = 8
- },
-/turf/simulated/floor/plating,
-/turf/simulated/shuttle/wall{
- tag = "icon-swall_f5";
- icon_state = "swall_f5";
- dir = 2
- },
-/area/shuttle/pod_3)
-"aCY" = (
/obj/structure/chair/comfy/shuttle,
/turf/simulated/shuttle/floor{
icon_state = "floor4"
},
/area/shuttle/syndicate_elite)
+"aCY" = (
+/obj/machinery/light/spot{
+ tag = "icon-tube1 (WEST)";
+ icon_state = "tube1";
+ dir = 8
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/syndicate_sit)
"aCZ" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/light{
@@ -17768,17 +17756,14 @@
/turf/simulated/wall,
/area/crew_quarters/mrchangs)
"aDO" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock{
- name = "Magistrate's Office";
- req_access_txt = "74"
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
},
+/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/plasteel{
- tag = "icon-cult";
- icon_state = "cult";
- dir = 2
+ icon_state = "floorgrime"
},
-/area/magistrateoffice)
+/area/maintenance/fsmaint)
"aDP" = (
/turf/simulated/wall,
/area/civilian/barber)
@@ -18992,26 +18977,6 @@
/obj/item/twohanded/required/kirbyplants,
/turf/simulated/floor/wood,
/area/crew_quarters/courtroom)
-"aGv" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock{
- name = "Magistrate's Office";
- req_access_txt = "74"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/turf/simulated/floor/plasteel{
- tag = "icon-cult";
- icon_state = "cult";
- dir = 2
- },
-/area/magistrateoffice)
"aGw" = (
/obj/structure/disposalpipe/junction{
dir = 1;
@@ -19677,16 +19642,16 @@
/turf/simulated/floor/plating,
/area/maintenance/fpmaint2)
"aHV" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/security{
- name = "Detective";
- req_access = null;
- req_access_txt = "4"
+/obj/structure/shuttle/engine/propulsion/burst{
+ dir = 8
},
-/turf/simulated/floor/plasteel{
- icon_state = "grimy"
+/turf/simulated/floor/plating,
+/turf/simulated/shuttle/wall{
+ tag = "icon-swall_f5";
+ icon_state = "swall_f5";
+ dir = 2
},
-/area/security/detectives_office)
+/area/shuttle/pod_3)
"aHW" = (
/obj/structure/cable{
d1 = 1;
@@ -20059,15 +20024,17 @@
},
/area/maintenance/fpmaint2)
"aIM" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock{
+ name = "Magistrate's Office";
+ req_access_txt = "74"
},
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/wood{
- tag = "icon-wood-broken3";
- icon_state = "wood-broken3"
+/turf/simulated/floor/plasteel{
+ tag = "icon-cult";
+ icon_state = "cult";
+ dir = 2
},
-/area/maintenance/fpmaint2)
+/area/magistrateoffice)
"aIN" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
@@ -20729,26 +20696,6 @@
},
/turf/simulated/floor/plasteel,
/area/hallway/primary/fore)
-"aKp" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Courtroom";
- req_access_txt = "63"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/obj/machinery/door/poddoor/shutters{
- density = 0;
- dir = 4;
- icon_state = "open";
- id_tag = "courtroomshutters";
- layer = 3.21;
- name = "Courtroom Privacy Shutters";
- opacity = 0
- },
-/turf/simulated/floor/wood,
-/area/crew_quarters/courtroom)
"aKq" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
@@ -20809,20 +20756,25 @@
},
/area/lawoffice)
"aKx" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock{
+ name = "Magistrate's Office";
+ req_access_txt = "74"
},
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8";
- pixel_y = 0
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
+/turf/simulated/floor/plasteel{
+ tag = "icon-cult";
+ icon_state = "cult";
+ dir = 2
},
-/turf/simulated/floor/plating,
-/area/maintenance/fsmaint)
+/area/magistrateoffice)
"aKy" = (
/obj/item/twohanded/required/kirbyplants,
/turf/simulated/floor/plasteel{
@@ -21131,17 +21083,16 @@
/turf/simulated/floor/plating,
/area/maintenance/fpmaint2)
"aLh" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/security{
+ name = "Detective";
+ req_access = null;
+ req_access_txt = "4"
},
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
+/turf/simulated/floor/plasteel{
+ icon_state = "grimy"
},
-/obj/machinery/atmospherics/pipe/simple/visible/purple,
-/turf/simulated/floor/plating,
-/area/maintenance/fpmaint2)
+/area/security/detectives_office)
"aLi" = (
/obj/structure/cable{
d1 = 2;
@@ -21213,22 +21164,11 @@
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
},
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8";
- tag = ""
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/wood{
+ tag = "icon-wood-broken3";
+ icon_state = "wood-broken3"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/visible/purple{
- dir = 4
- },
-/turf/simulated/floor/plating,
/area/maintenance/fpmaint2)
"aLo" = (
/obj/structure/cable{
@@ -22066,33 +22006,6 @@
},
/turf/simulated/floor/carpet,
/area/crew_quarters/courtroom)
-"aNe" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Courtroom";
- req_access_txt = "63"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4;
- level = 1
- },
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8";
- tag = ""
- },
-/obj/machinery/door/poddoor/shutters{
- density = 0;
- dir = 4;
- icon_state = "open";
- id_tag = "courtroomshutters";
- layer = 3.21;
- name = "Courtroom Privacy Shutters";
- opacity = 0
- },
-/turf/simulated/floor/wood,
-/area/crew_quarters/courtroom)
"aNf" = (
/obj/machinery/access_button{
command = "cycle_interior";
@@ -22451,13 +22364,25 @@
/turf/simulated/floor/plating,
/area/maintenance/fsmaint2)
"aNS" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/public/glass{
+ name = "Courtroom";
+ req_access_txt = "63"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/turf/simulated/floor/plating,
-/area/maintenance/fpmaint2)
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/door/poddoor/shutters{
+ density = 0;
+ dir = 4;
+ icon_state = "open";
+ id_tag = "courtroomshutters";
+ layer = 3.21;
+ name = "Courtroom Privacy Shutters";
+ opacity = 0
+ },
+/turf/simulated/floor/wood,
+/area/crew_quarters/courtroom)
"aNT" = (
/obj/machinery/status_display{
layer = 4;
@@ -22555,21 +22480,6 @@
icon_state = "barber"
},
/area/civilian/barber)
-"aOa" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2";
- tag = ""
- },
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/turf/simulated/floor/plating,
-/area/maintenance/fsmaint2)
"aOb" = (
/obj/machinery/prize_counter,
/obj/machinery/light{
@@ -22879,21 +22789,44 @@
/turf/simulated/floor/plating,
/area/maintenance/electrical)
"aON" = (
-/obj/structure/shuttle/engine/propulsion/burst,
-/turf/simulated/floor/plating,
-/turf/simulated/shuttle/wall{
- icon_state = "swall_f5";
- dir = 2
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
},
-/area/shuttle/pod_1)
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/visible/purple,
+/turf/simulated/floor/plating,
+/area/maintenance/fpmaint2)
"aOO" = (
-/obj/structure/shuttle/engine/propulsion/burst,
-/turf/simulated/floor/plating,
-/turf/simulated/shuttle/wall{
- icon_state = "swall_f9";
- dir = 2
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/public/glass{
+ name = "Courtroom";
+ req_access_txt = "63"
},
-/area/shuttle/pod_1)
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4;
+ level = 1
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ tag = ""
+ },
+/obj/machinery/door/poddoor/shutters{
+ density = 0;
+ dir = 4;
+ icon_state = "open";
+ id_tag = "courtroomshutters";
+ layer = 3.21;
+ name = "Courtroom Privacy Shutters";
+ opacity = 0
+ },
+/turf/simulated/floor/wood,
+/area/crew_quarters/courtroom)
"aOP" = (
/obj/machinery/light/small{
dir = 8
@@ -22978,11 +22911,14 @@
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
},
-/obj/structure/disposalpipe/segment,
/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_y = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
},
/turf/simulated/floor/plating,
/area/maintenance/fsmaint)
@@ -22991,6 +22927,9 @@
/turf/simulated/wall,
/area/maintenance/fpmaint2)
"aPd" = (
+/obj/machinery/light_switch{
+ pixel_y = 27
+ },
/turf/simulated/floor/plasteel{
dir = 4;
icon_state = "yellowcorner"
@@ -23045,9 +22984,23 @@
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ tag = ""
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/visible/purple{
+ dir = 4
+ },
/turf/simulated/floor/plating,
-/area/maintenance/fsmaint)
+/area/maintenance/fpmaint2)
"aPi" = (
/turf/simulated/floor/plating,
/area/maintenance/fpmaint)
@@ -23346,13 +23299,17 @@
/turf/simulated/wall,
/area/maintenance/electrical)
"aPP" = (
-/obj/structure/shuttle/engine/propulsion/burst,
-/turf/simulated/floor/plating,
-/turf/simulated/shuttle/wall{
- icon_state = "swall_f5";
- dir = 2
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
},
-/area/shuttle/pod_2)
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/plating,
+/area/maintenance/fsmaint)
"aPQ" = (
/obj/effect/decal/warning_stripes/north,
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
@@ -23401,16 +23358,15 @@
},
/area/hallway/secondary/entry)
"aPU" = (
-/obj/structure/shuttle/engine/propulsion/burst,
-/turf/simulated/floor/plating,
-/turf/simulated/shuttle/wall{
- icon_state = "swall_f9";
- dir = 2
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
},
-/area/shuttle/pod_2)
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/plating,
+/area/maintenance/fsmaint)
"aPV" = (
/obj/structure/chair/comfy/shuttle{
- dir = 4
+ dir = 8
},
/turf/simulated/shuttle/floor,
/area/shuttle/trade/sol)
@@ -24119,23 +24075,13 @@
/turf/simulated/floor/plating,
/area/maintenance/fpmaint)
"aRm" = (
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8";
- pixel_x = 0
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
+/obj/structure/shuttle/engine/propulsion/burst,
/turf/simulated/floor/plating,
-/area/maintenance/fpmaint)
+/turf/simulated/shuttle/wall{
+ icon_state = "swall_f5";
+ dir = 2
+ },
+/area/shuttle/pod_1)
"aRn" = (
/obj/structure/cable{
d1 = 4;
@@ -24287,21 +24233,13 @@
},
/area/hallway/primary/starboard/west)
"aRz" = (
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8";
- pixel_x = 0;
- tag = ""
- },
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
+/obj/structure/shuttle/engine/propulsion/burst,
/turf/simulated/floor/plating,
-/area/maintenance/fsmaint2)
+/turf/simulated/shuttle/wall{
+ icon_state = "swall_f9";
+ dir = 2
+ },
+/area/shuttle/pod_1)
"aRA" = (
/obj/structure/cable{
d1 = 1;
@@ -24520,16 +24458,13 @@
/turf/simulated/floor/plating,
/area/hallway/secondary/entry)
"aRV" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
+/obj/structure/shuttle/engine/propulsion/burst,
/turf/simulated/floor/plating,
-/area/maintenance/fpmaint)
+/turf/simulated/shuttle/wall{
+ icon_state = "swall_f5";
+ dir = 2
+ },
+/area/shuttle/pod_2)
"aRW" = (
/obj/machinery/light{
icon_state = "tube1";
@@ -24550,19 +24485,13 @@
/turf/simulated/floor/plating,
/area/maintenance/fsmaint2)
"aRY" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2";
- tag = ""
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/structure/shuttle/engine/propulsion/burst,
/turf/simulated/floor/plating,
-/area/maintenance/fpmaint2)
+/turf/simulated/shuttle/wall{
+ icon_state = "swall_f9";
+ dir = 2
+ },
+/area/shuttle/pod_2)
"aRZ" = (
/obj/structure/table,
/obj/machinery/cell_charger,
@@ -25178,12 +25107,19 @@
/turf/simulated/floor/plating,
/area/maintenance/fsmaint2)
"aTs" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0;
+ tag = ""
+ },
/obj/machinery/door/airlock/maintenance{
- name = "Chapel Maintenance";
req_access_txt = "12"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
/turf/simulated/floor/plating,
/area/maintenance/fsmaint2)
"aTt" = (
@@ -25985,10 +25921,8 @@
d2 = 2;
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/plating,
-/area/maintenance/fpmaint2)
+/area/maintenance/fpmaint)
"aVc" = (
/turf/simulated/wall,
/area/security/checkpoint2)
@@ -26453,24 +26387,10 @@
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4;
- level = 1
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8";
- tag = ""
- },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/plating,
-/area/maintenance/fpmaint)
+/area/maintenance/fpmaint2)
"aVM" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/plasteel,
@@ -27582,19 +27502,6 @@
/obj/machinery/lapvend,
/turf/simulated/floor/plasteel,
/area/storage/primary)
-"aXT" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/tranquillite{
- name = "Mime's Office";
- req_access_txt = "46"
- },
-/turf/simulated/floor/plasteel{
- icon_state = "tranquillite";
- dir = 4;
- icon_regular_floor = "yellowsiding";
- icon_plating = "plating"
- },
-/area/mimeoffice)
"aXU" = (
/obj/item/flag/mime,
/obj/machinery/power/apc{
@@ -27915,6 +27822,9 @@
/obj/item/storage/fancy/cigarettes,
/obj/item/lighter/zippo,
/obj/item/pen/multi,
+/obj/item/enginepicker{
+ layer = 3.1
+ },
/turf/simulated/floor/plasteel{
dir = 8;
icon_state = "neutralfull"
@@ -29452,14 +29362,6 @@
dir = 2
},
/area/crew_quarters/dorms)
-"bbx" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/bananium{
- name = "Clown's Office";
- req_access_txt = "46"
- },
-/turf/simulated/floor/wood,
-/area/clownoffice)
"bby" = (
/obj/machinery/camera{
c_tag = "Medbay Morgue";
@@ -30007,14 +29909,23 @@
/turf/simulated/floor/carpet/black,
/area/chapel/office)
"bcv" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
/obj/machinery/door/airlock/maintenance{
- name = "Library Maintenance";
req_access_txt = "12"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/plating,
-/area/maintenance/fsmaint2)
+/area/maintenance/fpmaint)
"bcw" = (
/obj/machinery/alarm{
pixel_y = 25
@@ -30138,15 +30049,11 @@
/turf/simulated/shuttle/floor,
/area/shuttle/escape)
"bcK" = (
-/obj/machinery/atm{
- pixel_x = 0;
- pixel_y = 32
- },
/obj/structure/chair/comfy/shuttle{
- dir = 8
+ dir = 1
},
/turf/simulated/shuttle/floor,
-/area/shuttle/trade/sol)
+/area/shuttle/escape)
"bcL" = (
/obj/machinery/computer/communications,
/turf/simulated/shuttle/floor,
@@ -31136,15 +31043,27 @@
},
/area/hallway/primary/central/north)
"bew" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/glass{
- name = "Chapel Office";
- req_access_txt = "22"
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
},
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4;
+ level = 1
},
-/area/chapel/office)
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ tag = ""
+ },
+/turf/simulated/floor/plating,
+/area/maintenance/fpmaint)
"bex" = (
/obj/machinery/requests_console{
department = "Arrival Shuttle";
@@ -31174,12 +31093,6 @@
/obj/machinery/computer/station_alert,
/turf/simulated/shuttle/floor,
/area/shuttle/escape)
-"beB" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 8
- },
-/turf/simulated/shuttle/floor,
-/area/shuttle/trade/sol)
"beC" = (
/turf/simulated/shuttle/floor,
/area/shuttle/escape)
@@ -31443,14 +31356,18 @@
},
/area/crew_quarters/dorms)
"bfa" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/tranquillite{
+ name = "Mime's Office";
+ req_access_txt = "46"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/turf/simulated/floor/plating,
-/area/maintenance/fpmaint)
+/turf/simulated/floor/plasteel{
+ icon_state = "tranquillite";
+ dir = 4;
+ icon_regular_floor = "yellowsiding";
+ icon_plating = "plating"
+ },
+/area/mimeoffice)
"bfb" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4;
@@ -31506,8 +31423,16 @@
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
},
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ tag = ""
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/plating,
-/area/maintenance/fpmaint)
+/area/maintenance/fpmaint2)
"bfg" = (
/obj/effect/spawner/window/reinforced,
/obj/structure/cable,
@@ -32202,39 +32127,23 @@
/turf/simulated/floor/plasteel,
/area/hallway/secondary/entry)
"bgo" = (
-/obj/machinery/flasher{
- id = "soltraderflash";
- pixel_y = -28
+/obj/structure/closet/walllocker/emerglocker{
+ pixel_x = -28
},
/obj/structure/chair/comfy/shuttle{
- dir = 8
+ dir = 1
},
/turf/simulated/shuttle/floor,
-/area/shuttle/trade/sol)
+/area/shuttle/escape)
"bgp" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
+/obj/structure/closet/walllocker/emerglocker{
+ pixel_x = 28
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 6
- },
-/turf/simulated/floor/plasteel{
- dir = 2;
- icon_state = "asteroid";
- tag = "icon-asteroid (NORTH)"
- },
-/turf/simulated/floor/plasteel{
- tag = "icon-siding2 (NORTH)";
- icon_state = "siding2";
+/obj/structure/chair/comfy/shuttle{
dir = 1
},
-/turf/simulated/floor/plasteel{
- tag = "icon-siding1 (NORTH)";
- icon_state = "siding1";
- dir = 1
- },
-/area/hydroponics)
+/turf/simulated/shuttle/floor,
+/area/shuttle/escape)
"bgq" = (
/obj/machinery/power/apc{
dir = 1;
@@ -33208,56 +33117,21 @@
/turf/simulated/shuttle/floor,
/area/shuttle/escape)
"bil" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/mob/living/simple_animal/pig,
-/turf/simulated/floor/plasteel{
- dir = 2;
- icon_state = "asteroid";
- tag = "icon-asteroid (NORTH)"
- },
-/turf/simulated/floor/plasteel{
- tag = "icon-siding1 (NORTH)";
- icon_state = "siding1";
- dir = 1
- },
-/turf/simulated/floor/plasteel{
- tag = "icon-siding2 (NORTH)";
- icon_state = "siding2";
- dir = 1
- },
-/area/hydroponics)
+/turf/simulated/shuttle/floor,
+/area/shuttle/escape)
"bim" = (
/obj/machinery/light/spot,
/turf/simulated/shuttle/floor,
/area/shuttle/escape)
"bin" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+/obj/structure/chair/comfy/shuttle{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/turf/simulated/floor/plasteel{
- dir = 2;
- icon_state = "asteroid";
- tag = "icon-asteroid (NORTH)"
- },
-/turf/simulated/floor/plasteel{
- tag = "icon-siding1 (NORTH)";
- icon_state = "siding1";
- dir = 1
- },
-/turf/simulated/floor/plasteel{
- tag = "icon-siding2 (NORTH)";
- icon_state = "siding2";
- dir = 1
- },
-/area/hydroponics)
+/turf/simulated/shuttle/floor,
+/area/shuttle/escape)
"bio" = (
/obj/effect/spawner/lootdrop/maintenance,
/obj/structure/cable{
@@ -33805,33 +33679,39 @@
},
/area/hydroponics)
"bje" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 1
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/bananium{
+ name = "Clown's Office";
+ req_access_txt = "46"
},
-/turf/simulated/shuttle/floor,
-/area/shuttle/escape)
+/turf/simulated/floor/wood,
+/area/clownoffice)
"bjf" = (
/obj/structure/reagent_dispensers/beerkeg,
/turf/simulated/floor/wood,
/area/crew_quarters/bar)
"bjg" = (
-/obj/structure/closet/walllocker/emerglocker{
- pixel_x = -28
+/obj/machinery/door/airlock/maintenance{
+ name = "Chapel Maintenance";
+ req_access_txt = "12"
},
-/obj/structure/chair/comfy/shuttle{
- dir = 1
- },
-/turf/simulated/shuttle/floor,
-/area/shuttle/escape)
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/turf/simulated/floor/plating,
+/area/maintenance/fsmaint2)
"bjh" = (
-/obj/structure/closet/walllocker/emerglocker{
- pixel_x = 28
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
},
-/obj/structure/chair/comfy/shuttle{
- dir = 1
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
},
-/turf/simulated/shuttle/floor,
-/area/shuttle/escape)
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/plating,
+/area/maintenance/fpmaint2)
"bji" = (
/obj/item/radio/beacon,
/turf/simulated/floor/plasteel,
@@ -34950,10 +34830,16 @@
/turf/simulated/floor/carpet,
/area/crew_quarters/bar)
"blu" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 8
+/obj/machinery/status_display{
+ pixel_y = 30
},
-/turf/simulated/shuttle/floor,
+/obj/machinery/light/spot{
+ tag = "icon-tube1 (NORTH)";
+ icon_state = "tube1";
+ dir = 1
+ },
+/obj/structure/chair/comfy/shuttle,
+/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
"blv" = (
/obj/machinery/status_display{
@@ -35005,7 +34891,9 @@
/obj/structure/chair/comfy/shuttle{
dir = 4
},
-/turf/simulated/shuttle/floor,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor3"
+ },
/area/shuttle/escape)
"blB" = (
/obj/structure/sign/securearea{
@@ -35021,9 +34909,11 @@
/area/hallway/secondary/entry)
"blC" = (
/obj/structure/chair/comfy/shuttle{
- dir = 4
+ dir = 8
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor3"
},
-/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
"blD" = (
/obj/structure/grille,
@@ -35773,15 +35663,9 @@
/turf/simulated/floor/plasteel,
/area/hallway/primary/central/nw)
"bmX" = (
-/obj/machinery/status_display{
- pixel_y = 30
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
},
-/obj/machinery/light/spot{
- tag = "icon-tube1 (NORTH)";
- icon_state = "tube1";
- dir = 1
- },
-/obj/structure/chair/comfy/shuttle,
/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
"bmY" = (
@@ -35814,6 +35698,9 @@
/turf/simulated/floor/plating,
/area/shuttle/escape)
"bnc" = (
+/obj/structure/closet/walllocker/emerglocker{
+ pixel_x = 28
+ },
/obj/structure/chair/comfy/shuttle{
dir = 8
},
@@ -37078,9 +36965,8 @@
/turf/simulated/floor/plasteel,
/area/assembly/chargebay)
"bpE" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/door/airlock/freezer{
- req_access_txt = "28"
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
},
/obj/structure/cable{
d1 = 1;
@@ -37088,12 +36974,11 @@
icon_state = "1-2";
tag = ""
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/turf/simulated/floor/plasteel{
- icon_state = "showroomfloor"
- },
-/area/crew_quarters/kitchen)
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/plating,
+/area/maintenance/fsmaint2)
"bpF" = (
/obj/machinery/alarm{
dir = 1;
@@ -37365,18 +37250,14 @@
/turf/simulated/floor/wood,
/area/crew_quarters/bar)
"bqj" = (
-/obj/machinery/door/airlock{
- name = "Port Emergency Storage";
- req_access_txt = "0"
- },
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2";
- tag = ""
+/obj/machinery/door/airlock/maintenance{
+ name = "Library Maintenance";
+ req_access_txt = "12"
},
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/plating,
-/area/storage/emergency2)
+/area/maintenance/fsmaint2)
"bqk" = (
/obj/structure/chair/wood/wings{
tag = "icon-wooden_chair_wings (WEST)";
@@ -38799,6 +38680,16 @@
},
/area/maintenance/asmaint2)
"btt" = (
+/obj/item/radio/intercom{
+ dir = 8;
+ name = "station intercom (General)";
+ pixel_x = -28
+ },
+/obj/machinery/light/spot{
+ tag = "icon-tube1 (WEST)";
+ icon_state = "tube1";
+ dir = 8
+ },
/obj/structure/chair/comfy/shuttle{
dir = 4
},
@@ -38807,17 +38698,21 @@
},
/area/shuttle/escape)
"btu" = (
-/obj/structure/shuttle/engine/propulsion{
- dir = 8;
- icon_state = "propulsion";
- tag = "icon-propulsion (EAST)"
+/obj/structure/closet/walllocker/emerglocker{
+ pixel_x = 28
},
-/turf/space,
-/turf/simulated/shuttle/wall{
- icon_state = "swall_f6";
- dir = 2
+/obj/machinery/light/spot{
+ tag = "icon-tube1 (EAST)";
+ icon_state = "tube1";
+ dir = 4
},
-/area/shuttle/transport)
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor3"
+ },
+/area/shuttle/escape)
"btv" = (
/turf/simulated/shuttle/floor,
/turf/simulated/shuttle/wall/interior{
@@ -38857,6 +38752,11 @@
/turf/simulated/shuttle/floor,
/area/shuttle/transport)
"btz" = (
+/obj/machinery/light/spot{
+ tag = "icon-tube1 (NORTH)";
+ icon_state = "tube1";
+ dir = 1
+ },
/obj/structure/chair/comfy/shuttle,
/turf/simulated/shuttle/floor,
/area/shuttle/transport)
@@ -38883,11 +38783,6 @@
/turf/simulated/shuttle/floor,
/area/shuttle/transport)
"btD" = (
-/obj/machinery/light/spot{
- tag = "icon-tube1 (NORTH)";
- icon_state = "tube1";
- dir = 1
- },
/obj/structure/chair/comfy/shuttle,
/turf/simulated/shuttle/floor,
/area/shuttle/transport)
@@ -39959,20 +39854,15 @@
},
/area/crew_quarters/kitchen)
"bvN" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2";
- tag = ""
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/glass{
+ name = "Chapel Office";
+ req_access_txt = "22"
},
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/turf/simulated/floor/plating,
-/area/maintenance/fsmaint2)
+/area/chapel/office)
"bvO" = (
/obj/structure/cable{
icon_state = "0-2";
@@ -40239,17 +40129,14 @@
},
/area/hallway/secondary/exit)
"bwl" = (
+/obj/structure/disposalpipe/segment,
/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/public/glass{
- name = "Kitchen";
- req_access_txt = "28"
+/obj/machinery/door/airlock{
+ name = "Bar Office";
+ req_access_txt = "25"
},
-/turf/simulated/floor/plasteel{
- dir = 2;
- icon_state = "cafeteria";
- tag = "icon-cafeteria (NORTHEAST)"
- },
-/area/crew_quarters/kitchen)
+/turf/simulated/floor/wood,
+/area/crew_quarters/bar)
"bwm" = (
/turf/simulated/floor/plasteel{
dir = 10;
@@ -40445,18 +40332,13 @@
/turf/simulated/shuttle/floor,
/area/shuttle/transport)
"bwI" = (
-/obj/structure/shuttle/engine/propulsion{
- dir = 8;
- icon_state = "propulsion";
- tag = "icon-propulsion (EAST)"
- },
-/turf/space,
-/turf/simulated/shuttle/wall{
- icon_state = "swall_f5";
- dir = 2
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
},
+/turf/simulated/shuttle/floor,
/area/shuttle/transport)
"bwJ" = (
+/obj/machinery/light/spot,
/obj/structure/chair/comfy/shuttle{
dir = 1
},
@@ -40642,14 +40524,21 @@
/turf/simulated/floor/plasteel,
/area/hallway/secondary/exit)
"bwX" = (
-/obj/structure/closet/walllocker/emerglocker{
- pixel_x = -28
+/obj/machinery/door/airlock/maintenance{
+ name = "Bar Maintenance";
+ req_access_txt = "12"
},
-/obj/structure/chair/comfy/shuttle{
- dir = 4
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ tag = ""
},
-/turf/simulated/shuttle/floor4,
-/area/shuttle/escape)
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/plating,
+/area/maintenance/fsmaint2)
"bwY" = (
/obj/machinery/power/apc{
dir = 4;
@@ -41435,16 +41324,14 @@
},
/area/hallway/primary/central/ne)
"bys" = (
-/obj/structure/closet/walllocker/emerglocker{
- pixel_x = 28
+/obj/structure/disposalpipe/segment,
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
},
-/obj/structure/chair/comfy/shuttle{
- dir = 8
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
- },
-/area/shuttle/escape)
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/turf/simulated/floor/plating,
+/area/maintenance/fpmaint)
"byt" = (
/obj/machinery/door/airlock/command/glass{
name = "Bridge";
@@ -42683,12 +42570,20 @@
},
/area/shuttle/specops)
"bAS" = (
-/obj/machinery/light/spot,
-/obj/structure/chair/comfy/shuttle{
+/obj/machinery/recharger/wallcharger{
+ pixel_x = 4;
+ pixel_y = 32
+ },
+/obj/machinery/light/spot{
+ tag = "icon-tube1 (NORTH)";
+ icon_state = "tube1";
dir = 1
},
-/turf/simulated/shuttle/floor,
-/area/shuttle/transport)
+/obj/structure/chair/comfy/shuttle,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/specops)
"bAT" = (
/turf/space,
/turf/simulated/shuttle/wall{
@@ -43143,8 +43038,11 @@
/turf/simulated/floor/plating,
/area/shuttle/escape)
"bBT" = (
+/obj/structure/closet/walllocker/emerglocker{
+ pixel_x = -28
+ },
/obj/structure/chair/comfy/shuttle{
- dir = 1
+ dir = 4
},
/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
@@ -43194,10 +43092,9 @@
},
/area/shuttle/escape)
"bBZ" = (
-/obj/machinery/camera{
- c_tag = "CentComm Special Ops. Shuttle";
- dir = 2;
- network = list("ERT","CentComm")
+/obj/machinery/recharger/wallcharger{
+ pixel_x = 4;
+ pixel_y = 32
},
/obj/structure/chair/comfy/shuttle,
/turf/simulated/shuttle/floor{
@@ -43239,9 +43136,10 @@
/turf/unsimulated/floor,
/area/shuttle/specops)
"bCe" = (
-/obj/machinery/recharger/wallcharger{
- pixel_x = 4;
- pixel_y = 32
+/obj/machinery/camera{
+ c_tag = "CentComm Special Ops. Shuttle";
+ dir = 2;
+ network = list("ERT","CentComm")
},
/obj/structure/chair/comfy/shuttle,
/turf/simulated/shuttle/floor{
@@ -43336,10 +43234,8 @@
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/plating,
-/area/maintenance/port)
+/area/maintenance/fpmaint)
"bCr" = (
/obj/structure/disposalpipe/segment,
/turf/simulated/floor/plating,
@@ -43994,16 +43890,11 @@
},
/area/shuttle/escape)
"bDG" = (
-/obj/machinery/recharger/wallcharger{
- pixel_x = 4;
- pixel_y = 32
- },
/obj/machinery/light/spot{
- tag = "icon-tube1 (NORTH)";
+ tag = "icon-tube1 (WEST)";
icon_state = "tube1";
- dir = 1
+ dir = 8
},
-/obj/structure/chair/comfy/shuttle,
/turf/simulated/shuttle/floor{
icon_state = "floor4"
},
@@ -44488,10 +44379,8 @@
},
/area/shuttle/specops)
"bEL" = (
-/obj/machinery/light/spot{
- tag = "icon-tube1 (WEST)";
- icon_state = "tube1";
- dir = 8
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
},
/turf/simulated/shuttle/floor{
icon_state = "floor4"
@@ -44979,22 +44868,29 @@
/turf/simulated/floor/wood,
/area/bridge/meeting_room)
"bFJ" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
+/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
+ dir = 6
},
-/turf/simulated/floor/plating,
-/area/maintenance/port)
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "asteroid";
+ tag = "icon-asteroid (NORTH)"
+ },
+/turf/simulated/floor/plasteel{
+ tag = "icon-siding2 (NORTH)";
+ icon_state = "siding2";
+ dir = 1
+ },
+/turf/simulated/floor/plasteel{
+ tag = "icon-siding1 (NORTH)";
+ icon_state = "siding1";
+ dir = 1
+ },
+/area/hydroponics)
"bFK" = (
/obj/machinery/computer/communications,
/turf/simulated/floor/wood,
@@ -45586,10 +45482,8 @@
/obj/structure/chair/comfy/shuttle{
dir = 1
},
-/turf/simulated/shuttle/floor{
- icon_state = "floor4"
- },
-/area/shuttle/specops)
+/turf/simulated/shuttle/floor4,
+/area/shuttle/escape)
"bGK" = (
/obj/effect/spawner/window/reinforced,
/obj/machinery/door/poddoor{
@@ -48009,18 +47903,29 @@
/turf/simulated/floor/plasteel,
/area/assembly/chargebay)
"bLn" = (
-/obj/machinery/door/airlock/research{
- name = "Research Division Access";
- req_access_txt = "47"
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/mob/living/simple_animal/pig,
/turf/simulated/floor/plasteel{
- icon_state = "white"
+ dir = 2;
+ icon_state = "asteroid";
+ tag = "icon-asteroid (NORTH)"
},
-/area/medical/research{
- name = "Research Division"
- })
+/turf/simulated/floor/plasteel{
+ tag = "icon-siding1 (NORTH)";
+ icon_state = "siding1";
+ dir = 1
+ },
+/turf/simulated/floor/plasteel{
+ tag = "icon-siding2 (NORTH)";
+ icon_state = "siding2";
+ dir = 1
+ },
+/area/hydroponics)
"bLo" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
@@ -48400,26 +48305,28 @@
/turf/simulated/floor/plasteel,
/area/assembly/robotics)
"bLU" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Disposal Access";
- req_access_txt = "12"
- },
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/structure/disposalpipe/segment{
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "asteroid";
+ tag = "icon-asteroid (NORTH)"
},
-/turf/simulated/floor/plating,
-/area/maintenance/port)
+/turf/simulated/floor/plasteel{
+ tag = "icon-siding1 (NORTH)";
+ icon_state = "siding1";
+ dir = 1
+ },
+/turf/simulated/floor/plasteel{
+ tag = "icon-siding2 (NORTH)";
+ icon_state = "siding2";
+ dir = 1
+ },
+/area/hydroponics)
"bLV" = (
/obj/item/storage/firstaid/o2{
pixel_x = 5;
@@ -48700,20 +48607,6 @@
icon_state = "brown"
},
/area/quartermaster/office)
-"bMz" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/mining/glass{
- name = "Cargo Bay";
- req_access_txt = "31"
- },
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8";
- pixel_x = 0
- },
-/turf/simulated/floor/plasteel,
-/area/quartermaster/storage)
"bMA" = (
/obj/machinery/mineral/ore_redemption,
/turf/simulated/floor/plasteel,
@@ -48746,13 +48639,22 @@
/turf/simulated/wall,
/area/hallway/primary/central/sw)
"bMF" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/mining/glass{
- name = "Delivery Office";
- req_access_txt = "50"
+/obj/structure/disposalpipe/segment,
+/obj/machinery/door/airlock/freezer{
+ req_access_txt = "28"
},
-/turf/simulated/floor/plasteel,
-/area/quartermaster/office)
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ tag = ""
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/turf/simulated/floor/plasteel{
+ icon_state = "showroomfloor"
+ },
+/area/crew_quarters/kitchen)
"bMG" = (
/turf/simulated/wall/r_wall,
/area/crew_quarters/heads)
@@ -49604,25 +49506,18 @@
/turf/simulated/floor/plasteel,
/area/quartermaster/office)
"bNP" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/mining/glass{
- name = "Delivery Office";
- req_access_txt = "50"
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
},
/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8";
- pixel_x = 0
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/turf/simulated/floor/plasteel,
-/area/quartermaster/office)
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/plating,
+/area/maintenance/port)
"bNQ" = (
/obj/machinery/light{
icon_state = "tube1";
@@ -49897,24 +49792,13 @@
},
/area/quartermaster/office)
"bOn" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/mining/glass{
- name = "Cargo Bay";
- req_access_txt = "31"
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
},
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/turf/simulated/floor/plasteel,
-/area/quartermaster/storage)
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/turf/simulated/floor/plating,
+/area/maintenance/port)
"bOo" = (
/obj/effect/landmark{
name = "blobstart"
@@ -50563,25 +50447,18 @@
/turf/simulated/floor/plasteel,
/area/hallway/secondary/exit)
"bPr" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor{
- density = 0;
- icon_state = "open";
- id_tag = "Biohazard_medi";
- name = "Quarantine Lockdown";
- opacity = 0
+/obj/machinery/door/airlock{
+ name = "Port Emergency Storage";
+ req_access_txt = "0"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/door/airlock/medical/glass{
- id_tag = "MedbayFoyerPort";
- name = "Medbay Entrance";
- req_access_txt = "5"
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ tag = ""
},
-/turf/simulated/floor/plasteel{
- icon_state = "white"
- },
-/area/medical/reception)
+/turf/simulated/floor/plating,
+/area/storage/emergency2)
"bPs" = (
/obj/machinery/status_display,
/turf/simulated/wall/r_wall,
@@ -50604,25 +50481,17 @@
/turf/simulated/floor/plasteel,
/area/hallway/secondary/exit)
"bPv" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor{
- density = 0;
- icon_state = "open";
- id_tag = "Biohazard_medi";
- name = "Quarantine Lockdown";
- opacity = 0
+/obj/structure/shuttle/engine/propulsion{
+ dir = 8;
+ icon_state = "propulsion";
+ tag = "icon-propulsion (EAST)"
},
-/obj/machinery/door/airlock/medical/glass{
- id_tag = "MedbayFoyerPort";
- name = "Medbay Entrance";
- req_access_txt = "5"
+/turf/space,
+/turf/simulated/shuttle/wall{
+ icon_state = "swall_f6";
+ dir = 2
},
-/turf/simulated/floor/plasteel{
- tag = "icon-whiteblue (WEST)";
- icon_state = "whiteblue";
- dir = 8
- },
-/area/medical/reception)
+/area/shuttle/transport)
"bPw" = (
/obj/machinery/atmospherics/unary/vent_scrubber{
dir = 4;
@@ -50634,25 +50503,20 @@
/turf/simulated/floor/plating,
/area/maintenance/disposal)
"bPx" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor{
- density = 0;
- icon_state = "open";
- id_tag = "Biohazard_medi";
- name = "Quarantine Lockdown";
- opacity = 0
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ tag = ""
},
-/obj/machinery/door/airlock/medical/glass{
- id_tag = "MedbayFoyerPort";
- name = "Medbay Entrance";
- req_access_txt = "5"
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
},
-/turf/simulated/floor/plasteel{
- dir = 4;
- icon_state = "whiteblue";
- tag = "icon-whitehall (WEST)"
- },
-/area/medical/reception)
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/plating,
+/area/maintenance/fsmaint2)
"bPy" = (
/obj/structure/table,
/obj/item/assembly/prox_sensor{
@@ -50840,23 +50704,17 @@
},
/area/shuttle/administration)
"bPM" = (
-/obj/item/radio/intercom{
- dir = 8;
- name = "station intercom (General)";
- pixel_x = -28
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/public/glass{
+ name = "Kitchen";
+ req_access_txt = "28"
},
-/obj/machinery/light/spot{
- tag = "icon-tube1 (WEST)";
- icon_state = "tube1";
- dir = 8
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cafeteria";
+ tag = "icon-cafeteria (NORTHEAST)"
},
-/obj/structure/chair/comfy/shuttle{
- dir = 4
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
- },
-/area/shuttle/escape)
+/area/crew_quarters/kitchen)
"bPN" = (
/obj/machinery/door/airlock/external{
id_tag = "s_docking_airlock";
@@ -50932,22 +50790,17 @@
/turf/simulated/floor/plating,
/area/quartermaster/storage)
"bPU" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor{
- density = 0;
- icon_state = "open";
- id_tag = "Biohazard_medi";
- name = "Quarantine Lockdown";
- opacity = 0
+/obj/structure/shuttle/engine/propulsion{
+ dir = 8;
+ icon_state = "propulsion";
+ tag = "icon-propulsion (EAST)"
},
-/obj/machinery/door/airlock/medical/glass{
- id_tag = "MedbayFoyer";
- name = "Medbay Emergency Entrance";
- req_access_txt = "5"
+/turf/space,
+/turf/simulated/shuttle/wall{
+ icon_state = "swall_f5";
+ dir = 2
},
-/obj/effect/decal/warning_stripes/northeast,
-/turf/simulated/floor/plasteel,
-/area/hallway/primary/central/se)
+/area/shuttle/transport)
"bPV" = (
/obj/effect/landmark/start{
name = "Cargo Technician"
@@ -52056,21 +51909,22 @@
},
/area/shuttle/administration)
"bRH" = (
-/obj/structure/closet/walllocker/emerglocker{
- pixel_x = 28
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
},
-/obj/machinery/light/spot{
- tag = "icon-tube1 (EAST)";
- icon_state = "tube1";
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
-/obj/structure/chair/comfy/shuttle{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
},
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
- },
-/area/shuttle/escape)
+/turf/simulated/floor/plating,
+/area/maintenance/port)
"bRI" = (
/obj/structure/plasticflaps/mining,
/obj/machinery/conveyor/east{
@@ -52545,36 +52399,39 @@
/turf/simulated/floor/plating,
/area/medical/chemistry)
"bSz" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/medical/glass{
- id_tag = "MedbayFoyer";
- name = "Medical Supplies";
- req_access_txt = "5"
+/obj/machinery/door/airlock/research{
+ name = "Research Division Access";
+ req_access_txt = "47"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/plasteel{
- tag = "icon-whitebluefull";
- icon_state = "whitebluefull"
+ icon_state = "white"
},
-/area/medical/biostorage)
+/area/medical/research{
+ name = "Research Division"
+ })
"bSA" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/medical/glass{
- id_tag = "MedbayFoyer";
- name = "Medical Supplies";
- req_access_txt = "5"
+/obj/machinery/door/airlock/maintenance{
+ name = "Disposal Access";
+ req_access_txt = "12"
},
-/turf/simulated/floor/plasteel{
- tag = "icon-whitebluefull";
- icon_state = "whitebluefull"
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
},
-/area/medical/biostorage)
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/plating,
+/area/maintenance/port)
"bSB" = (
/obj/machinery/atmospherics/unary/cryo_cell,
/turf/simulated/floor/plasteel{
@@ -54149,19 +54006,39 @@
/turf/simulated/floor/plasteel,
/area/engine/gravitygenerator)
"bVk" = (
-/obj/structure/chair/comfy/shuttle{
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/mining/glass{
+ name = "Delivery Office";
+ req_access_txt = "50"
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
-/turf/simulated/shuttle/floor{
- icon_state = "floor2"
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
},
-/area/shuttle/constructionsite)
+/turf/simulated/floor/plasteel,
+/area/quartermaster/office)
"bVl" = (
-/obj/machinery/light,
-/turf/simulated/shuttle/floor{
- icon_state = "floor2"
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/mining/glass{
+ name = "Cargo Bay";
+ req_access_txt = "31"
},
-/area/shuttle/constructionsite)
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/turf/simulated/floor/plasteel,
+/area/quartermaster/storage)
"bVm" = (
/obj/machinery/light/spot{
tag = "icon-tube1 (WEST)";
@@ -54423,20 +54300,13 @@
},
/area/toxins/lab)
"bVH" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/mining/glass{
+ name = "Delivery Office";
+ req_access_txt = "50"
},
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2";
- pixel_y = 0;
- tag = ""
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/turf/simulated/floor/plating,
-/area/maintenance/asmaint2)
+/turf/simulated/floor/plasteel,
+/area/quartermaster/office)
"bVI" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/public/glass{
@@ -55132,34 +55002,24 @@
},
/area/shuttle/administration)
"bWO" = (
-/obj/machinery/light/spot{
- tag = "icon-tube1 (NORTH)";
- icon_state = "tube1";
- dir = 1
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/mining/glass{
+ name = "Cargo Bay";
+ req_access_txt = "31"
},
-/obj/machinery/door_control{
- id = "adminshuttleblast";
- name = "Blast door control";
- pixel_x = -5;
- pixel_y = 35;
- req_access = list(101);
- req_access_txt = "0"
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
},
-/obj/machinery/door_control{
- id = "adminshuttleshutters";
- name = "Shutter control";
- pixel_x = 5;
- pixel_y = 35;
- req_access = list(101);
- req_access_txt = "0"
- },
-/obj/structure/chair/comfy/shuttle{
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
-/turf/simulated/shuttle/floor{
- icon_state = "floor4"
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
},
-/area/shuttle/administration)
+/turf/simulated/floor/plasteel,
+/area/quartermaster/storage)
"bWP" = (
/obj/machinery/door/airlock/external{
id_tag = "s_docking_airlock";
@@ -55366,19 +55226,20 @@
/turf/simulated/floor/plasteel,
/area/quartermaster/office)
"bXi" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/mining/glass{
- name = "Cargo Office";
- req_access_txt = "50"
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0;
+ tag = ""
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/turf/simulated/floor/plasteel,
-/area/quartermaster/office)
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/turf/simulated/floor/plating,
+/area/maintenance/asmaint2)
"bXj" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 9;
@@ -56135,17 +55996,26 @@
},
/area/shuttle/administration)
"bYu" = (
-/obj/item/radio/intercom{
- broadcasting = 0;
- listening = 1;
- name = "station intercom (General)";
- pixel_y = 25
+/obj/machinery/door/firedoor,
+/obj/machinery/door/poddoor{
+ density = 0;
+ icon_state = "open";
+ id_tag = "Biohazard_medi";
+ name = "Quarantine Lockdown";
+ opacity = 0
},
-/obj/structure/chair/comfy/shuttle{
- dir = 4
+/obj/machinery/door/airlock/medical/glass{
+ id_tag = "MedbayFoyerPort";
+ name = "Medbay Entrance";
+ req_access_txt = "5"
},
-/turf/simulated/shuttle/floor,
-/area/shuttle/pod_4)
+/obj/effect/mapping_helpers/airlock/unres,
+/turf/simulated/floor/plasteel{
+ tag = "icon-whiteblue (WEST)";
+ icon_state = "whiteblue";
+ dir = 8
+ },
+/area/medical/reception)
"bYv" = (
/turf/space,
/turf/simulated/shuttle/wall{
@@ -56417,9 +56287,6 @@
/area/server)
"bYV" = (
/obj/structure/table,
-/obj/machinery/photocopier/faxmachine{
- department = "Head of Personnel's Office"
- },
/obj/machinery/firealarm{
dir = 1;
pixel_y = -24
@@ -56432,6 +56299,9 @@
pixel_y = 16;
req_access_txt = "57"
},
+/obj/machinery/photocopier/faxmachine/longrange{
+ department = "Head of Personnel's Office"
+ },
/turf/simulated/floor/plasteel,
/area/crew_quarters/heads)
"bYW" = (
@@ -57142,31 +57012,25 @@
/area/medical/genetics_cloning)
"bZR" = (
/obj/machinery/door/firedoor,
+/obj/machinery/door/poddoor{
+ density = 0;
+ icon_state = "open";
+ id_tag = "Biohazard_medi";
+ name = "Quarantine Lockdown";
+ opacity = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/door/airlock/medical/glass{
- id_tag = "CloningDoor";
- name = "Genetics Cloning";
- req_access_txt = "0";
- req_one_access_txt = "5;9"
- },
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8";
- tag = ""
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
+ id_tag = "MedbayFoyerPort";
+ name = "Medbay Entrance";
+ req_access_txt = "5"
},
+/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/plasteel{
- icon_state = "freezerfloor"
+ icon_state = "white"
},
-/area/medical/genetics_cloning)
+/area/medical/reception)
"bZS" = (
/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
dir = 1;
@@ -57192,7 +57056,7 @@
name = "Biohazard Shutter Control";
pixel_x = -4;
pixel_y = 6;
- req_access_txt = "47"
+ req_access_txt = "30"
},
/obj/item/folder/white{
pixel_x = 4
@@ -57208,7 +57072,7 @@
normaldoorcontrol = 1;
pixel_x = -4;
pixel_y = -4;
- req_access_txt = "20"
+ req_access_txt = "30"
},
/turf/simulated/floor/plasteel{
dir = 2;
@@ -57429,18 +57293,26 @@
/turf/simulated/wall,
/area/quartermaster/miningdock)
"can" = (
-/obj/machinery/status_display{
+/obj/machinery/door/firedoor,
+/obj/machinery/door/poddoor{
density = 0;
- layer = 4;
- pixel_x = 0;
- pixel_y = 32
+ icon_state = "open";
+ id_tag = "Biohazard_medi";
+ name = "Quarantine Lockdown";
+ opacity = 0
},
-/obj/machinery/light,
-/obj/structure/chair/comfy/shuttle{
- dir = 4
+/obj/machinery/door/airlock/medical/glass{
+ id_tag = "MedbayFoyerPort";
+ name = "Medbay Entrance";
+ req_access_txt = "5"
},
-/turf/simulated/shuttle/floor,
-/area/shuttle/pod_4)
+/obj/effect/mapping_helpers/airlock/unres,
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "whiteblue";
+ tag = "icon-whitehall (WEST)"
+ },
+/area/medical/reception)
"cao" = (
/obj/structure/filingcabinet,
/turf/simulated/floor/plasteel,
@@ -58153,32 +58025,24 @@
},
/area/crew_quarters/hor)
"cbr" = (
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8";
- pixel_x = 0;
- tag = ""
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
/obj/machinery/door/firedoor,
-/obj/machinery/door/poddoor{
- density = 0;
- icon_state = "open";
- id_tag = "Biohazard_medi";
- name = "Quarantine Lockdown";
- opacity = 0
- },
/obj/machinery/door/airlock/medical/glass{
id_tag = "MedbayFoyer";
- name = "Medbay Emergency Entrance";
+ name = "Medical Supplies";
req_access_txt = "5"
},
-/obj/effect/decal/warning_stripes/southeast,
-/turf/simulated/floor/plasteel,
-/area/hallway/primary/central/se)
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/plasteel{
+ tag = "icon-whitebluefull";
+ icon_state = "whitebluefull"
+ },
+/area/medical/biostorage)
"cbs" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -58245,26 +58109,31 @@
},
/area/shuttle/administration)
"cby" = (
-/obj/machinery/light/spot{
- tag = "icon-tube1 (EAST)";
- icon_state = "tube1";
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/medical/glass{
+ id_tag = "MedbayFoyer";
+ name = "Medical Supplies";
+ req_access_txt = "5"
+ },
+/turf/simulated/floor/plasteel{
+ tag = "icon-whitebluefull";
+ icon_state = "whitebluefull"
+ },
+/area/medical/biostorage)
+"cbz" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/mining/glass{
+ name = "Cargo Office";
+ req_access_txt = "50"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
-/obj/structure/chair/comfy/shuttle{
- dir = 8
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
},
-/turf/simulated/shuttle/floor{
- icon_state = "floor4"
- },
-/area/shuttle/administration)
-"cbz" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 8
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor4"
- },
-/area/shuttle/administration)
+/turf/simulated/floor/plasteel,
+/area/quartermaster/office)
"cbA" = (
/obj/machinery/door/poddoor/shutters{
density = 0;
@@ -58498,16 +58367,25 @@
/area/medical/genetics_cloning)
"cbY" = (
/obj/machinery/door/firedoor,
+/obj/machinery/door/poddoor{
+ density = 0;
+ icon_state = "open";
+ id_tag = "Biohazard_medi";
+ name = "Quarantine Lockdown";
+ opacity = 0
+ },
/obj/machinery/door/airlock/medical/glass{
- id_tag = "CloningDoor";
- name = "Genetics Cloning";
- req_access_txt = "0";
- req_one_access_txt = "5;9"
+ id_tag = "MedbayFoyer";
+ name = "Medbay Emergency Entrance";
+ req_access_txt = "5"
},
-/turf/simulated/floor/plasteel{
- icon_state = "freezerfloor"
+/obj/effect/decal/warning_stripes/northeast,
+/obj/effect/mapping_helpers/airlock/unres{
+ icon_state = "airlock_unres_helper";
+ dir = 4
},
-/area/medical/genetics_cloning)
+/turf/simulated/floor/plasteel,
+/area/hallway/primary/central/se)
"cbZ" = (
/obj/structure/cable{
d1 = 4;
@@ -59518,11 +59396,36 @@
},
/area/shuttle/administration)
"cdq" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 1
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/medical/glass{
+ id_tag = "CloningDoor";
+ name = "Genetics Cloning";
+ req_access_txt = "0";
+ req_one_access_txt = "5;9"
},
-/turf/simulated/shuttle/floor,
-/area/shuttle/mining)
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ tag = ""
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/effect/mapping_helpers/airlock/unres{
+ icon_state = "airlock_unres_helper";
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "freezerfloor"
+ },
+/area/medical/genetics_cloning)
"cdr" = (
/obj/machinery/computer/camera_advanced/shuttle_docker/admin{
name = "NTV Argos shuttle navigation computer"
@@ -60300,17 +60203,36 @@
},
/area/crew_quarters/hor)
"ceT" = (
-/obj/structure/window/plasmareinforced{
- color = "#FF0000";
- dir = 8
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0;
+ tag = ""
},
-/obj/structure/chair/comfy/shuttle{
- dir = 1
+/obj/structure/disposalpipe/segment{
+ dir = 4
},
-/turf/simulated/shuttle/floor{
- icon_state = "floor4"
+/obj/machinery/door/firedoor,
+/obj/machinery/door/poddoor{
+ density = 0;
+ icon_state = "open";
+ id_tag = "Biohazard_medi";
+ name = "Quarantine Lockdown";
+ opacity = 0
},
-/area/shuttle/administration)
+/obj/machinery/door/airlock/medical/glass{
+ id_tag = "MedbayFoyer";
+ name = "Medbay Emergency Entrance";
+ req_access_txt = "5"
+ },
+/obj/effect/decal/warning_stripes/southeast,
+/obj/effect/mapping_helpers/airlock/unres{
+ icon_state = "airlock_unres_helper";
+ dir = 4
+ },
+/turf/simulated/floor/plasteel,
+/area/hallway/primary/central/se)
"ceU" = (
/obj/structure/shuttle/engine/propulsion,
/turf/simulated/shuttle/plating,
@@ -61271,8 +61193,13 @@
},
/area/shuttle/administration)
"cgA" = (
+/obj/machinery/light/spot{
+ tag = "icon-tube1 (EAST)";
+ icon_state = "tube1";
+ dir = 4
+ },
/obj/structure/chair/comfy/shuttle{
- dir = 1
+ dir = 8
},
/turf/simulated/shuttle/floor{
icon_state = "floor4"
@@ -61631,11 +61558,21 @@
/turf/simulated/wall,
/area/medical/paramedic)
"chi" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/medical/glass{
+ id_tag = "CloningDoor";
+ name = "Genetics Cloning";
+ req_access_txt = "0";
+ req_one_access_txt = "5;9"
},
-/turf/simulated/floor/plating,
-/area/maintenance/asmaint)
+/obj/effect/mapping_helpers/airlock/unres{
+ icon_state = "airlock_unres_helper";
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "freezerfloor"
+ },
+/area/medical/genetics_cloning)
"chj" = (
/obj/structure/cable{
d1 = 4;
@@ -62278,30 +62215,22 @@
},
/area/shuttle/administration)
"cil" = (
-/obj/structure/shuttle/engine/propulsion/burst{
+/obj/structure/chair/comfy/shuttle{
dir = 8
},
-/turf/simulated/floor/plating,
-/turf/simulated/shuttle/wall{
- tag = "icon-swall_f6";
- icon_state = "swall_f6";
- dir = 2
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
},
-/area/shuttle/pod_4)
+/area/shuttle/administration)
"cim" = (
/turf/simulated/shuttle/floor,
/area/shuttle/mining)
"cin" = (
-/obj/structure/shuttle/engine/propulsion/burst{
- dir = 8
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
},
-/turf/simulated/floor/plating,
-/turf/simulated/shuttle/wall{
- tag = "icon-swall_f5";
- icon_state = "swall_f5";
- dir = 2
- },
-/area/shuttle/pod_4)
+/turf/simulated/shuttle/floor,
+/area/shuttle/mining)
"cio" = (
/obj/machinery/door/window/brigdoor/westleft{
color = "#d70000";
@@ -63093,31 +63022,11 @@
},
/area/medical/ward)
"cjA" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/medical{
- name = "Operating Theatre";
- req_access_txt = "45"
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8";
- pixel_x = 0;
- tag = ""
- },
-/obj/machinery/holosign/surgery{
- id = "surgery1"
- },
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/medical/surgery1)
+/turf/simulated/floor/plating,
+/area/maintenance/asmaint2)
"cjB" = (
/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,
/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,
@@ -63155,31 +63064,20 @@
},
/area/medical/ward)
"cjD" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/medical{
- name = "Operating Theatre";
- req_access_txt = "45"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
},
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/structure/disposalpipe/segment,
/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8";
- pixel_x = 0;
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
tag = ""
},
-/obj/machinery/holosign/surgery{
- id = "surgery2"
- },
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/medical/surgery2)
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/plating,
+/area/maintenance/apmaint)
"cjE" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -63516,12 +63414,32 @@
icon_state = "floor4"
},
/area/shuttle/administration)
+"ckh" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
"cki" = (
/obj/machinery/light/small{
dir = 8
},
/turf/simulated/shuttle/floor,
/area/shuttle/mining)
+"ckj" = (
+/obj/structure/window/plasmareinforced{
+ color = "#FF0000";
+ dir = 8
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
"ckk" = (
/obj/machinery/door/airlock/shuttle{
id_tag = "s_docking_airlock";
@@ -63544,6 +63462,7 @@
name = "mining shuttle bay";
width = 7
},
+/obj/structure/fans/tiny,
/turf/simulated/shuttle/floor,
/area/shuttle/mining)
"ckl" = (
@@ -63552,6 +63471,7 @@
name = "Mining Dock Airlock";
req_access_txt = "48"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plating,
/area/quartermaster/miningdock)
"ckm" = (
@@ -63560,6 +63480,7 @@
name = "Mining Dock Airlock";
req_access_txt = "48"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel,
/area/quartermaster/miningdock)
"ckn" = (
@@ -63809,20 +63730,21 @@
/turf/simulated/floor/plasteel,
/area/quartermaster/qm)
"ckI" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/structure/disposalpipe/segment,
/obj/structure/cable{
d1 = 1;
d2 = 2;
- icon_state = "1-2";
- tag = ""
+ icon_state = "1-2"
+ },
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/command{
+ id_tag = "blueshieldofficedoor";
+ name = "Blueshield's Office";
+ req_access_txt = "67"
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/turf/simulated/floor/plating,
-/area/maintenance/apmaint)
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/turf/simulated/floor/wood,
+/area/blueshield)
"ckJ" = (
/obj/structure/sink{
pixel_y = 30
@@ -63857,29 +63779,6 @@
icon_state = "1-2"
},
/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/command{
- id_tag = "blueshieldofficedoor";
- name = "Blueshield's Office";
- req_access_txt = "67"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/turf/simulated/floor/wood,
-/area/blueshield)
-"ckO" = (
-/obj/structure/disposalpipe/segment,
-/turf/simulated/floor/plasteel{
- dir = 8;
- icon_state = "cautioncorner"
- },
-/area/hallway/primary/aft)
-"ckP" = (
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/command{
id_tag = "ntrepofficedoor";
name = "NT Representative's Office";
@@ -63889,6 +63788,21 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/wood,
/area/ntrep)
+"ckO" = (
+/obj/structure/disposalpipe/segment,
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "cautioncorner"
+ },
+/area/hallway/primary/aft)
+"ckP" = (
+/obj/machinery/door/airlock{
+ name = "Custodial Closet";
+ req_access_txt = "26"
+ },
+/obj/structure/disposalpipe/segment,
+/turf/simulated/floor/plasteel,
+/area/janitor)
"ckQ" = (
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
@@ -63909,13 +63823,19 @@
/turf/simulated/floor/plating,
/area/maintenance/asmaint)
"ckT" = (
-/obj/machinery/door/airlock{
- name = "Custodial Closet";
- req_access_txt = "26"
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
},
-/obj/structure/disposalpipe/segment,
-/turf/simulated/floor/plasteel,
-/area/janitor)
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ tag = ""
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/plating,
+/area/maintenance/asmaint)
"ckU" = (
/obj/machinery/body_scanconsole,
/obj/machinery/camera{
@@ -64002,7 +63922,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/plating,
-/area/maintenance/asmaint)
+/area/maintenance/asmaint2)
"clb" = (
/obj/structure/table/glass,
/obj/machinery/computer/med_data/laptop,
@@ -64773,35 +64693,11 @@
},
/area/medical/medbreak)
"cmt" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8";
- pixel_x = 0;
- tag = ""
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/door/airlock/medical/glass{
- id_tag = "";
- name = "Staff Room";
- req_access_txt = "5";
- req_one_access_txt = "0"
- },
-/turf/simulated/floor/plasteel{
- dir = 2;
- icon_state = "cafeteria";
- tag = "icon-cafeteria (NORTHEAST)"
- },
-/area/medical/medbay2)
+/turf/simulated/floor/plating,
+/area/maintenance/asmaint)
"cmu" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -65219,7 +65115,7 @@
/turf/simulated/wall,
/area/toxins/test_area)
"cnl" = (
-/obj/structure/closet/wardrobe/miner/lavaland,
+/obj/structure/closet/wardrobe/miner,
/turf/simulated/floor/plasteel{
dir = 2;
icon_state = "brown"
@@ -66492,12 +66388,18 @@
/turf/simulated/wall,
/area/maintenance/genetics)
"cpk" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0;
+ tag = ""
+ },
/obj/machinery/door/airlock/maintenance{
- name = "Medbay Maintenance";
- req_access_txt = "5"
+ req_access_txt = "12"
},
/turf/simulated/floor/plating,
-/area/maintenance/genetics)
+/area/maintenance/asmaint)
"cpl" = (
/obj/structure/cable,
/obj/structure/table,
@@ -67211,6 +67113,32 @@
icon_state = "whitepurple"
},
/area/toxins/mixing)
+"cqo" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/medical{
+ name = "Operating Theatre";
+ req_access_txt = "45"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0;
+ tag = ""
+ },
+/obj/machinery/holosign/surgery{
+ id = "surgery1"
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/medical/surgery1)
"cqp" = (
/obj/machinery/camera{
c_tag = "Research Toxins Launch Room";
@@ -67369,6 +67297,17 @@
/turf/simulated/floor/plasteel,
/area/hallway/primary/aft)
"cqw" = (
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/medical{
+ name = "Operating Theatre";
+ req_access_txt = "45"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
/obj/structure/cable{
d1 = 4;
d2 = 8;
@@ -67376,11 +67315,13 @@
pixel_x = 0;
tag = ""
},
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
+/obj/machinery/holosign/surgery{
+ id = "surgery2"
},
-/turf/simulated/floor/plating,
-/area/maintenance/asmaint)
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/medical/surgery2)
"cqx" = (
/obj/machinery/doppler_array{
dir = 4
@@ -71437,17 +71378,34 @@
/area/maintenance/asmaint)
"cxj" = (
/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/research{
- name = "Xenobiology Research";
- req_access_txt = "47"
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0;
+ tag = ""
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/door/airlock/medical/glass{
+ id_tag = "";
+ name = "Staff Room";
+ req_access_txt = "5";
+ req_one_access_txt = "0"
},
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/plasteel{
- icon_state = "white"
+ dir = 2;
+ icon_state = "cafeteria";
+ tag = "icon-cafeteria (NORTHEAST)"
},
-/area/toxins/xenobiology)
+/area/medical/medbay2)
"cxk" = (
/obj/structure/cable{
icon_state = "0-4";
@@ -72095,28 +72053,6 @@
},
/turf/simulated/floor/plasteel,
/area/storage/tech)
-"cyu" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8";
- pixel_x = 0;
- tag = ""
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/turf/simulated/floor/plating,
-/area/maintenance/asmaint)
"cyv" = (
/obj/structure/sign/securearea{
desc = "A warning sign which reads 'HIGH VOLTAGE'";
@@ -72250,23 +72186,11 @@
/area/construction)
"cyE" = (
/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8";
- pixel_x = 0;
- tag = ""
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
+ name = "Medbay Maintenance";
+ req_access_txt = "5"
},
/turf/simulated/floor/plating,
-/area/maintenance/asmaint2)
+/area/maintenance/genetics)
"cyF" = (
/obj/structure/cable{
d1 = 4;
@@ -72394,18 +72318,18 @@
/turf/simulated/floor/plating,
/area/maintenance/asmaint)
"cyT" = (
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8";
- pixel_x = 0;
- tag = ""
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/research{
+ name = "Xenobiology Research";
+ req_access_txt = "47"
},
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/turf/simulated/floor/plasteel{
+ icon_state = "white"
},
-/turf/simulated/floor/plating,
-/area/maintenance/asmaint2)
+/area/toxins/xenobiology)
"cyU" = (
/obj/item/twohanded/required/kirbyplants,
/obj/structure/extinguisher_cabinet{
@@ -72689,6 +72613,9 @@
/turf/simulated/floor/plating,
/area/storage/tech)
"czx" = (
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
+ },
/obj/structure/cable{
d1 = 4;
d2 = 8;
@@ -72696,10 +72623,8 @@
pixel_x = 0;
tag = ""
},
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/engineering{
- name = "Tech Storage";
- req_access_txt = "23"
+/obj/structure/disposalpipe/segment{
+ dir = 4
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -72708,7 +72633,7 @@
dir = 4
},
/turf/simulated/floor/plating,
-/area/storage/tech)
+/area/maintenance/asmaint)
"czy" = (
/obj/structure/cable{
d1 = 4;
@@ -73391,24 +73316,24 @@
/turf/simulated/floor/plating,
/area/maintenance/apmaint)
"cAG" = (
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
+ },
/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2";
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0;
tag = ""
},
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/research{
- name = "Xenobiology Research";
- req_access_txt = "47"
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
},
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/turf/simulated/floor/plasteel{
- icon_state = "white"
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
},
-/area/toxins/xenobiology)
+/turf/simulated/floor/plating,
+/area/maintenance/asmaint2)
"cAH" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable{
@@ -73839,22 +73764,18 @@
/turf/simulated/floor/plating,
/area/medical/psych)
"cBx" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/medical{
- name = "Psych Office";
- req_access_txt = "64"
- },
/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2";
- pixel_y = 0
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0;
+ tag = ""
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/turf/simulated/floor/wood,
-/area/medical/psych)
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
+ },
+/turf/simulated/floor/plating,
+/area/maintenance/asmaint2)
"cBy" = (
/obj/machinery/atmospherics/unary/vent_scrubber{
dir = 1;
@@ -74450,14 +74371,6 @@
},
/turf/simulated/floor/plating,
/area/maintenance/apmaint)
-"cCF" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/maintenance{
- name = "Alternate Construction Area";
- req_access_txt = "12"
- },
-/turf/simulated/floor/plating,
-/area/maintenance/apmaint)
"cCG" = (
/obj/structure/cable{
d1 = 2;
@@ -74482,16 +74395,22 @@
d1 = 4;
d2 = 8;
icon_state = "4-8";
- pixel_y = 0;
+ pixel_x = 0;
tag = ""
},
/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/maintenance{
- name = "Alternate Construction Area";
- req_access_txt = "12"
+/obj/machinery/door/airlock/engineering{
+ name = "Tech Storage";
+ req_access_txt = "23"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
},
/turf/simulated/floor/plating,
-/area/maintenance/consarea)
+/area/storage/tech)
"cCJ" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/engineering/glass{
@@ -74822,6 +74741,10 @@
/obj/machinery/light_switch{
pixel_y = 27
},
+/obj/machinery/alarm{
+ frequency = 1439;
+ pixel_y = 23
+ },
/turf/simulated/floor/plasteel{
dir = 1;
icon_state = "yellowcorner"
@@ -74933,20 +74856,24 @@
/turf/simulated/floor/plating,
/area/toxins/misc_lab)
"cDv" = (
-/obj/structure/disposalpipe/segment,
/obj/structure/cable{
d1 = 1;
d2 = 2;
icon_state = "1-2";
tag = ""
},
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/research{
+ name = "Xenobiology Research";
+ req_access_txt = "47"
},
+/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/turf/simulated/floor/plating,
-/area/maintenance/apmaint)
+/turf/simulated/floor/plasteel{
+ icon_state = "white"
+ },
+/area/toxins/xenobiology)
"cDw" = (
/turf/simulated/floor/plasteel{
icon_state = "white"
@@ -75799,14 +75726,9 @@
/turf/simulated/wall/r_wall,
/area/engine/mechanic_workshop)
"cFe" = (
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2";
- tag = ""
- },
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/maintenance{
+ name = "Alternate Construction Area";
req_access_txt = "12"
},
/turf/simulated/floor/plating,
@@ -76330,25 +76252,20 @@
},
/area/toxins/misc_lab)
"cFT" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_y = 0;
+ tag = ""
+ },
/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/engineering/glass{
- name = "Mechanic Workshop";
- req_access_txt = "70";
- req_one_access_txt = "0"
+/obj/machinery/door/airlock/maintenance{
+ name = "Alternate Construction Area";
+ req_access_txt = "12"
},
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/engine/mechanic_workshop)
+/turf/simulated/floor/plating,
+/area/maintenance/consarea)
"cFU" = (
/obj/structure/window/reinforced,
/obj/structure/table/reinforced,
@@ -76830,9 +76747,22 @@
/turf/simulated/wall/r_wall,
/area/atmos/control)
"cGL" = (
-/obj/machinery/door/airlock/maintenance,
-/turf/simulated/floor/plating,
-/area/maintenance/genetics)
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/medical{
+ name = "Psych Office";
+ req_access_txt = "64"
+ },
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ pixel_y = 0
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/wood,
+/area/medical/psych)
"cGM" = (
/obj/structure/cable{
d1 = 2;
@@ -77331,16 +77261,14 @@
d1 = 1;
d2 = 2;
icon_state = "1-2";
- pixel_y = 0;
tag = ""
},
+/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/plating,
-/area/maintenance/aft)
+/area/maintenance/apmaint)
"cHF" = (
/obj/structure/cable{
d1 = 1;
@@ -77479,23 +77407,20 @@
/turf/simulated/wall,
/area/engine/break_room)
"cHR" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/engineering/glass{
- name = "Engineering";
- req_access_txt = "32";
- req_one_access_txt = "0"
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ tag = ""
},
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/turf/simulated/floor/plasteel,
-/area/engine/break_room)
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/plating,
+/area/maintenance/apmaint)
"cHS" = (
/obj/structure/table,
/obj/item/book/manual/supermatter_engine,
@@ -78704,18 +78629,25 @@
},
/area/engine/mechanic_workshop)
"cJY" = (
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2";
- tag = ""
- },
/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
+/obj/machinery/door/airlock/engineering/glass{
+ name = "Mechanic Workshop";
+ req_access_txt = "70";
+ req_one_access_txt = "0"
},
-/turf/simulated/floor/plating,
-/area/maintenance/aft)
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/engine/mechanic_workshop)
"cJZ" = (
/turf/simulated/wall,
/area/hallway/primary/aft)
@@ -79921,6 +79853,13 @@
/turf/simulated/floor/plating,
/area/maintenance/asmaint2)
"cMq" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ tag = ""
+ },
+/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
},
@@ -80981,16 +80920,18 @@
},
/area/assembly/assembly_line)
"cOs" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
/obj/structure/cable{
d1 = 1;
d2 = 2;
icon_state = "1-2";
+ pixel_y = 0;
tag = ""
},
-/obj/structure/disposalpipe/segment,
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/plating,
/area/maintenance/aft)
"cOt" = (
@@ -81776,12 +81717,6 @@
},
/turf/simulated/floor/plasteel,
/area/atmos)
-"cPR" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
-/turf/simulated/floor/plasteel,
-/area/atmos)
"cPS" = (
/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
dir = 4;
@@ -81893,14 +81828,6 @@
/obj/effect/decal/warning_stripes/northeast,
/turf/simulated/floor/plasteel,
/area/engine/engineering)
-"cQd" = (
-/obj/machinery/alarm{
- frequency = 1439;
- pixel_y = 23
- },
-/obj/machinery/pipedispenser,
-/turf/simulated/floor/plasteel,
-/area/atmos)
"cQe" = (
/obj/machinery/atmospherics/pipe/simple/visible/green{
dir = 4;
@@ -82310,10 +82237,6 @@
},
/turf/simulated/floor/plasteel,
/area/engine/equipmentstorage)
-"cQQ" = (
-/obj/machinery/pipedispenser/disposal,
-/turf/simulated/floor/plasteel,
-/area/atmos)
"cQR" = (
/obj/machinery/firealarm{
dir = 1;
@@ -83137,10 +83060,6 @@
"cSd" = (
/turf/simulated/floor/plasteel,
/area/atmos)
-"cSe" = (
-/obj/structure/closet/wardrobe/atmospherics_yellow,
-/turf/simulated/floor/plasteel,
-/area/atmos)
"cSf" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 5
@@ -84049,22 +83968,23 @@
/turf/simulated/floor/plating/airless,
/area/space/nearstation)
"cTG" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Engineering Shuttle";
- req_access_txt = "0";
- req_one_access_txt = "10;24"
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/engineering/glass{
+ name = "Engineering";
+ req_access_txt = "32";
+ req_one_access_txt = "0"
},
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2";
- tag = ""
+/obj/structure/disposalpipe/segment{
+ dir = 4
},
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/turf/simulated/floor/plating,
-/area/maintenance/engi_shuttle)
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/turf/simulated/floor/plasteel,
+/area/engine/break_room)
"cTH" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/plasteel,
@@ -86495,7 +86415,6 @@
/obj/machinery/light{
dir = 8
},
-/obj/machinery/suit_storage_unit/atmos,
/turf/simulated/floor/plasteel,
/area/atmos)
"cXP" = (
@@ -88255,7 +88174,7 @@
req_access_txt = "12"
},
/turf/simulated/floor/plating,
-/area/maintenance/asmaint2)
+/area/maintenance/aft)
"dbi" = (
/obj/structure/closet/crate,
/obj/item/clothing/under/color/lightpurple,
@@ -88309,17 +88228,18 @@
/turf/simulated/floor/plasteel,
/area/escapepodbay)
"dbp" = (
-/obj/machinery/door/airlock/maintenance,
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/machinery/door/airlock/maintenance{
+ req_access_txt = "12"
},
/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8"
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ tag = ""
},
+/obj/structure/disposalpipe/segment,
/turf/simulated/floor/plating,
-/area/maintenance/asmaint)
+/area/maintenance/aft)
"dbq" = (
/obj/structure/cable{
d1 = 1;
@@ -88788,12 +88708,6 @@
/area/maintenance/asmaint)
"dci" = (
/obj/machinery/door/airlock/maintenance,
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2";
- tag = ""
- },
/turf/simulated/floor/plating,
/area/maintenance/genetics)
"dcj" = (
@@ -89130,6 +89044,7 @@
req_access_txt = "0";
req_one_access_txt = "10;24"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plating,
/area/maintenance/engi_shuttle)
"dcV" = (
@@ -89631,6 +89546,23 @@
/obj/structure/lattice/catwalk,
/turf/space,
/area/solar/starboard)
+"ddW" = (
+/obj/machinery/door/airlock/maintenance{
+ name = "Engineering Shuttle";
+ req_access_txt = "0";
+ req_one_access_txt = "10;24"
+ },
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ tag = ""
+ },
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/turf/simulated/floor/plating,
+/area/maintenance/engi_shuttle)
"ddX" = (
/obj/machinery/access_button{
command = "cycle_exterior";
@@ -89807,6 +89739,28 @@
oxygen = 0
},
/area/atmos)
+"deo" = (
+/obj/machinery/door/airlock/maintenance,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/plating,
+/area/maintenance/asmaint)
+"dep" = (
+/obj/machinery/door/airlock/maintenance,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2";
+ tag = ""
+ },
+/turf/simulated/floor/plating,
+/area/maintenance/genetics)
"deq" = (
/obj/machinery/computer/guestpass,
/turf/simulated/wall,
@@ -90199,18 +90153,15 @@
/turf/simulated/floor/plating,
/area/storage/secure)
"dff" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
+/obj/machinery/door/airlock/maintenance,
/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
},
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/plating,
-/area/maintenance/port)
+/area/maintenance/asmaint2)
"dfg" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable{
@@ -90683,6 +90634,7 @@
name = "engineering dock";
width = 7
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plating,
/area/shuttle/constructionsite)
"dga" = (
@@ -90709,6 +90661,18 @@
dir = 6
},
/area/maintenance/storage)
+"dge" = (
+/obj/machinery/door/airlock/maintenance{
+ name = "Biohazard Disposals";
+ req_access_txt = "12"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/turf/simulated/floor/plating,
+/area/maintenance/asmaint)
+"dgf" = (
+/obj/machinery/door/airlock/maintenance,
+/turf/simulated/floor/plating,
+/area/maintenance/asmaint2)
"dgg" = (
/obj/machinery/atmospherics/pipe/simple/visible/cyan{
level = 2
@@ -90855,6 +90819,17 @@
/obj/machinery/light/small,
/turf/simulated/floor/plating,
/area/maintenance/asmaint2)
+"dgC" = (
+/obj/structure/shuttle/engine/propulsion/burst{
+ dir = 8
+ },
+/turf/simulated/floor/plating,
+/turf/simulated/shuttle/wall{
+ tag = "icon-swall_f6";
+ icon_state = "swall_f6";
+ dir = 2
+ },
+/area/shuttle/pod_4)
"dgD" = (
/obj/structure/shuttle/engine/propulsion{
dir = 8;
@@ -91043,6 +91018,16 @@
/obj/item/caution,
/turf/simulated/floor/plating,
/area/maintenance/asmaint)
+"dhb" = (
+/obj/machinery/flasher{
+ id = "soltraderflash";
+ pixel_y = -28
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/simulated/shuttle/floor,
+/area/shuttle/trade/sol)
"dhc" = (
/obj/structure/lattice,
/obj/structure/lattice,
@@ -91466,30 +91451,16 @@
},
/area/crew_quarters/toilet)
"dhT" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock{
- name = "Bar Office";
- req_access_txt = "25"
+/obj/structure/shuttle/engine/propulsion/burst{
+ dir = 8
},
-/turf/simulated/floor/wood,
-/area/crew_quarters/bar)
-"dhU" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Bar Maintenance";
- req_access_txt = "12"
- },
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2";
- tag = ""
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/plating,
-/area/maintenance/fsmaint2)
+/turf/simulated/shuttle/wall{
+ tag = "icon-swall_f5";
+ icon_state = "swall_f5";
+ dir = 2
+ },
+/area/shuttle/pod_4)
"dhV" = (
/obj/structure/sink/kitchen{
pixel_y = 28
@@ -91498,6 +91469,12 @@
icon_state = "showroomfloor"
},
/area/crew_quarters/kitchen)
+"dhW" = (
+/obj/machinery/light,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor2"
+ },
+/area/shuttle/constructionsite)
"dhX" = (
/obj/machinery/computer/atmos_alert,
/turf/simulated/shuttle/floor{
@@ -91541,16 +91518,6 @@
},
/turf/simulated/floor/plating,
/area/maintenance/asmaint2)
-"die" = (
-/obj/machinery/door/airlock/maintenance,
-/obj/structure/cable{
- d1 = 4;
- d2 = 8;
- icon_state = "4-8";
- pixel_x = 0
- },
-/turf/simulated/floor/plating,
-/area/maintenance/asmaint2)
"dif" = (
/turf/simulated/shuttle/wall{
tag = "icon-swall2";
@@ -91755,6 +91722,12 @@
icon_state = "blue"
},
/area/hallway/primary/central/north)
+"diy" = (
+/obj/structure/chair/comfy/shuttle,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/syndicate_sit)
"diz" = (
/obj/machinery/light/small,
/obj/machinery/camera/motion{
@@ -92914,14 +92887,6 @@
/obj/structure/disposalpipe/segment,
/turf/simulated/wall,
/area/maintenance/asmaint2)
-"dkG" = (
-/obj/machinery/door/airlock/maintenance{
- name = "Biohazard Disposals";
- req_access_txt = "12"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/turf/simulated/floor/plating,
-/area/maintenance/asmaint)
"dkH" = (
/obj/machinery/light/small{
dir = 4;
@@ -93297,20 +93262,15 @@
name = "\improper AI Satellite Service"
})
"dle" = (
-/obj/machinery/the_singularitygen{
- anchored = 1
- },
/obj/effect/decal/warning_stripes/west,
-/turf/simulated/floor/plating/airless,
-/area/space/nearstation)
-"dlf" = (
/obj/item/wrench,
/turf/simulated/floor/plating/airless,
/area/space/nearstation)
+"dlf" = (
+/obj/item/radio/beacon/engine/tesling,
+/turf/simulated/floor/plating/airless,
+/area/space/nearstation)
"dlg" = (
-/obj/machinery/the_singularitygen/tesla{
- anchored = 1
- },
/obj/effect/decal/warning_stripes/east,
/turf/simulated/floor/plating/airless,
/area/space/nearstation)
@@ -93582,10 +93542,6 @@
/area/aisat/maintenance{
name = "\improper AI Satellite Service"
})
-"dlL" = (
-/obj/machinery/door/airlock/maintenance,
-/turf/simulated/floor/plating,
-/area/maintenance/asmaint2)
"dlM" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/light/small,
@@ -95203,6 +95159,18 @@
/obj/machinery/teleport/hub,
/turf/simulated/floor/plating,
/area/turret_protected/aisat_interior)
+"doI" = (
+/obj/item/radio/intercom{
+ broadcasting = 0;
+ listening = 1;
+ name = "station intercom (General)";
+ pixel_y = 25
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/simulated/shuttle/floor,
+/area/shuttle/pod_4)
"doK" = (
/obj/machinery/light,
/turf/simulated/floor/plating,
@@ -95221,6 +95189,19 @@
},
/turf/simulated/shuttle/floor,
/area/shuttle/pod_4)
+"doM" = (
+/obj/machinery/status_display{
+ density = 0;
+ layer = 4;
+ pixel_x = 0;
+ pixel_y = 32
+ },
+/obj/machinery/light,
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/simulated/shuttle/floor,
+/area/shuttle/pod_4)
"doN" = (
/obj/machinery/computer/station_alert,
/obj/machinery/alarm{
@@ -96133,20 +96114,6 @@
"dsw" = (
/turf/simulated/floor/mech_bay_recharge_floor,
/area/shuttle/escape)
-"dsx" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/structure/cable{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2";
- tag = ""
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/turf/simulated/floor/plating,
-/area/maintenance/asmaint2)
"dsy" = (
/obj/machinery/light/small{
dir = 4
@@ -96328,19 +96295,7 @@
/obj/machinery/atmospherics/pipe/simple/visible/universal{
dir = 4
},
-/obj/structure/table,
-/obj/item/clothing/glasses/welding,
-/obj/item/clothing/glasses/welding,
-/obj/item/clothing/gloves/color/black,
-/obj/item/clothing/gloves/color/black,
-/obj/item/clothing/gloves/color/black,
-/obj/machinery/alarm{
- dir = 4;
- icon_state = "alarm0";
- pixel_x = -22
- },
-/obj/item/pipe_painter,
-/obj/item/pipe_painter,
+/obj/structure/closet/wardrobe/atmospherics_yellow,
/turf/simulated/floor/plasteel,
/area/atmos)
"dtk" = (
@@ -96529,6 +96484,35 @@
/area/toxins/launch{
name = "Toxins Launch Room"
})
+"jnJ" = (
+/obj/machinery/light/spot{
+ tag = "icon-tube1 (NORTH)";
+ icon_state = "tube1";
+ dir = 1
+ },
+/obj/machinery/door_control{
+ id = "adminshuttleblast";
+ name = "Blast door control";
+ pixel_x = -5;
+ pixel_y = 35;
+ req_access = list(101);
+ req_access_txt = "0"
+ },
+/obj/machinery/door_control{
+ id = "adminshuttleshutters";
+ name = "Shutter control";
+ pixel_x = 5;
+ pixel_y = 35;
+ req_access = list(101);
+ req_access_txt = "0"
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/administration)
"kOE" = (
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{
dir = 4
@@ -96536,21 +96520,26 @@
/obj/structure/lattice,
/turf/space,
/area/space/nearstation)
+"lLC" = (
+/obj/machinery/alarm{
+ dir = 4;
+ icon_state = "alarm0";
+ pixel_x = -22
+ },
+/turf/simulated/floor/plasteel,
+/area/atmos)
+"mMw" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/simulated/shuttle/floor4/vox,
+/area/shuttle/vox)
"nMi" = (
/obj/machinery/atmospherics/pipe/simple/heat_exchanging{
dir = 9
},
/turf/space,
/area/space/nearstation)
-"opK" = (
-/obj/effect/landmark/start{
- name = "Shaft Miner"
- },
-/turf/simulated/floor/plasteel{
- dir = 8;
- icon_state = "brown"
- },
-/area/quartermaster/miningdock)
"oZV" = (
/obj/machinery/door/airlock/centcom{
id_tag = "adminshuttle";
@@ -96621,6 +96610,14 @@
icon_state = "floor4"
},
/area/shuttle/administration)
+"sUK" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor4"
+ },
+/area/shuttle/syndicate_sit)
"uxy" = (
/obj/machinery/atmospherics/pipe/simple/heat_exchanging{
dir = 4
@@ -96650,6 +96647,34 @@
/obj/structure/lattice,
/turf/space,
/area/space/nearstation)
+"vUm" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor2"
+ },
+/area/shuttle/constructionsite)
+"wOS" = (
+/obj/structure/table,
+/obj/item/clothing/gloves/color/black,
+/obj/item/clothing/gloves/color/black,
+/obj/item/clothing/gloves/color/black,
+/obj/item/pipe_painter,
+/obj/item/pipe_painter,
+/obj/item/clothing/glasses/welding,
+/obj/item/clothing/glasses/welding,
+/turf/simulated/floor/plasteel,
+/area/atmos)
+"wVD" = (
+/obj/effect/landmark/start{
+ name = "Shaft Miner"
+ },
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "brown"
+ },
+/area/quartermaster/miningdock)
"xAw" = (
/obj/machinery/atmospherics/pipe/manifold/visible{
dir = 8
@@ -103736,7 +103761,7 @@ arh
arh
arh
arh
-aPV
+arW
arh
apr
aaa
@@ -103990,9 +104015,9 @@ aaa
apr
arh
aqk
-aPV
-aPV
-aPV
+arW
+arW
+arW
dhe
arh
apr
@@ -104504,9 +104529,9 @@ aaa
apr
arh
aql
-bcK
-beB
-bgo
+arZ
+aPV
+dhb
aql
arh
apr
@@ -105295,9 +105320,9 @@ aaa
aaa
aaa
aaa
-btu
+bPv
bvi
-bwI
+bPU
aaa
aaa
aaa
@@ -105551,11 +105576,11 @@ aab
aaa
aaa
aaa
-btu
+bPv
btv
bvj
bwE
-bwI
+bPU
aaa
bAQ
bCa
@@ -106044,7 +106069,7 @@ aaa
aJP
aLa
aLa
-aON
+aRm
aOP
aMs
aVf
@@ -106073,7 +106098,7 @@ brO
aaa
bAR
bCc
-bEL
+bDG
bEK
bAR
aLd
@@ -106323,9 +106348,9 @@ aSf
boP
aSd
brQ
-btz
+btD
bvj
-bwJ
+bwI
brQ
bjQ
bAR
@@ -106558,7 +106583,7 @@ aaa
aJQ
aLa
aLa
-aOO
+aRz
aOR
aQa
aMd
@@ -106580,15 +106605,15 @@ blE
boL
aSd
brO
-btz
+btD
bvj
-bwJ
+bwI
brO
aLd
bAR
-bBZ
+bCe
bCb
-bGJ
+bEL
bAR
aSd
aaa
@@ -106837,15 +106862,15 @@ bmS
boL
aSd
brO
-btD
+btz
bvj
-bAS
+bwJ
brO
aSd
ahb
bCb
bCb
-bGJ
+bEL
bAR
aSd
aSd
@@ -107072,7 +107097,7 @@ aaa
aJR
aLe
aLe
-aPP
+aRV
aOP
aMs
aPJ
@@ -107094,15 +107119,15 @@ aSf
bsd
aSd
brO
-btz
+btD
bvj
-bwJ
+bwI
brO
aSd
ahb
bCb
bCb
-bGJ
+bEL
bAR
aSd
bGm
@@ -107351,15 +107376,15 @@ aSf
bsh
aSd
brR
-btz
+btD
bvj
-bwJ
+bwI
brR
aSd
bAR
-bCe
+bBZ
bCb
-bGJ
+bEL
bAR
aSd
bGl
@@ -107586,7 +107611,7 @@ aaa
aJT
aLe
aLe
-aPU
+aRY
aOR
aQa
aPQ
@@ -107608,15 +107633,15 @@ brc
bsh
aSd
brO
-btz
+btD
bvj
-bwJ
+bwI
brO
aMs
bAR
-bDG
+bAS
bCb
-bGJ
+bEL
bAR
aSd
bKp
@@ -107829,11 +107854,11 @@ aaa
awq
axj
awM
-axo
-azf
-azf
+aze
+aAh
+aAh
aCT
-aCY
+aCX
afy
aFf
aFe
@@ -107865,9 +107890,9 @@ blE
bsh
aSd
brO
-btD
+btz
bvj
-bAS
+bwJ
brO
aMs
bAT
@@ -108142,7 +108167,7 @@ bRA
bRA
bWJ
bPI
-bWO
+jnJ
cbx
cbx
bPI
@@ -108343,11 +108368,11 @@ aaa
aws
axj
awN
-axN
-axN
-axN
+azh
+azh
+azh
aBD
-aCY
+aCX
aEe
aFf
aFg
@@ -108359,7 +108384,7 @@ aII
aII
aHS
aLg
-aNS
+aVL
aQw
aRe
aSd
@@ -108662,7 +108687,7 @@ cds
bPI
cgz
cio
-ceT
+ckj
bPI
bYv
aaa
@@ -108919,7 +108944,7 @@ aaa
bPI
bRA
bRA
-cgA
+ckh
bPI
aaa
aaa
@@ -109174,8 +109199,8 @@ aaa
aaa
aaa
bPI
-cby
-cbz
+cgA
+cil
bPI
bYv
aaa
@@ -109669,7 +109694,7 @@ bqr
bBr
bqr
bqr
-bFJ
+bRH
bCf
bCf
bCf
@@ -110925,7 +110950,7 @@ aHh
aIx
aIx
aJU
-aLh
+aON
aLl
aGn
aOV
@@ -111473,7 +111498,7 @@ bIe
bJu
bnK
bCh
-bLU
+bSA
bCf
bCf
bCf
@@ -111697,7 +111722,7 @@ aLk
aGn
aGn
aPc
-aLn
+aPh
aGn
aGn
aGn
@@ -112217,7 +112242,7 @@ aGn
aGn
aGn
aRu
-aRY
+bff
aSF
aTz
aVh
@@ -113000,7 +113025,7 @@ beP
bgz
bse
bvd
-dff
+bNP
dfg
dfh
dgU
@@ -113479,12 +113504,12 @@ aaa
awv
axl
ayk
-avu
+azf
aEf
-axm
-axm
-aze
-azh
+aBk
+aBk
+aCY
+diy
aFk
aFi
aGn
@@ -113492,7 +113517,7 @@ aGn
aGn
aGn
aHn
-aIM
+aLn
aGn
aKe
aLq
@@ -113994,11 +114019,11 @@ awx
axl
ayk
azi
-awP
-awP
-awP
+sUK
+sUK
+sUK
ayk
-azh
+diy
aex
aFi
aGn
@@ -114018,7 +114043,7 @@ aGn
aPc
aGn
aSK
-aVb
+bjh
aWl
aYi
bag
@@ -116070,7 +116095,7 @@ aPi
aPi
aHS
aMA
-aRm
+bcv
aMA
aKb
aNx
@@ -116116,7 +116141,7 @@ ceZ
cgB
cim
cki
-cdq
+cin
cnh
ceZ
aab
@@ -116129,11 +116154,11 @@ csu
csu
cCE
cAF
-cFe
+cHE
cGf
cGf
cGf
-cJY
+cMq
cJn
cLi
cNA
@@ -116352,7 +116377,7 @@ bwY
bsk
bnD
bBf
-bCq
+bOn
bJy
bKG
bxb
@@ -116371,9 +116396,9 @@ aaa
aaa
ceY
cgC
-cdq
+cin
cim
-cdq
+cin
cni
coN
aab
@@ -116392,7 +116417,7 @@ cFW
cIJ
cEY
cLm
-cMq
+dbh
cNB
cNB
cPu
@@ -116630,7 +116655,7 @@ ceZ
cgD
cim
cim
-cdq
+cin
cnj
ceZ
aab
@@ -116855,7 +116880,7 @@ beK
bgh
bmf
bkr
-bCq
+bOn
bCs
bCs
bCs
@@ -117883,7 +117908,7 @@ beN
bgA
blO
bph
-bqj
+bPr
brz
bsD
bui
@@ -118157,8 +118182,8 @@ bFq
bFm
bxb
bKB
-bMz
-bOn
+bVl
+bWO
bKB
bxb
bxb
@@ -118172,7 +118197,7 @@ cam
cgH
cit
ckn
-opK
+wVD
cnm
cam
cgQ
@@ -118351,7 +118376,7 @@ atK
auw
avv
awz
-atL
+axo
aym
azk
aAk
@@ -118604,7 +118629,7 @@ aaa
aaa
aaa
asT
-arW
+atL
aux
avy
awz
@@ -118865,7 +118890,7 @@ atJ
auu
avx
awy
-avp
+axm
awz
azk
aAk
@@ -119164,7 +119189,7 @@ aSz
aSz
aSz
aSz
-bfa
+bys
biE
bmx
bpj
@@ -119184,7 +119209,7 @@ bDU
bNs
bHc
byC
-bNP
+bVk
bMx
bSM
bUn
@@ -119211,7 +119236,7 @@ cvo
cvo
cvo
cvo
-cCF
+cFe
cvo
cEY
cEP
@@ -119472,7 +119497,7 @@ cwF
cwF
cEY
cEO
-cFT
+cJY
cGH
cEY
cEY
@@ -119704,7 +119729,7 @@ bzJ
bQe
bDX
bDX
-bXi
+cbz
bzJ
bYK
bYM
@@ -119988,7 +120013,7 @@ cvo
cEQ
cGb
cGM
-cHE
+cOs
cIP
cIP
cKJ
@@ -120011,9 +120036,9 @@ cZu
cZu
dcM
dfY
-bVk
-bVk
-bVk
+vUm
+vUm
+vUm
dfY
aaa
aaa
@@ -120213,7 +120238,7 @@ bzE
bzE
bzE
bNX
-bMF
+bVH
bBn
bBn
bBn
@@ -120270,7 +120295,7 @@ dcU
dfZ
dgv
dgv
-bVl
+dhW
dfY
aaa
aaa
@@ -120526,7 +120551,7 @@ dcM
dfd
dfY
dgv
-bVk
+vUm
dgv
dfY
aaa
@@ -121267,7 +121292,7 @@ cvo
cvo
cvo
cvo
-cCI
+cFT
cvo
cvo
cEQ
@@ -121285,7 +121310,7 @@ cKb
cKb
cRI
cSj
-cTG
+ddW
cUY
cZC
dar
@@ -121767,7 +121792,7 @@ caw
bTz
cfq
ciy
-ckI
+cjD
cly
cly
cly
@@ -121783,7 +121808,7 @@ cti
cly
cAH
cly
-cDv
+cHR
cFg
cGm
cnA
@@ -122248,7 +122273,7 @@ aXZ
bmu
aPi
aPi
-bff
+bCq
bgS
bmV
bkv
@@ -122733,7 +122758,7 @@ aoe
aMO
aod
aod
-avU
+avW
aod
aod
aoe
@@ -122795,7 +122820,7 @@ bMG
cdV
cfu
ciL
-ckN
+ckI
ccK
cmK
com
@@ -122997,14 +123022,14 @@ aIo
aIl
aIl
aDe
-aDO
+aIM
aIl
aIl
aHA
aHA
-aKp
+aNS
aHA
-aNe
+aOO
aHA
aHA
aEl
@@ -124035,7 +124060,7 @@ aLV
aJF
aOA
aPD
-aRV
+aVb
aTw
aVE
aYa
@@ -124337,7 +124362,7 @@ bTJ
ces
cgi
cji
-ckP
+ckN
clL
cmM
coo
@@ -124541,7 +124566,7 @@ aCi
aCf
aCn
aFr
-aGv
+aKx
aHG
aHG
aKv
@@ -125065,7 +125090,7 @@ aSN
aPH
aEj
aMA
-aVL
+bew
aMA
aMA
aMA
@@ -125120,7 +125145,7 @@ cgW
cvx
cvx
cvx
-czx
+cCI
cvx
cvx
cvx
@@ -125134,7 +125159,7 @@ cJk
cHG
cHG
cNS
-cOs
+dbp
cPl
cRR
cQE
@@ -126074,8 +126099,8 @@ aoq
arq
asZ
aAx
-avW
awc
+awP
aAx
azI
aAP
@@ -126088,7 +126113,7 @@ aFw
aJh
aKy
aEj
-aKx
+aPb
awl
awl
awl
@@ -126141,7 +126166,7 @@ chc
chc
chc
chc
-cqw
+cpk
cJZ
csD
ctX
@@ -126413,7 +126438,7 @@ cFj
cGN
cHU
cLM
-cHR
+cTG
cLM
cHQ
cHQ
@@ -126598,7 +126623,7 @@ aHE
axe
aFz
aFz
-aHV
+aLh
aFz
axe
awl
@@ -127421,7 +127446,7 @@ bSi
ceF
cgj
cjl
-ckT
+ckP
clQ
cnr
cor
@@ -128449,13 +128474,13 @@ bSi
ccn
cgI
cjn
-cla
+ckT
clS
cPd
cos
cPd
cqY
-chi
+cmt
csL
csL
cvI
@@ -128996,7 +129021,7 @@ cSd
cOF
cTk
dfF
-dtn
+wOS
dcq
dcq
dcq
@@ -129023,9 +129048,9 @@ dfR
dcq
dcq
dcq
-cil
+dgC
doL
-cin
+dhT
dcq
aaa
aaa
@@ -129173,7 +129198,7 @@ aJp
aJp
aJp
aNW
-aPb
+aPP
aQm
aSm
aTE
@@ -129223,7 +129248,7 @@ cjo
chf
cdW
ceb
-chi
+cmt
csL
cqZ
crX
@@ -129253,8 +129278,8 @@ cSd
cSd
cWT
cXQ
-dtn
-dtn
+cSd
+lLC
cXO
dbK
dct
@@ -129281,7 +129306,7 @@ dcq
aaa
dcq
dou
-bYu
+doI
dou
dcq
aaa
@@ -129538,7 +129563,7 @@ dcq
aaa
dcq
dou
-can
+doM
dou
dcq
aaa
@@ -129762,7 +129787,7 @@ cGK
cDi
cSd
cSd
-cPR
+cPT
cQS
cEr
cTq
@@ -130016,10 +130041,10 @@ cJc
cJN
csK
cZS
-cQd
-cQQ
-cSe
-cPT
+dtn
+dtn
+dtn
+dtn
cFG
cVJ
cWO
@@ -130242,8 +130267,8 @@ bPc
chh
bQV
bSu
-bPU
-cbr
+cbY
+ceT
bSu
bQV
chf
@@ -130256,7 +130281,7 @@ csL
cqD
csL
chf
-chi
+cmt
chf
chf
chf
@@ -131242,7 +131267,7 @@ aUS
bjc
baJ
beH
-dhT
+bwl
bft
aYd
bnQ
@@ -132052,7 +132077,7 @@ caA
cfE
cfE
cfE
-cjA
+cqo
cCW
cCW
chu
@@ -132527,7 +132552,7 @@ aOI
bjl
bbc
bfn
-dhU
+bwX
djk
dkN
boM
@@ -132553,7 +132578,7 @@ bHO
bHO
bHO
bHO
-bPv
+bYu
bSR
bZJ
cbO
@@ -132810,7 +132835,7 @@ bLA
bLA
bLA
bLA
-bPr
+bZR
bYe
bZK
cbQ
@@ -133067,7 +133092,7 @@ bLB
bNr
bPm
bNz
-bPx
+can
crA
bZJ
cuv
@@ -133294,7 +133319,7 @@ aZC
bbu
bdj
bfr
-aOa
+bpE
bjo
bbd
bdT
@@ -133337,7 +133362,7 @@ caA
cfH
cfH
cfH
-cjD
+cqw
cDf
cDf
cnz
@@ -133542,7 +133567,7 @@ aSP
aSP
aSP
aSP
-aPh
+aPU
aQH
aSQ
aVs
@@ -133566,7 +133591,7 @@ bpN
bog
bpN
bog
-bwl
+bPM
bdT
bdT
bAk
@@ -134045,7 +134070,7 @@ awF
awF
avq
aya
-aBC
+aDO
aqc
atG
aaa
@@ -134330,7 +134355,7 @@ bdL
bfE
biY
boQ
-bpE
+bMF
bqB
brY
btI
@@ -134833,7 +134858,7 @@ aPm
aVv
aXf
aXf
-bbx
+bje
aKn
aKm
aVU
@@ -135099,7 +135124,7 @@ bbC
aGY
beb
djw
-bgp
+bFJ
boX
bpH
bqH
@@ -135356,7 +135381,7 @@ bbh
aGY
beb
dju
-bil
+bLn
bjv
dnD
bmy
@@ -135380,7 +135405,7 @@ bLS
bTU
bQB
bRb
-bSz
+cbr
bJR
bZN
cbU
@@ -135602,7 +135627,7 @@ aPm
aPm
aSZ
aLA
-aXT
+bfa
aIh
aLA
aLA
@@ -135613,7 +135638,7 @@ bbh
aGY
beb
djx
-bin
+bLU
bjv
dnE
bmy
@@ -135637,7 +135662,7 @@ bMY
bOV
bQE
bOV
-bSA
+cby
cuo
bZP
cbW
@@ -135659,7 +135684,7 @@ cwX
cpS
czZ
cAt
-cBx
+cGL
cCS
cEh
cmy
@@ -135843,9 +135868,9 @@ atG
auA
axg
axh
-aAh
+aBC
avt
-aCX
+aHV
atG
aaa
aFK
@@ -135870,7 +135895,7 @@ bbI
aGY
beb
bfH
-bin
+bLU
bjx
bfH
bmy
@@ -136101,7 +136126,7 @@ axf
dgk
axh
auq
-aBk
+avp
auq
atG
aab
@@ -136127,7 +136152,7 @@ bbV
aGY
beb
bfJ
-bin
+bLU
bjy
bkY
bmy
@@ -136153,8 +136178,8 @@ bLK
bLK
bLK
bTZ
-bZR
-cbY
+cdq
+chi
bTZ
bWd
chr
@@ -136166,7 +136191,7 @@ chz
chr
ckC
ckC
-cmt
+cxj
ckC
ciY
cwZ
@@ -136358,7 +136383,7 @@ azT
azT
axh
auq
-aBl
+avu
auq
aaa
aaa
@@ -137492,7 +137517,7 @@ cps
diq
djm
cps
-dkG
+dge
dla
dlr
dlN
@@ -138224,7 +138249,7 @@ ckL
cga
cga
cga
-cpk
+cyE
cxb
cxJ
cAb
@@ -138254,7 +138279,7 @@ cJt
cJG
chf
chf
-dbp
+deo
chf
cBN
chf
@@ -138940,7 +138965,7 @@ aGY
aGX
aGX
aGX
-aRz
+aTs
aMz
aOF
aOG
@@ -138961,7 +138986,7 @@ bfR
bfR
bfR
bfR
-bvN
+bPx
byQ
bAW
bCN
@@ -139026,7 +139051,7 @@ cOm
cOm
daJ
dbq
-dci
+dep
cac
cac
cac
@@ -139529,16 +139554,16 @@ ciY
ciY
ciY
ciY
-cGL
+dci
ciY
cIb
ciY
ciY
-cGL
+dci
ciY
ciY
ciY
-cGL
+dci
cep
cep
aaa
@@ -140235,7 +140260,7 @@ aGX
aGX
aWA
aYY
-bcv
+bqj
bfU
bhx
bij
@@ -141607,7 +141632,7 @@ aaa
aaa
bGH
cuQ
-dlL
+dgf
cuQ
bGH
aaa
@@ -142338,7 +142363,7 @@ bLR
cvG
bIi
cxN
-cyu
+czx
cBR
cBR
cDq
@@ -142826,11 +142851,11 @@ bHQ
bJq
bJq
bKT
-bLn
+bSz
bNn
bPi
bRT
-bLn
+bSz
bUP
bVF
bWl
@@ -142851,10 +142876,10 @@ csH
cny
cvH
cwt
-cxj
+cyT
cyC
cAi
-cAG
+cDv
cBA
cCU
cEm
@@ -142885,14 +142910,14 @@ aab
aab
aab
bGH
-die
+dff
dhR
bGH
bGH
bGH
bGH
cuQ
-dlL
+dgf
cuQ
bGH
bGH
@@ -143066,7 +143091,7 @@ bcu
ber
bga
bis
-bew
+bvN
bcD
bld
blw
@@ -143366,7 +143391,7 @@ bIi
bIi
bIi
cxN
-cyE
+cAG
cAP
cAP
cDu
@@ -143871,11 +143896,11 @@ chS
cjQ
bYj
cmx
-dsx
+cla
dsz
cpT
dsz
-dsx
+cla
ctH
cAS
cAS
@@ -144348,7 +144373,7 @@ aYA
baA
baz
baz
-bew
+bvN
bgg
bgg
baz
@@ -144690,7 +144715,7 @@ cuQ
aaa
cuQ
cuQ
-dlL
+dgf
cuQ
bGG
bKl
@@ -144857,7 +144882,7 @@ aMz
aQI
aGY
aSi
-aTs
+bjg
aUX
aUX
aZF
@@ -144908,7 +144933,7 @@ cgs
bGG
cuQ
cxS
-cyT
+cBx
cAP
cCh
cDw
@@ -145659,7 +145684,7 @@ bPq
bPq
bPq
bUS
-bVH
+bXi
bWv
bYn
caS
@@ -146434,7 +146459,7 @@ big
big
big
big
-dbh
+cjA
aYS
aaa
dbP
@@ -146740,7 +146765,7 @@ bGH
bGG
dgy
bGG
-dbh
+cjA
dia
cuQ
djQ
@@ -148016,7 +148041,7 @@ aab
bGH
bGG
bGG
-dbh
+cjA
bGG
dcJ
ddJ
@@ -148281,7 +148306,7 @@ cuQ
dfc
bGG
bGG
-dbh
+cjA
bGG
bGG
bGH
@@ -150268,15 +150293,15 @@ aaa
aaa
aaa
bjC
-blC
-bwX
+bmX
+bBT
bDz
bjC
beC
-bPM
-btt
-btt
btt
+blA
+blA
+blA
bzq
beC
bjC
@@ -150525,7 +150550,7 @@ aaa
aYD
bic
bjG
-bmX
+blu
bDz
bDz
bjC
@@ -150784,13 +150809,13 @@ bik
bjC
bmY
bDz
-bBT
+bGJ
bjC
beC
-bnc
-bnc
-bnc
-bnc
+blC
+blC
+blC
+blC
beC
beC
bBV
@@ -151036,12 +151061,12 @@ aaa
aYD
baW
beA
-bjg
-blu
+bgo
+bil
bjC
bmY
bDz
-bBT
+bGJ
bjC
beC
blD
@@ -151292,7 +151317,7 @@ aaa
aYD
baW
bcJ
-bje
+bcK
beC
beC
bjC
@@ -151301,10 +151326,10 @@ bmQ
bnb
bqo
beC
-btt
-btt
-btt
-btt
+blA
+blA
+blA
+blA
beC
bAP
bBX
@@ -151548,7 +151573,7 @@ aaa
aaa
aYU
baX
-bje
+bcK
beC
beC
beC
@@ -151806,19 +151831,19 @@ aaa
aYH
baY
bcL
-bje
+bcK
beC
bim
bjC
-bnc
-bnc
-bnc
-bnc
+blC
+blC
+blC
+blC
beC
-bnc
-bnc
-bnc
-bnc
+blC
+blC
+blC
+blC
beC
bAP
bBX
@@ -152064,8 +152089,8 @@ aaa
aYH
baY
beD
-bjh
-blA
+bgp
+bin
bjJ
blD
bnb
@@ -152324,15 +152349,15 @@ aYU
baY
beC
bjC
-btt
-btt
-btt
-btt
+blA
+blA
+blA
+blA
beC
-btt
-btt
-btt
-btt
+blA
+blA
+blA
+blA
beC
beC
bBY
@@ -152838,15 +152863,15 @@ aaa
aaa
aaa
bjC
+blC
bnc
-bys
-bnc
-bnc
-bnc
-bRH
-bnc
-bnc
-bnc
+blC
+blC
+blC
+btu
+blC
+blC
+blC
beC
beC
bBS
@@ -153045,7 +153070,7 @@ aha
ahZ
aha
aha
-arZ
+amZ
agZ
aaa
aaa
@@ -153803,8 +153828,8 @@ aaa
aaa
agc
agZ
-amZ
-amZ
+mMw
+mMw
agZ
ail
agw
diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm
index e619a998d41..fcdcead448f 100644
--- a/_maps/map_files/cyberiad/z2.dmm
+++ b/_maps/map_files/cyberiad/z2.dmm
@@ -12228,6 +12228,12 @@
"FL" = (
/turf/simulated/wall/r_wall,
/area/adminconstruction)
+"Ga" = (
+/obj/machinery/computer/shuttle/ert,
+/turf/unsimulated/floor{
+ icon_state = "dark"
+ },
+/area/centcom/specops)
"GP" = (
/turf/unsimulated/floor{
icon_state = "gcircuit"
@@ -31699,7 +31705,7 @@ pb
uj
uj
uj
-uj
+Ga
sX
we
we
diff --git a/_maps/map_files/cyberiad/z3.dmm b/_maps/map_files/cyberiad/z3.dmm
index 7e8d296ba7d..26d46280ae3 100644
--- a/_maps/map_files/cyberiad/z3.dmm
+++ b/_maps/map_files/cyberiad/z3.dmm
@@ -353,104 +353,10 @@
},
/turf/simulated/floor/plating,
/area/tcommsat/powercontrol)
-"aI" = (
-/turf/simulated/mineral/random,
-/area/mine/dangerous/explored/golem)
-"aJ" = (
-/turf/simulated/floor/plating/asteroid/airless,
-/area/mine/dangerous/explored/golem)
-"aK" = (
-/turf/simulated/mineral/random/high_chance,
-/area/mine/dangerous/explored/golem)
-"aL" = (
-/turf/space,
-/turf/simulated/shuttle/wall{
- icon_state = "swall_f6";
- dir = 2
- },
-/area/shuttle/freegolem)
-"aM" = (
-/turf/simulated/shuttle/wall{
- tag = "icon-swall12";
- icon_state = "swall12";
- dir = 2
- },
-/area/shuttle/freegolem)
-"aN" = (
-/obj/structure/fans/tiny,
-/obj/machinery/door/airlock/shuttle{
- id_tag = "s_docking_airlock";
- locked = 1
- },
-/turf/simulated/floor/plating,
-/area/shuttle/freegolem)
-"aO" = (
-/turf/simulated/shuttle/wall{
- dir = 2;
- icon_state = "swall8";
- tag = "icon-swall12"
- },
-/area/shuttle/freegolem)
-"aP" = (
-/turf/simulated/shuttle/wall{
- icon_state = "swall3";
- dir = 2
- },
-/area/shuttle/freegolem)
-"aQ" = (
-/obj/structure/closet/crate/golemgear,
-/turf/simulated/floor/plating,
-/area/shuttle/freegolem)
-"aR" = (
-/obj/item/storage/toolbox/mechanical,
-/obj/item/reagent_containers/spray/cleaner,
-/turf/simulated/floor/plating,
-/area/shuttle/freegolem)
-"aS" = (
-/turf/simulated/floor/plating,
-/area/shuttle/freegolem)
"aT" = (
/obj/structure/lattice,
/turf/space,
/area/space/nearstation)
-"aU" = (
-/obj/structure/reagent_dispensers/watertank/high,
-/turf/simulated/floor/plating,
-/area/shuttle/freegolem)
-"aV" = (
-/obj/structure/shuttle/engine/heater{
- icon_state = "heater";
- dir = 4
- },
-/obj/structure/window/reinforced{
- dir = 8
- },
-/turf/simulated/shuttle/plating,
-/area/shuttle/freegolem)
-"aW" = (
-/obj/structure/shuttle/engine/propulsion{
- dir = 4;
- icon_state = "burst_l"
- },
-/turf/simulated/shuttle/plating,
-/area/shuttle/freegolem)
-"aX" = (
-/obj/machinery/light/small,
-/turf/simulated/floor/plating,
-/area/shuttle/freegolem)
-"aY" = (
-/turf/simulated/shuttle/wall{
- tag = "icon-swall13";
- icon_state = "swall13";
- dir = 2
- },
-/area/shuttle/freegolem)
-"aZ" = (
-/obj/machinery/door/airlock/shuttle,
-/turf/simulated/shuttle/floor{
- icon_state = "floor5"
- },
-/area/shuttle/freegolem)
"ba" = (
/turf/simulated/shuttle/wall{
tag = "icon-swall_s6";
@@ -479,24 +385,6 @@
dir = 2
},
/area/space/nearstation)
-"be" = (
-/turf/simulated/shuttle/wall{
- tag = "icon-swall14";
- icon_state = "swall14";
- dir = 2
- },
-/area/shuttle/freegolem)
-"bf" = (
-/obj/structure/reagent_dispensers/watertank,
-/turf/simulated/floor/plating,
-/area/shuttle/freegolem)
-"bg" = (
-/obj/machinery/door/airlock/shuttle,
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
-"bh" = (
-/turf/simulated/wall/mineral/titanium/interior,
-/area/shuttle/freegolem)
"bi" = (
/turf/simulated/shuttle/wall{
tag = "icon-swall7";
@@ -536,33 +424,12 @@
dir = 2
},
/area/space/nearstation)
-"bn" = (
-/obj/machinery/vending/hydroseeds,
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
-"bo" = (
-/obj/machinery/vending/hydronutrients,
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
"bp" = (
/obj/machinery/door/unpowered/shuttle,
/turf/simulated/shuttle/floor{
icon_state = "floor3"
},
/area/space/nearstation)
-"bq" = (
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
-"br" = (
-/obj/structure/fans/tiny,
-/obj/machinery/door/airlock/shuttle{
- id_tag = "s_docking_airlock";
- locked = 1
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor5"
- },
-/area/shuttle/freegolem)
"bs" = (
/turf/simulated/shuttle/floor{
icon_state = "floor3"
@@ -573,13 +440,6 @@
dir = 2
},
/area/space/nearstation)
-"bt" = (
-/obj/machinery/light{
- dir = 1;
- on = 1
- },
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
"bu" = (
/turf/simulated/shuttle/floor{
icon_state = "floor3"
@@ -590,18 +450,6 @@
dir = 2
},
/area/space/nearstation)
-"bv" = (
-/obj/machinery/light{
- dir = 1;
- on = 1
- },
-/obj/effect/landmark/free_golem_spawn,
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
-"bw" = (
-/obj/effect/landmark/free_golem_spawn,
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
"bx" = (
/turf/simulated/shuttle/wall{
tag = "icon-swall_s5";
@@ -623,171 +471,6 @@
dir = 2
},
/area/space/nearstation)
-"bA" = (
-/obj/machinery/vending/coffee/free,
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
-"bB" = (
-/turf/simulated/shuttle/wall{
- tag = "icon-swall14";
- icon_state = "swall4";
- dir = 2
- },
-/area/shuttle/freegolem)
-"bC" = (
-/turf/simulated/shuttle/wall{
- dir = 2;
- icon_state = "swallc1";
- tag = "icon-swall12"
- },
-/area/shuttle/freegolem)
-"bD" = (
-/obj/structure/window/full/shuttle{
- icon_state = "16"
- },
-/obj/structure/grille,
-/turf/simulated/shuttle/plating,
-/area/shuttle/freegolem)
-"bE" = (
-/obj/structure/statue/gold/rd{
- name = "statue of the Liberator"
- },
-/obj/structure/window/reinforced{
- dir = 4;
- pixel_x = 0
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor5"
- },
-/area/shuttle/freegolem)
-"bF" = (
-/obj/machinery/mineral/equipment_vendor/golem,
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
-"bG" = (
-/obj/item/resonator,
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
-"bH" = (
-/obj/machinery/light{
- dir = 8
- },
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
-"bI" = (
-/obj/item/gun/energy/kinetic_accelerator,
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
-"bJ" = (
-/obj/structure/window/full/shuttle{
- icon_state = "15"
- },
-/obj/structure/grille,
-/turf/simulated/shuttle/plating,
-/area/shuttle/freegolem)
-"bK" = (
-/obj/structure/window/reinforced{
- dir = 4;
- pixel_x = 0
- },
-/obj/structure/table/wood,
-/obj/item/bedsheet/rd/royal_cape{
- layer = 3;
- pixel_x = 5;
- pixel_y = 9
- },
-/obj/item/book/manual/research_and_development{
- name = "Sacred Text of the Liberator";
- pixel_x = -4;
- pixel_y = 3
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor5"
- },
-/area/shuttle/freegolem)
-"bL" = (
-/obj/machinery/mineral/ore_redemption/golem,
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
-"bM" = (
-/obj/machinery/computer/shuttle/golem_ship,
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
-"bN" = (
-/turf/space,
-/turf/simulated/shuttle/wall{
- icon_state = "swall_f5";
- dir = 2
- },
-/area/shuttle/freegolem)
-"bO" = (
-/obj/machinery/light{
- dir = 1
- },
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
-"bP" = (
-/obj/structure/extinguisher_cabinet{
- pixel_y = 30
- },
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
-"bQ" = (
-/turf/simulated/shuttle/wall{
- icon_state = "swallc4"
- },
-/area/shuttle/freegolem)
-"bR" = (
-/obj/machinery/door/airlock/shuttle{
- id_tag = "s_docking_airlock";
- locked = 1
- },
-/obj/structure/fans/tiny,
-/obj/docking_port/mobile{
- dir = 8;
- dwidth = 8;
- height = 20;
- id = "freegolem";
- name = "Free Golem Ship";
- roundstart_move = "freegolem_transit";
- width = 16
- },
-/obj/docking_port/stationary{
- dir = 8;
- dwidth = 8;
- height = 20;
- id = "freegolem_z3";
- name = "Small Asteroid";
- width = 16
- },
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
-"bS" = (
-/obj/machinery/light,
-/obj/structure/chair/comfy/shuttle{
- dir = 1
- },
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
-"bT" = (
-/obj/machinery/light/small,
-/obj/structure/extinguisher_cabinet{
- pixel_y = -30
- },
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
-"bU" = (
-/obj/structure/fans/tiny,
-/obj/machinery/door/airlock/shuttle{
- id_tag = "s_docking_airlock";
- locked = 1
- },
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
-"bV" = (
-/obj/item/resonator/upgraded,
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
"bW" = (
/obj/structure/lattice,
/obj/structure/grille,
@@ -1397,10 +1080,6 @@
},
/turf/simulated/floor/plasteel,
/area/tcommsat/computer)
-"dr" = (
-/obj/machinery/autolathe,
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
"ds" = (
/obj/machinery/atmospherics/unary/vent_pump{
dir = 4;
@@ -1814,15 +1493,6 @@
},
/turf/simulated/floor/plating,
/area/tcommsat/chamber)
-"ej" = (
-/obj/structure/table/wood,
-/obj/machinery/reagentgrinder,
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
-"ek" = (
-/obj/machinery/computer/arcade/battle,
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
"el" = (
/obj/machinery/door/window/brigdoor{
dir = 1;
@@ -1876,10 +1546,6 @@
/obj/structure/lattice,
/turf/space,
/area/turret_protected/tcomsat)
-"eq" = (
-/obj/machinery/computer/arcade/orion_trail,
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
"er" = (
/obj/structure/window/reinforced{
dir = 4
@@ -1957,10 +1623,6 @@
temperature = 80
},
/area/tcommsat/chamber)
-"ex" = (
-/obj/machinery/light,
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
"ey" = (
/obj/structure/cable{
d1 = 4;
@@ -2004,11 +1666,6 @@
temperature = 80
},
/area/tcommsat/chamber)
-"eA" = (
-/obj/machinery/light,
-/obj/effect/landmark/free_golem_spawn,
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
"eB" = (
/turf/simulated/floor/bluegrid{
icon_state = "dark";
@@ -2103,10 +1760,6 @@
/obj/structure/lattice,
/turf/space,
/area/turret_protected/tcomsat)
-"eI" = (
-/obj/machinery/vending/snack/free,
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
"eJ" = (
/obj/structure/cable{
d1 = 1;
@@ -2188,13 +1841,6 @@
},
/turf/simulated/floor/plating/airless,
/area/space/nearstation)
-"eQ" = (
-/obj/structure/table/wood,
-/obj/item/storage/firstaid/brute,
-/obj/item/storage/firstaid/brute,
-/obj/item/storage/firstaid/brute,
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
"eR" = (
/obj/structure/window/reinforced{
dir = 8
@@ -2464,12 +2110,6 @@
},
/turf/simulated/floor/plating/airless,
/area/space/nearstation)
-"fp" = (
-/obj/structure/table/wood,
-/obj/item/storage/firstaid/adv,
-/obj/item/storage/firstaid/adv,
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
"fq" = (
/obj/structure/grille,
/obj/structure/cable{
@@ -2578,15 +2218,6 @@
temperature = 80
},
/area/tcommsat/chamber)
-"fy" = (
-/obj/structure/table/wood,
-/obj/structure/table/wood,
-/obj/item/storage/firstaid/fire,
-/obj/item/storage/firstaid/fire,
-/obj/item/storage/firstaid/fire,
-/obj/machinery/light,
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
"fz" = (
/obj/machinery/telecomms/processor/preset_four,
/turf/simulated/floor/plasteel{
@@ -2862,18 +2493,6 @@
temperature = 80
},
/area/tcommsat/chamber)
-"fY" = (
-/obj/structure/table/wood,
-/obj/item/areaeditor/golem,
-/obj/item/disk/design_disk/golem_shell,
-/turf/simulated/floor/mineral/titanium/purple,
-/area/shuttle/freegolem)
-"fZ" = (
-/obj/machinery/light/small{
- dir = 1
- },
-/turf/simulated/floor/plating,
-/area/shuttle/freegolem)
"ga" = (
/obj/machinery/telecomms/server/presets/command,
/turf/simulated/floor/plasteel{
@@ -2898,10 +2517,6 @@
temperature = 80
},
/area/tcommsat/chamber)
-"gc" = (
-/obj/machinery/chem_master,
-/turf/simulated/floor/plating,
-/area/shuttle/freegolem)
"gd" = (
/obj/machinery/camera{
c_tag = "Telecomms Server Room South";
@@ -2923,10 +2538,6 @@
temperature = 80
},
/area/tcommsat/chamber)
-"ge" = (
-/obj/structure/ore_box,
-/turf/simulated/floor/plating,
-/area/shuttle/freegolem)
"gf" = (
/obj/structure/cable{
d1 = 1;
@@ -2970,10 +2581,6 @@
"gj" = (
/turf/simulated/wall/r_wall,
/area/turret_protected/tcomfoyer)
-"gk" = (
-/obj/structure/reagent_dispensers/fueltank,
-/turf/simulated/floor/plating,
-/area/shuttle/freegolem)
"gr" = (
/obj/structure/window/reinforced,
/obj/machinery/light{
@@ -16115,10 +15722,10 @@ aa
aa
aa
aa
-aL
-bD
-bJ
-bN
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -16372,10 +15979,10 @@ aa
aa
aa
aa
-aM
-bE
-bK
-aM
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -16626,16 +16233,16 @@ aa
aa
aa
aa
-aL
-aP
-br
-aY
-bM
-bS
-be
-br
-aP
-bN
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -16883,16 +16490,16 @@ aa
aa
aa
aa
-aM
-bo
-bq
-aZ
-bq
-bq
-bg
-bq
-eq
-aM
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -17140,16 +16747,16 @@ aa
aa
aa
aa
-aM
-bn
-bq
-aZ
-bq
-bq
-bg
-bq
-ek
-aM
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -17394,22 +17001,22 @@ aa
aa
aa
aa
-aL
-aP
-aP
-aY
-bt
-bq
-bh
-bq
-bq
-bh
-bq
-ex
-be
-aP
-aP
-bN
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -17651,22 +17258,22 @@ aa
aa
aa
aa
-aM
-aQ
-aS
-bg
-bq
-bq
-bh
-bq
-bq
-bh
-bq
-bq
-bg
-aS
-ge
-aM
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -17908,22 +17515,22 @@ aa
aa
aa
aa
-aM
-aQ
-aS
-bg
-bq
-bq
-bh
-bO
-bq
-bh
-bq
-bq
-bg
-aS
-ge
-aM
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -18165,22 +17772,22 @@ aa
aa
aa
aa
-aM
-aQ
-aX
-bh
-bv
-bG
-bh
-bq
-bq
-bh
-bG
-eA
-bh
-fZ
-ge
-aM
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -18422,22 +18029,22 @@ aa
aa
aa
aa
-aM
-aQ
-aS
-bh
-bw
-bG
-bh
-bq
-bq
-bh
-bG
-bw
-bh
-aS
-ge
-aM
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -18679,22 +18286,22 @@ aa
aa
aa
aa
-aM
-aQ
-aS
-bh
-bh
-bg
-bh
-bg
-bg
-bh
-bg
-bh
-bh
-aS
-ge
-aM
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -18936,22 +18543,22 @@ aa
aa
aa
aa
-aM
-aQ
-aX
-bh
-bA
-bq
-bH
-bq
-bq
-bH
-bq
-eI
-bh
-fZ
-ge
-aM
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -19193,22 +18800,22 @@ aa
aa
aa
aa
-aM
-aQ
-aS
-bg
-bq
-bq
-bq
-bq
-bq
-bq
-bq
-bq
-bg
-aS
-ge
-aM
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -19450,22 +19057,22 @@ aa
aa
aa
aa
-aM
-aQ
-aS
-bg
-bq
-bq
-bq
-bq
-bq
-bq
-bq
-bq
-bg
-aS
-ge
-aM
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -19707,22 +19314,22 @@ aa
aa
aa
aa
-aM
-aR
-aS
-bh
-bq
-bq
-bq
-bq
-bq
-bq
-bq
-eQ
-bh
-aS
-aR
-aM
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -19964,22 +19571,22 @@ aa
aa
aa
aa
-aN
-aS
-aX
-bh
-bt
-bq
-bq
-bq
-bq
-bq
-bq
-fy
-bh
-fZ
-aS
-aN
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -20221,22 +19828,22 @@ aa
aa
aa
aa
-aN
-aS
-aS
-bh
-bq
-bq
-bI
-bq
-bq
-bV
-bq
-fp
-bh
-aS
-aS
-aN
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -20478,22 +20085,22 @@ aa
aa
aa
aa
-aM
-aU
-bf
-bh
-bF
-bq
-bL
-bq
-bq
-dr
-ej
-fY
-bh
-gc
-gk
-aM
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -20733,24 +20340,24 @@ aa
aa
aa
aa
-aI
-aI
-aM
-aV
-aV
-bB
-aV
-aV
-bB
-bP
-bT
-bB
-aV
-aV
-bB
-aV
-aV
-aM
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -20990,25 +20597,25 @@ aa
aa
aa
aa
-aI
-aI
-aO
-aW
-aW
-aO
-aW
-aW
-bC
-bR
-bU
-bQ
-aW
-aW
-aO
-aW
-aW
-aO
-aI
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -21247,25 +20854,25 @@ aa
aa
aa
aa
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aJ
-aJ
-aJ
-aJ
-aI
-aI
-aI
-aI
-aI
-aI
-aI
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -21504,25 +21111,25 @@ aa
aa
aa
aa
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aJ
-aJ
-aJ
-aJ
-aI
-aI
-aI
-aI
-aI
-aI
-aI
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -21761,25 +21368,25 @@ aa
aa
aa
aa
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -22016,27 +21623,27 @@ aa
aa
aa
aa
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -22273,27 +21880,27 @@ aa
aa
aa
aa
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -22530,26 +22137,26 @@ aa
aa
aa
aa
-aI
-aI
-aI
-aI
-aK
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -22787,26 +22394,26 @@ aa
aa
aa
aa
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aK
-aI
-aI
-aI
-aI
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -23044,28 +22651,28 @@ aa
aa
aa
aa
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -23301,28 +22908,28 @@ aa
aa
aa
aa
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -23558,28 +23165,28 @@ aa
aa
aa
aa
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -23815,28 +23422,28 @@ aa
aa
aa
aa
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aK
-aI
-aI
-aI
-aI
-aI
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -24072,26 +23679,26 @@ aa
aa
aa
aa
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -24329,26 +23936,26 @@ aa
aa
aa
aa
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aK
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -24588,27 +24195,27 @@ aa
aa
aa
aa
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aJ
-aJ
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -24846,26 +24453,26 @@ aa
aa
aa
aa
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
aa
aa
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -25103,26 +24710,26 @@ aa
aa
aa
aa
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
-aI
aa
aa
aa
aa
-aI
-aI
-aI
-aI
-aI
-aI
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
diff --git a/_maps/map_files/cyberiad/z4.dmm b/_maps/map_files/cyberiad/z4.dmm
index 1d4f0c698ea..bd20066c0a4 100644
--- a/_maps/map_files/cyberiad/z4.dmm
+++ b/_maps/map_files/cyberiad/z4.dmm
@@ -2571,6 +2571,7 @@
req_access_txt = "0";
req_one_access_txt = "10;24"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plating,
/area/engiestation)
"gs" = (
@@ -4862,6 +4863,17 @@
},
/turf/simulated/floor/plating/airless,
/area/constructionsite/engineering)
+"zH" = (
+/obj/docking_port/stationary{
+ dir = 8;
+ dwidth = 8;
+ height = 20;
+ id = "freegolem_z4";
+ name = "Near Construction Site";
+ width = 16
+ },
+/turf/space,
+/area/space)
(1,1,1) = {"
aa
@@ -43872,7 +43884,7 @@ aa
aa
aa
aa
-aa
+zH
aa
aa
aa
diff --git a/_maps/map_files/cyberiad/z6.dmm b/_maps/map_files/cyberiad/z6.dmm
index e51ec171e34..f47b299a8d7 100644
--- a/_maps/map_files/cyberiad/z6.dmm
+++ b/_maps/map_files/cyberiad/z6.dmm
@@ -53932,7 +53932,7 @@ aa
aa
aa
aa
-wr
+aa
aa
aa
aa
@@ -54188,7 +54188,7 @@ aa
aa
aa
aa
-aa
+wr
aa
aa
aa
diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm
index d81ea35e1e9..c542d714ca6 100644
--- a/code/ATMOSPHERICS/atmospherics.dm
+++ b/code/ATMOSPHERICS/atmospherics.dm
@@ -231,6 +231,12 @@ GLOBAL_DATUM_INIT(pipe_icon_manager, /datum/pipe_icon_manager, new())
var/turf/T = loc
level = T.intact ? 2 : 1
add_fingerprint(usr)
+ if(!SSair.initialized) //If there's no atmos subsystem, we can't really initialize pipenets
+ SSair.machinery_to_construct.Add(src)
+ return
+ initialize_atmos_network()
+
+/obj/machinery/atmospherics/proc/initialize_atmos_network()
atmos_init()
var/list/nodes = pipeline_expansion()
for(var/obj/machinery/atmospherics/A in nodes)
diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm
index 99bcf54272c..2f296960622 100644
--- a/code/__DEFINES/atmospherics.dm
+++ b/code/__DEFINES/atmospherics.dm
@@ -129,3 +129,6 @@
#define ATMOS_ALARM_NONE 0
#define ATMOS_ALARM_WARNING 1
#define ATMOS_ALARM_DANGER 2
+
+//LAVALAND
+#define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 //what pressure you have to be under to increase the effect of equipment meant for lavaland
\ No newline at end of file
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 9b72483001c..e29e5be1c56 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -57,6 +57,89 @@
#define MAX_STACK_AMOUNT_GLASS 50
#define MAX_STACK_AMOUNT_RODS 60
+//Colors
+#define COLOR_RED "#FF0000"
+#define COLOR_GREEN "#00FF00"
+#define COLOR_BLUE "#0000FF"
+#define COLOR_CYAN "#00FFFF"
+#define COLOR_PINK "#FF00FF"
+#define COLOR_YELLOW "#FFFF00"
+#define COLOR_ORANGE "#FF9900"
+#define COLOR_WHITE "#FFFFFF"
+#define COLOR_GRAY "#808080"
+#define COLOR_BLACK "#000000"
+#define COLOR_NAVY_BLUE "#000080"
+#define COLOR_LIGHT_GREEN "#008000"
+#define COLOR_DARK_GRAY "#404040"
+#define COLOR_MAROON "#800000"
+#define COLOR_PURPLE "#800080"
+#define COLOR_VIOLET "#9933ff"
+#define COLOR_OLIVE "#808000"
+#define COLOR_BROWN_ORANGE "#824b28"
+#define COLOR_DARK_ORANGE "#b95a00"
+#define COLOR_GRAY40 "#666666"
+#define COLOR_GRAY20 "#333333"
+#define COLOR_GRAY15 "#151515"
+#define COLOR_SEDONA "#cc6600"
+#define COLOR_DARK_BROWN "#917448"
+#define COLOR_DEEP_SKY_BLUE "#00e1ff"
+#define COLOR_LIME "#00ff00"
+#define COLOR_TEAL "#33cccc"
+#define COLOR_PALE_PINK "#bf89ba"
+#define COLOR_YELLOW_GRAY "#c9a344"
+#define COLOR_PALE_YELLOW "#c1bb7a"
+#define COLOR_WARM_YELLOW "#b3863c"
+#define COLOR_RED_GRAY "#aa5f61"
+#define COLOR_BROWN "#b19664"
+#define COLOR_GREEN_GRAY "#8daf6a"
+#define COLOR_DARK_GREEN_GRAY "#54654c"
+#define COLOR_BLUE_GRAY "#6a97b0"
+#define COLOR_DARK_BLUE_GRAY "#3e4855"
+#define COLOR_SUN "#ec8b2f"
+#define COLOR_PURPLE_GRAY "#a2819e"
+#define COLOR_BLUE_LIGHT "#33ccff"
+#define COLOR_RED_LIGHT "#ff3333"
+#define COLOR_BEIGE "#ceb689"
+#define COLOR_BABY_BLUE "#89cff0"
+#define COLOR_PALE_GREEN_GRAY "#aed18b"
+#define COLOR_PALE_RED_GRAY "#cc9090"
+#define COLOR_PALE_PURPLE_GRAY "#bda2ba"
+#define COLOR_PALE_BLUE_GRAY "#8bbbd5"
+#define COLOR_LUMINOL "#66ffff"
+#define COLOR_SILVER "#c0c0c0"
+#define COLOR_GRAY80 "#cccccc"
+#define COLOR_OFF_WHITE "#eeeeee"
+#define COLOR_GOLD "#6d6133"
+#define COLOR_NT_RED "#9d2300"
+#define COLOR_BOTTLE_GREEN "#1f6b4f"
+#define COLOR_PALE_BTL_GREEN "#57967f"
+#define COLOR_GUNMETAL "#545c68"
+#define COLOR_WALL_GUNMETAL "#353a42"
+#define COLOR_STEEL "#a8b0b2"
+#define COLOR_MUZZLE_FLASH "#ffffb2"
+#define COLOR_CHESTNUT "#996633"
+#define COLOR_BEASTY_BROWN "#663300"
+#define COLOR_WHEAT "#ffff99"
+#define COLOR_CYAN_BLUE "#3366cc"
+#define COLOR_LIGHT_CYAN "#66ccff"
+#define COLOR_PAKISTAN_GREEN "#006600"
+#define COLOR_HULL "#436b8e"
+#define COLOR_AMBER "#ffbf00"
+#define COLOR_COMMAND_BLUE "#46698c"
+#define COLOR_SKY_BLUE "#5ca1cc"
+#define COLOR_PALE_ORANGE "#b88a3b"
+#define COLOR_CIVIE_GREEN "#b7f27d"
+#define COLOR_TITANIUM "#d1e6e3"
+#define COLOR_DARK_GUNMETAL "#4c535b"
+#define COLOR_BRONZE "#8c7853"
+#define COLOR_BRASS "#b99d71"
+#define COLOR_INDIGO "#4b0082"
+#define COLOR_ALUMINIUM "#bbbbbb"
+#define COLOR_CRYSTAL "#00c8a5"
+#define COLOR_ASTEROID_ROCK "#735555"
+#define COLOR_NULLGLASS "#ff6088"
+#define COLOR_DIAMOND "#d8d4ea"
+
//FONTS:
// Used by Paper and PhotoCopier (and PaperBin once a year).
// Used by PDA's Notekeeper.
@@ -132,7 +215,12 @@
for(type in view(range, dview_mob))
#define END_FOR_DVIEW dview_mob.loc = null
+//Turf locational stuff
#define get_turf(A) (get_step(A, 0))
+#define NORTH_OF_TURF(T) locate(T.x, T.y + 1, T.z)
+#define EAST_OF_TURF(T) locate(T.x + 1, T.y, T.z)
+#define SOUTH_OF_TURF(T) locate(T.x, T.y - 1, T.z)
+#define WEST_OF_TURF(T) locate(T.x - 1, T.y, T.z)
#define MIN_SUPPLIED_LAW_NUMBER 15
#define MAX_SUPPLIED_LAW_NUMBER 50
@@ -315,7 +403,7 @@
#define INVESTIGATE_BOMB "bombs"
// The SQL version required by this version of the code
-#define SQL_VERSION 8
+#define SQL_VERSION 9
// Vending machine stuff
#define CAT_NORMAL 1
@@ -397,4 +485,15 @@
#define DICE_NOT_RIGGED 1
#define DICE_BASICALLY_RIGGED 2
-#define DICE_TOTALLY_RIGGED 3
\ No newline at end of file
+#define DICE_TOTALLY_RIGGED 3
+
+// Parallax
+#define PARALLAX_DELAY_DEFAULT world.tick_lag
+#define PARALLAX_DELAY_MED 1
+#define PARALLAX_DELAY_LOW 2
+#define PARALLAX_LOOP_TIME 25
+
+// Engine types
+#define ENGTYPE_SING "Singularity"
+#define ENGTYPE_SM "Supermatter"
+#define ENGTYPE_TESLA "Tesla"
\ No newline at end of file
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 284b0e4d745..608fcfcce20 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -187,6 +187,7 @@
#define isswarmer(A) (istype((A), /mob/living/simple_animal/hostile/swarmer))
#define isguardian(A) (istype((A), /mob/living/simple_animal/hostile/guardian))
#define isnymph(A) (istype((A), /mob/living/simple_animal/diona))
+#define ishostile(A) (istype(A, /mob/living/simple_animal/hostile))
#define issilicon(A) (istype((A), /mob/living/silicon))
#define isAI(A) (istype((A), /mob/living/silicon/ai))
diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
index 9582fddccfe..a28d68a392b 100644
--- a/code/__DEFINES/preferences.dm
+++ b/code/__DEFINES/preferences.dm
@@ -63,3 +63,12 @@
#define EXP_TYPE_WHITELIST "Whitelist"
#define EXP_DEPT_TYPE_LIST list(EXP_TYPE_SERVICE, EXP_TYPE_MEDICAL, EXP_TYPE_ENGINEERING, EXP_TYPE_SCIENCE, EXP_TYPE_SECURITY, EXP_TYPE_COMMAND, EXP_TYPE_SILICON, EXP_TYPE_SPECIAL)
+
+// Defines just for parallax because its levels make storing it in the regular prefs a pain in the ass
+// These dont need to be bitflags because there isnt going to be more than one at a time of these active
+// But its gonna piss off my OCD if it isnt bitflags, so deal with it, -affected
+#define PARALLAX_DISABLE 1
+#define PARALLAX_LOW 2
+#define PARALLAX_MED 4
+#define PARALLAX_HIGH 8
+#define PARALLAX_INSANE 16
diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm
index e5d5bb723c1..f451a34a8b7 100644
--- a/code/__DEFINES/status_effects.dm
+++ b/code/__DEFINES/status_effects.dm
@@ -26,7 +26,7 @@
//#define STATUS_EFFECT_WISH_GRANTERS_GIFT /datum/status_effect/wish_granters_gift //If you're currently resurrecting with the Wish Granter
-//#define STATUS_EFFECT_BLOODDRUNK /datum/status_effect/blooddrunk //Stun immunity and greatly reduced damage taken
+#define STATUS_EFFECT_BLOODDRUNK /datum/status_effect/blooddrunk //Stun immunity and greatly reduced damage taken
/////////////
// DEBUFFS //
@@ -52,7 +52,7 @@
#define STATUS_EFFECT_SUMMONEDGHOST /datum/status_effect/cultghost //is a cult ghost and can't use manifest runes
-//#define STATUS_EFFECT_CRUSHERMARK /datum/status_effect/crusher_mark //if struck with a proto-kinetic crusher, takes a ton of damage
+#define STATUS_EFFECT_CRUSHERMARK /datum/status_effect/crusher_mark //if struck with a proto-kinetic crusher, takes a ton of damage
#define STATUS_EFFECT_SAWBLEED /datum/status_effect/saw_bleed //if the bleed builds up enough, takes a ton of damage
@@ -74,6 +74,6 @@
//#define STATUS_EFFECT_SIGILMARK /datum/status_effect/sigil_mark
-//#define STATUS_EFFECT_CRUSHERDAMAGETRACKING /datum/status_effect/crusher_damage //tracks total kinetic crusher damage on a target
+#define STATUS_EFFECT_CRUSHERDAMAGETRACKING /datum/status_effect/crusher_damage //tracks total kinetic crusher damage on a target
-//#define STATUS_EFFECT_SYPHONMARK /datum/status_effect/syphon_mark //tracks kills for the KA death syphon module
\ No newline at end of file
+#define STATUS_EFFECT_SYPHONMARK /datum/status_effect/syphon_mark //tracks kills for the KA death syphon module
\ No newline at end of file
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index 27b69284a3d..3bb6b742a04 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -19,6 +19,12 @@
return A
return 0
+/proc/get_location_name(atom/X, format_text = FALSE)
+ var/area/A = isarea(X) ? X : get_area(X)
+ if(!A)
+ return null
+ return format_text ? format_text(A.name) : A.name
+
/proc/get_areas_in_range(dist=0, atom/center=usr)
if(!dist)
var/turf/T = get_turf(center)
@@ -429,6 +435,17 @@
/proc/GetBluePart(const/hexa)
return hex2num(copytext(hexa, 6, 8))
+/proc/lavaland_equipment_pressure_check(turf/T)
+ . = FALSE
+ if(!istype(T))
+ return
+ var/datum/gas_mixture/environment = T.return_air()
+ if(!istype(environment))
+ return
+ var/pressure = environment.return_pressure()
+ if(pressure <= LAVALAND_EQUIPMENT_EFFECT_PRESSURE)
+ . = TRUE
+
/proc/GetHexColors(const/hexa)
return list(
GetRedPart(hexa),
diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm
index 11c86940b75..acf202f0eee 100644
--- a/code/__HELPERS/icon_smoothing.dm
+++ b/code/__HELPERS/icon_smoothing.dm
@@ -153,29 +153,33 @@
/turf/simulated/wall/diagonal_smooth(adjacencies)
adjacencies = reverse_ndir(..())
if(adjacencies)
- var/list/U = list()
+ var/mutable_appearance/underlay_appearance = mutable_appearance(layer = TURF_LAYER, plane = FLOOR_PLANE)
+ var/list/U = list(underlay_appearance)
if(fixed_underlay)
if(fixed_underlay["space"])
- U += image('icons/turf/space.dmi', SPACE_ICON_STATE, layer=TURF_LAYER)
+ underlay_appearance.icon = 'icons/turf/space.dmi'
+ underlay_appearance.icon_state = SPACE_ICON_STATE
+ underlay_appearance.plane = PLANE_SPACE
else
- U += image(fixed_underlay["icon"], fixed_underlay["icon_state"], layer=TURF_LAYER)
+ underlay_appearance.icon = fixed_underlay["icon"]
+ underlay_appearance.icon_state = fixed_underlay["icon_state"]
else
- var/turf/T = get_step(src, turn(adjacencies, 180))
- if(T && (T.density || T.smooth))
+ var/turned_adjacency = turn(adjacencies, 180)
+ var/turf/T = get_step(src, turned_adjacency)
+ if(!T.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency))
T = get_step(src, turn(adjacencies, 135))
- if(T && (T.density || T.smooth))
+ if(!T.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency))
T = get_step(src, turn(adjacencies, 225))
-
- if(istype(T, /turf/space) && !istype(T, /turf/space/transit))
- U += image('icons/turf/space.dmi', SPACE_ICON_STATE, layer=TURF_LAYER)
- else if(T && !T.density && !T.smooth)
- U += T
- else if(baseturf && !initial(baseturf.density) && !initial(baseturf.smooth))
- U += image(initial(baseturf.icon), initial(baseturf.icon_state), layer=TURF_LAYER)
- else
- U += DEFAULT_UNDERLAY_IMAGE
+ //if all else fails, ask our own turf
+ if(!T.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency) && !get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency))
+ underlay_appearance.icon = DEFAULT_UNDERLAY_ICON
+ underlay_appearance.icon_state = DEFAULT_UNDERLAY_ICON_STATE
underlays = U
+ // Drop posters which were previously placed on this wall.
+ for(var/obj/structure/sign/poster/P in src)
+ P.roll_and_drop(src)
+
/proc/cardinal_smooth(atom/A, adjacencies)
//NW CORNER
var/nw = "1-i"
diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm
index 04d63e0e862..08af11a128c 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -545,6 +545,43 @@ proc/checkhtml(var/t)
text = copytext(text, 1, MAX_PAPER_MESSAGE_LEN)
return text
+/proc/convert_pencode_arg(text, tag, arg)
+ arg = sanitize_simple(html_encode(arg), list("''"="","\""="", "?"=""))
+ // https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html#rule-4---css-escape-and-strictly-validate-before-inserting-untrusted-data-into-html-style-property-values
+ var/list/style_attacks = list("javascript:", "expression", "byond:", "file:")
+
+ for(var/style_attack in style_attacks)
+ if(findtext(arg, style_attack))
+ // Do not attempt to render dangerous things
+ return text
+
+ if(tag == "class")
+ return ""
+
+ if(tag == "style")
+ return ""
+
+ if(tag == "img")
+ var/list/img_props = splittext(arg, ";")
+ if(img_props.len == 3)
+ return "
"
+ if(img_props.len == 2)
+ return "
"
+ return "
"
+
+ return text
+
+/proc/admin_pencode_to_html()
+ var/text = pencode_to_html(arglist(args))
+ var/regex/R = new(@"\[(.*?) (.*?)\]", "ge")
+ text = R.Replace(text, /proc/convert_pencode_arg)
+
+ text = replacetext(text, "\[/class\]", "")
+ text = replacetext(text, "\[/style\]", "")
+ text = replacetext(text, "\[/img\]", "")
+
+ return text
+
/proc/html_to_pencode(text)
text = replacetext(text, "
", "\n")
text = replacetext(text, "
", "\[center\]")
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 5ff132a7ee6..d9d21c60e1e 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -47,4 +47,6 @@ GLOBAL_LIST_INIT(active_diseases, list()) //List of Active disease in all mob
GLOBAL_LIST_EMPTY(mob_spawners) // All mob_spawn objects
-GLOBAL_LIST_EMPTY(explosive_walls)
\ No newline at end of file
+GLOBAL_LIST_EMPTY(explosive_walls)
+
+GLOBAL_LIST_EMPTY(engine_beacon_list)
\ No newline at end of file
diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm
index f933105e13b..f4cdd766cb9 100644
--- a/code/_globalvars/misc.dm
+++ b/code/_globalvars/misc.dm
@@ -88,4 +88,6 @@ var/copier_items_printed_logged = FALSE
GLOBAL_VAR(map_name) // Self explanatory
-var/global/datum/datacore/data_core = null // Station datacore, manifest, etc
\ No newline at end of file
+var/global/datum/datacore/data_core = null // Station datacore, manifest, etc
+
+GLOBAL_VAR_INIT(panic_bunker_enabled, 0) // Is the panic bunker enabled
\ No newline at end of file
diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm
index 22921f5228d..ca8f32f2599 100644
--- a/code/_onclick/ai.dm
+++ b/code/_onclick/ai.dm
@@ -209,11 +209,13 @@
/atom/proc/AIMiddleClick()
return
-/obj/machinery/door/airlock/AIMiddleClick() // Toggles door bolt lights.
- if(!src.lights)
- Topic(src, list("src" = UID(), "command"="lights", "activate" = "1"), 1) // 1 meaning no window (consistency!)
+/obj/machinery/door/airlock/AIMiddleClick() // Toggles door safety.
+ if(safe)
+ Topic(src, list("src" = UID(), "command"="safeties", "activate" = "1"), 1) // 1 meaning no window (consistency!)
+ to_chat(usr, "The door safeties have been overridden.")
else
- Topic(src, list("src" = UID(), "command"="lights", "activate" = "0"), 1)
+ Topic(src, list("src" = UID(), "command"="safeties", "activate" = "0"), 1)
+ to_chat(usr, "The door safeties have been reset.")
return
/obj/machinery/ai_slipper/AICtrlClick() //Turns liquid dispenser on or off
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index e3d423130e5..58e82733abe 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -107,14 +107,20 @@
#define ui_healthdoll "EAST-1:28,CENTER-1:15"
#define ui_health "EAST-1:28,CENTER:17"
#define ui_internal "EAST-1:28,CENTER+1:19"
- //borgs
+
+//borgs
#define ui_borg_health "EAST-1:28,CENTER-1:15" //borgs have the health display where humans have the pressure damage indicator.
+
+//aliens
#define ui_alien_health "EAST-1:28,CENTER-1:15" //aliens have the health display where humans have the pressure damage indicator.
-
+//constructs
#define ui_construct_pull "EAST-1:28,SOUTH+1:10" //above the zone_sel icon
#define ui_construct_health "EAST,CENTER:15" //same height as humans, hugging the right border
+//slimes
+#define ui_slime_health "EAST,CENTER:15" //same as borgs, constructs and humans
+
//Pop-up inventory
#define ui_shoes "WEST+1:8,SOUTH:5"
diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm
index 15ed4429965..b70c98908f5 100644
--- a/code/_onclick/hud/action_button.dm
+++ b/code/_onclick/hud/action_button.dm
@@ -2,6 +2,25 @@
var/datum/action/linked_action
screen_loc = null
+/obj/screen/movable/action_button/MouseDrop(over_object)
+ if((istype(over_object, /obj/screen/movable/action_button) && !istype(over_object, /obj/screen/movable/action_button/hide_toggle)))
+ if(locked)
+ to_chat(usr, "Action button \"[name]\" is locked, unlock it first.")
+ closeToolTip(usr)
+ return
+ var/obj/screen/movable/action_button/B = over_object
+ var/list/actions = usr.actions
+ actions.Swap(actions.Find(linked_action), actions.Find(B.linked_action))
+ moved = FALSE
+ B.moved = FALSE
+ closeToolTip(usr)
+ usr.update_action_buttons()
+ else if(istype(over_object, /obj/screen/movable/action_button/hide_toggle))
+ closeToolTip(usr)
+ else
+ closeToolTip(usr)
+ return ..()
+
/obj/screen/movable/action_button/Click(location,control,params)
var/list/modifiers = params2list(params)
if(modifiers["shift"])
@@ -29,6 +48,13 @@
icon_state = "bg_default"
var/hidden = 0
+/obj/screen/movable/action_button/hide_toggle/MouseDrop(over_object)
+ if(istype(over_object, /obj/screen/movable/action_button))
+ closeToolTip(usr)
+ else
+ closeToolTip(usr)
+ return ..()
+
/obj/screen/movable/action_button/hide_toggle/Click(location,control,params)
var/list/modifiers = params2list(params)
if(modifiers["shift"])
@@ -83,9 +109,9 @@
var/image/img = image(icon, src, hidden ? "show" : "hide")
overlays += img
-/obj/screen/movable/action_button/MouseEntered(location,control,params)
- openToolTip(usr,src,params,title = name,content = desc)
-
+/obj/screen/movable/action_button/MouseEntered(location, control, params)
+ if(!QDELETED(src))
+ openToolTip(usr, src, params, title = name, content = desc)
/obj/screen/movable/action_button/MouseExited()
closeToolTip(usr)
diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm
index 0b1a6d1c6c4..dc98d887279 100644
--- a/code/_onclick/hud/ai.dm
+++ b/code/_onclick/hud/ai.dm
@@ -256,4 +256,10 @@
//Add multicamera camera
using = new /obj/screen/ai/add_multicam()
using.screen_loc = ui_ai_add_multicam
- static_inventory += using
\ No newline at end of file
+ static_inventory += using
+
+//Intent
+ using = new /obj/screen/act_intent/robot/AI()
+ using.icon_state = mymob.a_intent
+ static_inventory += using
+ action_intent = using
\ No newline at end of file
diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm
index 4e92395f4cc..600c1105e8e 100644
--- a/code/_onclick/hud/ghost.dm
+++ b/code/_onclick/hud/ghost.dm
@@ -59,3 +59,8 @@
using = new /obj/screen/ghost/teleport()
using.screen_loc = ui_ghost_teleport
static_inventory += using
+
+/datum/hud/ghost/show_hud()
+ mymob.client.screen = list()
+ mymob.client.screen += static_inventory
+ ..()
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index 0063feae9cf..e93b3b121e6 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -99,6 +99,7 @@
/datum/hud/proc/show_hud(version = 0)
if(!ismob(mymob))
return FALSE
+
if(!mymob.client)
return FALSE
@@ -172,6 +173,7 @@
mymob.update_action_buttons(1)
reorganize_alerts()
reload_fullscreen()
+ update_parallax_pref(mymob)
plane_masters_update()
/datum/hud/proc/plane_masters_update()
diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm
new file mode 100644
index 00000000000..e60200b967a
--- /dev/null
+++ b/code/_onclick/hud/parallax.dm
@@ -0,0 +1,319 @@
+/client
+ var/list/parallax_layers
+ var/list/parallax_layers_cached
+ var/static/list/parallax_static_layers_tail = newlist(/obj/screen/parallax_pmaster, /obj/screen/parallax_space_whitifier)
+ var/atom/movable/movingmob
+ var/turf/previous_turf
+ var/dont_animate_parallax //world.time of when we can state animate()ing parallax again
+ var/last_parallax_shift //world.time of last update
+ var/parallax_throttle = 0 //ds between updates
+ var/parallax_movedir = 0
+ var/parallax_layers_max = 3
+ var/parallax_animate_timer
+
+/datum/hud/proc/create_parallax()
+ var/client/C = mymob.client
+ if(!apply_parallax_pref())
+ return
+
+ if(!length(C.parallax_layers_cached))
+ C.parallax_layers_cached = list()
+ C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_1(null, C.view)
+ C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_2(null, C.view)
+ C.parallax_layers_cached += new /obj/screen/parallax_layer/planet(null, C.view)
+ C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_3(null, C.view)
+
+ C.parallax_layers = C.parallax_layers_cached.Copy()
+
+ if(length(C.parallax_layers) > C.parallax_layers_max)
+ C.parallax_layers.len = C.parallax_layers_max
+
+ C.screen |= (C.parallax_layers + C.parallax_static_layers_tail)
+
+/datum/hud/proc/remove_parallax()
+ var/client/C = mymob.client
+ C.screen -= (C.parallax_layers_cached + C.parallax_static_layers_tail)
+ C.parallax_layers = null
+
+/datum/hud/proc/apply_parallax_pref()
+ var/client/C = mymob.client
+ if(C.prefs)
+ var/pref = C.prefs.parallax
+ if (isnull(pref))
+ pref = PARALLAX_HIGH
+ switch(C.prefs.parallax)
+ if (PARALLAX_INSANE)
+ C.parallax_throttle = FALSE
+ C.parallax_layers_max = 4
+ return TRUE
+
+ if (PARALLAX_MED)
+ C.parallax_throttle = PARALLAX_DELAY_MED
+ C.parallax_layers_max = 2
+ return TRUE
+
+ if (PARALLAX_LOW)
+ C.parallax_throttle = PARALLAX_DELAY_LOW
+ C.parallax_layers_max = 1
+ return TRUE
+
+ if (PARALLAX_DISABLE)
+ return FALSE
+
+ C.parallax_throttle = PARALLAX_DELAY_DEFAULT
+ C.parallax_layers_max = 3
+ return TRUE
+
+/datum/hud/proc/update_parallax_pref()
+ remove_parallax()
+ create_parallax()
+ update_parallax()
+
+// This sets which way the current shuttle is moving (returns true if the shuttle has stopped moving so the caller can append their animation)
+// Well, it would if our shuttle code had dynamic areas
+/datum/hud/proc/set_parallax_movedir(new_parallax_movedir, skip_windups)
+ . = FALSE
+ var/client/C = mymob.client
+ if(new_parallax_movedir == C.parallax_movedir)
+ return
+ var/animatedir = new_parallax_movedir
+ if(new_parallax_movedir == FALSE)
+ var/animate_time = 0
+ for(var/thing in C.parallax_layers)
+ var/obj/screen/parallax_layer/L = thing
+ L.icon_state = initial(L.icon_state)
+ L.update_o(C.view)
+ var/T = PARALLAX_LOOP_TIME / L.speed
+ if(T > animate_time)
+ animate_time = T
+ C.dont_animate_parallax = world.time + min(animate_time, PARALLAX_LOOP_TIME)
+ animatedir = C.parallax_movedir
+
+ var/matrix/newtransform
+ switch(animatedir)
+ if(NORTH)
+ newtransform = matrix(1, 0, 0, 0, 1, 480)
+ if(SOUTH)
+ newtransform = matrix(1, 0, 0, 0, 1,-480)
+ if(EAST)
+ newtransform = matrix(1, 0, 480, 0, 1, 0)
+ if(WEST)
+ newtransform = matrix(1, 0,-480, 0, 1, 0)
+
+ var/shortesttimer
+ for(var/thing in C.parallax_layers)
+ var/obj/screen/parallax_layer/L = thing
+
+ var/T = PARALLAX_LOOP_TIME / L.speed
+ if(isnull(shortesttimer))
+ shortesttimer = T
+ if(T < shortesttimer)
+ shortesttimer = T
+ L.transform = newtransform
+ animate(L, transform = matrix(), time = T, easing = QUAD_EASING | (new_parallax_movedir ? EASE_IN : EASE_OUT), flags = ANIMATION_END_NOW)
+ if(new_parallax_movedir)
+ L.transform = newtransform
+ animate(transform = matrix(), time = T) //queue up another animate so lag doesn't create a shutter
+
+ C.parallax_movedir = new_parallax_movedir
+ if(C.parallax_animate_timer)
+ deltimer(C.parallax_animate_timer)
+ var/datum/callback/CB = CALLBACK(src, .proc/update_parallax_motionblur, C, animatedir, new_parallax_movedir, newtransform)
+ if(skip_windups)
+ CB.Invoke()
+ else
+ C.parallax_animate_timer = addtimer(CB, min(shortesttimer, PARALLAX_LOOP_TIME), TIMER_CLIENT_TIME|TIMER_STOPPABLE)
+
+/datum/hud/proc/update_parallax_motionblur(client/C, animatedir, new_parallax_movedir, matrix/newtransform)
+ C.parallax_animate_timer = FALSE
+ for(var/thing in C.parallax_layers)
+ var/obj/screen/parallax_layer/L = thing
+ if(!new_parallax_movedir)
+ animate(L)
+ continue
+
+ var/newstate = initial(L.icon_state)
+ if(animatedir)
+ if(animatedir == NORTH || animatedir == SOUTH)
+ newstate += "_vertical"
+ else
+ newstate += "_horizontal"
+
+ var/T = PARALLAX_LOOP_TIME / L.speed
+
+ if(newstate in icon_states(L.icon))
+ L.icon_state = newstate
+ L.update_o(C.view)
+
+ L.transform = newtransform
+
+ animate(L, transform = matrix(), time = T, loop = -1, flags = ANIMATION_END_NOW)
+
+/datum/hud/proc/update_parallax()
+ var/client/C = mymob.client
+ var/turf/posobj = get_turf(C.eye)
+ if(!posobj)
+ return
+ var/area/areaobj = posobj.loc
+
+ // Update the movement direction of the parallax if necessary (for shuttles)
+ var/area/shuttle/SA = areaobj
+ if(!SA || !SA.moving)
+ set_parallax_movedir(0)
+ else
+ set_parallax_movedir(SA.parallax_movedir)
+
+ var/force
+ if(!C.previous_turf || (C.previous_turf.z != posobj.z))
+ C.previous_turf = posobj
+ force = TRUE
+
+ if(!force && world.time < C.last_parallax_shift+C.parallax_throttle)
+ return
+
+ //Doing it this way prevents parallax layers from "jumping" when you change Z-Levels.
+ var/offset_x = posobj.x - C.previous_turf.x
+ var/offset_y = posobj.y - C.previous_turf.y
+
+ if(!offset_x && !offset_y && !force)
+ return
+
+ var/last_delay = world.time - C.last_parallax_shift
+ last_delay = min(last_delay, C.parallax_throttle)
+ C.previous_turf = posobj
+ C.last_parallax_shift = world.time
+
+ for(var/thing in C.parallax_layers)
+ var/obj/screen/parallax_layer/L = thing
+ L.update_status(mymob)
+ if(L.view_sized != C.view)
+ L.update_o(C.view)
+
+ var/change_x
+ var/change_y
+
+ if(L.absolute)
+ L.offset_x = -(posobj.x - SSparallax.planet_x_offset) * L.speed
+ L.offset_y = -(posobj.y - SSparallax.planet_y_offset) * L.speed
+ else
+ change_x = offset_x * L.speed
+ L.offset_x -= change_x
+ change_y = offset_y * L.speed
+ L.offset_y -= change_y
+
+ if(L.offset_x > 240)
+ L.offset_x -= 480
+ if(L.offset_x < -240)
+ L.offset_x += 480
+ if(L.offset_y > 240)
+ L.offset_y -= 480
+ if(L.offset_y < -240)
+ L.offset_y += 480
+
+ if(!(areaobj.parallax_movedir && areaobj.moving) && C.dont_animate_parallax <= world.time && (offset_x || offset_y) && abs(offset_x) <= max(C.parallax_throttle/world.tick_lag+1,1) && abs(offset_y) <= max(C.parallax_throttle/world.tick_lag+1,1) && (round(abs(change_x)) > 1 || round(abs(change_y)) > 1))
+ L.transform = matrix(1, 0, offset_x*L.speed, 0, 1, offset_y*L.speed)
+ animate(L, transform=matrix(), time = last_delay)
+
+ L.screen_loc = "CENTER-7:[round(L.offset_x,1)],CENTER-7:[round(L.offset_y,1)]"
+
+/atom/movable/proc/update_parallax_contents()
+ if(length(client_mobs_in_contents))
+ for(var/thing in client_mobs_in_contents)
+ var/mob/M = thing
+ if(M && M.client && M.hud_used && length(M.client.parallax_layers))
+ M.hud_used.update_parallax()
+
+/obj/screen/parallax_layer
+ icon = 'icons/effects/parallax.dmi'
+ var/speed = 1
+ var/offset_x = 0
+ var/offset_y = 0
+ var/view_sized
+ var/absolute = FALSE
+ blend_mode = BLEND_ADD
+ plane = PLANE_SPACE_PARALLAX
+ screen_loc = "CENTER-7,CENTER-7"
+ mouse_opacity = 0
+
+
+/obj/screen/parallax_layer/New(view)
+ ..()
+ if(!view)
+ view = world.view
+ update_o(view)
+
+/obj/screen/parallax_layer/proc/update_o(view)
+ if(!view)
+ view = world.view
+ var/list/new_overlays = list()
+ var/count = Ceiling(view/(480/world.icon_size))+1
+ for(var/x in -count to count)
+ for(var/y in -count to count)
+ if(x == 0 && y == 0)
+ continue
+ var/mutable_appearance/texture_overlay = mutable_appearance(icon, icon_state)
+ texture_overlay.transform = matrix(1, 0, x*480, 0, 1, y*480)
+ new_overlays += texture_overlay
+
+ overlays = new_overlays
+ view_sized = view
+
+/obj/screen/parallax_layer/proc/update_status(mob/M)
+ return
+
+/obj/screen/parallax_layer/layer_1
+ icon_state = "layer1"
+ speed = 0.6
+ layer = 1
+
+/obj/screen/parallax_layer/layer_2
+ icon_state = "layer2"
+ speed = 1
+ layer = 2
+
+/obj/screen/parallax_layer/layer_3
+ icon_state = "layer3"
+ speed = 1.4
+ layer = 3
+
+/obj/screen/parallax_layer/planet
+ icon_state = "planet"
+ blend_mode = BLEND_OVERLAY
+ absolute = TRUE //Status of seperation
+ speed = 3
+ layer = 30
+
+/obj/screen/parallax_layer/planet/update_status(mob/M)
+ var/turf/T = get_turf(M)
+ if(is_station_level(T.z))
+ invisibility = 0
+ else
+ invisibility = INVISIBILITY_ABSTRACT
+
+/obj/screen/parallax_layer/planet/update_o()
+ return //Shit wont move
+
+/obj/screen/parallax_pmaster
+ appearance_flags = PLANE_MASTER
+ plane = PLANE_SPACE_PARALLAX
+ blend_mode = BLEND_MULTIPLY
+ mouse_opacity = FALSE
+ screen_loc = "CENTER-7,CENTER-7"
+
+/obj/screen/parallax_space_whitifier
+ appearance_flags = PLANE_MASTER
+ plane = PLANE_SPACE
+ color = list(
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 1, 1, 1, 1,
+ 0, 0, 0, 0
+ )
+ screen_loc = "CENTER-7,CENTER-7"
+
+
+#undef LOOP_NONE
+#undef LOOP_NORMAL
+#undef LOOP_REVERSE
+#undef LOOP_TIME
\ No newline at end of file
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 91c8d6250b4..8bc65fcf691 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -95,6 +95,9 @@
icon = 'icons/mob/screen_robot.dmi'
screen_loc = ui_borg_intents
+/obj/screen/act_intent/robot/AI
+ screen_loc = "EAST-1:32,SOUTH:70"
+
/obj/screen/mov_intent
name = "run/walk toggle"
icon_state = "running"
@@ -453,6 +456,12 @@
/obj/screen/healths/corgi
icon = 'icons/mob/screen_corgi.dmi'
+/obj/screen/healths/slime
+ icon = 'icons/mob/screen_slime.dmi'
+ icon_state = "slime_health0"
+ screen_loc = ui_slime_health
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+
/obj/screen/healths/guardian
name = "summoner health"
icon = 'icons/mob/guardian.dmi'
diff --git a/code/_onclick/hud/slime.dm b/code/_onclick/hud/slime.dm
new file mode 100644
index 00000000000..9f5621b75ee
--- /dev/null
+++ b/code/_onclick/hud/slime.dm
@@ -0,0 +1,18 @@
+/mob/living/carbon/slime/create_mob_hud()
+ if(client && !hud_used)
+ hud_used = new /datum/hud/slime(src)
+
+/mob/living/simple_animal/slime/create_mob_hud()
+ if(client && !hud_used)
+ hud_used = new /datum/hud/slime(src)
+
+/datum/hud/slime/New(mob/owner)
+ ..()
+ mymob.healths = new /obj/screen/healths/slime()
+ infodisplay += mymob.healths
+
+ mymob.pullin = new /obj/screen/pull()
+ mymob.pullin.icon = 'icons/mob/screen_slime.dmi'
+ mymob.pullin.update_icon(mymob)
+ mymob.pullin.screen_loc = ui_construct_pull
+ hotkeybuttons += mymob.pullin
diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm
index 797384b8336..5f0c94ecee6 100644
--- a/code/_onclick/observer.dm
+++ b/code/_onclick/observer.dm
@@ -17,6 +17,7 @@
else
following = null
forceMove(get_turf(A))
+ update_parallax_contents()
/mob/dead/observer/ClickOn(var/atom/A, var/params)
if(client.click_intercept)
@@ -58,6 +59,14 @@
/atom/proc/attack_ghost(mob/user as mob)
return
+// health + cyborg analyzer for ghosts
+/mob/living/attack_ghost(mob/dead/observer/user)
+ if(user.client && user.health_scan)
+ if(issilicon(src) || ismachine(src))
+ robot_healthscan(user, src)
+ else if(ishuman(src))
+ healthscan(user, src, 1, TRUE)
+
// ---------------------------------------
// And here are some good things for free:
// Now you can click through portals, wormholes, gateways, and teleporters while observing. -Sayu
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 5792aff1725..baa0adc07ec 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -79,9 +79,8 @@
var/auto_cryo_ssd_mins = 0
var/ssd_warning = 0
-
- var/prob_free_golems = 75 //chance for free golems spawners to appear roundstart
- var/unrestricted_free_golems = FALSE //if true, free golems can appear on all roundtypes
+
+ var/list_afk_minimum = 5 // How long people have to be AFK before it's listed on the "List AFK players" verb
var/traitor_objectives_amount = 2
var/shadowling_max_age = 0
@@ -310,12 +309,6 @@
if("jobs_have_minimal_access")
config.jobs_have_minimal_access = 1
- if("prob_free_golems")
- config.prob_free_golems = text2num(value)
-
- if("unrestricted_free_golems")
- config.unrestricted_free_golems = TRUE
-
if("shadowling_max_age")
config.shadowling_max_age = text2num(value)
@@ -331,6 +324,9 @@
if("ssd_warning")
config.ssd_warning = 1
+ if("list_afk_minimum")
+ config.list_afk_minimum = text2num(value)
+
if("ipintel_email")
if(value != "ch@nge.me")
config.ipintel_email = value
diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm
index 79de45c3248..fe48494f321 100644
--- a/code/controllers/subsystem/air.dm
+++ b/code/controllers/subsystem/air.dm
@@ -30,6 +30,7 @@ SUBSYSTEM_DEF(air)
var/list/networks = list()
var/list/atmos_machinery = list()
var/list/pipe_init_dirs_cache = list()
+ var/list/machinery_to_construct = list()
@@ -67,9 +68,10 @@ SUBSYSTEM_DEF(air)
setup_allturfs()
setup_atmos_machinery(GLOB.machines)
setup_pipenets(GLOB.machines)
+ for(var/obj/machinery/atmospherics/A in machinery_to_construct)
+ A.initialize_atmos_network()
return ..()
-
/datum/controller/subsystem/air/fire(resumed = 0)
var/timer = TICK_USAGE_REAL
diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm
index b45ef833b9f..ec53c4b4d6b 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -20,7 +20,7 @@ SUBSYSTEM_DEF(mapping)
var/num_extra_space = rand(config.extra_space_ruin_levels_min, config.extra_space_ruin_levels_max)
for(var/i = 1, i <= num_extra_space, i++)
- var/zlev = space_manager.add_new_zlevel("[EMPTY_AREA] #[i]", linkage = CROSSLINKED)
+ var/zlev = space_manager.add_new_zlevel("[EMPTY_AREA] #[i]", linkage = CROSSLINKED, traits = list(REACHABLE))
seedRuins(list(zlev), rand(0, 3), /area/space, space_ruins_templates)
// Setup the Z-level linkage
diff --git a/code/controllers/subsystem/parallax.dm b/code/controllers/subsystem/parallax.dm
new file mode 100644
index 00000000000..039b6d2b008
--- /dev/null
+++ b/code/controllers/subsystem/parallax.dm
@@ -0,0 +1,44 @@
+SUBSYSTEM_DEF(parallax)
+ name = "Parallax"
+ wait = 2
+ flags = SS_POST_FIRE_TIMING | SS_BACKGROUND
+ priority = FIRE_PRIORITY_PARALLAX
+ runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
+ var/list/currentrun
+ var/planet_x_offset = 128
+ var/planet_y_offset = 128
+
+/datum/controller/subsystem/parallax/Initialize(timeofday)
+ . = ..()
+ planet_y_offset = rand(100, 160)
+ planet_x_offset = rand(100, 160)
+
+/datum/controller/subsystem/parallax/fire(resumed = 0)
+ if(!resumed)
+ src.currentrun = GLOB.clients.Copy()
+
+ //cache for sanic speed (lists are references anyways)
+ var/list/currentrun = src.currentrun
+
+ while(length(currentrun))
+ var/client/C = currentrun[currentrun.len]
+ currentrun.len--
+ if(!C || !C.eye)
+ if(MC_TICK_CHECK)
+ return
+ continue
+ var/atom/movable/A = C.eye
+ if(!istype(A))
+ continue
+ for (A; isloc(A.loc) && !isturf(A.loc); A = A.loc);
+
+ if(A != C.movingmob)
+ if(C.movingmob != null)
+ C.movingmob.client_mobs_in_contents -= C.mob
+ UNSETEMPTY(C.movingmob.client_mobs_in_contents)
+ LAZYINITLIST(A.client_mobs_in_contents)
+ A.client_mobs_in_contents += C.mob
+ C.movingmob = A
+ if(MC_TICK_CHECK)
+ return
+ currentrun = null
diff --git a/code/controllers/subsystem/tickets/mentor_tickets.dm b/code/controllers/subsystem/tickets/mentor_tickets.dm
index 32f7faf4abb..d8bae77840c 100644
--- a/code/controllers/subsystem/tickets/mentor_tickets.dm
+++ b/code/controllers/subsystem/tickets/mentor_tickets.dm
@@ -8,7 +8,7 @@ GLOBAL_REAL(SSmentor_tickets, /datum/controller/subsystem/tickets/mentor_tickets
name = "Mentor Tickets"
ticket_system_name = "Mentor Tickets"
ticket_name = "Mentor Ticket"
- span_text = ""
+ span_class = "mentorhelp"
close_rights = R_MENTOR | R_ADMIN
/datum/controller/subsystem/tickets/mentor_tickets/message_staff(var/msg)
@@ -17,5 +17,5 @@ GLOBAL_REAL(SSmentor_tickets, /datum/controller/subsystem/tickets/mentor_tickets
/datum/controller/subsystem/tickets/mentor_tickets/Initialize()
close_messages = list("- [ticket_name] Closed -",
"Please try to be as descriptive as possible in mentor helps. Mentors do not know the full situation you're in and need more information to give you a helpful response.",
- "[span_text]Your [ticket_name] has now been closed.")
+ "Your [ticket_name] has now been closed.")
return ..()
diff --git a/code/controllers/subsystem/tickets/tickets.dm b/code/controllers/subsystem/tickets/tickets.dm
index cf9aed29e83..1b1735b34c1 100644
--- a/code/controllers/subsystem/tickets/tickets.dm
+++ b/code/controllers/subsystem/tickets/tickets.dm
@@ -12,7 +12,7 @@
SUBSYSTEM_DEF(tickets)
name = "Admin Tickets"
- var/span_text = ""
+ var/span_class = "adminticket"
var/ticket_system_name = "Admin Tickets"
var/ticket_name = "Admin Ticket"
var/close_rights = R_ADMIN
@@ -30,7 +30,7 @@ SUBSYSTEM_DEF(tickets)
/datum/controller/subsystem/tickets/Initialize()
close_messages = list("- [ticket_name] Rejected! -",
"Please try to be calm, clear, and descriptive in admin helps, do not assume the staff member has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.",
- "[span_text]Your [ticket_name] has now been closed.")
+ "Your [ticket_name] has now been closed.")
LAZYINITLIST(allTickets)
return ..()
@@ -40,7 +40,7 @@ SUBSYSTEM_DEF(tickets)
var/report
for(var/num in stales)
report += "[num], "
- message_staff("[span_text]Tickets [report] have been open for over [TICKET_TIMEOUT / 600] minutes. Changing status to stale.")
+ message_staff("Tickets [report] have been open for over [TICKET_TIMEOUT / 600] minutes. Changing status to stale.")
/datum/controller/subsystem/tickets/stat_entry()
..("Tickets: [LAZYLEN(allTickets)]")
@@ -80,7 +80,7 @@ SUBSYSTEM_DEF(tickets)
var/datum/ticket/existingTicket = checkForOpenTicket(C)
if(existingTicket)
existingTicket.setCooldownPeriod()
- to_chat(C.mob, "[span_text]Your [ticket_name] #[existingTicket.ticketNum] remains open! Visit \"My tickets\" under the Admin Tab to view it.")
+ to_chat(C.mob, "Your [ticket_name] #[existingTicket.ticketNum] remains open! Visit \"My tickets\" under the Admin Tab to view it.")
return
if(!title)
@@ -93,7 +93,7 @@ SUBSYSTEM_DEF(tickets)
T.mobControlled = C.mob
//Inform the user that they have opened a ticket
- to_chat(C, "[span_text]You have opened [ticket_name] number #[(getTicketCounter() - 1)]! Please be patient and we will help you soon!")
+ to_chat(C, "You have opened [ticket_name] number #[(getTicketCounter() - 1)]! Please be patient and we will help you soon!")
//Set ticket state with key N to open
/datum/controller/subsystem/tickets/proc/openTicket(N)
@@ -138,8 +138,10 @@ SUBSYSTEM_DEF(tickets)
var/datum/ticket/T = allTickets[N]
return T.clientName
-/datum/controller/subsystem/tickets/proc/assignStaffToTicket(client/C, var/N)
+/datum/controller/subsystem/tickets/proc/assignStaffToTicket(client/C, N)
var/datum/ticket/T = allTickets[N]
+ if(T.staffAssigned != null && T.staffAssigned != C && alert("Ticket is already assigned to [T.staffAssigned.ckey]. Are you sure you want to take it?","Take ticket","No","Yes") != "Yes")
+ return FALSE
T.assignStaff(C)
return TRUE
@@ -158,7 +160,7 @@ SUBSYSTEM_DEF(tickets)
var/ticketState // State of the ticket, open, closed, resolved etc
var/timeUntilStale // When the ticket goes stale
var/ticketCooldown // Cooldown before allowing the user to open another ticket.
- var/staffAssigned // Staff member who has assigned themselves to this ticket
+ var/client/staffAssigned // Staff member who has assigned themselves to this ticket
/datum/ticket/New(tit, cont, num)
title = tit
@@ -367,15 +369,15 @@ UI STUFF
if(href_list["resolve"])
var/indexNum = text2num(href_list["resolve"])
if(resolveTicket(indexNum))
- message_staff("[span_text][usr.client] / ([usr]) resolved [ticket_name] number [indexNum]")
- to_chat_safe(returnClient(indexNum), "[span_text]Your [ticket_name] has now been resolved.")
+ message_staff("[usr.client] / ([usr]) resolved [ticket_name] number [indexNum]")
+ to_chat_safe(returnClient(indexNum), "Your [ticket_name] has now been resolved.")
showUI(usr)
if(href_list["detailresolve"])
var/indexNum = text2num(href_list["detailresolve"])
if(resolveTicket(indexNum))
- message_staff("[span_text][usr.client] / ([usr]) resolved [ticket_name] number [indexNum]")
- to_chat_safe(returnClient(indexNum), "[span_text]Your [ticket_name] has now been resolved.")
+ message_staff("[usr.client] / ([usr]) resolved [ticket_name] number [indexNum]")
+ to_chat_safe(returnClient(indexNum), "Your [ticket_name] has now been resolved.")
showDetailUI(usr, indexNum)
if(href_list["detailclose"])
@@ -386,7 +388,7 @@ UI STUFF
if(alert("Are you sure? This will send a negative message.",,"Yes","No") != "Yes")
return
if(closeTicket(indexNum))
- message_staff("[span_text][usr.client] / ([usr]) closed [ticket_name] number [indexNum]")
+ message_staff("[usr.client] / ([usr]) closed [ticket_name] number [indexNum]")
to_chat_safe(returnClient(indexNum), close_messages)
showDetailUI(usr, indexNum)
@@ -394,7 +396,7 @@ UI STUFF
if(href_list["detailreopen"])
var/indexNum = text2num(href_list["detailreopen"])
if(openTicket(indexNum))
- message_staff("[span_text][usr.client] / ([usr]) re-opened [ticket_name] number [indexNum]")
+ message_staff("[usr.client] / ([usr]) re-opened [ticket_name] number [indexNum]")
showDetailUI(usr, indexNum)
if(href_list["assignstaff"])
@@ -404,8 +406,8 @@ UI STUFF
/datum/controller/subsystem/tickets/proc/takeTicket(var/index)
if(assignStaffToTicket(usr.client, index))
- if(span_text == "")
- message_staff("[span_text][usr.client] / ([usr]) has taken [ticket_name] number [index]")
+ if(span_class == "mentorhelp")
+ message_staff("[usr.client] / ([usr]) has taken [ticket_name] number [index]")
else
message_staff("[usr.client] / ([usr]) has taken [ticket_name] number [index]", TRUE)
- to_chat_safe(returnClient(index), "[span_text]Your [ticket_name] is being handled by [usr.client].")
+ to_chat_safe(returnClient(index), "Your [ticket_name] is being handled by [usr.client].")
diff --git a/code/datums/components/paintable.dm b/code/datums/components/paintable.dm
new file mode 100644
index 00000000000..ef9a2923cc6
--- /dev/null
+++ b/code/datums/components/paintable.dm
@@ -0,0 +1,31 @@
+/datum/component/spraycan_paintable
+ var/current_paint
+
+/datum/component/spraycan_paintable/Initialize()
+ RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/Repaint)
+
+/datum/component/spraycan_paintable/Destroy()
+ RemoveCurrentCoat()
+ return ..()
+
+/datum/component/spraycan_paintable/proc/RemoveCurrentCoat()
+ var/atom/A = parent
+ A.remove_atom_colour(FIXED_COLOUR_PRIORITY, current_paint)
+
+/datum/component/spraycan_paintable/proc/Repaint(datum/source, obj/item/toy/crayon/spraycan/spraycan, mob/living/user)
+ if(!istype(spraycan) || user.a_intent == INTENT_HARM)
+ return
+ . = COMPONENT_NO_AFTERATTACK
+ if(spraycan.capped)
+ to_chat(user, "Take the cap off first!")
+ return
+ if(spraycan.uses < 2)
+ to_chat(user, "There is not enough paint in the can!")
+ return
+ RemoveCurrentCoat()
+ var/colour = spraycan.colour
+ current_paint = colour
+ var/atom/A = parent
+ A.add_atom_colour(colour, FIXED_COLOUR_PRIORITY)
+ playsound(spraycan, 'sound/effects/spray.ogg', 5, 1, 5)
+ to_chat(user, "You spray [spraycan] on [A], painting it.")
diff --git a/code/datums/components/waddling.dm b/code/datums/components/waddling.dm
new file mode 100644
index 00000000000..a1f538e4dd7
--- /dev/null
+++ b/code/datums/components/waddling.dm
@@ -0,0 +1,15 @@
+/datum/component/waddling
+ dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
+
+/datum/component/waddling/Initialize()
+ if(!isliving(parent))
+ return COMPONENT_INCOMPATIBLE
+ RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/Waddle)
+
+/datum/component/waddling/proc/Waddle()
+ var/mob/living/L = parent
+ if(L.incapacitated() || L.lying)
+ return
+ animate(L, pixel_z = 4, time = 0)
+ animate(pixel_z = 0, transform = turn(matrix(), pick(-12, 0, 12)), time=2)
+ animate(pixel_z = 0, transform = matrix(), time = 0)
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index adb3167d8e4..e8339f81945 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -1269,7 +1269,12 @@
return
src.debug_variables(DAT)
- return
+ if(href_list["copyoutfit"])
+ if(!check_rights(R_EVENT))
+ return
+ var/mob/living/carbon/human/H = locateUID(href_list["copyoutfit"])
+ if(istype(H))
+ H.copy_outfit()
/client/proc/view_var_Topic_list(href, href_list, hsrc)
if(href_list["VarsList"])
diff --git a/code/datums/diseases/advance/symptoms/shivering.dm b/code/datums/diseases/advance/symptoms/shivering.dm
index d52a0a02256..30d1084ba0e 100644
--- a/code/datums/diseases/advance/symptoms/shivering.dm
+++ b/code/datums/diseases/advance/symptoms/shivering.dm
@@ -30,11 +30,11 @@ Bonus
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
to_chat(M, "[pick("You feel cold.", "You start shivering.")]")
- if(M.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT)
+ if(M.bodytemperature > BODYTEMP_COLD_DAMAGE_LIMIT)
Chill(M, A)
return
/datum/symptom/shivering/proc/Chill(mob/living/M, datum/disease/advance/A)
var/get_cold = (sqrtor0(16+A.totalStealth()*2))+(sqrtor0(21+A.totalResistance()*2))
- M.bodytemperature = min(M.bodytemperature - (get_cold * A.stage), BODYTEMP_COLD_DAMAGE_LIMIT + 1)
- return 1
\ No newline at end of file
+ M.bodytemperature = max(M.bodytemperature - (get_cold * A.stage), BODYTEMP_COLD_DAMAGE_LIMIT + 1)
+ return 1
diff --git a/code/datums/helper_datums/input.dm b/code/datums/helper_datums/input.dm
index aa73b1e387f..4c3dc6a1cf4 100644
--- a/code/datums/helper_datums/input.dm
+++ b/code/datums/helper_datums/input.dm
@@ -100,15 +100,20 @@
height = 400
immediate_submit = TRUE
+/datum/async_input/ranked/New()
+ ..()
+ popup.add_script("rankedInput.js", 'html/browser/rankedInput.js')
+ popup.add_head_content("Drag and drop or use the buttons to reorder")
+
/datum/async_input/ranked/render_choices()
var/dat = ""
- dat += "
"
+ dat += ""
for(var/i = 1, i <= choices.len, i++)
var/choice = choices[i]
dat += ""
dat += "| [button("+", i != 1 ? "upvote=[i]" : "", , i == 1)] | "
dat += "[button("-", i != choices.len ? "downvote=[i]" : "", , i == choices.len)] | "
- dat += "[i]. [choice] | "
+ dat += "[i]. [choice] | "
dat += "
"
dat += "
"
dat += ""
@@ -131,6 +136,15 @@
show()
return
+ if(href_list["cut"] && href_list["insert"])
+ var/cut = text2num(href_list["cut"])
+ var/insert = text2num(href_list["insert"])
+ var/choice = choices[cut]
+ choices.Cut(cut, cut + 1)
+ choices.Insert(insert, choice)
+ show()
+ return
+
..()
/datum/async_input/autocomplete
diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm
index 184f1155da2..6622e263789 100644
--- a/code/datums/outfits/outfit.dm
+++ b/code/datums/outfits/outfit.dm
@@ -22,11 +22,15 @@
var/pda = null
var/internals_slot = null //ID of slot containing a gas tank
var/list/backpack_contents = list() // In the list(path=count,otherpath=count) format
- var/list/implants = null
- var/list/cybernetic_implants = null
+ var/box // Internals box. Will be inserted at the start of backpack_contents
+ var/list/implants = list()
+ var/list/cybernetic_implants = list()
+ var/list/accessories = list()
var/list/chameleon_extras //extra types for chameleon outfit changes, mostly guns
+ var/can_be_admin_equipped = TRUE // Set to FALSE if your outfit requires runtime parameters
+
/datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
//to be overriden for customization depending on client prefs,species etc
return
@@ -82,12 +86,24 @@
if(pda)
equip_item(H, pda, slot_wear_pda)
+ if(uniform)
+ for(var/path in accessories)
+ var/obj/item/clothing/accessory/A = new path()
+ var/obj/item/clothing/under/U = uniform
+ U.attach_accessory(A, H)
+
if(!visualsOnly) // Items in pockets or backpack don't show up on mob's icon.
if(l_pocket)
equip_item(H, l_pocket, slot_l_store)
if(r_pocket)
equip_item(H, r_pocket, slot_r_store)
+ if(box)
+ if(!backpack_contents)
+ backpack_contents = list()
+ backpack_contents.Insert(1, box)
+ backpack_contents[box] = 1
+
for(var/path in backpack_contents)
var/number = backpack_contents[path]
for(var/i in 1 to number)
@@ -159,3 +175,95 @@
types += chameleon_extras
listclearnulls(types)
return types
+
+/datum/outfit/proc/save_to_file(mob/admin)
+ var/stored_data = get_json_data()
+ var/json = json_encode(stored_data)
+ // Kinda annoying but as far as I can tell you need to make actual file.
+ var/f = file("data/TempOutfitUpload")
+ fdel(f)
+ WRITE_FILE(f, json)
+ admin << ftp(f, "[name].json")
+
+/datum/outfit/proc/load_from(list/outfit_data)
+ // This could probably use more strict validation.
+ name = outfit_data["name"]
+ uniform = text2path(outfit_data["uniform"])
+ suit = text2path(outfit_data["suit"])
+ back = text2path(outfit_data["back"])
+ belt = text2path(outfit_data["belt"])
+ gloves = text2path(outfit_data["gloves"])
+ shoes = text2path(outfit_data["shoes"])
+ head = text2path(outfit_data["head"])
+ mask = text2path(outfit_data["mask"])
+ l_ear = text2path(outfit_data["l_ear"])
+ r_ear = text2path(outfit_data["r_ear"])
+ glasses = text2path(outfit_data["glasses"])
+ id = text2path(outfit_data["id"])
+ pda = text2path(outfit_data["pda"])
+ l_pocket = text2path(outfit_data["l_pocket"])
+ r_pocket = text2path(outfit_data["r_pocket"])
+ suit_store = text2path(outfit_data["suit_store"])
+ r_hand = text2path(outfit_data["r_hand"])
+ l_hand = text2path(outfit_data["l_hand"])
+ internals_slot = text2path(outfit_data["internals_slot"])
+
+ var/list/backpack = outfit_data["backpack_contents"]
+ backpack_contents = list()
+ for(var/item in backpack)
+ var/itype = text2path(item)
+ if(itype)
+ backpack_contents[itype] = backpack[item]
+ box = text2path(outfit_data["box"])
+
+ var/list/impl = outfit_data["implants"]
+ implants = list()
+ for(var/I in impl)
+ var/imptype = text2path(I)
+ if(imptype)
+ implants += imptype
+
+ var/list/cybernetic_impl = outfit_data["cybernetic_implants"]
+ cybernetic_implants = list()
+ for(var/I in cybernetic_impl)
+ var/cybtype = text2path(I)
+ if(cybtype)
+ cybernetic_implants += cybtype
+
+ var/list/accessories = outfit_data["accessories"]
+ accessories = list()
+ for(var/A in accessories)
+ var/accessorytype = text2path(A)
+ if(accessorytype)
+ accessories += accessorytype
+
+ return TRUE
+
+/datum/outfit/proc/get_json_data()
+ . = list()
+ .["outfit_type"] = type
+ .["name"] = name
+ .["uniform"] = uniform
+ .["suit"] = suit
+ .["back"] = back
+ .["belt"] = belt
+ .["gloves"] = gloves
+ .["shoes"] = shoes
+ .["head"] = head
+ .["mask"] = mask
+ .["l_ear"] = l_ear
+ .["r_ear"] = r_ear
+ .["glasses"] = glasses
+ .["id"] = id
+ .["pda"] = pda
+ .["l_pocket"] = l_pocket
+ .["r_pocket"] = r_pocket
+ .["suit_store"] = suit_store
+ .["r_hand"] = r_hand
+ .["l_hand"] = l_hand
+ .["internals_slot"] = internals_slot
+ .["backpack_contents"] = backpack_contents
+ .["box"] = box
+ .["implants"] = implants
+ .["cybernetic_implants"] = cybernetic_implants
+ .["accessories"] = accessories
diff --git a/code/datums/outfits/vv_outfit.dm b/code/datums/outfits/vv_outfit.dm
new file mode 100644
index 00000000000..7a07b087ae8
--- /dev/null
+++ b/code/datums/outfits/vv_outfit.dm
@@ -0,0 +1,190 @@
+// This outfit preserves varedits made on the items
+// Created from admin helpers.
+/datum/outfit/varedit
+ var/list/vv_values
+ var/list/stored_access
+ var/update_id_name = FALSE //If the name of the human is same as the name on the id they're wearing we'll update provided id when equipping
+
+/datum/outfit/varedit/pre_equip(mob/living/carbon/human/H, visualsOnly)
+ H.delete_equipment() //Applying VV to wrong objects is not reccomended.
+ . = ..()
+
+/datum/outfit/varedit/proc/set_equipment_by_slot(slot, item_path)
+ switch(slot)
+ if(slot_w_uniform)
+ uniform = item_path
+ if(slot_back)
+ back = item_path
+ if(slot_wear_suit)
+ suit = item_path
+ if(slot_belt)
+ belt = item_path
+ if(slot_gloves)
+ gloves = item_path
+ if(slot_shoes)
+ shoes = item_path
+ if(slot_head)
+ head = item_path
+ if(slot_wear_mask)
+ mask = item_path
+ if(slot_l_ear)
+ l_ear = item_path
+ if(slot_r_ear)
+ r_ear = item_path
+ if(slot_glasses)
+ glasses = item_path
+ if(slot_wear_id)
+ id = item_path
+ if(slot_wear_pda)
+ pda = item_path
+ if(slot_s_store)
+ suit_store = item_path
+ if(slot_l_store)
+ l_pocket = item_path
+ if(slot_r_store)
+ r_pocket = item_path
+
+
+/proc/collect_vv(obj/item/I)
+ //Temporary/Internal stuff, do not copy these.
+ var/static/list/ignored_vars = list("vars","x","y","z","plane","layer","override","animate_movement","pixel_step_size","screen_loc","fingerprintslast","tip_timer")
+
+ if(istype(I))
+ var/list/vedits = list()
+ for(var/varname in I.vars)
+ if(!I.can_vv_get(varname))
+ continue
+ if(varname in ignored_vars)
+ continue
+ var/vval = I.vars[varname]
+ //Does it even work ?
+ if(vval == initial(I.vars[varname]))
+ continue
+ //Only text/numbers and icons variables to make it less weirdness prone.
+ if(!istext(vval) && !isnum(vval) && !isicon(vval))
+ continue
+ vedits[varname] = I.vars[varname]
+ return vedits
+
+/mob/living/carbon/human/proc/copy_outfit()
+ var/datum/outfit/varedit/O = new
+
+ //Copy equipment
+ var/list/result = list()
+ var/list/slots_to_check = list(slot_w_uniform, slot_back, slot_wear_suit, slot_belt, slot_gloves, slot_shoes, slot_head, slot_wear_mask, slot_l_ear, slot_r_ear, slot_glasses, slot_wear_id, slot_wear_pda, slot_s_store, slot_l_store, slot_r_store)
+ for(var/s in slots_to_check)
+ var/obj/item/I = get_item_by_slot(s)
+ var/vedits = collect_vv(I)
+ if(vedits)
+ result["[s]"] = vedits
+ if(istype(I))
+ O.set_equipment_by_slot(s, I.type)
+
+ //Copy access
+ O.stored_access = list()
+ var/obj/item/id_slot = get_item_by_slot(slot_wear_id)
+ if(id_slot)
+ O.stored_access |= id_slot.GetAccess()
+ var/obj/item/card/id/ID = id_slot.GetID()
+ if(ID && ID.registered_name == real_name)
+ O.update_id_name = TRUE
+
+ //Copy hands
+ if(l_hand || r_hand) //Not in the mood to let outfits transfer amputees
+ var/obj/item/left_hand = l_hand
+ var/obj/item/right_hand = r_hand
+ if(istype(left_hand))
+ O.l_hand = left_hand.type
+ var/vedits = collect_vv(left_hand)
+ if(vedits)
+ result["LHAND"] = vedits
+ if(istype(right_hand))
+ O.r_hand = right_hand.type
+ var/vedits = collect_vv(left_hand)
+ if(vedits)
+ result["RHAND"] = vedits
+ O.vv_values = result
+
+ //Copy backpack contents if exist.
+ var/obj/item/backpack = get_item_by_slot(slot_back)
+ if(istype(backpack) && LAZYLEN(backpack.contents) > 0)
+ var/list/typecounts = list()
+ for(var/obj/item/I in backpack)
+ if(typecounts[I.type])
+ typecounts[I.type] += 1
+ else
+ typecounts[I.type] = 1
+ O.backpack_contents = typecounts
+ //TODO : Copy varedits from backpack stuff too.
+
+ //Copy implants
+ O.implants = list()
+ for(var/obj/item/implant/I in contents)
+ if(istype(I))
+ O.implants |= I.type
+
+ // Copy cybernetic implants
+ O.cybernetic_implants = list()
+ for(var/obj/item/organ/internal/CI in contents)
+ if(istype(CI))
+ O.cybernetic_implants |= CI.type
+
+ // Copy accessories
+ var/obj/item/clothing/under/uniform_slot = get_item_by_slot(slot_w_uniform)
+ if(uniform_slot)
+ O.accessories = list()
+ for(var/obj/item/clothing/accessory/A in uniform_slot.accessories)
+ if(istype(A))
+ O.accessories |= A
+
+ //Copy to outfit cache
+ var/outfit_name = stripped_input(usr, "Enter the outfit name")
+ O.name = outfit_name
+ GLOB.custom_outfits += O
+ to_chat(usr, "Outfit registered, use select equipment to equip it.")
+
+/datum/outfit/varedit/post_equip(mob/living/carbon/human/H, visualsOnly)
+ . = ..()
+ //Apply VV
+ for(var/slot in vv_values)
+ var/list/edits = vv_values[slot]
+ var/obj/item/I
+ switch(slot)
+ if("LHAND")
+ I = H.l_hand
+ if("RHAND")
+ I = H.r_hand
+ else
+ I = H.get_item_by_slot(text2num(slot))
+ for(var/vname in edits)
+ I.vv_edit_var(vname,edits[vname])
+ //Apply access
+ var/obj/item/id_slot = H.get_item_by_slot(slot_wear_id)
+ if(id_slot)
+ var/obj/item/card/id/card = id_slot.GetID()
+ if(istype(card))
+ card.access |= stored_access
+ if(update_id_name)
+ card.registered_name = H.real_name
+ card.update_label()
+
+/datum/outfit/varedit/get_json_data()
+ . = .. ()
+ .["stored_access"] = stored_access
+ .["update_id_name"] = update_id_name
+ var/list/stripped_vv = list()
+ for(var/slot in vv_values)
+ var/list/vedits = vv_values[slot]
+ var/list/stripped_edits = list()
+ for(var/edit in vedits)
+ if(istext(vedits[edit]) || isnum(vedits[edit]) || isnull(vedits[edit]))
+ stripped_edits[edit] = vedits[edit]
+ if(stripped_edits.len)
+ stripped_vv[slot] = stripped_edits
+ .["vv_values"] = stripped_vv
+
+/datum/outfit/varedit/load_from(list/outfit_data)
+ . = ..()
+ stored_access = outfit_data["stored_access"]
+ vv_values = outfit_data["vv_values"]
+ update_id_name = outfit_data["update_id_name"]
\ No newline at end of file
diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm
index d98a23a80c2..67e5438656e 100644
--- a/code/datums/ruins/lavaland.dm
+++ b/code/datums/ruins/lavaland.dm
@@ -46,6 +46,15 @@ datum/map_template/ruin/lavaland/ash_walker
cost = 20
allow_duplicates = FALSE
+/datum/map_template/ruin/lavaland/free_golem
+ name = "Free Golem Ship"
+ id = "golem-ship"
+ description = "Lumbering humanoids, made out of precious metals, move inside this ship. They frequently leave to mine more minerals, which they somehow turn into more of them. \
+ Seem very intent on research and individual liberty, and also geology based naming?"
+ cost = 20
+ suffix = "lavaland_surface_golem_ship.dmm"
+ allow_duplicates = FALSE
+
/datum/map_template/ruin/lavaland/animal_hospital
name = "Animal Hospital"
id = "animal-hospital"
diff --git a/code/datums/spells/horsemask.dm b/code/datums/spells/horsemask.dm
index 7b880f00e42..f536041e807 100644
--- a/code/datums/spells/horsemask.dm
+++ b/code/datums/spells/horsemask.dm
@@ -36,7 +36,7 @@
return
var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead
- magichead.flags |= NODROP //curses!
+ magichead.flags |= NODROP | DROPDEL //curses!
magichead.flags_inv = null //so you can still see their face
magichead.voicechange = 1 //NEEEEIIGHH
target.visible_message( "[target]'s face lights up in fire, and after the event a horse's head takes its place!", \
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index 387cc70f992..fb336192b38 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -40,6 +40,132 @@
playsound(owner, 'sound/weapons/bite.ogg', 50, 1)
owner.adjustBruteLoss(3)
+/datum/status_effect/blooddrunk
+ id = "blooddrunk"
+ duration = 10
+ tick_interval = 0
+ alert_type = /obj/screen/alert/status_effect/blooddrunk
+ var/last_health = 0
+ var/last_bruteloss = 0
+ var/last_fireloss = 0
+ var/last_toxloss = 0
+ var/last_oxyloss = 0
+ var/last_cloneloss = 0
+ var/last_staminaloss = 0
+
+/obj/screen/alert/status_effect/blooddrunk
+ name = "Blood-Drunk"
+ desc = "You are drunk on blood! Your pulse thunders in your ears! Nothing can harm you!" //not true, and the item description mentions its actual effect
+ icon_state = "blooddrunk"
+
+/datum/status_effect/blooddrunk/on_apply()
+ . = ..()
+ if(.)
+ owner.maxHealth *= 10
+ owner.bruteloss *= 10
+ owner.fireloss *= 10
+ if(ishuman(owner))
+ var/mob/living/carbon/human/H = owner
+ for(var/X in H.bodyparts)
+ var/obj/item/organ/external/BP = X
+ BP.max_damage *= 10
+ BP.min_broken_damage *= 10
+ BP.brute_dam *= 10
+ BP.burn_dam *= 10
+ owner.toxloss *= 10
+ owner.oxyloss *= 10
+ owner.cloneloss *= 10
+ owner.staminaloss *= 10
+ owner.updatehealth()
+ last_health = owner.health
+ last_bruteloss = owner.getBruteLoss()
+ last_fireloss = owner.getFireLoss()
+ last_toxloss = owner.getToxLoss()
+ last_oxyloss = owner.getOxyLoss()
+ last_cloneloss = owner.getCloneLoss()
+ last_staminaloss = owner.getStaminaLoss()
+ add_attack_logs(owner, owner, "gained blood-drunk stun immunity")
+ var/status = CANSTUN | CANWEAKEN | CANPARALYSE | IGNORESLOWDOWN
+ owner.status_flags &= ~status
+ owner.playsound_local(get_turf(owner), 'sound/effects/singlebeat.ogg', 40, 1)
+
+/datum/status_effect/blooddrunk/tick() //multiply the effect of healing by 10
+ if(owner.health > last_health)
+ var/needs_health_update = FALSE
+ var/new_bruteloss = owner.getBruteLoss()
+ if(new_bruteloss < last_bruteloss)
+ var/heal_amount = (new_bruteloss - last_bruteloss) * 10
+ owner.adjustBruteLoss(heal_amount, updating_health = FALSE)
+ new_bruteloss = owner.getBruteLoss()
+ needs_health_update = TRUE
+ last_bruteloss = new_bruteloss
+
+ var/new_fireloss = owner.getFireLoss()
+ if(new_fireloss < last_fireloss)
+ var/heal_amount = (new_fireloss - last_fireloss) * 10
+ owner.adjustFireLoss(heal_amount, updating_health = FALSE)
+ new_fireloss = owner.getFireLoss()
+ needs_health_update = TRUE
+ last_fireloss = new_fireloss
+
+ var/new_toxloss = owner.getToxLoss()
+ if(new_toxloss < last_toxloss)
+ var/heal_amount = (new_toxloss - last_toxloss) * 10
+ owner.adjustToxLoss(heal_amount, updating_health = FALSE)
+ new_toxloss = owner.getToxLoss()
+ needs_health_update = TRUE
+ last_toxloss = new_toxloss
+
+ var/new_oxyloss = owner.getOxyLoss()
+ if(new_oxyloss < last_oxyloss)
+ var/heal_amount = (new_oxyloss - last_oxyloss) * 10
+ owner.adjustOxyLoss(heal_amount, updating_health = FALSE)
+ new_oxyloss = owner.getOxyLoss()
+ needs_health_update = TRUE
+ last_oxyloss = new_oxyloss
+
+ var/new_cloneloss = owner.getCloneLoss()
+ if(new_cloneloss < last_cloneloss)
+ var/heal_amount = (new_cloneloss - last_cloneloss) * 10
+ owner.adjustCloneLoss(heal_amount, updating_health = FALSE)
+ new_cloneloss = owner.getCloneLoss()
+ needs_health_update = TRUE
+ last_cloneloss = new_cloneloss
+
+ var/new_staminaloss = owner.getStaminaLoss()
+ if(new_staminaloss < last_staminaloss)
+ var/heal_amount = (new_staminaloss - last_staminaloss) * 10
+ owner.adjustStaminaLoss(heal_amount, updating_health = FALSE)
+ new_staminaloss = owner.getStaminaLoss()
+ needs_health_update = TRUE
+ last_staminaloss = new_staminaloss
+
+ if(needs_health_update)
+ owner.updatehealth()
+ owner.playsound_local(get_turf(owner), 'sound/effects/singlebeat.ogg', 40, 1)
+ last_health = owner.health
+
+/datum/status_effect/blooddrunk/on_remove()
+ tick()
+ owner.maxHealth *= 0.1
+ owner.bruteloss *= 0.1
+ owner.fireloss *= 0.1
+ if(ishuman(owner))
+ var/mob/living/carbon/human/H = owner
+ for(var/X in H.bodyparts)
+ var/obj/item/organ/external/BP = X
+ BP.brute_dam *= 0.1
+ BP.burn_dam *= 0.1
+ BP.max_damage /= 10
+ BP.min_broken_damage /= 10
+ owner.toxloss *= 0.1
+ owner.oxyloss *= 0.1
+ owner.cloneloss *= 0.1
+ owner.staminaloss *= 0.1
+ owner.updatehealth()
+ add_attack_logs(owner, owner, "lost blood-drunk stun immunity")
+ owner.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE | IGNORESLOWDOWN
+
/datum/status_effect/exercised
id = "Exercised"
duration = 1200
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index 6e809b32606..3ce68f85250 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -9,6 +9,39 @@
if(owner.reagents)
owner.reagents.del_reagent("holywater") //can't be deconverted
+/datum/status_effect/crusher_mark
+ id = "crusher_mark"
+ duration = 300 //if you leave for 30 seconds you lose the mark, deal with it
+ status_type = STATUS_EFFECT_REPLACE
+ alert_type = null
+ var/mutable_appearance/marked_underlay
+ var/obj/item/twohanded/kinetic_crusher/hammer_synced
+
+/datum/status_effect/crusher_mark/on_creation(mob/living/new_owner, obj/item/twohanded/kinetic_crusher/new_hammer_synced)
+ . = ..()
+ if(.)
+ hammer_synced = new_hammer_synced
+
+/datum/status_effect/crusher_mark/on_apply()
+ if(owner.mob_size >= MOB_SIZE_LARGE)
+ marked_underlay = mutable_appearance('icons/effects/effects.dmi', "shield2")
+ marked_underlay.pixel_x = -owner.pixel_x
+ marked_underlay.pixel_y = -owner.pixel_y
+ owner.underlays += marked_underlay
+ return TRUE
+ return FALSE
+
+/datum/status_effect/crusher_mark/Destroy()
+ hammer_synced = null
+ if(owner)
+ owner.underlays -= marked_underlay
+ QDEL_NULL(marked_underlay)
+ return ..()
+
+/datum/status_effect/crusher_mark/be_replaced()
+ owner.underlays -= marked_underlay //if this is being called, we should have an owner at this point.
+ ..()
+
/datum/status_effect/saw_bleed
id = "saw_bleed"
duration = -1 //removed under specific conditions
diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm
index eaa14c4d0b0..8f5023e4a74 100644
--- a/code/datums/status_effects/neutral.dm
+++ b/code/datums/status_effects/neutral.dm
@@ -1,5 +1,43 @@
//entirely neutral or internal status effects go here
+/datum/status_effect/crusher_damage //tracks the damage dealt to this mob by kinetic crushers
+ id = "crusher_damage"
+ duration = -1
+ status_type = STATUS_EFFECT_UNIQUE
+ alert_type = null
+ var/total_damage = 0
+
+/datum/status_effect/syphon_mark
+ id = "syphon_mark"
+ duration = 50
+ status_type = STATUS_EFFECT_MULTIPLE
+ alert_type = null
+ on_remove_on_mob_delete = TRUE
+ var/obj/item/borg/upgrade/modkit/bounty/reward_target
+
+/datum/status_effect/syphon_mark/on_creation(mob/living/new_owner, obj/item/borg/upgrade/modkit/bounty/new_reward_target)
+ . = ..()
+ if(.)
+ reward_target = new_reward_target
+
+/datum/status_effect/syphon_mark/on_apply()
+ if(owner.stat == DEAD)
+ return FALSE
+ return ..()
+
+/datum/status_effect/syphon_mark/proc/get_kill()
+ if(!QDELETED(reward_target))
+ reward_target.get_kill(owner)
+
+/datum/status_effect/syphon_mark/tick()
+ if(owner.stat == DEAD)
+ get_kill()
+ qdel(src)
+
+/datum/status_effect/syphon_mark/on_remove()
+ get_kill()
+ . = ..()
+
/datum/status_effect/high_five
id = "high_five"
duration = 40
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index df9e3f8f0ef..f0ba75d5e10 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -207,6 +207,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 10
job = list("Mime")
+/datum/uplink_item/jobspecific/pressure_mod
+ name = "Kinetic Accelerator Pressure Mod"
+ desc = "A modification kit which allows Kinetic Accelerators to do greatly increased damage while indoors. Occupies 35% mod capacity."
+ reference = "KPM"
+ item = /obj/item/borg/upgrade/modkit/indoors
+ cost = 5 //you need two for full damage, so total of 10 for maximum damage
+ job = list("Shaft Miner")
+
//Chef
/datum/uplink_item/jobspecific/specialsauce
name = "Chef Excellence's Special Sauce"
@@ -1107,10 +1115,10 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 2
/datum/uplink_item/stealthy_tools/thermal
- name = "Thermal Imaging Glasses"
- desc = "These glasses are thermals disguised as engineers' optical meson scanners. They allow you to see organisms through walls by capturing the upper portion of the infra-red light spectrum, emitted as heat and light by objects. Hotter objects, such as warm bodies, cybernetic organisms and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks."
+ name = "Thermal Chameleon Glasses"
+ desc = "These glasses are thermals with Syndicate chameleon technology built into them. They allow you to see organisms through walls by capturing the upper portion of the infra-red light spectrum, emitted as heat and light by objects. Hotter objects, such as warm bodies, cybernetic organisms and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks."
reference = "THIG"
- item = /obj/item/clothing/glasses/thermal/syndi
+ item = /obj/item/clothing/glasses/chameleon/thermal
cost = 6
/datum/uplink_item/stealthy_tools/traitor_belt
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index d5b4faef17c..d6a531950c5 100644
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -100,9 +100,11 @@ var/list/ghostteleportlocs = list()
requires_power = FALSE
valid_territory = FALSE
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
+ parallax_movedir = NORTH
/area/shuttle/arrival
name = "\improper Arrival Shuttle"
+ parallax_movedir = EAST
/area/shuttle/arrival/pre_game
icon_state = "shuttle2"
@@ -136,12 +138,14 @@ var/list/ghostteleportlocs = list()
music = "music/escape.ogg"
icon_state = "shuttle"
nad_allowed = TRUE
+ parallax_movedir = EAST
/area/shuttle/pod_4
name = "\improper Escape Pod Four"
music = "music/escape.ogg"
icon_state = "shuttle"
nad_allowed = TRUE
+ parallax_movedir = EAST
/area/shuttle/escape_pod1
name = "\improper Escape Pod One"
@@ -207,6 +211,7 @@ var/list/ghostteleportlocs = list()
/area/shuttle/transport
icon_state = "shuttle"
name = "\improper Transport Shuttle"
+ parallax_movedir = EAST
/area/shuttle/transport1
icon_state = "shuttle"
@@ -247,6 +252,7 @@ var/list/ghostteleportlocs = list()
/area/shuttle/specops
name = "\improper Special Ops Shuttle"
icon_state = "shuttlered"
+ parallax_movedir = EAST
/area/shuttle/specops/centcom
name = "\improper Special Ops Shuttle"
@@ -260,6 +266,7 @@ var/list/ghostteleportlocs = list()
name = "\improper Syndicate Elite Shuttle"
icon_state = "shuttlered"
nad_allowed = TRUE
+ parallax_movedir = SOUTH
/area/shuttle/syndicate_elite/mothership
name = "\improper Syndicate Elite Shuttle"
@@ -273,6 +280,7 @@ var/list/ghostteleportlocs = list()
name = "\improper Syndicate SIT Shuttle"
icon_state = "shuttlered"
nad_allowed = TRUE
+ parallax_movedir = SOUTH
/area/shuttle/assault_pod
name = "Steel Rain"
@@ -281,6 +289,7 @@ var/list/ghostteleportlocs = list()
/area/shuttle/administration
name = "\improper Nanotrasen Vessel"
icon_state = "shuttlered"
+ parallax_movedir = EAST
/area/shuttle/administration/centcom
name = "\improper Nanotrasen Vessel Centcom"
@@ -380,6 +389,7 @@ var/list/ghostteleportlocs = list()
/area/shuttle/salvage/abandoned_ship
name = "\improper Abandoned Ship"
icon_state = "yellow"
+ parallax_movedir = WEST
/area/shuttle/salvage/clown_asteroid
name = "\improper Clown Asteroid"
@@ -412,6 +422,7 @@ var/list/ghostteleportlocs = list()
/area/shuttle/trade/sol
name = "Sol Freighter"
+ parallax_movedir = EAST
/area/shuttle/freegolem
name = "Free Golem Ship"
@@ -1859,6 +1870,7 @@ var/list/ghostteleportlocs = list()
/area/shuttle/constructionsite
name = "\improper Construction Site Shuttle"
icon_state = "yellow"
+ parallax_movedir = EAST
/area/shuttle/constructionsite/station
name = "\improper Construction Site Shuttle"
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 2e7448ec5c8..26dc6ddbf56 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -67,6 +67,9 @@
var/can_get_auto_cryod = TRUE
var/hide_attacklogs = FALSE // For areas such as thunderdome, lavaland syndiebase, etc which generate a lot of spammy attacklogs. Reduces log priority.
+ var/parallax_movedir = 0
+ var/moving = FALSE
+
/area/Initialize(mapload)
GLOB.all_areas += src
icon_state = ""
diff --git a/code/game/area/areas/ruins/lavaland.dm b/code/game/area/areas/ruins/lavaland.dm
index 84df75d01b1..d72c6cc0406 100644
--- a/code/game/area/areas/ruins/lavaland.dm
+++ b/code/game/area/areas/ruins/lavaland.dm
@@ -16,7 +16,7 @@
icon_state = "dk_yellow"
/area/ruin/powered/golem_ship
- name = "Free Golem Ship"
+ name = "Free Golem Landing"
icon_state = "dk_yellow"
/area/ruin/powered/greed
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 1a23dc71070..0a22c19770b 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -26,7 +26,7 @@
var/inertia_move_delay = 5
var/moving_diagonally = 0 //0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move
-
+ var/list/client_mobs_in_contents
var/area/areaMaster
/atom/movable/New()
@@ -215,6 +215,8 @@
if(!inertia_moving)
inertia_next_move = world.time + inertia_move_delay
newtonian_move(Dir)
+ if(length(client_mobs_in_contents))
+ update_parallax_contents()
return TRUE
// Previously known as HasEntered()
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
index 0f8e52a90b2..df61106c4ab 100644
--- a/code/game/gamemodes/blob/blob.dm
+++ b/code/game/gamemodes/blob/blob.dm
@@ -14,7 +14,6 @@ var/list/blob_nodes = list()
required_enemies = 1
recommended_enemies = 1
restricted_jobs = list("Cyborg", "AI")
- free_golems_disabled = TRUE
var/declared = 0
var/burst = 0
diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm
index e7751ffcd8a..d6d4a91cf19 100644
--- a/code/game/gamemodes/blob/powers.dm
+++ b/code/game/gamemodes/blob/powers.dm
@@ -25,7 +25,8 @@
if(blob_nodes.len)
var/list/nodes = list()
for(var/i = 1; i <= blob_nodes.len; i++)
- nodes["Blob Node #[i]"] = blob_nodes[i]
+ var/obj/structure/blob/node/B = blob_nodes[i]
+ nodes["Blob Node #[i] ([get_location_name(B)])"] = B
var/node_name = input(src, "Choose a node to jump to.", "Node Jump") in nodes
var/obj/structure/blob/node/chosen_node = nodes[node_name]
if(chosen_node)
diff --git a/code/game/gamemodes/changeling/powers/headcrab.dm b/code/game/gamemodes/changeling/powers/headslug.dm
similarity index 88%
rename from code/game/gamemodes/changeling/powers/headcrab.dm
rename to code/game/gamemodes/changeling/powers/headslug.dm
index b39a2bba0d5..f29ec02db54 100644
--- a/code/game/gamemodes/changeling/powers/headcrab.dm
+++ b/code/game/gamemodes/changeling/powers/headslug.dm
@@ -1,4 +1,4 @@
-/datum/action/changeling/headcrab
+/datum/action/changeling/headslug
name = "Last Resort"
desc = "We sacrifice our current body in a moment of need, placing us in control of a vessel that can plant our likeness in a new host. Costs 20 chemicals."
helptext = "We will be placed in control of a small, fragile creature. We may attack a corpse like this to plant an egg which will slowly mature into a new form for us."
@@ -7,12 +7,12 @@
dna_cost = 1
req_human = 1
-/datum/action/changeling/headcrab/try_to_sting(mob/user, mob/target)
+/datum/action/changeling/headslug/try_to_sting(mob/user, mob/target)
if(alert("Are you sure you wish to do this? This action cannot be undone.",,"Yes","No")=="No")
return
..()
-/datum/action/changeling/headcrab/sting_action(mob/user)
+/datum/action/changeling/headslug/sting_action(mob/user)
var/datum/mind/M = user.mind
var/list/organs = user.get_organs_zone("head", 1)
@@ -33,7 +33,7 @@
S.Weaken(3)
var/new_location = user.drop_location()
spawn(5) // So it's not killed in explosion
- var/mob/living/simple_animal/hostile/headcrab/crab = new(new_location)
+ var/mob/living/simple_animal/hostile/headslug/crab = new(new_location)
for(var/obj/item/organ/internal/I in organs)
I.loc = crab
crab.origin = M
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index 90ab53dfde2..9442c319dcb 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -29,7 +29,7 @@ var/global/list/all_cults = list()
return 1
/proc/is_sacrifice_target(datum/mind/mind)
- if(istype(SSticker.mode.name, "cult"))
+ if(SSticker.mode.name == "cult")
var/datum/game_mode/cult/cult_mode = SSticker.mode
if(mind == cult_mode.sacrifice_target)
return 1
@@ -43,7 +43,6 @@ var/global/list/all_cults = list()
required_players = 30
required_enemies = 3
recommended_enemies = 4
- free_golems_disabled = TRUE
var/datum/mind/sacrifice_target = null
var/finished = 0
diff --git a/code/game/gamemodes/cult/cult_objectives.dm b/code/game/gamemodes/cult/cult_objectives.dm
index da4e190cb7f..c31ebaf9b84 100644
--- a/code/game/gamemodes/cult/cult_objectives.dm
+++ b/code/game/gamemodes/cult/cult_objectives.dm
@@ -163,6 +163,16 @@
possible_sac_targets += player.mind
return possible_sac_targets
+// Handles the updating of sacrifice objectives after the sacrifice target goes to cryo and ghosts
+/datum/game_mode/cult/proc/update_sac_objective(previous_target, previous_role)
+ for(var/datum/mind/cult_mind in cult)
+ if(cult_mind)
+ var/updated_memory = cult_mind.memory
+ updated_memory = replacetext("[cult_mind.memory]", "[previous_target]", "[sacrifice_target]")
+ updated_memory = replacetext("[updated_memory]", "[previous_role]", "[sacrifice_target.assigned_role]")
+ cult_mind.memory = updated_memory
+
+
/datum/game_mode/cult/proc/pick_objective()
var/list/possible_objectives = list()
diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm
index 3658a57fb98..179425d320d 100644
--- a/code/game/gamemodes/cult/talisman.dm
+++ b/code/game/gamemodes/cult/talisman.dm
@@ -1,4 +1,5 @@
/obj/item/paper/talisman
+ icon = 'icons/obj/paper.dmi'
icon_state = "paper_talisman"
var/cultist_name = "talisman"
var/cultist_desc = "A basic talisman. It serves no purpose."
@@ -7,6 +8,9 @@
var/uses = 1
var/health_cost = 0 //The amount of health taken from the user when invoking the talisman
+/obj/item/paper/talisman/update_icon()//overriding this so the update_icon doesn't turn them into normal looking paper
+ SEND_SIGNAL(src, COMSIG_OBJ_UPDATE_ICON)
+
/obj/item/paper/talisman/examine(mob/user)
if(iscultist(user) || user.stat == DEAD)
to_chat(user, "Name: [cultist_name]")
@@ -49,6 +53,7 @@
//Supply Talisman: Has a few unique effects. Granted only to starter cultists.
/obj/item/paper/talisman/supply
cultist_name = "Supply Talisman"
+ icon_state = "supply"
cultist_desc = "A multi-use talisman that can create various objects. Intended to increase the cult's strength early on."
invocation = null
uses = 3
@@ -117,6 +122,7 @@
//Rite of Translocation: Same as rune
/obj/item/paper/talisman/teleport
cultist_name = "Talisman of Teleportation"
+ icon_state = "teleport"
cultist_desc = "A single-use talisman that will teleport a user to a random rune of the same keyword."
invocation = "Sas'so c'arta forbici!"
health_cost = 5
@@ -159,6 +165,7 @@
/obj/item/paper/talisman/summon_tome
cultist_name = "Talisman of Tome Summoning"
+ icon_state = "tome"
cultist_desc = "A one-use talisman that will call an untranslated tome from the archives of a cult."
invocation = "N'ath reth sh'yro eth d'raggathnor!"
health_cost = 1
@@ -173,6 +180,7 @@
/obj/item/paper/talisman/true_sight
cultist_name = "Talisman of Veiling"
+ icon_state = "veil"
cultist_desc = "A multi-use talisman that hides nearby runes. On its second use, will reveal nearby runes."
invocation = "Kla'atu barada nikt'o!"
health_cost = 1
@@ -197,6 +205,7 @@
//Rite of False Truths: Same as rune
/obj/item/paper/talisman/make_runes_fake
cultist_name = "Talisman of Disguising"
+ icon_state = "disguising"
cultist_desc = "A talisman that will make nearby runes appear fake."
invocation = "By'o nar'nar!"
@@ -212,6 +221,7 @@
//Rite of Disruption: Weaker than rune
/obj/item/paper/talisman/emp
cultist_name = "Talisman of Electromagnetic Pulse"
+ icon_state = "emp"
cultist_desc = "A talisman that will cause a moderately-sized electromagnetic pulse."
invocation = "Ta'gh fara'qha fel d'amar det!"
health_cost = 5
@@ -226,6 +236,7 @@
//Rite of Disorientation: Stuns and inhibit speech on a single target for quite some time
/obj/item/paper/talisman/stun
cultist_name = "Talisman of Stunning"
+ icon_state = "stunning"
cultist_desc = "A talisman that will stun and inhibit speech on a single target. To use, attack target directly."
invocation = "Dream sign:Evil sealing talisman!"
health_cost = 10
@@ -271,6 +282,7 @@
//Rite of Arming: Equips cultist armor on the user, where available
/obj/item/paper/talisman/armor
cultist_name = "Talisman of Arming"
+ icon_state = "arming"
cultist_desc = "A talisman that will equip the invoker with cultist equipment if there is a slot to equip it to."
invocation = "N'ath reth sh'yro eth draggathnor!"
@@ -298,6 +310,7 @@
//Talisman of Horrors: Breaks the mind of the victim with nightmarish hallucinations
/obj/item/paper/talisman/horror
cultist_name = "Talisman of Horrors"
+ icon_state = "horror"
cultist_desc = "A talisman that will break the mind of the victim with nightmarish hallucinations."
invocation = "Lo'Nab Na'Dm!"
@@ -313,6 +326,7 @@
//Talisman of Fabrication: Creates a construct shell out of 25 metal sheets.
/obj/item/paper/talisman/construction
cultist_name = "Talisman of Construction"
+ icon_state = "construction"
cultist_desc = "Use this talisman on at least twenty-five metal sheets to create an empty construct shell or on plasteel to make runed metal"
invocation = "Ethra p'ni dedol!"
uses = 25
@@ -357,6 +371,7 @@
//Talisman of Shackling: Applies special cuffs directly from the talisman
/obj/item/paper/talisman/shackle
cultist_name = "Talisman of Shackling"
+ icon_state = "shackling"
cultist_desc = "Use this talisman on a victim to handcuff them with dark bindings."
invocation = "In'totum Lig'abis!"
uses = 4
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index e344c2b2029..aa366415f31 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -27,7 +27,6 @@
var/recommended_enemies = 0
var/newscaster_announcements = null
var/ert_disabled = 0
- var/free_golems_disabled = FALSE
var/uplink_welcome = "Syndicate Uplink Console:"
var/uplink_uses = 20
@@ -81,7 +80,6 @@
// feedback_set_details("revision","[revdata.revision]")
feedback_set_details("server_ip","[world.internet_address]:[world.port]")
generate_station_goals()
- check_free_golems()
start_state = new /datum/station_state()
start_state.count()
return 1
@@ -513,12 +511,6 @@ proc/display_roundstart_logout_report()
var/datum/station_goal/G = V
G.print_result()
-/datum/game_mode/proc/check_free_golems() //check config and gamemode for free golems setting and run the prob to check if the round will have free golems spawned or not
- if((config.unrestricted_free_golems || !free_golems_disabled) && prob(config.prob_free_golems))
- for(var/obj/effect/landmark/free_golem_spawn/L in GLOB.landmarks_list)
- if(isturf(L.loc))
- new /obj/effect/mob_spawn/human/golem/adamantine(L.loc)
-
/datum/game_mode/proc/update_eventmisc_icons_added(datum/mind/mob_mind)
var/datum/atom_hud/antag/antaghud = huds[ANTAG_HUD_EVENTMISC]
antaghud.join_hud(mob_mind.current)
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index fc6ebcc1549..2d7c9cff015 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -12,7 +12,6 @@ proc/issyndicate(mob/living/M as mob)
required_players = 30 // 30 players - 5 players to be the nuke ops = 25 players remaining
required_enemies = 5
recommended_enemies = 5
- free_golems_disabled = TRUE
var/const/agents_possible = 5 //If we ever need more syndicate agents.
diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm
index 5fc01686200..d696543cbdf 100644
--- a/code/game/gamemodes/vampire/vampire.dm
+++ b/code/game/gamemodes/vampire/vampire.dm
@@ -297,23 +297,23 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
to_chat(owner, "They've got no blood left to give.")
break
if(H.stat < DEAD)
- if(!issmall(H) || H.ckey)
+ if(H.ckey || H.player_ghosted) //Requires ckey regardless if monkey or humanoid, or the body has been ghosted before it died
blood = min(20, H.blood_volume) // if they have less than 20 blood, give them the remnant else they get 20 blood
bloodtotal += blood / 2 //divide by 2 to counted the double suction since removing cloneloss -Melandor0
bloodusable += blood / 2
else
- if(!issmall(H) || H.ckey)
+ if(H.ckey || H.player_ghosted)
blood = min(5, H.blood_volume) // The dead only give 5 blood
bloodtotal += blood
if(old_bloodtotal != bloodtotal)
- if(!issmall(H) || H.ckey) // not small OR has a ckey, monkeys with ckeys can be sucked, humanized monkeys can be sucked monkeys without ckeys cannot be sucked
+ if(H.ckey || H.player_ghosted) // Requires ckey regardless if monkey or human, and has not ghosted, otherwise no power
to_chat(owner, "You have accumulated [bloodtotal] [bloodtotal > 1 ? "units" : "unit"] of blood[bloodusable != old_bloodusable ? ", and have [bloodusable] left to use" : ""].")
check_vampire_upgrade()
H.blood_volume = max(H.blood_volume - 25, 0)
if(ishuman(owner))
var/mob/living/carbon/human/V = owner
- if(issmall(H) && !H.ckey)
- to_chat(V, "Feeding on [H] reduces your hunger, but you get no usable blood from it.")
+ if(!H.ckey && !H.player_ghosted)//Only runs if there is no ckey and the body has not being ghosted while alive
+ to_chat(V, "Feeding on [H] reduces your thirst, but you get no usable blood from them.")
V.nutrition = min(NUTRITION_LEVEL_WELL_FED, V.nutrition + 5)
else
V.nutrition = min(NUTRITION_LEVEL_WELL_FED, V.nutrition + (blood / 2))
@@ -402,7 +402,14 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
if(T.density)
return
- vamp_burn(1)
+ if(bloodusable >= 10) //burn through your blood to tank the light for a little while
+ to_chat(owner, "The starlight saps your strength!")
+ bloodusable -= 10
+ vamp_burn(10)
+ else //You're in trouble, get out of the sun NOW
+ to_chat(owner, "Your body is turning to ash, get out of the light now!")
+ owner.adjustCloneLoss(10) //I'm melting!
+ vamp_burn(85)
/datum/vampire/proc/handle_vampire()
if(owner.hud_used)
@@ -419,7 +426,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
if(istype(owner.loc, /turf/space))
check_sun()
if(istype(owner.loc.loc, /area/chapel) && !get_ability(/datum/vampire_passive/full))
- vamp_burn(0)
+ vamp_burn(7)
nullified = max(0, nullified - 1)
/datum/vampire/proc/handle_vampire_cloak()
@@ -442,8 +449,7 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha
else
owner.alpha = round((255 * 0.80))
-/datum/vampire/proc/vamp_burn(severe_burn)
- var/burn_chance = severe_burn ? 35 : 8
+/datum/vampire/proc/vamp_burn(burn_chance)
if(prob(burn_chance) && owner.health >= 50)
switch(owner.health)
if(75 to 100)
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index 6f96d4c22e2..a97db45ca31 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -863,7 +863,7 @@
if(istype(user, /mob/living/carbon/human))
to_chat(user, "HOR-SIE HAS RISEN")
var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead
- magichead.flags |= NODROP //curses!
+ magichead.flags |= NODROP | DROPDEL //curses!
magichead.flags_inv = null //so you can still see their face
magichead.voicechange = 1 //NEEEEIIGHH
if(!user.unEquip(user.wear_mask))
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index e1f9ac2725d..131afd84fff 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -7,8 +7,8 @@
required_players = 20
required_enemies = 1
recommended_enemies = 1
- free_golems_disabled = TRUE
- var/use_huds = 0
+ var/use_huds = 1
+
var/finished = 0
var/but_wait_theres_more = 0
@@ -158,22 +158,30 @@
wizard_mob.gene_stability += DEFAULT_GENE_STABILITY //magic
return 1
+// Checks if the game should end due to all wizards and apprentices being dead, or MMI'd/Borged
/datum/game_mode/wizard/check_finished()
var/wizards_alive = 0
var/traitors_alive = 0
+
+ // Wizards
for(var/datum/mind/wizard in wizards)
if(!istype(wizard.current,/mob/living/carbon))
continue
if(wizard.current.stat==DEAD)
continue
+ if(istype(wizard.current, /obj/item/mmi)) // wizard is in an MMI, don't count them as alive
+ continue
wizards_alive++
+ // Apprentices - classified as "traitors"
if(!wizards_alive)
for(var/datum/mind/traitor in traitors)
if(!istype(traitor.current,/mob/living/carbon))
continue
if(traitor.current.stat==DEAD)
continue
+ if(istype(traitor.current, /obj/item/mmi)) // apprentice is in an MMI, don't count them as alive
+ continue
traitors_alive++
if(wizards_alive || traitors_alive || but_wait_theres_more)
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index 394fe3d0908..a31f694f7fc 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -601,28 +601,29 @@ proc/get_all_job_icons() //For all existing HUD icons
return GLOB.joblist + list("Prisoner")
/obj/proc/GetJobName() //Used in secHUD icon generation
- var/obj/item/card/id/I
+ var/assignmentName = "Unknown"
+ var/rankName = "Unknown"
if(istype(src, /obj/item/pda))
var/obj/item/pda/P = src
- I = P.id
+ assignmentName = P.ownjob
+ rankName = P.ownrank
else if(istype(src, /obj/item/card/id))
- I = src
+ var/obj/item/card/id/I = src
+ assignmentName = I.assignment
+ rankName = I.rank
+
- if(I)
- var/job_icons = get_all_job_icons()
- var/centcom = get_all_centcom_jobs()
+ var/job_icons = get_all_job_icons()
+ var/centcom = get_all_centcom_jobs()
- if(I.assignment in centcom) //Return with the NT logo if it is a Centcom job
- return "Centcom"
- if(I.rank in centcom)
- return "Centcom"
-
- if(I.assignment in job_icons) //Check if the job has a hud icon
- return I.assignment
- if(I.rank in job_icons)
- return I.rank
-
- else
- return
+ if(assignmentName in centcom) //Return with the NT logo if it is a Centcom job
+ return "Centcom"
+ if(rankName in centcom)
+ return "Centcom"
+ if(assignmentName in job_icons) //Check if the job has a hud icon
+ return assignmentName
+ if(rankName in job_icons)
+ return rankName
+
return "Unknown" //Return unknown if none of the above apply
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index eebe4f2e9e4..9def19d2970 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -146,7 +146,7 @@
var/backpack = /obj/item/storage/backpack
var/satchel = /obj/item/storage/backpack/satchel_norm
var/dufflebag = /obj/item/storage/backpack/duffel
- var/box = /obj/item/storage/box/survival
+ box = /obj/item/storage/box/survival
var/tmp/list/gear_leftovers = list()
@@ -168,12 +168,8 @@
else
back = backpack //Department backpack
- if(box)
- var/spawnbox = box
- if(H.dna.species.speciesbox)
- spawnbox = H.dna.species.speciesbox
- backpack_contents.Insert(1, spawnbox) // Box always takes a first slot in backpack
- backpack_contents[spawnbox] = 1
+ if(box && H.dna.species.speciesbox)
+ box = H.dna.species.speciesbox
if(allow_loadout && H.client && (H.client.prefs.gear && H.client.prefs.gear.len))
for(var/gear in H.client.prefs.gear)
diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm
index 22c2d47e3b9..aac1c291355 100644
--- a/code/game/jobs/job/support.dm
+++ b/code/game/jobs/job/support.dm
@@ -175,23 +175,24 @@
name = "Shaft Miner"
jobtype = /datum/job/mining
- uniform = /obj/item/clothing/under/rank/miner/lavaland
- gloves = /obj/item/clothing/gloves/color/black
- shoes = /obj/item/clothing/shoes/workboots/mining
l_ear = /obj/item/radio/headset/headset_cargo/mining
- id = /obj/item/card/id/supply
+ shoes = /obj/item/clothing/shoes/workboots/mining
+ gloves = /obj/item/clothing/gloves/color/black
+ uniform = /obj/item/clothing/under/rank/miner/lavaland
l_pocket = /obj/item/reagent_containers/hypospray/autoinjector/survival
- r_pocket = /obj/item/flashlight/seclite
+ r_pocket = /obj/item/storage/bag/ore
+ id = /obj/item/card/id/supply
pda = /obj/item/pda/shaftminer
backpack_contents = list(
- /obj/item/storage/bag/ore=1,\
+ /obj/item/flashlight/seclite=1,\
/obj/item/kitchen/knife/combat/survival=1,\
/obj/item/mining_voucher=1,\
/obj/item/stack/marker_beacon/ten=1
)
-
+
backpack = /obj/item/storage/backpack/explorer
- satchel = /obj/item/storage/backpack/explorer
+ satchel = /obj/item/storage/backpack/satchel/explorer
+ box = /obj/item/storage/box/survival_mining
/datum/outfit/job/mining/equipped
name = "Shaft Miner"
@@ -210,9 +211,6 @@
/obj/item/stack/marker_beacon/ten=1
)
- backpack = /obj/item/storage/backpack/explorer
- satchel = /obj/item/storage/backpack/explorer
-
/datum/outfit/job/miner/equipped/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
..()
if(visualsOnly)
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index d85a89606ea..0d4455399b0 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -8,6 +8,7 @@
idle_power_usage = 5
active_power_usage = 60
power_channel = EQUIP
+ pass_flags = PASSTABLE
var/obj/item/stock_parts/cell/charging = null
var/chargelevel = -1
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index 604ac3f02f3..d3edc588e2d 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -460,6 +460,12 @@
desc = "Here's your chance, do your dance at the Space Jam."
w_class = WEIGHT_CLASS_BULKY //Stops people from hiding it in their bags/pockets
+/obj/item/beach_ball/holoball/baseball
+ icon_state = "baseball"
+ name = "baseball"
+ item_state = "baseball"
+ desc = "Take me out to the ball game."
+
/obj/structure/holohoop
name = "basketball hoop"
desc = "Boom, Shakalaka!"
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index d404db8ae0a..a34a49ca051 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -334,9 +334,6 @@
/obj/item/circuitboard/white_ship
name = "circuit Board (White Ship)"
build_path = /obj/machinery/computer/shuttle/white_ship
-/obj/item/circuitboard/golem_ship
- name = "circuit Board (Golem Ship)"
- build_path = /obj/machinery/computer/shuttle/golem_ship
/obj/item/circuitboard/shuttle/syndicate
name = "circuit board (Syndicate Shuttle)"
build_path = /obj/machinery/computer/shuttle/syndicate
@@ -346,7 +343,9 @@
/obj/item/circuitboard/shuttle/syndicate/drop_pod
name = "circuit board (Syndicate Drop Pod)"
build_path = /obj/machinery/computer/shuttle/syndicate/drop_pod
-
+/obj/item/circuitboard/shuttle/golem_ship
+ name = "circuit Board (Golem Ship)"
+ build_path = /obj/machinery/computer/shuttle/golem_ship
/obj/item/circuitboard/HolodeckControl
name = "Circuit board (Holodeck Control)"
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index 9e91e254950..8cb3301e40c 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -330,6 +330,14 @@ to destroy them and players will be able to make replacements.
name = "circuit board (Freezer)"
to_chat(user, "You set the board to cooling.")
+/obj/item/circuitboard/recharger
+ name = "circuit board (Recharger)"
+ build_path = /obj/machinery/recharger
+ board_type = "machine"
+ origin_tech = "powerstorage=3;materials=2"
+ frame_desc = "Requires 1 Capacitor"
+ req_components = list(/obj/item/stock_parts/capacitor = 1)
+
/obj/item/circuitboard/snow_machine
name = "circuit board (snow machine)"
build_path = /obj/machinery/snow_machine
@@ -591,6 +599,16 @@ to destroy them and players will be able to make replacements.
/obj/item/stock_parts/micro_laser = 1,
/obj/item/stock_parts/console_screen = 1)
+/obj/item/circuitboard/reagentgrinder
+ name = "circuit board (All-In-One Grinder)"
+ build_path = /obj/machinery/reagentgrinder/empty
+ board_type = "machine"
+ origin_tech = "materials=2;engineering=2;biotech=2"
+ frame_desc = "Requires 2 Manipulators and 1 Matter Bin."
+ req_components = list(
+ /obj/item/stock_parts/manipulator = 2,
+ /obj/item/stock_parts/matter_bin = 1)
+
//Almost the same recipe as destructive analyzer to give people choices.
/obj/item/circuitboard/experimentor
name = "circuit board (E.X.P.E.R.I-MENTOR)"
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 17965c12f4c..f9d708a6200 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -371,6 +371,8 @@
for(var/datum/mind/H in SSticker.mode.cult)
if(H.current)
to_chat(H.current, "[SSticker.cultdat.entity_name] murmurs, [occupant] is beyond your reach. Sacrifice [cult_mode.sacrifice_target.current] instead...")
+ H.current << 'sound/ambience/alarm4.ogg'
+ cult_mode.update_sac_objective(occupant.mind, occupant.mind.assigned_role)
else
cult_mode.bypass_phase()
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index cf580edd5ea..b8c0f3d02f4 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -181,12 +181,6 @@ About the new airlock wires panel:
/obj/machinery/door/airlock/bumpopen(mob/living/simple_animal/user)
..(user)
-/obj/machinery/door/airlock/autoclose()
- autoclose_timer = 0
- if(!QDELETED(src) && !density && !operating && !locked && !welded && autoclose)
- close()
- return
-
/obj/machinery/door/airlock/proc/isElectrified()
if(electrified_until != 0)
return 1
@@ -311,6 +305,7 @@ About the new airlock wires panel:
/obj/machinery/door/airlock/update_icon(state=0, override=0)
if(operating && !override)
return
+ check_unres()
icon_state = density ? "closed" : "open"
switch(state)
if(0)
@@ -333,7 +328,6 @@ About the new airlock wires panel:
var/image/sparks_overlay
var/image/note_overlay
var/notetype = note_type()
-
switch(state)
if(AIRLOCK_CLOSED)
frame_overlay = get_airlock_overlay("closed", icon)
@@ -621,6 +615,31 @@ About the new airlock wires panel:
if(user)
attack_ai(user)
+/obj/machinery/door/airlock/proc/check_unres() //unrestricted sides. This overlay indicates which directions the player can access even without an ID
+ if(hasPower() && unres_sides)
+ if(unres_sides & NORTH)
+ var/image/I = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_n") //layer=src.layer+1
+ I.pixel_y = 32
+ set_light(l_range = 1, l_power = 1, l_color = "#00FF00")
+ add_overlay(I)
+ if(unres_sides & SOUTH)
+ var/image/I = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_s") //layer=src.layer+1
+ I.pixel_y = -32
+ set_light(l_range = 1, l_power = 1, l_color = "#00FF00")
+ add_overlay(I)
+ if(unres_sides & EAST)
+ var/image/I = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_e") //layer=src.layer+1
+ I.pixel_x = 32
+ set_light(l_range = 1, l_power = 1, l_color = "#00FF00")
+ add_overlay(I)
+ if(unres_sides & WEST)
+ var/image/I = image(icon='icons/obj/doors/airlocks/station/overlays.dmi', icon_state="unres_w") //layer=src.layer+1
+ I.pixel_x = -32
+ set_light(l_range = 1, l_power = 1, l_color = "#00FF00")
+ add_overlay(I)
+ else
+ set_light(0)
+
/obj/machinery/door/airlock/CanPass(atom/movable/mover, turf/target, height=0)
if(isElectrified() && density && istype(mover, /obj/item))
var/obj/item/I = mover
@@ -1078,6 +1097,10 @@ About the new airlock wires panel:
playsound(loc, doorOpen, 30, 1)
if(closeOther != null && istype(closeOther, /obj/machinery/door/airlock/) && !closeOther.density)
closeOther.close()
+
+ if(autoclose)
+ autoclose_in(normalspeed ? auto_close_time : auto_close_time_dangerous)
+
if(!density)
return TRUE
operating = TRUE
@@ -1092,10 +1115,6 @@ About the new airlock wires panel:
layer = OPEN_DOOR_LAYER
update_icon(AIRLOCK_OPEN, 1)
operating = FALSE
-
- // The `addtimer` system has the advantage of being cancelable
- if(autoclose)
- autoclose_timer = addtimer(CALLBACK(src, .proc/autoclose), normalspeed ? auto_close_time : auto_close_time_dangerous, TIMER_UNIQUE | TIMER_STOPPABLE)
return TRUE
/obj/machinery/door/airlock/close(forced=0, override = 0)
@@ -1112,7 +1131,8 @@ About the new airlock wires panel:
for(var/turf/turf in locs)
for(var/atom/movable/M in turf)
if(M.density && M != src) //something is blocking the door
- addtimer(CALLBACK(src, .proc/autoclose), 60)
+ autoclose_in(60)
+ return
use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people
if(forced)
diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm
index df63da64f2b..01d90795a87 100644
--- a/code/game/machinery/doors/airlock_electronics.dm
+++ b/code/game/machinery/doors/airlock_electronics.dm
@@ -11,6 +11,8 @@
var/list/conf_access = null
var/one_access = 0 //if set to 1, door would receive req_one_access instead of req_access
var/const/max_brain_damage = 60 // Maximum brain damage a mob can have until it can't use the electronics
+ var/unres_sides = 0
+ var/unres_direction = null
/obj/item/airlock_electronics/attack_self(mob/user)
if(!ishuman(user) && !isrobot(user))
@@ -23,14 +25,22 @@
return
var/t1 = text("Access control
\n")
+ t1 += "
"
+ t1 += " Unrestricted Access Settings
"
+ var/list/Directions = list("North","South",,"East",,,,"West")
+ for(var/direction in cardinal)
+ if (unres_direction && unres_direction == direction)
+ t1 += "[Directions[direction]]
"
+ else
+ t1 += "[Directions[direction]]
"
+
+ t1 += "
"
t1 += "Access requirement is set to "
t1 += one_access ? "ONE
" : "ALL
"
t1 += conf_access == null ? "All
" : "All
"
- t1 += "
"
-
var/list/accesses = get_all_accesses()
for(var/acc in accesses)
var/aname = get_access_desc(acc)
@@ -64,6 +74,14 @@
if(href_list["access"])
toggle_access(href_list["access"])
+
+ if(href_list["unres_direction"])
+ unres_direction = text2num(href_list["unres_direction"])
+ if (unres_sides == unres_direction)
+ unres_sides = 0
+ unres_direction = null
+ else
+ unres_sides = unres_direction
attack_self(usr)
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 0dd301d5542..65854bb1412 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -14,21 +14,20 @@
var/visible = 1
var/operating = FALSE
var/autoclose = 0
- var/autoclose_timer
var/safe = TRUE //whether the door detects things and mobs in its way and reopen or crushes them.
var/locked = FALSE //whether the door is bolted or not.
var/glass = FALSE
var/welded = FALSE
var/normalspeed = 1
var/auto_close_time = 150
- var/auto_close_time_dangerous = 5
+ var/auto_close_time_dangerous = 15
var/assemblytype //the type of door frame to drop during deconstruction
var/datum/effect_system/spark_spread/spark_system
var/damage_deflection = 10
var/real_explosion_block //ignore this, just use explosion_block
var/heat_proof = FALSE // For rglass-windowed airlocks and firedoors
var/emergency = FALSE
-
+ var/unres_sides = 0 //Unrestricted sides. A bitflag for which direction (if any) can open the door with no access
//Multi-tile doors
var/width = 1
@@ -55,6 +54,10 @@
..()
update_dir()
+/obj/machinery/door/power_change()
+ ..()
+ update_icon()
+
/obj/machinery/door/proc/update_dir()
if(width > 1)
if(dir in list(EAST, WEST))
@@ -73,9 +76,6 @@
air_update_turf(1)
update_freelook_sight()
GLOB.airlocks -= src
- if(autoclose_timer)
- deltimer(autoclose_timer)
- autoclose_timer = 0
QDEL_NULL(spark_system)
return ..()
@@ -175,10 +175,15 @@
/obj/machinery/door/allowed(mob/M)
if(emergency)
return TRUE
+ if(unrestricted_side(M))
+ return TRUE
if(!requiresID())
return FALSE // Intentional. machinery/door/requiresID() always == 1. airlocks, however, == 0 if ID scan is disabled. Yes, this var is poorly named.
return ..()
+/obj/machinery/door/proc/unrestricted_side(mob/M) //Allows for specific side of airlocks to be unrestrected (IE, can exit maint freely, but need access to enter)
+ return get_dir(src, M) & unres_sides
+
/obj/machinery/door/proc/try_to_weld(obj/item/weldingtool/W, mob/user)
return
@@ -273,11 +278,8 @@
operating = FALSE
air_update_turf(1)
update_freelook_sight()
-
- // The `addtimer` system has the advantage of being cancelable
if(autoclose)
- autoclose_timer = addtimer(CALLBACK(src, .proc/autoclose), normalspeed ? auto_close_time : auto_close_time_dangerous, TIMER_UNIQUE | TIMER_STOPPABLE)
-
+ autoclose_in(normalspeed ? auto_close_time : auto_close_time_dangerous)
return TRUE
/obj/machinery/door/proc/close()
@@ -286,18 +288,15 @@
if(operating || welded)
return
if(safe)
- for(var/atom/movable/M in get_turf(src))
- if(M.density && M != src) //something is blocking the door
- if(autoclose)
- addtimer(CALLBACK(src, .proc/autoclose), 60)
- return
+ for(var/turf/turf in locs)
+ for(var/atom/movable/M in turf)
+ if(M.density && M != src) //something is blocking the door
+ if(autoclose)
+ autoclose_in(60)
+ return
operating = TRUE
- if(autoclose_timer)
- deltimer(autoclose_timer)
- autoclose_timer = 0
-
do_animate("closing")
layer = closingLayer
sleep(5)
@@ -345,10 +344,12 @@
return !(stat & NOPOWER)
/obj/machinery/door/proc/autoclose()
- autoclose_timer = 0
if(!QDELETED(src) && !density && !operating && !locked && !welded && autoclose)
close()
+/obj/machinery/door/proc/autoclose_in(wait)
+ addtimer(CALLBACK(src, .proc/autoclose), wait, TIMER_UNIQUE | TIMER_NO_HASH_WAIT | TIMER_OVERRIDE)
+
/obj/machinery/door/proc/update_freelook_sight()
if(!glass && cameranet)
cameranet.updateVisibility(src, 0)
diff --git a/code/game/machinery/embedded_controller/airlock_controllers.dm b/code/game/machinery/embedded_controller/airlock_controllers.dm
index 5209003fc59..b1a6f96e2eb 100644
--- a/code/game/machinery/embedded_controller/airlock_controllers.dm
+++ b/code/game/machinery/embedded_controller/airlock_controllers.dm
@@ -76,6 +76,21 @@
name = "Airlock Controller"
tag_secure = 1
+/obj/machinery/embedded_controller/radio/airlock/airlock_controller/Initialize(mapload, given_id_tag, given_frequency, given_tag_exterior_door, given_tag_interior_door, given_tag_airpump, given_tag_chamber_sensor)
+ if(given_id_tag)
+ id_tag = given_id_tag
+ if(given_frequency)
+ set_frequency(given_frequency)
+ if(given_tag_exterior_door)
+ tag_exterior_door = given_tag_exterior_door
+ if(given_tag_interior_door)
+ tag_interior_door = given_tag_interior_door
+ if(given_tag_airpump)
+ tag_airpump = given_tag_airpump
+ if(given_tag_chamber_sensor)
+ tag_chamber_sensor = given_tag_chamber_sensor
+ ..()
+
/obj/machinery/embedded_controller/radio/airlock/airlock_controller/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
@@ -129,7 +144,6 @@
name = "Access Controller"
tag_secure = 1
-
/obj/machinery/embedded_controller/radio/airlock/access_controller/update_icon()
if(on && program)
if(program.memory["processing"])
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 2bc9196740e..f8305e0fb7d 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -553,9 +553,7 @@ Class Procs:
threatcount += 2
if(check_records || check_arrest)
- var/perpname = perp.name
- if(id)
- perpname = id.registered_name
+ var/perpname = perp.get_visible_name(TRUE)
var/datum/data/record/R = find_security_record("name", perpname)
if(check_records && !R)
diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm
index 8bc5976d638..de14dce7d5b 100644
--- a/code/game/machinery/mass_driver.dm
+++ b/code/game/machinery/mass_driver.dm
@@ -160,8 +160,8 @@
var/obj/item/stack/cable_coil/C = W
to_chat(user, "You start adding cables to \the [src]...")
playsound(get_turf(src), C.usesound, 50, 1)
- if(do_after(user, 20 * C.toolspeed, target = src) && (C.amount >= 3) && (build == 2))
- C.use(3)
+ if(do_after(user, 20 * C.toolspeed, target = src) && (C.amount >= 2) && (build == 2))
+ C.use(2)
to_chat(user, "You've added cables to \the [src].")
build++
update_icon()
@@ -169,7 +169,7 @@
if(istype(W, /obj/item/wirecutters))
to_chat(user, "You begin to remove the wiring from \the [src].")
if(do_after(user, 10 * W.toolspeed, target = src) && (build == 3))
- new /obj/item/stack/cable_coil(loc,3)
+ new /obj/item/stack/cable_coil(loc,2)
playsound(get_turf(src), W.usesound, 50, 1)
to_chat(user, "You've removed the cables from \the [src].")
build--
@@ -179,8 +179,8 @@
var/obj/item/stack/rods/R = W
to_chat(user, "You begin to complete \the [src]...")
playsound(get_turf(src), R.usesound, 50, 1)
- if(do_after(user, 20 * R.toolspeed, target = src) && (R.amount >= 3) && (build == 3))
- R.use(3)
+ if(do_after(user, 20 * R.toolspeed, target = src) && (R.amount >= 2) && (build == 3))
+ R.use(2)
to_chat(user, "You've added the grille to \the [src].")
build++
update_icon()
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index b8f2d153d9f..797eee044ad 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -6,7 +6,8 @@
anchored = 1
use_power = IDLE_POWER_USE
idle_power_usage = 4
- active_power_usage = 250
+ active_power_usage = 200
+ pass_flags = PASSTABLE
var/obj/item/charging = null
var/using_power = FALSE
var/list/allowed_devices = list(/obj/item/gun/energy, /obj/item/melee/baton, /obj/item/modular_computer, /obj/item/rcs, /obj/item/bodyanalyzer)
@@ -14,6 +15,18 @@
var/icon_state_charged = "recharger2"
var/icon_state_charging = "recharger1"
var/icon_state_idle = "recharger0"
+ var/recharge_coeff = 1
+
+/obj/machinery/recharger/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/circuitboard/recharger(null)
+ component_parts += new /obj/item/stock_parts/capacitor(null)
+ RefreshParts()
+
+/obj/machinery/recharger/RefreshParts()
+ for(var/obj/item/stock_parts/capacitor/C in component_parts)
+ recharge_coeff = C.rating
/obj/machinery/recharger/attackby(obj/item/G, mob/user, params)
if(iswrench(G))
@@ -54,8 +67,16 @@
else
to_chat(user, "[src] isn't connected to anything!")
return 1
- else
- return ..()
+
+ if(anchored && !charging)
+ if(default_deconstruction_screwdriver(user, "rechargeropen", "recharger0", G))
+ return
+
+ if(panel_open && istype(G, /obj/item/crowbar))
+ default_deconstruction_crowbar(G)
+ return
+
+ return ..()
/obj/machinery/recharger/attack_hand(mob/user)
if(issilicon(user))
@@ -87,10 +108,11 @@
if(istype(charging, /obj/item/gun/energy))
var/obj/item/gun/energy/E = charging
if(E.power_supply.charge < E.power_supply.maxcharge)
- E.power_supply.give(E.power_supply.chargerate)
+ E.power_supply.give(E.power_supply.chargerate * recharge_coeff)
use_power(250)
using_power = TRUE
+
if(istype(charging, /obj/item/melee/baton))
var/obj/item/melee/baton/B = charging
if(B.bcell)
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index bc2af073fc6..3630beb1f6c 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -201,6 +201,9 @@
return FALSE
if(!Adjacent(user))
return FALSE
+ if(!allowed(user))
+ to_chat(user, "Access denied!")
+ return FALSE
return TRUE
/obj/machinery/syndicatebomb/proc/activate()
@@ -273,6 +276,7 @@
/obj/machinery/syndicatebomb/self_destruct
name = "self destruct device"
desc = "Do not taunt. Warranty invalid if exposed to high temperature. Not suitable for agents under 3 years of age."
+ req_access = list(access_syndicate)
payload = /obj/item/bombcore/large
can_unanchor = FALSE
var/explosive_wall_group = EXPLOSIVE_WALL_GROUP_SYNDICATE_BASE // If set, this bomb will also cause explosive walls in the same group to explode
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 04e78e937aa..cf7937474c8 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -1132,7 +1132,6 @@
product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?"
icon_state = "wallmed"
icon_deny = "wallmed-deny"
- req_access = list(access_medical)
density = FALSE //It is wall-mounted, and thus, not dense. --Superxpdude
products = list(/obj/item/stack/medical/bruise_pack = 2, /obj/item/stack/medical/ointment = 2, /obj/item/reagent_containers/hypospray/autoinjector = 4, /obj/item/healthanalyzer = 1)
contraband = list(/obj/item/reagent_containers/syringe/charcoal = 4, /obj/item/reagent_containers/syringe/antiviral = 4, /obj/item/reagent_containers/food/pill/tox = 1)
@@ -1143,7 +1142,6 @@
desc = "Wall-mounted Medical Equipment dispenser."
icon_state = "wallmed"
icon_deny = "wallmed-deny"
- req_access = list(access_medical)
density = FALSE //It is wall-mounted, and thus, not dense. --Superxpdude
products = list(/obj/item/reagent_containers/hypospray/autoinjector = 5, /obj/item/reagent_containers/syringe/charcoal = 3, /obj/item/stack/medical/bruise_pack = 3,
/obj/item/stack/medical/ointment = 3, /obj/item/healthanalyzer = 3)
diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm
index 5b4a8143bef..8cce6cdcdfc 100644
--- a/code/game/mecha/working/ripley.dm
+++ b/code/game/mecha/working/ripley.dm
@@ -171,10 +171,8 @@
/obj/mecha/working/ripley/proc/update_pressure()
var/turf/T = get_turf(loc)
- var/datum/gas_mixture/environment = T.return_air()
- var/pressure = environment.return_pressure()
- if(pressure < 20)
+ if(lavaland_equipment_pressure_check(T))
step_in = 3
for(var/obj/item/mecha_parts/mecha_equipment/drill/drill in equipment)
drill.equip_cooldown = initial(drill.equip_cooldown)/2
diff --git a/code/game/objects/effects/mapping_helpers.dm b/code/game/objects/effects/mapping_helpers.dm
index 909e63a98ba..44a16c5ae5f 100644
--- a/code/game/objects/effects/mapping_helpers.dm
+++ b/code/game/objects/effects/mapping_helpers.dm
@@ -67,6 +67,23 @@
/obj/effect/mapping_helpers/no_lava
icon_state = "no_lava"
+/obj/effect/mapping_helpers/airlock
+ layer = DOOR_HELPER_LAYER
+
+/obj/effect/mapping_helpers/airlock/unres
+ name = "airlock unresctricted side helper"
+ icon_state = "airlock_unres_helper"
+
+/obj/effect/mapping_helpers/airlock/unres/Initialize(mapload)
+ if(!mapload)
+ log_world("### MAP WARNING, [src] spawned outside of mapload!")
+ return
+ var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in src.loc
+ if(airlock)
+ airlock.unres_sides ^= dir
+ else
+ log_world("### MAP WARNING, [src] failed to find an airlock at [AREACOORD(src)]")
+ ..()
/obj/effect/mapping_helpers/no_lava/New()
var/turf/T = get_turf(src)
T.flags |= NO_LAVA_GEN
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
index 76e28f013a1..a9ef27c4e01 100644
--- a/code/game/objects/effects/mines.dm
+++ b/code/game/objects/effects/mines.dm
@@ -141,7 +141,7 @@
new /obj/effect/hallucination/delusion(victim.loc, victim, force_kind = "demon", duration = duration, skip_nearby = 0)
var/obj/item/twohanded/required/chainsaw/doomslayer/chainsaw = new(victim.loc)
- chainsaw.flags |= NODROP
+ chainsaw.flags |= NODROP | DROPDEL
victim.drop_l_hand()
victim.drop_r_hand()
victim.put_in_hands(chainsaw)
diff --git a/code/game/objects/effects/spawners/airlock_spawner.dm b/code/game/objects/effects/spawners/airlock_spawner.dm
new file mode 100644
index 00000000000..496f02c61d1
--- /dev/null
+++ b/code/game/objects/effects/spawners/airlock_spawner.dm
@@ -0,0 +1,345 @@
+/*
+Spawners for mappers. Just plonk one down of the desired size and it will place the machinery for you. The red arrow things indicate where the chamber is.
+This spawner places pipe leading up to the interior door, you will need to finish it off yourself with a connector, canister, and pipe connecting the two. It also assumes you already put in wall and floor.
+*/
+
+#define HALF_X round((tiles_in_x_direction - 1) * 0.5) //These are required so that the airlock can be in the middle of the chamber wall
+#define HALF_Y round((tiles_in_y_direction - 1) * 0.5)
+#define CHAMBER_LONG 1
+#define CHAMBER_SQUARE 2
+#define CHAMBER_BIGGER 3
+#define DOOR_NORMAL_PLACEMENT 1
+#define DOOR_FLIPPED_PLACEMENT 2
+
+#define AIRPUMP_TAG "[id_to_link]_pump"
+#define SENSOR_TAG "[id_to_link]_sensor"
+#define OUTER_DOOR_TAG "[id_to_link]_outer"
+#define INNER_DOOR_TAG "[id_to_link]_inner"
+
+/obj/effect/spawner/airlock
+ name = "1 by 1 airlock spawner (interior north, exterior south)"
+ desc = "If you can see this, there's probably a missing airlock here. Better tell an admin and report this on the github."
+ icon = 'icons/obj/airlock_spawner.dmi'
+ icon_state = "1x1_N_to_S"
+ layer = SPLASHSCREEN_PLANE //So we absolutely always appear above everything else. We delete ourself after spawning so this is fine
+ var/interior_direction = NORTH //This is also the direction the spawner will send the pipe
+ var/exterior_direction = SOUTH
+ var/opposite_interior_direction //We're checking these often enough for them to merit their own vars
+ var/interior_direction_cw
+ var/interior_direction_ccw
+ var/north_or_south_interior //Used a bit everywhere for locational stuff
+ var/north_or_south_exterior //Likewise
+ var/tiles_in_x_direction = 1
+ var/tiles_in_y_direction = 1
+ var/id_to_link
+ var/radio_frequency = 1379
+ var/required_access = list(access_external_airlocks)
+ var/door_name = "external access"
+ var/door_type = /obj/machinery/door/airlock/external/glass
+ var/one_door_interior //For square airlocks, if you set this then a) only one door will spawn, and b) you can choose if the door should go opposite to how it normally goes. Please use the define
+ var/one_door_exterior //See above
+
+/obj/effect/spawner/airlock/Initialize()
+ ..()
+ forceMove(locate(x + 1, y + 1, z)) //Needs to move because our icon_state implies we are one turf to the northeast, when we're not
+ opposite_interior_direction = turn(interior_direction, 180) //Do it this way (instead of setting it directly) to avoid code mishaps
+ interior_direction_cw = turn(interior_direction, 90)
+ interior_direction_ccw = turn(interior_direction, 270)
+ if(interior_direction == NORTH || interior_direction == SOUTH)
+ north_or_south_interior = TRUE
+ if(exterior_direction == NORTH || exterior_direction == SOUTH)
+ north_or_south_exterior = TRUE
+ id_to_link = "[UID()]" //We want unique IDs, this will give us a unique ID
+ var/turf/turf_interior = get_airlock_location(interior_direction)
+ var/turf/turf_exterior = get_airlock_location(exterior_direction)
+ handle_door_creation(turf_interior, TRUE, one_door_interior)
+ handle_door_creation(turf_exterior, FALSE, one_door_exterior)
+ handle_pipes_creation(turf_interior)
+ handle_control_placement()
+ qdel(src)
+
+/obj/effect/spawner/airlock/proc/get_airlock_location(desired_direction) //Finds a turf to place an airlock and returns it, this turf will be in the middle of the relevant wall
+ var/turf/T
+ switch(desired_direction)
+ if(NORTH)
+ T = locate(x + HALF_X, y + tiles_in_y_direction, z)
+ if(SOUTH)
+ T = locate(x + HALF_X, y - 1, z)
+ if(EAST)
+ T = locate(x + tiles_in_x_direction, y + HALF_Y, z)
+ if(WEST)
+ T = locate(x - 1, y + HALF_Y, z)
+ return T
+
+/obj/effect/spawner/airlock/proc/handle_door_creation(turf/T, is_this_an_interior_airlock, one_door_only) //Creates a door (or two) and also creates a button
+ var/obj/machinery/door/airlock/A
+ if(one_door_only != DOOR_FLIPPED_PLACEMENT)
+ A = new door_type(T)
+ handle_door_stuff(A, is_this_an_interior_airlock)
+ var/obj/machinery/access_button/the_button = spawn_button(T, is_this_an_interior_airlock ? interior_direction : exterior_direction)
+ if(one_door_only == DOOR_NORMAL_PLACEMENT) //We only need one door, we are done
+ return
+ if(!(tiles_in_x_direction % 2) && (is_this_an_interior_airlock && north_or_south_interior || !is_this_an_interior_airlock && north_or_south_exterior)) //Handle extra airlock for aesthetics
+ A = new door_type(get_step(T, EAST))
+ handle_door_stuff(A, is_this_an_interior_airlock)
+ if(one_door_only == DOOR_FLIPPED_PLACEMENT)
+ the_button.forceMove(get_step(the_button, EAST))
+ else if(!(tiles_in_y_direction % 2) && (is_this_an_interior_airlock && !north_or_south_interior || !is_this_an_interior_airlock && !north_or_south_exterior)) //Handle extra airlock for aesthetics
+ A = new door_type(get_step(T, NORTH))
+ handle_door_stuff(A, is_this_an_interior_airlock)
+ if(one_door_only == DOOR_FLIPPED_PLACEMENT)
+ the_button.forceMove(get_step(the_button, NORTH))
+
+/obj/effect/spawner/airlock/proc/handle_door_stuff(obj/machinery/door/airlock/A, is_this_an_interior_airlock) //This sets up the door vars correctly and then locks it before first use
+ A.set_frequency(radio_frequency)
+ A.id_tag = is_this_an_interior_airlock ? INNER_DOOR_TAG : OUTER_DOOR_TAG
+ A.req_access = required_access
+ A.name = door_name
+ A.lock()
+
+/obj/effect/spawner/airlock/proc/spawn_button(turf/T, some_direction)
+ var/obj/machinery/access_button/the_button = new(T)
+ the_button.master_tag = id_to_link
+ the_button.set_frequency(radio_frequency)
+ switch(some_direction)
+ if(NORTH)
+ the_button.pixel_x -= 25
+ the_button.pixel_y = 7
+ if(EAST)
+ the_button.pixel_x = 7
+ the_button.pixel_y = -25
+ if(SOUTH)
+ the_button.pixel_x -= 25
+ the_button.pixel_y -= 7
+ if(WEST)
+ the_button.pixel_x -= 7
+ the_button.pixel_y -= 25
+ the_button.req_access = required_access
+ return the_button
+
+/obj/effect/spawner/airlock/proc/handle_control_placement() //Stick the sensor and controller on the same bit of wall, this will ONLY be unsuitable if airlocks are on both the south and west turfs
+ var/turf/T = get_turf(src)
+ var/obj/machinery/airlock_sensor/AS = new(T)
+ var/obj/machinery/embedded_controller/radio/airlock/airlock_controller/AC = new(T, id_to_link, radio_frequency, OUTER_DOOR_TAG, INNER_DOOR_TAG, AIRPUMP_TAG, SENSOR_TAG)
+ AC.req_access = required_access
+ AS.id_tag = SENSOR_TAG
+ AS.set_frequency(radio_frequency)
+ if(interior_direction != WEST && exterior_direction != WEST) //If west wall is free, place stuff there
+ AC.pixel_x -= 25
+ AC.pixel_y += 9
+ AS.pixel_x -= 25
+ AS.pixel_y -= 9
+ else if(interior_direction != SOUTH && exterior_direction != SOUTH) //If south wall is free, place stuff there
+ AC.pixel_x += 9
+ AC.pixel_y -= 25
+ AS.pixel_x -= 9
+ AS.pixel_y -= 25
+ else //Send them over to the other side of the chamber
+ T = locate(x + tiles_in_x_direction - 1, y + tiles_in_y_direction - 1, z)
+ AC.forceMove(T)
+ AS.forceMove(T)
+ AC.pixel_x += 25
+ AC.pixel_y += 9
+ AS.pixel_x += 25
+ AS.pixel_y -= 9
+
+/obj/effect/spawner/airlock/proc/handle_pipes_creation(turf/T) //This places all required piping down, then properly initializes it. T is the turf that the interior airlock occupies
+ var/turf/below_T = get_step(T, opposite_interior_direction)
+
+ var/two_way_pipe = interior_direction | opposite_interior_direction
+ var/chamber_shape //This determines the layout of the chamber and therefore how many vents should be present
+ if(tiles_in_x_direction == 2 && tiles_in_y_direction == 2)
+ chamber_shape = CHAMBER_SQUARE
+ else if(tiles_in_x_direction > 1 && tiles_in_y_direction > 1)
+ chamber_shape = CHAMBER_BIGGER
+ else
+ chamber_shape = CHAMBER_LONG
+ pipe_creation_helper(/obj/machinery/atmospherics/pipe/simple/visible, T, interior_direction, two_way_pipe)
+ switch(chamber_shape)
+ if(CHAMBER_LONG) //Easy enough, place a single vent
+ pipe_creation_helper(/obj/machinery/atmospherics/unary/vent_pump/high_volume,
+ below_T,
+ interior_direction)
+ if(CHAMBER_SQUARE) //We need a T-manifold and two vents for this
+ pipe_creation_helper(/obj/machinery/atmospherics/pipe/manifold/visible,
+ below_T,
+ north_or_south_interior ? WEST : SOUTH,
+ NORTH | EAST | (north_or_south_interior ? SOUTH : WEST))
+ pipe_creation_helper(/obj/machinery/atmospherics/unary/vent_pump/high_volume,
+ get_step(below_T, opposite_interior_direction),
+ interior_direction)
+ pipe_creation_helper(/obj/machinery/atmospherics/unary/vent_pump/high_volume,
+ north_or_south_interior ? EAST_OF_TURF(below_T) : NORTH_OF_TURF(below_T),
+ turn(interior_direction, interior_direction == SOUTH || interior_direction == EAST ? -90 : 90))
+ if(CHAMBER_BIGGER) //We need a central column of manifolds and a vent either side of each manifold
+ var/depth = north_or_south_interior ? tiles_in_y_direction : tiles_in_x_direction
+ var/turf/put_thing_here = below_T
+ for(var/i in 1 to depth)
+ if(i != depth)//We're placing more pipe later, so we need a 4-way manifold
+ pipe_creation_helper(/obj/machinery/atmospherics/pipe/manifold4w/visible, put_thing_here, interior_direction, NORTH | EAST | SOUTH | WEST)
+ else //We stop here, so place a T-manifold down
+ pipe_creation_helper(/obj/machinery/atmospherics/pipe/manifold/visible,
+ put_thing_here,
+ opposite_interior_direction,
+ interior_direction_cw | interior_direction | interior_direction_ccw)
+ pipe_creation_helper(/obj/machinery/atmospherics/unary/vent_pump/high_volume,
+ get_step(put_thing_here, interior_direction_cw),
+ interior_direction_ccw)
+ pipe_creation_helper(/obj/machinery/atmospherics/unary/vent_pump/high_volume,
+ get_step(put_thing_here, interior_direction_ccw),
+ interior_direction_cw)
+ put_thing_here = get_step(put_thing_here, opposite_interior_direction) //Now move the turf we're generating stuff from 1 forward
+
+/obj/effect/spawner/airlock/proc/pipe_creation_helper(path, location, direction, initialization_directions) //Create some kind of atmospherics machinery and initialize it properly
+ var/obj/machinery/atmospherics/A = new path(location)
+ A.dir = direction
+ A.on_construction(A.dir, initialization_directions ? initialization_directions : A.dir)
+ if(istype(A, /obj/machinery/atmospherics/unary/vent_pump/high_volume))
+ var/obj/machinery/atmospherics/unary/vent_pump/high_volume/created_pump = A
+ created_pump.id_tag = AIRPUMP_TAG
+ created_pump.set_frequency(radio_frequency)
+
+
+//Premade airlocks for mappers, probably won't need all of these but whatever
+/obj/effect/spawner/airlock/s_to_n
+ name = "1 by 1 airlock spawner (interior south, exterior north)"
+ icon_state = "1x1_S_to_N"
+ interior_direction = SOUTH
+ exterior_direction = NORTH
+/obj/effect/spawner/airlock/e_to_w
+ name = "1 by 1 airlock spawner (interior east, exterior west)"
+ icon_state = "1x1_E_to_W"
+ interior_direction = EAST
+ exterior_direction = WEST
+/obj/effect/spawner/airlock/w_to_e
+ name = "1 by 1 airlock spawner (interior west, exterior east)"
+ icon_state = "1x1_W_to_E"
+ interior_direction = WEST
+ exterior_direction = EAST
+
+/obj/effect/spawner/airlock/long //Long and thin
+ name = "long airlock spawner (interior north, exterior south)"
+ icon_state = "1x2_N_to_S"
+ tiles_in_y_direction = 2
+/obj/effect/spawner/airlock/s_to_n/long
+ name = "long airlock spawner (interior south, exterior north)"
+ icon_state = "1x2_S_to_N"
+ tiles_in_y_direction = 2
+/obj/effect/spawner/airlock/e_to_w/long
+ name = "long airlock spawner (interior east, exterior west)"
+ icon_state = "1x2_E_to_W"
+ tiles_in_x_direction = 2
+/obj/effect/spawner/airlock/w_to_e/long
+ name = "long airlock spawner (interior west, exterior east)"
+ icon_state = "1x2_W_to_E"
+ tiles_in_x_direction = 2
+
+/obj/effect/spawner/airlock/long/square //Square
+ name = "square airlock spawner (interior north, exterior south)"
+ icon_state = "2x2_N_to_S"
+ tiles_in_x_direction = 2
+/obj/effect/spawner/airlock/s_to_n/long/square
+ name = "square airlock spawner (interior south, exterior north)"
+ icon_state = "2x2_S_to_N"
+ tiles_in_x_direction = 2
+/obj/effect/spawner/airlock/e_to_w/long/square
+ name = "square airlock spawner (interior east, exterior west)"
+ icon_state = "2x2_E_to_W"
+ tiles_in_y_direction = 2
+/obj/effect/spawner/airlock/w_to_e/long/square
+ name = "square airlock spawner (interior west, exterior east)"
+ icon_state = "2x2_W_to_E"
+ tiles_in_y_direction = 2
+/obj/effect/spawner/airlock/long/square/e_to_s
+ name = "square airlock spawner (interior east, exterior south)"
+ icon_state = "2x2_E_to_S"
+ interior_direction = EAST
+ exterior_direction = SOUTH
+
+/obj/effect/spawner/airlock/long/square/wide
+ name = "rectangular airlock spawner (interior north, exterior south)"
+ icon_state = "3x2_N_to_S"
+ tiles_in_x_direction = 3
+/obj/effect/spawner/airlock/s_to_n/long/square/wide
+ name = "rectangular airlock spawner (interior south, exterior north)"
+ icon_state = "3x2_S_to_N"
+ tiles_in_x_direction = 3
+/obj/effect/spawner/airlock/e_to_w/long/square/wide
+ name = "rectangular airlock spawner (interior east, exterior west)"
+ icon_state = "3x2_E_to_W"
+ tiles_in_y_direction = 3
+/obj/effect/spawner/airlock/w_to_e/long/square/wide
+ name = "rectangular airlock spawner (interior west, exterior east)"
+ icon_state = "3x2_W_to_E"
+ tiles_in_y_direction = 3
+
+/obj/effect/spawner/airlock/long/square/three
+ name = "3 by 3 square airlock spawner (interior north, exterior south)"
+ icon_state = "3x3_N_to_S"
+ interior_direction = NORTH
+ exterior_direction = SOUTH
+ tiles_in_x_direction = 3
+ tiles_in_y_direction = 3
+
+/obj/effect/spawner/airlock/e_to_w/arrivals
+ required_access = null
+
+/obj/effect/spawner/airlock/engineer
+ required_access = list(access_engine)
+ door_name = "engineering external access"
+/obj/effect/spawner/airlock/e_to_w/engineer
+ required_access = list(access_engine)
+ door_name = "engineering external access"
+/obj/effect/spawner/airlock/s_to_n/engineer
+ required_access = list(access_engine)
+ door_name = "engineering external access"
+/obj/effect/spawner/airlock/long/engineer
+ required_access = list(access_engine)
+ door_name = "engineering external access"
+/obj/effect/spawner/airlock/long/square/engine
+ required_access = list(access_engine)
+ door_name = "engine external access"
+ icon_state = "2x2_N_to_S_leftdoors"
+ door_type = /obj/machinery/door/airlock/external
+ one_door_interior = DOOR_NORMAL_PLACEMENT
+ one_door_exterior = DOOR_NORMAL_PLACEMENT
+/obj/effect/spawner/airlock/long/square/engine/reversed
+ icon_state = "2x2_N_to_S_rightdoors"
+ one_door_interior = DOOR_FLIPPED_PLACEMENT
+ one_door_exterior = DOOR_FLIPPED_PLACEMENT
+
+/obj/effect/spawner/airlock/w_to_e/long/square/wide/mining
+ door_name = "mining external access"
+ required_access = list(access_mining)
+/obj/effect/spawner/airlock/long/square/wide/mining
+ door_name = "mining external access"
+ required_access = list(access_mining)
+
+/obj/effect/spawner/airlock/e_to_w/minisat
+ door_name = "minisat external access"
+ required_access = list(access_minisat)
+/obj/effect/spawner/airlock/long/square/e_to_s/telecoms
+ door_name = "telecoms external access"
+ required_access = list(access_tcomsat, access_external_airlocks)
+ door_type = /obj/machinery/door/airlock/external
+
+/obj/effect/spawner/airlock/long/square/three/syndicate
+ name = "3 by 3 square airlock spawner (interior west, exterior north)"
+ icon_state = "3x3_W_to_N"
+ interior_direction = WEST
+ exterior_direction = NORTH
+ door_name = "ship external access"
+ req_access = list(access_syndicate)
+ door_type = /obj/machinery/door/airlock/external
+
+#undef HALF_X
+#undef HALF_Y
+#undef CHAMBER_LONG
+#undef CHAMBER_SQUARE
+#undef CHAMBER_BIGGER
+#undef DOOR_NORMAL_PLACEMENT
+#undef DOOR_FLIPPED_PLACEMENT
+#undef AIRPUMP_TAG
+#undef SENSOR_TAG
+#undef OUTER_DOOR_TAG
+#undef INNER_DOOR_TAG
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index 8fd1c061c32..7f1683ba415 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -140,6 +140,20 @@
..()
animate(src, alpha = 0, time = duration)
+/obj/effect/temp_visual/fire
+ icon = 'icons/goonstation/effects/fire.dmi'
+ icon_state = "3"
+ light_range = LIGHT_RANGE_FIRE
+ light_color = LIGHT_COLOR_FIRE
+ duration = 10
+ layer = MASSIVE_OBJ_LAYER
+ alpha = 250
+ blend_mode = BLEND_ADD
+
+/obj/effect/temp_visual/fire/New(loc)
+ color = heat2color(FIRE_MINIMUM_TEMPERATURE_TO_EXIST)
+ ..()
+
/obj/effect/temp_visual/revenant
name = "spooky lights"
icon_state = "purplesparkles"
@@ -289,4 +303,33 @@
/obj/effect/temp_visual/dir_setting/firing_effect/magic
icon_state = "shieldsparkles"
- duration = 3
\ No newline at end of file
+ duration = 3
+
+/obj/effect/temp_visual/impact_effect
+ icon_state = "impact_bullet"
+ duration = 5
+
+/obj/effect/temp_visual/impact_effect/Initialize(mapload, x, y)
+ pixel_x = x
+ pixel_y = y
+ return ..()
+
+/obj/effect/temp_visual/impact_effect/red_laser
+ icon_state = "impact_laser"
+ duration = 4
+
+/obj/effect/temp_visual/impact_effect/blue_laser
+ icon_state = "impact_laser_blue"
+ duration = 4
+
+/obj/effect/temp_visual/impact_effect/green_laser
+ icon_state = "impact_laser_green"
+ duration = 4
+
+/obj/effect/temp_visual/impact_effect/purple_laser
+ icon_state = "impact_laser_purple"
+ duration = 4
+
+/obj/effect/temp_visual/impact_effect/ion
+ icon_state = "shieldsparkles"
+ duration = 6
\ No newline at end of file
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 9dbb02553ca..34ec25c902d 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -331,7 +331,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
else
return ..()
-/obj/item/proc/hit_reaction(mob/living/carbon/human/owner, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+/obj/item/proc/hit_reaction(mob/living/carbon/human/owner, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, atom/movable/AM)
SEND_SIGNAL(src, COMSIG_ITEM_HIT_REACT, args)
if(prob(final_block_chance))
owner.visible_message("[owner] blocks [attack_text] with [src]!")
@@ -347,6 +347,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
A.Remove(user)
if(flags & DROPDEL)
qdel(src)
+ if((flags & NODROP) && !(initial(flags) & NODROP)) //Remove NODROP is dropped
+ flags &= ~NODROP
in_inventory = FALSE
SEND_SIGNAL(src, COMSIG_ITEM_DROPPED,user)
diff --git a/code/game/objects/items/contraband.dm b/code/game/objects/items/contraband.dm
index 7ce7b07193d..77aef9bb71d 100644
--- a/code/game/objects/items/contraband.dm
+++ b/code/game/objects/items/contraband.dm
@@ -4,6 +4,7 @@
/obj/item/storage/pill_bottle/happy
name = "Happy pills"
desc = "Highly illegal drug. When you want to see the rainbow."
+ wrapper_color = COLOR_PINK
/obj/item/storage/pill_bottle/happy/New()
..()
@@ -18,6 +19,7 @@
/obj/item/storage/pill_bottle/zoom
name = "Zoom pills"
desc = "Highly illegal drug. Trade brain for speed."
+ wrapper_color = COLOR_BLUE
/obj/item/storage/pill_bottle/zoom/New()
..()
@@ -49,15 +51,12 @@
adulterants--
reagents.add_reagent(pick_list("chemistry_tools.json", "CYBERPUNK_drug_adulterants"), 3)
-
-
/obj/item/storage/pill_bottle/random_drug_bottle
name = "pill bottle (???)"
desc = "Huh."
+ allow_wrap = FALSE
/obj/item/storage/pill_bottle/random_drug_bottle/New()
..()
for(var/i in 1 to 5)
new /obj/item/reagent_containers/food/pill/random_drugs(src)
-
-
diff --git a/code/game/objects/items/devices/enginepicker.dm b/code/game/objects/items/devices/enginepicker.dm
new file mode 100644
index 00000000000..e28b5b3bef5
--- /dev/null
+++ b/code/game/objects/items/devices/enginepicker.dm
@@ -0,0 +1,96 @@
+/*
+//////////
+ Item meant to spawn one of the three (Tesla / Singularity / Supermatter) engines on-station at round-start.
+ Should be found in the CE's office. Not access-restricted.
+//////////
+*/
+
+/obj/item/enginepicker
+ name = "Bluespace Engine Delivery Device"
+ desc = "A per-station bluespace-based delivery system for a unique engine Engineering Department's choice. Only one option can be chosen. Device self-destructs on use."
+ icon = 'icons/obj/device.dmi'
+ icon_state = "enginepicker"
+
+ var/list/list_enginebeacons = list()
+ var/isactive = FALSE
+
+/obj/item/enginepicker/attack_self(mob/living/carbon/user)
+ if(usr.stat || !usr.canmove || usr.restrained())
+ return
+
+ if(!isactive)
+ isactive = TRUE //Self-attack spam exploit prevention
+ else
+ return
+
+ locatebeacons()
+ var/default = null
+ var/E = input("Select the station's Engine:", "[src]", default) as null|anything in list_enginebeacons
+ if(E)
+ processchoice(E, user)
+ else
+ isactive = FALSE
+ return
+
+//This proc re-assigns all of engine beacons in the global list to a local list.
+/obj/item/enginepicker/proc/locatebeacons()
+ LAZYCLEARLIST(list_enginebeacons)
+ for(var/obj/item/radio/beacon/engine/B in GLOB.engine_beacon_list)
+ if(B && !QDELETED(B)) //This ensures that the input pop-up won't have any qdeleted beacons
+ list_enginebeacons += B
+
+//Spawns and logs / announces the appropriate engine based on the choice made
+/obj/item/enginepicker/proc/processchoice(var/obj/item/radio/beacon/engine/choice, mob/living/carbon/user)
+ var/issuccessful = FALSE //Check for a successful choice
+ var/engtype //Engine type
+ var/G //Generator that will be spawned
+ var/turf/T = get_turf(choice)
+
+ if(choice.enginetype.len > 1) //If the beacon has multiple engine types
+ var/default = null
+ var/E = input("You have selected a combined beacon, which option would you prefer?", "[src]", default) as null|anything in choice.enginetype
+ if(E)
+ engtype = E
+ issuccessful = TRUE
+ else
+ isactive = FALSE
+ return
+
+ if(!engtype) //If it has only one type
+ engtype = DEFAULTPICK(choice.enginetype, null) //This should(?) account for a possibly scrambled list with a single entry
+ switch(engtype)
+ if(ENGTYPE_TESLA)
+ G = /obj/machinery/the_singularitygen/tesla
+ if(ENGTYPE_SING)
+ G = /obj/machinery/the_singularitygen
+
+ if(G) //This can only be not-null if the switch operation was successful
+ issuccessful = TRUE
+
+ if(issuccessful)
+ clearturf(T) //qdels all items / gibs all mobs on the turf. Let's not have an SM shard spawn on top of a poor sod.
+ new G(T) //Spawns the switch-selected engine on the chosen beacon's turf
+
+ var/ailist[] = list()
+ for(var/mob/living/silicon/ai/A in GLOB.living_mob_list)
+ ailist += A
+ if(ailist.len)
+ var/mob/living/silicon/ai/announcer = pick(ailist)
+ announcer.say(";Engine delivery detected. Type: [engtype].") //Let's announce the terrible choice to everyone
+
+ visible_message("\The [src] begins to violently vibrate and hiss, then promptly disintegrates!")
+ qdel(src) //Self-destructs to prevent crew from spawning multiple engines.
+ else
+ visible_message("\The [src] buzzes! No beacon found or selected!")
+ isactive = FALSE
+ return
+
+//Deletes objects and mobs from the beacon's turf.
+/obj/item/enginepicker/proc/clearturf(var/turf/T)
+ for(var/obj/item/I in T)
+ I.visible_message("\The [I] gets crushed to dust!")
+ qdel(I)
+
+ for(var/mob/living/M in T)
+ M.visible_message("\The [M] gets obliterated!")
+ M.gib()
\ No newline at end of file
diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm
index d45bcfa2ff4..ea7d95d0a9c 100644
--- a/code/game/objects/items/devices/radio/beacon.dm
+++ b/code/game/objects/items/devices/radio/beacon.dm
@@ -85,3 +85,23 @@
playsound(src, 'sound/effects/pop.ogg', 100, 1, 1)
qdel(src)
return
+
+/obj/item/radio/beacon/engine
+ desc = "A label on it reads: Warning: This device is used for transportation of high-density objects used for high-yield power generation. Stay away!."
+ anchored = 1 //Let's not move these around. Some folk might get the idea to use these for assassinations
+ var/list/enginetype = list()
+
+/obj/item/radio/beacon/engine/Initialize()
+ LAZYADD(GLOB.engine_beacon_list, src)
+
+/obj/item/radio/beacon/engine/tesling
+ name = "Engine Beacon for Tesla and Singularity"
+ enginetype = list(ENGTYPE_TESLA, ENGTYPE_SING)
+
+/obj/item/radio/beacon/engine/tesla
+ name = "Engine Beacon for Tesla"
+ enginetype = list(ENGTYPE_TESLA)
+
+/obj/item/radio/beacon/engine/sing
+ name = "Engine Beacon for Singularity"
+ enginetype = list(ENGTYPE_SING)
\ No newline at end of file
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 610c257b03f..27d27b11a9b 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -4,6 +4,10 @@
var/radio_desc = ""
icon_state = "headset"
item_state = "headset"
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/ears.dmi',
+ "Vox Armalis" = 'icons/mob/species/armalis/ears.dmi'
+ ) //We read you loud and skree-er.
materials = list(MAT_METAL=75)
subspace_transmission = TRUE
canhear_range = 0 // can't hear headsets from very far away
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index cad4ae25ac8..d838fe7ec0d 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -135,8 +135,13 @@ REAGENT SCANNER
user.show_message("Key: Suffocation/Toxin/Burns/Brute", 1)
user.show_message("Body Temperature: ???", 1)
return
- user.visible_message("[user] has analyzed [M]'s vitals."," You have analyzed [M]'s vitals.")
+ user.visible_message("[user] has analyzed [M]'s vitals."," You have analyzed [M]'s vitals.")
+ healthscan(user, M, mode, upgraded)
+ add_fingerprint(user)
+
+
+proc/healthscan(mob/user, mob/living/M, mode = 1, upgraded = FALSE)
if(!ishuman(M) || M.isSynthetic())
//these sensors are designed for organic life
user.show_message("Analyzing Results for ERROR:\n\t Overall Status: ERROR")
@@ -271,8 +276,9 @@ REAGENT SCANNER
user.show_message("Subject's genes are showing minor signs of instability.")
else
user.show_message("Subject's genes are stable.")
- add_fingerprint(user)
+/obj/item/healthanalyzer/attack_self(mob/user)
+ toggle_mode()
/obj/item/healthanalyzer/verb/toggle_mode()
set name = "Switch Verbosity"
diff --git a/code/game/objects/items/random_items.dm b/code/game/objects/items/random_items.dm
index 587b1d27d14..e51bac10005 100644
--- a/code/game/objects/items/random_items.dm
+++ b/code/game/objects/items/random_items.dm
@@ -123,6 +123,7 @@
/obj/item/storage/pill_bottle/random_meds
name = "unlabelled pillbottle"
desc = "The sheer recklessness of this bottle's existence astounds you."
+ allow_wrap = FALSE
var/labelled = FALSE
/obj/item/storage/pill_bottle/random_meds/New()
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 9ec921fef92..f7df69cad2f 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -178,8 +178,12 @@ var/global/list/datum/stack_recipe/wood_recipes = list(
new /datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40),
new /datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),
new /datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),
+ new /datum/stack_recipe("wooden bucket", /obj/item/reagent_containers/glass/bucket/wooden, 3, time = 10),
+ new /datum/stack_recipe("rake", /obj/item/cultivator/rake, 5, time = 10),
+ new /datum/stack_recipe("ore box", /obj/structure/ore_box, 4, time = 50, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 15),
- new /datum/stack_recipe("fermenting barrel", /obj/structure/fermenting_barrel, 30, time = 50)
+ new /datum/stack_recipe("fermenting barrel", /obj/structure/fermenting_barrel, 30, time = 50),
+ new /datum/stack_recipe("firebrand", /obj/item/match/firebrand, 2, time = 100)
)
/obj/item/stack/sheet/wood
diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm
index 084dac30a60..736ba1cc767 100644
--- a/code/game/objects/items/weapons/dice.dm
+++ b/code/game/objects/items/weapons/dice.dm
@@ -4,6 +4,7 @@
icon = 'icons/obj/dice.dmi'
icon_state = "dicebag"
can_hold = list(/obj/item/dice)
+ allow_wrap = FALSE
/obj/item/storage/pill_bottle/dice/New()
..()
diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm
index 4f94a6b8a1b..21161c2642a 100644
--- a/code/game/objects/items/weapons/kitchen.dm
+++ b/code/game/objects/items/weapons/kitchen.dm
@@ -115,7 +115,8 @@
throw_range = 6
materials = list(MAT_METAL=12000)
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- sharp = 1
+ sharp = TRUE
+ var/bayonet = FALSE //Can this be attached to a gun?
/obj/item/kitchen/knife/suicide_act(mob/user)
user.visible_message(pick("[user] is slitting [user.p_their()] wrists with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.", \
@@ -164,6 +165,7 @@
throwforce = 20
origin_tech = "materials=3;combat=4"
attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cut")
+ bayonet = TRUE
/obj/item/kitchen/knife/combat/survival
name = "survival knife"
diff --git a/code/game/objects/items/weapons/lighters.dm b/code/game/objects/items/weapons/lighters.dm
index ab946de5f0f..56d237c4eda 100644
--- a/code/game/objects/items/weapons/lighters.dm
+++ b/code/game/objects/items/weapons/lighters.dm
@@ -224,3 +224,13 @@
var/mask_item = M.get_item_by_slot(slot_wear_mask)
if(istype(mask_item, /obj/item/clothing/mask/cigarette))
return mask_item
+
+
+/obj/item/match/firebrand
+ name = "firebrand"
+ desc = "An unlit firebrand. It makes you wonder why it's not just called a stick."
+ smoketime = 20 //40 seconds
+
+/obj/item/match/firebrand/New()
+ ..()
+ matchignite()
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index 713259e081c..ddae7d87f85 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -18,8 +18,10 @@
burn_state = FLAMMABLE
burntime = 20
sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/back.dmi'
- )
+ "Vox" = 'icons/mob/species/vox/back.dmi',
+ "Vox Armalis" = 'icons/mob/species/armalis/back.dmi',
+ "Grey" = 'icons/mob/species/grey/back.dmi'
+ ) //For Armalis anything but this and the nitrogen tank will use the default backpack icon.
/obj/item/storage/backpack/attackby(obj/item/W as obj, mob/user as mob, params)
playsound(src.loc, "rustle", 50, 1, -5)
@@ -398,7 +400,7 @@
new /obj/item/gun/projectile/automatic/shotgun/bulldog(src)
new /obj/item/ammo_box/magazine/m12g(src)
new /obj/item/ammo_box/magazine/m12g(src)
- new /obj/item/clothing/glasses/thermal/syndi(src)
+ new /obj/item/clothing/glasses/chameleon/thermal(src)
/obj/item/storage/backpack/duffel/syndie/med/medicalbundle
desc = "A large duffel bag containing a tactical medkit, a Donksoft machine gun and a big jumbo box of riot darts."
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index e7342774619..3fe5c140407 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -113,7 +113,7 @@
New()
..()
contents = list()
- new /obj/item/clothing/mask/breath(src)
+ new /obj/item/clothing/mask/gas/explorer(src)
new /obj/item/tank/emergency_oxygen/engi(src)
new /obj/item/crowbar/red(src)
new /obj/item/reagent_containers/hypospray/autoinjector(src)
@@ -372,6 +372,20 @@
new /obj/item/implantpad(src)
new /obj/item/locator(src)
+/obj/item/storage/box/minertracker
+ name = "boxed tracking implant kit"
+ desc = "For finding those who have died on the accursed lavaworld."
+ icon_state = "implant"
+
+/obj/item/storage/box/minertracker/New()
+ ..()
+ new /obj/item/implantcase/tracking(src)
+ new /obj/item/implantcase/tracking(src)
+ new /obj/item/implantcase/tracking(src)
+ new /obj/item/implanter(src)
+ new /obj/item/implantpad(src)
+ new /obj/item/locator(src)
+
/obj/item/storage/box/chemimp
name = "chemical implant kit"
desc = "Box of stuff used to implant chemicals."
diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm
index fab82df4b4e..8d8cb77e597 100644
--- a/code/game/objects/items/weapons/storage/firstaid.dm
+++ b/code/game/objects/items/weapons/storage/firstaid.dm
@@ -254,10 +254,21 @@
var/applying_meds = FALSE //To Prevent spam clicking and generating runtimes from apply a deleting pill multiple times.
var/rapid_intake_message = "unscrews the cap on the pill bottle and begins dumping the entire contents down their throat!"
var/rapid_post_instake_message = "downs the entire bottle of pills in one go!"
+ var/allow_wrap = TRUE
+ var/wrapper_color = null
/obj/item/storage/pill_bottle/New()
..()
base_name = name
+ if(allow_wrap)
+ apply_wrap()
+
+/obj/item/storage/pill_bottle/proc/apply_wrap()
+ if(wrapper_color)
+ overlays.Cut()
+ var/image/I = image(icon, "pillbottle_wrap")
+ I.color = wrapper_color
+ overlays += I
/obj/item/storage/pill_bottle/attack(mob/M, mob/user)
if(iscarbon(M) && contents.len)
@@ -274,6 +285,9 @@
else
return ..()
+/obj/item/storage/pill_bottle/ert
+ wrapper_color = COLOR_MAROON
+
/obj/item/storage/pill_bottle/ert/New()
..()
new /obj/item/reagent_containers/food/pill/salicylic(src)
@@ -319,15 +333,18 @@
/obj/item/storage/pill_bottle/patch_pack
name = "Patch Pack"
+ desc = "It's a container for storing medical patches."
icon_state = "patch_pack"
can_hold = list(/obj/item/reagent_containers/food/pill/patch)
cant_hold = list()
rapid_intake_message = "flips the lid of the Patch Pack open and begins rapidly stamping patches on themselves!"
rapid_post_instake_message = "stamps the entire contents of the Patch Pack all over their entire body!"
+ allow_wrap = FALSE
/obj/item/storage/pill_bottle/charcoal
name = "Pill bottle (Charcoal)"
desc = "Contains pills used to counter toxins."
+ wrapper_color = COLOR_GREEN
New()
..()
@@ -342,6 +359,7 @@
/obj/item/storage/pill_bottle/painkillers
name = "Pill Bottle (Salicylic Acid)"
desc = "Contains various pills for minor pain relief."
+ wrapper_color = COLOR_RED
/obj/item/storage/pill_bottle/painkillers/New()
..()
@@ -354,8 +372,11 @@
new /obj/item/reagent_containers/food/pill/salicylic(src)
new /obj/item/reagent_containers/food/pill/salicylic(src)
+/obj/item/storage/pill_bottle/fakedeath
+ allow_wrap = FALSE
+
/obj/item/storage/pill_bottle/fakedeath/New()
..()
new /obj/item/reagent_containers/food/pill/fakedeath(src)
new /obj/item/reagent_containers/food/pill/fakedeath(src)
- new /obj/item/reagent_containers/food/pill/fakedeath(src)
\ No newline at end of file
+ new /obj/item/reagent_containers/food/pill/fakedeath(src)
diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm
index 9cd4178aaf2..edccca3ff4a 100644
--- a/code/game/objects/items/weapons/storage/lockbox.dm
+++ b/code/game/objects/items/weapons/storage/lockbox.dm
@@ -116,15 +116,10 @@
/obj/item/storage/lockbox/medal/New()
..()
- new /obj/item/clothing/accessory/medal/gold/heroism(src)
- new /obj/item/clothing/accessory/medal/silver/security(src)
- new /obj/item/clothing/accessory/medal/silver/valor(src)
- new /obj/item/clothing/accessory/medal/nobel_science(src)
- new /obj/item/clothing/accessory/medal/bronze_heart(src)
- new /obj/item/clothing/accessory/medal/conduct(src)
- new /obj/item/clothing/accessory/medal/conduct(src)
- new /obj/item/clothing/accessory/medal/conduct(src)
new /obj/item/clothing/accessory/medal/gold/captain(src)
+ new /obj/item/clothing/accessory/medal/silver/leadership(src)
+ new /obj/item/clothing/accessory/medal/silver/valor(src)
+ new /obj/item/clothing/accessory/medal/heart(src)
/obj/item/storage/lockbox/t4
name = "lockbox (T4)"
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index 5d31cc3f59b..3736d93f3f6 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -20,7 +20,7 @@
if("thief") // 40TC
new /obj/item/gun/energy/kinetic_accelerator/crossbow(src) // 12TC
new /obj/item/chameleon(src) // 8TC
- new /obj/item/clothing/glasses/thermal/syndi(src) // 6TC
+ new /obj/item/clothing/glasses/chameleon/thermal(src) // 6TC
new /obj/item/clothing/gloves/color/black/thief(src) // 6TC
new /obj/item/card/id/syndicate(src) // 2TC
new /obj/item/clothing/shoes/chameleon/noslip(src) // 2TC
@@ -108,7 +108,7 @@
new /obj/item/gun/projectile/automatic/sniper_rifle/syndicate/penetrator(src) // 16TC
new /obj/item/ammo_box/magazine/sniper_rounds/penetrator(src) // 5TC
new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src) // 3TC
- new /obj/item/clothing/glasses/thermal/syndi/sunglasses(src) // 6TC
+ new /obj/item/clothing/glasses/chameleon/thermal(src) // 6TC
new /obj/item/clothing/gloves/combat(src) // 0 TC
new /obj/item/clothing/under/suit_jacket/really_black(src) // 0 TC
new /obj/item/clothing/suit/storage/lawyer/blackjacket/armored(src) // 0TC
diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm
index f7b8d59528e..ea178aa3345 100644
--- a/code/game/objects/items/weapons/tanks/tank_types.dm
+++ b/code/game/objects/items/weapons/tanks/tank_types.dm
@@ -205,7 +205,7 @@ obj/item/tank/emergency_oxygen/double/empty/New()
desc = "A tank of nitrogen."
icon_state = "oxygen_fr"
distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
-
+ sprite_sheets = list("Vox Armalis" = 'icons/mob/species/armalis/back.dmi') //Do it for Big Bird.
/obj/item/tank/nitrogen/New()
..()
@@ -222,6 +222,7 @@ obj/item/tank/emergency_oxygen/double/empty/New()
desc = "A high-tech nitrogen tank designed specifically for Vox."
icon_state = "emergency_vox"
volume = 25
+ sprite_sheets = list("Vox Armalis" = 'icons/mob/species/armalis/belt.dmi') //Do it for Big Bird.
/obj/item/tank/emergency_oxygen/vox/New()
..()
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index b759139dba6..f42decd4363 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -157,6 +157,8 @@
icon = 'icons/obj/items.dmi'
icon_state = "baseball_bat"
item_state = "baseball_bat"
+ var/deflectmode = FALSE // deflect small/medium thrown objects
+ var/lastdeflect
force = 10
throwforce = 12
attack_verb = list("beat", "smacked")
@@ -169,14 +171,54 @@
desc = "This thing looks dangerous... Dangerously good at baseball, that is."
homerun_able = 1
+/obj/item/melee/baseball_bat/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type, atom/movable/AM)
+ . = ..()
+ if(!istype(AM, /obj/item) || attack_type != THROWN_PROJECTILE_ATTACK)
+ return FALSE
+ var/obj/item/I = AM
+ if(I.w_class <= WEIGHT_CLASS_NORMAL || istype(I, /obj/item/beach_ball)) // baseball bat deflecting
+ if(deflectmode)
+ if(prob(10))
+ visible_message("[owner] Deflects [I] directly back at the thrower! It's a home run!", "You deflect the [I] directly back at the thrower! It's a home run!")
+ playsound(get_turf(owner), 'sound/weapons/homerun.ogg', 100, 1)
+ do_attack_animation(I, ATTACK_EFFECT_DISARM)
+ I.throw_at(I.thrownby, 20, 20, owner)
+ deflectmode = FALSE
+ if(!istype(I, /obj/item/beach_ball))
+ lastdeflect = world.time + 3000
+ return TRUE
+ else if(prob(30))
+ visible_message("[owner] swings! And [p_they()] miss[p_es()]! How embarassing.", "You swing! You miss! Oh no!")
+ playsound(get_turf(owner), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ do_attack_animation(get_step(owner, pick(alldirs)), ATTACK_EFFECT_DISARM)
+ deflectmode = FALSE
+ if(!istype(I, /obj/item/beach_ball))
+ lastdeflect = world.time + 3000
+ return FALSE
+ else
+ visible_message("[owner] swings and deflects [I]!", "You swing and deflect the [I]!")
+ playsound(get_turf(owner), 'sound/weapons/baseball_hit.ogg', 50, 1, -1)
+ do_attack_animation(I, ATTACK_EFFECT_DISARM)
+ I.throw_at(get_edge_target_turf(owner, pick(cardinal)), rand(8,10), 14, owner)
+ deflectmode = FALSE
+ if(!istype(I, /obj/item/beach_ball))
+ lastdeflect = world.time + 3000
+ return TRUE
+
/obj/item/melee/baseball_bat/attack_self(mob/user)
if(!homerun_able)
- ..()
- return
+ if(!deflectmode && world.time >= lastdeflect)
+ to_chat(user, "You prepare to deflect objects thrown at you. You cannot attack during this time.")
+ deflectmode = TRUE
+ else if(deflectmode && world.time >= lastdeflect)
+ to_chat(user, "You no longer deflect objects thrown at you. You can attack during this time")
+ deflectmode = FALSE
+ else
+ to_chat(user, "You need to wait until you can deflect again. The ability will be ready in [time2text(lastdeflect - world.time, "m:ss")]")
+ return ..()
if(homerun_ready)
to_chat(user, "You're already ready to do a home run!")
- ..()
- return
+ return ..()
to_chat(user, "You begin gathering strength...")
playsound(get_turf(src), 'sound/magic/lightning_chargeup.ogg', 65, 1)
if(do_after(user, 90, target = user))
@@ -185,6 +227,9 @@
..()
/obj/item/melee/baseball_bat/attack(mob/living/target, mob/living/user)
+ if(deflectmode)
+ to_chat(user, "You cannot attack in deflect mode!")
+ return
. = ..()
var/atom/throw_target = get_edge_target_turf(target, user.dir)
if(homerun_ready)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index afb3ae15df4..0cd6e541398 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -38,6 +38,7 @@
new /obj/item/rpd(src)
new /obj/item/reagent_containers/food/drinks/mug/ce(src)
new /obj/item/organ/internal/cyberimp/eyes/meson(src)
+ new /obj/item/clothing/accessory/medal/engineering(src)
/obj/structure/closet/secure_closet/engineering_electrical
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index 5e300b0e7a0..189cbc5893d 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -110,6 +110,7 @@
/obj/item/storage/pill_bottle/psychiatrist
name = "psychiatrist's pill bottle"
desc = "Contains various pills to calm or sedate patients."
+ wrapper_color = COLOR_PALE_BTL_GREEN
/obj/item/storage/pill_bottle/psychiatrist/New()
..()
@@ -193,6 +194,7 @@
new /obj/item/organ/internal/cyberimp/eyes/hud/medical(src)
new /obj/item/door_remote/chief_medical_officer(src)
new /obj/item/reagent_containers/food/drinks/mug/cmo(src)
+ new /obj/item/clothing/accessory/medal/medical(src)
/obj/structure/closet/secure_closet/animal
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
index 6be824a4246..4d688f65dac 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
@@ -77,7 +77,7 @@
new /obj/item/door_remote/research_director(src)
new /obj/item/reagent_containers/food/drinks/mug/rd(src)
new /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic(src)
-
+ new /obj/item/clothing/accessory/medal/science(src)
/obj/structure/closet/secure_closet/research_reagents
name = "research chemical storage closet"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 746c9cb52ef..fe6b0082207 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -60,7 +60,7 @@
new /obj/item/clothing/accessory/petcollar(src)
new /obj/item/door_remote/civillian(src)
new /obj/item/reagent_containers/food/drinks/mug/hop(src)
-
+ new /obj/item/clothing/accessory/medal/service(src)
/obj/structure/closet/secure_closet/hop2
name = "head of personnel's attire"
@@ -128,7 +128,7 @@
new /obj/item/door_remote/head_of_security(src)
new /obj/item/reagent_containers/food/drinks/mug/hos(src)
new /obj/item/organ/internal/cyberimp/eyes/hud/security(src)
-
+ new /obj/item/clothing/accessory/medal/security(src)
/obj/structure/closet/secure_closet/warden
name = "warden's locker"
@@ -464,4 +464,5 @@
new /obj/item/clothing/head/powdered_wig(src)
new /obj/item/gavelblock(src)
new /obj/item/gavelhammer(src)
- new /obj/item/clothing/head/justice_wig(src)
\ No newline at end of file
+ new /obj/item/clothing/head/justice_wig(src)
+ new /obj/item/clothing/accessory/medal/legal(src)
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index d44ec20c515..4a2dadffcc7 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -5,9 +5,9 @@
icon_state = "crate"
icon_opened = "crateopen"
icon_closed = "crate"
- climbable = 1
+ climbable = TRUE
// mouse_drag_pointer = MOUSE_ACTIVE_POINTER //???
- var/rigged = 0
+ var/rigged = FALSE
var/obj/item/paper/manifest/manifest
// A list of beacon names that the crate will announce the arrival of, when delivered.
var/list/announce_beacons = list()
@@ -23,16 +23,16 @@
overlays += "manifest"
/obj/structure/closet/crate/can_open()
- return 1
+ return TRUE
/obj/structure/closet/crate/can_close()
- return 1
+ return TRUE
/obj/structure/closet/crate/open()
if(src.opened)
- return 0
+ return FALSE
if(!src.can_open())
- return 0
+ return FALSE
if(rigged && locate(/obj/item/radio/electropack) in src)
if(isliving(usr))
@@ -47,18 +47,18 @@
for(var/mob/M in src) //Mobs
M.forceMove(loc)
icon_state = icon_opened
- src.opened = 1
+ src.opened = TRUE
if(climbable)
structure_shaken()
- return 1
+ return TRUE
/obj/structure/closet/crate/close()
if(!src.opened)
- return 0
+ return FALSE
if(!src.can_close())
- return 0
+ return FALSE
playsound(src.loc, 'sound/machines/click.ogg', 15, 1, -3)
var/itemcount = 0
@@ -75,8 +75,8 @@
itemcount++
icon_state = icon_closed
- src.opened = 0
- return 1
+ src.opened = FALSE
+ return TRUE
/obj/structure/closet/crate/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/rcs) && !src.opened)
@@ -105,7 +105,7 @@
return
playsound(E.loc, E.usesound, 50, 1)
to_chat(user, "Teleporting [src.name]...")
- E.teleporting = 1
+ E.teleporting = TRUE
if(!do_after(user, 50 * E.toolspeed, target = src))
E.teleporting = 0
return
@@ -127,9 +127,9 @@
return
playsound(E.loc, E.usesound, 50, 1)
to_chat(user, "Teleporting [src.name]...")
- E.teleporting = 1
+ E.teleporting = TRUE
if(!do_after(user, 50 * E.toolspeed, target = src))
- E.teleporting = 0
+ E.teleporting = FALSE
return
E.teleporting = 0
if(!(E.rcell && E.rcell.use(E.chargecost)))
@@ -154,14 +154,16 @@
else if(istype(W, /obj/item/stack/packageWrap))
return
else if(istype(W, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/C = W
if(rigged)
to_chat(user, "[src] is already rigged!")
return
- to_chat(user, "You rig [src].")
- user.drop_item()
- qdel(W)
- rigged = 1
- return
+ if(C.use(15))
+ to_chat(user, "You rig [src].")
+ rigged = TRUE
+ else
+ to_chat(user, "You need atleast 15 wires to rig [src]!")
+ return
else if(istype(W, /obj/item/radio/electropack))
if(rigged)
to_chat(user, "You attach [W] to [src].")
@@ -172,7 +174,7 @@
if(rigged)
to_chat(user, "You cut away the wiring.")
playsound(loc, W.usesound, 100, 1)
- rigged = 0
+ rigged = FALSE
return
else return attack_hand(user)
@@ -653,4 +655,4 @@
new /obj/item/storage/bag/ore(src)
new /obj/item/clothing/glasses/meson(src)
new /obj/item/card/id/golem(src)
- new /obj/item/flashlight/lantern(src)
\ No newline at end of file
+ new /obj/item/flashlight/lantern(src)
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index eca9d524730..b21754cae96 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -226,6 +226,7 @@
door = new airlock_type(loc)
door.setDir(dir)
door.electronics = electronics
+ door.unres_sides = electronics.unres_sides
door.heat_proof = heat_proof_finished
if(electronics.one_access)
door.req_access = null
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 4a70729d7e9..9f3829a8277 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -97,12 +97,9 @@
else
icon_state = "fwall_open"
-/obj/structure/falsewall/proc/ChangeToWall(delete = 1)
+/obj/structure/falsewall/proc/ChangeToWall(delete = TRUE)
var/turf/T = get_turf(src)
- if(!walltype || walltype == "metal")
- T.ChangeTurf(/turf/simulated/wall)
- else
- T.ChangeTurf(text2path("/turf/simulated/wall/mineral/[walltype]"))
+ T.ChangeTurf(walltype)
if(delete)
qdel(src)
return T
diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
index 005f0e721fb..15e578ed88f 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
@@ -64,6 +64,12 @@
if(usr.incapacitated())
to_chat(usr, "You can't do that right now!")
return
+ if(!usr.has_right_hand() && !usr.has_left_hand())
+ to_chat(usr, "You try to grab the chair, but you are missing both of your hands!")
+ return
+ if(usr.get_active_hand() && usr.get_inactive_hand())
+ to_chat(usr, "You try to grab the chair, but your hands are already full!")
+ return
if(!ishuman(usr))
return
usr.visible_message("[usr] grabs \the [src.name].", "You grab \the [src.name].")
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index ac013ebcf93..93b2e30b6d9 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -91,6 +91,12 @@
if(climber)
climber.Weaken(2)
climber.visible_message("[climber.name] has been knocked off the table", "You've been knocked off the table", "You see [climber.name] get knocked off the table")
+ else if(user.pulling.pass_flags & PASSTABLE)
+ user.Move_Pulled(src)
+ if (user.pulling.loc == loc)
+ user.visible_message("[user] places [user.pulling] onto [src].",
+ "You place [user.pulling] onto [src].")
+ user.stop_pulling()
/obj/structure/table/attack_tk() // no telehulk sorry
return
diff --git a/code/game/turfs/simulated/floor/asteroid.dm b/code/game/turfs/simulated/floor/asteroid.dm
index 5f2ad4b629c..04ac165fc56 100644
--- a/code/game/turfs/simulated/floor/asteroid.dm
+++ b/code/game/turfs/simulated/floor/asteroid.dm
@@ -5,6 +5,7 @@
baseturf = /turf/simulated/floor/plating/asteroid
icon_state = "asteroid"
icon_plating = "asteroid"
+ footstep_sounds = list()
var/environment_type = "asteroid"
var/turf_type = /turf/simulated/floor/plating/asteroid //Because caves do whacky shit to revert to normal
var/dug = 0 //0 = has not yet been dug, 1 = has already been dug
diff --git a/code/game/turfs/simulated/floor/chasm.dm b/code/game/turfs/simulated/floor/chasm.dm
index 6a213400d04..17807bd255b 100644
--- a/code/game/turfs/simulated/floor/chasm.dm
+++ b/code/game/turfs/simulated/floor/chasm.dm
@@ -22,6 +22,11 @@
if(!drop_stuff())
STOP_PROCESSING(SSprocessing, src)
+/turf/open/chasm/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ underlay_appearance.icon = 'icons/turf/floors.dmi'
+ underlay_appearance.icon_state = "basalt"
+ return TRUE
+
/turf/simulated/floor/chasm/attackby(obj/item/C, mob/user, params, area/area_restriction)
..()
if(istype(C, /obj/item/stack/rods))
diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm
index 97065cd9711..12b1654994c 100644
--- a/code/game/turfs/simulated/floor/fancy_floor.dm
+++ b/code/game/turfs/simulated/floor/fancy_floor.dm
@@ -117,6 +117,9 @@
burnt = 1
update_icon()
+/turf/open/floor/carpet/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ return FALSE
+
/turf/simulated/floor/carpet/black
icon = 'icons/turf/floors/carpet_black.dmi'
floor_tile = /obj/item/stack/tile/carpet/black
@@ -127,6 +130,7 @@
icon_state = "0"
floor_tile = /obj/item/stack/tile/fakespace
broken_states = list("damaged")
+ plane = PLANE_SPACE
/turf/simulated/floor/fakespace/New()
..()
@@ -137,3 +141,9 @@
icon_state = "arcade"
floor_tile = /obj/item/stack/tile/arcade_carpet
smooth = SMOOTH_FALSE
+
+/turf/open/floor/fakespace/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ underlay_appearance.icon = 'icons/turf/space.dmi'
+ underlay_appearance.icon_state = SPACE_ICON_STATE
+ underlay_appearance.plane = PLANE_SPACE
+ return TRUE
diff --git a/code/game/turfs/simulated/floor/indestructible.dm b/code/game/turfs/simulated/floor/indestructible.dm
index 6c1679776e6..3705e24eea0 100644
--- a/code/game/turfs/simulated/floor/indestructible.dm
+++ b/code/game/turfs/simulated/floor/indestructible.dm
@@ -81,5 +81,8 @@
planetary_atmos = TRUE
desc = "A floor with a square pattern. It's faintly cool to the touch."
+/turf/open/indestructible/hierophant/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ return FALSE
+
/turf/simulated/floor/indestructible/hierophant/two
icon_state = "hierophant2"
diff --git a/code/game/turfs/simulated/floor/lava.dm b/code/game/turfs/simulated/floor/lava.dm
index 0882bb18766..66d7eaca83d 100644
--- a/code/game/turfs/simulated/floor/lava.dm
+++ b/code/game/turfs/simulated/floor/lava.dm
@@ -41,6 +41,11 @@
/turf/simulated/floor/plating/lava/remove_plating()
return
+/turf/open/lava/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ underlay_appearance.icon = 'icons/turf/floors.dmi'
+ underlay_appearance.icon_state = "basalt"
+ return TRUE
+
/turf/simulated/floor/plating/lava/proc/is_safe()
var/static/list/lava_safeties_typecache = typecacheof(list(/obj/structure/lattice/catwalk, /obj/structure/stone_tile))
var/list/found_safeties = typecache_filter_list(contents, lava_safeties_typecache)
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index 2ef4602d268..11ff392b824 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -7,6 +7,8 @@
broken_states = list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
burnt_states = list("floorscorched1", "floorscorched2")
+ var/unfastened = FALSE
+
footstep_sounds = list(
"human" = list('sound/effects/footstep/plating_human.ogg'),
"xeno" = list('sound/effects/footstep/plating_xeno.ogg')
@@ -31,6 +33,12 @@
if(!broken && !burnt)
icon_state = icon_plating //Because asteroids are 'platings' too.
+/turf/simulated/floor/plating/examine(mob/user)
+ . = ..()
+
+ if(unfastened)
+ to_chat(user, "It has been unfastened.")
+
/turf/simulated/floor/plating/attackby(obj/item/C, mob/user, params)
if(..())
return TRUE
@@ -64,6 +72,15 @@
to_chat(user, "This section is too damaged to support a tile! Use a welder to fix the damage.")
return TRUE
+ else if(isscrewdriver(C))
+ var/obj/item/screwdriver/screwdriver = C
+ to_chat(user, "You start [unfastened ? "fastening" : "unfastening"] [src].")
+ playsound(src, screwdriver.usesound, 50, 1)
+ if(do_after(user, 20 * screwdriver.toolspeed, target = src) && screwdriver)
+ to_chat(user, "You [unfastened ? "fasten" : "unfasten"] [src].")
+ unfastened = !unfastened
+ return TRUE
+
else if(iswelder(C))
var/obj/item/weldingtool/welder = C
if(welder.isOn())
@@ -79,7 +96,7 @@
burnt = FALSE
broken = FALSE
update_icon()
- else
+ if(unfastened)
to_chat(user, "You start removing [src].")
playsound(src, welder.usesound, 100, 1)
if(do_after(user, 50 * welder.toolspeed, target = src) && welder && welder.isOn())
diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm
index 119f0b000d9..aee23831050 100644
--- a/code/game/turfs/simulated/minerals.dm
+++ b/code/game/turfs/simulated/minerals.dm
@@ -48,6 +48,13 @@
setDir(angle2dir(rotation + dir2angle(dir)))
queue_smooth(src)
+/turf/simulated/mineral/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ if(turf_type)
+ underlay_appearance.icon = initial(turf_type.icon)
+ underlay_appearance.icon_state = initial(turf_type.icon_state)
+ return TRUE
+ return ..()
+
/turf/simulated/mineral/attackby(var/obj/item/pickaxe/P as obj, mob/user as mob, params)
if(!user.IsAdvancedToolUser())
to_chat(usr, "You don't have the dexterity to do this!")
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 5a8f842307e..26b79c9e9f4 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -1,3 +1,7 @@
+#define WALL_DENT_HIT 1
+#define WALL_DENT_SHOT 2
+#define MAX_DENT_DECALS 15
+
/turf/simulated/wall
name = "wall"
desc = "A huge chunk of metal used to seperate rooms."
@@ -25,7 +29,7 @@
var/slicing_duration = 100
var/engraving //engraving on the wall
var/engraving_quality
-
+ var/list/dent_decals
var/sheet_type = /obj/item/stack/sheet/metal
var/sheet_amount = 2
var/girder_type = /obj/structure/girder
@@ -167,6 +171,8 @@
/turf/simulated/wall/blob_act()
if(prob(50))
dismantle_wall()
+ else
+ add_dent(WALL_DENT_HIT)
/turf/simulated/wall/rpd_act(mob/user, obj/item/rpd/our_rpd)
if(our_rpd.mode == RPD_ATMOS_MODE)
@@ -191,6 +197,8 @@
M.occupant_message("You smash through the wall.")
visible_message("[src.name] smashes through the wall!")
playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1)
+ else
+ add_dent(WALL_DENT_HIT)
// Wall-rot effect, a nasty fungus that destroys walls.
/turf/simulated/wall/proc/rot()
@@ -260,6 +268,7 @@
dismantle_wall(TRUE)
else
playsound(src, 'sound/effects/bang.ogg', 50, 1)
+ add_dent(WALL_DENT_HIT)
to_chat(user, text("You punch the wall."))
return TRUE
@@ -296,7 +305,6 @@
if(try_wallmount(I, user, params))
return
-
// The magnetic gripper does a separate attackby, so bail from this one
if(istype(I, /obj/item/gripper))
return
@@ -327,7 +335,7 @@
return TRUE // this means "don't continue trying to find alternative uses in attackby", not "decon succeeded"
var/response = "Dismantle"
- if(damage)
+ if(damage || LAZYLEN(dent_decals))
response = alert(user, "Would you like to repair or dismantle [src]?", "[src]", "Repair", "Dismantle")
switch(response)
@@ -336,6 +344,8 @@
playsound(src, WT.usesound, 100, 1)
if(do_after(user, max(5, damage / 5) * WT.toolspeed, target = src) && WT && WT.isOn())
to_chat(user, "You finish repairing the damage to [src].")
+ cut_overlay(dent_decals)
+ dent_decals.Cut()
take_damage(-damage)
else
to_chat(user, "You begin slicing through the outer plating.")
@@ -435,3 +445,27 @@
/turf/simulated/wall/narsie_act()
if(prob(20))
ChangeTurf(/turf/simulated/wall/cult)
+
+/turf/simulated/wall/proc/add_dent(denttype, x=rand(-8, 8), y=rand(-8, 8))
+ if(LAZYLEN(dent_decals) >= MAX_DENT_DECALS)
+ return
+
+ var/mutable_appearance/decal = mutable_appearance('icons/effects/effects.dmi', "", BULLET_HOLE_LAYER)
+ switch(denttype)
+ if(WALL_DENT_SHOT)
+ decal.icon_state = "bullet_hole"
+ if(WALL_DENT_HIT)
+ decal.icon_state = "impact[rand(1, 3)]"
+
+ decal.pixel_x = x
+ decal.pixel_y = y
+
+ if(LAZYLEN(dent_decals))
+ cut_overlay(dent_decals)
+ dent_decals += decal
+ else
+ dent_decals = list(decal)
+
+ add_overlay(dent_decals)
+
+#undef MAX_DENT_DECALS
\ No newline at end of file
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index 0d6428b10a2..40c0d83272e 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -16,6 +16,7 @@
var/destination_z
var/destination_x
var/destination_y
+ plane = PLANE_SPACE
/turf/space/Initialize(mapload)
if(!istype(src, /turf/space/transit))
@@ -262,4 +263,10 @@
/turf/space/attack_ghost(mob/dead/observer/user)
if(destination_z)
var/turf/T = locate(destination_x, destination_y, destination_z)
- user.forceMove(T)
\ No newline at end of file
+ user.forceMove(T)
+
+/turf/space/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ underlay_appearance.icon = 'icons/turf/space.dmi'
+ underlay_appearance.icon_state = SPACE_ICON_STATE
+ underlay_appearance.plane = PLANE_SPACE
+ return TRUE
diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm
index 79bf171ce1f..15c553b3f95 100644
--- a/code/game/turfs/space/transit.dm
+++ b/code/game/turfs/space/transit.dm
@@ -1,5 +1,6 @@
/turf/space/transit
var/pushdirection // push things that get caught in the transit tile this direction
+ plane = PLANE_SPACE
//Overwrite because we dont want people building rods in space.
/turf/space/transit/attackby(obj/O as obj, mob/user as mob, params)
@@ -151,3 +152,9 @@
icon_state = "speedspace_ns_[state]"
transform = turn(matrix(), angle)
+
+/turf/space/transit/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ underlay_appearance.icon = 'icons/turf/space.dmi'
+ underlay_appearance.icon_state = SPACE_ICON_STATE
+ underlay_appearance.plane = PLANE_SPACE
+ return TRUE
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index e315ad26ad0..51285932f00 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -470,6 +470,12 @@
if(ismob(A) || .)
A.ratvar_act()
+/turf/proc/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
+ underlay_appearance.icon = icon
+ underlay_appearance.icon_state = icon_state
+ underlay_appearance.dir = adjacency_dir
+ return TRUE
+
/turf/proc/add_blueprints(atom/movable/AM)
var/image/I = new
I.appearance = AM.appearance
diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm
index 8febe20e840..0b171dac199 100644
--- a/code/game/verbs/suicide.dm
+++ b/code/game/verbs/suicide.dm
@@ -229,3 +229,19 @@
setCloneLoss(100, FALSE)
updatehealth()
+
+/mob/living/simple_animal/mouse/verb/suicide()
+ set hidden = 1
+ if(stat == DEAD)
+ to_chat(src, "You're already dead!")
+ return
+ if(suiciding)
+ to_chat(src, "You're already committing suicide! Be patient!")
+ return
+
+ var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
+
+ if(confirm == "Yes")
+ suiciding = TRUE
+ visible_message("[src] is playing dead permanently! It looks like [p_theyre()] trying to commit suicide.")
+ adjustOxyLoss(max(100 - getBruteLoss(100), 0))
\ No newline at end of file
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 3b282fa6893..b66f83543dd 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -77,9 +77,11 @@ var/list/admin_verbs_admin = list(
/client/proc/toggle_mentor_chat,
/client/proc/toggle_advanced_interaction, /*toggle admin ability to interact with not only machines, but also atoms such as buttons and doors*/
/client/proc/list_ssds,
+ /client/proc/list_afks,
/client/proc/cmd_admin_headset_message,
/client/proc/spawn_floor_cluwne,
- /client/proc/show_discord_duplicates,
+ /client/proc/show_discord_duplicates, // This needs removing at some point, ingame discord linking got removed in #11359
+ /client/proc/toggle_panic_bunker
)
var/list/admin_verbs_ban = list(
/client/proc/unban_panel,
@@ -118,7 +120,8 @@ var/list/admin_verbs_event = list(
/client/proc/cmd_admin_create_centcom_report,
/client/proc/fax_panel,
/client/proc/event_manager_panel,
- /client/proc/modify_goals
+ /client/proc/modify_goals,
+ /client/proc/outfit_manager
)
var/list/admin_verbs_spawn = list(
@@ -642,7 +645,7 @@ var/list/admin_verbs_ticket = list(
if(!message)
return
for(var/mob/V in hearers(O))
- V.show_message(message, 2)
+ V.show_message(admin_pencode_to_html(message), 2)
log_admin("[key_name(usr)] made [O] at [O.x], [O.y], [O.z] make a sound")
message_admins("[key_name_admin(usr)] made [O] at [O.x], [O.y], [O.z] make a sound")
feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -1026,4 +1029,17 @@ var/list/admin_verbs_ticket = list(
if(!check_rights(R_ADMIN))
return
- holder.discord_duplicates()
\ No newline at end of file
+ holder.discord_duplicates()
+
+/client/proc/toggle_panic_bunker()
+ set name = "Toggle Panic Bunker"
+ set category = "Admin"
+ set desc = "Disables new players connecting."
+
+ if(!check_rights(R_ADMIN))
+ return
+
+ GLOB.panic_bunker_enabled = !GLOB.panic_bunker_enabled
+
+ log_admin("[key_name(usr)] has [GLOB.panic_bunker_enabled ? "activated" : "deactivated"] the panic bunker.")
+ message_admins("[key_name_admin(usr)] has [GLOB.panic_bunker_enabled ? "activated" : "deactivated"] the panic bunker.")
diff --git a/code/modules/admin/outfits.dm b/code/modules/admin/outfits.dm
new file mode 100644
index 00000000000..336edc89c88
--- /dev/null
+++ b/code/modules/admin/outfits.dm
@@ -0,0 +1,262 @@
+GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
+
+/client/proc/outfit_manager()
+ set category = "Event"
+ set name = "Outfit Manager"
+
+ if(!check_rights(R_EVENT))
+ return
+ holder.outfit_manager(usr)
+
+/datum/admins/proc/outfit_manager(mob/admin)
+ var/list/dat = list("")
+ for(var/datum/outfit/O in GLOB.custom_outfits)
+ var/vv = FALSE
+ var/datum/outfit/varedit/VO = O
+ if(istype(VO))
+ vv = length(VO.vv_values)
+ dat += "- [O.name][vv ? "(VV)" : ""]
Save Delete"
+ dat += "
"
+ dat += "Create
"
+ dat += "Load from file"
+ admin << browse(dat.Join(),"window=outfitmanager")
+
+/datum/admins/proc/save_outfit(mob/admin,datum/outfit/O)
+ O.save_to_file(admin)
+ outfit_manager(admin)
+
+/datum/admins/proc/delete_outfit(mob/admin,datum/outfit/O)
+ GLOB.custom_outfits -= O
+ qdel(O)
+ to_chat(admin,"Outfit deleted.")
+ outfit_manager(admin)
+
+/datum/admins/proc/load_outfit(mob/admin)
+ var/outfit_file = input("Pick outfit json file:", "File") as null|file
+ if(!outfit_file)
+ return
+ var/filedata = file2text(outfit_file)
+ var/json = json_decode(filedata)
+ if(!json)
+ to_chat(admin,"JSON decode error.")
+ return
+ var/otype = text2path(json["outfit_type"])
+ if(!ispath(otype,/datum/outfit))
+ to_chat(admin,"Malformed/Outdated file.")
+ return
+ var/datum/outfit/O = new otype
+ if(!O.load_from(json))
+ to_chat(admin,"Malformed/Outdated file.")
+ return
+ GLOB.custom_outfits += O
+ outfit_manager(admin)
+
+/datum/admins/proc/create_outfit(mob/admin)
+ var/list/uniforms = typesof(/obj/item/clothing/under)
+ var/list/suits = typesof(/obj/item/clothing/suit)
+ var/list/gloves = typesof(/obj/item/clothing/gloves)
+ var/list/shoes = typesof(/obj/item/clothing/shoes)
+ var/list/headwear = typesof(/obj/item/clothing/head)
+ var/list/glasses = typesof(/obj/item/clothing/glasses)
+ var/list/masks = typesof(/obj/item/clothing/mask)
+ var/list/pdas = typesof(/obj/item/pda)
+ var/list/ids = typesof(/obj/item/card/id)
+
+ var/uniform_select = ""
+
+ var/suit_select = ""
+
+ var/gloves_select = ""
+
+ var/shoes_select = ""
+
+ var/head_select = ""
+
+ var/glasses_select = ""
+
+ var/mask_select = ""
+
+ var/id_select = ""
+
+ var/pda_select = ""
+
+ var/dat = {"
+ Create Outfit
+
+ "}
+ admin << browse(dat, "window=dressup;size=550x600")
+
+
+/datum/admins/proc/create_outfit_finalize(mob/admin, list/href_list)
+ var/datum/outfit/O = new
+
+ O.name = href_list["outfit_name"]
+ O.uniform = text2path(href_list["outfit_uniform"])
+ O.shoes = text2path(href_list["outfit_shoes"])
+ O.gloves = text2path(href_list["outfit_gloves"])
+ O.suit = text2path(href_list["outfit_suit"])
+ O.head = text2path(href_list["outfit_head"])
+ O.back = text2path(href_list["outfit_back"])
+ O.mask = text2path(href_list["outfit_mask"])
+ O.glasses = text2path(href_list["outfit_glasses"])
+ O.r_hand = text2path(href_list["outfit_r_hand"])
+ O.l_hand = text2path(href_list["outfit_l_hand"])
+ O.suit_store = text2path(href_list["outfit_s_store"])
+ O.l_pocket = text2path(href_list["outfit_l_pocket"])
+ O.r_pocket = text2path(href_list["outfit_r_pocket"])
+ O.id = text2path(href_list["outfit_id"])
+ O.pda = text2path(href_list["outfit_pda"])
+ O.belt = text2path(href_list["outfit_belt"])
+ O.l_ear = text2path(href_list["outfit_l_ear"])
+ O.r_ear = text2path(href_list["outfit_r_ear"])
+
+ GLOB.custom_outfits.Add(O)
+ message_admins("[key_name_admin(usr)] created \"[O.name]\" outfit.")
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index ebe2219d90b..cb10ba4d335 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -341,9 +341,6 @@
if("Cancel") return
if("Yes") delmob = 1
- log_admin("[key_name(usr)] has used rudimentary transformation on [key_name(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]")
- message_admins("[key_name_admin(usr)] has used rudimentary transformation on [key_name_admin(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]", 1)
-
switch(href_list["simplemake"])
if("observer") M.change_mob_type( /mob/dead/observer , null, null, delmob, 1 )
if("drone") M.change_mob_type( /mob/living/carbon/alien/humanoid/drone , null, null, delmob, 1 )
@@ -351,7 +348,11 @@
if("queen") M.change_mob_type( /mob/living/carbon/alien/humanoid/queen/large , null, null, delmob, 1 )
if("sentinel") M.change_mob_type( /mob/living/carbon/alien/humanoid/sentinel , null, null, delmob, 1 )
if("larva") M.change_mob_type( /mob/living/carbon/alien/larva , null, null, delmob, 1 )
- if("human") M.change_mob_type( /mob/living/carbon/human, null, null, delmob, 1 )
+ if("human")
+ var/posttransformoutfit = usr.client.robust_dress_shop()
+ var/mob/living/carbon/human/newmob = M.change_mob_type(/mob/living/carbon/human, null, null, delmob, 1)
+ if(posttransformoutfit && istype(newmob))
+ newmob.equipOutfit(posttransformoutfit)
if("slime") M.change_mob_type( /mob/living/carbon/slime , null, null, delmob, 1 )
if("monkey") M.change_mob_type( /mob/living/carbon/human/monkey , null, null, delmob, 1 )
if("robot") M.change_mob_type( /mob/living/silicon/robot , null, null, delmob, 1 )
@@ -368,6 +369,9 @@
if("constructwraith") M.change_mob_type( /mob/living/simple_animal/hostile/construct/wraith , null, null, delmob, 1 )
if("shade") M.change_mob_type( /mob/living/simple_animal/shade , null, null, delmob, 1 )
+ log_admin("[key_name(usr)] has used rudimentary transformation on [key_name(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]")
+ message_admins("[key_name_admin(usr)] has used rudimentary transformation on [key_name_admin(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]", 1)
+
/////////////////////////////////////new ban stuff
else if(href_list["unbanf"])
@@ -1510,14 +1514,22 @@
usr.client.cmd_admin_animalize(M)
else if(href_list["incarn_ghost"])
- if(!check_rights(R_SPAWN)) return
+ if(!check_rights(R_SPAWN))
+ return
var/mob/dead/observer/G = locateUID(href_list["incarn_ghost"])
if(!istype(G))
to_chat(usr, "This will only work on /mob/dead/observer")
- log_admin("[key_name(G)] was incarnated by [key_name(src.owner)]")
- message_admins("[key_name_admin(G)] was incarnated by [key_name_admin(src.owner)]")
- G.incarnate_ghost()
+
+ var/posttransformoutfit = usr.client.robust_dress_shop()
+
+ var/mob/living/carbon/human/H = G.incarnate_ghost()
+
+ if(posttransformoutfit && istype(H))
+ H.equipOutfit(posttransformoutfit)
+
+ log_admin("[key_name(G)] was incarnated by [key_name(owner)]")
+ message_admins("[key_name_admin(G)] was incarnated by [key_name_admin(owner)]")
else if(href_list["togmutate"])
if(!check_rights(R_SPAWN)) return
@@ -1930,7 +1942,7 @@
evilcookie.reagents.add_reagent("mutagen", 10)
evilcookie.desc = "It has a faint green glow."
evilcookie.bitesize = 100
- evilcookie.flags = NODROP
+ evilcookie.flags = NODROP | DROPDEL
H.drop_l_hand()
H.equip_to_slot_or_del(evilcookie, slot_l_hand)
logmsg = "a mutagen cookie."
@@ -1939,7 +1951,7 @@
evilcookie.reagents.add_reagent("hell_water", 25)
evilcookie.desc = "Sulphur-flavored."
evilcookie.bitesize = 100
- evilcookie.flags = NODROP
+ evilcookie.flags = NODROP | DROPDEL
H.drop_l_hand()
H.equip_to_slot_or_del(evilcookie, slot_l_hand)
logmsg = "a hellwater cookie."
@@ -2001,7 +2013,7 @@
if(!istype(H))
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
return
- if(!isLivingSSD(H))
+ if(!href_list["cryoafk"] && !isLivingSSD(H))
to_chat(usr, "This can only be used on living, SSD players.")
return
if(istype(H.loc, /obj/machinery/cryopod))
@@ -2012,6 +2024,11 @@
else if(cryo_ssd(H))
log_admin("[key_name(usr)] sent [H.job] [H] to cryo.")
message_admins("[key_name_admin(usr)] sent [H.job] [H] to cryo.")
+ if(href_list["cryoafk"]) // Warn them if they are send to storage and are AFK
+ to_chat(H, "The admins have moved you to cryo storage for being AFK. Please eject yourself (right click, eject) out of the cryostorage if you want to avoid being despawned.")
+ SEND_SOUND(H, 'sound/effects/adminhelp.ogg')
+ if(H.client)
+ window_flash(H.client)
else if(href_list["FaxReplyTemplate"])
if(!check_rights(R_ADMIN))
return
@@ -2166,7 +2183,7 @@
var/obj/item/paper/P = new /obj/item/paper(null) //hopefully the null loc won't cause trouble for us
if(!fax)
- var/list/departmentoptions = alldepartments + "All Departments"
+ var/list/departmentoptions = alldepartments + hidden_departments + "All Departments"
destination = input(usr, "To which department?", "Choose a department", "") as null|anything in departmentoptions
if(!destination)
qdel(P)
@@ -2181,7 +2198,7 @@
if(!input)
qdel(P)
return
- input = P.parsepencode(input) // Encode everything from pencode to html
+ input = admin_pencode_to_html(html_encode(input)) // Encode everything from pencode to html
var/customname = clean_input("Pick a title for the fax.", "Fax Title", , owner)
if(!customname)
@@ -3368,6 +3385,29 @@
message_admins("[key_name_admin(usr)] forcefully unlinked the discord account belonging to [target_ckey]")
log_admin("[key_name_admin(usr)] forcefully unlinked the discord account belonging to [target_ckey]")
+ else if(href_list["create_outfit_finalize"])
+ if(!check_rights(R_EVENT))
+ return
+ create_outfit_finalize(usr,href_list)
+ else if(href_list["load_outfit"])
+ if(!check_rights(R_EVENT))
+ return
+ load_outfit(usr)
+ else if(href_list["create_outfit_menu"])
+ if(!check_rights(R_EVENT))
+ return
+ create_outfit(usr)
+ else if(href_list["delete_outfit"])
+ if(!check_rights(R_EVENT))
+ return
+ var/datum/outfit/O = locate(href_list["chosen_outfit"]) in GLOB.custom_outfits
+ delete_outfit(usr,O)
+ else if(href_list["save_outfit"])
+ if(!check_rights(R_EVENT))
+ return
+ var/datum/outfit/O = locate(href_list["chosen_outfit"]) in GLOB.custom_outfits
+ save_outfit(usr,O)
+
/client/proc/create_eventmob_for(var/mob/living/carbon/human/H, var/killthem = 0)
if(!check_rights(R_EVENT))
return
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index 4aceade3526..853b367e15b 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -27,7 +27,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
if(handle_spam_prevention(msg, MUTE_ADMINHELP, OOC_COOLDOWN))
return
- msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN))
+ msg = sanitize_simple(copytext(msg,1,MAX_MESSAGE_LEN))
if(!msg) return
var/original_msg = msg
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index 0b7632595e8..1069e981c37 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -3,7 +3,7 @@
set category = null
set name = "Admin PM Mob"
if(!holder)
- to_chat(src, "Error: Admin-PM-Context: Only administrators may use this command.")
+ to_chat(src, "Error: Admin-PM-Context: Only administrators may use this command.")
return
if( !ismob(M) || !M.client ) return
cmd_admin_pm(M.client,null)
@@ -14,7 +14,7 @@
set category = "Admin"
set name = "Admin PM Name"
if(!holder)
- to_chat(src, "Error: Admin-PM-Panel: Only administrators may use this command.")
+ to_chat(src, "Error: Admin-PM-Panel: Only administrators may use this command.")
return
var/list/client/targets[0]
for(var/client/T)
@@ -37,7 +37,7 @@
set category = "Admin"
set name = "Admin PM Key"
if(!holder)
- to_chat(src, "Error: Admin-PM-Panel: Only administrators may use this command.")
+ to_chat(src, "Error: Admin-PM-Panel: Only administrators may use this command.")
return
var/list/client/targets[0]
for(var/client/T)
@@ -60,7 +60,7 @@
//Fetching a message if needed. src is the sender and C is the target client
/client/proc/cmd_admin_pm(whom, msg, type = "PM")
if(prefs.muted & MUTE_ADMINHELP)
- to_chat(src, "Error: Private-Message: You are unable to use PM-s (muted).")
+ to_chat(src, "Error: Private-Message: You are unable to use PM-s (muted).")
return
var/client/C
@@ -106,11 +106,11 @@
//clean the message if it's not sent by a high-rank admin
if(!check_rights(R_SERVER|R_DEBUG,0))
- msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN))
+ msg = sanitize_simple(copytext(msg,1,MAX_MESSAGE_LEN))
if(!msg)
return
else
- msg = pencode_to_html(msg)
+ msg = admin_pencode_to_html(msg)
var/recieve_span = "playerreply"
var/send_pm_type = " "
@@ -129,7 +129,7 @@
recieve_pm_type = holder.rank
else if(!C.holder)
- to_chat(src, "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.")
+ to_chat(src, "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.")
return
var/recieve_message = ""
@@ -161,7 +161,9 @@
var/emoji_msg = "[msg]"
recieve_message = "[type] from-[recieve_pm_type][C.holder ? key_name(src, TRUE, type) : key_name_hidden(src, TRUE, type)]: [emoji_msg]"
to_chat(C, recieve_message)
- to_chat(src, "[send_pm_type][type] to-[holder ? key_name(C, TRUE, type) : key_name_hidden(C, TRUE, type)]: [emoji_msg]")
+ var/ping_link = check_rights(R_ADMIN, 0, mob) ? "(PING)" : ""
+ var/window_link = "(WINDOW)"
+ to_chat(src, "[send_pm_type][type] to-[holder ? key_name(C, TRUE, type) : key_name_hidden(C, TRUE, type)]: [emoji_msg] [ping_link] [window_link]")
/*if(holder && !C.holder)
C.last_pm_recieved = world.time
@@ -215,7 +217,7 @@
/client/proc/cmd_admin_irc_pm()
if(prefs.muted & MUTE_ADMINHELP)
- to_chat(src, "Error: Private-Message: You are unable to use PM-s (muted).")
+ to_chat(src, "Error: Private-Message: You are unable to use PM-s (muted).")
return
var/msg = clean_input("Message:", "Private message to admins on IRC / 400 character limit", , src) as text|null
@@ -232,14 +234,14 @@
send2adminirc("PlayerPM from [key_name(src)]: [html_decode(msg)]")
- to_chat(src, "IRC PM to-IRC-Admins: [msg]")
+ to_chat(src, "IRC PM to-IRC-Admins: [msg]")
log_admin("PM: [key_name(src)]->IRC: [msg]")
for(var/client/X in GLOB.admins)
if(X == src)
continue
if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, X.mob))
- to_chat(X, "PM: [key_name(src, TRUE, 0)]->IRC-Admins: [msg]")
+ to_chat(X, "PM: [key_name(src, TRUE, 0)]->IRC-Admins: [msg]")
/client/verb/open_pms_ui()
set name = "My PMs"
@@ -380,7 +382,6 @@
window_flash(C)
C.pm_tracker.show_ui(C.mob)
to_chat(usr, "Forced open [C]'s messages window.")
- show_ui(usr)
return
if(href_list["reply"])
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 008eaa4a910..11664349274 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -576,109 +576,79 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(!check_rights(R_EVENT))
return
- if(!ishuman(M))
+ if(!ishuman(M) && !isobserver(M))
alert("Invalid mob")
return
- var/list/choices = list(
- "strip",
- "as job...",
- "emergency response team member",
- "emergency response team leader"
+ var/dresscode = robust_dress_shop()
+
+ if(!dresscode)
+ return
+
+ var/delete_pocket
+ var/mob/living/carbon/human/H
+ if(isobserver(M))
+ H = M.change_mob_type(/mob/living/carbon/human, null, null, TRUE)
+ else
+ H = M
+ if(H.l_store || H.r_store || H.s_store) //saves a lot of time for admins and coders alike
+ if(alert("Should the items in their pockets be dropped? Selecting \"No\" will delete them.", "Robust quick dress shop", "Yes", "No") == "No")
+ delete_pocket = TRUE
+
+ for (var/obj/item/I in H.get_equipped_items(delete_pocket))
+ qdel(I)
+ if(dresscode != "Naked")
+ H.equipOutfit(dresscode)
+
+ H.regenerate_icons()
+
+ feedback_add_details("admin_verb", "SE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ log_admin("[key_name(usr)] changed the equipment of [key_name(M)] to [dresscode].")
+ message_admins("[key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode].", 1)
+
+/client/proc/robust_dress_shop()
+ var/list/outfits = list(
+ "Naked",
+ "As Job...",
+ "Custom..."
)
- var/admin_outfits = subtypesof(/datum/outfit/admin)
- for(var/type in admin_outfits)
- var/datum/outfit/O = type
- var/name = initial(O.name)
- if(name != "Naked")
- choices[initial(O.name)] = type
+ var/list/paths = subtypesof(/datum/outfit) - typesof(/datum/outfit/job)
+ for(var/path in paths)
+ var/datum/outfit/O = path //not much to initalize here but whatever
+ if(initial(O.can_be_admin_equipped))
+ outfits[initial(O.name)] = path
- var/dostrip = 0
- switch(alert("Strip [M] before dressing?", "Strip?", "Yes", "No", "Cancel"))
- if("Yes")
- dostrip = 1
- if("Cancel")
- return
-
- var/dresscode = input("Select dress for [M]", "Robust quick dress shop") as null|anything in choices
+ var/dresscode = input("Select outfit", "Robust quick dress shop") as null|anything in outfits
if(isnull(dresscode))
return
- var/datum/outfit/O
- if(!(dresscode in list("strip", "as job...", "emergency response team member", "emergency response team leader")))
- O = choices[dresscode]
+ if(outfits[dresscode])
+ dresscode = outfits[dresscode]
- var/datum/job/jobdatum
- if(dresscode == "as job...")
- var/jobname = input("Select job", "Robust quick dress shop") as null|anything in get_all_jobs()
- jobdatum = SSjobs.GetJob(jobname)
+ if(dresscode == "As Job...")
+ var/list/job_paths = subtypesof(/datum/outfit/job)
+ var/list/job_outfits = list()
+ for(var/path in job_paths)
+ var/datum/outfit/O = path
+ if(initial(O.can_be_admin_equipped))
+ job_outfits[initial(O.name)] = path
- feedback_add_details("admin_verb", "SEQ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- if(dostrip)
- for(var/obj/item/I in M)
- if(istype(I, /obj/item/implant))
- continue
- if(istype(I, /obj/item/organ))
- continue
- qdel(I)
+ dresscode = input("Select job equipment", "Robust quick dress shop") as null|anything in job_outfits
+ dresscode = job_outfits[dresscode]
+ if(isnull(dresscode))
+ return
+ if(dresscode == "Custom...")
+ var/list/custom_names = list()
+ for(var/datum/outfit/D in GLOB.custom_outfits)
+ custom_names[D.name] = D
+ var/selected_name = input("Select outfit", "Robust quick dress shop") as null|anything in custom_names
+ dresscode = custom_names[selected_name]
+ if(isnull(dresscode))
+ return
- switch(dresscode)
- if("strip")
- //do nothing
-
- // god is dead
- if("as job...")
- if(jobdatum)
- dresscode = "[jobdatum.title]"
- jobdatum.equip(M)
-
- if("emergency response team member", "emergency response team leader")
- var/datum/response_team/equip_team = null
- switch(alert("Level", "Emergency Response Team", "Amber", "Red", "Gamma"))
- if("Amber")
- equip_team = new /datum/response_team/amber
- if("Red")
- equip_team = new /datum/response_team/red
- if("Gamma")
- equip_team = new /datum/response_team/gamma
- if(!equip_team)
- return
- if(dresscode == "emergency response team leader")
- equip_team.equip_officer("Commander", M)
- else
- var/list/ert_outfits = list("Security", "Engineer", "Medic", "Janitor", "Paranormal")
- var/echoice = input("Loadout Type", "Emergency Response Team") as null|anything in ert_outfits
- if(!echoice)
- return
- switch(echoice)
- if("Commander")
- equip_team.equip_officer("Commander", M)
- if("Security")
- equip_team.equip_officer("Security", M)
- if("Engineer")
- equip_team.equip_officer("Engineer", M)
- if("Medic")
- equip_team.equip_officer("Medic", M)
- if("Janitor")
- equip_team.equip_officer("Janitor", M)
- if("Paranormal")
- equip_team.equip_officer("Paranormal", M)
- else
- to_chat(src, "Invalid ERT Loadout selected")
-
-
- else // outfit datum
- if(O)
- M.equipOutfit(O, FALSE)
-
- M.regenerate_icons()
-
- log_admin("[key_name(usr)] changed the equipment of [key_name(M)] to [dresscode].")
- message_admins("[key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode].", 1)
- return
-
+ return dresscode
/client/proc/startSinglo()
set category = "Debug"
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index ae44648b5d5..2c7c6181b1d 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -58,6 +58,9 @@
if(!msg)
return
+
+ msg = admin_pencode_to_html(msg)
+
if(usr)
if(usr.client)
if(usr.client.holder)
@@ -136,7 +139,7 @@
if( !msg )
return
- msg = pencode_to_html(msg)
+ msg = admin_pencode_to_html(msg)
to_chat(M, msg)
log_admin("DirectNarrate: [key_name(usr)] to ([key_name(M)]): [msg]")
@@ -613,7 +616,6 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/input = input(usr, "Please enter anything you want. Anything. Serious.", "What's the message?") as message|null
if(!input)
return
- input = pencode_to_html(html_encode(input))
switch(alert("Should this be announced to the general population?",,"Yes","No", "Cancel"))
if("Yes")
@@ -1004,6 +1006,57 @@ Traitors and the like can also be revived with the previous role mostly intact.
msg += "