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"