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..36a5e25bbfd 100644
--- a/_maps/map_files/Delta/delta.dmm
+++ b/_maps/map_files/Delta/delta.dmm
@@ -31407,6 +31407,7 @@
id_tag = "s_docking_airlock";
req_access_txt = "48"
},
+/obj/structure/fans/tiny,
/turf/simulated/shuttle/floor,
/area/shuttle/mining)
"bgZ" = (
@@ -31431,6 +31432,7 @@
name = "mining shuttle bay";
width = 7
},
+/obj/structure/fans/tiny,
/turf/simulated/shuttle/floor,
/area/shuttle/mining)
"bha" = (
@@ -34038,6 +34040,7 @@
name = "Mining Dock Airlock";
req_access_txt = "48"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel,
/area/quartermaster/miningdock)
"blH" = (
@@ -38843,6 +38846,7 @@
name = "Labor Shuttle Airlock";
req_access_txt = "2"
},
+/obj/structure/fans/tiny,
/turf/simulated/shuttle/floor{
icon_state = "floor4"
},
@@ -38864,6 +38868,7 @@
name = "Labor Camp Airlock";
req_access_txt = "2"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel,
/area/security/prisonershuttle)
"btT" = (
@@ -41958,6 +41963,7 @@
name = "fore bay 1";
width = 9
},
+/obj/structure/fans/tiny,
/turf/simulated/shuttle/floor,
/area/shuttle/siberia)
"bzg" = (
diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
index 8bf89da81b2..0a054feb801 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"
},
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index 5acc2adba16..4f92a84101f 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" = (
@@ -11418,10 +11419,6 @@
id_tag = "secmaintdorm1";
name = "Room 1"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plating,
/area/maintenance/fsmaint)
"ats" = (
@@ -11429,10 +11426,6 @@
id_tag = "secmaintdorm2";
name = "Room 2"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plating,
/area/maintenance/fsmaint)
"att" = (
@@ -12166,6 +12159,7 @@
name = "Labor Camp Airlock";
req_access_txt = "2"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plating,
/area/security/prisonershuttle)
"auz" = (
@@ -12174,6 +12168,7 @@
name = "Labor Shuttle Airlock";
req_access_txt = "2"
},
+/obj/structure/fans/tiny,
/turf/simulated/shuttle/floor{
icon_state = "floor4"
},
@@ -13181,16 +13176,6 @@
},
/turf/simulated/floor/plasteel,
/area/security/lobby)
-"avU" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 4
- },
-/turf/simulated/floor/plating,
-/area/maintenance/fsmaint)
"avV" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 10
@@ -13214,10 +13199,6 @@
dir = 4;
level = 1
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
/turf/simulated/floor/plasteel{
tag = "icon-cult";
icon_state = "cult";
@@ -14352,16 +14333,6 @@
icon_state = "darkredcorners"
},
/area/security/prison/cell_block/A)
-"axN" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
-/turf/simulated/floor/plating,
-/area/maintenance/fsmaint)
"axO" = (
/obj/structure/cable{
d1 = 1;
@@ -14558,6 +14529,7 @@
name = "fore bay 1";
width = 9
},
+/obj/structure/fans/tiny,
/turf/simulated/shuttle/floor,
/area/shuttle/siberia)
"ayi" = (
@@ -17788,10 +17760,6 @@
req_access_txt = "12"
},
/obj/effect/decal/cleanable/dirt,
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 4
- },
/turf/simulated/floor/plasteel{
icon_state = "floorgrime"
},
@@ -19009,13 +18977,6 @@
/obj/item/twohanded/required/kirbyplants,
/turf/simulated/floor/wood,
/area/crew_quarters/courtroom)
-"aGv" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/effect/mapping_helpers/airlock/unres,
-/turf/simulated/floor/plating,
-/area/maintenance/fsmaint)
"aGw" = (
/obj/structure/disposalpipe/junction{
dir = 1;
@@ -20068,10 +20029,6 @@
name = "Magistrate's Office";
req_access_txt = "74"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 4
- },
/turf/simulated/floor/plasteel{
tag = "icon-cult";
icon_state = "cult";
@@ -20160,10 +20117,6 @@
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plating,
/area/maintenance/fsmaint)
"aIZ" = (
@@ -20743,16 +20696,6 @@
},
/turf/simulated/floor/plasteel,
/area/hallway/primary/fore)
-"aKp" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 4
- },
-/turf/simulated/floor/plating,
-/area/maintenance/fsmaint2)
"aKq" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
@@ -20826,10 +20769,6 @@
d2 = 2;
icon_state = "1-2"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plasteel{
tag = "icon-cult";
icon_state = "cult";
@@ -21150,10 +21089,6 @@
req_access = null;
req_access_txt = "4"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 4
- },
/turf/simulated/floor/plasteel{
icon_state = "grimy"
},
@@ -21192,10 +21127,6 @@
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 4
- },
/turf/simulated/floor/plating,
/area/maintenance/fpmaint2)
"aLl" = (
@@ -21234,10 +21165,6 @@
req_access_txt = "12"
},
/obj/effect/decal/cleanable/dirt,
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
/turf/simulated/floor/wood{
tag = "icon-wood-broken3";
icon_state = "wood-broken3"
@@ -22079,16 +22006,6 @@
},
/turf/simulated/floor/carpet,
/area/crew_quarters/courtroom)
-"aNe" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
-/turf/simulated/floor/plating,
-/area/maintenance/fsmaint2)
"aNf" = (
/obj/machinery/access_button{
command = "cycle_interior";
@@ -22464,10 +22381,6 @@
name = "Courtroom Privacy Shutters";
opacity = 0
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
/turf/simulated/floor/wood,
/area/crew_quarters/courtroom)
"aNT" = (
@@ -22567,16 +22480,6 @@
icon_state = "barber"
},
/area/civilian/barber)
-"aOa" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
-/turf/simulated/floor/plating,
-/area/maintenance/fsmaint2)
"aOb" = (
/obj/machinery/prize_counter,
/obj/machinery/light{
@@ -22895,10 +22798,6 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/visible/purple,
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plating,
/area/maintenance/fpmaint2)
"aOO" = (
@@ -22926,10 +22825,6 @@
name = "Courtroom Privacy Shutters";
opacity = 0
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
/turf/simulated/floor/wood,
/area/crew_quarters/courtroom)
"aOP" = (
@@ -23025,10 +22920,6 @@
/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/plating,
/area/maintenance/fsmaint)
"aPc" = (
@@ -23105,10 +22996,6 @@
/obj/machinery/atmospherics/pipe/simple/visible/purple{
dir = 4
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 4
- },
/turf/simulated/floor/plating,
/area/maintenance/fpmaint2)
"aPi" = (
@@ -23418,10 +23305,6 @@
d2 = 2;
icon_state = "1-2"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plating,
/area/maintenance/fsmaint)
"aPQ" = (
@@ -23476,10 +23359,6 @@
req_access_txt = "12"
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plating,
/area/maintenance/fsmaint)
"aPV" = (
@@ -25238,10 +25117,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
/turf/simulated/floor/plating,
/area/maintenance/fsmaint2)
"aTt" = (
@@ -26043,7 +25918,6 @@
d2 = 2;
icon_state = "1-2"
},
-/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/plating,
/area/maintenance/fpmaint)
"aVc" = (
@@ -26512,10 +26386,6 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plating,
/area/maintenance/fpmaint2)
"aVM" = (
@@ -27629,13 +27499,6 @@
/obj/machinery/lapvend,
/turf/simulated/floor/plasteel,
/area/storage/primary)
-"aXT" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/effect/mapping_helpers/airlock/unres,
-/turf/simulated/floor/plating,
-/area/maintenance/fsmaint2)
"aXU" = (
/obj/item/flag/mime,
/obj/machinery/power/apc{
@@ -29493,16 +29356,6 @@
dir = 2
},
/area/crew_quarters/dorms)
-"bbx" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
-/turf/simulated/floor/plating,
-/area/maintenance/fpmaint2)
"bby" = (
/obj/machinery/camera{
c_tag = "Medbay Morgue";
@@ -30065,10 +29918,6 @@
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 4
- },
/turf/simulated/floor/plating,
/area/maintenance/fpmaint)
"bcw" = (
@@ -31207,10 +31056,6 @@
icon_state = "4-8";
tag = ""
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
/turf/simulated/floor/plating,
/area/maintenance/fpmaint)
"bex" = (
@@ -31510,10 +31355,6 @@
name = "Mime's Office";
req_access_txt = "46"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 4
- },
/turf/simulated/floor/plasteel{
icon_state = "tranquillite";
dir = 4;
@@ -31584,10 +31425,6 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plating,
/area/maintenance/fpmaint2)
"bfg" = (
@@ -33841,7 +33678,6 @@
name = "Clown's Office";
req_access_txt = "46"
},
-/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/wood,
/area/clownoffice)
"bjf" = (
@@ -33855,10 +33691,6 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plating,
/area/maintenance/fsmaint2)
"bjh" = (
@@ -33872,10 +33704,6 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plating,
/area/maintenance/fpmaint2)
"bji" = (
@@ -37143,7 +36971,6 @@
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/plating,
/area/maintenance/fsmaint2)
"bpF" = (
@@ -37423,10 +37250,6 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plating,
/area/maintenance/fsmaint2)
"bqk" = (
@@ -40030,10 +39853,6 @@
name = "Chapel Office";
req_access_txt = "22"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -40310,10 +40129,6 @@
name = "Bar Office";
req_access_txt = "25"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/wood,
/area/crew_quarters/bar)
"bwm" = (
@@ -40716,10 +40531,6 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plating,
/area/maintenance/fsmaint2)
"bwY" = (
@@ -41513,10 +41324,6 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plating,
/area/maintenance/fpmaint)
"byt" = (
@@ -43421,10 +43228,6 @@
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plating,
/area/maintenance/fpmaint)
"bCr" = (
@@ -48798,20 +48601,6 @@
icon_state = "brown"
},
/area/quartermaster/office)
-"bMz" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/glass{
- name = "Chapel Office";
- req_access_txt = "22"
- },
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
-/turf/simulated/floor/plasteel{
- icon_state = "dark"
- },
-/area/chapel/office)
"bMA" = (
/obj/machinery/mineral/ore_redemption,
/turf/simulated/floor/plasteel,
@@ -48856,10 +48645,6 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plasteel{
icon_state = "showroomfloor"
},
@@ -49725,7 +49510,6 @@
},
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/plating,
/area/maintenance/port)
"bNQ" = (
@@ -50007,7 +49791,6 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/plating,
/area/maintenance/port)
"bOo" = (
@@ -50668,7 +50451,6 @@
icon_state = "1-2";
tag = ""
},
-/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/plating,
/area/storage/emergency2)
"bPs" = (
@@ -50727,10 +50509,6 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plating,
/area/maintenance/fsmaint2)
"bPy" = (
@@ -50925,10 +50703,6 @@
name = "Kitchen";
req_access_txt = "28"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 4
- },
/turf/simulated/floor/plasteel{
dir = 2;
icon_state = "cafeteria";
@@ -52143,10 +51917,6 @@
/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/plating,
/area/maintenance/port)
"bRI" = (
@@ -52629,7 +52399,6 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/plasteel{
icon_state = "white"
},
@@ -52655,10 +52424,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
/turf/simulated/floor/plating,
/area/maintenance/port)
"bSB" = (
@@ -54252,10 +54017,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
/turf/simulated/floor/plasteel,
/area/quartermaster/office)
"bVl" = (
@@ -54270,10 +54031,6 @@
icon_state = "4-8";
pixel_x = 0
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
/turf/simulated/floor/plasteel,
/area/quartermaster/storage)
"bVm" = (
@@ -54542,10 +54299,6 @@
name = "Delivery Office";
req_access_txt = "50"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plasteel,
/area/quartermaster/office)
"bVI" = (
@@ -55259,10 +55012,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
/turf/simulated/floor/plasteel,
/area/quartermaster/storage)
"bWP" = (
@@ -55483,7 +55232,6 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/plating,
/area/maintenance/asmaint2)
"bXj" = (
@@ -57302,7 +57050,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
@@ -57318,7 +57066,7 @@
normaldoorcontrol = 1;
pixel_x = -4;
pixel_y = -4;
- req_access_txt = "20"
+ req_access_txt = "30"
},
/turf/simulated/floor/plasteel{
dir = 2;
@@ -58284,10 +58032,6 @@
d2 = 2;
icon_state = "1-2"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plasteel{
tag = "icon-whitebluefull";
icon_state = "whitebluefull"
@@ -58365,10 +58109,6 @@
name = "Medical Supplies";
req_access_txt = "5"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plasteel{
tag = "icon-whitebluefull";
icon_state = "whitebluefull"
@@ -58386,10 +58126,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
/turf/simulated/floor/plasteel,
/area/quartermaster/office)
"cbA" = (
@@ -63283,10 +63019,6 @@
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
/turf/simulated/floor/plating,
/area/maintenance/asmaint2)
"cjB" = (
@@ -63338,7 +63070,6 @@
tag = ""
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/plating,
/area/maintenance/apmaint)
"cjE" = (
@@ -63725,6 +63456,7 @@
name = "mining shuttle bay";
width = 7
},
+/obj/structure/fans/tiny,
/turf/simulated/shuttle/floor,
/area/shuttle/mining)
"ckl" = (
@@ -63733,6 +63465,7 @@
name = "Mining Dock Airlock";
req_access_txt = "48"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plating,
/area/quartermaster/miningdock)
"ckm" = (
@@ -63741,6 +63474,7 @@
name = "Mining Dock Airlock";
req_access_txt = "48"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel,
/area/quartermaster/miningdock)
"ckn" = (
@@ -64003,7 +63737,6 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/wood,
/area/blueshield)
"ckJ" = (
@@ -64047,7 +63780,6 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/wood,
/area/ntrep)
"ckO" = (
@@ -64063,7 +63795,6 @@
req_access_txt = "26"
},
/obj/structure/disposalpipe/segment,
-/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/plasteel,
/area/janitor)
"ckQ" = (
@@ -64097,7 +63828,6 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/plating,
/area/maintenance/asmaint)
"ckU" = (
@@ -64185,7 +63915,6 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/plating,
/area/maintenance/asmaint2)
"clb" = (
@@ -64961,10 +64690,6 @@
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plating,
/area/maintenance/asmaint)
"cmu" = (
@@ -66667,10 +66392,6 @@
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 4
- },
/turf/simulated/floor/plating,
/area/maintenance/asmaint)
"cpl" = (
@@ -67408,10 +67129,6 @@
/obj/machinery/holosign/surgery{
id = "surgery1"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -67595,10 +67312,6 @@
/obj/machinery/holosign/surgery{
id = "surgery2"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 4
- },
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -67680,7 +67393,6 @@
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
},
-/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/plating,
/area/maintenance/apmaint)
"cqG" = (
@@ -69558,13 +69270,6 @@
/area/medical/research{
name = "Research Division"
})
-"ctD" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/effect/mapping_helpers/airlock/unres,
-/turf/simulated/floor/plating,
-/area/maintenance/asmaint)
"ctE" = (
/obj/machinery/hologram/holopad,
/turf/simulated/floor/plasteel{
@@ -69648,16 +69353,6 @@
/obj/effect/decal/warning_stripes/yellow,
/turf/simulated/floor/plasteel,
/area/engine/controlroom)
-"ctK" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
-/turf/simulated/floor/plating,
-/area/maintenance/apmaint)
"ctL" = (
/obj/machinery/light{
dir = 4;
@@ -71699,10 +71394,6 @@
req_access_txt = "5";
req_one_access_txt = "0"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 4
- },
/turf/simulated/floor/plasteel{
dir = 2;
icon_state = "cafeteria";
@@ -72356,16 +72047,6 @@
},
/turf/simulated/floor/plasteel,
/area/storage/tech)
-"cyu" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 4
- },
-/turf/simulated/floor/plating,
-/area/maintenance/asmaint)
"cyv" = (
/obj/structure/sign/securearea{
desc = "A warning sign which reads 'HIGH VOLTAGE'";
@@ -72502,10 +72183,6 @@
name = "Medbay Maintenance";
req_access_txt = "5"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plating,
/area/maintenance/genetics)
"cyF" = (
@@ -72643,10 +72320,6 @@
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plasteel{
icon_state = "white"
},
@@ -72953,10 +72626,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
/turf/simulated/floor/plating,
/area/maintenance/asmaint)
"czy" = (
@@ -73657,10 +73326,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
/turf/simulated/floor/plating,
/area/maintenance/asmaint2)
"cAH" = (
@@ -74103,10 +73768,6 @@
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 4
- },
/turf/simulated/floor/plating,
/area/maintenance/asmaint2)
"cBy" = (
@@ -74704,16 +74365,6 @@
},
/turf/simulated/floor/plating,
/area/maintenance/apmaint)
-"cCF" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 4
- },
-/turf/simulated/floor/plating,
-/area/maintenance/apmaint)
"cCG" = (
/obj/structure/cable{
d1 = 2;
@@ -74752,10 +74403,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
/turf/simulated/floor/plating,
/area/storage/tech)
"cCJ" = (
@@ -75213,7 +74860,6 @@
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/plasteel{
icon_state = "white"
},
@@ -76075,10 +75721,6 @@
name = "Alternate Construction Area";
req_access_txt = "12"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
/turf/simulated/floor/plating,
/area/maintenance/apmaint)
"cFf" = (
@@ -76612,10 +76254,6 @@
name = "Alternate Construction Area";
req_access_txt = "12"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
/turf/simulated/floor/plating,
/area/maintenance/consarea)
"cFU" = (
@@ -77113,7 +76751,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/wood,
/area/medical/psych)
"cGM" = (
@@ -77620,10 +77257,6 @@
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plating,
/area/maintenance/apmaint)
"cHF" = (
@@ -77776,10 +77409,6 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plating,
/area/maintenance/apmaint)
"cHS" = (
@@ -79005,10 +78634,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
/turf/simulated/floor/plasteel{
icon_state = "dark"
},
@@ -80228,10 +79853,6 @@
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
/turf/simulated/floor/plating,
/area/maintenance/aft)
"cMr" = (
@@ -81301,7 +80922,6 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/plating,
/area/maintenance/aft)
"cOt" = (
@@ -84375,10 +83995,6 @@
/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,
/area/engine/break_room)
"cTH" = (
@@ -88570,7 +88186,6 @@
/obj/machinery/door/airlock/maintenance{
req_access_txt = "12"
},
-/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/plating,
/area/maintenance/aft)
"dbi" = (
@@ -88636,7 +88251,6 @@
tag = ""
},
/obj/structure/disposalpipe/segment,
-/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/plating,
/area/maintenance/aft)
"dbq" = (
@@ -89107,10 +88721,6 @@
/area/maintenance/asmaint)
"dci" = (
/obj/machinery/door/airlock/maintenance,
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 4
- },
/turf/simulated/floor/plating,
/area/maintenance/genetics)
"dcj" = (
@@ -89447,6 +89057,7 @@
req_access_txt = "0";
req_one_access_txt = "10;24"
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plating,
/area/maintenance/engi_shuttle)
"dcV" = (
@@ -89963,7 +89574,6 @@
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/plating,
/area/maintenance/engi_shuttle)
"ddX" = (
@@ -89979,13 +89589,6 @@
/obj/structure/lattice/catwalk,
/turf/space,
/area/space/nearstation)
-"ddY" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/effect/mapping_helpers/airlock/unres,
-/turf/simulated/floor/plating,
-/area/maintenance/asmaint2)
"ddZ" = (
/obj/structure/reagent_dispensers/watertank,
/obj/structure/cable{
@@ -90159,10 +89762,6 @@
d2 = 8;
icon_state = "4-8"
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
/turf/simulated/floor/plating,
/area/maintenance/asmaint)
"dep" = (
@@ -90173,7 +89772,6 @@
icon_state = "1-2";
tag = ""
},
-/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/plating,
/area/maintenance/genetics)
"deq" = (
@@ -90575,10 +90173,6 @@
icon_state = "4-8";
pixel_x = 0
},
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
/turf/simulated/floor/plating,
/area/maintenance/asmaint2)
"dfg" = (
@@ -91015,16 +90609,6 @@
"dfV" = (
/turf/simulated/floor/plating,
/area/storage/secure)
-"dfW" = (
-/obj/machinery/door/airlock/maintenance{
- req_access_txt = "12"
- },
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 1
- },
-/turf/simulated/floor/plating,
-/area/maintenance/asmaint2)
"dfX" = (
/turf/space,
/turf/simulated/shuttle/wall{
@@ -91063,6 +90647,7 @@
name = "engineering dock";
width = 7
},
+/obj/structure/fans/tiny,
/turf/simulated/floor/plating,
/area/shuttle/constructionsite)
"dga" = (
@@ -91095,15 +90680,10 @@
req_access_txt = "12"
},
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
-/obj/effect/mapping_helpers/airlock/unres,
/turf/simulated/floor/plating,
/area/maintenance/asmaint)
"dgf" = (
/obj/machinery/door/airlock/maintenance,
-/obj/effect/mapping_helpers/airlock/unres{
- icon_state = "airlock_unres_helper";
- dir = 8
- },
/turf/simulated/floor/plating,
/area/maintenance/asmaint2)
"dgg" = (
@@ -114520,7 +114100,7 @@ aaa
cng
coL
coL
-ctK
+cqF
coL
cvk
cwx
@@ -115241,7 +114821,7 @@ aGn
aGn
aGn
aGn
-bbx
+aLk
aGn
aGn
aUy
@@ -115291,7 +114871,7 @@ aaa
cng
coL
coL
-ctK
+cqF
coL
coL
cwx
@@ -117095,7 +116675,7 @@ ctU
cgQ
cgQ
cgQ
-cCF
+cqF
cgQ
cgQ
cgQ
@@ -118377,7 +117957,7 @@ cam
aab
cgQ
ctU
-ctK
+cqF
coL
coL
coL
@@ -121982,7 +121562,7 @@ czN
cyg
cCH
coL
-ctK
+cqF
cEQ
cGj
cJZ
@@ -126808,7 +126388,7 @@ avq
avq
avq
avq
-axN
+aHp
aRx
aUw
aDN
@@ -128911,7 +128491,7 @@ cPd
cos
cPd
cqY
-ctD
+cmt
csL
csL
cvI
@@ -130712,7 +130292,7 @@ csL
cqD
csL
chf
-cyu
+cmt
chf
chf
chf
@@ -132960,7 +132540,7 @@ aIq
avq
aAc
aBt
-aGv
+aHp
aCh
aEw
aFI
@@ -133725,7 +133305,7 @@ ajb
awl
arR
awl
-avU
+aHp
aqc
aya
awl
@@ -135271,7 +134851,7 @@ avb
aAQ
awF
aye
-axN
+aHp
avq
aAS
atG
@@ -137342,7 +136922,7 @@ aFJ
aPq
aRv
aTb
-aXT
+aMn
aGY
aGY
aGY
@@ -139906,7 +139486,7 @@ aGX
aHc
aIv
aGX
-aOa
+aMn
aGX
aGX
aGX
@@ -140419,10 +139999,10 @@ aCy
aMf
aNf
aGY
-aNe
+aMn
aGY
aGY
-aNe
+aMn
aGY
aGY
aPK
@@ -140935,7 +140515,7 @@ aJI
aGY
aGX
aGX
-aKp
+aMn
aGX
aGX
aGY
@@ -142472,14 +142052,14 @@ aab
aAf
aAf
aAf
-aKp
+aMn
aAf
aHb
aMz
aMz
aIE
aGX
-aKp
+aMn
aMz
aGX
aOG
@@ -143522,7 +143102,7 @@ bcu
ber
bga
bis
-bMz
+bvN
bcD
bld
blw
@@ -147196,7 +146776,7 @@ bGH
bGG
dgy
bGG
-dfW
+cjA
dia
cuQ
djQ
@@ -148472,7 +148052,7 @@ aab
bGH
bGG
bGG
-ddY
+cjA
bGG
dcJ
ddJ
@@ -148737,7 +148317,7 @@ cuQ
dfc
bGG
bGG
-ddY
+cjA
bGG
bGG
bGH
diff --git a/_maps/map_files/cyberiad/z4.dmm b/_maps/map_files/cyberiad/z4.dmm
index 08d56927445..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" = (
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 049f2541bc1..45d1d07c940 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -403,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
@@ -485,4 +485,10 @@
#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
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/__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/_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..46fe7331dbe
--- /dev/null
+++ b/code/_onclick/hud/parallax.dm
@@ -0,0 +1,311 @@
+/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 = 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)
+ 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/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/observer.dm b/code/_onclick/observer.dm
index 797384b8336..a988277012b 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)
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/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/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/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 17b6f9e55c8..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
@@ -645,7 +639,7 @@ About the new airlock wires panel:
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
@@ -1103,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
@@ -1117,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)
@@ -1137,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/door.dm b/code/game/machinery/doors/door.dm
index fdfaae71477..ca9639319e3 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -14,7 +14,6 @@
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
@@ -77,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 ..()
@@ -187,7 +183,7 @@
/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
@@ -282,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()
@@ -295,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)
@@ -354,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/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/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index cad4ae25ac8..0400763b7f2 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -273,6 +273,8 @@ REAGENT SCANNER
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/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/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/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/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..9ff6ddb8876 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,7 +72,16 @@
to_chat(user, "This section is too damaged to support a tile! Use a welder to fix the damage.")
return TRUE
- else if(iswelder(C))
+ 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) && unfastened)
var/obj/item/weldingtool/welder = C
if(welder.isOn())
if(!welder.remove_fuel(0, user))
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/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/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index e2482c54d7c..1069e981c37 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -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
@@ -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/client/client procs.dm b/code/modules/client/client procs.dm
index 95f6c16ba97..2d4092ff159 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -433,6 +433,9 @@
GLOB.admins -= src
GLOB.directory -= ckey
GLOB.clients -= src
+ if(movingmob)
+ movingmob.client_mobs_in_contents -= mob
+ UNSETEMPTY(movingmob.client_mobs_in_contents)
Master.UpdateTickRate()
return ..()
diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm
index 97f9ddc6169..7fce23b9e4c 100644
--- a/code/modules/client/preference/preferences.dm
+++ b/code/modules/client/preference/preferences.dm
@@ -201,6 +201,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
//Gear stuff
var/list/gear = list()
var/gear_tab = "General"
+ // Parallax
+ var/parallax = PARALLAX_HIGH
/datum/preferences/New(client/C)
parent = C
@@ -462,6 +464,19 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "OOC Color: Change
"
if(config.allow_Metadata)
dat += "OOC Notes: Edit
"
+ dat += "Parallax (Fancy Space): "
+ switch (parallax)
+ if(PARALLAX_LOW)
+ dat += "Low"
+ if(PARALLAX_MED)
+ dat += "Medium"
+ if(PARALLAX_INSANE)
+ dat += "Insane"
+ if(PARALLAX_DISABLE)
+ dat += "Disabled"
+ else
+ dat += "High"
+ dat += "
"
dat += "Play Admin MIDIs: [(sound & SOUND_MIDI) ? "Yes" : "No"]
"
dat += "Play Lobby Music: [(sound & SOUND_LOBBY) ? "Yes" : "No"]
"
dat += "Randomized Character Slot: [randomslot ? "Yes" : "No"]
"
@@ -2072,6 +2087,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(href_list["tab"])
current_tab = text2num(href_list["tab"])
+
if("ambientocclusion")
toggles ^= AMBIENT_OCCLUSION
if(parent && parent.screen && parent.screen.len)
@@ -2080,6 +2096,19 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(toggles & AMBIENT_OCCLUSION)
PM.filters += FILTER_AMBIENT_OCCLUSION
+ if("parallax")
+ var/parallax_styles = list(
+ "Off" = PARALLAX_DISABLE,
+ "Low" = PARALLAX_LOW,
+ "Medium" = PARALLAX_MED,
+ "High" = PARALLAX_HIGH,
+ "Insane" = PARALLAX_INSANE
+ )
+ parallax = parallax_styles[input(user, "Pick a parallax style", "Parallax Style") as null|anything in parallax_styles]
+ if(parent && parent.mob && parent.mob.hud_used)
+ parent.mob.hud_used.update_parallax_pref()
+
+
ShowChoices(user)
return 1
diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm
index cdbfe2afb2f..6090538f2b3 100644
--- a/code/modules/client/preference/preferences_mysql.dm
+++ b/code/modules/client/preference/preferences_mysql.dm
@@ -20,7 +20,8 @@
clientfps,
atklog,
fuid,
- afk_watch
+ afk_watch,
+ parallax
FROM [format_table_name("player")]
WHERE ckey='[C.ckey]'"}
)
@@ -54,6 +55,7 @@
atklog = text2num(query.item[18])
fuid = text2num(query.item[19])
afk_watch = text2num(query.item[20])
+ parallax = text2num(query.item[21])
//Sanitize
ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor))
@@ -75,6 +77,7 @@
atklog = sanitize_integer(atklog, 0, 100, initial(atklog))
fuid = sanitize_integer(fuid, 0, 10000000, initial(fuid))
afk_watch = sanitize_integer(afk_watch, 0, 1, initial(afk_watch))
+ parallax = sanitize_integer(parallax, 0, 16, initial(parallax))
return 1
/datum/preferences/proc/save_preferences(client/C)
@@ -105,7 +108,8 @@
ghost_anonsay='[ghost_anonsay]',
clientfps='[clientfps]',
atklog='[atklog]',
- afk_watch='[afk_watch]'
+ afk_watch='[afk_watch]',
+ parallax='[parallax]'
WHERE ckey='[C.ckey]'"}
)
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index 8e5e658e31a..a06b01de65d 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -38,6 +38,21 @@
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
burn_state = FIRE_PROOF
+/obj/item/clothing/gloves/bracer
+ name = "bone bracers"
+ desc = "For when you're expecting to get slapped on the wrist. Offers modest protection to your arms."
+ icon_state = "bracers"
+ item_state = "bracers"
+ item_color = null //So they don't wash.
+ transfer_prints = TRUE
+ strip_delay = 40
+ body_parts_covered = ARMS
+ cold_protection = ARMS
+ min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
+ max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
+ resistance_flags = NONE
+ armor = list(melee = 15, bullet = 25, laser = 15, energy = 15, bomb = 20, bio = 10, rad = 0)
+
/obj/item/clothing/gloves/botanic_leather
desc = "These leather gloves protect against thorns, barbs, prickles, spikes and other harmful objects of floral origin."
name = "botanist's leather gloves"
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 96c2ed46f7a..ae8502f7246 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -527,14 +527,15 @@
icon_state = "bonearmor"
item_state = "bonearmor"
blood_overlay_type = "armor"
- armor = list("melee" = 35, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+ armor = list(melee = 35, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS
-/obj/item/clothing/head/skullhelmet
+/obj/item/clothing/head/helmet/skull
name = "skull helmet"
desc = "An intimidating tribal helmet, it doesn't look very comfortable."
- flags = BLOCKHAIR
+ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
flags_cover = HEADCOVERSEYES
- armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 10, "bio" = 5, "rad" = 20, "fire" = 40, "acid" = 20)
+ armor = list(melee = 25, bullet = 25, laser = 25, energy = 10, bomb = 10, bio = 5, rad = 20)
icon_state = "skull"
- item_state = "skull"
\ No newline at end of file
+ item_state = "skull"
+ strip_delay = 100
\ No newline at end of file
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index 1520e19dcfc..58338efea61 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -385,42 +385,11 @@
)
category = CAT_WEAPON
-/datum/crafting_recipe/bonfire
- name = "Bonfire"
- time = 60
- reqs = list(/obj/item/grown/log = 5)
- result = /obj/structure/bonfire
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/boneaxe
- name = "Bone Axe"
- result = /obj/item/twohanded/fireaxe/boneaxe
- time = 50
- reqs = list(/obj/item/stack/sheet/bone = 6,
- /obj/item/stack/sheet/sinew = 3)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/bonespear
- name = "Bone Spear"
- result = /obj/item/twohanded/spear/bonespear
+/datum/crafting_recipe/bonearmor
+ name = "Bone Armor"
+ result = /obj/item/clothing/suit/armor/bone
time = 30
- reqs = list(/obj/item/stack/sheet/bone = 4,
- /obj/item/stack/sheet/sinew = 1)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/bonedagger
- name = "Bone Dagger"
- result = /obj/item/kitchen/knife/combat/survival/bone
- time = 20
- reqs = list(/obj/item/stack/sheet/bone = 2)
- category = CAT_PRIMAL
-
-/datum/crafting_recipe/bonecodpiece
- name = "Skull Codpiece"
- result = /obj/item/clothing/accessory/necklace/skullcodpiece
- time = 20
- reqs = list(/obj/item/stack/sheet/bone = 2,
- /obj/item/stack/sheet/animalhide/goliath_hide = 1)
+ reqs = list(/obj/item/stack/sheet/bone = 6)
category = CAT_PRIMAL
/datum/crafting_recipe/bonetalisman
@@ -431,16 +400,25 @@
/obj/item/stack/sheet/sinew = 1)
category = CAT_PRIMAL
-/datum/crafting_recipe/bonearmor
- name = "Bone Armor"
- result = /obj/item/clothing/suit/armor/bone
- time = 30
- reqs = list(/obj/item/stack/sheet/bone = 6)
+/datum/crafting_recipe/bonecodpiece
+ name = "Skull Codpiece"
+ result = /obj/item/clothing/accessory/necklace/skullcodpiece
+ time = 20
+ reqs = list(/obj/item/stack/sheet/bone = 2,
+ /obj/item/stack/sheet/animalhide/goliath_hide = 1)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/bracers
+ name = "Bone Bracers"
+ result = /obj/item/clothing/gloves/bracer
+ time = 20
+ reqs = list(/obj/item/stack/sheet/bone = 2,
+ /obj/item/stack/sheet/sinew = 1)
category = CAT_PRIMAL
/datum/crafting_recipe/skullhelm
name = "Skull Helmet"
- result = /obj/item/clothing/head/skullhelmet
+ result = /obj/item/clothing/head/helmet/skull
time = 30
reqs = list(/obj/item/stack/sheet/bone = 4)
category = CAT_PRIMAL
@@ -463,6 +441,13 @@
/obj/item/stack/sheet/animalhide/ashdrake = 5)
category = CAT_PRIMAL
+/datum/crafting_recipe/firebrand
+ name = "Firebrand"
+ result = /obj/item/match/firebrand
+ time = 100 //Long construction time. Making fire is hard work.
+ reqs = list(/obj/item/stack/sheet/wood = 2)
+ category = CAT_PRIMAL
+
/datum/crafting_recipe/tribal_splint
name = "Tribal Splint"
time = 20
@@ -471,6 +456,50 @@
result = /obj/item/stack/medical/splint/tribal
category = CAT_PRIMAL
+/datum/crafting_recipe/bonedagger
+ name = "Bone Dagger"
+ result = /obj/item/kitchen/knife/combat/survival/bone
+ time = 20
+ reqs = list(/obj/item/stack/sheet/bone = 2)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/bonespear
+ name = "Bone Spear"
+ result = /obj/item/twohanded/spear/bonespear
+ time = 30
+ reqs = list(/obj/item/stack/sheet/bone = 4,
+ /obj/item/stack/sheet/sinew = 1)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/boneaxe
+ name = "Bone Axe"
+ result = /obj/item/twohanded/fireaxe/boneaxe
+ time = 50
+ reqs = list(/obj/item/stack/sheet/bone = 6,
+ /obj/item/stack/sheet/sinew = 3)
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/bonfire
+ name = "Bonfire"
+ time = 60
+ reqs = list(/obj/item/grown/log = 5)
+ result = /obj/structure/bonfire
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/rake //Category resorting incoming
+ name = "Rake"
+ time = 30
+ reqs = list(/obj/item/stack/sheet/wood = 5)
+ result = /obj/item/cultivator/rake
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/woodbucket
+ name = "Wooden Bucket"
+ time = 30
+ reqs = list(/obj/item/stack/sheet/wood = 3)
+ result = /obj/item/reagent_containers/glass/bucket/wooden
+ category = CAT_PRIMAL
+
/datum/crafting_recipe/guillotine
name = "Guillotine"
result = /obj/structure/guillotine
diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm
index 590ff374ad6..2d3cb8465c9 100644
--- a/code/modules/events/alien_infestation.dm
+++ b/code/modules/events/alien_infestation.dm
@@ -26,6 +26,7 @@
if(C)
GLOB.respawnable_list -= C.client
var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc)
+ new_xeno.amount_grown += (0.75 * new_xeno.max_grown) //event spawned larva start off almost ready to evolve.
new_xeno.key = C.key
if(SSticker && SSticker.mode)
SSticker.mode.xenos += new_xeno.mind
diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm
index 14080c62bba..899146f160d 100644
--- a/code/modules/hydroponics/hydroitemdefines.dm
+++ b/code/modules/hydroponics/hydroitemdefines.dm
@@ -72,6 +72,16 @@
attack_verb = list("slashed", "sliced", "cut", "clawed")
hitsound = 'sound/weapons/bladeslice.ogg'
+/obj/item/cultivator/rake
+ name = "rake"
+ icon_state = "rake"
+ w_class = WEIGHT_CLASS_NORMAL
+ attack_verb = list("slashed", "sliced", "bashed", "clawed")
+ hitsound = null
+ materials = null
+ flags = NONE
+ burn_state = FLAMMABLE
+
/obj/item/hatchet
name = "hatchet"
desc = "A very sharp axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 731f53c7838..ab855b5dc80 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -236,6 +236,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return 1
/mob/dead/observer/Move(NewLoc, direct)
+ update_parallax_contents()
following = null
setDir(direct)
ghostimage.setDir(dir)
@@ -417,6 +418,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return
forceMove(pick(L))
+ update_parallax_contents()
following = null
/mob/dead/observer/verb/follow()
@@ -511,6 +513,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination.
A.forceMove(T)
+ M.update_parallax_contents()
+ following = null
return
to_chat(A, "This mob is not located in the game world.")
diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm
index 7344c6469c4..c3c47235b91 100644
--- a/code/modules/mob/living/silicon/ai/freelook/eye.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm
@@ -31,6 +31,7 @@
ai.camera_visibility(src)
if(ai.client && !ai.multicam_on)
ai.client.eye = src
+ update_parallax_contents()
//Holopad
if(ai.master_multicam)
ai.master_multicam.refresh_view()
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
index 44ff6049a71..c90a06a9fb8 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm
@@ -407,7 +407,7 @@
if(prob(95))
head = /obj/item/clothing/head/helmet/gladiator
else
- head = /obj/item/clothing/head/skullhelmet
+ head = /obj/item/clothing/head/helmet/skull
suit = /obj/item/clothing/suit/armor/bone
if(prob(5))
back = pickweight(list(/obj/item/twohanded/spear/bonespear = 3, /obj/item/twohanded/fireaxe/boneaxe = 2))
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index d5dfb454e09..eea2c2253e8 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -50,6 +50,12 @@
var/obj/item/flashlight/gun_light = null
var/can_flashlight = 0
+ var/can_bayonet = FALSE //if a bayonet can be added or removed if it already has one.
+ var/obj/item/kitchen/knife/bayonet
+ var/mutable_appearance/knife_overlay
+ var/knife_x_offset = 0
+ var/knife_y_offset = 0
+
var/list/upgrades = list()
var/ammo_x_offset = 0 //used for positioning ammo count overlay on sprite
@@ -69,12 +75,27 @@
verbs += /obj/item/gun/proc/toggle_gunlight
build_zooming()
+/obj/item/gun/Destroy()
+ QDEL_NULL(bayonet)
+ return ..()
+
+/obj/item/gun/handle_atom_del(atom/A)
+ if(A == bayonet)
+ clear_bayonet()
+ return ..()
+
/obj/item/gun/examine(mob/user)
..()
if(unique_reskin && !current_skin)
to_chat(user, "Alt-click it to reskin it.")
if(unique_rename)
to_chat(user, "Use a pen on it to rename it.")
+ if(bayonet)
+ to_chat(user, "It has \a [bayonet] [can_bayonet ? "" : "permanently "]affixed to it.")
+ if(can_bayonet) //if it has a bayonet and this is false, the bayonet is permanent.
+ to_chat(user, "[bayonet] looks like it can be unscrewed from [src].")
+ else if(can_bayonet)
+ to_chat(user, "It has a bayonet lug on it.")
/obj/item/gun/proc/process_chamber()
return 0
@@ -233,11 +254,19 @@ obj/item/gun/proc/newshot()
user.update_inv_r_hand()
feedback_add_details("gun_fired","[type]")
-/obj/item/gun/attack(mob/M as mob, mob/user)
+/obj/item/gun/attack(mob/M, mob/user)
if(user.a_intent == INTENT_HARM) //Flogging
- ..()
- else
- return
+ if(bayonet)
+ M.attackby(bayonet, user)
+ else
+ return ..()
+
+/obj/item/gun/attack_obj(obj/O, mob/user)
+ if(user.a_intent == INTENT_HARM)
+ if(bayonet)
+ O.attackby(bayonet, user)
+ return
+ return ..()
/obj/item/gun/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/flashlight/seclite))
@@ -257,7 +286,7 @@ obj/item/gun/proc/newshot()
if(loc == user)
A.Grant(user)
- if(istype(I, /obj/item/screwdriver))
+ if(isscrewdriver(I))
if(gun_light && can_flashlight)
for(var/obj/item/flashlight/seclite/S in src)
to_chat(user, "You unscrew the seclite from [src].")
@@ -268,11 +297,32 @@ obj/item/gun/proc/newshot()
update_icon()
for(var/datum/action/item_action/toggle_gunlight/TGL in actions)
qdel(TGL)
+ else if(bayonet && can_bayonet) //if it has a bayonet, and the bayonet can be removed
+ bayonet.forceMove(get_turf(user))
+ clear_bayonet()
if(unique_rename)
if(istype(I, /obj/item/pen))
rename_gun(user)
- ..()
+ if(istype(I, /obj/item/kitchen/knife))
+ var/obj/item/kitchen/knife/K = I
+ if(!can_bayonet || !K.bayonet || bayonet) //ensure the gun has an attachment point available, and that the knife is compatible with it.
+ return ..()
+ if(!user.drop_item())
+ return
+ K.forceMove(src)
+ to_chat(user, "You attach [K] to [src]'s bayonet lug.")
+ bayonet = K
+ var/state = "bayonet" //Generic state.
+ if(bayonet.icon_state in icon_states('icons/obj/guns/bayonets.dmi')) //Snowflake state?
+ state = bayonet.icon_state
+ var/icon/bayonet_icons = 'icons/obj/guns/bayonets.dmi'
+ knife_overlay = mutable_appearance(bayonet_icons, state)
+ knife_overlay.pixel_x = knife_x_offset
+ knife_overlay.pixel_y = knife_y_offset
+ overlays += knife_overlay
+ else
+ return ..()
/obj/item/gun/proc/toggle_gunlight()
set name = "Toggle Gun Light"
@@ -305,6 +355,15 @@ obj/item/gun/proc/newshot()
var/datum/action/A = X
A.UpdateButtonIcon()
+/obj/item/gun/proc/clear_bayonet()
+ if(!bayonet)
+ return
+ bayonet = null
+ if(knife_overlay)
+ overlays -= knife_overlay
+ knife_overlay = null
+ return TRUE
+
/obj/item/gun/extinguish_light()
if(gun_light.on)
toggle_gunlight()
diff --git a/code/modules/projectiles/guns/dartgun.dm b/code/modules/projectiles/guns/dartgun.dm
index 7b39bfa3be8..97f4eaebf1c 100644
--- a/code/modules/projectiles/guns/dartgun.dm
+++ b/code/modules/projectiles/guns/dartgun.dm
@@ -101,6 +101,8 @@
beakers += B
to_chat(user, "You slot [B] into [src].")
src.updateUsrDialog()
+ else
+ return ..()
/obj/item/gun/dartgun/can_shoot()
if(!cartridge)
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index cbc230c1e98..6e4de3c49fa 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -140,6 +140,8 @@
if(gun_light.on)
iconF = "flight_on"
overlays += image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset)
+ if(bayonet && can_bayonet)
+ overlays += knife_overlay
if(itemState)
itemState += "[ratio]"
item_state = itemState
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index ff65b67e11c..d214309728e 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -16,6 +16,9 @@
var/holds_charge = FALSE
var/unique_frequency = FALSE // modified by KA modkits
var/overheat = FALSE
+ can_bayonet = TRUE
+ knife_x_offset = 20
+ knife_y_offset = 12
var/max_mod_capacity = 100
var/list/modkits = list()
@@ -148,6 +151,8 @@
if(gun_light.on)
iconF = "flight_on"
overlays += image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset)
+ if(bayonet && can_bayonet)
+ overlays += knife_overlay
/obj/item/gun/energy/kinetic_accelerator/experimental
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index fa34753c6a9..be60248cded 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -175,7 +175,7 @@
power_supply.give(500)
to_chat(user, "You insert [A] in [src], recharging it.")
else
- ..()
+ return ..()
/obj/item/gun/energy/plasmacutter/update_icon()
return
diff --git a/code/modules/projectiles/guns/grenade_launcher.dm b/code/modules/projectiles/guns/grenade_launcher.dm
index 0f05cfa32f6..81b8451eb77 100644
--- a/code/modules/projectiles/guns/grenade_launcher.dm
+++ b/code/modules/projectiles/guns/grenade_launcher.dm
@@ -28,6 +28,8 @@
to_chat(user, "[grenades.len] / [max_grenades] grenades.")
else
to_chat(user, "The grenade launcher cannot hold more grenades.")
+ else
+ return ..()
/obj/item/gun/grenadelauncher/afterattack(obj/target, mob/user , flag)
if(target == user)
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index 9defe7637d4..15efee700d2 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -24,6 +24,8 @@
icon_state = "[current_skin][suppressed ? "-suppressed" : ""][sawn_state ? "-sawn" : ""]"
else
icon_state = "[initial(icon_state)][suppressed ? "-suppressed" : ""][sawn_state ? "-sawn" : ""]"
+ if(bayonet && can_bayonet)
+ overlays += knife_overlay
/obj/item/gun/projectile/process_chamber(eject_casing = 1, empty_chamber = 1)
var/obj/item/ammo_casing/AC = chambered //Find chambered round
@@ -66,7 +68,6 @@
return
/obj/item/gun/projectile/attackby(var/obj/item/A as obj, mob/user as mob, params)
- ..()
if(istype(A, /obj/item/ammo_box/magazine))
var/obj/item/ammo_box/magazine/AM = A
if(istype(AM, mag_type))
@@ -108,7 +109,8 @@
else
to_chat(user, "You can't seem to figure out how to fit [S] on [src].")
return
- return 0
+ else
+ return ..()
/obj/item/gun/projectile/attack_hand(mob/user)
if(loc == user)
@@ -178,6 +180,9 @@
if(sawn_state == SAWN_OFF)
to_chat(user, "\The [src] is already shortened!")
return
+ if(bayonet)
+ to_chat(user, "You cannot saw-off [src] with [bayonet] attached!")
+ return
user.changeNext_move(CLICK_CD_MELEE)
user.visible_message("[user] begins to shorten \the [src].", "You begin to shorten \the [src]...")
diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm
index 399925d0e8a..6601f75d52b 100644
--- a/code/modules/projectiles/guns/projectile/automatic.dm
+++ b/code/modules/projectiles/guns/projectile/automatic.dm
@@ -19,6 +19,8 @@
if(select == 1)
overlays += "[initial(icon_state)]burst"
icon_state = "[initial(icon_state)][magazine ? "-[magazine.max_ammo]" : ""][chambered ? "" : "-e"][suppressed ? "-suppressed" : ""]"
+ if(bayonet && can_bayonet)
+ overlays += knife_overlay
/obj/item/gun/projectile/automatic/attackby(var/obj/item/A as obj, mob/user as mob, params)
. = ..()
@@ -96,6 +98,9 @@
fire_sound = 'sound/weapons/gunshots/gunshot_smg.ogg'
fire_delay = 2
burst_size = 2
+ can_bayonet = TRUE
+ knife_x_offset = 26
+ knife_y_offset = 12
/obj/item/gun/projectile/automatic/c20r/New()
..()
@@ -123,6 +128,9 @@
can_suppress = 0
burst_size = 1
actions_types = list()
+ can_bayonet = TRUE
+ knife_x_offset = 25
+ knife_y_offset = 12
/obj/item/gun/projectile/automatic/wt550/update_icon()
..()
@@ -172,7 +180,7 @@
underbarrel.attack_self()
underbarrel.attackby(A, user, params)
else
- ..()
+ return ..()
/obj/item/gun/projectile/automatic/m90/update_icon()
..()
diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm
index 3cba868a379..6f977f2e024 100644
--- a/code/modules/projectiles/guns/projectile/revolver.dm
+++ b/code/modules/projectiles/guns/projectile/revolver.dm
@@ -115,7 +115,6 @@
..()
/obj/item/gun/projectile/revolver/detective/attackby(obj/item/A, mob/user, params)
- ..()
if(istype(A, /obj/item/screwdriver))
if(magazine.caliber == "38")
to_chat(user, "You begin to reinforce the barrel of [src]...")
@@ -143,6 +142,8 @@
magazine.caliber = "38"
desc = initial(desc)
to_chat(user, "You remove the modifications on [src]. Now it will fire .38 rounds.")
+ else
+ return ..()
/obj/item/gun/projectile/revolver/fingergun //Summoned by the Finger Gun spell, from advanced mimery traitor item
name = "\improper finger gun"
@@ -347,7 +348,6 @@
options["Cancel"] = null
/obj/item/gun/projectile/revolver/doublebarrel/attackby(obj/item/A, mob/user, params)
- ..()
if(istype(A, /obj/item/ammo_box) || istype(A, /obj/item/ammo_casing))
chamber_round()
if(istype(A, /obj/item/melee/energy))
@@ -356,6 +356,8 @@
sawoff(user)
if(istype(A, /obj/item/circular_saw) || istype(A, /obj/item/gun/energy/plasmacutter))
sawoff(user)
+ else
+ return ..()
/obj/item/gun/projectile/revolver/doublebarrel/attack_self(mob/living/user)
var/num_unloaded = 0
@@ -394,7 +396,6 @@
var/slung = 0
/obj/item/gun/projectile/revolver/doublebarrel/improvised/attackby(obj/item/A, mob/user, params)
- ..()
if(istype(A, /obj/item/stack/cable_coil) && !sawn_state)
var/obj/item/stack/cable_coil/C = A
if(C.use(10))
@@ -406,6 +407,8 @@
else
to_chat(user, "You need at least ten lengths of cable if you want to make a sling.")
return
+ else
+ return ..()
/obj/item/gun/projectile/revolver/doublebarrel/improvised/update_icon()
..()
@@ -450,9 +453,10 @@
return
/obj/item/gun/projectile/revolver/doublebarrel/improvised/cane/attackby(obj/item/A, mob/user, params)
- ..()
if(istype(A, /obj/item/stack/cable_coil))
return
+ else
+ return ..()
/obj/item/gun/projectile/revolver/doublebarrel/improvised/cane/examine(mob/user) // HAD TO REPEAT EXAMINE CODE BECAUSE GUN CODE DOESNT STEALTH
var/f_name = "\a [src]."
diff --git a/code/modules/projectiles/guns/projectile/saw.dm b/code/modules/projectiles/guns/projectile/saw.dm
index 59bb2595714..b9bdb0c9701 100644
--- a/code/modules/projectiles/guns/projectile/saw.dm
+++ b/code/modules/projectiles/guns/projectile/saw.dm
@@ -50,14 +50,15 @@
to_chat(user, "You remove the magazine from [src].")
-/obj/item/gun/projectile/automatic/l6_saw/attackby(obj/item/A, mob/user, params)
+/obj/item/gun/projectile/automatic/l6_saw/attackby(obj/item/A, mob/user, params)
if(istype(A, /obj/item/ammo_box/magazine))
var/obj/item/ammo_box/magazine/AM = A
if(istype(AM, mag_type))
if(!cover_open)
to_chat(user, "[src]'s cover is closed! You can't insert a new mag.")
return
- ..()
+ else
+ return ..()
//ammo//
diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm
index 366b9b6579f..46286bef2af 100644
--- a/code/modules/projectiles/guns/projectile/shotgun.dm
+++ b/code/modules/projectiles/guns/projectile/shotgun.dm
@@ -86,7 +86,6 @@
sawn_state = SAWN_INTACT
/obj/item/gun/projectile/shotgun/riot/attackby(obj/item/A, mob/user, params)
- ..()
if(istype(A, /obj/item/circular_saw) || istype(A, /obj/item/gun/energy/plasmacutter))
sawoff(user)
if(istype(A, /obj/item/melee/energy))
@@ -95,6 +94,8 @@
sawoff(user)
if(istype(A, /obj/item/pipe))
unsaw(A, user)
+ else
+ return ..()
/obj/item/gun/projectile/shotgun/riot/sawoff(mob/user)
if(sawn_state == SAWN_OFF)
@@ -210,6 +211,9 @@
mag_type = /obj/item/ammo_box/magazine/internal/boltaction
fire_sound = 'sound/weapons/gunshots/gunshot_rifle.ogg'
var/bolt_open = 0
+ can_bayonet = TRUE
+ knife_x_offset = 27
+ knife_y_offset = 13
/obj/item/gun/projectile/shotgun/boltaction/pump(mob/M)
playsound(M, 'sound/weapons/gun_interactions/rifle_load.ogg', 60, 1)
@@ -242,6 +246,7 @@
desc = "Careful not to lose your head."
var/guns_left = 30
mag_type = /obj/item/ammo_box/magazine/internal/boltaction/enchanted
+ can_bayonet = FALSE
/obj/item/gun/projectile/shotgun/boltaction/enchanted/New()
..()
diff --git a/code/modules/projectiles/guns/rocket.dm b/code/modules/projectiles/guns/rocket.dm
index fa6dce3f448..983c6f319fd 100644
--- a/code/modules/projectiles/guns/rocket.dm
+++ b/code/modules/projectiles/guns/rocket.dm
@@ -37,6 +37,8 @@
to_chat(user, "[rockets.len] / [max_rockets] rockets.")
else
to_chat(usr, "[src] cannot hold more rockets.")
+ else
+ return ..()
/obj/item/gun/rocketlauncher/can_shoot()
return rockets.len
diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm
index 21d44fa8634..ca18cdcd82e 100644
--- a/code/modules/projectiles/guns/syringe_gun.dm
+++ b/code/modules/projectiles/guns/syringe_gun.dm
@@ -76,7 +76,8 @@
return 1
else
to_chat(user, "[src] cannot hold more syringes.")
- return 0
+ else
+ return ..()
/obj/item/gun/syringe/rapidsyringe
name = "rapid syringe gun"
diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm
index 77118450aaa..59d15cf50bd 100644
--- a/code/modules/reagents/chemistry/reagents/medicine.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine.dm
@@ -1149,24 +1149,19 @@
id = "lavaland_extract"
description = "An extract of lavaland atmospheric and mineral elements. Heals the user in small doses, but is extremely toxic otherwise."
color = "#C8A5DC" // rgb: 200, 165, 220
- metabolization_rate = 0.7 //VERY strong chemical
overdose_threshold = 3 //To prevent people stacking massive amounts of a very strong healing reagent
can_synth = FALSE
/datum/reagent/medicine/lavaland_extract/on_mob_life(mob/living/carbon/M)
var/update_flags = STATUS_UPDATE_NONE
- update_flags |= M.adjustToxLoss(-3*REAGENTS_EFFECT_MULTIPLIER, FALSE)
- update_flags |= M.adjustOxyLoss(-3*REAGENTS_EFFECT_MULTIPLIER, FALSE)
- update_flags |= M.adjustBruteLoss(-6*REAGENTS_EFFECT_MULTIPLIER, FALSE)
- update_flags |= M.adjustFireLoss(-6*REAGENTS_EFFECT_MULTIPLIER, FALSE)
+ update_flags |= M.adjustBruteLoss(-5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
+ update_flags |= M.adjustFireLoss(-5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
return ..() | update_flags
/datum/reagent/medicine/lavaland_extract/overdose_process(mob/living/M) // This WILL be brutal
var/update_flags = STATUS_UPDATE_NONE
M.AdjustConfused(5)
- update_flags |= M.adjustBruteLoss(10*REAGENTS_EFFECT_MULTIPLIER, FALSE)
- update_flags |= M.adjustFireLoss(10*REAGENTS_EFFECT_MULTIPLIER, FALSE)
- update_flags |= M.adjustToxLoss(10*REAGENTS_EFFECT_MULTIPLIER, FALSE)
- update_flags |= M.Stun(7, FALSE)
- update_flags |= M.Weaken(7, FALSE)
+ update_flags |= M.adjustBruteLoss(3*REAGENTS_EFFECT_MULTIPLIER, FALSE)
+ update_flags |= M.adjustFireLoss(3*REAGENTS_EFFECT_MULTIPLIER, FALSE)
+ update_flags |= M.adjustToxLoss(3*REAGENTS_EFFECT_MULTIPLIER, FALSE)
return ..() | update_flags
diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm
index d408db7f2f0..5221ae5e600 100644
--- a/code/modules/reagents/reagent_containers/glass_containers.dm
+++ b/code/modules/reagents/reagent_containers/glass_containers.dm
@@ -81,7 +81,7 @@
reagents.reaction(M, TOUCH)
reagents.clear_reagents()
- else
+ else
if(M != user)
M.visible_message("[user] attempts to feed something to [M].", \
"[user] attempts to feed something to you.")
@@ -348,6 +348,13 @@
slot_flags = SLOT_HEAD
container_type = OPENCONTAINER
+/obj/item/reagent_containers/glass/bucket/wooden
+ name = "wooden bucket"
+ icon_state = "woodbucket"
+ item_state = "woodbucket"
+ materials = null
+ burn_state = FLAMMABLE
+
/obj/item/reagent_containers/glass/bucket/equipped(mob/user, slot)
..()
if(slot == slot_head && reagents.total_volume)
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index dace5928b2e..3abfbfd0e19 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -155,9 +155,9 @@
name = "survival medipen"
desc = "A medipen for surviving in the harshest of environments, heals and protects from environmental hazards.
WARNING: Do not inject more than one pen in quick succession."
icon_state = "stimpen"
- volume = 22
- amount_per_transfer_from_this = 22
- list_reagents = list("salbutamol" = 10, "epinephrine" = 5, "lavaland_extract" = 2, "salglu_solution" = 5) //Short burst of healing, followed by minor healing from the saline
+ volume = 42
+ amount_per_transfer_from_this = 42
+ list_reagents = list("salbutamol" = 10, "teporone" = 15, "epinephrine" = 10, "lavaland_extract" = 2, "weak_omnizine" = 5) //Short burst of healing, followed by minor healing from the saline
/obj/item/reagent_containers/hypospray/autoinjector/nanocalcium
name = "nanocalcium autoinjector"
diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm
index 67765ef8ac5..42e710d0cf6 100644
--- a/code/modules/shuttle/on_move.dm
+++ b/code/modules/shuttle/on_move.dm
@@ -30,17 +30,21 @@
if(id_tag == "s_docking_airlock")
INVOKE_ASYNC(src, .proc/lock)
-/mob/onShuttleMove()
+/mob/onShuttleMove(turf/oldT, turf/T1, rotation)
if(!move_on_shuttle)
return 0
. = ..()
if(!.)
return
- if(client)
- if(buckled)
- shake_camera(src, 2, 1) // turn it down a bit come on
- else
- shake_camera(src, 7, 1)
+ if(!client)
+ return
+
+ if(buckled)
+ shake_camera(src, 2, 1) // turn it down a bit come on
+ else
+ shake_camera(src, 7, 1)
+
+ update_parallax_contents()
/mob/living/carbon/onShuttleMove()
. = ..()
@@ -54,8 +58,10 @@
if(smooth)
queue_smooth(src)
+/mob/postDock()
+ update_parallax_contents()
+
/obj/machinery/door/airlock/postDock(obj/docking_port/stationary/S1)
. = ..()
if(!S1.lock_shuttle_doors && id_tag == "s_docking_airlock")
INVOKE_ASYNC(src, .proc/unlock)
-
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 51ba6c6bad1..2d68c3db292 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -189,7 +189,7 @@
/obj/docking_port/stationary/transit
name = "In transit"
turf_type = /turf/space/transit
-
+ var/area/shuttle/transit/assigned_area
lock_shuttle_doors = 1
/obj/docking_port/stationary/transit/register()
@@ -358,7 +358,7 @@
var/obj/docking_port/stationary/S0 = get_docked()
var/obj/docking_port/stationary/S1 = findTransitDock()
if(S1)
- if(dock(S1))
+ if(dock(S1, , TRUE))
WARNING("shuttle \"[id]\" could not enter transit space. Docked at [S0 ? S0.id : "null"]. Transit dock [S1 ? S1.id : "null"].")
else
previous = S0
@@ -429,7 +429,7 @@
//this is the main proc. It instantly moves our mobile port to stationary port S1
//it handles all the generic behaviour, such as sanity checks, closing doors on the shuttle, stunning mobs, etc
-/obj/docking_port/mobile/proc/dock(obj/docking_port/stationary/S1, force=FALSE)
+/obj/docking_port/mobile/proc/dock(obj/docking_port/stationary/S1, force=FALSE, transit=FALSE)
// Crashing this ship with NO SURVIVORS
if(S1.get_docked() == src)
remove_ripples()
@@ -492,6 +492,7 @@
var/turf/simulated/Ts1 = T1
Ts1.copy_air_with_tile(T0)
+ areaInstance.moving = TRUE
//move mobile to new location
for(var/atom/movable/AM in T0)
AM.onShuttleMove(T0, T1, rotation)
@@ -512,6 +513,7 @@
T0.CalculateAdjacentTurfs()
SSair.add_to_active(T0,1)
+ areaInstance.moving = transit
for(var/A1 in L1)
var/turf/T1 = A1
T1.postDock(S1)
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 6dbc6f4febe..97c54c64e47 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -226,6 +226,8 @@
health = 3
var/organhonked = 0
var/suffering_delay = 900
+ var/datum/component/waddle
+ var/datum/component/squeak
/obj/item/organ/internal/honktumor/insert(mob/living/carbon/M, special = 0)
..()
@@ -236,6 +238,8 @@
genemutcheck(M,CLUMSYBLOCK,null,MUTCHK_FORCED)
genemutcheck(M,COMICBLOCK,null,MUTCHK_FORCED)
organhonked = world.time
+ waddle = M.AddComponent(/datum/component/waddling)
+ squeak = M.AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg' = 1), 50)
/obj/item/organ/internal/honktumor/remove(mob/living/carbon/M, special = 0)
. = ..()
@@ -246,6 +250,8 @@
M.dna.SetSEState(COMICBLOCK,0)
genemutcheck(M,CLUMSYBLOCK,null,MUTCHK_FORCED)
genemutcheck(M,COMICBLOCK,null,MUTCHK_FORCED)
+ QDEL_NULL(waddle)
+ QDEL_NULL(squeak)
qdel(src)
/obj/item/organ/internal/honktumor/on_life()
@@ -282,6 +288,28 @@
owner.nutrition = 9000
owner.overeatduration = 9000
+
+/obj/item/organ/internal/honkbladder
+ name = "honk bladder"
+ desc = "a air filled sac that produces honking noises."
+ icon_state = "honktumor"//Not making a new icon
+ origin_tech = "biotech=1"
+ w_class = WEIGHT_CLASS_TINY
+ parent_organ = "groin"
+ slot = "honk_bladder"
+ health = 3
+ var/datum/component/squeak
+
+/obj/item/organ/internal/honkbladder/insert(mob/living/carbon/M, special = 0)
+
+ squeak = M.AddComponent(/datum/component/squeak, list('sound/effects/clownstep1.ogg'=1,'sound/effects/clownstep2.ogg'=1), 50)
+
+/obj/item/organ/internal/honkbladder/remove(mob/living/carbon/M, special = 0)
+ . = ..()
+
+ QDEL_NULL(squeak)
+ qdel(src)
+
/obj/item/organ/internal/beard
name = "beard organ"
desc = "Let they who is worthy wear the beard of Thorbjorndottir."
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index 94f6be4cc9a..9d91682f057 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -125,6 +125,9 @@ var/static/regex/multispin_words = regex("like a record baby")
return
owner.say(".x[command]")
+/obj/item/organ/internal/vocal_cords/colossus/prepare_eat()
+ return
+
/obj/item/organ/internal/vocal_cords/colossus/can_speak_with()
if(world.time < next_command)
to_chat(owner, "You must wait [(next_command - world.time)/10] seconds before Speaking again.")
diff --git a/config/example/dbconfig.txt b/config/example/dbconfig.txt
index 2404119d52f..ad859d92543 100644
--- a/config/example/dbconfig.txt
+++ b/config/example/dbconfig.txt
@@ -9,7 +9,7 @@
## This value must be set to the version of the paradise schema in use.
## If this value does not match, the SQL database will not be loaded and an error will be generated.
## Roundstart will be delayed.
-DB_VERSION 8
+DB_VERSION 9
## Server the MySQL database can be found at.
# Examples: localhost, 200.135.5.43, www.mysqldb.com, etc.
diff --git a/html/changelogs/AutoChangeLog-pr-11615.yml b/html/changelogs/AutoChangeLog-pr-11615.yml
new file mode 100644
index 00000000000..1c7cb32141e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11615.yml
@@ -0,0 +1,5 @@
+author: "AffectedArc07, Keekenox, Floyd/Qustinnus"
+delete-after: True
+changes:
+ - rscadd: "P A R A L L A X (That fancy space thing)"
+ - imageadd: "Adds a new Parallax layer that resembles Lavaland (Lava Planet), it spawns on a random location near the station. You need your parallax on high to see it."
diff --git a/html/changelogs/AutoChangeLog-pr-11924.yml b/html/changelogs/AutoChangeLog-pr-11924.yml
new file mode 100644
index 00000000000..1c237842514
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11924.yml
@@ -0,0 +1,4 @@
+author: "TDSSS"
+delete-after: True
+changes:
+ - tweak: "midround event spawned xeno larva now need less time to grow up and evolve."
diff --git a/html/changelogs/AutoChangeLog-pr-11998.yml b/html/changelogs/AutoChangeLog-pr-11998.yml
new file mode 100644
index 00000000000..b431624ce94
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-11998.yml
@@ -0,0 +1,4 @@
+author: "Tayyyyyyy"
+delete-after: True
+changes:
+ - tweak: "message window links added to PM send receipt"
diff --git a/html/changelogs/AutoChangeLog-pr-12002.yml b/html/changelogs/AutoChangeLog-pr-12002.yml
new file mode 100644
index 00000000000..00cad9242aa
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12002.yml
@@ -0,0 +1,5 @@
+author: "Markolie"
+delete-after: True
+changes:
+ - bugfix: "Tightening the bolts of a falsewall now works properly."
+ - tweak: "Deconstructing plating now requires it to be unfastened using a screwdriver first, in order to prevent it from being accidentally deconstructed with a welder."
diff --git a/html/changelogs/AutoChangeLog-pr-12007.yml b/html/changelogs/AutoChangeLog-pr-12007.yml
new file mode 100644
index 00000000000..e6599f791f1
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12007.yml
@@ -0,0 +1,4 @@
+author: "Couls"
+delete-after: True
+changes:
+ - tweak: "there are much less one-way airlocks on station"
diff --git a/html/changelogs/AutoChangeLog-pr-12011.yml b/html/changelogs/AutoChangeLog-pr-12011.yml
new file mode 100644
index 00000000000..c9df4ed1d3f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12011.yml
@@ -0,0 +1,4 @@
+author: "Shadow-Quill"
+delete-after: True
+changes:
+ - tweak: "Mass drivers now need two rods/cable coil instead of three to construct."
diff --git a/html/changelogs/AutoChangeLog-pr-12014.yml b/html/changelogs/AutoChangeLog-pr-12014.yml
new file mode 100644
index 00000000000..f0af236a0cb
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12014.yml
@@ -0,0 +1,5 @@
+author: "Shadow-Quill"
+delete-after: True
+changes:
+ - bugfix: "The RD's office door can now be opened by the RD, instead of by just the Captain."
+ - tweak: "Science lockdown can now only be (de)activated by the RD, instead of any scientist."
diff --git a/html/changelogs/AutoChangeLog-pr-12028.yml b/html/changelogs/AutoChangeLog-pr-12028.yml
new file mode 100644
index 00000000000..6574e9a042d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12028.yml
@@ -0,0 +1,4 @@
+author: "Shadow-Quill"
+delete-after: True
+changes:
+ - tweak: "Using a health analyzer in-hand will switch the verbosity."
diff --git a/html/changelogs/AutoChangeLog-pr-12035.yml b/html/changelogs/AutoChangeLog-pr-12035.yml
new file mode 100644
index 00000000000..4bf80bf148f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12035.yml
@@ -0,0 +1,4 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - tweak: "Adds mini-fans to the mining, engineering, and security shuttles"
diff --git a/html/changelogs/AutoChangeLog-pr-12039.yml b/html/changelogs/AutoChangeLog-pr-12039.yml
new file mode 100644
index 00000000000..551c136207f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12039.yml
@@ -0,0 +1,7 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - rscadd: "Adds a number of primal recipes: rake (cultivator), wooden bucket, firebrand (long burning match), and bone bracers (armored arm protection that goes on your glove slot)"
+ - rscadd: "Can attach bayonets to C20rs, bolt action rifles, security auto-rifles, and kinetic accelerator; harm intent to stab with them"
+ - rscadd: "can craft ore boxes out of wood"
+ - bugfix: "Skull helmets are now proper helmets"
diff --git a/html/changelogs/AutoChangeLog-pr-12040.yml b/html/changelogs/AutoChangeLog-pr-12040.yml
new file mode 100644
index 00000000000..51542da25c9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12040.yml
@@ -0,0 +1,4 @@
+author: "Tayyyyyyy"
+delete-after: True
+changes:
+ - bugfix: "Many shuttle flight directions fixed"
diff --git a/html/changelogs/AutoChangeLog-pr-12043.yml b/html/changelogs/AutoChangeLog-pr-12043.yml
new file mode 100644
index 00000000000..51b0dbb1e35
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12043.yml
@@ -0,0 +1,7 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - tweak: "Survival autoinjectors tweaked"
+ - rscadd: "Survival autoinjectors have 15 units of teporone in them"
+ - tweak: "Survival autoinjectors have double the epinpehrine and weak omnizine instead of saline glucose."
+ - tweak: "lavaland extract altered; it no longer heals tox or oxy, and heals slightly less brute and burn, but has nearly halved the metabolization rate and has a less harsh overdose"
diff --git a/html/changelogs/AutoChangeLog-pr-12044.yml b/html/changelogs/AutoChangeLog-pr-12044.yml
new file mode 100644
index 00000000000..7b9b664464e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12044.yml
@@ -0,0 +1,4 @@
+author: "DoctorDrugs"
+delete-after: True
+changes:
+ - tweak: "removed the ability to eat the divine vocal cords"
diff --git a/html/changelogs/AutoChangeLog-pr-12047.yml b/html/changelogs/AutoChangeLog-pr-12047.yml
new file mode 100644
index 00000000000..2d7ad050a64
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12047.yml
@@ -0,0 +1,4 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - bugfix: "Fixes airlocks spamming their open and close when you stand in them"
diff --git a/icons/effects/parallax.dmi b/icons/effects/parallax.dmi
new file mode 100644
index 00000000000..22f091ff11a
Binary files /dev/null and b/icons/effects/parallax.dmi differ
diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi
index a5a14094fd6..6d6165509c8 100644
Binary files a/icons/mob/hands.dmi and b/icons/mob/hands.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index 97d2750029e..03f57f19a92 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index 15100e9112e..b11f98e74ed 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index 42f1eda0e74..f7f54357fdb 100644
Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ
diff --git a/icons/obj/guns/bayonets.dmi b/icons/obj/guns/bayonets.dmi
new file mode 100644
index 00000000000..32b5448b8ed
Binary files /dev/null and b/icons/obj/guns/bayonets.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index c303e2135bd..23e49287922 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi
index 83cb94a5ca3..730431590ae 100644
Binary files a/icons/obj/janitor.dmi and b/icons/obj/janitor.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 4475b56343b..78fc58ee06d 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -143,6 +143,7 @@
#include "code\_onclick\hud\monkey.dm"
#include "code\_onclick\hud\movable_screen_objects.dm"
#include "code\_onclick\hud\other_mobs.dm"
+#include "code\_onclick\hud\parallax.dm"
#include "code\_onclick\hud\picture_in_picture.dm"
#include "code\_onclick\hud\plane_master.dm"
#include "code\_onclick\hud\radial.dm"
@@ -223,6 +224,7 @@
#include "code\controllers\subsystem\nightshift.dm"
#include "code\controllers\subsystem\npcpool.dm"
#include "code\controllers\subsystem\overlays.dm"
+#include "code\controllers\subsystem\parallax.dm"
#include "code\controllers\subsystem\radio.dm"
#include "code\controllers\subsystem\shuttles.dm"
#include "code\controllers\subsystem\spacedrift.dm"